pax_global_header00006660000000000000000000000064152006756270014524gustar00rootroot0000000000000052 comment=1f1fcc7a53665a827d8a304190696c6926ebb2eb tox-dev-tox-1f1fcc7/000077500000000000000000000000001520067562700144165ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/.dockerignore000066400000000000000000000000601520067562700170660ustar00rootroot00000000000000.tox* .*_cache *.egg-info Dockerfile build dist tox-dev-tox-1f1fcc7/.github/000077500000000000000000000000001520067562700157565ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/.github/CODEOWNERS000066400000000000000000000000531520067562700173470ustar00rootroot00000000000000* @gaborbernat * @rahuldevikar tox-dev-tox-1f1fcc7/.github/CONTRIBUTING.md000066400000000000000000000010121520067562700202010ustar00rootroot00000000000000# Contributing to `tox` Thank you for your interest in contributing to `tox`! There are many ways to contribute, and we appreciate all of them. As a reminder, all contributors are expected to follow our [Code of Conduct][coc]. [coc]: https://www.pypa.io/en/latest/code-of-conduct/ ## Development Documentation Our [development documentation](http://tox.readthedocs.org/en/latest/development.html#development) contains details on how to get started with contributing to `tox`, and details of our development processes. tox-dev-tox-1f1fcc7/.github/FUNDING.yaml000066400000000000000000000000231520067562700177270ustar00rootroot00000000000000tidelift: pypi/tox tox-dev-tox-1f1fcc7/.github/ISSUE_TEMPLATE/000077500000000000000000000000001520067562700201415ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/.github/ISSUE_TEMPLATE/bug-report.md000066400000000000000000000011411520067562700225460ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: "" labels: bug assignees: "" --- ## Issue ## Environment Provide at least: - OS:
Output of pip list of the host Python, where tox is installed ```console ```
## Output of running tox
Output of tox -rvv ```console ```
## Minimal example ```console ``` tox-dev-tox-1f1fcc7/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000011471520067562700221340ustar00rootroot00000000000000# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser blank_issues_enabled: true # default contact_links: - name: 🤷💻🤦 Discussions url: https://github.com/tox-dev/tox/discussions about: | Ask typical Q&A here. Please note that we cannot give support about Python packaging in general, questions about structuring projects and so on. - name: 📝 PyPA Code of Conduct url: https://www.pypa.io/en/latest/code-of-conduct/ about: ❤ Be nice to other members of the community. ☮ Behave. tox-dev-tox-1f1fcc7/.github/ISSUE_TEMPLATE/feature-request.md000066400000000000000000000013711520067562700236060ustar00rootroot00000000000000--- name: Feature request about: Suggest an enhancement for this project title: "" labels: enhancement assignees: "" --- ## What's the problem this feature will solve? ## Describe the solution you'd like ## Alternative Solutions ## Additional context tox-dev-tox-1f1fcc7/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000007151520067562700215620ustar00rootroot00000000000000 - [ ] ran the linter to address style issues (`tox -e fix`) - [ ] wrote descriptive pull request text - [ ] ensured there are test(s) validating the fix - [ ] added news fragment in `docs/changelog` folder - [ ] updated/extended the documentation tox-dev-tox-1f1fcc7/.github/SECURITY.md000066400000000000000000000020431520067562700175460ustar00rootroot00000000000000# Reporting Vulnerabilities **⚠️ Please do not file public GitHub issues for security vulnerabilities as they are open for everyone to see! ⚠️** We encourage responsible disclosure practices for security vulnerabilities. ## Reporting a Vulnerability If you believe you've found a security-related bug, fill out a new vulnerability report via GitHub directly. To do so, follow these instructions: 1. Click on the `Security` tab in the project repository. 2. Click the green `Report a vulnerability` button at the top right corner. 3. Fill in the form as accurately as you can, including as many details as possible. 4. Click the green `Submit report` button at the bottom. ## Don't have a GitHub account? Alternatively, to report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. It is currently set up to forward every incoming report to Bernát Gábor. We will try to assess the problem in timely manner and disclose it in a responsible way. tox-dev-tox-1f1fcc7/.github/config.yml000066400000000000000000000000601520067562700177420ustar00rootroot00000000000000chronographer: enforce_name: suffix: .rst tox-dev-tox-1f1fcc7/.github/dependabot.yaml000066400000000000000000000002311520067562700207430ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" cooldown: default-days: 7 tox-dev-tox-1f1fcc7/.github/release.yaml000066400000000000000000000001261520067562700202610ustar00rootroot00000000000000changelog: exclude: authors: - dependabot[bot] - pre-commit-ci[bot] tox-dev-tox-1f1fcc7/.github/workflows/000077500000000000000000000000001520067562700200135ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/.github/workflows/check.yaml000066400000000000000000000075171520067562700217660ustar00rootroot00000000000000name: check on: workflow_dispatch: push: branches: ["main"] tags-ignore: ["**"] pull_request: schedule: - cron: "0 8 * * *" permissions: contents: read env: FORCE_COLOR: 1 concurrency: group: check-${{ github.ref }} cancel-in-progress: true jobs: test: name: test ${{ matrix.py }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: py: - "3.14" - "3.13" - "3.12" - "3.11" - "3.10" os: - ubuntu-24.04 - windows-2025 - macos-15 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 persist-credentials: false - name: Install the latest version of uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: enable-cache: false cache-dependency-glob: "pyproject.toml" github-token: ${{ secrets.GITHUB_TOKEN }} - name: Cache wheel downloads uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: .wheel_cache key: wheel-cache-${{ runner.os }}-${{ matrix.py }}-${{ hashFiles('pyproject.toml') }} restore-keys: | wheel-cache-${{ runner.os }}-${{ matrix.py }}- wheel-cache-${{ runner.os }}- lookup-only: true - name: Add .local/bin to Windows PATH if: runner.os == 'Windows' shell: bash run: echo "$USERPROFILE/.local/bin" >> $GITHUB_PATH - name: Install tox@self run: uv tool install --python-preference only-managed --python ${{ matrix.py }} tox@. - name: Setup test suite run: tox run -vv --notest --skip-missing-interpreters false -e ${{ matrix.py }} - name: Run test suite run: tox run --skip-pkg-install -e ${{ matrix.py }} env: PYTEST_ADDOPTS: "-vv --durations=20" DIFF_AGAINST: HEAD PYTEST_XDIST_AUTO_NUM_WORKERS: 0 check: name: tox env ${{ matrix.tox_env }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: tox_env: - type - type-min - dev - docs - pkg_meta os: - ubuntu-24.04 - windows-2025 exclude: - { os: windows-2025, tox_env: docs } steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 persist-credentials: false - name: Install the latest version of uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: enable-cache: false cache-dependency-glob: "pyproject.toml" github-token: ${{ secrets.GITHUB_TOKEN }} - name: Cache wheel downloads uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: .wheel_cache key: wheel-cache-${{ runner.os }}-3.14-${{ hashFiles('pyproject.toml') }} restore-keys: | wheel-cache-${{ runner.os }}-3.14- wheel-cache-${{ runner.os }}- lookup-only: true - name: Add .local/bin to Windows PATH if: runner.os == 'Windows' shell: bash run: echo "$USERPROFILE/.local/bin" >> $GITHUB_PATH - name: Install tox@self run: uv tool install --python-preference only-managed --python 3.14 tox@. - name: Install Python 3.10 for type-min if: matrix.tox_env == 'type-min' run: uv python install 3.10 - name: Setup check suite run: tox r -vv --notest --skip-missing-interpreters false -e ${{ matrix.tox_env }} - name: Run check for ${{ matrix.tox_env }} run: tox r --skip-pkg-install -e ${{ matrix.tox_env }} tox-dev-tox-1f1fcc7/.github/workflows/prepare-release.yaml000066400000000000000000000055611520067562700237620ustar00rootroot00000000000000name: Prepare Release on: workflow_dispatch: inputs: bump: description: "Version bump type" required: true type: choice options: - auto - major - minor - patch default: auto permissions: contents: write env: FORCE_COLOR: 1 jobs: prepare-release: runs-on: ubuntu-24.04 environment: release-auth permissions: contents: write steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 token: ${{ secrets.RELEASE_PAT }} persist-credentials: true - name: Install the latest version of uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: enable-cache: true cache-dependency-glob: "pyproject.toml" github-token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git run: | git config user.name "${GITHUB_ACTOR}" git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" - name: Set up remote tracking run: | git remote -v git fetch origin git branch -a - name: Calculate next version id: version run: | current=$(git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0") echo "Current version: $current" IFS='.' read -r major minor patch <<< "$current" bump_type="${{ inputs.bump }}" if [ "$bump_type" = "auto" ]; then feature_count=$(find docs/changelog -name "*.feature.rst" 2>/dev/null | wc -l) if [ "$feature_count" -gt 0 ]; then bump_type="minor" echo "Auto-detected: minor bump (found $feature_count feature changelog(s))" else bump_type="patch" echo "Auto-detected: patch bump (no feature changelogs)" fi fi case "$bump_type" in major) next="$((major + 1)).0.0" ;; minor) next="$major.$((minor + 1)).0" ;; patch) next="$major.$minor.$((patch + 1))" ;; esac echo "Next version: $next" echo "version=$next" >> $GITHUB_OUTPUT - name: Install tox run: uv tool install --python-preference only-managed --python 3.14 tox@. - name: Run release process run: tox run -e release -- ${STEPS_VERSION_OUTPUTS_VERSION} env: GH_TOKEN: ${{ secrets.RELEASE_PAT }} STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }} - name: Display completion message run: echo "Release ${STEPS_VERSION_OUTPUTS_VERSION} prepared and pushed successfully!" env: STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }} tox-dev-tox-1f1fcc7/.github/workflows/release.yaml000066400000000000000000000030171520067562700223200ustar00rootroot00000000000000name: Release to PyPI on: push: tags: ["*"] permissions: contents: read env: dists-artifact-name: python-package-distributions FORCE_COLOR: 1 jobs: build: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 persist-credentials: false - name: Install the latest version of uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: enable-cache: false cache-dependency-glob: "pyproject.toml" github-token: ${{ secrets.GITHUB_TOKEN }} - name: Build package run: uv build --python 3.14 --python-preference only-managed . --out-dir dist - name: Store the distribution packages uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: ${{ env.dists-artifact-name }} path: dist/* release: needs: - build runs-on: ubuntu-24.04 environment: name: release url: https://pypi.org/project/tox/${{ github.ref_name }} permissions: id-token: write steps: - name: Download all the dists uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: name: ${{ env.dists-artifact-name }} path: dist/ - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0 with: attestations: true tox-dev-tox-1f1fcc7/.github/workflows/update-schemastore.yaml000066400000000000000000000054101520067562700244740ustar00rootroot00000000000000name: Update SchemaStore on: push: tags: ["*"] permissions: contents: read jobs: update-schemastore: runs-on: ubuntu-24.04 environment: schemastore env: GH_TOKEN: ${{ secrets.SCHEMASTORE_TOKEN }} BRANCH: update-tox-schema steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false - name: Fork and clone SchemaStore run: gh repo fork SchemaStore/schemastore --clone -- /tmp/schemastore - name: Create or reset branch from upstream run: | git fetch upstream master git switch -C "$BRANCH" upstream/master working-directory: /tmp/schemastore - name: Update schema and check for changes id: diff run: | python3 -c " import json, sys with open('${{ github.workspace }}/src/tox/tox.schema.json') as f: new = json.load(f) new['\$id'] = 'https://json.schemastore.org/tox.json' with open('/tmp/schemastore/src/schemas/json/tox.json') as f: old = json.load(f) if new == old: sys.exit(1) with open('/tmp/schemastore/src/schemas/json/tox.json', 'w') as f: json.dump(new, f, indent=2) f.write('\n') " && echo "changed=true" >> "$GITHUB_OUTPUT" || echo "changed=false" >> "$GITHUB_OUTPUT" - name: Commit and push if: steps.diff.outputs.changed == 'true' run: | gh auth setup-git git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add src/schemas/json/tox.json git commit -m "Update tox JSON Schema to ${GITHUB_REF_NAME}" git push --force origin "$BRANCH" working-directory: /tmp/schemastore - name: Create or update pull request if: steps.diff.outputs.changed == 'true' run: | FORK_OWNER=$(gh api user --jq .login) HEAD="$FORK_OWNER:$BRANCH" if ! gh pr view "$HEAD" --repo SchemaStore/schemastore > /dev/null 2>&1; then gh pr create \ --repo SchemaStore/schemastore \ --head "$HEAD" \ --title "Update tox JSON Schema to ${GITHUB_REF_NAME}" \ --body "Updates tox's JSON Schema to [${{ github.sha }}](https://github.com/tox-dev/tox/commit/${{ github.sha }}) (release ${GITHUB_REF_NAME})." else gh pr edit "$HEAD" --repo SchemaStore/schemastore \ --title "Update tox JSON Schema to ${GITHUB_REF_NAME}" \ --body "Updates tox's JSON Schema to [${{ github.sha }}](https://github.com/tox-dev/tox/commit/${{ github.sha }}) (release ${GITHUB_REF_NAME})." fi tox-dev-tox-1f1fcc7/.github/workflows/weekly.yaml000066400000000000000000000031711520067562700222010ustar00rootroot00000000000000name: weekly checks on: workflow_dispatch: push: branches: ["main"] tags-ignore: ["**"] pull_request: paths: - .github/workflows/weekly.yaml schedule: - cron: "0 8 * * 1" permissions: contents: read env: FORCE_COLOR: 1 concurrency: group: weekly-${{ github.ref }} cancel-in-progress: true jobs: test: name: test ${{ matrix.py }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: py: - "3.15" os: - ubuntu-24.04 - windows-2025 - macos-15 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 persist-credentials: false - name: Install the latest version of uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: enable-cache: false cache-dependency-glob: "pyproject.toml" github-token: ${{ secrets.GITHUB_TOKEN }} - name: Add .local/bin to Windows PATH if: runner.os == 'Windows' shell: bash run: echo "$USERPROFILE/.local/bin" >> $GITHUB_PATH - name: Install tox@self run: uv tool install --python-preference only-managed --python ${{ matrix.py }} tox@. - name: Setup test suite run: tox run -vv --notest --skip-missing-interpreters false -e ${{ matrix.py }} - name: Run test suite run: tox run --skip-pkg-install -e ${{ matrix.py }} env: PYTEST_ADDOPTS: "-vv --durations=20" DIFF_AGAINST: HEAD PYTEST_XDIST_AUTO_NUM_WORKERS: 0 tox-dev-tox-1f1fcc7/.gitignore000066400000000000000000000003551520067562700164110ustar00rootroot00000000000000/.*_cache /build /dist /src/tox/version.py /toxfile.py /Dockerfile /.tox *.py[co] __pycache__ *.swp *.egg-info /tests/demo_pkg_setuptools/build/lib/demo_pkg_setuptools/__init__.py /tests/demo_pkg_inline.lock /tests/demo_pkg_inline/.tox/ tox-dev-tox-1f1fcc7/.mailmap000066400000000000000000000035031520067562700160400ustar00rootroot00000000000000# .mailmap - Consolidate git author identities # See: https://git-scm.com/docs/gitmailmap # # Format: Canonical Name Old Name # Bernát Gábor Bernát Gábor Bernát Gábor Bernát Gábor Bernat Gabor Bernát Gábor bgabor8 Bernát Gábor gaborbernat # Eric L Eric L # Hugo van Kemenade Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> # James Williams James Williams # Jürgen Gmach Jürgen Gmach # Matt Bogosian Matt Bogosian # Robsdedude (Rouven Bauer) Robsdedude # seyidaniels seyidaniels # Sorin Sbarnea Sorin Sbarnea # Stefano Rivera Stefano Rivera # Stephen Finucane Stephen Finucane # Sviatoslav Sydorenko Sviatoslav Sydorenko Sviatoslav Sydorenko Sviatoslav Sydorenko Sviatoslav Sydorenko (Святослав Сидоренко) Sviatoslav Sydorenko 🇺🇦 Sviatoslav Sydorenko (Святослав Сидоренко) Sviatoslav Sydorenko 🇺🇦 Sviatoslav Sydorenko (Святослав Сидоренко) tox-dev-tox-1f1fcc7/.pre-commit-config.yaml000066400000000000000000000036361520067562700207070ustar00rootroot00000000000000repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.37.2 hooks: - id: check-github-workflows args: ["--verbose"] - repo: https://github.com/codespell-project/codespell rev: v2.4.2 hooks: - id: codespell additional_dependencies: ["tomli>=2.4"] - repo: https://github.com/tox-dev/pyproject-fmt rev: "v2.21.2" hooks: - id: pyproject-fmt - repo: https://github.com/abravalheri/validate-pyproject rev: "v0.25" hooks: - id: validate-pyproject - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.15.12" hooks: - id: ruff-check args: ["--fix", "--unsafe-fixes", "--exit-non-zero-on-fix"] - id: ruff-format - repo: https://github.com/asottile/blacken-docs rev: 1.20.0 hooks: - id: blacken-docs additional_dependencies: [black==26.1] - repo: https://github.com/LilSpazJoekp/docstrfmt rev: v2.0.2 hooks: - id: docstrfmt args: ["-l", "120"] additional_dependencies: ["sphinx>=9.1"] - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: - id: rst-backticks - repo: https://github.com/rbubley/mirrors-prettier rev: "v3.8.3" hooks: - id: prettier - repo: local hooks: - id: changelogs-rst name: changelog filenames language: fail entry: "changelog files must be named ####.(feature|bugfix|doc|removal|misc).rst" exclude: ^docs/changelog/(\d+\.(feature|bugfix|doc|removal|misc).rst|template.jinja2) files: ^docs/changelog/ - repo: https://github.com/zizmorcore/zizmor-pre-commit rev: v1.24.1 hooks: - id: zizmor - repo: meta hooks: - id: check-hooks-apply - id: check-useless-excludes tox-dev-tox-1f1fcc7/.readthedocs.yaml000066400000000000000000000003731520067562700176500ustar00rootroot00000000000000version: 2 build: os: ubuntu-lts-latest tools: python: "3" commands: - pip install uv - uv venv -p 3.14 - uv pip install tox-uv tox@. - .venv/bin/tox run -e docs --notest - .venv/bin/tox run -e docs --skip-pkg-install -- tox-dev-tox-1f1fcc7/CODE_OF_CONDUCT.md000066400000000000000000000062361520067562700172240ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: - Using welcoming and inclusive language - Being respectful of differing viewpoints and experiences - Gracefully accepting constructive criticism - Focusing on what is best for the community - Showing empathy towards other community members Examples of unacceptable behavior by participants include: - The use of sexualized language or imagery and unwelcome sexual attention or advances - Trolling, insulting/derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or electronic address, without explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][version] [homepage]: https://www.contributor-covenant.org/ [version]: https://www.contributor-covenant.org/version/1/4/ tox-dev-tox-1f1fcc7/LICENSE000066400000000000000000000017771520067562700154370ustar00rootroot00000000000000Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. tox-dev-tox-1f1fcc7/README.md000066400000000000000000000030171520067562700156760ustar00rootroot00000000000000# tox [![PyPI](https://img.shields.io/pypi/v/tox)](https://pypi.org/project/tox/) [![Supported Python versions](https://img.shields.io/pypi/pyversions/tox.svg)](https://pypi.org/project/tox/) [![Downloads](https://static.pepy.tech/badge/tox/month)](https://pepy.tech/project/tox) [![Documentation status](https://readthedocs.org/projects/tox/badge/?version=latest)](https://tox.readthedocs.io/en/latest/?badge=latest) [![check](https://github.com/tox-dev/tox/actions/workflows/check.yaml/badge.svg)](https://github.com/tox-dev/tox/actions/workflows/check.yaml) `tox` aims to automate and standardize testing in Python. It is part of a larger vision of easing the packaging, testing and release process of Python software (alongside [pytest](https://docs.pytest.org/en/latest/) and [devpi](https://www.devpi.net)). tox is a generic virtual environment management and test command line tool you can use for: - checking your package builds and installs correctly under different environments (such as different Python implementations, versions or installation dependencies), - running your tests in each of the environments with the test tool of choice, - acting as a frontend to continuous integration servers, greatly reducing boilerplate and merging CI and shell-based testing. Please read our [user guide](https://tox.wiki/en/latest/tutorial/getting-started.html) for an example and more detailed introduction, or watch [this YouTube video](https://www.youtube.com/watch?v=SFqna5ilqig) that presents the problem space and how tox solves it. tox-dev-tox-1f1fcc7/docs/000077500000000000000000000000001520067562700153465ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/docs/_static/000077500000000000000000000000001520067562700167745ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/docs/_static/custom.css000066400000000000000000000006661520067562700210300ustar00rootroot00000000000000blockquote { border-left: none; font-style: normal; margin-left: 1.5rem; margin-right: 0; padding: 0; } .mermaid svg { max-height: 800px !important; min-height: 200px !important; height: auto !important; } body[data-theme="dark"] .mermaid { filter: invert(0.88) hue-rotate(180deg); } @media (prefers-color-scheme: dark) { body:not([data-theme="light"]) .mermaid { filter: invert(0.88) hue-rotate(180deg); } } tox-dev-tox-1f1fcc7/docs/_static/img/000077500000000000000000000000001520067562700175505ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/docs/_static/img/tox.png000066400000000000000000001501441520067562700210750ustar00rootroot00000000000000PNG  IHDR@]sBIT|d pHYs$tEXtSoftwarewww.inkscape.org< IDATxy]u}眻Κ,`պT m*b]~*"*ֶƶ֥jQZDD\R-Ha K2d2d{8 e{s_>̽J24IӒ9 M M$ pEj@-tH.ݾ*'&\eIHա :=$tVͼ\ҒV$ݨe3oIzlktIk՘lIGw eپIǶ0I4e3owfIWk}fWQGw ǖIzwJzq s(̀{s$.9DaOgn/k' <񒮔9D ~"ءnMt6ێ|ZҐ`s _ %Tk>% )TIUre;YCaI:S[$z(f]YҟJ:]I2q 4ISvt`ȟU#EVn  WFҨXnv 3c%^ҩ9//`(̐'Lsud$$%%˕zf" 3dQ(IjII/ 3 YH:N)oL0`(̐f3KUV9$9n=a_uwt+)Q!q} (̐Vd' 3P0OfH+ 0`(̐Vf Caz$4BQSRJX<RR5 #2')\|HHo?c.nYXKb'jucb'i%Uc{Ɗ%m7熝Lñ@4l 8`ml|FfpHIӣW=URؤ?4Ѥ1 3dفQX˯{֢`z d˝''8'GWmkpg5"n3;v݁kYam)ǣ%U=d44(e}b#p4N ( m\^sgqdzef9w6:iI /ֈrPZ%+K Ca,0;0 3ru'v=\#$;¤##$[ިLj6}-U9YQy0q=64TnJ63MKmܭ٭qxE`3H^IO˱gKjW f 0uY1fv%]i~:45du$oLACV3\S/~ͫW=dFO ^%J3@Gav`f@tVwǚ8qfL'zۊܹe15i[FvVWqH'9\?}ňT E%{o+J5oZjIӾ9SEI-{,c(ihாS.cK"յT29I?HTh,*Wb'rp\cMvLMFgyM&wml;uo|#m”`J#4%/n%}C*Q^;D8M 3d+f@]*,w8v/rLzn+WLb>خ ǟ#J†5k?;ray.IuAx DIwƢ0CPW]uiE':g/Ӌd͝A6;{䵬rnks f- bw=?aa}3ƎP74oxAR,(̐fFad؆ צN22KZͦoubhm:Li;Mzx!߾>?-$TIJz@aC<# ( Ș,d3zcuhV̙(ܾmfҰ6P^AOۛZbII- ǡQ(̀ XȾiW|NO\r]flZ߭3m֣jF<ˍcOà೒;!OPw0! 3dفQ)zg} fV^lhZl -#s4' ֬p0/gӧ\;8t BaC@V\y3Skte}%b+Ljot˹T`+Lv 3:rPo|Ӿ()ŎcPwK-C)AQ0C&Xaڵ 嗛I/q\%ں4uk15[1iHqhl2IFdԢx͚5;LY&iw4H@J#J `YQ! ( hݺ:CNYVԦ5y΂Kjtid۶EsxcI꾔Ug-dGt'Af9ڋ`j>*wҟKMwtq9B-*]?_g;P9v(_$テ)o,Ba#dtޟw^IJNRӼ"W+8+O2)S5KV̙zzmW%[&i3:kAϞ}ʡ_Hzh8t]9 'K:w M( )Wy=84uO펃7;%=Nd3Ԧ494XZ;laX"+s3`v*K}H-[G){Jې?+A9Jޜn 0o&%J?%UU`[gnC,9MC ퟨM)e#űZ= 8Ρm}sI8c2Y2擒-qHs*G,YQJz& I[8:]\R:/m6T\;B Wvצn9~\ Ud$}w풎WȫAcPZW )9}Xj!lKŎd]IT0۪Eet+LZapx{)s3q(r h'IzԆ9xUfhKׯ|9}\'Βq,ݾkT'|bZX>AaR*4dU^);@$,)+S,(l+)NVr 8! yʧ>.ً}gIl*𝣑&&[vsj39Sc0;O T|@]$mC b%徃Y IPrayU,f&7CɆ _~'Cs7P=D0uS%"@·s+[~Ioo>M$}wA!2`ָB#uK:Uһ%=s 8!A.`eqa M/gn#rypg?0~ߚ~羓$];ys}nT$XaCfhP2/b19:i l+LnۆsD,joƳg+T*I},g;H $m􀤭T2Rvq>?~r q:t5 8!s֮][J ȁ&~|y &iX0qȂw_p|"iġmlLJw`>)!%Ec}i%]69 r LҙJ.ȳ.IӾds+zr?9y`bnugErmsj]{XeD?: Bi! *9 Jcd˥N6HMMBayI*@qB,}[yBdYΓw,ҖavwLn2]8|ۚ5>שG)j0 $Iҗ}IJJnAI*ٝ4$$J9 Ю8! 󝕽%1WUY7K V r '6٨uy|w&{y@+$-{;LesII/SA~p<zI¬J:EIQ;~m2+_hɖ|gg[Qdm3 Ru߽3оkSݙTGEU-pնTdfvY\yœ>%߯V<Ǿ?J*i4A*<$$; Y{zw*9 'd>pBw鮿1ٻ۟eҖ&8(H.sn)S;G:ܤ,,dqոl{-5?$zgy1z%/&)W;) W~eӝ^|}2>Ɏ%&vhNAm¥fV{㻃[tZ2MNA Pq1 N \Ek'/?!'Hze0kn!жz%&$P|A{.%Jұ?NȜ:$uΒU.v[vףo2 ,(v+*3qYmŲ&fiŅPQeqw[}ɨI/UueJf"^/?}@[7@ٵ,%]{8!SW?<~IgΒu.mi ,ʙ{6Z9Io0 ˊ-ן5;H-U4FKZIz[}A[y`q!(g3(;'d^y3SD=w#[1D\(8\6rx{qhdgaisCVÜ LlAr$(ٶ5}F1 l?WOqdUr0h2X /;2Y.=w&AiY8 9ӓ*;JLJ IDATDOEarr2֎μk|'ɉ#%}H>M)iȽP% =I'4IezsWihb:9m J}fn^*]lw]-)vNʴ8zDOE&۝ůswy A𐿐w_K +II(̲d$,-Oxa({ƴ;:;]̛aJXB=S'Tj*-٨):m͹׮%g^(_%=whR<}A. J;Y,tKR'mb⍿be!:YWQoR޳*], lbfX\-T9L|Wj'Ҧv)+w ȴÔx/H:w@(k8h>!sUaO:}gɣ{.?s$[1M.XfZں*lZ9M#˴w(~jBͅ>n !Ӓ*I:AR9$mbANTrJfEa_O\bGKNRYhlwkӦJ&b 'Nဂ^X{2bɰi әnCWzrO zpגw`(ҋ ȿܞyG-.藷V'\l*~( b.Isfa=zʾdnڙ/_ T?LKz|A>fY7U%v*o1{eI(e٤C (ː fFҫzlhᮑBvfpY8:jRgA*^ vԹ߼G1r*.IT_@ݡ䤬Lʣȹ[NJՖ#{wG]fS8Bi <W|g%㕯Z*3r2%sعKzH3$ p!SAa~d~~٥WPftNY{4nŌ5ʐ ~wCZXEUN/Ծy)'P|6Ǘ%m$],)}˓%}w!} K>yxdv#cۊi lbXwp&΁p8:3cJfl~W'BJJg@R7 Aa~dveWL sq\wSfeAU X! 2}]|g8KAMs&Ζt%b@/t 2l+ȘY wn:|)긅3}iJ)6Rٟ=֬^ƫIz!A@d; $wm@nIw4;欮 .Qg>E])Y,`Ϟ`dϞpe`Ob MxAha1j/P3ްޛB o%*JAS%-'+BA9-دV1vEھ#D{$}wW|"}ǙV\ys״,V͊rr\9\ܹ8;ŝ{WaF](mC$ h*Y͙eKq"&rfWrm8;&bw(ZdӦNeпbT(, f;r$;Mr\|jIrݒN{s]A%=[Ҵ,h7)e]^-2 Yv-kp7ߒ鱾]#ȘV(uƲYqU(l1'{O}%_~,93&I?TݑJe~w4$}wtuƙv%H%idwKĖCaK&fK:N]DvstdjVQĸqE8P/]|ٷ|'ɡIzm.9nMH?d%(:Af4IQҝJzKY#djy eYkݽeMP[]2I8VyG ^KJ/*Wrm-03[Ҭ-fՒ)\WdfX5Wrb\X@nQ$t[dsfJ)ݭpȟgK a%bG{9{_X@Ood@)_\3TW`ȬNش#Ɋ;U(vAyM} L=N1p`qNTOD\W_’Ϳ'r)m/,|he%[39h!?>')C,$YɖL (tܳėT,5.Z2P+l-%Ӽ O6w+ +Ĉ&>NuuX=&f*22=5Ʈ:@K9=WڷqbIoQr y qf.%Ô @+pox(/~9W)lyohaIʳ}6g+Ճj%`i"W*" 'k N=CEq8\a/*IC`A#B!`XK%  nXY 4esZ>;sg5x+] X!3gb2[ITYϖhѮzS]u@.+]UwwI}hJ;%2O5I$;J\D@tuΎkqu_ytEa;wcACba c\z|g;gV\uhumu ֪~fNO=^8UҠm;归^;<9II @Q@ Ǿ%AMaN-ϖ(oѰxv fPFs"+EխxQRⲦ";mzz<tm%=wQw%〶Cam_˳}e2P=(T,(זOΐNcw\D?YwqPY.YT:~[1rdTIMɩH%wy[ɒxND[06S<_M: %vQ;|gH8'j28 OŪű A =%GY!"IZ* a%Fam?{KlIgA5_;w&s*MAiPAG)WAzΑN*ɸf=XMqn!YO?;K_ҭC?w^/@,9O~;DxW%}E7$@P@.\NhQG-_TW"YCH:EB*uu'Tr-󝥕T)Y(tt##Qkף Az͂M1wrf+]x:Ε: eV-\9N;O>7f߱rbݒ^;HuKZ,JAJZ͉[ҋ$N`Xa9V;?3V-+ڶjُ<045,@A*]PX!3S;.0NRd5׽u*Zk:^TձT. eH(֌ShyKr\I*%C>I콶ޥmiY{sz~[*lmͥn4a \Jv"qqP\uhum;Va;تFw7mjzVLAe E[kCeUj{pO8,7EfY>;zvY@o{9OoeΔC'JOJV"8 3ș[6{sz 48tE%kyV[$L8C.Vs3Ru>7É NES/4VaX`G’C\fժU8ot9Hw%h9  . GnxpeGdXDdތl̹g~l n2eaq1)纃bw䤸Κ&kSU?Z &sߞ=ٙȈS2FUY/~uSzA4s@DD)??ϱs}rg$5[kΥOkS bT1ɸ%Pq˻vߵWa7iPcՂ5&Ed rP`wF-Rv3U3 Zêh jP/.Va/VC)PKC wđ?a>wx4Gtz6!N'bѹƔj0;;cG8{.59LB!KKCaNfݑ.94< 'P^Ñ.FՂ}&xqk-tJ" [A57uL#1?: 2r 1΅fDD3#<7*@ Kb`՞d@iv;\3iq[vm?bgtH\/u9CX3_RX UªP*&V<6¸(b b<# GyO[**fC[܉XXioG<>u~u{= 3{1[Ų|XFtn#"QØ71/eoZU.>`=7Ѕt*X ("(O"R3%#X}llxlz9 rd#3빜Åpb~U ?l%5foiznǝgoCd\]3Yqg:A ,ͨ #Nz\0N@PUEy,. oπ;6<1 Dq&bkޅJ D~;^~: Ed3 ]?b‚ 't^+捨꒟Ǭ.ݴYa5PBzKAy94.\,%u|Q\JLsw1~C\oP!&b߻B%,C܁ IDAT͠ Xn ria(7{fuK3gUcN`AZ.);\sn@O&+,fK\8\ ̈fGTE '¤2͛ÃpljAuuICk.0_^KrK Ykup&ADǂ =y2;n lT+"%b2~auW*0%pd&~b?4s΁a*l[oZ v;y3f~sgw'!2uxsbBx7u"J fDD3C of2qG*N|땲ؔ =h,pr[!pV62彚zX vĭq1z3C8nЍ¸ Ӯe fDD3@"F]vaFqd7V$]vK({5ۋ[֚v҅Gmt|cr!q"j:cop|sh`FD4>vc-<+dǙ?Fq"y@~W&G_q˃6ndN~g u~߻q C8pbB\ |C'"J蝞?<ꆫN@[R-CyvZ.q,:^1}q5iy\z6ʋsE9CdCA2g1e+~M~uy‚Q={u<Z؏x*(etq /'瘪Hq(bq"_H߹ywܝLw#M 1eo:#׺A4oX0#"J蝞@c@*O-ii: 8Kk-Yk*IP);&`wa[t~JAMcdO3!2|S4vDSǂQv'ϋ9߮x8ciAn_#YӥEݎ4Vwaˆj1fWZǩ ~jB;ݎe15˝Ҵ9 ӮCL:#̈RMB )WK&hU;vfV"xAPސx-`}qM.M2kŌ?Y\E 5Cd.uǤ+:Ѽb(><AKb&u,Va) `6*4sJ6{L}sd7W6-UgbkކJuWNa]ȸx q D3",/*t:"ܽ4)^(ܲKouYE&ݯTgU?w#~]ȸWC|'80[DDsࣟzEyW f׉Qne'5Z\НsN\+n1fƒ5t]gI]85@wq Cdx? $Co<eD,U{ΗcE<Ұ#U;YT g7D \#EryiΒVVNgytG?sd!oyJ>q g]8g| M",_~#Ԫ_,spUjvy7H ,K3fc!۬Prfȯn|`[ˮ՗q|J]u30~ 7 BDb(E _ԕ.(LSYQE1.ȾgIeL[ ik , ^ޯ+<ŷq12>:Dw͜ǯ6Q:7 D@,/rq^VpFji}][Xe9fYXh$Y\+ uv% w;j:G+:Gu<;tP PK' \ `FD_:}WNv?Q:ܿ͢&g٠h+PI|ةH5{u(gyy s~u{ ƅ+x0g?: fDD)oUϗ 5[\X QYUc&DllD[F^Q\t#v'>)|1+!2ov9&ʢ@!"JTM5iQviC,b|uSS`y %Ϙ(X5R$jfؙJE6fhsS3̙?x %ivN)sR<QYƂ#a+5@z\{@v#)^iGz^Xې̰:U\HRI6/t40\pIA:o.s"ÞΤ S`FD䈊r9Qļnvi9].ϰ:FeCof^$`}bH7 v]^q=yOS̙K3S{2); fs|./ux)FvETV1(a!X7ԆUʲmN8 e_)dWgTe:3-?9~&,qysł4r̫LvY/1 bP^e9ΣZز֏c ]X0ƶؤϵl: ^[scν) fsy;7ADchfZqlZҎ6:Ǵ (u ð:GP$KQAoc̹:D]S̿xD4,M? tb: fDD QU,P#-,Αzʆ^i"c…kvN?%IQǺA^`uJkD.,%,F:GY6]VeiG Q,uzQO|+!3 ҊJۈ\2U-3^:~u"J.Y!"JP^BhZ5thvef*¥OQDHGF_Yt ԢE#$"#0(XVX5Q!JDrn]i)AD8""0 AA Ugܻ®Z:,Aam]/}-9a1H?Z1 (W?eB+F#P(<#5rEZtG4mncp/AʶU+^ :ˇ1?ui` l!W$yfVpY~?;}34{~ 4ukeÆ $eH}nuaq%v;p|Qnk.A7tx4g.Ɲ;ED7ě "dez~Q2^͹#Y9-z "qږ`Ն!fpS,lA e(G Y)ɉ|Z#@tAWKja#:Kwlc\,GA(X0#"J*Gg1vI7gVD4ؼ^$gYm_,ÍbR6k_)%k|^ZFfoF}Y  Q tSd:ML1 A(xBDT+sLP؟aw#kVy,|]ZZ}=wkhnW;h7CPtCHբTr5"={֪~Dxv=+3Љ:^xnЄwf/N+`N #NQir8TkfB73?&j6#QS<D֋Tvd]V Wojbge#/eb`X(k1~gj,'c`l67~ADkED4Α "Jb JU3wƌ70T9Bb ѽҞfn:+j(`$;п;͞j rapFxоT d:R&b %]/|m9lT*d|8ywq77̘ wk!+8oNfDDIQ<2ō")Q趧svuO9|0jK˲u~^[݅-S̊)(j}D35kpzD H+F\Q$~(4 '!K{ID#/hgS":̈/zZ ͭ/춃H )QZpIfڬ?(&VrJ)鄡 :Ơ7Z/Q? hW$z$X0z?:]cW8pf fDD pT*hyP؅@==fޏU7D7(faʢuE1gX@4b*(xjddG8t FXRїH|%;砱>lb(jhBCV>V1#kmUD[B-c&vA! IDAT.|ɫl:~,Ԫz0uEqLQ,ɥY0 ӳIB"4tQ_#diM, T,a8gKSG|?wfW.(ê:g^Nt˪XOtbŢzx4ڵȊ UDt5E1h +(v^á3G j jZL4`ʬV 8Ǽrfی_D:2Z-$P8l<ںQ ^(,$Z,ZS^QhbE7dE$Ev>#ŲE,6j뙺ZwIJ :@gNu̩_CBDDRe4R q퇑p˔Xhq}^Qkwz86FV{#o5=:ub/#ȬʢY\g8;nJ^_rبTp61mOyUu :vb^:e;̈%cŪxFg)&A땪[:7o,PT`+b(<)&(N1)ƢXj(d:ZŲBD‚QS+Buu$FZ=׍gy[2-1m\_=O" :h ~vɮ0 2MB"4tA_vܴʙqٟib %u"ʞ|jFD-Ho8*Qv?6 5! įn#Xh\ճ^~n7%YZ s wa{hXF5r[{>J!2uDM0#"YNr5u{gN"aS/H[aQB* f~ю0p*R֋e3ZPso nb٢PX5F}L]- Abǧi~_doq!(X0#"p9%?(;]Uy#jBN.䰙߷ O$/+kAnN3\O"?Ch WܷfIkT[P:Y!JPc?&0 2/ D .$"YdY0;Njg95b݀;cNeoj]†iW [h8+F-qF2ᅥĆ\f~B|ŨT_|ی4!oŮCQv`FD3cxss '+N=,XMx x,$2GQQ<7zh/0f4q3|E]X^렊#IuxA($(~,Clwۘ|zvc1´HQkg%dUm߿$̳]6+aŎ, aC:ìQA PGP##;cd0’}h]  ]3?Lc  pb_6+dp/,E#<E2g-%NԼ%j[P:Y}%> poIDtn0#"ܔzauB5#+ls>sLklpBglFݖGA5F}1*Wo~aw"C 7AD3"}cG*?ޠwXm":LGsLҖ(`a*5u܆WW?{ ~#Rs8cYK*\mdҘAQ~@fTTi_?;*~IDĂQśUr쌲NI`$1M఑8zcm3ww`S!UQ%.sOr7AD3"iX|cW$^.;8f*8vȴCpD/<Zf)0,ָk0^.#+l3V m6E/a:p?|' D `(Fo *OB^M\iJ; ٜ䱢^ґ?7`J Fa`(9 2GF#Ŧk);xi8Ӧ8O~u"J?.$"K5;\PK?֕W eW2RpyJf~ .!2w/3b 3ňrP]ǙGN^͒ `%ocB编@avեUv%:]0#cp"c~] tb(N0X]l]S0"@s#-xvXyrlu#mv.RB$wt"C| `oh~hx*Q-(ϛL.@ĵZY^ *kKjmv57=a ]xi&wN-~ gFDי^"Ya=vM/Z =>S gI.\N{J6cjpL&!2o@Dtٹ%" ft 㾞InYQ;R;TZUv04}L 3z;!2Mu"J̈bt3N0VR;{h g$j84QdVuLm.Z9 zpspDM,DW1ń)j4 }O1i7|cZDg߸&!,ݤA?:D<\ t`(F"w[QΑZƄ#{ҞVyGazȬvm{A1l$!4Vw]g\/vc(n@߃f 3Ft~͌0!%߆pGȣ2=(Cdu"r3" ]GH _<1/id7Q`h]VX_{P0 ͮ,wMe(u.x/g&J;,L㌆^C՜8HxR1Fid'VqBbYb7K2!@hw1; ;+,Q ?:ÂQ,3h+-Rr0N v{v<2ZP:m6!7Dpe~ui?hTPVmdBW/]/~ 7YFMDQK@Sșk)ŝg=M )Ab,FByf:,@薶?_o]nTa9y%9\ `FD3(r# ™ 6" 4Si:h;1,WrYJ?3 C.qMviwQtU<@x43^[\z-ADb(mP=s _083͋D)櫋fnG6 -C$MؾM vޓq)͞n! pu"J fDD 0f|ryoGys*%$8Q#W AwlwM_WE^˨wOTYex7HY,%,0V8hΘG*on¢13m*!U [[A:kh4EYgxΎ'~!(,%aΗd6}cgh0ֳIJ$Ɨ \)nK/nH x I}7g͇*XwNnOvw{X*àǡ_a$}`8W.gIWʹˣE \wvv7hްXWEyu :}HBD73"Ds$v-Ll׊XYwpX<{)_VW6sv͆ }P>ZN1*!\.b\4'JD ^"<\i{x9(0y+8NO2̌\繑pd7HQdz֥AFfi >:%%!(>,%Draڬ=y.ǜD]ډtJDxpFƗյͼ,b2&ۯ_>{CC!9סnHA(QO CP~\ x(!3L[W8PXHE<; NZD?2(AKfuu3ctuHgƒVi5:$|k}d< o3&u1Dts%"JU#A.!٪"LQ[`|Y]k⥦,^f `v4@\rIJAN| mC񂗈(!\gN?%4(;fii$ize!&*6W^WW6suQ]8(h5+۟YMv={)=:q#w]q_eC(!ҎMNN[:v.bԌrTw3yoLyvC],6K{ˍJ? Uf{ ;vwƕ<|'}qfޛ|Dtv%"JZ Fgrf!c2U͗~bC+5o}y32p3U0MviwIUT]g̲n Ri:x^yk ^"NP5GKwje' D,޴ͬJEbqni{ko} >-;dc\J?}A,y8όhf񂗈(IƈrITIc4[y7KUg2Ll84~cYگv7)_,#SPlq)j /ɼL7N< ] c(I%5N~7a?ԜܘeT"M_,T [[^ZweUDwuŭПS|#|3^=8s:N/8\Q]κT|_J8Ϭ8h U)R~歯mLlhh} Awlw.,~qBsM\ U:M/;޲yMo"Jh4,QKԈHQ ѨhTgL0 hlF%̝{{=eg LޯW2=;3z: !~χO K3{RD fJ)5D~f|0,ήŵä \8k%]gad~ юQ3EٰyK%6Bɲ7 v盕ݻ.&օ$n|gP x!fɃ;Rj`RCd ̾7Q)hlƘsƐnlæ\P4{ޝd>R\g~eƽx]]08sp!R321,;Y10kHD :&u0ܾIssy f"Dx*Pk99@sg8wiL)Fe舍a|]X,4kc3I1cC*m͒͢Vz9 k]{gjSwt%s5M}~!;! 8?u|Z| U*`R#P/UFQ/EF;_ŀ1_Eĸf_rfIg,k7l./۬[~!/6'wϭ.oqԊêHs}8k7w=iL)F;kꖫ>o0kCcQI6AD8fkAfni7#w[S[i7٠k.O%`HC~gYc|PJݕ̔RjDV j"w-hv`͜ }>d.oC Wmd&UW5~vG > lD)u'-)ԈzV֙`ժTlnf㵫oHfmfKeqGRkm{74&ZXS ?s ; 7M=\Gp \~U*1`R#G_lB þ;@l={ 6Z0K)[0k6n)W6c+/O/3\nq^IC&.n$FᎣxr ;R*3O|h0cISϠ`wDqZވd}j읳l#7߬5vq6. &qf9-%_쁾?0kf?B)3)# X\,'DldXf^IDrtKf6,NuvUh:}wuH;!>f} ͚x>^"3-)Rz0+4tyML `dz_1k}8}WԻ+Ml;aV;;Sn1k*^w%x)%Je̔RjNؼscjw+l4k{T |7nE욞 MJ7n-hc$9x+vJWR7^}wk 8yqִoLyL!UJ)O=ob˳I3V R]-*(PA̒D\N{`r>.e-ZYw*M[0ML@|; |xTͮRJye`.ƼlC0l`tYBQq"vͲ?vSl k9.^!=SqCP$ A`x*04:1NyJ̔R#$Xss&eII\%aU:䬩CxftzcZu"pQ%uSWfG:]Ol_Btzvwl@r`k}R:nȔ}F.u֣~&1 s{ng)(k?W1?UJ)ώ^&Us44y `wXhStn,͞BLNLt9Ad P:Re|* ̅brnp58 /s2_!R01TjhL) }G#Y;NJ[ n$H_j0h7kCW2 #;.'oi||բ}?#Ǫsd!.e|ȐWOB,тRJ% ]%>34[c j6TR5֨x &+sd]*3p$0MQ s88fm07N?'ÑedlbZ ;"A -)TR5n_Zqc6aжH6αZgEt]ne eF_? a. k׭fieO'}NKk 5?Vs|Ȑu%@*g*4Z0SJ%`+lw*3H3!#1W+70cu`0g;d :ESܰacaϰ6F䒯|Ǣ94! ;;D:!-)TBf"vYY<ϬaʈI|'rA/nc06aT_L"vͰ;lwaӦmvzIwCC,|:\h xJ̔R*AڑKb+vE=e&:lę~?9׋JFYI5b*6n;kK"wΐCkg:47pf +_!Kj iL)&?kv㨮7lMMaYuDg\&-R zo2uŘPčt(v}_`~ߕ|ș"qA(".nj1'ψSJ̔R*anZZNuV&B`&|g8qDBfZ0[N2O#_XF˂5vۑ+jy'۷hP@|$QG|Ș7;Ri3J ŵZHdS .͈a$Fjيa;9Ӌ*[e]M[:<ЙZ;w9 xpp s +!2\lDɽRJKǸy~TlDboeݬd`]s~7:ZT'rYvQ>_gQǕds`s'QO!]C <}pwz4s.2tHQтRJ%-0QW|}_*?fiFd F-CߕfZɲ8z+|qf`Z}~wy(Q $'|Ș'/B4Iʝ- t&X]bɌ|@]^ gtwN8k;ID130 Pd}l]}}Y/poUVC(Z0SJ:f C}Ө"/1LI,vJ3"zdRJ:lћ6Y%W,ʺc4m"w  }Hk]ɡ0hL)8NuՅ5Hc+%3Ǭ,|gf4ЙĽ1\=rP0}Yv~?dqY7dnڡDW;}ȘP*+`Tpw?v{AMN 5\ }gXybɠ}÷_A7խ7&"wX|[,9&s}ȉObӈ;ҽ;DƜv)uHf[tn犺 ބ7u&2T1Шfdu=3zr.#Z8JX*4kwx !4૾C,:~E3d,)*q j?.b>2cðo7ⵒP43z];0,뽩H\wqAQƍآT*$StY #xt5n!R |Ș ~ϤTRiLtӂYN=V,ϊDl&TmXW1 `vN2'D۟0XCǖmu6}GY#|۟~w,p%Lj"cOi-)nZ0ˉ7.Z,.'' *%vgg돊I2bVwrU &Ȥe[Co_a  xX;2t5A2`xo}P*`TZ%ky~qaS0/]kIGdU "g[d7rA?q#W _lႛ>y|Ȱq~,өCdGOA#TJ#EwLJyajqTs4.LKYelBڏB_MV3;r-ΰLsͤ\ f6n;sLi;w!%.ɏ3"~xJ]r@ f997_B7le0Uk7iwJ#+%ٝz7 2}2-Wu [sTqqӧkg\\ 4|!.RJ]rbmέv _{j9^_]n53"&WC$N2',Evcmbv}G=,F{x$!V}ȩgAx}|QʗL*3~PSF`~G:b7Vfs,w2Cfa;5Ӌ*[l.4p;M[{LazT8ory|eC(,iTZ%ĝJN&o}cGĂwD;,:l. 9 Z\,F0\0mպM S/_\p `Qǖ :ˠsȩoK/B! |Pʇ*cG1zbQ,I@כ !xzČ2l3Wc+ x^? ,S8χdxu6h!5-)~G:χ6p/_sqv"GX1Cj5x46ݫ# vwbV7#&ſ8)1l">4oR43Fj #^ wu;DYVA%-)~Z0SE=wʼdtJTPl\ G8W;S2*"b `fC%rVU%. dqB6?Z.dW*`0#ni8%=%3jcYIRwQ Ls\[(U n?\8\ bsrUNw_"$< ܰS |t 7!ԒG!2ŤX%J\> _@%cf;GT*cE6 ⵲쮥N2 ǧN\`A#[ \ǘ {~q0s̑5+ t!Բ o!2 PTiL%Y߄%]<7?|-s$IdʃxF??&̈ ݩ^Tقn ”|gOGS,MCVc`^t6&޴6SW#Vt$[[԰ JA:-{N^*/|HB)z }0mպվDwt1!ore\\m7}Q&|Ȩ 4nUj`N fK@>Cdzo\^;wƌwVqcuN~XktNolW_ވ\C黒/<ysܼ|(Hk!|PC/@g%ĝfJeTily;JG?w@t3ZU=y֎~KHku{Qi=] ϾW}U+#|Y7x. !yRIv9gdNA̭sTeuۅmsVwR" @B0g_3tCwgAx]!2}C(ZZ0SIOzq6!Tr^x[d fYbfUVe^e٫q|aٜ,>_+=M b݅RG G3cxQoT2پCd{>x3seJ,jNX;LifX媮!6lfzQe b 16_VTൾCKFwk&OC(Z0SI7;@ V_t9p>8g ,{^+-{A@X;(Zw"iɲ8=yO 0O뾃d#!Cwx==!2e_Jjt{}H?B%ߚ~;=d׳~d7"O{܏*ӭp]$o;3$k^pw 8 w{6|t\H}BтJ:-|P}_&6YFR=tѨ4,1:&%pbg^eB)hnιͯw X wO0߾w [K<Ϭ;R˥7*H<!T=1=YFP&G!n7#\U),ֻS u,[؇gyP >x p+^ w {8&!Z.- F!T:<}]t9Fc b9E_g݉8f/{w~ ڹd-"c|X fJtУjIC(Z0SI R1#}P\t\;ǨbNtR9PX+خ^e:~pu4Ycs+|ɀW/bBH!}!2D҂J:-Λ!Ljf82V}hTgF KdYWN,6߮|gHK=dぷJonB%YO}ȰM>KTM!RwF͆y.M-{lt\^,feq+r9WZhu'ň]7DIZ`K8$N.'ovoFbkoMA2쏀}Pj)`[a|,Yx_ذEs;˰~P[Ê]qU'佘3T"Gt9HA=|ȸBCтJ̿q)Z+/'o 5рx‡w5YJl_w niHi$Vw/ႰџE-sC<]qu#UOpB|0 \J\W*r|R'd$ջG:|_p ߺX{2Bwa*Wl,8Lg42}WlԻ}t¨|bXn2QLt-a\DFU6'JB癭pM~^;PM`^dfRk="l&;D=8wD f* ~;@N nx-Oח:, ^}G>s1 bd rwԒ[f [FI)ZƑٌ1'|+;H>p7JDxQDf\AFflтJ[W<(Aj-[7Wgf£|";ǠTo M7%zay՝(:gFI)rvf^{CY2~ i߰Db a!23G%~B64l8Qa#2 e|g[y,ƄBg$g8(BXF!rHb,Ɖu&0.$pRX\8Ap"'`@pQXgcED0Vp)L`ZpL?Wvw6,7C%ςZ`ӏsSW|LV^ ;Hƽ xJAdUZxu-YAQ}XpNpYC߁ Qh#N!"Ep q)E$szhD^;2bbs}n3m٥eI2\G6fq8h2 '}ȸ.<3}A f*-^|w xYXą'0 ,;N [OYAkLЙ+$ǂQ$FsF5D!G!Xqb"'Ƃ pR3VZq*r-CZtUpgVe㾃 ȫ)5LVCfAT~iLɛS?#\$n<xX@P?~8Aiǎ.0qLv|k|k>]VuR~`"qGM\4d|(n.%54u'_v%#_;Ȁ|xQwyP=C+5rZ0SiXSC(>KOf4 W}Qq-5\ wOZ0Si2 oڿ7 V;~ S$.=toK}G>sfJFc|20 _E0O"rME 3xygfC#K;KGGQ 9 2zM f*mBmP6`o DG7xP@Px^*71hL/"S%&BrAhDJiL8Lsk(v嬟N!o%ފĝ󾃨H|z` $>U#AThLkq g1*AsFdq9IcPc^nLW þ u.sH}İg~""[͏mp[$yCz:p9p3՞`QjɲFFCo2]J|3Ss_,wc5]ު6{aa,Iw7ڕslkJv,<} TQ˝2;K!i K7ϹUʧ;DOG҂JS* s ć?uʉb&GpNuoW;KRN7<`E QPMαB#\ ^\&CF|,+sMm+L̍L0wKѵ(D_N&2g=YcND,d,vblqx;;KR"?x -JiSe:>vmXX(W Ҍ--HZٮ KI #͈u=gZ/b@'R 1Z,SIx9`9ʉl>VUY|P~B~ Ipg^W{ Z7*+یFe4R>a䢻uqBZUrDv.BEF LӮxY1{Jw!qwYwI CW=PZW JG@V=bk?r,E&'X+rAFN°"Q83ZhVwz fFą-E,&:N1My;̃ g#*y|xw-囓TN DAU;#_ķp}$kDԙv+E'v! 3X0C5TALJ\R*Vy%Gvޙ_eޜ88w! JG;Ho+7uJÀo,˾;H}?lmjCeϵTa*o -^/" ÊI;g&k }"E`@8̮;QdOOR<{ qa)kEEx9:(7I f*n;R iqPq9HƶsDѳ 5Ƴ6T|UbZpDfE=]^ИP41n ά0,\uK v|z C(uz4st~NL1;-4{!pJ~!A&^P,pbDFۙΑt-ᄈ̨ #g ]AHam`&@ cq ^Oׁ|[˴ȪE.1 eCJ -4~ Dks}H;N k;H}-.ͷzA:k}'@F,q-r~)h Z.dq>Y]G16cpS"f /,r1o{1,vr0?$' }Qّ7&*^;ʵ_'჆]ڝtS;˨4cs(X;GV+"nI\4 k&g:JE⯹/̧qϽ-gZ9eIY6YQC(LG&}ɉw)5Z0Siwc`O+ Yq c1'2Hݨ0nw"s)qwv{#ZU _ed*m߾]_ہW1$!\ x9fl!T6hLeGBǣ_vdbbm '2HQToT7KJXkVsQYD$c*T)#C%xގμW\wB;Hx*2}Ӯr8-4Y[f YOq/ Ώ.ֹA wO .OΑGq{fFA_xo=6Y2@Vg,*M| O\hfbZ`PYtAeCǼߍw%Y%0n5f`2,7a9N/n5ŖX&1ʋOb=Ave/bJ.9lTCRr4};ʴO|ɓ۷ۣ>,o&#_jx3yQ3wm0;>s^{$9p0A"*,E{I5:O꾃тݘ1-9rן[؋9wӫ^?N:Z,!sbn=6z}vModUAO|Q3%눏˭DeNx"iAnǎWT;k%8zƚQ`,F]FU7eQkQgPGwB?2GwLw!xJ i?CL]ЂʚoRRjPT㾃;]t)jŜ^ =rf:\db"cdj6$̢Ԋ5;HN< T}?s|QjK}ɩ{}Qɧ35/|Qr*a.ckTtoKr6(5]{yَAr/ GtGeqc>g{0|B f*D<$6WlBܥ7>>eaa֬n |O>< :{#b}MY^2"?~MX۝ ;D76ͯ)7J?BoX"AR}FvV_ k4za2WI\޶;J,ƾc?|g}<)!Rq G`|=Vj/w<~ {7HYV#S,+v5rԓŎvMqvo6sŸΝ;Ofɍ~w4!7'c{ 9J-,7lUE7*Aʈ`.7b;J|sFM(*L/4IJqFfkQyi͑ i>Bo6awhٽ{mW]:35޾)-ZD*ZQA%Dy,DHBSB"-}{rg>3$;9sΝ~3{߽ou{rMy6Λ"`]vi榹i(|4e]B'ސꮋ`/_oq%Iu=?IMedC˵fWut9x9|? Wk-wNNN6C{m;<*\ׅ$u lD N؍fyOƶ܇w{W%$#=C|lnj|$D/32~nutii7`|-MPvfiI>u0Jzׅ0%0cH޴o>\tͯ8 R%^\emva]WrO+;o=&S3͡ٻrnjⰷ%o>7ݢf$u <0# F JzmNr a+wZʚ:4s.-8Bn;<3;1R5 ZSV:_x5iJG{]%`M'yDC]$yGEf#J`?$8[7.=u!lnpSJYvdu`vnMݷ:i~L=Z'j3>xsJ^aF`6Xd]ʮ`C F Jr]'u]iwv][˻?yi)yZMDW{-`k_l4²L[7OnXۙlp>B(<5f'mI~B0%0{%yqڝnL_Lr{ׅu]{+/[]yN6t kk#3 6jf~Zja[Z¡õ߬f#~M$o;k񃟘\h c9w]lR$|&0Q3.O$Nb'' ax-/{tkI躞ڔcGg''Ng-.>t|ya#ԱlLc|W;wWZZ>\:HNM3zf#J`$ynM2 D?.[:x%)N)e~zvxaVc&.jOdԔzSm[b[7f^|C5I`f#J`'$MG^EKMwz{ׅ@묖禩OOyQƖ\]k;YQk-bؑCZA&ML-ip̠)&;u]l|:ɣ.(:핝nK$upO^1Z3jdSSf_Y?k&)5Gg_J:Z/(MoPᾚW~{@d0fEE3itomF`6fpj.K$OOI"'g-y;Ϛ]SǗv}KMBau-Z:~5{^5;<2|ׅkI> وyh&2ɾnK֚$䯻.N[?;R)yFIyJR79~Mr|iǡKڄK+,Iٹg՚S)ׯRz(e{˿;(S$^2lD `0N7yIq-7qOt\ u7!FzyJ?;7bj ʐz/?¡ 6@[HR?Uki,M_c &0;5'yNE6`A`6f0xOL=;I' Iޘ-IV:6u7boԚ[I} Ͽ:vxZ7|iyȱjť2sP#M&N[֒ޔZ?k-7=ɛNri]$H F 6Dg&?s,u\ յ7:+)"%W$9[krlnn ,LݵoƎ1$Ǧsz~i~|ʚ IlJͮO89_"0;yW&ygE62䖴ٜf#J`ñ;ɯ ΞvMN7.>;Fƻ> XHO5IcSIتM];/֔$nPV/hKmO-ƿdf'ciY u^OEkJ`6fЍKgON/rj(Og-6w3񟫥yB)qI,'< ml=jl,3k37kn>GL5gHkZ}㫾f#0;qI.O{ '5h6وh$<"96$_J}<2˚`n3GS.\ZkSzZv5k v,.>t|qPw<M򽃇YZ;&_(i2+y/w]a=:89%0Ѵ3ա^<Ò\r0Ǘ`rrxG<<<5R/JE/[Zx }RT-$wZXtƫ&6Dݞd"<8mOK.$\]wcnۋi{Ϯ7sv${Ҷٟdv- 6=iCOsrjlD `9+mOs֏|HDki3cO;뫦}[Jqn_Ol1&:9缜f^&禗sJ-5u?IjR?:Rz%;j͞Rld^fҤIjMJ5elNך4e4ccS90?=99tQtFڝI^~&u_385{0s9vk(N[IENDB`tox-dev-tox-1f1fcc7/docs/_static/img/tox.svg000066400000000000000000000633641520067562700211170ustar00rootroot00000000000000 image/svg+xml t x tox-dev-tox-1f1fcc7/docs/_static/img/toxfavi.ico000066400000000000000000000353561520067562700217400ustar00rootroot0000000000000000 %6  % h6(0` $m{ yy yoooLo~w|ĉyʼnyxi~yXLwVzYoo7ooou{|yyyvh{ZӈxWyX7yXo%ooopv|||yyyyyo^yXyXyX%ooQooopw|||}}yyyyxwp}]yXyXψyXPyXlomoooqx|||{}yvusrp~o}oayYyYyYyYmyY_bϻpeʵfɳgȲgůmponnmnxv}p}o}o}o}o}o}ocyYyYyYyYyYpyYaѽXaѽaѽaѽaҾ_̹ahhhhhim}tw|p}o}o}o}o}oeyYyYyYyYyYyYX^-aѽaѽaѽaѽaѽ_Ǵ]fhhhhim}m}ryzq}o}o}o}ogyYyYyYyYvW^AփH.-JSП_aѽaѽaѽaѽ]°[ahhhhjm}m}m}o{xs}o}o}oizZyYyYvV\?I/I/I/OGOZaѽaѽaѽaм\[]fhhhjm}m}m}m}n|uv|p}okz[yYuVZ>I/I/I/I/GOO֣OT`Ҿaѽaѽ`ͺ\[[bhhhjm}m}m}m}m}m}rx{ql|\tUY=I/I/I/I/I/I/O+OOP]aѽaѽ_ʶ[[[]ghhjm}m}m}m}m}m}m}pzzrwXW;I/I/I/I/I/I/I/+OdOOOWaѽaѽ^Ų[[[[chhjm}m}m}m}m}m}m}m}mvxeNL4I0I/I/I/I/I/I/dPO֙OOOQ_aѼ][[[[^ghjm}m}m}m}m}m}m|jsgzhmgTt[GwWA}P8K2I/I/I/I/I/O OֽOOOOZaϻ\[[[[[chjm}m}m}m}m}kxhmfwffwfljXr]Jr]Jr]JuZEzS=M5J0I/H. OOOOOOT_͹[[[[[[_gkm}m}m}m|jrgzhfwffwffwfklZr]Jr]Jr]Jr]Jr]Js\HwWB|Q:~O7NNNNNNOYͻ[[[[[[[dkm}m}kxhlfwffwffwffwffwfjo]r]Jr]Jr]Jr]Jr]Jr]Jr]Jr]Jr\I=======D˿QTWYZ[[_km{jrgzhfwffwffwffwffwffwfiq`q^Kr]Jr]Jr]Jr]Jr]Jr]Jr\Ir[H88888889GKKMOQTWdhmfwffwffwffwffwffwffwffwfhsbq_Mr]Jr]Jr]Jr[IsXEtRAtM}A~EHHHJ}vQc^Qb]Qb]Qb]Qb]Qb]Qb]Qb]Rb\Wb[xiaS33w3333335=>~?~B~FHMunQa\Qb]Qb]Qb]Pc^Pc^Od_Ne`Oc_vPa]33Z3333338>~>~>~?~C~LnhNd`MfbLgcKhdJieIifHjfHjgZGkh3,333334;>}>~>~@}yHlhHjgHjgHjgHjgHjgHjgHjg,33@33335=>~>~DuqHjgHjgHjgHjgHjgHjg@Hjg33"3W339>~?|FnkHjgHjgHjgWHjg#Hjg26>@~zHkhHjg??( @ nnw4DzDx4ciHooVosz遤yy鉑pԈ_xWWyXpoEoot{|yyyrayXyXEyXiĭnmoot{{{vutrkzZyYyYmyY_bлpd̷e˵fmmmls}|q}o}o}ol{[yYyYzZpf`ӿLaѽaѽaҾ^ðchhhlpzyr}o}o~m|]yYzYqRW;LLV`Ҿaѽaм\_hhhlm}o|wu}o~n~_yYqRT8I/ƒI/OdP]aѽ`κ\\dhhlm}m}m}tw|paoPR7H.I/I/dO OֳOXaѽ_˷[[`hhlm}m}m}m}qzy]Q6H.I/I/I/I/ O&OOR_^Ƴ[[\eilm}m}m}m|jtnmZxU@~O8K1I/I/߃I/&ODOOO[^[[[`hlm}m}lxhmfxgjn\r]Kr]IuYE{S~@~EKxrPc^Pc^Od_NeaMfaNd`tOa]33K3334<>~?~GrmJheIifHjgHjgHjgKEmk33^337=@~yGliHjgHjgHjg^Hjg334;<ؙ;BOR^f}lexhgtcq^KsVDsRA8r89FJL[xbqcsenTFuH8uH8r8,88?IIN]uiacXe]QqM>vG7,?7n55?FI|QgaVa[ZbYd\Qn33l35>F{uLgcLfcMfblSa\33)3m:CuqHjgmGkh)Bomtox-dev-tox-1f1fcc7/docs/_static/mermaid-reset.js000066400000000000000000000104111520067562700220650ustar00rootroot00000000000000document.addEventListener("DOMContentLoaded", () => { const isDarkTheme = () => { if ( document.documentElement.classList.contains("dark") || document.documentElement.getAttribute("data-theme") === "dark" || document.body.classList.contains("dark") || document.body.getAttribute("data-theme") === "dark" ) { return true; } if ( document.documentElement.classList.contains("light") || document.documentElement.getAttribute("data-theme") === "light" || document.body.classList.contains("light") || document.body.getAttribute("data-theme") === "light" ) { return false; } if ( window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ) { return true; } const bgColor = window.getComputedStyle(document.body).backgroundColor; const match = bgColor.match(/rgb\((\d+),\s*(\d+),\s*(\d+)/); if (match) { const r = parseInt(match[1]); const g = parseInt(match[2]); const b = parseInt(match[3]); const brightness = (r * 299 + g * 587 + b * 114) / 1000; return brightness < 128; } return false; }; const addResetButtons = () => { document.querySelectorAll(".mermaid").forEach((diagram) => { if (diagram.querySelector(".reset-zoom-btn")) return; const svg = diagram.querySelector("svg"); if (!svg) return; const resetBtn = document.createElement("button"); resetBtn.className = "reset-zoom-btn"; const darkMode = isDarkTheme(); if (darkMode) { resetBtn.classList.add("dark-theme"); } resetBtn.innerHTML = "↻"; resetBtn.title = "Reset zoom and pan"; const diagramStyle = window.getComputedStyle(diagram); const marginTop = parseFloat(diagramStyle.marginTop) || 0; const marginRight = parseFloat(diagramStyle.marginRight) || 0; const paddingTop = parseFloat(diagramStyle.paddingTop) || 0; const paddingRight = parseFloat(diagramStyle.paddingRight) || 0; resetBtn.style.cssText = ` position: absolute; top: ${marginTop + paddingTop}px; right: ${marginRight + paddingRight + 10}px; width: 28px; height: 28px; background: ${darkMode ? "rgba(50, 50, 50, 0.95)" : "rgba(255, 255, 255, 0.95)"}; border: 1px solid ${darkMode ? "rgba(255, 255, 255, 0.3)" : "rgba(0, 0, 0, 0.3)"}; border-radius: 4px; cursor: pointer; font-size: 14px; line-height: 1; padding: 0; color: ${darkMode ? "#e0e0e0" : "#333"}; z-index: 1000; display: flex; align-items: center; justify-content: center; transition: all 0.2s; box-shadow: 0 2px 6px ${darkMode ? "rgba(255, 255, 255, 0.2)" : "rgba(0, 0, 0, 0.2)"}; `; resetBtn.onmouseover = () => { resetBtn.style.opacity = "100%"; resetBtn.style.background = darkMode ? "rgba(60, 60, 60, 1)" : "rgba(255, 255, 255, 1)"; resetBtn.style.boxShadow = darkMode ? "0 3px 10px rgba(255, 255, 255, 0.2)" : "0 3px 10px rgba(0, 0, 0, 0.3)"; resetBtn.style.transform = "scale(1.1)"; }; resetBtn.onmouseout = () => { resetBtn.style.opacity = ""; resetBtn.style.background = darkMode ? "rgba(50, 50, 50, 0.95)" : "rgba(255, 255, 255, 0.95)"; resetBtn.style.boxShadow = darkMode ? "0 2px 6px rgba(255, 255, 255, 0.2)" : "0 2px 6px rgba(0, 0, 0, 0.2)"; resetBtn.style.transform = ""; }; resetBtn.onclick = () => { const gElement = svg.querySelector("g"); if (gElement) { gElement.removeAttribute("transform"); const zoom = svg.__zoom; if (zoom) { zoom.k = 1; zoom.x = 0; zoom.y = 0; } } }; diagram.style.position = "relative"; diagram.appendChild(resetBtn); }); }; setTimeout(addResetButtons, 100); const observer = new MutationObserver(() => setTimeout(addResetButtons, 100)); observer.observe(document.body, { childList: true, subtree: true }); }); tox-dev-tox-1f1fcc7/docs/changelog.rst000066400000000000000000003576341520067562700200510ustar00rootroot00000000000000################# Release History ################# .. towncrier-draft-entries:: .. towncrier release notes start ********************** v4.54.0 (2026-05-12) ********************** Features - 4.54.0 ================= - Declare the runtime dependencies of the ``tox.pytest`` plugin (``pytest``, ``devpi-process`` and ``pytest-mock``) under a new ``testing`` extra, so plugin authors can pull them in via ``tox[testing]`` - by :user:`gaborbernat`. (:issue:`3938`, :issue:`3940`) Bug fixes - 4.54.0 ================== - Extend the generated TOML schema to cover every ``replace`` table form (``env``, ``ref``, ``posargs``, ``glob``, ``if``), including conditional replacements used inside ``commands``. A guard test asserts the schema stays in sync with the loader implementation so future replace types cannot be added without a corresponding schema entry. (:issue:`3939`) ********************** v4.53.1 (2026-05-02) ********************** Bug fixes - 4.53.1 ================== - Hardening pass on user-facing logging and config parsing: - Mask secret-looking ``--key=value`` flag values in command logs (terminal warnings, ``.tox//log/*.log``, and ``Outcome`` ``__repr__``) using the same keyword regex previously applied to environment variable values. - Resolve PEP 723 ``script`` paths and reject any that escape ``tox_root``; cap the script read at 5 MiB so a symlink to ``/dev/zero`` cannot exhaust memory. - Replace ``eval()`` of a constructed ``Literal[...]`` string in the CLI parser with a direct ``Literal[tuple(action.choices)]`` subscript. - Pass ``timeout=30`` to ``urlopen`` when fetching a remote requirements file so a slow or unresponsive mirror cannot hang ``tox`` indefinitely. (:issue:`3924`) - Allow the generated TOML schema to validate array values for ``deps``. (:issue:`3929`) - Correct type annotations for ``ArgumentParser.parse_args`` and ``parse_known_args`` overrides following `typeshed PR #15613 `_, which widened the ``args`` parameter from ``Sequence[str]`` to ``Iterable[str]``. The narrower type in tox's overrides violated the Liskov substitution principle and caused ``invalid-method-override`` errors with ``ty`` 0.0.33. Also correct the ``option_spec`` annotation in ``docs/tox_conf.py`` to ``ClassVar[dict[str, Callable[[str], Any]]]`` matching the docutils stubs type. (:issue:`3932`) ********************** v4.53.0 (2026-04-14) ********************** Features - 4.53.0 ================= - TOML ``env_list`` now accepts bare range dicts (``{ prefix = "3.", start = 12, stop = 14 }``) and bare labeled dicts (``{ ecosystem = ["oci", "python"] }``) as top-level items, removing the ``{ product = [...] }`` wrapper when there is only a single factor group - by :user:`gaborbernat`. (:issue:`3923`) Bug fixes - 4.53.0 ================== - Nesting a range or labeled dict inside a ``product`` factor-group list now raises a clear error pointing at the un-nesting fix, instead of silently producing a malformed environment name - by :user:`gaborbernat`. (:issue:`3923`) ********************** v4.52.1 (2026-04-09) ********************** Bug fixes - 4.52.1 ================== - Changing a resolution-affecting environment variable via ``set_env`` (e.g. ``PIP_INDEX_URL``) now invalidates the install cache and triggers a reinstall, rather than incorrectly reusing the cached environment - by :user:`gaborbernat`. (:issue:`3917`) - Use ``normalize_isa`` from ``python-discovery`` for architecture factor matching, supporting aliases like ``i686`` → ``x86`` and ``aarch64`` → ``arm64`` - by :user:`rahuldevikar`. (:issue:`3919`) ********************** v4.52.0 (2026-03-30) ********************** Features - 4.52.0 ================= - Add ``virtualenv-pep-723`` runner that reads dependencies and Python version from :PEP:`723` inline script metadata — no need to duplicate them in tox config - by :user:`gaborbernat`. (:issue:`3897`) - Support escaped dots (``\.``) in ``-x``/``--override`` keys, allowing overrides to target environments with dots in their names such as ``py3.14`` - by :user:`gaborbernat`. (:issue:`3910`) Bug fixes - 4.52.0 ================== - Auto-generate the manpage from the CLI argparse parser at wheel build time, fixing broken section headers and documenting all commands and options - by :user:`gaborbernat`. (:issue:`3878`) Miscellaneous internal changes - 4.52.0 ======================================= - Remove unsupported ``--remote`` flag from ``gh repo fork`` in the update-schemastore workflow, as recent versions of ``gh`` no longer accept it - by :user:`rahuldevikar`. (:issue:`3908`) ********************** v4.51.0 (2026-03-27) ********************** Features - 4.51.0 ================= - Add ``base_python_file`` configuration option to read the base Python version from a file (e.g. ``.python-version``), similar to GitHub Actions' ``python-version-file`` - by :user:`rahuldevikar` (:issue:`3894`) Bug fixes - 4.51.0 ================== - Prevent implicit machine ISA (e.g. ``arm64``, ``x86_64``) from overriding explicit architecture factors in environment names, fixing cross-architecture conflicts in multiline factor conditionals - by :user:`rahuldevikar`. (:issue:`3903`) - Nested environment list configuration values are now properly parsed, validated and expanded by the TOML parser. This allows you to use generative environment lists in ``tox-gh`` via the TOML format. Previously this was only possible with the INI format. - by :user:`Daverball` (:issue:`3905`) Miscellaneous internal changes - 4.51.0 ======================================= - Enable ``persist-credentials: true`` in the ``actions/checkout`` step of the prepare-release workflow so that git push operations succeed during automated releases - by :user:`rahuldevikar`. (:issue:`3907`) ********************** v4.50.3 (2026-03-20) ********************** Bug fixes - 4.50.3 ================== - Use separate ``.pkg`` environments for free-threaded Python targets by including the ``t`` suffix in the wheel build environment name (e.g., ``.pkg-cpython314t``), preventing wheel tag mismatches when building for ``py314t`` - by :user:`gaborbernat`. (:issue:`3314`) ********************** v4.50.2 (2026-03-19) ********************** Bug fixes - 4.50.2 ================== - Fix the sdist to include the missing ``docs/man/tox.1.rst`` file for building the manpage (:issue:`3889`) ********************** v4.50.1 (2026-03-19) ********************** Bug fixes - 4.50.1 ================== - Detect and suggest normalized environment names when users specify dotted Python versions (e.g., ``py3.10-lint``) that match existing environments with compact notation (e.g., ``py310-lint``), preventing silent fallback to base ``[testenv]`` configuration - by :user:`gaborbernat`. (:issue:`3877`) ********************** v4.50.0 (2026-03-17) ********************** Features - 4.50.0 ================= - Add ``interrupt_post_commands`` option to run cleanup commands even after SIGINT - by :user:`gaborbernat`. (:issue:`3858`) - Add ``factor['NAME']`` and ``env['VAR']`` subscript syntax for conditional expressions, enabling checks of factors with non-identifier names like ``factor['3.14']``. Add ``env_name`` variable to check the full environment name in conditions. (:issue:`3880`) Bug fixes - 4.50.0 ================== - Fix multiple manpage issues: remove duplicate header/author/copyright sections, set ``project`` in Sphinx config, and compile the manpage to troff format at wheel-build time instead of shipping raw RST source - by :user:`gaborbernat`. (:issue:`3878`) Improved documentation - 4.50.0 =============================== - Document how to reference the built package path in commands via ``TOX_PACKAGE`` - by :user:`rahuldevikar` (:issue:`3862`) - Fix broken TOML examples missing ``extend = true`` on conditional replacements inside lists, fix incorrect ``ref of`` path in raw reference docs, and add a test that validates all doc config examples - by :user:`gaborbernat` (:issue:`3875`) ********************** v4.49.1 (2026-03-09) ********************** Bug fixes - 4.49.1 ================== - Break deadlock in execution interrupt chain that caused ~18 flaky timeout failures across 9 tests on Windows/macOS CI - by :user:`gaborbernat`. (:issue:`3869`) ********************** v4.49.0 (2026-03-06) ********************** Features - 4.49.0 ================= - Add ``{factor:label}`` substitution for TOML configs -- factor groups in ``product`` matrices and ``env_base`` factors can now be labeled with single-key dicts (e.g., ``{ecosystem = ["oci", "python"]}``), enabling ``{factor:ecosystem}`` in any string value (descriptions, commands, etc.) to resolve to the active factor. Plain lists automatically get positional labels (``{factor:0}``, ``{factor:1}``, ...) - by :user:`gaborbernat`. (:issue:`3860`) (:issue:`3860`) Bug fixes - 4.49.0 ================== - Fix ``--showconfig`` and ``--help-ini`` legacy flags raising ``AttributeError`` after config format options were added - by :user:`rares985` (:issue:`3866`) ********************** v4.48.1 (2026-03-06) ********************** Bug fixes - 4.48.1 ================== - Command-type configuration values like ``list_dependencies_command`` can now be referenced in TOML using the structured ``{replace = "ref"}`` syntax. The reference automatically extracts the command's argument list for compatibility with TOML's ``list[list[str]]`` structure - by :user:`gaborbernat`. (:issue:`3830`) Improved documentation - 4.48.1 =============================== - Replace archived ``31z4/tox`` Docker image recommendation with instructions for building your own image using the official Python base image and ``uv`` - by :user:`rahuldevikar`. (:issue:`3855`) ********************** v4.48.0 (2026-03-05) ********************** Features - 4.48.0 ================= - Add ``--format`` flag (``ini``, ``json``, ``toml``) and ``-o``/``--output-file`` to the ``config`` command for machine-readable output with native types. JSON and TOML use the same key structure as ``tox.toml`` (``env.`` for environments, ``tox`` for core) and get syntax-highlighted on stdout - by :user:`gaborbernat`. (:issue:`3854`) Improved documentation - 4.48.0 =============================== - Add ``fail_fast`` to the configuration reference documentation - by :user:`rahuldevikar`. (:issue:`578`) ********************** v4.47.3 (2026-03-04) ********************** Bug fixes - 4.47.3 ================== - ``ignore_base_python_conflict`` now also suppresses errors when an environment name contains multiple conflicting version-like factors (e.g., ``unit-py3.10-2.16`` where both ``py3.10`` and ``2.16`` are detected as Python versions). Previously this flag only handled conflicts between explicit ``base_python`` settings and the environment name - by :user:`gaborbernat`. (:issue:`3850`) ********************** v4.47.2 (2026-03-03) ********************** Bug fixes - 4.47.2 ================== - Handle ``OSError`` when checking if positional arguments are existing paths in ``pos_args()`` — long arguments (e.g., pytest ``-k`` expressions exceeding the 255-character filesystem name limit) no longer crash with ``OSError: [Errno 36] File name too long`` - by :user:`yarikoptic`. (:issue:`3847`) ********************** v4.47.1 (2026-03-03) ********************** Bug fixes - 4.47.1 ================== - New-style version factors (e.g., ``3.10-tests``) now correctly set ``base_python`` - by :user:`gaborbernat`. (:issue:`3845`) ********************** v4.47.0 (2026-03-01) ********************** Features - 4.47.0 ================= - Show clean error messages instead of stack traces when TOML configuration contains type mismatches (e.g., ``deps = [1]``), wrapping failures in ``HandledError`` with environment and key context - by :user:`gaborbernat`. (:issue:`3831`) - Add comprehensive tests asserting full error messages for every configurable field type when TOML config contains type mismatches - by :user:`gaborbernat`. (:issue:`3840`) Bug fixes - 4.47.0 ================== - Fix type errors flagged by ``ty`` for ``virtualenv`` API changes (``system_executable`` nullability and ``cached_py_info.PythonInfo`` removal), and correct the CI workflow matrix exclude for ``windows-2025`` - by :user:`gaborbernat`. (:issue:`3837`) - ``base_python`` and ``default_base_python`` now accept a string value in TOML configuration (e.g., ``base_python = "python"`` is coerced to ``["python"]``) instead of raising ``TypeError`` - by :user:`gaborbernat`. (:issue:`3839`) - Pass stdin through to commands executed via ``tox exec`` so that piped input (e.g., ``echo "foo" | tox exec -- python -c 'import sys; print(sys.stdin.read())'``) reaches the subprocess instead of being discarded - by :user:`gaborbernat`. (:issue:`3841`) ********************** v4.46.3 (2026-02-25) ********************** Bug fixes - 4.46.3 ================== - Fix SchemaStore update workflow creating PRs with merge conflicts by branching from upstream master - by :user:`gaborbernat`. (:issue:`3828`) - Fixed the minimum version of virtualenv, to avoid incompatibility. (:issue:`3829`) ********************** v4.46.2 (2026-02-25) ********************** Bug fixes - 4.46.2 ================== - Fix SchemaStore update workflow authentication and PR creation for fork repositories - by :user:`gaborbernat`. (:issue:`3826`) ********************** v4.46.1 (2026-02-25) ********************** Bug fixes - 4.46.1 ================== - Allow glob patterns (``*``, ``?``) in ``depends`` configuration for ini files - by :user:`gaborbernat`. (:issue:`3822`) - Fix false positive schema validation errors with tombi by adding ``additionalProperties: true`` to ``partial-tox.json`` on SchemaStore - by :user:`gaborbernat`. (:issue:`3823`) ********************** v4.46.0 (2026-02-24) ********************** Features - 4.46.0 ================= - Add architecture (ISA) awareness to Python discovery. tox now propagates the ``machine`` field (e.g. ``arm64``, ``x86_64``) from :pypi:`virtualenv`'s interpreter info — derived from :func:`python:sysconfig.get_platform` — through the Python specification, validation, and journal. This allows selecting a Python interpreter by CPU architecture via :ref:`base_python` (e.g. ``cpython3.12-64-arm64``) and ensures tox validates the running interpreter's architecture matches the requested one. Requires ``virtualenv >= 20.39`` - by :user:`rahuldevikar`. (:issue:`3069`) - Add ``env_base`` TOML sections for named environment templates that generate multiple environments from factor combinations via Cartesian product -- by :user:`gaborbernat`. (:issue:`3817`) Bug fixes - 4.46.0 ================== - Drop ``chardet`` dependency and use BOM detection with locale fallback for requirements file decoding, matching pip's own approach - by :user:`gaborbernat`. (:issue:`3818`) - Allow ``--help`` to render even when the configuration file is malformed or missing - by :user:`gaborbernat`. (:issue:`3819`) ********************** v4.45.0 (2026-02-23) ********************** Features - 4.45.0 ================= - Enhance ``tox schema`` command: add ``x-taplo`` metadata for IDE integration, product dict support for ``env_list``, handle ``int`` and ``PythonConstraints`` types, fix ``$schema`` draft-07 URI, and add schema freshness test. Add ``tox.toml`` to SchemaStore catalog for automatic IDE validation - by :user:`gaborbernat`. (:issue:`1388`) Bug fixes - 4.45.0 ================== - Add redirects for old documentation URLs that broke after the Diataxis restructure (e.g. ``/config.html`` -> ``/reference/config.html``, ``/example/general.html`` -> ``/index.html``) using ``sphinx-reredirects`` - by :user:`gaborbernat`. (:issue:`3806`) - Fix cross-section substitution ``{[section]key}`` resolving to a literal unresolved reference instead of empty string when the referenced value contains only factor-conditional lines and no factors match the requesting environment - by :user:`Fridayai700`. (:issue:`3809`) - Fix circular dependency in ``environment_variables`` when ``set_env`` references ``{env_site_packages_dir}`` or similar lazy constants, causing ``RecursionError`` silently caught as "could not find python interpreter" - by :user:`gaborbernat`. (:issue:`3816`) ********************** v4.44.0 (2026-02-20) ********************** Features - 4.44.0 ================= - Support PEP 751 ``pylock.toml`` lock files as dependency input via the ``pylock`` configuration option (mutually exclusive with ``deps``). Packages are filtered by extras, dependency groups, and platform markers evaluated against the target Python interpreter, then installed via pip with ``--no-deps`` - by :user:`gaborbernat`. (:issue:`3665`) Bug fixes - 4.44.0 ================== - Fix unfactored continuation lines (e.g. ``pytest \``, ``--remote-data \``) being incorrectly skipped when they follow a filtered factor-conditional line ending with ``\`` -- the ``pending_skip`` flag now only drops terminal continuation pieces, preserving shared arguments that are themselves continuations - by :user:`gaborbernat`. (:issue:`3802`) ********************** v4.43.0 (2026-02-20) ********************** Features - 4.43.0 ================= - Add TOML-native generative ``env_list`` via ``product`` dict syntax -- Cartesian product of factor groups with optional range dicts and exclusions - by :user:`gaborbernat`. (:issue:`3797`) Bug fixes - 4.43.0 ================== - Pass ``config_settings_build_wheel`` to pip as ``--config-settings`` when installing sdist packages, ensuring the build backend receives config settings during pip's internal wheel build - by :user:`gaborbernat`. (:issue:`3125`) - Fix factor-conditional continuation lines (e.g. ``cov: coverage run \`` / ``!cov: python \`` / ``somefile.py``) where different factor prefixes on consecutive continuation lines caused prefixes to be passed as literal command arguments instead of being filtered - by :user:`gaborbernat`. (:issue:`3796`) Improved documentation - 4.43.0 =============================== - Integrate ``sphinxcontrib-towncrier`` to render draft changelog entries directly in Sphinx, replacing the manual towncrier draft script - by :user:`gaborbernat`. (:issue:`3201`) ********************** v4.42.0 (2026-02-20) ********************** Features - 4.42.0 ================= - Platform-dependent commands can now be specified using factor syntax without requiring the platform name in the environment name. The current platform (``sys.platform`` value like ``linux``, ``darwin``, ``win32``) is automatically available as an implicit factor, allowing configurations like ``linux: pytest`` in INI or ``factor.linux`` in TOML conditional expressions to work in any environment. Additionally, TOML configurations can now use ``factor.NAME`` in conditional expressions to filter settings based on environment name factors, achieving feature parity with INI's factor system - by :user:`gaborbernat`. (:issue:`2092`) - Add ``{env_site_packages_dir_plat}`` / ``{envsitepackagesdir_plat}`` substitution that returns the platform-specific (platlib) site-packages directory. On some Linux distributions (Fedora, RHEL) this resolves to ``lib64`` instead of ``lib``, which is no longer symlinked since virtualenv 20.x - by :user:`gaborbernat`. (:issue:`2302`) - External packaging environments (``package = external``) now only run their build commands once per session, reusing the built package for all test environments that depend on them - by :user:`gaborbernat`. (:issue:`2729`) - Add ``default_base_python`` configuration key to specify a fallback Python interpreter when no Python factor or explicit ``base_python`` is defined. This allows projects to pin a default Python version for reproducibility across different machines without conflicting with ``pyXY`` factor-named environments - by :user:`gaborbernat`. (:issue:`2846`) - CLI options added by plugins listed in ``requires`` are now accepted during provisioning instead of failing with "unrecognized arguments" - by :user:`gaborbernat`. (:issue:`2935`) - Warn about unused configuration keys during ``tox run -v`` - by :user:`gaborbernat`. (:issue:`3188`) - Improve towncrier changelog structure with more granular categories: ``breaking``, ``deprecation``, ``feature``, ``bugfix``, ``doc``, ``packaging``, ``contrib``, and ``misc`` - by :user:`gaborbernat`. (:issue:`3200`) - Add ``--skip-env-install`` CLI flag to skip dependency and package installation, allowing reuse of existing environments when offline or when installation is unnecessary - by :user:`gaborbernat`. (:issue:`3310`) - Add ``recreate_commands`` configuration option to run cleanup commands (e.g. clearing external caches like pre-commit) before the environment directory is removed during recreation (``-r``) - by :user:`gaborbernat`. (:issue:`3423`) - Environments with unavailable runners (missing plugins) are now gracefully skipped instead of causing a fatal error, shown with status "NOT AVAILABLE". If such an environment is explicitly requested with ``-e``, a clear error message is shown indicating which runner is missing and that the plugin may not be installed. Unavailable environments in the configuration don't cause the overall run to fail - by :user:`gaborbernat`. (:issue:`3504`) - Add open-ended range expansion in generative env lists — ``py3{9-}`` expands up to the latest supported CPython minor version and ``py3{-13}`` expands down to the oldest supported one, both hardcoded at release time per the `Python release cycle `_ - by :user:`gaborbernat`. (:issue:`3583`) - Add ``--no-capture`` (``-i``) CLI flag to disable output capture, allowing interactive programs like Python REPL to access the terminal directly. When enabled, subprocess inherits parent console handles instead of pipes, fixing issues where terminal APIs (e.g., querying console dimensions) fail on pipe handles. Mutually exclusive with ``--result-json`` and parallel mode - by :user:`gaborjbernat`. Fixes :issue:`3635`. (:issue:`3635`) - Add ``virtualenv_spec`` configuration key that allows pinning a specific virtualenv version per environment (e.g. ``virtualenv_spec = "virtualenv<20.22.0"``). When set, tox bootstraps the specified version in an isolated environment and drives it via subprocess, enabling environments targeting Python versions incompatible with the installed virtualenv - by :user:`gaborbernat`. (:issue:`3656`) Bug fixes - 4.42.0 ================== - Suppress ``BrokenPipeError`` during backend teardown when interrupted, preventing traceback spam during KeyboardInterrupt - by :user:`gaborjbernat`. Fixes :issue:`2660`. (:issue:`2660`) - Factor-specific multiline commands using backslash continuation (``\``) no longer leak continuation lines into environments that don't match the factor - by :user:`gaborbernat`. (:issue:`2912`) - ``--list-dependencies`` output is now printed to stdout during parallel runs. Previously, the dependency list was captured in suspended output buffers and only shown on failure - by :user:`gaborbernat`. (:issue:`3322`) - Compound factor conditionals (e.g., ``np-cov: coverage``) now correctly allow their individual factors to be used when specifying environments with ``-e``. Previously, running ``tox -e py310-np-cov`` with a factor conditional ``np-cov: coverage`` in the config would fail with "provided environments not found" because the individual factor ``cov`` was not recognized as combinable - by :user:`gaborbernat`. (:issue:`3780`) Improved documentation - 4.42.0 =============================== - Document Debian/Ubuntu ``python3-venv`` limitation in known limitations - by :user:`gaborbernat`. (:issue:`3195`) ********************** v4.41.0 (2026-02-19) ********************** Features - 4.41.0 ================= - Add ``package = "deps-only"`` mode that installs the package's dependencies (including extras) without building or installing the package itself. For projects with static :PEP:`621` metadata, dependencies are read directly from ``pyproject.toml`` without creating a packaging environment - by :user:`gaborbernat`. (:issue:`2301`) - Prefer TOML-native configuration (``[tool.tox]``) over ``legacy_tox_ini`` when both are present in ``pyproject.toml``, allowing users to include a ``legacy_tox_ini`` section with ``min_version`` for older tox versions while using native TOML config for newer ones - by :user:`rahuldevikar`. (:issue:`3402`) Bugfixes - 4.41.0 ================= - Fix PEP 517 backend crash detection to handle both ``ENOENT`` (missing interpreter) and runtime crashes without hanging, and fix flaky ``test_provision_install_pkg_pep517`` integration test by using a pre-built wheel instead of an sdist to avoid devpi mirror dependency on setuptools - by :user:`gaborjbernat`. (:issue:`3774`) ********************** v4.40.0 (2026-02-19) ********************** Features - 4.40.0 ================= - Add ``{glob:PATTERN}`` substitution to expand file system glob/wildcard patterns in configuration values. Supports default values, recursive ``**`` matching, and both INI string syntax and TOML dict syntax (``{ replace = "glob", pattern = "..." }``) - by :user:`gaborbernat`. (:issue:`1571`) - Add ``commands_retry`` configuration option to automatically retry failed commands - by :user:`gaborbernat`. (:issue:`1578`) - Automatically create a ``.gitignore`` file containing ``*`` in the tox work directory (typically ``.tox/``) and in environment info directories, so that tox-managed files are not tracked by git - by :user:`rahuldevikar`. (:issue:`2530`) - Add conditional value selection via ``replace = "if"`` in TOML configuration. Supports a ``condition`` expression with ``env.VAR`` lookups, ``==``/``!=`` comparisons, and ``and``/``or``/``not`` boolean logic to select between ``then`` and ``else`` values - by :user:`gaborbernat`. (:issue:`3650`) - Add ``sdist-wheel`` package type that builds a wheel from a source distribution, ensuring the sdist is complete and the package can be correctly built from it — by :user:`rahuldevikar`. (:issue:`3687`) Bugfixes - 4.40.0 ================= - Use positive exit code (``1``) instead of ``-1`` when reporting failures across multiple environments. On Windows, ``cmd.exe``'s ``IF ERRORLEVEL 1`` only matches exit codes ``>= 1``, so the previous negative exit code was silently treated as success - by :user:`radevika`. Fixes :issue:`2945`. (:issue:`2945`) - When ``set_env`` both inherits via cross-section substitution (e.g., ``{[testenv]set_env}``) and explicitly overrides the same variable, the explicit value was incorrectly replaced by the inherited one because ``load()`` moved the key from the raw dict to the materialized dict before the deferred substitution ran, making the protection check ineffective - by :user:`gaborjbernat`. Fixes :issue:`3773`. (:issue:`3773`) ********************** v4.39.0 (2026-02-18) ********************** Features - 4.39.0 ================= - Create a ``CACHEDIR.TAG`` file in the tox work directory (``.tox``) so that backup and archiving tools (e.g., ``tar --exclude-caches``, Borg, restic) can automatically skip it - by :user:`radevika`. (:issue:`3334`) Bugfixes - 4.39.0 ================= - On Windows, ANSI color codes from child processes (like pytest, mypy) are now rendered correctly in terminals by enabling VT100 processing mode for subprocess output streams - by :user:`gaborbernat`. (:issue:`2337`) - Concurrent tox processes no longer corrupt the provision environment (``.tox``) -- a file lock now serializes provisioning across processes - by :user:`gaborbernat`. (:issue:`2515`) - Config files (``tox.ini``, ``setup.cfg``) with unicode characters are now read correctly on Windows when running tox with ``python -m -I`` (isolation mode) - by :user:`gaborbernat`. (:issue:`2692`) - ``set_env`` values explicitly defined in a section now take precedence over values inherited via cross-section substitution (e.g., ``{[testenv]set_env}``) - by :user:`gaborbernat`. (:issue:`2831`) - The ``-e`` flag now supports brace expansion (e.g. ``tox -e 'py{38,39}-pytest{6.x,7.x}'``) instead of incorrectly splitting on commas inside braces - by :user:`gaborbernat`. (:issue:`2850`) - Posargs containing colons no longer crash tox when an inactive environment uses ``{posargs}`` in path-like configuration values such as ``env_dir`` - by :user:`gaborbernat`. (:issue:`2860`) - ``set_env`` values from cross-section substitution (e.g., ``{[testenv]set_env}``) now correctly override default environment variables like ``PYTHONHASHSEED`` - by :user:`gaborbernat`. (:issue:`2872`) - ``--force-dep`` now applies to package dependencies from project metadata (e.g. ``setup.cfg`` ``install_requires``, ``pyproject.toml`` ``dependencies``), not just tox config ``deps`` - by :user:`gaborbernat`. (:issue:`2943`) - Using ``{posargs}`` in ``change_dir`` no longer causes a ``RecursionError`` - by :user:`gaborbernat`. (:issue:`3062`) - Cross-section substitution (e.g. ``{[testenv:a]commands}``) now resolves environment-specific variables like ``{envpython}``, ``{envbindir}``, ``{envtmpdir}``, and ``{envsitepackagesdir}`` in the calling environment's context rather than the referenced environment's context - by :user:`gaborbernat`. (:issue:`3075`) - Fix ``ValueError`` crash when using posargs on Windows with ``subst`` drive mappings -- ``os.path.relpath`` fails across drive letters, so fall back to absolute paths when the relative path cannot be computed - by :user:`gaborbernat`. (:issue:`3086`) - ``TOX_OVERRIDE`` with ``+=`` (append) now works correctly when the override key name differs from the config file key name (e.g., overriding ``pass_env`` when config uses ``passenv``, or vice versa) - by :user:`gaborbernat`. (:issue:`3127`) - Fix spurious environment discovery from non-tox sections in ``setup.cfg`` -- ``packages = find:`` in ``[options]`` was incorrectly interpreted as a tox factor marker, creating a phantom ``find`` environment - by :user:`gaborbernat`. (:issue:`3134`) - Requirements in ``requires`` with environment markers that evaluate to false (e.g. ``virtualenv<20.22.0; python_version < "3.8"``) are now correctly skipped during provisioning instead of causing an infinite provisioning loop - by :user:`gaborbernat`. (:issue:`3136`) - Running environments with ``recreate = true`` no longer destroys shared package environments (e.g. ``.pkg``), which previously caused ``FileNotFoundError`` when a subsequent environment tried to use the already-built wheel - by :user:`gaborbernat`. (:issue:`3146`) - Factor-conditional config values (e.g. ``base_python = py312: python3.12``) now correctly fall back to the default when no factors match the current environment, instead of producing an empty value - by :user:`gaborbernat`. (:issue:`3189`) - ``TOX_PARALLEL_NO_SPINNER`` / ``--parallel-no-spinner`` no longer forces parallel mode in the legacy command, fixing output suppression for sequential runs in CI - by :user:`gaborbernat`. (:issue:`3193`) - Multiple ``-e`` flags are now additive (``tox r -e a -e b`` runs both ``a`` and ``b``), matching tox 3 behavior - by :user:`gaborbernat`. (:issue:`3199`) - Environments like ``functional-py312`` no longer incorrectly match when only ``functional{-py310}`` is defined as a testenv section -- factors from section headers are no longer treated as freely combinable with CLI ``-e`` selections - by :user:`gaborbernat`. (:issue:`3219`) - On Windows, a trailing path separator (e.g. from ``{/}``) no longer causes the next command argument to be merged into the path - backslash before whitespace is now treated as a literal path separator rather than a space escape - by :user:`gaborbernat`. (:issue:`3222`) - Fix ``{envtmpdir}`` and other env variable substitutions not expanding in external package environment commands - by :user:`gaborbernat`. (:issue:`3238`) (:issue:`3238`) - On Windows, colored output is now preserved when running provisioned tox by explicitly passing the ``--colored yes`` flag to the provisioned subprocess when the parent has colors enabled - by :user:`gaborbernat`. (:issue:`3331`) - ``set_env`` values defined after a ``file|`` reference now correctly take precedence over values loaded from the env file - by :user:`gaborbernat`. (:issue:`3335`) - The ``base`` configuration key now works correctly in TOML format (``tox.toml`` and ``pyproject.toml``), allowing environments to inherit from arbitrary sections defined under ``[env.*]`` - by :user:`gaborbernat`. (:issue:`3497`) - Skip ``toxfile.py`` inline plugin when it uses hooks not available in the current tox version instead of crashing - this allows provisioning to upgrade tox to a version that supports those hooks - by :user:`gaborbernat`. (:issue:`3593`) - ``set_env`` substitution referencing ``{envsitepackagesdir}``, ``{envbindir}``, or ``{envpython}`` for environments with missing interpreters now raises ``Skip`` instead of ``RuntimeError``, allowing ``skip_missing_interpreters`` to work correctly - by :user:`gaborbernat`. (:issue:`3597`) - A ``setup.cfg`` without a ``[tox:tox]`` section no longer blocks discovery of ``pyproject.toml`` or ``tox.toml`` configuration files in the same directory - by :user:`gaborbernat`. (:issue:`3602`) - Fix pytest ``INTERNALERROR`` on Python 3.15 caused by Pygments using deprecated ``os.path.commonprefix()`` - by :user:`gaborbernat`. (:issue:`3733`) - Fix ``RecursionError`` when TOML ``set_env`` contains substitutions like ``{env_site_packages_dir}`` that trigger config loading cycles -- the TOML loader now defers string substitution in ``set_env`` values, matching the INI loader's lazy resolution behavior - by :user:`gaborbernat`. (:issue:`3758`) Documentation - 4.39.0 ====================== - Document that interactive terminal programs (e.g., IPython) may not work correctly under tox due to the PTY-based output capture architecture - by :user:`gaborbernat`. (:issue:`2999`) ********************** v4.38.0 (2026-02-17) ********************** Features - 4.38.0 ================= - Scope dependency rejection in PEP-517 package environments to only pure PEP-517 build types (``sdist``, ``wheel``, ``editable``), allowing non-standard package types like ``editable-legacy`` to specify dependencies - by :user:`rahuldevikar`. (:issue:`3731`) ********************** v4.37.0 (2026-02-17) ********************** Features - 4.37.0 ================= - Add ``extra_setup_commands`` configuration option to run commands after dependency and package installation but before test commands, useful with ``--notest`` for separating setup from execution - by :user:`gaborbernat`. (:issue:`1504`) Bugfixes - 4.37.0 ================= - Set ``PIP_USER=0`` environment variable when running pip commands in virtualenvs to prevent pip from attempting ``--user`` installs when users have ``pip config --user`` configured globally — by :user:`gaborbernat`. (:issue:`3010`) - Fix TOML env_run_base and env_pkg_base deps being clobbered when referenced with additional deps in testenv configuration (:issue:`3393`) - Normalize extra names when resolving dependencies so that underscores and hyphens are treated equivalently (e.g. ``extras = snake_case`` now matches ``Provides-Extra: snake-case`` in wheel metadata) - by :user:`Fridayai700`. (:issue:`3433`) - Fix ``setenv`` modifications to ``PATH`` being overwritten when tox environment paths are set up - by :user:`Fridayai700` (:issue:`3445`) - Fix ``deps`` entries with ``~=`` version specifier being incorrectly treated as local paths instead of being passed through to pip - by :user:`Fridayai700`. (:issue:`3447`) - Fix factor selection via ``TOX_FACTORS`` environment variable producing wrong results because ``append`` + ``nargs="+"`` actions need nested list types for proper env var conversion - by :user:`Fridayai700`. (:issue:`3557`) - Fix custom ``install_command`` being ignored when specified in TOML configuration (``tox.toml``/``pyproject.toml``) - by :user:`Fridayai700`. (:issue:`3574`) - Fix env names containing dots (e.g. ``py3.11``) losing their description in TOML configuration - by :user:`Fridayai700`. (:issue:`3590`) - Run pre-commit on changelog.rst after towncrier build to ensure proper formatting before committing the release (:issue:`3717`) - Fix type checker CI failure by adding ``completion`` extras to ``type`` and ``type-min`` environments so ``ty`` can resolve the ``argcomplete`` import - by :user:`gaborbernat`. (:issue:`3728`) Documentation - 4.37.0 ====================== - Restructured documentation using the Diátaxis framework to separate Tutorial, How-to guides, Reference, and Explanation content for better discoverability and user experience. (:issue:`3718`) ********************** v4.36.1 (2026-02-17) ********************** Bugfixes - 4.36.1 ================= - Report TOML parse errors during config discovery instead of silently ignoring them - by :user:`rahuldevikar`. (:issue:`3030`) - Adopt CPython's subprocess stream handling to fix deadlocks and improve performance when reading subprocess output (:issue:`3715`) Documentation - 4.36.1 ====================== - Add Unix man page generation and installation support using sphinx-argparse-cli - by :user:`gaborbernat`. (:issue:`1409`) - Document use of Python :mod:`logging` for plugin authors in the how-to guides, covering verbosity levels, coloring, and best practices — by :user:`rahuldevikar`. (:issue:`3449`) - Add architecture documentation for new contributors under the development section - by :user:`rahuldevikar` (:issue:`3707`) ********************** v4.36.0 (2026-02-15) ********************** Features - 4.36.0 ================= - Allow ``skip_missing_interpreters`` to be set per environment, overriding the global setting. This enables marking specific environments as optional while keeping others required. (:issue:`435`) - Add ``--fail-fast`` CLI flag and ``fail_fast`` per-environment config option to stop executing remaining environments when the first failure occurs - by :user:`gaborbernat`. (:issue:`578`) - Add shell completion support for bash, zsh, and fish via :pypi:`argcomplete` - by :user:`gaborbernat` (:issue:`918`) - Validate that configured extras exist in package metadata, raising a clear error for unknown extras - by :user:`gaborbernat` (:issue:`1113`) - Add glob pattern support in ``depends`` (e.g. ``depends = py3*``) to match environments by wildcard instead of listing them explicitly - by :user:`gaborbernat` (:issue:`1152`) - Add ``disallow_pass_env`` configuration option to exclude specific environment variables after ``pass_env`` glob expansion - by :user:`gaborbernat` (:issue:`1387`) - Support ``file:`` URIs in ``--installpkg`` (e.g. ``--installpkg file:///path/to/pkg.whl``), including proper handling of percent-encoded characters - by :user:`rahuldevikar`. (:issue:`3498`) Bugfixes - 4.36.0 ================= - Raise an error when ``deps`` is configured on a PEP-517 packaging environment (e.g. ``.pkg``), since build dependencies should be specified via the ``[build-system]`` table in ``pyproject.toml`` - by :user:`rahuldevikar` (:issue:`3412`) - Follow `FORCE_COLOR `_ recommendations: any non-empty value now enables color (previously only ``yes``, ``true``, or ``1`` were accepted, and other values caused a crash). Also add support for ``TTY_COMPATIBLE`` (``1`` forces color, ``0`` disables it) — by :user:`rahuldevikar`. (:issue:`3579`) - Return non-zero exit code from tox config when configuration exceptions occur. (:issue:`3649`) - Fix flaky spinner test assertion caused by timing variations on slower systems. (:issue:`3692`) Documentation - 4.36.0 ====================== - Document how to provide environments via ``toxfile.py`` inline plugins using ``tox_extend_envs`` and ``MemoryLoader`` - by :user:`gaborbernat`. (:issue:`828`) - Document shell completion setup for bash, zsh, and fish in the CLI reference - by :user:`gaborbernat` (:issue:`918`) - Document negative factor conditions and multi-factor combinations with negation in the INI configuration reference - by :user:`gaborbernat` (:issue:`3276`) - Add a substitution quick reference table covering all available ``{...}`` replacement variables - by :user:`gaborbernat` (:issue:`3326`) - Add TOML configuration reference with complete examples for ``tox.toml`` and ``pyproject.toml`` formats, and emphasize TOML as the recommended format throughout - by :user:`gaborbernat` (:issue:`3393`) - Document the ``tox exec`` subcommand with usage examples in the how-to guides - by :user:`gaborbernat` (:issue:`3403`) - Comprehensive documentation improvements: added how-to guides for tox exec, CI/CD, coverage, build backends, labels, migration, debugging, and extras; expanded plugin documentation with all hook examples and packaging guide; added env var handling guide, factor conditions reference, and substitution quick reference; integrated docstrfmt for consistent RST formatting; fixed docstring issues in source code - by :user:`gaborbernat` (:issue:`3475`) - Update ``development.rst`` to reflect current standards: replace references to ``flake8``/``black``/``isort``/``pyupgrade`` with ``ruff``, remove outdated Python 2.7 compatibility note, and fix CI config filename - by :user:`rahuldevikar` (:issue:`3483`) - Drop ``setup.py`` mentions from the installation page — by :user:`rahuldevikar`. (:issue:`3588`) - Restructure documentation following the `Diataxis `_ framework: add a step-by-step tutorial (``getting_started.rst``), consolidate how-to recipes (``howto.rst``), refocus the user guide on conceptual explanation, and move plugin docs into their own ``plugins/`` subdirectory. Remove the obsolete tox 3-to-4 migration guide (``upgrading.rst``) and FAQ, redistributing still-relevant content into the appropriate sections. All configuration examples now show TOML first with INI alongside - by :user:`gaborbernat` (:issue:`3702`) Miscellaneous - 4.36.0 ====================== - Switch type checker from ``mypy`` to ``ty`` - by :user:`gaborbernat`. (:issue:`3685`) - Add GitHub Actions workflow dispatch for release preparation as alternative to local ``tox r -e release`` command - by :user:`gaborbernat` (:issue:`3704`) ********************** v4.35.0 (2026-02-12) ********************** Features - 4.35.0 ================= - Show ``toxfile.py`` inline plugins in ``tox --version`` output, including any ``tox_append_version_info()`` result - by :user:`rahuldevikar`. (:issue:`3508`) Improved Documentation - 4.35.0 =============================== - Document injected environment variables (``TOX_ENV_NAME``, ``TOX_WORK_DIR``, ``TOX_ENV_DIR``, ``TOX_PACKAGE``, ``VIRTUAL_ENV``, ``PYTHONIOENCODING``, ``__TOX_ENVIRONMENT_VARIABLE_ORIGINAL_CI``) that tox automatically sets when running commands - by :user:`rahuldevikar`. (:issue:`3514`) ********************** v4.34.1 (2026-01-09) ********************** Bugfixes - 4.34.1 ================= - Fix wheel corruption errors when the build backend updates the file in place - by :user:`gaborbernat`. (:issue:`3667`) ********************** v4.34.0 (2026-01-08) ********************** Features - 4.34.0 ================= - Support installing extras from the current project in dependency groups. -- by :user:`czaki`. (:issue:`3561`) ********************** v4.33.0 (2026-01-02) ********************** Features - 4.33.0 ================= - Add support for conditional ``set_env`` using PEP-496 environment markers. In INI format use ``VAR=value; marker`` syntax, in TOML format use ``set_env.VAR = { value = "...", marker = "..." }`` -- by :user:`gaborbernat`. (:issue:`3663`) Bugfixes - 4.33.0 ================= - Added 'LocalAppData' to the default passed environment variables on Windows. (:issue:`3639`) Improved Documentation - 4.33.0 =============================== - Sphinx is now set up to use :pypi:`sphinx-issues` for referencing GitHub issues and pull requests in the docs -- by :user:`webknjaz`. (:issue:`3202`) ********************** v4.32.0 (2025-10-24) ********************** Bugfixes - 4.32.0 ================= - Expand braced range syntax in all internal sections of ``tox.ini`` (e.g. ``deps``, ``testenv``). Syntax like py3{10-14} can be used in those sections now. - by :user:`marcosboger` (:issue:`3571`) Improved Documentation - 4.32.0 =============================== - Add Python 3.14 and 3.14t to config examples - by :user:`cclauss` (:issue:`3626`) Misc - 4.32.0 ============= - :issue:`3629` ********************** v4.31.0 (2025-10-09) ********************** No significant changes. ********************** v4.30.3 (2025-10-02) ********************** Bugfixes - 4.30.3 ================= - Fix incorrect type annotation in ``PythonPathPackageWithDeps.__init__()`` where ``deps`` was annotated as ``Sequence[Package]`` but should be ``Sequence[Requirement]`` to match actual runtime usage - by :user:`PreistlyPython` (:issue:`3607`) - Fix ``None`` appearing as the config filename in error output when the user's default config file is corrupt. - by :user:`kurtmckee` (:issue:`3611`) ********************** v4.30.2 (2025-09-04) ********************** Bugfixes - 4.30.2 ================= - Previously, when tox ran in an automatically provisioned environment, it could hang waiting for a PEP 517 build backend if used in conjunction with the ``--installpkg`` option. This has been fixed by properly tearing down the automatically provisioned environment after the tests. - by :user:`vytas7` (:issue:`3600`) ********************** v4.30.1 (2025-09-03) ********************** Bugfixes - 4.30.1 ================= - Prevent tox from hanging upon exit due to orphaned build threads and subprocesses when the ``--installpkg`` option is used with *sdist*. - by :user:`vytas7` (:issue:`3530`) ********************** v4.30.0 (2025-09-03) ********************** Features - 4.30.0 ================= - Add ``__TOX_ENVIRONMENT_VARIABLE_ORIGINAL_CI``, which passes through the ``CI`` variable if present. This is intended for use by other libraries to detect if tox is running under CI. (:issue:`3442`) Bugfixes - 4.30.0 ================= - Makes the error message more clear when pyproject.toml file cannot be loaded or is missing expected keys. (:issue:`3578`) - The :func:`tox_extend_envs() hook ` recently added in :pr:`3591` turned out to not work well with ``tox run``. It was fixed internally, not to exhaust the underlying iterator on the first use. -- by :user:`webknjaz` (:issue:`3598`) ********************** v4.29.0 (2025-08-29) ********************** Features - 4.29.0 ================= - A new tox life cycle event is now exposed for use via :doc:`Plugins API ` -- by :user:`webknjaz`. The corresponding hook point is :func:`tox_extend_envs `. It allows plugin authors to declare ephemeral environments that they can then populate through the in-memory configuration loader interface. This patch was made possible thanks to pair programming with :user:`gaborbernat` at PyCon US 2025. (:issue:`3510`, :issue:`3591`) ********************** v4.28.4 (2025-07-31) ********************** Features - 4.28.4 ================= - Pass ssh-agent variables ``SSH_AGENT_PID`` and ``SSH_AUTH_SOCK`` in ``pass_env`` by default. - by :user:`daniilgankov` (:issue:`3572`) ********************** v4.28.3 (2025-07-25) ********************** No significant changes. ********************** v4.28.2 (2025-07-25) ********************** Bugfixes - 4.28.2 ================= - Don't pass in the filter argument to tar.extractall on old Python versions - by :user:`gaborbernat`. (:issue:`3568`) ********************** v4.28.1 (2025-07-22) ********************** Bugfixes - 4.28.1 ================= - Use `tarfile.data_filter `_ with ``extractall`` only on supported Python versions: - ``>= 3.11.4`` - ``>= 3.10.12`` and ``< 3.11`` - ``>= 3.9.17`` and ``< 3.10`` by :user:`gaborbernat`. (:issue:`3565`) ********************** v4.28.0 (2025-07-20) ********************** Features - 4.28.0 ================= - Added ``constraints`` to allow specifying constraints files for all dependencies. (:issue:`3550`) - Allow disabling tox plugins via the ``TOX_DISABLED_EXTERNAL_PLUGINS`` environment variable - by :user:`gaborbernat`. (:issue:`3468`) Improved Documentation - 4.28.0 =============================== - The ``min_version``/``minversion`` config option is deprecated in favor of the ``requires`` option. (:issue:`3553`) ********************** v4.27.0 (2025-06-17) ********************** Features - 4.27.0 ================= - Add ``free_threaded`` flag to to ``"python"`` entries in json output of ``--result-json``. (:issue:`3534`) Bugfixes - 4.27.0 ================= - Fix dependency-group name normalization. (:issue:`3539`) - Improves logging of environment variables by sorting them by key and redacting the values for the ones that are likely to contain secrets. (:issue:`3542`) ********************** v4.26.0 (2025-05-13) ********************** Features - 4.26.0 ================= - Add support for free-threaded python builds. Factors like ``py313t`` will only pick builds with the GIL disabled while factors without trailing ``t`` will only pick builds without no-GIL support. (:issue:`3391`) - Drop support for EOL Python 3.8. (:issue:`3527`) Bugfixes - 4.26.0 ================= - Fix a regression issue related to inability to use ``file|`` substitution option in nested ``set_env`` sections of ``ini`` configurations since tox4 update. (:issue:`2435`) - Fix ``TypeError`` for ``HelpFormatter`` with Python 3.14 (:issue:`3523`) ********************** v4.25.0 (2025-03-27) ********************** Features - 4.25.0 ================= - Add support for number ranges in generative environments, more details :ref:`here `. - by :user:`mimre25` (:issue:`3502`) Bugfixes - 4.25.0 ================= - Make tox tests pass with Python 3.14.0a6 - by :user:`hroncok` (:issue:`3500`) ********************** v4.24.2 (2025-03-07) ********************** Bugfixes - 4.24.2 ================= - multiple source_type supports for the same filename. Like pyproject.toml can be load by both TomlPyProject & LegacyToml (:issue:`3117`) - Support ``set_env = { file = "conf{/}local.env"}`` for TOML format - by :user:`juditnovak`. (:issue:`3474`) - fix example on the docs (:issue:`3480`) - - ``--parallel-no-spinner`` now respects max CPU set by ``--parallel N`` (:issue:`3495`) Improved Documentation - 4.24.2 =============================== - Updates the documentation for ``os.environ['KEY']`` when the variable does not exist - by :user:`jugmac00`. (:issue:`3456`) ********************** v4.24.1 (2025-01-21) ********************** Misc - 4.24.1 ============= - :issue:`3426` ********************** v4.24.0 (2025-01-21) ********************** Features - 4.24.0 ================= - Add a ``schema`` command to produce a JSON Schema for tox and the current plugins. - by :user:`henryiii` (:issue:`3446`) Bugfixes - 4.24.0 ================= - Log exception name when subprocess execution produces one. - by :user:`ssbarnea` (:issue:`3450`) Improved Documentation - 4.24.0 =============================== - Fix typo in ``docs/config.rst`` from ``{}`` to ``{:}``. - by :user:`wooshaun53` (:issue:`3424`) - Pass ``NIX_LD`` and ``NIX_LD_LIBRARY_PATH`` variables by default in ``pass_env`` to make generic binaries work under Nix/NixOS. - by :user:`albertodonato` (:issue:`3425`) ********************** v4.23.2 (2024-10-22) ********************** Misc - 4.23.2 ============= - :issue:`3415` ********************** v4.23.1 (2024-10-21) ********************** Improved Documentation - 4.23.1 =============================== - Fix bad example in documentation for dependency groups - by :user:`gaborbernat`. (:issue:`3240`) ********************** v4.23.0 (2024-10-16) ********************** Features - 4.23.0 ================= - Add ``NETRC`` to the list of environment variables always passed through. (:issue:`3410`) Improved Documentation - 4.23.0 =============================== - replace ``[tool.pyproject]`` and ``[tool.tox.pyproject]`` with ``[tool.tox]`` in config.rst (:issue:`3411`) ********************** v4.22.0 (2024-10-15) ********************** Features - 4.22.0 ================= - Implement dependency group support as defined in :PEP:`735` - see :ref:`dependency_groups` - by :user:`gaborbernat`. (:issue:`3408`) ********************** v4.21.2 (2024-10-03) ********************** Bugfixes - 4.21.2 ================= - Include ``tox.toml`` in sdist archives to fix test failures resulting from its lack. - by :user:`mgorny` (:issue:`3389`) ********************** v4.21.1 (2024-10-02) ********************** Bugfixes - 4.21.1 ================= - Fix error when using ``requires`` within a TOML configuration file - by :user:`gaborbernat`. (:issue:`3386`) - Fix error when using ``deps`` within a TOML configuration file - by :user:`gaborbernat`. (:issue:`3387`) - Multiple fixes for the TOML configuration by :user:`gaborbernat`.: - Do not fail when there is an empty command within ``commands``. - Allow references for ``set_env`` by accepting list of dictionaries for it. - Do not try to be smart about reference unrolling, instead allow the user to control it via the ``extend`` flag, available both for ``posargs`` and ``ref`` replacements. - The ``ref`` replacements ``raw`` key has been renamed to ``of``. (:issue:`3388`) ********************** v4.21.0 (2024-09-30) ********************** Features - 4.21.0 ================= - Native TOML configuration support - by :user:`gaborbernat`. (:issue:`999`) Improved Documentation - 4.21.0 =============================== - Update Loader docs - by :user:ziima (:issue:`3352`) ********************** v4.20.0 (2024-09-18) ********************** Features - 4.20.0 ================= - Separate the list dependencies functionality to a separate abstract class allowing code reuse in plugins (such as ``tox-uv``) - by :gaborbernat`. (:issue:`3347`) ********************** v4.19.0 (2024-09-17) ********************** Features - 4.19.0 ================= - Support ``pypy-.`` environment names for PyPy environments - by :user:`gaborbernat`. (:issue:`3346`) ********************** v4.18.1 (2024-09-07) ********************** Bugfixes - 4.18.1 ================= - Fix and test the string spec for the ``sys.executable`` interpreter (introduced in :pr:`3325`) - by :user:`hroncok` (:issue:`3327`) Improved Documentation - 4.18.1 =============================== - Changes the ``tox_env_teardown`` docstring to explain the hook is called after a tox env was teared down. (:issue:`3305`) ********************** v4.18.0 (2024-08-13) ********************** Features - 4.18.0 ================= - Suppress spinner in parallel runs in CI - by :user:`ziima`. (:issue:`3318`) Bugfixes - 4.18.0 ================= - Boost temporary directories cleanup in tests - by :user:`ziima`. (:issue:`3278`) - Fix absolute base python paths conflicting - by :user:`gaborbernat`. (:issue:`3325`) ********************** v4.17.1 (2024-08-07) ********************** Bugfixes - 4.17.1 ================= - Support for running ``-e .`` has been lost, fixing it - by :user:`gaborbernat`. (:issue:`2849`) - ``base_python`` now accepts absolute paths to interpreter executable - by :user:`paveldikov`. (:issue:`3191`) ********************** v4.17.0 (2024-08-05) ********************** Features - 4.17.0 ================= - Add ``graalpy`` prefix as a supported base python (:issue:`3312`) - Add :ref:`on_platform` core configuration holding the tox platform and do not install package when exec an environment - by :user:`gaborbernat`. (:issue:`3315`) Bugfixes - 4.17.0 ================= - Add table with default environment variables per OS (:issue:`2753`) ********************** v4.16.0 (2024-07-02) ********************** Bugfixes - 4.16.0 ================= - - Add ``windir`` to the default list of Windows ``pass_env`` environment variables. - by :user:`kurtmckee` (:issue:`3302`) Improved Documentation - 4.16.0 =============================== - - Fix typo in configuration example and fix broken link to code style guide. - by :user:`srenfo` (:issue:`3297`) ********************** v4.15.1 (2024-06-05) ********************** Features - 4.15.1 ================= - Fix ``skip_missing_interpreters`` option for ``package = wheel`` (:issue:`3269`) Bugfixes - 4.15.1 ================= - Fix section substitution with setenv. (:issue:`3262`) - Allow ``ConfigSet.add_config`` to receive parameterized generics for ``of_type``. (:issue:`3288`) ********************** v4.15.0 (2024-04-26) ********************** Features - 4.15.0 ================= - Add support for multiple appending override options (-x, --override) on command line - by :user:`amitschang`. (:issue:`3261`) - Add support for inverting exit code success criteria using bang (!) (:issue:`3271`) Bugfixes - 4.15.0 ================= - Fix issue that the leading character ``c`` was dropped from packages in constraints files - by :user:`jugmac00`. (:issue:`3247`) - Allow appending to ``deps`` with ``--override testenv.deps+=foo`` - by :user:`stefanor`. (:issue:`3256`) - Fix non-existing branch ``rewrite`` in the documentation to ``main``. (:issue:`3257`) - Update test typing for build 1.2.0, which has an explicit ``Distribution`` type - by :user:`stefanor`. (:issue:`3260`) - Fix broken input parsing for ``--discover`` flag. - by :user:`mimre25` (:issue:`3272`) Improved Documentation - 4.15.0 =============================== - Rephrase ``--discover`` flag's description to avoid confusion between paths and executables. - by :user:`mimre25` (:issue:`3274`) ********************** v4.14.2 (2024-03-22) ********************** Bugfixes - 4.14.2 ================= - Add provision arguments to ToxParser to fix crash when provisioning new tox environment without list-dependencies by :user:`seyidaniels` (:issue:`3190`) Improved Documentation - 4.14.2 =============================== - Removed unused line from the ``fresh_subprocess`` documentation. (:issue:`3241`) ********************** v4.14.1 (2024-03-06) ********************** Bugfixes - 4.14.1 ================= - Fix crash with fresh subprocess, if the build backend is setuptools automatically enable fresh subprocesses for build backend calls - by :user:`gaborbernat`. (:issue:`3235`) ********************** v4.14.0 (2024-03-05) ********************** Features - 4.14.0 ================= - Support enabling fresh subprocess for packaging build backends via :ref:`fresh_subprocess` - by :user:`gaborbernat`. (:issue:`3227`) - Allow plugins attaching additional information to ``--version`` via ``tox_append_version_info`` method in the plugin module - by :user:`gaborbernat`. (:issue:`3234`) ********************** v4.13.0 (2024-02-16) ********************** Features - 4.13.0 ================= - Extract virtual environment packaging code to its own base class not tied to ``virtualenv`` - by :user:`gaborbernat`. (:issue:`3221`) Improved Documentation - 4.13.0 =============================== - Documented usage of ``pytest`` with ``tox run-parallel`` - by :user:`faph`. (:issue:`3187`) - Configuration: state in config directive sections their ini file sections - by :user:`0cjs`. (:issue:`3194`) - Development: summarize important points experienced developers need to know - by :user:`0cjs`. (:issue:`3197`) ********************** v4.12.1 (2024-01-16) ********************** Bugfixes - 4.12.1 ================= - Fixed bug where running with --installpkg and multiple envs could not clean up between tests (:issue:`3165`) ********************** v4.12.0 (2024-01-11) ********************** Features - 4.12.0 ================= - Always pass ``FORCE_COLOR`` and ``NO_COLOR`` to the environment (:issue:`3172`) Bugfixes - 4.12.0 ================= - ``--parallel-no-spinner`` flag now implies ``--parallel`` (:issue:`3158`) Improved Documentation - 4.12.0 =============================== - -Fix ``open an issue`` link in development.rst (:issue:`3179`) ********************** v4.11.4 (2023-11-27) ********************** Bugfixes - 4.11.4 ================= - Fix terminal size of tox subcommands (fixes ipython, ipdb, prompt_toolkit, ...). (:issue:`2999`) - Fix ``quickstart`` command from requiring ``root`` positional argument (:issue:`3084`) - Added 'AppData' to the default passed environment variables on Windows. (:issue:`3151`) Improved Documentation - 4.11.4 =============================== - Fix default value for ``install_command`` - by :user:`hashar`. (:issue:`3126`) - Fix default value for ``base_python`` - by :user:`rpatterson`. (:issue:`3156`) ********************** v4.11.3 (2023-09-08) ********************** Bugfixes - 4.11.3 ================= - Handle ``FileNotFoundError`` when the ``base_python`` interpreter doesn't exist (:issue:`3105`) Improved Documentation - 4.11.3 =============================== - Explain how plugins are registered and discovered - by :user:`hashar`. (:issue:`3116`) ********************** v4.11.2 (2023-09-07) ********************** Bugfixes - 4.11.2 ================= - Fix bug in ``config.rst`` by removing stray colons left over from (:issue:`3111`) - by :user:`posita`. (:issue:`3118`) - Provide example to make CLI help more helpful for ``-x``/``--override`` - by :user:`posita`. (:issue:`3119`) Improved Documentation - 4.11.2 =============================== - Fix typos discovered by codespell - by :user:`cclauss`. (:issue:`3113`) ********************** v4.11.1 (2023-09-01) ********************** Bugfixes - 4.11.1 ================= - Allow passing in multiple overrides using the ``;`` character and fix ``,`` being used as splitting values - by :user:`gaborbernat`. (:issue:`3112`) ********************** v4.11.0 (2023-08-29) ********************** Features - 4.11.0 ================= - Add support for setting build backend ``config_settings`` in the configuration file - by :user:`gaborbernat`. (:issue:`3090`) ********************** v4.10.0 (2023-08-21) ********************** Features - 4.10.0 ================= - Change accepted environment name rule: must be made up of factors defined in configuration or match regex ``(pypy|py|cython|)((\d(\.\d+(\.\d+)?)?)|\d+)?``. If an environment name does not match this fail, and if a close match found suggest that to the user. (:issue:`3099`) Bugfixes - 4.10.0 ================= - ``--override foo+=bar`` appending syntax will now work correctly when ``foo`` wasn't defined in ``tox.ini``. (:issue:`3100`) ********************* v4.9.0 (2023-08-16) ********************* Features - 4.9.0 ================ - Disallow command line environments which are not explicitly specified in the config file - by :user:`tjsmart`. (:issue:`2858`) ********************* v4.8.0 (2023-08-12) ********************* Features - 4.8.0 ================ - ``--override`` can now take options in the form of ``foo+=bar`` which will append ``bar`` to the end of an existing list/dict, rather than replacing it. (:issue:`3087`) ********************* v4.7.0 (2023-08-08) ********************* Features - 4.7.0 ================ - Make ``--hashseed`` default to ``PYTHONHASHSEED``, if defined - by :user:`paravoid`. The main motivation for this is to able to set the hash seed when building the documentation with ``tox -e docs``, and thus avoid embedding a random value in the tox documentation for --help. This caused documentation builds to fail to build reproducibly. (:issue:`2942`) Bugfixes - 4.7.0 ================ - Update a regular expression in tests to match the exception message in both Python 3.12 and older. (:issue:`3065`) Improved Documentation - 4.7.0 ============================== - Fix broken links - by :user:`gaborbernat`. (:issue:`3072`) ********************* v4.6.4 (2023-07-06) ********************* Bugfixes - 4.6.4 ================ - Fix hang and zombie process on interrupt (CTRL-C). (:issue:`3056`) ********************* v4.6.3 (2023-06-19) ********************* Bugfixes - 4.6.3 ================ - Ensure that ``get_requires_for_build_wheel`` is called before ``prepare_metadata_for_build_wheel``, and ``get_requires_for_build_editable`` is called before ``prepare_metadata_for_build_editable`` - by :user:`abravalheri`. (:issue:`3043`) Improved Documentation - 4.6.3 ============================== - Linked environment variable substitutions docs in ``set_env`` and ``pass_env`` config docs. (:issue:`3039`) ********************* v4.6.2 (2023-06-16) ********************* Bugfixes - 4.6.2 ================ - Avoid cache collision between editable wheel build and normal wheel build -- by :user:`f3flight`. (:issue:`3035`) ********************* v4.6.1 (2023-06-15) ********************* No significant changes. ********************* v4.6.0 (2023-06-05) ********************* Features - 4.6.0 ================ - Added ``--list-dependencies`` and ``--no-list-dependencies`` CLI parameters. If unspecified, defaults to listing when in CI, but not otherwise. (:issue:`3024`) Misc - 4.6.0 ============ - :issue:`3020` ********************* v4.5.1 (2023-05-25) ********************* Bugfixes - 4.5.1 ================ - Fix ``tox --devenv venv`` invocation without ``-e`` - by :user:`asottile`. (:issue:`2925`) ********************* v4.5.0 (2023-04-24) ********************* Features - 4.5.0 ================ - When run with verbosity=1, the per-step timing summaries are suppressed at the end of the run. Thanks to :user:`nedbat` at the PyCon 2023 sprints. (:issue:`2891`) Improved Documentation - 4.5.0 ============================== - Add FAQ entry on how to test EOL Python versions by :user:`jugmac00`. (:issue:`2989`) ********************** v4.4.12 (2023-04-13) ********************** Bugfixes - 4.4.12 ================= - Avoid race conditions in tests using the ``demo_pkg_inline`` fixture. (:issue:`2985`) ********************** v4.4.11 (2023-04-05) ********************** Bugfixes - 4.4.11 ================= - Fixed an issue where a tox plugin couldn't change the value of ``tox_root``. (:issue:`2966`) ********************** v4.4.10 (2023-04-05) ********************** Bugfixes - 4.4.10 ================= - Fix issue where ``work_dir`` was not correctly including ``tox_root`` for test runs. (:issue:`2933`) ********************* v4.4.9 (2023-04-05) ********************* Bugfixes - 4.4.9 ================ - Instead of raising ``UnicodeDecodeError`` when command output includes non-utf-8 bytes, ``tox`` will now use ``surrogateescape`` error handling to convert the unrecognized bytes to escape sequences according to :PEP:`383` - by :user:`masenf`. (:issue:`2969`) Improved Documentation - 4.4.9 ============================== - Document running tox within a Docker container. (:issue:`1035`) - Added python version 3.11 to ``installation.rst``. (:issue:`2964`) ********************* v4.4.8 (2023-03-26) ********************* Bugfixes - 4.4.8 ================ - ``tox.ini`` is now included in source distributions in order to make all tests pass. (:issue:`2939`) - Fix ``--index-url`` and ``--find-links`` being used together in ``requirements.txt`` files. (:issue:`2959`) ********************* v4.4.6 (2023-02-21) ********************* Bugfixes - 4.4.6 ================ - Plugins are now able to access tox.ini config sections using a custom prefix with the same suffix / name as a tox ``testenv`` - by :user:`masenf` (:issue:`2926`) ********************* v4.4.5 (2023-02-07) ********************* Bugfixes - 4.4.5 ================ - Ignore labels when tox will provision a runtime environment (``.tox``) so that environment configurations which depend on provisioned plugins or specific tox versions are not accessed in the outer tox process where the configuration would be invalid - by :user:`masenf`. (:issue:`2916`) ********************* v4.4.4 (2023-01-31) ********************* Bugfixes - 4.4.4 ================ - Forward ``HOME`` by default - by :user:`gschaffner`. (:issue:`2702`) ********************* v4.4.3 (2023-01-30) ********************* Bugfixes - 4.4.3 ================ - Tox will now expand self-referential extras discovered in package deps to respect local modifications to package metadata. This allows a package extra to explicitly depend on another package extra, which previously only worked with non-static metadata - by :user:`masenf`. (:issue:`2904`) ********************* v4.4.2 (2023-01-25) ********************* Bugfixes - 4.4.2 ================ - Allow the user configuration file (default ``/tox/config.ini``) to be overridden via the ``TOX_USER_CONFIG_FILE`` environment variable. Previously tox was looking at the ``TOX_CONFIG_FILE`` to override the user configuration, however that environment variable is already used to override the main configuration - by :user:`masenf`. (:issue:`2890`) ********************* v4.4.1 (2023-01-25) ********************* Bugfixes - 4.4.1 ================ - In tox 4.4.0 ``constrain_package_deps`` was introduced with a default value of ``True``. This has been changed back to ``False``, which restores the original behavior of tox 4.3.5 - by :user:`masenf`. (:issue:`2897`) ********************* v4.4.0 (2023-01-25) ********************* Features - 4.4.0 ================ - Test environments now recognize boolean config keys ``constrain_package_deps`` (default=true) and ``use_frozen_constraints`` (default=false), which control how tox generates and applies constraints files when performing ``install_package_deps``. If ``constrain_package_deps`` is true (default), then tox will write out ``{env_dir}{/}constraints.txt`` and pass it to ``pip`` during ``install_package_deps``. If ``use_frozen_constraints`` is false (default), the constraints will be taken from the specifications listed under ``deps`` (and inside any requirements or constraints file referenced in ``deps``). Otherwise, ``list_dependencies_command`` (``pip freeze``) is used to enumerate exact package specifications which will be written to the constraints file. In previous releases, conflicting package dependencies would silently override the ``deps`` named in the configuration, resulting in test runs against unexpected dependency versions, particularly when using tox factors to explicitly test with different versions of dependencies - by :user:`masenf`. (:issue:`2386`) Bugfixes - 4.4.0 ================ - When parsing command lines, use ``shlex(..., posix=True)``, even on windows platforms, since non-POSIX mode does not handle escape characters and quoting like a shell would. This improves cross-platform configurations without hacks or esoteric quoting. To make this transition easier, on Windows, the backslash path separator will not treated as an escape character unless it precedes a quote, whitespace, or another backslash character. This allows paths to mostly be written in single or double backslash style. Note that **double-backslash will no longer be escaped to a single backslash in substitutions**, instead the double backslash will be consumed as part of command splitting, on either posix or windows platforms. In some instances superfluous double or single quote characters may be stripped from arg arrays in ways that do not occur in the default windows ``cmd.exe`` shell - by :user:`masenf`. (:issue:`2635`) Improved Documentation - 4.4.0 ============================== - Add information when command from ``list_dependencies_command`` configuration option is used. (:issue:`2883`) ********************* v4.3.5 (2023-01-18) ********************* Bugfixes - 4.3.5 ================ - When building a ``wheel`` or ``editable`` package with a PEP 517 backend, no longer pass an empty ``metadata_directory`` to the backend ``build_wheel`` or ``build_editable`` endpoint. Some backends, such as PDM and poetry, will not generate package metadata in the presence of a ``metadata_directory``, even if it is empty. Prior to this change, attempting to install a wheel created by tox using PDM or poetry would return an error like "There is no item named 'my-package.0.1.dist-info/WHEEL' in the archive" - by :user:`masenf`. (:issue:`2880`) ********************* v4.3.4 (2023-01-17) ********************* Bugfixes - 4.3.4 ================ - When executing via the provisioning environment (``.tox`` by default), run ``tox`` in working directory of the parent process. Prior to this change (from tox 4.0.0), the provisioned ``tox`` would execute with ``{tox_root}`` as the working directory, which breaks when a relative path is passed to ``-c`` or ``--conf`` and ``tox`` is executed in a working directory other than ``{tox_root}`` - by :user:`masenf`. (:issue:`2876`) Misc - 4.3.4 ============ - :issue:`2878` ********************* v4.3.3 (2023-01-16) ********************* Bugfixes - 4.3.3 ================ - The provision environment (``.tox``) will never inherit from ``testenv``. During provisioning, other test environments are not processed, allowing the use of keys and values that may be registered by later tox version or provisioned plugins - by :user:`masenf`. (:issue:`2862`) ********************* v4.3.2 (2023-01-16) ********************* Bugfixes - 4.3.2 ================ - Fix regression introduced in 4.3.0 which occurred when a substitution expression for an environment variable that had previously been substituted appears in the ini file after a substitution expression for a different environment variable. This situation erroneously resulted in an exception about "circular chain between set" of those variables - by :user:`masenf`. (:issue:`2869`) ********************* v4.3.1 (2023-01-15) ********************* Bugfixes - 4.3.1 ================ - Fix regression introduced in 4.3.0 by expanding substitution expressions (``{...}``) that result from a previous subsitution's replacement value (up to 100 times). Note that recursive expansion is strictly depth-first; no replacement value will ever affect adjacent characters nor will expansion ever occur over the result of more than one replacement - by :user:`masenf`. (:issue:`2863`) ********************* v4.3.0 (2023-01-15) ********************* Features - 4.3.0 ================ - Rewrite substitution replacement parser - by :user:`masenf` - ``\`` acts as a proper escape for ``\`` in ini-style substitutions - The resulting value of a substitution is no longer reprocessed in the context of the broader string. (Prior to this change, ini-values were repeatedly re-substituted until the expression no longer had modifications) - Migrate and update "Substitutions" section of Configuration page from v3 docs. - ``find_replace_part`` is removed from ``tox.config.loader.ini.replace`` - New names exported from ``tox.config.loader.ini.replace``: - ``find_replace_expr`` - ``MatchArg`` - ``MatchError`` - ``MatchExpression`` - Note: the API for ``replace`` itself is unchanged. (:issue:`2732`) - Improved documentation for factors and test env names - by :user:`stephenfin`. (:issue:`2852`) ********************* v4.2.8 (2023-01-11) ********************* Bugfixes - 4.2.8 ================ - Allow using package names with env markers for pip's ``--no-binary`` and ``--only-binary`` options - by :user:`q0w`. (:issue:`2814`) ********************* v4.2.7 (2023-01-11) ********************* Bugfixes - 4.2.7 ================ - A testenv with multiple factors, one of which conflicts with a ``base_python`` setting in ``tox.ini``, will now use the correct Python interpreter version - by :user:`stephenfin`. (:issue:`2838`) - Explicitly list ``wheel`` as requirement for the tests, as some of the tests error without it. (:issue:`2843`) - tox has reverted support for Python factors that include PATCH release info (e.g. ``py3.10.1``), build architecture (e.g. ``pypy3-64``) or do not define a ``py`` prefix or other supported prefix (e.g. ``3.10``). These complex factors were initially supported with the release of tox 4.0 but has proven complicated to support. Instead, the simple factors supported by tox 3 e.g. (``py310``, ``pypy3``) or period-separated equivalent (``py3.10``) introduced in tox 4 should be used. Users who wish to specify more specific Python version information should configure the :ref:`base_python` setting - by :user:`stephenfin`. (:issue:`2848`) ********************* v4.2.6 (2023-01-06) ********************* Bugfixes - 4.2.6 ================ - Handle properly pip ``--no-binary`` / ``--only-binary`` options in requirements.txt format files. (:issue:`2814`) ********************* v4.2.5 (2023-01-06) ********************* Bugfixes - 4.2.5 ================ - The combination of ``usedevelop = true`` and ``--skip-missing-interpreters=false`` will no longer fail for environments that were *not* invoked - by :user:`stephenfin`. (:issue:`2811`) - Fix an attribute error when ``use_develop = true`` is set and an unsupported interpreter version is requested - by :user:`stephenfin`. (:issue:`2826`) - tox returns a non-zero error code if all envs are skipped. It will now correctly do this if only a single env was requested and this was skipped - by :user:`stephenfin`. (:issue:`2827`) ********************* v4.2.4 (2023-01-05) ********************* Bugfixes - 4.2.4 ================ - Setting ``[testenv] basepython = python3`` will no longer override the Python interpreter version requested by a factor, such as ``py311`` - by :user:`stephenfin`. (:issue:`2754`) - Also accept tab after colon before factor filter expansion - by :user:`pdecat`. (:issue:`2823`) ********************* v4.2.3 (2023-01-04) ********************* Bugfixes - 4.2.3 ================ - ``devenv`` does not respect the specified path when the package is a wheel file - by :user:`gaborbernat`. (:issue:`2815`) - Require space after colon before factor filter expansion, unless it is the last character of the line - by :user:`pdecat`. (:issue:`2822`) ********************* v4.2.2 (2023-01-04) ********************* Bugfixes - 4.2.2 ================ - Add ``CC``, ``CFLAGS``, ``CCSHARED``, ``CXX``, ``CPPFLAGS``, ``LDFLAGS``, ``PKG_CONFIG`` and ``PKG_CONFIG_SYSROOT_DIR`` to the default passed through environment variables list as these are needed for building various C-extensions - by :user:`gaborbernat`. (:issue:`2818`) ********************* v4.2.1 (2023-01-03) ********************* Bugfixes - 4.2.1 ================ - Fix extracting extras from markers with more than 2 extras in an or chain - by :user:`dconathan`. (:issue:`2791`) ********************* v4.2.0 (2023-01-03) ********************* Features - 4.2.0 ================ - Packaging environments now inherit from the ``pkgenv`` section, allowing to set all your packaging options in one place, and support the ``deps`` key to set additional dependencies that will be installed after ``pyproject.toml`` static ``requires`` but before backends dynamic requires - by :user:`gaborbernat`. (:issue:`2543`) Improved Documentation - 4.2.0 ============================== - Document breaking changes with tox 4 and packaging environments - by :user:`gaborbernat`. (:issue:`2543`) - Document how to handle environments whose names match ``tox`` subcommands - by :user:`sirosen`. (:issue:`2728`) ********************* v4.1.3 (2023-01-02) ********************* Bugfixes - 4.1.3 ================ - Reuse package_env with ``--installpkg`` - by :user:`q0w`. (:issue:`2442`) - Fail more gracefully when pip :ref:`install_command` is empty - by :user:`jayaddison`. (:issue:`2695`) Improved Documentation - 4.1.3 ============================== - Add breaking-change documentation for empty ``install_command`` values - by :user:`jayaddison`. (:issue:`2695`) Misc - 4.1.3 ============ - :issue:`2796`, :issue:`2797` ********************* v4.1.2 (2022-12-30) ********************* Bugfixes - 4.1.2 ================ - Fix ``--skip-missing-interpreters`` behavior - by :user:`q0w`. (:issue:`2649`) - Restore tox 3 behavior of showing the output of pip freeze, however now only active when running inside a CI environment - by :user:`gaborbernat`. (:issue:`2685`) - Fix extracting extras from markers with many extras - by :user:`q0w`. (:issue:`2791`) ********************* v4.1.1 (2022-12-29) ********************* Bugfixes - 4.1.1 ================ - Fix logging error with emoji in git branch name. (:issue:`2768`) Improved Documentation - 4.1.1 ============================== - Add faq entry about reuse of environments - by :user:`jugmac00`. (:issue:`2788`) ********************* v4.1.0 (2022-12-29) ********************* Features - 4.1.0 ================ - ``-f`` can be used multiple times and on hyphenated factors (e.g. ``-f py311-django -f py39``) - by :user:`sirosen`. (:issue:`2766`) Improved Documentation - 4.1.0 ============================== - Fix a grammatical typo in docs/user_guide.rst. (:issue:`2787`) ********************** v4.0.19 (2022-12-28) ********************** Bugfixes - 4.0.19 ================= - Create temp_dir if not exists - by :user:`q0w`. (:issue:`2770`) ********************** v4.0.18 (2022-12-26) ********************** Bugfixes - 4.0.18 ================= - Strip leading and trailing whitespace when parsing elements in requirement files - by :user:`gaborbernat`. (:issue:`2773`) ********************** v4.0.17 (2022-12-25) ********************** Features - 4.0.17 ================= - Suppress a report output when verbosity = 0. (:issue:`2697`) Bugfixes - 4.0.17 ================= - Fix ``--sdistonly`` behavior. (:issue:`2653`) - Override toxworkdir with --workdir. (:issue:`2654`) ********************** v4.0.16 (2022-12-20) ********************** Bugfixes - 4.0.16 ================= - Fix :ref:`change_dir` is relative to current working directory rather than to the :ref:`tox_root` when using the ``-c`` argument to locate the ``tox.ini`` file - by :user:`gaborbernat`. (:issue:`2619`) ********************** v4.0.15 (2022-12-19) ********************** Bugfixes - 4.0.15 ================= - Fix tox auto-provisioning not working and relax :ref:`min_version` default from ``4.0`` to no version constraint - by :user:`gaborbernat`. (:issue:`2634`) - Fix assertion in ``test_result_json_sequential`` when interpreter ``_base_executable`` is a hardlink (macOS homebrew) - by :user:`masenf`. (:issue:`2720`) - Complex negative factor filters not working - by :user:`gaborbernat`. (:issue:`2747`) ********************** v4.0.14 (2022-12-18) ********************** Bugfixes - 4.0.14 ================= - Do not include non test environment sections or factor filters in INI configuration to factor discovery - by :user:`gaborbernat`. (:issue:`2746`) ********************** v4.0.13 (2022-12-17) ********************** Bugfixes - 4.0.13 ================= - A plain section in INI configuration matching a tox environment name shadowed the laters configuration - by :user:`gaborbernat`. (:issue:`2636`) - Fix space not accepted in factor filter expression - by :user:`gaborbernat`. (:issue:`2718`) ********************** v4.0.12 (2022-12-16) ********************** Bugfixes - 4.0.12 ================= - If tox is running in a tty, allocate a pty (pseudo terminal) for commands and copy termios attributes to show colors and improve interactive use - by :user:`masenf`. (:issue:`1773`) - Fix python hash seed not being set - by :user:`gaborbernat`. (:issue:`2645`) - Fix legacy CLI flags ``--pre``, ``--force-deps``, ``--sitepackages`` and ``--alwayscopy`` not working, and mark them as deprecated - by :user:`gaborbernat`. (:issue:`2690`) Improved Documentation - 4.0.12 =============================== - Document user level config. (:issue:`2633`) ********************** v4.0.11 (2022-12-14) ********************** Features - 4.0.11 ================= - Modified handling of ``NO_COLOR`` environment variable, consistent with `de facto conventions `_: any non-empty string will enable ``NO_COLOR`` (disable colorized output); no ``NO_COLOR`` variable or ``NO_COLOR`` with an empty string will disable ``NO_COLOR`` (enable colorized output) - by :user:`ptmcg`. (:issue:`2719`) Bugfixes - 4.0.11 ================= - ``TOX_SKIP_ENV`` environment variable now works again, and can also be set via the CLI argument ``--skip-env`` for any command where ``-e`` can be set - by :user:`mgedmin`. (:issue:`2698`) - ``tox config`` should only show :ref:`env_list` arguments by default instead of ``ALL`` - by :user:`gaborbernat`. (:issue:`2726`) ********************** v4.0.10 (2022-12-14) ********************** Features - 4.0.10 ================= - Add ``py_dot_ver`` and ``py_impl`` constants to environments to show the current Python implementation and dot version (e.g. ``3.11``) for the current environment. These can be also used as substitutions in ``tox.ini`` - by :user:`gaborbernat`. (:issue:`2640`) Bugfixes - 4.0.10 ================= - ``--help`` now reports the default verbosity level (which is WARNING) correctly. (:issue:`2707`) ********************* v4.0.9 (2022-12-13) ********************* Features - 4.0.9 ================ - Add :meth:`tox_on_install ` and :meth:`tox_env_teardown ` plugin hooks - by :user:`gaborbernat`. (:issue:`2687`) - Add ``PKG_CONFIG_PATH`` to the default pass through environment list for python tox environments - by :user:`gaborbernat`. (:issue:`2700`) ********************* v4.0.8 (2022-12-11) ********************* Bugfixes - 4.0.8 ================ - Fix multiple substitution on factor filtering in ``tox.ini`` when multiple factor filters match - by :user:`gaborbernat`. (:issue:`2650`) - Fix regression in ``requirements.txt`` parsing - by :user:`gaborbernat`. (:issue:`2682`) ********************* v4.0.7 (2022-12-11) ********************* Bugfixes - 4.0.7 ================ - Support for ``--no-deps`` flag within the :ref:`deps` - by :user:`gaborbernat`. (:issue:`2674`) ********************* v4.0.6 (2022-12-10) ********************* Features - 4.0.6 ================ - Fail on :ref:`pass_env`/:ref:`passenv` entries containing whitespace - by :user:`ericzolf`. (:issue:`2658`) ********************* v4.0.5 (2022-12-09) ********************* Bugfixes - 4.0.5 ================ - Normalize extra names passed in (fixes extra groups not being picked up during installation) - by :user:`gaborbernat`. (:issue:`2655`) ********************* v4.0.4 (2022-12-09) ********************* Bugfixes - 4.0.4 ================ - Disable logging from ``distlib.util`` and ``filelock`` as these log messages are too verbose - by :user:`gaborbernat`. (:issue:`2655`) - Use ``!r`` and ``repr()`` to better display erroneous values in exception from ``StrConverter.to_bool()`` - by :user:`ptmcg`. (:issue:`2665`) Improved Documentation - 4.0.4 ============================== - Document that running ``--showconfig`` or ``--help-ini`` with the ``-v`` flag will add interleaved debugging information, whereas tox v3 added extra lines at the start - by :user:`jugmac00`. (:issue:`2622`) - Document that tox v4 errors when using ``-U`` when defining dependencies via ``deps`` - by :user:`jugmac00`. (:issue:`2631`) ********************* v4.0.3 (2022-12-08) ********************* Bugfixes - 4.0.3 ================ - Always set environment variable ``PYTHONIOENCODING`` to ``utf-8`` to ensure tox works under Windows custom encodings - by :user:`gaborbernat`. (:issue:`2422`) - Ensure :ref:`change_dir` is created if does not exist before executing :ref:`commands` - by :user:`gaborbernat`. (:issue:`2620`) - Pass through ``NUMBER_OF_PROCESSORS`` on Windows as is needed for ``multiprocessing.cpu_count`` - by :user:`gaborbernat`. (:issue:`2629`) - The core tox configuration now contains ``host_python`` key showing the host python executable path - by :user:`gaborbernat`. (:issue:`2630`) Improved Documentation - 4.0.3 ============================== - Document that space separator is no longer valid for the :ref:`passenv` and instead one should use comma - by :user:`gaborbernat`. (:issue:`2615`) - Document necessity to escape ``#`` within INI configuration - by :user:`jugmac00`. (:issue:`2617`) ********************* v4.0.2 (2022-12-07) ********************* Bugfixes - 4.0.2 ================ - Unescaped comma in substitution should not be replaced during INI expansion - by :user:`gaborbernat`. (:issue:`2616`) - ``tox --showconfig -e py311`` reports tox section, though it should not - by :user:`gaborbernat`. (:issue:`2624`) ********************* v4.0.1 (2022-12-07) ********************* Bugfixes - 4.0.1 ================ - Create session views of the build wheel/sdist into the :ref:`temp_dir` folder - by :user:`gaborbernat`. (:issue:`2612`) - Default tox min_version to 4.0 instead of current tox version - by :user:`gaborbernat`. (:issue:`2613`) ********************* v4.0.0 (2022-12-07) ********************* Bugfixes - 4.0.0 ================ - The temporary folder within the tox environment was named ``.temp`` instead of ``.tmp`` - by :user:`gaborbernat`. (:issue:`2608`) Improved Documentation - 4.0.0 ============================== - Enumerate breaking changes of tox 4 in the FAQ, and also list major new improvements - by :user:`gaborbernat`. (:issue:`2587`) - Document in the FAQ that tox 4 will raise a warning when finding conflicting environment names - by :user:`gaborbernat`. (:issue:`2602`) ************************ v4.0.0rc4 (2022-12-06) ************************ Bugfixes - 4.0.0rc4 =================== - Fix extras not being kept for install dependencies - by :user:`gaborbernat`. (:issue:`2603`) Deprecations and Removals - 4.0.0rc4 ==================================== - Remove deprecated configuration option ``whitelist_externals`` which was replaced by ``allowlist_externals`` - by :user:`jugmac00`. (:issue:`2599`) ************************ v4.0.0rc3 (2022-12-05) ************************ Features - 4.0.0rc3 =================== - Add ``--exit-and-dump-after`` flag that allows automatically killing tox if does not finish within the passed seconds, and dump the thread stacks (useful to debug tox when it seemingly hangs) - by :user:`gaborbernat`. (:issue:`2595`) Bugfixes - 4.0.0rc3 =================== - Ensure that two parallel tox instance invocations on different tox environment targets will work by holding a file lock onto the packaging operations (e.g., in bash ``tox4 r -e py311 &; tox4 r -e py310``) - by :user:`gaborbernat`. (:issue:`2594`) - Fix leaking backend processes when the build backend does not support editable wheels and fix failure when multiple environments exist that have a build backend that does not support editable wheels - by :user:`gaborbernat`. (:issue:`2595`) ************************ v4.0.0rc2 (2022-12-04) ************************ Features - 4.0.0rc2 =================== - Support for recursive extras in Python package dependencies - by :user:`gaborbernat`. (:issue:`2567`) Bugfixes - 4.0.0rc2 =================== - Support in INI files for ignore exit code marker the ``-`` without a subsequent space too - by :user:`gaborbernat`. (:issue:`2561`) - Ensure paths constructed by tox are stable by resolving relative paths to fully qualified one, this insures that running tox from a different folder than project root still generates meaningful paths - by :user:`gaborbernat`. (:issue:`2562`) - Ensure only on run environment operates at a time on a packaging environment (fixes unexpected failures when running in parallel mode) - by :user:`gaborbernat`. (:issue:`2564`) - Fallback to ``editable-legacy`` if package target is ``editable`` but the build backend does not have ``build_editable`` hook - by :user:`gaborbernat`. (:issue:`2567`) - Allow reference replacement in INI configuration via keys that contain the ``-`` character - by :user:`gaborbernat`. (:issue:`2569`) - Resolve symlinks when saving Python executable path - by :user:`ssbarnea`. (:issue:`2574`) - Do not set ``COLUMNS`` or ``LINES`` environment to the current TTY size if already set by the user - by :user:`gaborbernat`. (:issue:`2575`) - Add missing :pypi:`build[virtualenv]` test dependency - by :user:`ssbarnea`. (:issue:`2576`) ************************ v4.0.0rc1 (2022-11-29) ************************ Features - 4.0.0rc1 =================== - Add support for generative section headers - by :user:`gaborbernat`. (:issue:`2362`) Bugfixes - 4.0.0rc1 =================== - Allow installing relative paths that go outside tox root folder. - by :user:`ssbarnea`. (:issue:`2366`) *********************** v4.0.0b3 (2022-11-27) *********************** Features - 4.0.0b3 ================== - Improve coloring of logged commands - by :user:`ssbarnea`. (:issue:`2356`) - Pass ``PROGRAMDATA``, ``PROGRAMFILES(x86)``, ``PROGRAMFILES`` environments on Windows by default as it is needed for discovering the VS C++ compiler and start testing against 3.11 - by :user:`gaborbernat`. (:issue:`2492`) - Support PEP-621 static metadata for getting package dependencies - by :user:`gaborbernat`. (:issue:`2499`) - Add support for editable wheels, make it the default development mode and rename ``dev-legacy`` mode to ``editable-legacy`` - by :user:`gaborbernat`. (:issue:`2502`) Bugfixes - 4.0.0b3 ================== - Recognize ``TERM=dumb`` or ``NO_COLOR`` environment variables. - by :user:`ssbarnea`. (:issue:`1290`) - Allow passing config directory without filename. - by :user:`ssbarnea`. (:issue:`2340`) - Avoid ignored explicit argument 're' console message. - by :user:`ssbarnea`. (:issue:`2342`) - Display registered plugins with ``tox --version`` - by :user:`mxd4`. (:issue:`2358`) - Allow ``--hash`` to be specified in requirements.txt files. - by :user:`masenf`. (:issue:`2373`) - Avoid impossible minversion version requirements. - by :user:`ssbarnea`. (:issue:`2414`) Improved Documentation - 4.0.0b3 ================================ - Add new documentation for tox 4 - by :user:`gaborbernat`. (:issue:`2408`) *********************** v4.0.0b2 (2022-04-11) *********************** Features - 4.0.0b2 ================== - Use ``tox`` console entry point name instead of ``tox4`` - by :user:`gaborbernat`. (:issue:`2344`) - Use ``.tox`` as working directory instead of ``.tox/4`` - by :user:`gaborbernat`. (:issue:`2346`) - Switch to ``hatchling`` as build backend instead of ``setuptools`` - by :user:`gaborbernat`. (:issue:`2368`) Bugfixes - 4.0.0b2 ================== - Fix CLI raises an error for ``-va`` with ``ignored explicit argument 'a'`` - by :user:`gaborbernat`. (:issue:`2343`) - Do not interpolate values when parsing ``tox.ini`` configuration files - by :user:`gaborbernat`. (:issue:`2350`) Improved Documentation - 4.0.0b2 ================================ - Deleted the tox mailing list -- by :user:`jugmac00` (:issue:`2364`) *********************** v4.0.0b1 (2022-02-05) *********************** Features - 4.0.0b1 ================== - Display a hint for unrecognized argument CLI parse failures to use ``--`` separator to pass arguments to commands - by :user:`gaborbernat`. (:issue:`2183`) - Do not allow extending the config set beyond setup to ensures that all configuration values are visible via the config sub-command. - by :user:`gaborbernat`. (:issue:`2243`) - Print a message when ignoring outcome of commands - by :user:`gaborbernat`. (:issue:`2315`) Bugfixes - 4.0.0b1 ================== - Fix type annotation is broken for :meth:`tox.config.sets.ConfigSet.add_config` when adding a container type - by :user:`gaborbernat`. (:issue:`2233`) - Insert ``TOX_WORK_DIR``, ``TOX_ENV_NAME``, ``TOX_ENV_DIR`` and ``VIRTUAL_ENV`` into the environment variables for all tox environments to keep contract with tox version 3 - by :user:`gaborbernat`. (:issue:`2259`) - Fix plugin initialization order - core plugins first, then 3rd party and finally inline - by :user:`gaborbernat`. (:issue:`2264`) - Legacy parallel mode should accept ``-p`` flag without arguments - by :user:`gaborbernat`. (:issue:`2299`) - Sequential run fails because the packaging environment is deleted twice for sequential runs with recreate flag on - by :user:`gaborbernat`. (:issue:`2300`) - Require Python 3.10 to generate docs - by :user:`jugmac00`. (:issue:`2321`) - Environment assignment for output breaks when using ``-rv`` (when we cannot guess upfront the verbosity level from the CLI arguments) - by :user:`gaborbernat`. (:issue:`2324`) - ``devenv`` command does not respect specified path - by :user:`gaborbernat`. (:issue:`2325`) Improved Documentation - 4.0.0b1 ================================ - Enable link check during documentation build - by :user:`gaborbernat`. (:issue:`806`) - Document ownership of the ``tox.wiki`` root domain - by :user:`gaborbernat`. (:issue:`2242`) - Document :meth:`tox.config.sets.ConfigSet.loaders` - by :user:`gaborbernat`. (:issue:`2287`) - Fix CLI documentation is missing and broken documentation references - by :user:`gaborbernat`. (:issue:`2310`) ************************ v4.0.0a10 (2022-01-04) ************************ Features - 4.0.0a10 =================== - Support for grouping environment values together by applying labels to them either at :ref:`core ` and :ref:`environment ` level, and allow selecting them via the :ref:`-m ` flag from the CLI - by :user:`gaborbernat`. (:issue:`238`) - Support for environment files within the :ref:`set_env` configuration via the ``file|`` prefix - by :user:`gaborbernat`. (:issue:`1938`) - Support for ``--no-provision`` flag - by :user:`gaborbernat`. (:issue:`1951`) - Missing ``pyproject.toml`` or ``setup.py`` file at the tox root folder without the ``--install-pkg`` flag assumes no packaging - by :user:`gaborbernat`. (:issue:`1964`) - Add ``external`` package type for :ref:`package` (see :ref:`external-package-builder`), and extract package dependencies for packages passed in via :ref:`--installpkg ` - by :user:`gaborbernat`. (:issue:`2204`) - Add support for rewriting script invocations that have valid shebang lines when the ``TOX_LIMITED_SHEBANG`` environment variable is set and not empty - by :user:`gaborbernat`. (:issue:`2208`) - Support for the ``--discover`` CLI flag - by :user:`gaborbernat`. (:pr:`2245`) - Moved the python packaging logic into a dedicate package :pypi:`pyproject-api` and use it as a dependency - by :user:`gaborbernat`. (:pr:`2274`) - Drop python 3.6 support - by :user:`gaborbernat`. (:pr:`2275`) - Support for selecting target environments with a given factor via the :ref:`-f ` CLI environment flag - by :user:`gaborbernat`. (:pr:`2290`) Bugfixes - 4.0.0a10 =================== - Fix ``CTRL+C`` is not stopping the process on Windows - by :user:`gaborbernat`. (:issue:`2159`) - Fix list/depends commands can create tox package environment as runtime environment and display an error message - by :user:`gaborbernat`. (:pr:`2234`) Deprecations and Removals - 4.0.0a10 ==================================== - ``tox_add_core_config`` and ``tox_add_env_config`` now take a ``state: State`` argument instead of a configuration one, and ``Config`` not longer provides the ``envs`` property (instead users should migrate to ``State.envs``) - by :user:`gaborbernat`. (:pr:`2275`) *********************** v4.0.0a9 (2021-09-16) *********************** Features - 4.0.0a9 ================== - Expose the parsed CLI arguments on the main configuration object for plugins and allow plugins to define their own configuration section -- by :user:`gaborbernat`. (:pr:`2191`) - Let tox run fail when all envs are skipped -- by :user:`jugmac00`. (:issue:`2195`) - Expose the configuration loading mechanism to plugins to define and load their own sections. Add :meth:`tox_add_env_config ` plugin hook called after the configuration environment is created for a tox environment and removed ``tox_configure``. Add the main configuration object as argument to :meth:`tox_add_core_config `. Move the environment list method from the state to the main configuration object to allow its use within plugins -- by :user:`gaborbernat`. (:issue:`2200`) - Allow running code in plugins before and after commands via :meth:`tox_before_run_commands ` and :meth:`tox_after_run_commands ` plugin points -- by :user:`gaborbernat`. (:issue:`2201`) - Allow plugins to update the :ref:`set_env` and change the :ref:`pass_env` configurations -- by :user:`gaborbernat`. (:issue:`2215`) Bugfixes - 4.0.0a9 ================== - Fix env variable substitutions with defaults containing colon (e.g. URL) -- by :user:`comabrewer`. (:issue:`2182`) - Do not allow constructing ``ConfigSet`` directly and implement ``__contains__`` for ``Loader`` -- by :user:`gaborbernat`. (:pr:`2209`) - Fix old-new value on recreate cache miss-match are swapped -- by :user:`gaborbernat`. (:issue:`2211`) - Report fails when report does not support Unicode characters -- by :user:`gaborbernat`. (:issue:`2213`) Improved Documentation - 4.0.0a9 ================================ - Adopt furo theme, update our state diagram and description in user docs (SVG + light/dark variant), split the Python API into its own page from under the plugin page, and document plugin adoption under the ``tox-dev`` organization - by :user:`gaborbernat`. (:issue:`1881`) *********************** v4.0.0a8 (2021-08-21) *********************** Features - 4.0.0a8 ================== - Add support for :ref:`allowlist_externals`, commands not matching error - by :user:`gaborbernat`. (:issue:`1127`) - Add outcome of environments into the result json (:ref:`--result-json `) under the ``result`` key containing ``success`` boolean, ``exit_code`` integer and ``duration`` float value - by :user:`gaborbernat`. (:issue:`1405`) - Add ``exec`` subcommand that allows users to run an arbitrary command within the tox environment (without needing to modify their configuration) - by :user:`gaborbernat`. (:issue:`1790`) - Add check to validate the base Python names and the environments name do not conflict Python spec wise, when they do raise error if :ref:`ignore_base_python_conflict` is not set or ``False`` - by :user:`gaborbernat`. (:issue:`1840`) - Allow any Unix shell-style wildcards expression for :ref:`pass_env` - by :user:`gaborbernat`. (:issue:`2121`) - Add support for :ref:`args_are_paths` flag - by :user:`gaborbernat`. (:issue:`2122`) - Add support for :ref:`env_log_dir` (compared to tox 3 extend content and keep only last run entries) - by :user:`gaborbernat`. (:issue:`2123`) - Add support for ``{:}`` substitution in ini files as placeholder for the OS path separator - by :user:`gaborbernat`. (:issue:`2125`) - When cleaning directories (for tox environment, ``env_log_dir``, ``env_tmp_dir`` and packaging metadata folders) do not delete the directory itself and recreate, but instead just delete its content (this allows the user to cd into it and still be in a valid folder after a new run) - by :user:`gaborbernat`. (:pr:`2139`) - Changes to help plugin development: simpler tox env creation argument list, expose python creation directly, allow skipping list dependencies install command for pip and executable is only part of the python cache for virtualenv - by :user:`gaborbernat`. (:pr:`2172`) Bugfixes - 4.0.0a8 ================== - Support ``#`` character in path for the tox project - by :user:`gaborbernat`. (:issue:`763`) - If the command expression fails to parse with shlex fallback to literal pass through of the remaining elements - by :user:`gaborbernat`. (:issue:`1944`) - tox config fails on :ref:`--recreate ` flag, and once specified the output does not reflect the impact of the CLI flags - by :user:`gaborbernat`. (:issue:`2037`) - Virtual environment creation for Python is always triggered at every run - by :user:`gaborbernat`. (:issue:`2041`) - Add support for setting :ref:`suicide_timeout`, :ref:`interrupt_timeout` and :ref:`terminate_timeout` - by :user:`gaborbernat`. (:issue:`2124`) - Parallel show output not working when there's a packaging phase in the run - by :user:`gaborbernat`. (:pr:`2161`) Improved Documentation - 4.0.0a8 ================================ - Note constraint files are a subset of requirement files - by :user:`gaborbernat`. (:issue:`1939`) - Add a note about having a package with different Python requirements than tox and not specifying :ref:`base_python` - by :user:`gaborbernat`. (:issue:`1975`) - Fix :ref:`--runner ` is missing default value and documentation unclear - by :user:`gaborbernat`. (:issue:`2004`) *********************** v4.0.0a7 (2021-07-28) *********************** Features - 4.0.0a7 ================== - Add support for configuration taken from the ``setup.cfg`` file -by :user:`gaborbernat`. (:issue:`1836`) - Add support for configuration taken from the ``pyproject.toml`` file, ``tox`` section ``legacy_tox_ini`` key - by :user:`gaborbernat`. (:issue:`1837`) - Add configuration documentation - by :user:`gaborbernat`. (:issue:`1914`) - Implemented ``[]`` substitution (alias for ``{posargs}``) - by :user:`hexagonrecursion`. (:issue:`1928`) - Implement ``[testenv] ignore_outcome`` - "a failing result of this testenv will not make tox fail" - by :user:`hexagonrecursion`. (:issue:`1947`) - Inline plugin support via ``tox_.py``. This is loaded where the tox config source is discovered. It's a Python file that can contain arbitrary Python code, such as definition of a plugin. Eventually we'll add a plugin that allows succinct declaration/generation of new tox environments - by :user:`gaborbernat`. (:pr:`1963`) - Introduce the installer concept, and collect pip installation into a ``pip`` package, also attach to this the requirements file parsing which got a major rework - by :user:`gaborbernat`. (:pr:`1991`) - Support CPython ``3.10`` -by :user:`gaborbernat`. (:pr:`2014`) Bugfixes - 4.0.0a7 ================== - Environments with a platform mismatch are no longer silently skipped, but properly reported - by :user:`jugmac00`. (:issue:`1926`) - Port pip requirements file parser to ``tox`` to achieve full equivalency (such as support for the per requirement ``--install-option`` and ``--global-option`` flags) - by :user:`gaborbernat`. (:issue:`1929`) - Support for extras with paths for Python deps and requirement files - by :user:`gaborbernat`. (:issue:`1933`) - Due to a bug ``\{posargs} {posargs}`` used to expand to literal ``{posargs} {posargs}``. Now the second ``{posargs}`` is expanded. ``\{posargs} {posargs}`` expands to ``{posargs} positional arguments here`` - by :user:`hexagonrecursion`. (:issue:`1956`) - Enable setting a different ``upstream`` repository for the coverage diff report. This has been hardcoded to ``upstream/rewrite`` until now. by :user:`jugmac00`. (:issue:`1972`) - Enable replacements (a.k.a section substitutions) for section names containing a dash in sections without the ``testenv:`` prefix - by :user:`jugmac00`, :user:`obestwalter`, :user:`eumiro`. (:issue:`1985`) - Fix legacy list env command for empty/missing envlist - by :user:`jugmac00`. (:issue:`1987`) - Requirements and constraints files handling got reimplemented, which should fix all open issues related to this area - by :user:`gaborbernat`. (:pr:`1991`) - Use importlib instead of ``__import__`` - by :user:`dmendek`. (:issue:`1995`) - Evaluate factor conditions for ``command`` keys - by :user:`jugmac00`. (:issue:`2002`) - Prefer f-strings instead of the str.format method - by :user:`eumiro`. (:issue:`2012`) - Fix regex validation for SHA 512 hashes - by :user:`jugmac00`. (:issue:`2018`) - Actually run all environments when ``ALL`` is provided to the legacy env command - by :user:`jugmac00`. (:issue:`2112`) - Move from ``appdirs`` to ``platformdirs`` - by :user:`gaborbernat`. (:pr:`2117`) - Move from ``toml`` to ``tomli`` - by :user:`gaborbernat`. (:pr:`2118`) Improved Documentation - 4.0.0a7 ================================ - Start documenting the plugin interface. Added :meth:`tox_register_tox_env `, :meth:`tox_add_option `, :meth:`tox_add_core_config `, ``tox_configure`` - by :user:`gaborbernat`. (:pr:`1991`) - Explain how ``-v`` and ``-q`` flags play together to determine CLI verbosity level - by :user:`jugmac00`. (:issue:`2005`) - Start polishing the documentation for the upcoming final release - by :user:`jugmac00`. (:pr:`2006`) - Update documentation about changelog entries for trivial changes - by :user:`jugmac00`. (:issue:`2007`) *********************** v4.0.0a6 (2021-02-15) *********************** Features - 4.0.0a6 ================== - Add basic quickstart implementation (just use pytest with the current Python version) - by :user:`gaborbernat`. (:issue:`1829`) - Support comments via the ``#`` character within the ini configuration (to force a literal ``#`` use ``\#``) - by :user:`gaborbernat`. (:issue:`1831`) - Add support for the ``install_command`` settings in the virtual env test environments - by :user:`gaborbernat`. (:issue:`1832`) - Add support for the ``package_root`` ``setupdir`` ( Python scoped) configuration that sets the root directory used for packaging (the location of the historical ``setup.py`` and modern ``pyproject.toml``). This can be set at root level, or at tox environment level (the later takes precedence over the former) - by :user:`gaborbernat`. (:issue:`1838`) - Implement support for the ``--installpkg`` CLI flag - by :user:`gaborbernat`. (:issue:`1839`) - Add support for the ``list_dependencies_command`` settings in the virtual env test environments - by :user:`gaborbernat`. (:issue:`1842`) - Add support for the ``ignore_errors`` settings in tox test environments - by :user:`gaborbernat`. (:issue:`1843`) - Add support for the ``pip_pre`` settings for virtual environment based tox environments - by :user:`gaborbernat`. (:issue:`1844`) - Add support for the ``platform`` settings in tox test environments - by :user:`gaborbernat`. (:issue:`1845`) - Add support for the ``recreate`` settings in tox test environments - by :user:`gaborbernat`. (:issue:`1846`) - Allow Python test and packaging environments with version 2.7 - by :user:`gaborbernat`. (:pr:`1900`) - Do not construct a requirements file for deps in virtualenv, instead pass content as CLI argument to pip - by :user:`gaborbernat`. (:pr:`1906`) - Do not display status update environment reports when interrupted or for the final environment ran (because at the final report will be soon printed and makes the status update redundant) - by :user:`gaborbernat`. (:issue:`1909`) - The ``_TOX_SHOW_THREAD`` environment variable can be used to print alive threads when tox exists (useful to debug when tox hangs because of some non-finished thread) and also now prints the pid of the local subprocess when reporting the outcome of an execution - by :user:`gaborbernat`. (:pr:`1915`) Bugfixes - 4.0.0a6 ================== - Normalize description text to collapse newlines and one or more than whitespace to a single space - by :user:`gaborbernat`. (:issue:`1829`) - Support aliases in show config key specification (will print with the primary key) - by :user:`gaborbernat`. (:issue:`1831`) - Show config no longer marks as unused keys that are inherited (e.g. if the key is coming from ``testenv`` section and our target is ``testenv:fix``) - by :user:`gaborbernat`. (:issue:`1833`) - ``--alwayscopy`` and ``--sitepackages`` legacy only flags do not work - by :user:`gaborbernat`. (:issue:`1839`) - Fix handling of ``commands_pre``/``commands``/``commands_post`` to be in line with tox 3 (returned incorrect exit codes and post was not always executed) - by :user:`gaborbernat`. (:issue:`1843`) - Support requirement files containing ``--hash`` constraints - by :user:`gaborbernat`. (:issue:`1903`) - Fix a bug that caused tox to never finish when pulling configuration from a tox run environment that was never executed - by :user:`gaborbernat`. (:pr:`1915`) Deprecations and Removals - 4.0.0a6 =================================== - - Drop support for ``sdistsrc`` flag because introduces a significant complexity and is barely used (5 hits on a github search). - ``--skip-missing-interpreters``, ``--notest``, ``--sdistonly``, ``--installpkg``, ``--develop`` and ``--skip-pkg-install`` CLI flags are no longer available for ``devenv`` (enforce the only sane value for these). By :user:`gaborbernat` (:issue:`1839`) - Remove Jenkins override support: this feature goes against the spirit of tox - blurring the line between the CI and local runs. It also singles out a single CI provider, which opens the door for other CIs wanting similar functionality. Finally, only 54 code file examples came back on a Github search, showing this is a not widely used feature. People who still want Jenkins override support may create a tox plugin to achieve this functionality - by :user:`gaborbernat`. (:issue:`1841`) *********************** v4.0.0a5 (2021-01-23) *********************** Features - 4.0.0a5 ================== - Support the ``system_site_packages``/``sitepackages`` flag for virtual environment based tox environments - by :user:`gaborbernat`. (:issue:`1847`) - Support the ``always_copy``/``alwayscopy`` flag for virtual environment based tox environments - by :user:`gaborbernat`. (:issue:`1848`) - Support the ``download`` flag for virtual environment based tox environments - by :user:`gaborbernat`. (:issue:`1849`) - Recreate virtual environment based tox environments when the ``virtualenv`` version changes - by :user:`gaborbernat`. (:issue:`1865`) Bugfixes - 4.0.0a5 ================== - Not all package dependencies are installed when different tox environments in the same run use different set of extras - by :user:`gaborbernat`. (:issue:`1868`) - Support ``=`` separator in requirement file flags, directories as requirements and correctly set the root of the requirements file when using the ``--root`` CLI flag to change the root - by :user:`gaborbernat`. (:issue:`1853`) - Cleanup local subprocess file handlers when exiting runs (fixes ``ResourceWarning: unclosed file`` errors when running with ``env PYTHONTRACEMALLOC=5 PYTHONDEVMODE=y`` under a Python built with ``--with-pydebug``) - by :user:`gaborbernat`. (:issue:`1857`) - Various small bugfixes: - honor updating default environment variables set by internal tox via set env (``PIP_DISABLE_PIP_VERSION_CHECK``) - do not multi-wrap ``HandledError`` in the ini file loader, - skipped environments are logged now with their fail message at default verbosity level, - fix an error that made the show configuration command crash when making the string of a config value failed, - support empty-new lines within the set env configurations replacements, by :user:`gaborbernat`. (:pr:`1864`) Improved Documentation - 4.0.0a5 ================================ - Add CLI documentation - by :user:`gaborbernat`. (:pr:`1852`) *********************** v4.0.0a4 (2021-01-16) *********************** Features - 4.0.0a4 ================== - Use ``.tox/4`` instead of ``.tox4`` folder (so ignores for tox 3 works for tox 4 too), reminder we'll rename this to just ``.tox`` before public release, however to encourage testing tox 4 in parallel with tox 3 this is helpful - by :user:`gaborbernat`. (:discussion:`1812`) - Colorize the ``config`` command: section headers are yellow, keys are green, values remained white, exceptions are light red and comments are cyan - by :user:`gaborbernat`. (:pr:`1821`) Bugfixes - 4.0.0a4 ================== - Support legacy format (``-cconstraint.txt``) of constraint files in ``deps``, and expand constraint files too when viewing inside the ``deps`` or calculating weather our environment is up to date or not - by :user:`gaborbernat`. (:issue:`1788`) - When specifying requirements/editable/constraint paths within ``deps`` escape space, unless already escaped to support running specifying transitive requirements files within deps - by :user:`gaborbernat`. (:issue:`1792`) - When using a provisioned tox environment requesting ``--recreate`` failed with ``AttributeError`` - by :user:`gaborbernat`. (:issue:`1793`) - Fix ``RequirementsFile`` from tox is rendered incorrectly in ``config`` command - by :user:`gaborbernat`. (:issue:`1820`) - Fix a bug in the configuration system where referring to the same named key in another env/section causes circular dependency error - by :user:`gaborbernat`. (:pr:`1821`) - Raise ``ValueError`` with descriptive message when a requirements file specified does not exist - by :user:`gaborbernat`. (:pr:`1828`) - Support all valid requirement file specification without delimiting space in the ``deps`` of the ``tox.ini`` - by :user:`gaborbernat`. (:issue:`1834`) Improved Documentation - 4.0.0a4 ================================ - Add code style guide for contributors - by :user:`gaborbernat`. (:issue:`1734`) *********************** v4.0.0a3 (2021-01-13) *********************** Features - 4.0.0a3 ================== - Raise exception when set env enters into a circular reference - by :user:`gaborbernat`. (:issue:`1779`) - - Raise exception when variable substitution enters into a circle. - Add ``{/}`` as substitution for os specific path separator. - Add ``{env_bin_dir}`` constant substitution. - Implement support for ``--discover`` flag - by :user:`gaborbernat`. (:pr:`1784`) Bugfixes - 4.0.0a3 ================== - Entries in the ``set_env`` does not reference environments from ``set_env`` - by :user:`gaborbernat`. (:issue:`1776`) - ``env`` substitution does not uses values from ``set_env`` - by :user:`gaborbernat`. (:issue:`1779`) - Adopt tox 3 base pass env list, by adding: - on all platforms: ``LANG``, ``LANGUAGE``, ``CURL_CA_BUNDLE``, ``SSL_CERT_FILE`` , ``LD_LIBRARY_PATH`` and ``REQUESTS_CA_BUNLDE``, - on Windows: ``SYSTEMDRIVE`` - by :user:`gaborbernat`. (:issue:`1780`) - Fixed a bug that crashed tox where calling tox with the recreate flag and when multiple environments were reusing the same package - by :user:`gaborbernat`. (:issue:`1782`) - - Python version markers are stripped in package dependencies (after wrongfully being detected as an extra marker). - In packaging APIs do not set ``PYTHONPATH`` (to empty string) if ``backend-path`` is empty. - Fix commands parsing on Windows (do not auto-escape ``\`` - instead users should use the new ``{\}``, and on parsed arguments strip both ``'`` and ``"`` quoted outcomes). - Allow windows paths in substitution set/default (the ``:`` character used to separate substitution arguments may also be present in paths on Windows - do not support single capital letter values as substitution arguments) - by :user:`gaborbernat`. (:pr:`1784`) - Rework how we handle Python packaging environments: - the base packaging environment changed from ``.package`` to ``.pkg``, - merged the ``sdist``, ``wheel`` and ``dev`` separate packaging implementations into one, and internally dynamically pick the one that's needed, - the base packaging environment always uses the same Python environment as tox is installed into, - the base packaging environment is used to get the metadata of the project (via PEP-517) and to build ``sdist`` and ``dev`` packages, - for building wheels introduced a new per env configurable option ``wheel_build_env``, if the target Python major/minor and implementation for the run tox environment and the base package tox environment matches set this to ``.pkg``, otherwise this is ``.pkg-{implementation}{major}{minor}``, - internally now packaging environments can create further packaging environments they are responsible of managing, - updated ``depends`` to use the packaging logic, - add support skip missing interpreters for depends and show config, by :user:`gaborbernat`. (:issue:`1804`) *********************** v4.0.0a2 (2021-01-09) *********************** Features - 4.0.0a2 ================== - Add option to disable colored output, and support ``NO_COLOR`` and ``FORCE_COLOR`` environment variables - by :user:`gaborbernat`. (:pr:`1630`) Bugfixes - 4.0.0a2 ================== - Fix coverage generation in CI - by :user:`gaborbernat`. (:pr:`1551`) - Fix the CI failures: - drop Python 3.5 support as it's not expected to get to a release before EOL, - fix test using ``\n`` instead of ``os.linesep``, - Windows Python 3.6 does not contain ``_overlapped.ReadFileInto`` - by :user:`gaborbernat`. (:pr:`1556`) Improved Documentation - 4.0.0a2 ================================ - Add base documentation by merging virtualenv structure with tox 3 - by :user:`gaborbernat`. (:pr:`1551`) ********** v4.0.0a1 ********** - First version all is brand new. .. warning:: The current tox is the second iteration of implementation. From version ``0.5`` all the way to ``3.X`` we numbered the first iteration. Version ``4.0.0a1`` is a complete rewrite of the package, and as such this release history starts from there. The old changelog is still available in the `legacy branch documentation `_. tox-dev-tox-1f1fcc7/docs/changelog/000077500000000000000000000000001520067562700172755ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/docs/changelog/template.jinja2000066400000000000000000000022771520067562700222170ustar00rootroot00000000000000{% set top_underline = "*" %} {% set underline = "=" %} {% if versiondata.name %} {{ top_underline * ((versiondata.version + versiondata.date)|length + 5)}} v{{ versiondata.version }} ({{ versiondata.date }}) {{ top_underline * ((versiondata.version + versiondata.date)|length + 5)}} {% else %} {{ top_underline * ((versiondata.version + versiondata.date)|length + 4)}} {{ versiondata.version }} ({{ versiondata.date }}) {{ top_underline * ((versiondata.version + versiondata.date)|length + 4)}} {% endif %} {% for section, _ in sections.items() %} {% if sections[section] %} {% for category, val in definitions.items() if category in sections[section]%} {{ definitions[category]['name'] }} - {{ versiondata.version }} {{ underline * ((definitions[category]['name'] + versiondata.version)|length + 3)}} {% if definitions[category]['showcontent'] %} {% for text, values in sections[section][category].items() %} - {{ text }} ({{ values|join(', ') }}) {% endfor %} {% else %} - {{ sections[section][category]['']|join(', ') }} {% endif %} {% if sections[section][category]|length == 0 %} No significant changes. {% else %} {% endif %} {% endfor %} {% else %} No significant changes. {% endif %} {% endfor %} tox-dev-tox-1f1fcc7/docs/conf.py000066400000000000000000000146161520067562700166550ustar00rootroot00000000000000from __future__ import annotations import re from importlib.machinery import SourceFileLoader from pathlib import Path from typing import TYPE_CHECKING, Any from sphinx.domains.python import PythonDomain from sphinx.ext.extlinks import ExternalLinksChecker from truststore import inject_into_ssl from tox import __version__ if TYPE_CHECKING: from docutils.nodes import Element, reference from sphinx.addnodes import pending_xref from sphinx.application import Sphinx from sphinx.builders import Builder from sphinx.environment import BuildEnvironment from sphinx.ext.autodoc import Options company, name = "tox-dev", "tox" project = name release, version = __version__, ".".join(__version__.split(".")[:2]) copyright = f"{company}" # noqa: A001 master_doc = "index" source_suffix = {".rst": "restructuredtext"} html_theme = "furo" html_theme_options = { "sidebar_hide_name": True, } html_title, html_last_updated_fmt = "tox", "%Y-%m-%dT%H:%M:%S" html_show_sourcelink = False pygments_style, pygments_dark_style = "sphinx", "monokai" html_static_path, html_css_files = ["_static"], ["custom.css"] html_js_files = ["mermaid-reset.js"] html_logo, html_favicon = "_static/img/tox.svg", "_static/img/toxfavi.ico" extensions = [ "sphinx.ext.autodoc", "sphinx.ext.autosectionlabel", "sphinx.ext.extlinks", "sphinx.ext.intersphinx", "sphinx_argparse_cli", "sphinx_autodoc_typehints", "sphinx_inline_tabs", "sphinx_copybutton", "sphinx_issues", # :user: and similar roles "sphinxcontrib.mermaid", "sphinxcontrib.towncrier.ext", "sphinx_reredirects", ] mermaid_output_format = "raw" mermaid_d3_zoom = True mermaid_height = "auto" exclude_patterns = ["_build", "changelog/*"] autoclass_content, autodoc_member_order, autodoc_typehints = "class", "bysource", "none" autodoc_default_options = { "member-order": "bysource", "undoc-members": True, "show-inheritance": True, } autosectionlabel_prefix_document = True extlinks = { "discussion": ("https://github.com/tox-dev/tox/discussions/%s", "#%s"), "gh_repo": ("https://github.com/%s", "%s"), "gh": ("https://github.com/%s", "%s"), } intersphinx_mapping = { "python": ("https://docs.python.org/3", None), "packaging": ("https://packaging.pypa.io/en/latest", None), } nitpicky = True nitpick_ignore = [] linkcheck_workers = 10 linkcheck_ignore = [ re.escape(i) for i in ( r"https://github.com/tox-dev/tox/issues/new?title=Trouble+with+development+environment", r"https://porkbun.com/", # has captcha on it that makes it return with 405 r"https://opensource.org/license/mit", ) ] linkcheck_allowed_redirects = {r"https://github.com/tox-dev/tox/issues/\d+": r"https://github.com/tox-dev/tox/pull/\d+"} extlinks_detect_hardcoded_links = True issues_github_path = f"{company}/{name}" # `sphinx-issues` ext # Man page configuration man_pages = [("man/tox.1", "tox", "virtualenv-based automation of test activities", [], 1)] man_show_urls = True redirects = { "config": "reference/config.html", "cli_interface": "reference/cli.html", "user_guide": "explanation.html", "installation": "how-to/install.html", "howto": "how-to/usage.html", "getting_started": "tutorial/getting-started.html", "plugins": "plugin/index.html", "plugins_api": "plugin/api.html", "plugins/index": "plugin/index.html", "plugins/api": "plugin/api.html", "plugins/getting_started": "plugin/getting_started.html", "plugins/howto": "plugin/howto.html", "upgrading": "index.html", "faq": "index.html", "example/general": "index.html", "example/basic": "index.html", "example/devenv": "index.html", "example/documentation": "index.html", "example/jenkins": "index.html", "example/nose": "index.html", "example/package": "index.html", "example/platform": "index.html", "example/pytest": "index.html", "example/result": "index.html", "example/unittest": "index.html", } towncrier_draft_autoversion_mode = "draft" towncrier_draft_include_empty = True towncrier_draft_working_directory = Path(__file__).parent.parent def process_signature( # noqa: PLR0913 app: Sphinx, # noqa: ARG001 objtype: str, name: str, # noqa: ARG001 obj: Any, # noqa: ARG001 options: Options, args: str | None, # noqa: ARG001 retann: str | None, # noqa: ARG001 ) -> tuple[None, None] | None: # skip-member is not checked for class level docs, so disable via signature processing if objtype == "class" and (exclude := options.get("exclude-members")) and "__init__" in exclude: return None, None return None def setup(app: Sphinx) -> None: here = Path(__file__).parent class PatchedPythonDomain(PythonDomain): def resolve_xref( # noqa: PLR0913 self, env: BuildEnvironment, fromdocname: str, builder: Builder, type: str, # noqa: A002 target: str, node: pending_xref, contnode: Element, ) -> reference | None: # fixup some wrongly resolved mappings mapping = { "tox.config.of_type.T": "typing.TypeVar", # used by Sphinx bases "tox.config.loader.api.T": "typing.TypeVar", # used by Sphinx bases "tox.config.loader.convert.T": "typing.TypeVar", # used by Sphinx bases "tox.tox_env.installer.T": "typing.TypeVar", # used by Sphinx bases "pathlib._local.Path": "pathlib.Path", } if target in mapping: target = node["reftarget"] = mapping[target] return super().resolve_xref(env, fromdocname, builder, type, target, node, contnode) app.connect("autodoc-process-signature", process_signature, priority=400) app.add_domain(PatchedPythonDomain, override=True) tox_cfg = SourceFileLoader("tox_conf", str(here / "tox_conf.py")).load_module().ToxConfig app.add_directive(tox_cfg.name, tox_cfg) def check_uri(self: ExternalLinksChecker, refnode: reference) -> None: if refnode.document is not None and refnode.document.attributes["source"].endswith("index.rst"): return None # do not use for the index file return prev_check(self, refnode) prev_check = ExternalLinksChecker.check_uri ExternalLinksChecker.check_uri = check_uri # ty: ignore[invalid-assignment] # monkey-patching instance method onto class inject_into_ssl() tox-dev-tox-1f1fcc7/docs/development.rst000066400000000000000000000373341520067562700204340ustar00rootroot00000000000000############# Development ############# .. toctree:: :hidden: onboarding ************ Key points ************ If you're already experienced with submitting GitHub PRs to open-source Python projects, the following are the key points you need to know about this project. (If you're not, you should carefully read all the documentation after this section. This section contains only highlights; it's not a substitute for reading this entire file.) - Check the `style guide <#code-style-guide>`_ below. Note that ``tox -e fix`` will not catch the following: - Lines wrapped at less than 120 characters. Lines should be wrapped at 120 characters, not the PEP-8 standard of 79. - Variable names should be at least two characters long. - Documentation is in `RST `_ format; beware the differences from GitHub Markdown. The tox ``docs`` and ``fix`` targets will catch only some RST errors; documentation changes *must* be checked visually (see below). - All PRs that make changes visible to an end user require a changelog entry. This should reference an issue if it closes that issue, otherwise reference the PR. Create one or more (if there's more than one issue) ``docs/changelog/####.{breaking,deprecation,feature,bugfix,doc,packaging,contrib,misc}.rst`` per the `changelog entry <#changelog-entries>`_ section below. - GitHub Actions will do a full set of `tests and checks <#automated-testing>`_ when the PR is submitted. For local testing you'll need to install your own "top-level" tox (using pipx_ or similar is fine) and use the following targets (tox environments): - :samp:`tox -e py [-- {pytest-arg ...}]` to `test code changes <#running-tests>`_. This will skip tests for which you are missing dependencies, but those tests will still be run by GitHub Actions. - ``tox -e type`` to typecheck changes. (All new code should have complete type annotations.) - ``tox -e docs`` to build documentation changes and update the changelog, followed by viewing (with a browser) the generated HTML files under :file:`.tox/docs_out/html/`. The required changelog entry can be viewed at the "Release History" link at the left. - ``tox -e fix`` to lint code, documentation and any other changes to the repo. This will also fix the code and write out the changed files; you can update your commit with `git commit --amend`. ***************** Getting started ***************** ``tox`` is a volunteer maintained open source project and we welcome contributions of all forms. The sections below will help you get started with development, testing, and documentation. We’re pleased that you are interested in working on tox. This document is meant to get you setup to work on tox and to act as a guide and reference to the development setup. If you face any issues during this process, please :issue:`open an issue ` about it on the issue tracker. Setup ===== tox is a command line application written in Python. To work on it, you'll need: - **Source code**: available on :gh_repo:`GitHub `. You can use ``git`` to clone the repository: .. code-block:: shell git clone https://github.com/tox-dev/tox cd tox - **Python interpreter**: We recommend using ``CPython``. You can use `this guide `_ to set it up. - :pypi:`tox`: to automatically get the projects development dependencies and run the test suite. We recommend installing it using `pipx `_. Running from source tree ======================== The easiest way to do this is to generate the development tox environment, and then invoke tox from under the ``.tox/dev`` folder .. code-block:: shell tox -e dev .tox/dev/bin/tox # on Linux .tox/dev/Scripts/tox # on Windows Running tests ============= tox's tests are written using the :pypi:`pytest` test framework. :pypi:`tox` is used to automate the setup and execution of tox's tests. To run tests locally execute: .. code-block:: shell tox -e py This will run the test suite for the same Python version as under which ``tox`` is installed. Alternatively you can specify a specific version of Python by using the ``pyNN`` format, such as: ``py38``, ``pypy3``, etc. ``tox`` has been configured to forward any additional arguments it is given to ``pytest``. This enables the use of pytest's `rich CLI `_. As an example, you can select tests using the various ways that pytest provides: .. code-block:: shell # Using markers tox -e py -- -m "not slow" # Using keywords tox -e py -- -k "test_extra" Some tests require additional dependencies to be run, such is the various shell activators (``bash``, ``fish``, ``powershell``, etc). The tests will be skipped automatically if the dependencies are not present. Please note however that in CI all tests are run; so even if all tests succeed locally for you, they may still fail in the CI. Running linters =============== tox uses :pypi:`pre-commit` for managing linting of the codebase. ``pre-commit`` performs various checks on all files in tox and uses tools that help following a consistent code style within the codebase. To use linters locally, run: .. code-block:: shell tox -e fix .. note:: Avoid using ``# noqa`` comments to suppress linter warnings - wherever possible, warnings should be fixed instead. ``# noqa`` comments are reserved for rare cases where the recommended style causes severe readability problems or sidestep bugs within the linters. Code style guide ================ - First and foremost, the linters configured for the project must pass; this generally means following PEP-8 rules, as codified by ``ruff`` (which replaces the previously used ``flake8``, ``black``, ``isort``, and ``pyupgrade``). - The supported Python versions (and the code syntax to use) are listed in the ``pyproject.toml`` file in the ``project/requires-python`` entry. - All code (tests too) must be type annotated as much as required by ``mypy``. - We use a line length of 120. - Exception messages should only be capitalized (and ended with a period/exclamation mark) if they are multi-sentenced, which should be avoided. Otherwise, use statements that start with lowercase. - All function (including test) names must follow PEP-8, so they must be fully snake cased. All classes are upper camel-cased. - Prefer f-strings instead of the ``str.format`` method. - Tests should contain as little information as possible but do use descriptive variable names within it. Building documentation ====================== tox's documentation is built using :pypi:`Sphinx`. The documentation is written in reStructuredText. To build it locally, run: .. code-block:: shell tox -e docs The built documentation can be found in the ``.tox/docs_out/html`` folder and may be viewed by opening ``index.html`` within that folder. ************** Contributing ************** Submitting pull requests ======================== Submit pull requests (PRs) against the ``main`` branch, providing a good description of what you're doing and why. You must have legal permission to distribute any code you contribute to tox and it must be available under the MIT License. Provide tests that cover your changes and run the tests locally first. tox :ref:`supports ` multiple Python versions and operating systems. Any pull request must consider and work on all these platforms. Pull requests should be small to facilitate review. Keep them self-contained, and limited in scope. Studies have shown that review quality falls off as patch size grows. In particular, pull requests must not be treated as "feature branches", with ongoing development work happening within the PR. Instead, the feature should be broken up into smaller, independent parts which can be reviewed and merged individually. Additionally, avoid including "cosmetic" changes to code that is unrelated to your change, as these make reviewing the PR more difficult. Examples include re-flowing text in comments or documentation, or addition or removal of blank lines or whitespace within lines. Such changes can be made separately, as a "formatting cleanup" PR, if needed. Automated testing ================= All pull requests and merges to the ``main`` branch are tested using :gh:`GitHub Actions ` (configured by ``check.yaml`` file inside the ``.github/workflows`` directory). You can find the status and the results to the CI runs for your PR on GitHub's Web UI for the pull request. You can also find links to the CI services' pages for the specific builds in the form of "Details" links, in case the CI run fails and you wish to view the output. To trigger CI to run again for a pull request, you can close and open the pull request or submit another change to the pull request. If needed, project maintainers can manually trigger a restart of a job/build. Changelog entries ================= The ``changelog.rst`` file is managed using :pypi:`towncrier` and all changes must be accompanied by a changelog entry. To add an entry to the changelog, first you need to have created an issue describing the change you want to make. A pull request itself *may* function as such, but it is preferred to have a dedicated issue (for example, in case the PR ends up rejected due to code quality reasons). There is no need to create an issue for trivial changes, e.g. for typo fixes. Once you have an issue or pull request, you take the number and you create a file inside of the ``docs/changelog`` directory named after that issue number with an extension of: - ``breaking.rst`` - backward incompatible changes, - ``deprecation.rst`` - deprecations (removal in next major release), - ``feature.rst`` - new features, - ``bugfix.rst`` - bug fixes, - ``doc.rst`` - documentation improvements, - ``packaging.rst`` - packaging updates and notes for downstreams, - ``contrib.rst`` - contributor-facing changes, - ``misc.rst`` - miscellaneous internal changes. Thus if your issue or PR number is ``1234`` and this change is fixing a bug, then you would create a file ``docs/changelog/1234.bugfix.rst``. PRs can span multiple categories by creating multiple files (for instance, if you added a feature and deprecated/removed the old feature at the same time, you would create ``docs/changelog/1234.bugfix.rst`` and ``docs/changelog/1234.deprecation.rst``). Likewise if a PR touches multiple issues/PRs you may create a file for each of them with the same contents and :pypi:`towncrier` will deduplicate them. Contents of a changelog entry ----------------------------- The content of this file is reStructuredText formatted text that will be used as the content of the changelog entry. You do not need to reference the issue or PR numbers here as towncrier will automatically add a reference to all of the affected issues when rendering the changelog. You may append ``- by :user:USERNAME``, with a GitHub username in backticks, if you wish. In order to maintain a consistent style in the ``changelog.rst`` file, it is preferred to keep the entries to the point, in sentence case, shorter than 120 characters and in an imperative tone -- an entry should complete the sentence ``This change will …``. In rare cases, where one line is not enough, use a summary line in an imperative tone followed by a blank line separating it from a description of the feature/change in one or more paragraphs, each wrapped at 120 characters. Remember that a changelog entry is meant for end users and should only contain details relevant to an end user. An example of ``docs/changelog/####.bugfix.rst`` contents is: .. code-block:: Instead of raising ``UnicodeDecodeError`` when command output includes non-utf-8 bytes, ``tox`` will now use ``surrogateescape`` error handling to convert the unrecognized bytes to escape sequences according to :pep:`383` - by :user:`masenf` Becoming a maintainer ===================== If you want to become an official maintainer, start by helping out. As a first step, we welcome you to triage issues on tox's issue tracker. tox maintainers provide triage abilities to contributors once they have been around for some time and contributed positively to the project. This is optional and highly recommended for becoming a tox maintainer. Later, when you think you're ready, get in touch with one of the maintainers and they will initiate a vote among the existing maintainers. .. note:: Upon becoming a maintainer, a person should be given access to various tox-related tooling across multiple platforms. These are noted here for future reference by the maintainers: - GitHub Push Access (provides also CI administration capabilities) - PyPI Publishing Access - ReadTheDocs Administration capabilities (the root domain `tox.wiki `_ is currently owned and maintained by the primary maintainer and author ``Bernat Gabor``; bought via `Porkbun `_ -- reach out to him directly for any changes). Creating a new release ====================== tox supports two methods for preparing releases: Method 1: Local release (requires git access) --------------------------------------------- .. code-block:: shell tox r -e release -- Example: .. code-block:: shell tox r -e release -- 4.27.0 This will: 1. Create a ``release-`` branch from upstream/main. 2. Generate changelog using towncrier. 3. Commit changes with message "release ". 4. Tag the commit with the version number. 5. Force-push to main and push the tag. 6. Clean up local branches. Requirements: - Write access to tox-dev/tox repository. - Configured git remote pointing to tox-dev/tox (typically named ``upstream``). .. code-block:: shell git remote add upstream git@github.com:tox-dev/tox.git - Local dependencies installed via tox. Method 2: GitHub Actions workflow dispatch ------------------------------------------ Navigate to `Actions > Prepare Release `_ and: 1. Click "Run workflow". 2. Select the branch (usually ``main``). 3. Choose the version bump type: - ``auto`` (default) - Automatically bump minor if feature changelogs exist, otherwise bump patch. - ``major`` - Bump major version (e.g., 4.0.0 → 5.0.0). - ``minor`` - Bump minor version (e.g., 4.27.0 → 4.28.0). - ``patch`` - Bump patch version (e.g., 4.27.0 → 4.27.1). 4. Click "Run workflow". The workflow executes the same ``tasks/release.py`` script in a clean CI environment. Requirements: - Write access to tox-dev/tox repository (workflow permissions). - For repositories with branch protection on ``main``, a ``RELEASE_PAT`` secret must be configured in the ``release-auth`` environment with a fine-grained Personal Access Token that has permissions to bypass branch protection rules. - Maintainer approval is required to trigger the workflow (configured via environment protection rules). After release preparation ------------------------- Both methods push a tag to the repository. The tag push automatically triggers the ``release.yaml`` workflow which: 1. Builds Python packages (sdist + wheel). 2. Publishes to PyPI via trusted publishing. .. note:: - Both methods force-push to main (ensure no concurrent work). - The release process is atomic and should not be interrupted. - Failed releases can be retried with the same version number. .. _current-maintainers: Current maintainers ------------------- - :user:`Bernát Gábor ` - :user:`Jürgen Gmach ` - :user:`Rahul Devikar ` Previous maintainers -------------------- - :user:`Anthony Sottile ` - :user:`Masen Furer ` - :user:`Oliver Bestwalter ` tox-dev-tox-1f1fcc7/docs/explanation.rst000066400000000000000000001121521520067562700204240ustar00rootroot00000000000000########## Concepts ########## ********** Overview ********** tox is an environment orchestrator. Use it to define how to set up and execute various tools on your projects. The tool can set up environments for and invoke: - test runners (such as :pypi:`pytest`), - linters (e.g., :pypi:`ruff`), - formatters (for example :pypi:`black` or :pypi:`isort`), - documentation generators (e.g., :pypi:`Sphinx`), - build and publishing tools (e.g., :pypi:`build` with :pypi:`twine`), - ... For a step-by-step introduction, see the :doc:`tutorial/getting-started` tutorial. For practical recipes, see :doc:`how-to/usage`. ***************** System overview ***************** Below is a graphical representation of the tox lifecycle: .. mermaid:: flowchart TD start(( )) --> config[Load configuration] config --> envloop subgraph envloop [for each selected environment] direction TB create[Create environment] create --> depmode{pylock set?} depmode -- yes --> pylock[Install from pylock.toml] depmode -- no --> deps[Install deps + dependency groups] pylock --> pkg{package project?} deps --> pkg pkg -- yes --> build[Build and install package] pkg -- no --> extra build --> extra[Run extra_setup_commands] extra --> cmds cmds[Run commands] end cmds --> report[Report results] report --> done(( )) classDef configStyle fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a5f classDef envStyle fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d classDef pkgStyle fill:#ffedd5,stroke:#f97316,stroke-width:2px,color:#7c2d12 classDef setupStyle fill:#fde68a,stroke:#fbbf24,stroke-width:2px,color:#78350f classDef cmdStyle fill:#ede9fe,stroke:#8b5cf6,stroke-width:2px,color:#3b0764 classDef reportStyle fill:#ccfbf1,stroke:#14b8a6,stroke-width:2px,color:#134e4a classDef decisionStyle fill:#fef9c3,stroke:#eab308,stroke-width:2px,color:#713f12 classDef pylockStyle fill:#e0e7ff,stroke:#6366f1,stroke-width:2px,color:#312e81 class config configStyle class create,deps envStyle class build pkgStyle class extra setupStyle class cmds cmdStyle class report reportStyle class depmode,pkg decisionStyle class pylock pylockStyle The primary tox states are: 1. **Configuration:** load tox configuration files (such as ``tox.toml``, ``tox.ini``, ``pyproject.toml`` and ``toxfile.py``) and merge it with options from the command line plus the operating system environment variables. Configuration is loaded lazily -- individual environment settings are only read when that environment is used. 2. **Environment**: for each selected tox environment (e.g. ``3.13``, ``lint``) do: 1. **Creation**: create a fresh environment; by default :pypi:`virtualenv` is used, but configurable via :ref:`runner`. For ``virtualenv`` tox will use the `virtualenv discovery logic `_ where the python specification is defined by the tox environments :ref:`base_python` (if not set will try to extract it from the environment name, then fall back to :ref:`default_base_python`, and finally to the Python running tox). The specification can include a CPU architecture suffix (e.g. ``cpython3.12-64-arm64``) to constrain discovery to a specific ISA — the architecture is derived from :func:`python:sysconfig.get_platform` and validated after discovery. This is created at first run only to be reused at subsequent runs. If certain aspects of the project change (python version, dependencies removed, etc.), a re-creation of the environment is automatically triggered. To force the recreation tox can be invoked with the :ref:`recreate` flag (``-r``). When recreation occurs, any :ref:`recreate_commands` run inside the old environment before its directory is removed -- this lets tools like pre-commit clean their external caches. Failures in these commands are logged as warnings but never block the recreation. 2. **Install dependencies** (optional): install the environment dependencies. When :ref:`pylock` is set, tox installs locked dependencies from the :PEP:`751` lock file (filtered by extras, dependency groups, and platform markers). Otherwise, it installs :ref:`deps` and :ref:`dependency_groups`. By default ``pip`` is used to install packages, however one can customize this via ``install_command``. 3. **Packaging** (optional): create a distribution of the current project (see :ref:`packaging` below). Steps 2 and 3 can be selectively skipped with CLI flags: - ``--skip-pkg-install`` skips step 3 only (packaging and package installation), while still installing dependencies. - ``--skip-env-install`` skips both steps 2 and 3 entirely, reusing the environment as-is. This is useful when working offline or when the environment is already fully set up from a previous run. See :ref:`skip-env-install` for practical usage. 4. **Extra setup commands** (optional): run the :ref:`extra_setup_commands` specified. These execute after all installations complete but before test commands, and run during the ``--notest`` phase. 5. **Commands**: run the specified commands in the specified order. Whenever the exit code of any of them is not zero, stop and mark the environment failed. When you start a command with a dash character, the exit code will be ignored. If :ref:`commands_retry` is set, failed commands are retried up to the configured number of times before being treated as a failure. 3. **Report** print out a report of outcomes for each tox environment: .. code-block:: bash ____________________ summary ____________________ 3.13: commands succeeded ERROR: 3.12: commands failed Only if all environments ran successfully tox will return exit code ``0`` (success). In this case you'll also see the message ``congratulations :)``. Environment variable handling ============================= tox takes care of environment variable isolation. By default, it removes system environment variables not specified via :ref:`pass_env` and alters the ``PATH`` variable so that commands resolve within the current active tox environment. External commands need to be explicitly allowed via :ref:`allowlist_externals`. **Evaluation order**: tox composes the environment for command execution in this order: 1. **pass_env** -- glob patterns are matched against the host ``os.environ``. Matching variables are passed through. 2. **disallow_pass_env** -- exclusion patterns are applied to remove specific variables after ``pass_env`` expansion. 3. **PATH** -- tox prepends the virtual environment's binary directory to ``PATH``, so commands resolve inside the virtualenv first. 4. **set_env** -- values defined here are applied last and can override anything from the previous steps, including ``PATH``. 5. **Injected variables** -- tox adds ``TOX_ENV_NAME``, ``TOX_WORK_DIR``, ``TOX_ENV_DIR``, ``VIRTUAL_ENV``, ``PIP_USER=0``, and ``PYTHONIOENCODING=utf-8``. These cannot be overridden. **PATH behavior**: because tox prepends the virtualenv ``bin/`` directory to ``PATH`` at step 3, commands like ``python`` and ``pip`` resolve to the virtualenv versions. If you override ``PATH`` in ``set_env``, be aware that this replaces the composed ``PATH`` entirely -- you should include ``{env_bin_dir}`` in your custom value to preserve virtualenv resolution: .. tab:: TOML .. code-block:: toml [env_run_base] set_env.PATH = "{env_bin_dir}{:}/usr/local/bin{:}{env:PATH}" .. tab:: INI .. code-block:: ini [testenv] set_env = PATH = {env_bin_dir}{:}/usr/local/bin{:}{env:PATH} **Conditional environment variables**: in INI, ``set_env`` supports PEP 508-style markers separated by ``;`` to conditionally set variables based on platform: .. code-block:: ini [testenv] set_env = COVERAGE_FILE = {work_dir}/.coverage.{env_name} LDFLAGS = -L/usr/local/lib ; sys_platform == "darwin" .. _conditional-values-explained: Conditional value evaluation ============================ .. versionadded:: 4.40 .. versionchanged:: 4.50 Added ``factor['NAME']``/``env['VAR']`` subscript syntax and ``env_name`` variable. TOML configurations support ``replace = "if"`` to conditionally select values at configuration load time. The ``condition`` field accepts expressions that are parsed using Python's ``ast`` module and evaluated against the host ``os.environ``. The expression language supports: - ``env.VAR`` -- resolves to the value of the environment variable ``VAR``, or empty string if unset. An empty string is falsy, any non-empty string is truthy. - ``env['VAR']`` -- same as ``env.VAR``, useful when the variable name needs to be in a string. - ``factor.NAME`` -- resolves to ``True`` if ``NAME`` is a factor in the environment name or platform, ``False`` otherwise. - ``factor['NAME']`` -- same as ``factor.NAME``, for names that aren't valid Python identifiers. Use this for version numbers like ``factor['3.14']`` since ``factor.3.14`` would be a syntax error. - ``env_name`` -- the full environment name as a string (e.g., ``test-3.14``). Use for exact name matching. - ``'literal'`` -- a string literal for comparison. - ``==``, ``!=`` -- string equality and inequality. - ``and``, ``or``, ``not`` -- boolean combinators with standard Python precedence. Conditions are evaluated before ``set_env`` is applied. The ``env.VAR`` lookup reads directly from ``os.environ``, not from the tox ``set_env`` configuration. This avoids circular dependencies -- a ``set_env`` value can use ``replace = "if"`` to check a host variable without triggering a recursive load. Both ``then`` and ``else`` values are processed through the normal TOML replacement pipeline, so they can contain nested substitutions like ``{env_name}`` or ``{ replace = "env", ... }``. Only the selected branch is evaluated. For syntax details and examples, see :ref:`conditional-value-reference`. For practical recipes, see :ref:`howto_conditional_values`. Dependency change detection =========================== tox discovers package dependency changes (via :PEP:`621` or :PEP:`517` ``prepare_metadata_for_build_wheel``/``build_wheel`` metadata). When new dependencies are added they are installed on the next run. When a dependency is removed the entire environment is automatically recreated. This also works for ``requirements`` files within :ref:`deps`. In most cases you should never need to use the ``--recreate`` flag -- tox detects changes and applies them automatically. .. _pylock-explanation: Lock file installation (PEP 751) ================================ .. versionadded:: 4.44 The :ref:`pylock` setting installs dependencies from a :PEP:`751` lock file (``pylock.toml``). It is mutually exclusive with :ref:`deps` — a lock file already contains all transitive dependencies with exact versions, so mixing both sources would create conflicts. Lock files differ from ``deps`` in that every dependency is already resolved — the file contains exact versions, markers, and artifact URLs for every package. **Extras and dependency groups:** lock files can declare ``extras`` and ``dependency-groups`` at the top level, with per-package markers like ``'docs' in extras`` or ``'dev' in dependency_groups``. Use the existing :ref:`extras` and :ref:`dependency_groups` settings to select which groups to include — tox evaluates these markers together with platform markers (``sys_platform``, ``python_version``, etc.) against the **target** Python interpreter (not the host running tox) to filter packages at install time. **How it works today:** pip does not yet support installing from ``pylock.toml`` directly. tox parses the lock file using the ``packaging.pylock`` module, evaluates markers to filter packages, transpiles matching packages to a temporary requirements file (``{env_dir}/pylock.txt``), and passes it to pip with ``--no-deps``. The ``--no-deps`` flag prevents pip from re-resolving transitive dependencies, ensuring the exact versions from the lock file are installed. **Plugin support:** the ``Pylock`` object is passed through the ``tox_on_install`` plugin hook. Installer plugins can inspect it via ``isinstance(arguments, Pylock)`` and handle lock files natively (e.g. ``uv pip install --pylock``) instead of relying on the transpile path. **Future:** when pip gains native ``pylock.toml`` support, the transpile step will be replaced with a direct pip invocation. No configuration changes will be needed. **Change detection** works the same as for ``deps``: tox caches the resolved requirements. When packages are added, only the new ones are installed. When packages are removed, the environment is recreated. .. _pep723-explanation: Inline script metadata (PEP 723) ================================ .. versionadded:: 4.52 :PEP:`723` lets Python scripts declare their dependencies and required Python version directly in comments at the top of the file: .. code-block:: python # /// script # requires-python = ">=3.12" # dependencies = ["requests>=2.31", "rich"] # /// import requests from rich import print print(requests.get("https://httpbin.org/get").json()) The ``virtualenv-pep-723`` runner reads this metadata so that a tox environment needs only a ``runner`` and ``script`` key — no ``deps`` or ``base_python`` duplication. Both ``requires-python`` and ``dependencies`` are optional per the PEP 723 spec; omitting ``requires-python`` uses the host Python, and omitting ``dependencies`` installs nothing. **How it differs from the default runner:** the ``virtualenv-pep-723`` runner skips ``PythonRun`` in the class hierarchy. Config keys like ``deps``, ``extras``, ``dependency_groups``, and ``pylock`` are structurally absent — they do not exist for this runner. Packaging is unconditionally disabled since scripts are not packages. Setting ``base_python`` explicitly is rejected to prevent conflicts with the script's ``requires-python`` specifier. **Python version resolution:** the runner uses the normal Python discovery (env name factors, ``.python-version`` files, or the host Python running tox). When ``requires-python`` is present, tox validates that the discovered Python satisfies the constraint and fails with a clear error if it does not. This works correctly with free-threaded interpreters and avoids forcing an unnecessarily old Python version. **Plugin support:** the ``Pep723Mixin`` class at ``tox.tox_env.python.pep723`` contains all the PEP 723 logic independent of the venv backend. Third-party plugins (e.g. tox-uv) can compose it with their own venv implementation without duplicating code. Open-ended range bounds ======================= Both INI and TOML support generative environment lists with open-ended ranges. INI uses curly-brace syntax (``3.{10-}``), while TOML uses range dicts that appear directly in ``env_list`` (``{ prefix = "3.", start = 10 }``) -- no ``product`` wrapper is needed for a single axis. Instead of probing the system for available interpreters (which would be slow and environment-dependent), tox tracks the `supported CPython versions `_ via two constants: - ``LATEST_PYTHON_MINOR_MIN`` -- the oldest supported CPython minor version (currently **10**, for Python 3.10) - ``LATEST_PYTHON_MINOR_MAX`` -- the latest supported CPython minor version (currently **14**, for Python 3.14) These values are updated with each tox release. A right-open range ``{10-}`` uses ``LATEST_PYTHON_MINOR_MAX`` as its upper bound; a left-open range ``{-13}`` uses ``LATEST_PYTHON_MINOR_MIN`` as its lower bound. This design is deterministic and fast -- the expansion happens at configuration load time with no I/O -- while keeping environment lists future-proof across tox upgrades. Environments for interpreters not installed on the system are naturally skipped by the :ref:`skip_missing_interpreters` setting. Why TOML composes with structured dicts instead of a string DSL --------------------------------------------------------------- INI's ``py3{10-14}-django{42,50}`` expression is a compact mini-language that parses curly-brace groups and numeric ranges out of the string itself. TOML deliberately does not do this. String items in ``env_list`` are always literal environment names; composition happens exclusively through structured dicts (range, labeled, and ``product``). This keeps the contract between configuration and parser minimal: TOML already handles quoting, escaping, and types, so there is no second grammar to learn and no ambiguity between "env name that happens to contain braces" and "expand-this-pattern". It also keeps the loader trivial — there is no string expansion pass, no recursive brace tokeniser, and no interaction with tox's other ``{...}`` substitutions (``{env_name}``, ``{posargs}``, ``{factor:label}``). New matrix ergonomics are added by introducing a new dict shape, not by growing the DSL inside strings. Environment templates (``env_base``) ==================================== tox provides three levels for configuring environments: 1. **``env_run_base``** -- global defaults inherited by all run environments. Use this when every environment shares the same setting (e.g. a common ``deps`` or ``commands``). 2. **``env_base.{name}``** -- named templates that generate multiple environments from factor combinations. Use this when a group of environments shares configuration but differs from other groups. The ``factors`` key defines which environments to generate via Cartesian product; all other keys in the section become the template's defaults. 3. **``env.{name}``** -- explicit per-environment configuration. Use this for one-off environments (like ``lint``) or to override specific settings in a generated environment. The inheritance chain resolves bottom-up: ``env.{name}`` > ``env_base.{template}`` > ``env_run_base``. A setting in ``env.{name}`` shadows the same setting in ``env_base``, which in turn shadows ``env_run_base``. Templates themselves are not runnable environments -- they exist only to define shared configuration. Only the generated environments (template name + factor suffix) appear in ``tox list`` and can be run. For the configuration reference, see :ref:`env-base-templates`. For practical recipes, see :ref:`howto_env_base_matrix`. *************** Main features *************** - **automation of tedious Python related test activities** - **test your Python package against many interpreter and dependency configurations** - automatic customizable (re)creation of :pypi:`virtualenv` test environments - installs your project into each virtual environment - test-tool agnostic: runs pytest, unittest, or any other test runner - **plugin system** to modify tox execution with simple hooks - uses :pypi:`pip` and :pypi:`virtualenv` by default; plugins can replace either - **cross-Python compatible**: tox requires CPython 3.10 and higher, but it can create environments for older versions. Special configuration might be required: :ref:`eol-version-support`. - **cross-platform**: Windows, macOS and Unix style environments - **full interoperability with devpi**: is integrated with and is used for testing in the :pypi:`devpi` system, a versatile PyPI index server and release managing tool - **concise reporting** about tool invocations and configuration errors - supports using different / multiple PyPI index servers .. _packaging: *********** Packaging *********** tox builds projects in a :PEP:`518` compatible virtual environment and communicates with the build backend according to the interface defined in :PEP:`517` and :PEP:`660`. To define package build dependencies and specify the build backend to use, create a ``pyproject.toml`` at the root of the project. For example to use hatch: .. code-block:: toml [build-system] build-backend = "hatchling.build" requires = ["hatchling>=0.22", "hatch-vcs>=0.2"] Package modes ============= The :ref:`package` configuration controls how the project is packaged: .. mermaid:: flowchart TD pkg{package setting} pkg -- sdist --> sdist[sdist — default] pkg -- wheel --> wheel[wheel — faster install] pkg -- sdist-wheel --> sdistwheel[sdist-wheel — build wheel from sdist] pkg -- editable --> editable[editable — PEP 660] pkg -- editable-legacy --> legacy[editable-legacy — pip -e] pkg -- skip --> skip[skip — no packaging] pkg -- external --> external[external — provided] sdist --> env_pkg[build env: .pkg] wheel --> env_wheel[build env: .pkg-cpython313] sdistwheel --> env_pkg[sdist in: .pkg] sdistwheel --> env_wheel2[wheel in: .pkg-cpython313] editable --> env_wheel legacy --> env_pkg skip --> no_env[no build env] external --> no_env classDef decisionStyle fill:#fef9c3,stroke:#eab308,stroke-width:2px,color:#713f12 classDef pkgStyle fill:#ffedd5,stroke:#f97316,stroke-width:2px,color:#7c2d12 classDef envStyle fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d classDef skipStyle fill:#f3f4f6,stroke:#9ca3af,stroke-width:2px,color:#374151 class pkg decisionStyle class sdist,wheel,sdistwheel,editable,legacy,external pkgStyle class env_pkg,env_wheel,env_wheel2 envStyle class skip,no_env skipStyle - ``sdist`` (default): builds a source distribution - ``wheel``: builds a wheel (much faster to install) - ``sdist-wheel``: builds a source distribution first, then builds a wheel from that sdist (validates sdist completeness) - ``editable``: builds an editable wheel as defined by :PEP:`660` - ``editable-legacy``: invokes pip with ``-e`` (fallback when the backend doesn't support PEP 660) - ``skip``: skips packaging entirely (useful for tools like linters that don't need the project installed) - ``external``: uses an externally provided package Build environments ================== tox uses a virtual environment for building, whose name depends on the artifact type: - For source distributions: the :ref:`package_env` (default ``.pkg``) - For wheels: the :ref:`wheel_build_env` (default ``.pkg-``, e.g. ``.pkg-cpython313``) - For sdist-wheel: uses two environments — the :ref:`package_env` for building the sdist, and the :ref:`wheel_build_env` (default ``.pkg-``) for building the wheel from the extracted sdist For pure Python projects (no C extensions), set :ref:`wheel_build_env` to the same value as :ref:`package_env`. This way the wheel is built once and reused for all tox environments: .. tab:: TOML .. code-block:: toml [env_run_base] package = "wheel" wheel_build_env = ".pkg" .. tab:: INI .. code-block:: ini [testenv] package = wheel wheel_build_env = .pkg Packaging environment configuration =================================== Packaging environments do **not** inherit settings from ``env_run_base`` (TOML) or ``[testenv]`` (INI). Instead, they inherit from the ``env_pkg_base`` table (TOML) or ``[pkgenv]`` section (INI). This prevents test settings from conflicting with packaging settings. .. tab:: TOML .. code-block:: toml [env_pkg_base] pass_env = ["PKG_CONFIG", "PKG_CONFIG_PATH"] .. tab:: INI .. code-block:: ini [pkgenv] pass_env = PKG_CONFIG PKG_CONFIG_PATH To configure a specific packaging environment, use the standard environment syntax (e.g. ``[testenv:.pkg]`` in INI or ``env.".pkg"`` in TOML). .. _auto-provisioning: ******************* Auto-provisioning ******************* When the installed tox version does not satisfy either the :ref:`requires` or the :ref:`min_version`, tox automatically creates a virtual environment under :ref:`provision_tox_env` name that satisfies those constraints and delegates all calls to this meta environment. .. mermaid:: flowchart TD invoke[tox invoked] --> check{requires and min_version satisfied?} check -- yes --> run[run normally] check -- no --> create[create .tox/.tox virtualenv] create --> install[install tox + required plugins] install --> delegate[re-invoke tox inside .tox/.tox] delegate --> run classDef decisionStyle fill:#fef9c3,stroke:#eab308,stroke-width:2px,color:#713f12 classDef envStyle fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d classDef cmdStyle fill:#ede9fe,stroke:#8b5cf6,stroke-width:2px,color:#3b0764 class check decisionStyle class create,install envStyle class invoke,run,delegate cmdStyle For example given: .. tab:: TOML .. code-block:: toml requires = ["tox>=4", "tox-uv>=1"] .. tab:: INI .. code-block:: ini [tox] requires = tox>=4 tox-uv>=1 tox will automatically ensure that both the minimum version and requires constraints are satisfied, by creating a virtual environment under ``.tox``, and then installing into it ``tox>=4`` and ``tox-uv>=1``. Afterwards all tox invocations are forwarded to the tox installed inside ``.tox/.tox`` (referred to as the provisioned tox). This allows tox to automatically set up itself with all its plugins for the current project. If the host tox satisfies the constraints no provisioning is done (to avoid setup cost and indirection). .. note:: The provisioning environment (``.tox`` by default) does **not** inherit settings from ``env_run_base`` (TOML) or ``[testenv]`` (INI). It must be explicitly configured if you need to customize it (e.g. ``env.".tox"`` in TOML or ``[testenv:.tox]`` in INI). .. _parallel_mode: *************** Parallel mode *************** tox allows running environments in parallel mode via the ``parallel`` sub-command: - After the packaging phase completes tox runs environments in parallel processes (multi-thread based). - The ``--parallel`` flag takes an argument specifying the degree of parallelization, defaulting to ``auto``: - ``all`` to run all invoked environments in parallel, - ``auto`` to limit it to CPU count, - or pass an integer to set that limit. - Parallel mode displays a progress spinner while running environments in parallel, and reports outcome as soon as environments complete. To run without the spinner, use ``--parallel-no-spinner``. - Parallel mode by default shows output only of failed environments and ones marked as :ref:`parallel_show_output` ``= true``. - Environments can declare dependencies on other environments via :ref:`depends`. tox re-orders the environment list to satisfy these dependencies (also for sequential runs). In parallel mode, tox only schedules an environment once all of its dependencies have finished (independent of their outcome). ``depends`` supports glob patterns (``*``, ``?``, ``[seq]``) using :py:mod:`fnmatch`, so instead of listing each environment explicitly you can write ``depends = 3.*`` to match all environments starting with ``3.``. .. warning:: ``depends`` does not pull in dependencies into the run target. For example, if you select ``3.13,3.12,coverage`` via ``-e`` tox will only run those three (even if ``coverage`` may specify as ``depends`` other targets too -- such as ``3.13, 3.12, 3.11``). - ``--parallel-live`` / ``-o`` shows live output of stdout and stderr, and turns off the spinner. - Parallel evaluation disables standard input. Use non-parallel invocation if you need standard input. Example final output: .. code-block:: bash $ tox -e 3.13,3.12,coverage -p all ✔ OK 3.12 in 9.533 seconds ✔ OK 3.13 in 9.96 seconds ✔ OK coverage in 2.0 seconds ___________________________ summary ______________________________________________________ 3.13: commands succeeded 3.12: commands succeeded coverage: commands succeeded congratulations :) Example progress bar, showing a rotating spinner, the number of environments running and their list (limited up to 120 characters): .. code-block:: bash ⠹ [2] 3.13 | 3.12 **************** Fail-fast mode **************** When running multiple environments, tox normally runs all of them even if an early environment fails. The ``--fail-fast`` flag stops execution after the first environment failure, saving time in CI pipelines and development workflows. .. code-block:: bash tox run -e 3.13,3.12,3.11 --fail-fast You can also enable it per-environment via the ``fail_fast`` configuration: .. tab:: TOML .. code-block:: toml [env.critical] fail_fast = true commands = [["pytest", "tests/critical"]] .. tab:: INI .. code-block:: ini [testenv:critical] fail_fast = true commands = pytest tests/critical The fail-fast behavior: - Works in both sequential and parallel execution modes. - In parallel mode, environments already running when a failure occurs will continue to completion. Only environments not yet queued will be skipped. - Respects :ref:`ignore_outcome` -- environments with ``ignore_outcome = true`` will not trigger fail-fast even if they fail. - Respects environment dependencies defined via :ref:`depends` -- dependent environments will not run if a dependency fails with fail-fast enabled. - Environments not yet started are skipped with exit code -2 and marked as ``SKIP`` in the output. - The overall tox exit code will be the exit code of the first failed environment. *************************** Configuration inheritance *************************** Every tox environment has its own configuration section. If a value is not defined in the environment-specific section, it falls back to the base section (:ref:`base` configuration). For ``tox.toml`` this is the ``env_run_base`` table, for ``tox.ini`` this is ``[testenv]``. If the base section also lacks the value, the configuration default is used. .. tab:: TOML .. code-block:: toml [env_run_base] commands = [["pytest", "tests"]] [env.test] description = "run the test suite with pytest" .. tab:: INI .. code-block:: ini [testenv] commands = pytest tests [testenv:test] description = run the test suite with pytest Here ``test`` inherits ``commands`` from the base because it is not specified in ``[env.test]``. .. _virtualenv-version-pinning: **************************** Virtualenv version pinning **************************** tox creates isolated environments using :pypi:`virtualenv`, which it imports as a library. This works well when the installed virtualenv supports all target Python versions, but breaks down at the edges: older virtualenv releases (pre-20.22) are required for Python 3.6 support, while the latest virtualenv is needed for Python 3.15+. Since tox can only import one virtualenv version per process, projects that need both old and new Pythons in a single ``tox.toml`` hit a wall. The :ref:`virtualenv_spec` setting resolves this by decoupling the virtualenv used for environment creation from the one tox imports. When set, tox: 1. Creates a bootstrap venv (using the stdlib ``venv`` module) in ``.tox/.virtualenv-bootstrap/``. 2. Installs the specified virtualenv version into that bootstrap venv via pip. 3. Runs the bootstrapped virtualenv as a subprocess instead of calling ``session_via_cli()`` from the imported library. The bootstrap is content-addressed by a hash of the spec string, so different specs get separate cached environments. A file lock protects against concurrent bootstrap creation (relevant in parallel mode). Once bootstrapped, subsequent runs skip directly to step 3. When ``virtualenv_spec`` is empty (the default), tox uses the imported virtualenv with zero overhead -- the subprocess path only activates when explicitly configured. The spec is included in the environment cache key, so changing it triggers automatic recreation. This design mirrors tox's own auto-provisioning mechanism (``requires`` / ``min_version``), where tox bootstraps itself into a separate environment when the running installation doesn't meet the declared requirements. ******************* Known limitations ******************* Interactive terminal programs ============================= Programs that require advanced terminal control — such as IPython, debuggers with rich UIs, or any tool built on `prompt_toolkit `__ — need direct terminal access to work correctly. By default, tox captures subprocess output by routing ``stdout`` and ``stderr`` through pseudo-terminal (PTY) pairs. This is necessary for logging, result reporting, and colorized output. However, the subprocess's ``stdin`` remains connected to the real terminal. This means ``stdin`` and ``stdout`` are on *different* terminal devices. Libraries like ``prompt_toolkit`` assume all streams share the same terminal. They set raw mode on ``stdin`` (to read individual keystrokes) while writing VT100 escape sequences to ``stdout`` (for cursor positioning, screen clearing, etc.). When ``stdout`` goes through tox's capture buffer instead of directly to the terminal, escape sequences are delayed and the synchronous terminal control these libraries depend on breaks. Solution: Use the ``--no-capture`` (or ``-i``) flag to disable output capture and give the subprocess direct terminal access: .. code-block:: bash # Run IPython with full terminal support tox run -e 3.13 -i -- ipython # Run debugger interactively tox run -e 3.13 -i -- python -m pdb script.py This flag is mutually exclusive with ``--result-json`` and parallel mode. See :ref:`run-interactive-programs` for details. Alternative workarounds if you cannot use ``--no-capture``: - For IPython, pass ``--simple-prompt`` to disable ``prompt_toolkit``'s advanced terminal features. - For other tools, look for a "dumb terminal" or "no-color" mode that avoids VT100 escape sequences. Debian/Ubuntu without ``python3-venv`` ====================================== On Debian and Ubuntu, the system Python is split into multiple packages. The ``python3`` package does not include the :mod:`venv` module or :mod:`ensurepip` — these are in the separate ``python3-venv`` package. tox itself is **not affected** because it uses :pypi:`virtualenv` (which bundles its own bootstrap mechanism) rather than stdlib :mod:`venv`. However, tools that tox *runs as commands* inside environments may use stdlib :mod:`venv` internally and fail. A common example is :pypi:`build` (``pyproject-build``), which creates an isolated build environment using :mod:`venv` when a recent ``pip`` is available. If you see errors like: .. code-block:: text The virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package. this is the tool inside the tox environment hitting the missing system package, not tox itself. **Solutions:** - Install the system venv package: ``apt install python3-venv`` (or ``python3.X-venv`` for a specific version). - Use :pypi:`tox-uv`, which replaces both the environment creation and package installation with :pypi:`uv`, avoiding the stdlib :mod:`venv` dependency entirely. Misplaced configuration keys ============================ tox configuration is split into two sections: **core** (``[tox]`` / top-level TOML) and **environment** (``[testenv]`` / ``env_run_base`` in TOML). Options placed in the wrong section are silently ignored because tox cannot distinguish a misplaced option from a plugin-defined key that isn't loaded yet (e.g. during provisioning). To detect misplaced keys: - Run ``tox run -v`` — unused keys are printed as warnings before the final report. - Run ``tox config`` — unused keys appear as ``# !!! unused:`` comments per section. - Run ``tox config --format json`` or ``--format toml`` — unused keys appear in an ``"unused"`` array per section. For example, putting ``ignore_base_python_conflict`` in ``[testenv]`` instead of ``[tox]``: .. tab:: INI .. code-block:: text [testenv:py] ... # !!! unused: ignore_base_python_conflict .. tab:: JSON .. code-block:: json { "env": { "py": { "unused": ["ignore_base_python_conflict"] } } } .. tab:: TOML .. code-block:: toml [env.py] unused = ["ignore_base_python_conflict"] See the :ref:`Core ` and :ref:`tox environment ` reference sections for which options belong where. ****************** Related projects ****************** tox has influenced several other projects in the Python test automation space. If tox doesn't quite fit your needs or you want to do more research, we recommend taking a look at these projects: - `nox `__ is a project similar in spirit to tox but different in approach. The primary key difference is that it uses Python scripts instead of a configuration file. It might be useful if you find tox configuration too limiting but aren't looking to move to something as general-purpose as ``Invoke`` or ``make``. - `Invoke `__ is a general-purpose task execution library, similar to Make. Invoke is far more general-purpose than tox but it does not contain the Python testing-specific features that tox specializes in. tox-dev-tox-1f1fcc7/docs/how-to/000077500000000000000000000000001520067562700165635ustar00rootroot00000000000000tox-dev-tox-1f1fcc7/docs/how-to/install.rst000066400000000000000000000073321520067562700207700ustar00rootroot00000000000000############## Installation ############## ********* As tool ********* :pypi:`tox` is a CLI tool that needs a Python interpreter (version 3.10 or higher) to run. We recommend either :pypi:`pipx` or :pypi:`uv` to install tox into an isolated environment. This has the added benefit that later you'll be able to upgrade tox without affecting other parts of the system. We provide method for ``pip`` too here but we discourage that path if you can: .. tab:: uv .. code-block:: bash # install uv per https://docs.astral.sh/uv/#getting-started uv tool install tox tox --help .. tab:: pipx .. code-block:: bash python -m pip install pipx-in-pipx --user pipx install tox tox --help .. tab:: pip .. code-block:: bash python -m pip install --user tox python -m tox --help You can install it within the global Python interpreter itself (perhaps as a user package via the ``--user`` flag). Be cautious if you are using a Python installation that is managed by your operating system or another package manager. ``pip`` might not coordinate with those tools, and may leave your system in an inconsistent state. **Requirements:** - **wheel (default):** Installing tox via a wheel requires pip that understands the ``python-requires`` tag (see :PEP:`503`). With pip this is version ``9.0.0`` or later (released November 2016). If installing from a mirror, ensure it forwards the ``python-requires`` tag (notably OpenStack mirrors don't, and older :gh_repo:`devpi/devpi` versions before ``4.7.0`` don't). .. _sdist: - **sdist:** When installing via a source distribution you need pip that handles :PEP:`517`. With pip this is version ``18.0.0`` or later (released July 2018). If you cannot upgrade pip, ensure the build requirements from :gh:`pyproject.toml ` are satisfied before installation. ******************* latest unreleased ******************* Installing an unreleased version is discouraged and should be only done for testing purposes: .. tab:: uv .. code-block:: bash uv tool install --from git+https://github.com/tox-dev/tox.git@main tox .. tab:: pipx .. code-block:: bash pipx install git+https://github.com/tox-dev/tox.git@main .. tab:: pip .. code-block:: bash pip install git+https://github.com/tox-dev/tox.git@main Requires pip version ``18.0.0`` or later. For Python version compatibility, see :ref:`compatibility-requirements`. ****************** Man Page Support ****************** tox ships a compiled man page in its wheel. When installing tox: - **System-wide** (``sudo pip install tox``): Installs to ``/usr/share/man/man1/tox.1`` automatically - **User install** (``pip install --user tox``): Installs to ``~/.local/share/man/man1/tox.1`` automatically - **Package managers** (apt, brew, dnf): Install to the appropriate system location For user installs, ensure ``~/.local/share/man`` is in your ``MANPATH``: .. code-block:: bash # Add to ~/.bashrc or ~/.zshrc export MANPATH="$HOME/.local/share/man:$MANPATH" After updating your profile, restart your shell or run ``source ~/.bashrc``. Virtual Environment Installations ================================= When tox is installed in a virtual environment (via pipx, uv tool, or venv), the man page is installed but not on the system ``MANPATH``. Use the ``tox man`` command to set it up: .. code-block:: bash tox man Building from Source ==================== The man page is compiled from ``docs/man/tox.1.rst`` during wheel build. To regenerate the RST source after CLI changes: .. code-block:: bash tox run -e manpage After installation, view with ``man tox``. tox-dev-tox-1f1fcc7/docs/how-to/usage.rst000066400000000000000000001646711520067562700204400ustar00rootroot00000000000000.. _howto: ############### How-to Guides ############### Practical recipes for common tox tasks. Each section answers a specific "How do I...?" question. ***************** Quick reference ***************** Common commands =============== - Each tox subcommand has a 1 (or 2) letter shortcut, e.g. ``tox run`` = ``tox r``, ``tox config`` = ``tox c``. - Run all default environments: ``tox`` (runs everything in :ref:`env_list`). - Run a specific environment: ``tox run -e 3.13``. - Run multiple environments: ``tox run -e lint,3.13`` (sequential, in order). - Run environments in parallel: ``tox parallel -e 3.13,3.12`` (see :ref:`parallel_mode`). - Run all environments matching a label: ``tox run -m test`` (see :ref:`labels`). - Run all environments matching a factor: ``tox run -f django`` (runs all envs containing the ``django`` factor). - Inspect configuration: ``tox config -e 3.13 -k pass_env``. - Force recreation: ``tox run -e 3.13 -r``. Environment variables ===================== - View environment variables: ``tox c -e 3.13 -k set_env pass_env``. - Pass through system environment variables: use :ref:`pass_env`. - Set environment variables: use :ref:`set_env`. - Setup commands: :ref:`commands_pre`. Teardown commands: :ref:`commands_post`. - Change working directory: :ref:`change_dir` (affects install commands too if using relative paths). Logging ======= tox logs command invocations inside ``.tox//log``. Environment variables with names containing sensitive words (``access``, ``api``, ``auth``, ``client``, ``cred``, ``key``, ``passwd``, ``password``, ``private``, ``pwd``, ``secret``, ``token``) are logged with their values redacted to prevent accidental secret leaking in CI/CD environments. .. ------------------------------------------------------------------------------------------ .. Testing & Verification (most common workflows) .. ------------------------------------------------------------------------------------------ ****************** Test with pytest ****************** A typical pytest configuration: .. tab:: TOML .. code-block:: toml env_list = ["3.13", "3.12"] [env_run_base] deps = ["pytest>=8"] commands = [["pytest", { replace = "posargs", default = ["tests"], extend = true }]] .. tab:: INI .. code-block:: ini [tox] env_list = 3.13, 3.12 [testenv] deps = pytest>=8 commands = pytest {posargs:tests} When running tox in parallel mode, ensure each pytest invocation is fully isolated by setting a unique temporary directory: .. tab:: TOML .. code-block:: toml [env_run_base] commands = [["pytest", "--basetemp={env_tmp_dir}", { replace = "posargs", default = ["tests"], extend = true }]] .. tab:: INI .. code-block:: ini [testenv] commands = pytest --basetemp="{env_tmp_dir}" {posargs:tests} *********************************************** Collect coverage across multiple environments *********************************************** A common pattern is running tests across several Python versions and combining coverage results. Use :ref:`depends` to ensure coverage runs after all test environments: .. tab:: TOML .. code-block:: toml env_list = ["3.13", "3.12", "coverage"] [env_run_base] deps = ["pytest", "coverage[toml]"] commands = [["coverage", "run", "-p", "-m", "pytest", "tests"]] [env.coverage] skip_install = true deps = ["coverage[toml]"] depends = ["3.*"] commands = [ ["coverage", "combine"], ["coverage", "report", "--fail-under=80"], ] .. tab:: INI .. code-block:: ini [tox] env_list = 3.13, 3.12, coverage [testenv] deps = pytest coverage[toml] commands = coverage run -p -m pytest tests [testenv:coverage] skip_install = true deps = coverage[toml] depends = 3.* commands = coverage combine coverage report --fail-under=80 The ``-p`` flag (parallel mode) creates separate ``.coverage.`` files per environment. ``coverage combine`` merges them before generating the report. .. _tox-exec: ********************************** Run a one-off command (tox exec) ********************************** The ``tox exec`` subcommand runs an arbitrary command inside a tox environment without executing the configured ``commands``, ``commands_pre``, or ``commands_post``. It also skips package installation. Pass the command after ``--``: .. code-block:: bash # Open a Python shell inside the "3.13" environment tox exec -e 3.13 -- python # Check installed packages tox exec -e 3.13 -- pip list # Run a script with the environment's Python tox exec -e 3.13 -- python scripts/migrate.py --dry-run The command must be in the environment's ``PATH`` or listed in :ref:`allowlist_externals`. ``tox exec`` is useful for debugging, running one-off scripts, or interactively exploring an environment without modifying your configuration. .. ------------------------------------------------------------------------------------------ .. Configuration (frequently needed) .. ------------------------------------------------------------------------------------------ ********************************* Override configuration defaults ********************************* tox provides several ways to override configuration values without editing the configuration file. **User-level configuration file**: tox reads a user-level config file whose location is shown in ``tox --help``. The location can be changed via the ``TOX_CONFIG_FILE`` environment variable. **Environment variables**: Any tox setting can be set via an environment variable with the ``TOX_`` prefix: .. code-block:: bash # Use wheel packaging TOX_PACKAGE=wheel tox run -e 3.13 **CLI override**: The ``-x`` (or ``--override``) flag overrides any configuration value: .. code-block:: bash # Force editable install for a specific environment tox run -e 3.13 -x "testenv:3.13.package=editable" ********************************** Use labels to group environments ********************************** Labels let you assign tags to environments and run them as a group with ``tox run -m