requires = [ "tox>=4.27" ] env_list = [ "fix", "3.15t", "3.15", "3.14t", "3.14", "3.13", "3.12", "3.11", "3.10", "cov", "type", "type-min", "docs", "pkg_meta" ] skip_missing_interpreters = true [env_run_base] description = "run the tests with pytest under {env_name}" package = "wheel" wheel_build_env = ".pkg" extras = [ "completion" ] dependency_groups = [ "test" ] pass_env = [ "PYTEST_*", "SSL_CERT_FILE" ] set_env.COVERAGE_FILE = { replace = "env", name = "COVERAGE_FILE", default = "{work_dir}{/}.coverage.{env_name}" } set_env.COVERAGE_FILECOVERAGE_PROCESS_START = "{tox_root}{/}pyproject.toml" commands = [ [ "python", "-m", "pytest", { replace = "posargs", extend = true, default = [ "--durations", "20", "-n", { replace = "env", name = "PYTEST_XDIST_AUTO_NUM_WORKERS", default = "auto" }, "--junitxml", "{work_dir}{/}junit.{env_name}.xml", "--no-cov-on-fail", "--cov", "{env:PYTHONPATH}{/}tox", "--cov", "{tox_root}{/}tests", "--cov-config", "{tox_root}{/}pyproject.toml", "--cov-context", "test", "--cov-report", "term-missing:skip-covered", "--cov-report", "html:{env_tmp_dir}{/}htmlcov", "--cov-report", "xml:{work_dir}{/}coverage.{env_name}.xml", "tests", "--run-integration", ] }, ], [ "diff-cover", "--compare-branch", { replace = "env", name = "DIFF_AGAINST", default = "origin/main" }, "{work_dir}{/}coverage.{env_name}.xml", ], ] [env.fix] description = "format the code base to adhere to our styles, and complain about what we cannot do automatically" skip_install = true dependency_groups = [ "fix" ] pass_env = [ { replace = "ref", of = [ "env_run_base", "pass_env", ], extend = true }, "PROGRAMDATA", "DISABLE_PRE_COMMIT_UV_PATCH", ] commands = [ [ "pre-commit", "run", "--all-files", "--show-diff-on-failure", { replace = "posargs", extend = true } ] ] [env.type] base_python = ["3.14"] description = "run type check on code base" dependency_groups = [ "type" ] commands = [ [ "ty", "check", "--python-platform", "all", "--output-format", "concise", "--error-on-warning", "." ] ] [env.type-min] base_python = ["3.10"] description = "run type check on code base for the minimum supported Python" dependency_groups = [ "type-min" ] commands = [ [ "ty", "check", "--python-version", "3.10", "--python-platform", "all", "--output-format", "concise", "--error-on-warning", "src", "tests" ] ] [env.docs] description = "build documentation" dependency_groups = [ "docs" ] base_python = ["3.14"] commands = [ [ "sphinx-build", "-d", "{env_tmp_dir}{/}docs_tree", "docs", "{env:READTHEDOCS_OUTPUT:{work_dir}{/}docs_out}/html", "--color", "-b", "html", { replace = "posargs", default = [ ], extend = true }, "-W", ], [ "python", "-c", 'print(r"documentation available under file://{work_dir}{/}docs_out{/}html{/}index.html")', ], ] [env.pkg_meta] description = "check that the long description is valid" skip_install = true dependency_groups = [ "pkg_meta" ] commands = [ [ "uv", "build", "--sdist", "--wheel", "--out-dir", "{env_tmp_dir}", ".", ], [ "twine", "check", "{env_tmp_dir}{/}*", ], [ "check-wheel-contents", "--no-config", "{env_tmp_dir}", ], ] [env.release] description = "do a release, required posargs of the version number" skip_install = true dependency_groups = [ "release" ] pass_env = [ "GH_TOKEN" ] commands = [ [ "python", "{tox_root}/tasks/release.py", "--version", "{posargs}" ] ] [env.dev] description = "dev environment with all deps at {envdir}" package = "editable" extras = [ "completion" ] dependency_groups = [ "dev" ] commands = [ [ "python", "-m", "pip", "list", "--format=columns" ], [ "python", "-c", 'print(r"{env_python}")' ] ] uv_seed = true [env.fast] description = "fast test run for development (no integration, no slow tests, no coverage)" package = "editable" dependency_groups = [ "test" ] commands = [ [ "pytest", { replace = "posargs", extend = true, default = [ "-m", "not integration and not slow", "-n", { replace = "env", name = "PYTEST_XDIST_AUTO_NUM_WORKERS", default = "auto" }, "--no-cov", "-q", "tests", ] }, ], ]