Metadata-Version: 2.4
Name: laxate
Version: 0.2.0
Summary: Cloud benchmark orchestration for Benched
Project-URL: Repository, https://github.com/1kbgz/laxate
Project-URL: Homepage, https://github.com/1kbgz/laxate
Author-email: the laxate authors <dev@1kbgz.com>
License: Apache-2.0
License-File: LICENSE
Keywords: benched,benchmarks,hetzner,performance
Classifier: Development Status :: 3 - Alpha
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=3.11
Requires-Dist: benched>=0.2.0
Provides-Extra: develop
Requires-Dist: build; extra == 'develop'
Requires-Dist: bump-my-version; extra == 'develop'
Requires-Dist: check-dist; extra == 'develop'
Requires-Dist: codespell; extra == 'develop'
Requires-Dist: hatchling; extra == 'develop'
Requires-Dist: mdformat; extra == 'develop'
Requires-Dist: mdformat-tables>=1; extra == 'develop'
Requires-Dist: pytest; extra == 'develop'
Requires-Dist: pytest-cov; extra == 'develop'
Requires-Dist: ruff; extra == 'develop'
Requires-Dist: twine; extra == 'develop'
Requires-Dist: ty; extra == 'develop'
Requires-Dist: uv; extra == 'develop'
Requires-Dist: wheel; extra == 'develop'
Provides-Extra: hetzner
Requires-Dist: hcloud>=2.0; extra == 'hetzner'
Requires-Dist: paramiko>=3.0; extra == 'hetzner'
Description-Content-Type: text/markdown

# laxate

Run [Benched](https://github.com/1kbgz/benched) benchmark suites in an existing local
environment, Docker or Podman container, or ephemeral Hetzner Cloud server.

[![Build Status](https://github.com/1kbgz/laxate/actions/workflows/build.yaml/badge.svg?branch=main&event=push)](https://github.com/1kbgz/laxate/actions/workflows/build.yaml)
[![codecov](https://codecov.io/gh/1kbgz/laxate/branch/main/graph/badge.svg)](https://codecov.io/gh/1kbgz/laxate)
[![License](https://img.shields.io/github/license/1kbgz/laxate)](https://github.com/1kbgz/laxate)
[![PyPI](https://img.shields.io/pypi/v/laxate.svg)](https://pypi.python.org/pypi/laxate)

Laxate owns environment and machine orchestration. Benched owns pytest-benchmark
execution, durable history, comparison, and static reports. Neither tool constructs a
matrix implicitly: select or prepare one environment, then record it.

## Install

```bash
pip install laxate
pip install "laxate[hetzner]"  # optional cloud provider
```

## Run locally

Add `[tool.benched]` configuration and pytest-benchmark tests to the target project,
then run:

```bash
laxate run local
laxate run local --quick --machine workstation
laxate compare previous latest
laxate publish
laxate preview
```

## Run in a container

The project directory is bind-mounted at the same absolute path. Initialization
commands must install the project and Benched into the container:

```bash
laxate run docker \
  --image python:3.12 \
  --init-command "pip install -e ." \
  --machine docker-3.12
```

Use `--engine podman` for Podman and repeat `--mount` for additional bind mounts.

## Run on Hetzner

Configure `benchmark_repo` in `[tool.laxate]`, export `HCLOUD_TOKEN`, and register the
SSH public key named by `--ssh-key-name`:

```bash
laxate run hetzner \
  --server-type cx23 \
  --ssh-key ~/.ssh/hetzner_key \
  --ssh-key-name benchmarks \
  --branch main \
  --python-version 3.12 \
  --push
```

The runner clones the selected benchmark-suite branch, creates its Python environment,
runs the repository's `make benchmark` target, and collects the configured results
directory.

See [CLI and configuration reference](docs/src/usage.md) for every option.

Historical ASV files are not executed. Projects migrating old results can call
`benched import-asv` once before using Laxate's Benched workflow.
