Skip to main content

uv-matrix

A small matrix task runner for Python projects using Astral uv.

Status: early development.

uv-matrix runs the same project tasks across Python versions, dependency variants, extras, dependency groups, and arbitrary task variants defined in pyproject.toml.

Documentation: https://uv-matrix.readthedocs.io/

Why uv-matrix?

Many Python projects need to run checks like this:

  • run tests on Python 3.12 and 3.13
  • run tests with different optional dependencies
  • run lint, docs, and test tasks from one project configuration
  • pass the same matrix setup to local development and CI

Installation

uv-matrix requires Python 3.10+ and a working uv installation.

Add it to a project:

uv add --dev uv-matrix
uv run uv-matrix --help

Or run it directly:

uvx uv-matrix --help

Quick start

Add a matrix and a task to pyproject.toml:

[tool.uv-matrix.matrix.test]        # a matrix named "test"
python-version = ["3.12", "3.13"]   # run the job on Python 3.12 and 3.13
tasks = ["run_test"]                # run the "run_test" task in every cell

[tool.uv-matrix.tasks.run_test]     # a task named "run_test"
run = "pytest"                      # command run through `uv run`

Run all jobs:

uv run uv-matrix run

List the jobs without running them:

uv run uv-matrix list

The matrix above expands to:

test:run_test python-version=3.12
test:run_test python-version=3.13

Each job is executed through uv run. For example, the first job runs roughly like this:

uv run --python 3.12 sh -c "pytest"

Matrices

In this matrix, python-version and webui are axes.

[tool.uv-matrix.matrix.test]
python-version = ["3.12", "3.13"]   # reserved axis -> uv run --python
webui = ["django", "flask"]         # a custom axis (any name)
tasks = ["test"]                    # 2 x 2 = 4 jobs

Axes are combined as a cartesian product. In the example above, python-version has 2 values and webui has 2 values, so the test matrix creates 4 jobs.

python-version is a reserved axis. It is inherited by tasks that do not set their own Python version and is passed to uv run --python.

Tasks

Tasks are reusable command definitions.

[tool.uv-matrix.tasks.run_test]
run = "pytest {{ posargs }}"        # {{ posargs }}: args after `--`
extras = ["{{ webui }}"]            # include the current webui extra. ignored if webui is blank.
when = "platform != 'win32'"        # skip this task on Windows

Common task fields include:

  • run: command to execute
  • extras: optional project extras to include
  • groups: dependency groups to include
  • cwd: working directory for the command
  • when: condition that decides whether the job should run

The full set of task fields is run, groups, extras, uv-args, env, envfile, cwd, when, python-version, and continue-on-error. An unknown key in a task table (or at the top level of [tool.uv-matrix]) is an error, so a typo such as group for groups fails immediately instead of silently running the job without the intended settings.

Task fields can use Jinja2 templates such as {{ webui }} and {{ posargs }}.

{{ posargs }} expands to arguments passed after --:

uv-matrix run --task run_test -- -k slow

Conditions

when specifies a Python expression. If it evaluates to False, the task is skipped.

Templates and when expressions are evaluated only when running jobs. Commands that only enumerate jobs, such as list, expand the matrix without rendering templates or evaluating when.

Usage

uv-matrix run                            # run every job from every matrix
uv-matrix run --matrix test              # run one matrix
uv-matrix run --filter webui=django      # select jobs by axis value
uv-matrix run --task lint                # run one task wherever it appears
uv-matrix run --max-jobs 4               # run up to 4 jobs at once
uv-matrix run --dry-run                  # print commands without running them
uv-matrix run --task run_test -- -k slow # pass extra args as {{ posargs }}
uv-matrix list                           # list selectable jobs
uv-matrix list --matrix test             # list only one matrix's jobs

By default, uv-matrix finds pyproject.toml by walking up from the current directory, then runs from the project root.

Use --config PATH to point to a specific config file, or --project DIR to set the project directory.

How it relates to tox

tox is a mature test environment manager.

uv-matrix is intentionally smaller. It delegates interpreter discovery, environment creation, and dependency resolution to uv, then focuses on one job: expanding matrix definitions into commands.

Instead of encoding combinations into environment names, uv-matrix keeps matrix axes explicit in pyproject.toml.

License

MIT License. See LICENSE for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uv_matrix-0.0.5.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

uv_matrix-0.0.5-py3-none-any.whl (23.9 kB view details)

Uploaded Python 3

File details

Details for the file uv_matrix-0.0.5.tar.gz.

File metadata

  • Download URL: uv_matrix-0.0.5.tar.gz
  • Upload date:
  • Size: 20.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for uv_matrix-0.0.5.tar.gz
Algorithm Hash digest
SHA256 a6f2723986a290a5d79220a05178dca6887f2b5bce5215ebe78c396c9fcc98fb
MD5 50a85f678a81f57d4e122e43bf5cdd70
BLAKE2b-256 54f91099bc7dcd0fced14d9e0af578798a8ffc7d150ddc1e7dc3664b665d26e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for uv_matrix-0.0.5.tar.gz:

Publisher: build-release.yml on atsuoishimoto/uv-matrix

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uv_matrix-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: uv_matrix-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 23.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for uv_matrix-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 2d8f7e7ed52102cbc02727dabdcb4ec6d0dbf85e4993e70e3171c00f61ad8f58
MD5 de8b9c5bd3f0db1036a556927d234dc9
BLAKE2b-256 0a4b4855042438c8d62ab92a8a314485313d8ef3ce5341a6a6a012555c75ff12

See more details on using hashes here.

Provenance

The following attestation bundles were made for uv_matrix-0.0.5-py3-none-any.whl:

Publisher: build-release.yml on atsuoishimoto/uv-matrix

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.0.6

2 files

This release

0.0.5 This release

2 files

0.0.4

2 files

0.0.3

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page