pax_global_header00006660000000000000000000000064147712653250014526gustar00rootroot0000000000000052 comment=3d35559ca1e9411708b9e5f73d610691a4fbdefc tox-4.25.0/000077500000000000000000000000001477126532500124305ustar00rootroot00000000000000tox-4.25.0/.dockerignore000066400000000000000000000000601477126532500151000ustar00rootroot00000000000000.tox* .*_cache *.egg-info Dockerfile build dist tox-4.25.0/.github/000077500000000000000000000000001477126532500137705ustar00rootroot00000000000000tox-4.25.0/.github/CODEOWNERS000066400000000000000000000000251477126532500153600ustar00rootroot00000000000000* @gaborbernat tox-4.25.0/.github/CONTRIBUTING.md000066400000000000000000000010121477126532500162130ustar00rootroot00000000000000# 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-4.25.0/.github/FUNDING.yml000066400000000000000000000000231477126532500156000ustar00rootroot00000000000000tidelift: pypi/tox tox-4.25.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001477126532500161535ustar00rootroot00000000000000tox-4.25.0/.github/ISSUE_TEMPLATE/bug-report.md000066400000000000000000000011411477126532500205600ustar00rootroot00000000000000--- 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-4.25.0/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000011471477126532500201460ustar00rootroot00000000000000# 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-4.25.0/.github/ISSUE_TEMPLATE/feature-request.md000066400000000000000000000013711477126532500216200ustar00rootroot00000000000000--- 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-4.25.0/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000007151477126532500175740ustar00rootroot00000000000000 - [ ] 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-4.25.0/.github/config.yml000066400000000000000000000000601477126532500157540ustar00rootroot00000000000000chronographer: enforce_name: suffix: .rst tox-4.25.0/.github/dependabot.yml000066400000000000000000000001651477126532500166220ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" tox-4.25.0/.github/release.yml000066400000000000000000000001141477126532500161270ustar00rootroot00000000000000changelog: exclude: authors: - dependabot - pre-commit-ci tox-4.25.0/.github/workflows/000077500000000000000000000000001477126532500160255ustar00rootroot00000000000000tox-4.25.0/.github/workflows/check.yaml000066400000000000000000000052251477126532500177720ustar00rootroot00000000000000name: check on: workflow_dispatch: push: branches: ["main"] tags-ignore: ["**"] pull_request: schedule: - cron: "0 8 * * *" 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.13" - "3.12" - "3.11" - "3.10" - "3.9" - "3.8" os: - ubuntu-latest - windows-latest - macos-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install the latest version of uv uses: astral-sh/setup-uv@v5 with: enable-cache: true 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 check: name: tox env ${{ matrix.tox_env }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: tox_env: - type - dev - docs - pkg_meta os: - ubuntu-latest - windows-latest exclude: - { os: windows-latest, tox_env: docs } steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install the latest version of uv uses: astral-sh/setup-uv@v5 with: enable-cache: true 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 3.13 tox@. - 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-4.25.0/.github/workflows/release.yaml000066400000000000000000000023601477126532500203320ustar00rootroot00000000000000name: Release to PyPI on: push: tags: ["*"] env: dists-artifact-name: python-package-distributions jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install the latest version of uv uses: astral-sh/setup-uv@v5 with: enable-cache: true cache-dependency-glob: "pyproject.toml" github-token: ${{ secrets.GITHUB_TOKEN }} - name: Build package run: uv build --python 3.13 --python-preference only-managed --sdist --wheel . --out-dir dist - name: Store the distribution packages uses: actions/upload-artifact@v4 with: name: ${{ env.dists-artifact-name }} path: dist/* release: needs: - build runs-on: ubuntu-latest 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@v4 with: name: ${{ env.dists-artifact-name }} path: dist/ - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@v1.12.4 with: attestations: true tox-4.25.0/.gitignore000066400000000000000000000003761477126532500144260ustar00rootroot00000000000000/.*_cache /build /dist /docs/_draft.rst /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-4.25.0/.pre-commit-config.yaml000066400000000000000000000031771477126532500167210ustar00rootroot00000000000000repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.31.3 hooks: - id: check-github-workflows args: ["--verbose"] - repo: https://github.com/codespell-project/codespell rev: v2.4.1 hooks: - id: codespell additional_dependencies: ["tomli>=2.2.1"] - repo: https://github.com/tox-dev/pyproject-fmt rev: "v2.5.1" hooks: - id: pyproject-fmt - repo: https://github.com/abravalheri/validate-pyproject rev: "v0.24.1" hooks: - id: validate-pyproject - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.11.2" hooks: - id: ruff-format - id: ruff args: ["--fix", "--unsafe-fixes", "--exit-non-zero-on-fix"] - repo: https://github.com/asottile/blacken-docs rev: 1.19.1 hooks: - id: blacken-docs additional_dependencies: [black==25.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.5.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: meta hooks: - id: check-hooks-apply - id: check-useless-excludes tox-4.25.0/.readthedocs.yaml000066400000000000000000000002671477126532500156640ustar00rootroot00000000000000version: 2 build: os: ubuntu-lts-latest tools: python: "3" commands: - pip install uv - uv venv - uv pip install tox-uv tox@. - .venv/bin/tox run -e docs -- tox-4.25.0/CODE_OF_CONDUCT.md000066400000000000000000000062361477126532500152360ustar00rootroot00000000000000# 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-4.25.0/LICENSE000066400000000000000000000017771477126532500134510ustar00rootroot00000000000000Permission 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-4.25.0/README.md000066400000000000000000000030171477126532500137100ustar00rootroot00000000000000# 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/user_guide.html#basic-example) 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-4.25.0/docs/000077500000000000000000000000001477126532500133605ustar00rootroot00000000000000tox-4.25.0/docs/_static/000077500000000000000000000000001477126532500150065ustar00rootroot00000000000000tox-4.25.0/docs/_static/custom.css000066400000000000000000000001621477126532500170310ustar00rootroot00000000000000blockquote { border-left: none; font-style: normal; margin-left: 1.5rem; margin-right: 0; padding: 0; } tox-4.25.0/docs/_static/img/000077500000000000000000000000001477126532500155625ustar00rootroot00000000000000tox-4.25.0/docs/_static/img/tox.png000066400000000000000000001501441477126532500171070ustar00rootroot00000000000000PNG  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-4.25.0/docs/_static/img/tox.svg000066400000000000000000000633641477126532500171310ustar00rootroot00000000000000 image/svg+xml t x tox-4.25.0/docs/_static/img/toxfavi.ico000066400000000000000000000353561477126532500177520ustar00rootroot0000000000000000 %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-4.25.0/docs/changelog.rst000066400000000000000000002076531477126532500160560ustar00rootroot00000000000000Release History =============== .. include:: _draft.rst .. towncrier release notes start 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 :pull:`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`. (:pull:`2245`) - Moved the python packaging logic into a dedicate package :pypi:`pyproject-api` and use it as a dependency - by :user:`gaborbernat`. (:pull:`2274`) - Drop python 3.6 support - by :user:`gaborbernat`. (:pull:`2275`) - Support for selecting target environments with a given factor via the :ref:`-f ` CLI environment flag - by :user:`gaborbernat`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`1991`) - Support CPython ``3.10`` -by :user:`gaborbernat`. (:pull:`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`. (:pull:`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`. (:pull:`2117`) - Move from ``toml`` to ``tomli`` - by :user:`gaborbernat`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`1900`) - Do not construct a requirements file for deps in virtualenv, instead pass content as CLI argument to pip - by :user:`gaborbernat`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`1864`) Improved Documentation - 4.0.0a5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Add CLI documentation - by :user:`gaborbernat`. (:pull:`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`. (:pull:`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`. (:pull:`1821`) - Raise ``ValueError`` with descriptive message when a requirements file specified does not exist - by :user:`gaborbernat`. (:pull:`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`. (:pull:`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`. (:pull:`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`. (:pull:`1630`) Bugfixes - 4.0.0a2 ~~~~~~~~~~~~~~~~~~ - Fix coverage generation in CI - by :user:`gaborbernat`. (:pull:`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`. (:pull:`1556`) Improved Documentation - 4.0.0a2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Add base documentation by merging virtualenv structure with tox 3 - by :user:`gaborbernat`. (:pull:`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-4.25.0/docs/changelog/000077500000000000000000000000001477126532500153075ustar00rootroot00000000000000tox-4.25.0/docs/changelog/template.jinja2000066400000000000000000000020731477126532500202230ustar00rootroot00000000000000{% set top_underline = underlines[0] %} {% if versiondata.name %} v{{ versiondata.version }} ({{ versiondata.date }}) {{ top_underline * ((versiondata.version + versiondata.date)|length + 4)}} {% else %} {{ versiondata.version }} ({{ versiondata.date }}) {{ top_underline * ((versiondata.version + versiondata.date)|length + 3)}} {% endif %} {% for section, _ in sections.items() %} {% set underline = underlines[1] %} {% 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-4.25.0/docs/cli_interface.rst000066400000000000000000000001341477126532500166770ustar00rootroot00000000000000.. _cli: .. sphinx_argparse_cli:: :module: tox.config.cli.parse :func: _get_parser_doc tox-4.25.0/docs/conf.py000066400000000000000000000122351477126532500146620ustar00rootroot00000000000000from __future__ import annotations import re import subprocess import sys from importlib.machinery import SourceFileLoader from pathlib import Path from subprocess import check_output from typing import TYPE_CHECKING, Any from sphinx.domains.python import PythonDomain from sphinx.ext.extlinks import ExternalLinksChecker 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" release, version = __version__, ".".join(__version__.split(".")[:2]) copyright = f"{company}" # noqa: A001 master_doc, source_suffix = "index", ".rst" html_theme = "furo" html_title, html_last_updated_fmt = "tox", "%Y-%m-%dT%H:%M:%S" pygments_style, pygments_dark_style = "sphinx", "monokai" html_static_path, html_css_files = ["_static"], ["custom.css"] 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", ] exclude_patterns = ["_build", "changelog/*", "_draft.rst"] 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 = { "issue": ("https://github.com/tox-dev/tox/issues/%s", "#%s"), "pull": ("https://github.com/tox-dev/tox/pull/%s", "PR #%s"), "discussion": ("https://github.com/tox-dev/tox/discussions/%s", "#%s"), "user": ("https://github.com/%s", "@%s"), "gh_repo": ("https://github.com/%s", "%s"), "gh": ("https://github.com/%s", "%s"), "pypi": ("https://pypi.org/project/%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 def process_signature( # noqa: PLR0913 app: Sphinx, # noqa: ARG001 objtype: str, name: str, # noqa: ARG001 obj: Any, # noqa: ARG001 options: Options, args: str, # 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 return (None, None) if objtype == "class" and "__init__" in options.get("exclude-members", set()) else None def setup(app: Sphinx) -> None: here = Path(__file__).parent # 1. run towncrier root, exe = here.parent, Path(sys.executable) towncrier = exe.with_name(f"towncrier{exe.suffix}") cmd = [str(towncrier), "build", "--draft", "--version", "NEXT"] new = check_output(cmd, cwd=root, text=True, stderr=subprocess.DEVNULL) (root / "docs" / "_draft.rst").write_text("" if "No significant changes" in new else new) 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, ) -> Element: # 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.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 tox-4.25.0/docs/config.rst000066400000000000000000001551511477126532500153670ustar00rootroot00000000000000.. _configuration: Configuration +++++++++++++ tox configuration can be split into two categories: core and environment specific. Core settings are options that can be set once and used for all tox environments, while environment options are applied to the given tox environment only. Discovery and file types ------------------------ With regards to the configuration format, at the moment we support the following formats: - `INI `_. - `TOML `_. Out of box tox supports five configuration locations prioritized in the following order: 1. ``tox.ini`` (INI), 2. ``setup.cfg`` (INI), 3. ``pyproject.toml`` with the ``tool.tox`` table, having ``legacy_tox_ini`` key (containing INI), 4. Native ``pyproject.toml`` under the ``tool.tox`` table (TOML), 5. ``tox.toml`` (TOML). Historically, the INI format was created first, and TOML was added in 2024. The TOML format generally is more robust, however is less powerful and more verbose. You should use TOML unless you need some of the more advanced features that TOML does not support (such as conditional factors, generative environments to name a few -- however, PRs to add support for these in TOML is welcome). .. _tox-ini: ``tox.ini`` ~~~~~~~~~~~ This configuration file uses: - ``tox`` section to host core configuration, - ``testenv:{env_name}`` section to host environment configuration, - ``testenv`` section as base configuration for run environments (fallback location for missing values for a test/run environment), - ``pkgenv`` section as base configuration for package environments (fallback location for missing values for a package environment). For example: .. code-block:: ini [tox] min_version = 4.20 env_list = 3.13 3.12 type [testenv] deps = pytest commands = pytest tests [testenv:type] deps = mypy commands = mypy src ``setup.cfg`` ~~~~~~~~~~~~~ This configuration file uses: - ``tox:tox`` section to host core configuration, - ``testenv:{env_name}`` section to host environment configuration, - ``testenv`` section as base configuration for run environments (fallback location for missing values for a test/run environment), - ``pkgenv`` section as base configuration for package environments (fallback location for missing values for a package environment). .. code-block:: ini [tox:tox] min_version = 4.0 env_list = 3.13 3.12 type [testenv] deps = pytest commands = pytest tests [testenv:type] deps = mypy commands = mypy src ``pyproject.toml`` - INI ~~~~~~~~~~~~~~~~~~~~~~~~ This configuration file is equivalent to :ref:`tox.ini ` format, with the difference that the text is stored instead inside the ``pyproject.toml`` file under the ``tool.tox`` table and ``legacy_tox_ini`` key: .. code-block:: toml [tool.tox] legacy_tox_ini = """ [tox] min_version = 4.0 env_list = py310 py39 type [testenv] deps = pytest commands = pytest tests [testenv:type] deps = mypy commands = mypy src """ .. _pyproject-toml-native: ``pyproject.toml`` - native ~~~~~~~~~~~~~~~~~~~~~~~~~~~ We support native TOML configuration via the ``pyproject.toml`` files ``tool.tox`` table. This configuration file uses: - ``tool.tox`` table to host core configuration, - ``tool.tox.env.{env_name}`` table to host environment configuration, - ``tool.tox.env_run_base`` table as base configuration for run environments (fallback location for missing values for a test/run environment), - ``tool.tox.env_pkg_base`` table as base configuration for package environments (fallback location for missing values for a package environment). .. code-block:: toml [tool.tox] requires = ["tox>=4.19"] env_list = ["3.13", "3.12", "type"] [tool.tox.env_run_base] description = "Run test under {base_python}" commands = [["pytest"]] [tool.tox.env.type] description = "run type check on code base" deps = ["mypy==1.11.2", "types-cachetools>=5.5.0.20240820", "types-chardet>=5.0.4.6"] commands = [["mypy", "src{/}tox"], ["mypy", "tests"]] ``tox.toml`` ~~~~~~~~~~~~ This configuration file is equivalent to :ref:`pyproject.toml - native ` with the difference that it lives in a separate dedicated files and accordingly the ``tool.tox`` sub-table is no longer required. For example: .. code-block:: toml requires = ["tox>=4.19"] env_list = ["3.13", "3.12", "type"] [env_run_base] description = "Run test under {base_python}" commands = [["pytest"]] [env.type] description = "run type check on code base" deps = ["mypy==1.11.2", "types-cachetools>=5.5.0.20240820", "types-chardet>=5.0.4.6"] commands = [["mypy", "src{/}tox"], ["mypy", "tests"]] .. _conf-core: Core ---- The following options are set in the ``[tox]`` section of ``tox.ini`` or the ``[tox:tox]`` section of ``setup.cfg``. .. conf:: :keys: requires :default: :version_added: 3.2.0 Specify a list of :pep:`508` compliant dependencies that must be satisfied in the Python environment hosting tox when running the tox command. If any of these dependencies are not satisfied will automatically create a provisioned tox environment that does not have this issue, and run the tox command within that environment. See :ref:`provision_tox_env` for more details. .. tab:: TOML .. code-block:: toml [tool.tox] requires = [ "tox>=4", "virtualenv>20.2", ] .. tab:: INI .. code-block:: ini [tox] requires = tox>=4 virtualenv>20.2 .. conf:: :keys: min_version, minversion :default: A string to define the minimal tox version required to run. If the host's tox version is less than this, it will automatically create a provisioned tox environment that satisfies this requirement. See :ref:`provision_tox_env` for more details. .. conf:: :keys: provision_tox_env :default: .tox :version_added: 3.8.0 Name of the tox environment used to provision a valid tox run environment. .. versionchanged:: 3.23.0 When tox is invoked with the ``--no-provision`` flag, the provision won't be attempted, tox will fail instead. .. conf:: :keys: env_list, envlist :default: A list of environments to run by default (when the user does not specify anything during the invocation). .. versionchanged:: 3.4.0 Which tox environments are run during the tox invocation can be further filtered via the operating system environment variable ``TOX_SKIP_ENV`` regular expression (e.g. ``py27.*`` means **don't** evaluate environments that start with the key ``py27``). Skipped environments will be logged at level two verbosity level. .. conf:: :keys: skip_missing_interpreters :default: config :version_added: 1.7.2 Setting this to ``true`` will force ``tox`` to return success even if some of the specified environments were missing. This is useful for some CI systems or when running on a developer box, where you might only have a subset of all your supported interpreters installed but don't want to mark the build as failed because of it. As expected, the command line switch always overrides this setting if passed on the invocation. Setting it to ``config`` means that the value is read from the config file. .. conf:: :keys: tox_root, toxinidir The root directory for the tox project (where the configuration file is found). .. conf:: :keys: work_dir, toxworkdir :default: {tox_root}/.tox Directory for tox to generate its environments into, will be created if it does not exist. .. conf:: :keys: temp_dir :default: {work_dir}/.tmp Directory where to put tox temporary files. For example: we create a hard link (if possible, otherwise new copy) in this directory for the project package. This ensures tox works correctly when having parallel runs (as each session will have its own copy of the project package - e.g. the source distribution). .. conf:: :keys: no_package, skipsdist :default: false Flag indicating to perform the packaging operation or not. Set it to ``true`` when using tox for an application, instead of a library. .. conf:: :keys: package_env, isolated_build_env :default: .pkg :version_added: 3.3.0 Default name of the virtual environment used to create a source distribution from the source tree. .. conf:: :keys: package_root, setupdir :default: {tox_root} Indicates where the packaging root file exists (historically setup.py file or pyproject.toml now). .. conf:: :keys: labels :default: A mapping of label names to environments it applies too. For example: .. tab:: TOML .. code-block:: toml [tool.tox] labels = { test = ["3.13", "3.12"], static = ["ruff", "mypy"] } .. tab:: INI .. code-block:: ini [tox] labels = test = 3.13, 3.12 static = ruff, mypy .. conf:: :keys: on_platform :constant: A constant holding the platform of the tox runtime environment. Python language core options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. conf:: :keys: ignore_base_python_conflict, ignore_basepython_conflict :default: True .. versionadded:: 3.1.0 tox allows setting the Python version for an environment via the :ref:`base_python` setting. If that's not set tox can set a default value from the environment name (e.g. ``py310`` implies Python 3.10). Matching up the Python version with the environment name has became expected at this point, leading to surprises when some configs don't do so. To help with sanity of users, an error will be raised whenever the environment name version does not match up with this expectation. Furthermore, we allow hard enforcing this rule by setting this flag to ``true``. In such cases we ignore the :ref:`base_python` and instead always use the base Python implied from the Python name. This allows you to configure :ref:`base_python` in the :ref:`base` section without affecting environments that have implied base Python versions. .. _conf-testenv: tox environment --------------- These are configuration for the tox environments (either packaging or run type). Base options ~~~~~~~~~~~~ .. conf:: :keys: envname, env_name :constant: The name of the tox environment. .. conf:: :keys: env_dir, envdir :default: {work_dir}/{env_name} :version_added: 1.5 Directory assigned to the tox environment. If not absolute it would be treated as relative to :ref:`tox_root`. .. conf:: :keys: env_tmp_dir, envtmpdir :default: {work_dir}/{env_name}/tmp A folder that is always reset at the start of the run. .. conf:: :keys: env_log_dir, envlogdir :default: {work_dir}/{env_name}/log A folder containing log files about tox runs. It's always reset at the start of the run. Currently contains every process invocation in the format of ``-.log``, and details the execution request (command, environment variables, current working directory, etc.) and its outcome (exit code and standard output/error content). .. conf:: :keys: platform Run on platforms that match this regular expression (empty means any platform). If a non-empty expression is defined and does not match against the ``sys.platform`` string the entire test environment will be skipped and none of the commands will be executed. Running ``tox -e `` will run commands for a particular platform and skip the rest. .. conf:: :keys: pass_env, passenv :default: Environment variables to pass on to the tox environment. The values are evaluated as UNIX shell-style wildcards, see `fnmatch `_ If a specified environment variable doesn't exist in the tox invocation environment it is ignored. The list of environment variable names is not case sensitive, for example: passing ``A`` or ``a`` will pass through both ``A`` and ``a``. Some variables are always passed through to ensure the basic functionality of standard library functions or tooling like pip. This is also not case sensitive on all platforms except Windows. .. list-table:: Environment Variables per Operating System :widths: 25 25 25 25 :header-rows: 1 * - Environment Variable - Linux - MacOS - Windows * - https_proxy - ✅ - ✅ - ✅ * - http_proxy - ✅ - ✅ - ✅ * - no_proxy - ✅ - ✅ - ✅ * - LANG - ✅ - ✅ - ✅ * - LANGUAGE - ✅ - ✅ - ✅ * - CURL_CA_BUNDLE - ✅ - ✅ - ✅ * - SSL_CERT_FILE - ✅ - ✅ - ✅ * - CC - ✅ - ✅ - ✅ * - CFLAGS - ✅ - ✅ - ✅ * - CCSHARED - ✅ - ✅ - ✅ * - CXX - ✅ - ✅ - ✅ * - CPPFLAGS - ✅ - ✅ - ✅ * - LD_LIBRARY_PATH - ✅ - ✅ - ✅ * - LDFLAGS - ✅ - ✅ - ✅ * - HOME - ✅ - ✅ - ✅ * - FORCE_COLOR - ✅ - ✅ - ✅ * - NO_COLOR - ✅ - ✅ - ✅ * - TMPDIR - ✅ - ✅ - ❌ * - TEMP - ❌ - ❌ - ✅ * - TMP - ❌ - ❌ - ✅ * - USERPROFILE - ❌ - ❌ - ✅ * - PATHEXT - ❌ - ❌ - ✅ * - MSYSTEM - ❌ - ❌ - ✅ * - WINDIR - ❌ - ❌ - ✅ * - APPDATA - ❌ - ❌ - ✅ * - PROGRAMDATA - ❌ - ❌ - ✅ * - PROGRAMFILES(x86) - ❌ - ❌ - ✅ * - SYSTEMDRIVE - ❌ - ❌ - ✅ * - SYSTEMROOT - ❌ - ❌ - ✅ * - COMSPEC - ❌ - ❌ - ✅ * - PROCESSOR_ARCHITECTURE - ❌ - ❌ - ✅ * - NUMBER_OF_PROCESSORS - ❌ - ❌ - ✅ * - PIP_* - ✅ - ✅ - ✅ * - VIRTUALENV_* - ✅ - ✅ - ✅ * - NETRC - ✅ - ✅ - ✅ * - NIX_LD* - ✅ - ✅ - ❌ * - NIX_LD_LIBRARY_PATH - ✅ - ✅ - ❌ More environment variable-related information can be found in :ref:`environment variable substitutions`. .. conf:: :keys: set_env, setenv A dictionary of environment variables to set when running commands in the tox environment. In addition, there is an option to include an existing environment file. See the different syntax for TOML and INI below. .. tab:: TOML .. code-block:: toml [tool.tox.env_run_base] set_env = { file = "conf{/}local.env", TEST_TIMEOUT = 30 } .. tab:: INI .. code-block:: ini [testenv] set_env = file|conf{/}local.env TEST_TIMEOUT = 30 The env file path may include previously defined tox variables: .. tab:: TOML .. code-block:: toml [tool.tox.env_run_base] set_env = { file = "{env:variable}" } .. tab:: INI .. code-block:: ini [testenv] set_env = file|{env:variable} .. note:: Environment files are processed using the following rules: - blank lines are ignored, - lines starting with the ``#`` character are ignored, - each line is in KEY=VALUE format; both the key and the value are stripped, - there is no special handling of quotation marks, they are part of the key or value. More environment variable-related information can be found in :ref:`environment variable substitutions`. .. conf:: :keys: parallel_show_output :default: False :version_added: 3.7 If set to ``True`` the content of the output will always be shown when running in parallel mode. .. conf:: :keys: recreate :default: False Always recreate virtual environment if this option is true, otherwise leave it up to tox. .. conf:: :keys: allowlist_externals :default: Each line specifies a command name (in glob-style pattern format) which can be used in the commands section even if it's located outside of the tox environment. For example: if you use the unix *rm* command for running tests you can list ``allowlist_externals=rm`` or ``allowlist_externals=/usr/bin/rm``. If you want to allow all external commands you can use ``allowlist_externals=*`` which will match all commands (not recommended). .. conf:: :keys: labels :default: :ref_suffix: env A list of labels to apply for this environment. For example: .. tab:: TOML .. code-block:: toml [tool.tox.env_run_base] labels = ["test", "core"] [tool.tox.env.flake8] labels = ["mypy"] .. tab:: INI .. code-block:: ini [testenv] labels = test, core [testenv:flake8] labels = mypy Execute ~~~~~~~ .. conf:: :keys: suicide_timeout :default: 0.0 :version_added: 3.15.2 When an interrupt is sent via Ctrl+C or the tox process is killed with a SIGTERM, a SIGINT is sent to all foreground processes. The :ref:`suicide_timeout` gives the running process time to cleanup and exit before receiving (in some cases, a duplicate) SIGINT from tox. .. conf:: :keys: interrupt_timeout :default: 0.3 :version_added: 3.15 When tox is interrupted, it propagates the signal to the child process after :ref:`suicide_timeout` seconds. If the process still hasn't exited after :ref:`interrupt_timeout` seconds, its sends a SIGTERM. .. conf:: :keys: terminate_timeout :default: 0.2 :version_added: 3.15 When tox is interrupted, after waiting :ref:`interrupt_timeout` seconds, it propagates the signal to the child process, waits :ref:`interrupt_timeout` seconds, sends it a SIGTERM, waits :ref:`terminate_timeout` seconds, and sends it a SIGKILL if it hasn't exited. Run ~~~ .. conf:: :keys: base :default: testenv :version_added: 4.0.0 Inherit missing keys from these sections. .. conf:: :keys: runner :default: :version_added: 4.0.0 The tox execute used to evaluate this environment. Defaults to Python virtual environments, however may be overwritten by plugins. .. conf:: :keys: description :default: A short description of the environment, this will be used to explain the environment to the user upon listing environments. .. conf:: :keys: depends :default: tox environments that this environment depends on (must be run after those). .. warning:: ``depends`` does not pull in dependencies into the run target, for example if you select ``py310,py39,coverage`` via the ``-e`` tox will only run those three (even if ``coverage`` may specify as ``depends`` other targets too - such as ``py310, py39, py38``). This is solely meant to specify dependencies and order in between a target run set. .. conf:: :keys: commands_pre :default: :version_added: 3.4 Commands to run before running the :ref:`commands`. All evaluation and configuration logic applies from :ref:`commands`. .. conf:: :keys: commands :default: The commands to be called for testing. Only execute if :ref:`commands_pre` succeed. Each line is interpreted as one command; however a command can be split over multiple lines by ending the line with the ``\`` character. Commands will execute one by one in sequential fashion until one of them fails (their exit code is non-zero) or all of them succeed. The exit code of a command may be ignored (meaning they are always considered successful) by prefixing the command with a dash (``-``) - this is similar to how ``make`` recipe lines work. The outcome of the environment is considered successful only if all commands (these + setup + teardown) succeeded (exit code ignored via the ``-`` or success exit code value of zero). .. note:: The virtual environment binary path (see :ref:`env_bin_dir`) is prepended to the ``PATH`` environment variable, meaning commands will first try to resolve to an executable from within the virtual environment, and only after that outside of it. Therefore ``python`` translates as the virtual environments ``python`` (having the same runtime version as the :ref:`base_python`), and ``pip`` translates as the virtual environments ``pip``. .. note:: ``shlex`` POSIX-mode quoting rules are used to split the command line into arguments on all supported platforms as of tox 4.4.0. The backslash ``\`` character can be used to escape quotes, whitespace, itself, and other characters (except on Windows, where a backslash in a path will not be interpreted as an escape). Unescaped single quote will disable the backslash escape until closed by another unescaped single quote. For more details, please see :doc:`shlex parsing rules `. .. note:: Inline scripts can be used, however note these are discovered from the project root directory, and is not influenced by :ref:`change_dir` (this only affects the runtime current working directory). To make this behavior explicit we recommend that you make inline scripts absolute paths by prepending ``{tox_root}``, instead of ``path/to/my_script`` prefer ``{tox_root}{/}path{/}to{/}my_script``. If your inline script is platform dependent refer to :ref:`platform-specification` on how to select different script per platform. .. conf:: :keys: commands_post :default: Commands to run after running the :ref:`commands`. Execute regardless of the outcome of both :ref:`commands` and :ref:`commands_pre`. All evaluation and configuration logic applies from :ref:`commands`. .. conf:: :keys: change_dir, changedir :default: {tox_root} Change to this working directory when executing the test command. If the directory does not exist yet, it will be created (required for Windows to be able to execute any command). .. conf:: :keys: args_are_paths :default: False Treat positional arguments passed to tox as file system paths and - if they exist on the filesystem and are in relative format - rewrite them according to the current and :ref:`change_dir` working directory. This handles automatically transforming relative paths specified on the CLI to relative paths respective of the commands executing directory. .. conf:: :keys: ignore_errors :default: False When executing the commands keep going even if a sub-command exits with non-zero exit code. The overall status will be "commands failed", i.e. tox will exit non-zero in case any command failed. It may be helpful to note that this setting is analogous to the ``-k`` or ``--keep-going`` option of GNU Make. .. conf:: :keys: ignore_outcome :default: False If set to true a failing result of this test environment will not make tox fail (instead just warn). .. conf:: :keys: skip_install :default: False :version_added: 1.9 Skip installation of the package. This can be used when you need the virtualenv management but do not want to install the current package into that environment. .. conf:: :keys: package_env :default: {package_env} :version_added: 4.0.0 :ref_suffix: env Name of the virtual environment used to create a source distribution from the source tree for this environment. .. conf:: :keys: package_tox_env_type :version_added: 4.0.0 :default: virtualenv-pep-517 tox package type used to package. .. _python-options: Python options ~~~~~~~~~~~~~~ .. conf:: :keys: base_python, basepython :default: <{env_name} python factor> or Name or path to a Python interpreter which will be used for creating the virtual environment, first one found wins. This determines in practice the Python for what we'll create a virtual isolated environment. Use this to specify the Python version for a tox environment. If not specified, the virtual environments factors (e.g. name part) will be used to automatically set one. For example, ``py310`` means ``python3.10``, ``py3`` means ``python3`` and ``py`` means ``python``. If the name does not match this pattern the same Python version tox is installed into will be used. .. versionchanged:: 3.1 After resolving this value if the interpreter reports back a different version number than implied from the name a warning will be printed by default. However, if :ref:`ignore_basepython_conflict` is set, the value is ignored and we force the :ref:`base_python` implied from the factor name. .. note:: Leaving this unset will cause an error if the package under test has a different Python requires than tox itself and tox is installed into a Python that's not supported by the package. For example, if your package requires Python 3.10 or later, and you install tox in Python 3.9, when you run a tox environment that has left this unspecified tox will use Python 3.9 to build and install your package which will fail given it requires 3.10. .. conf:: :keys: env_site_packages_dir, envsitepackagesdir :constant: The Python environments site package - where packages are installed (the purelib folder path). .. conf:: :keys: env_bin_dir, envbindir :constant: The binary folder where console/gui scripts are generated during installation. .. conf:: :keys: env_python, envpython :constant: The Python executable from within the tox environment. Python run ~~~~~~~~~~ .. conf:: :keys: dependency_groups :default: :version_added: 4.22 A list of names of dependency groups (as defined by :pep:`735`) to install into this Python environment. The installation will happen before installing the package or any of its dependencies. For example: .. tab:: TOML .. code-block:: toml [dependency-groups] test = [ "pytest>=8", ] [tool.tox.env_run_base] dependency_groups = [ "test", ] .. tab:: INI .. code-block:: ini [testenv] dependency_groups = test .. code-block:: toml [dependency-groups] test = [ "pytest>=8", ] .. conf:: :keys: deps :default: Name of the Python dependencies. Installed into the environment prior to project after environment creation, but before package installation. All installer commands are executed using the :ref:`tox_root` as the current working directory. Each value must be one of: - a Python dependency as specified by :pep:`440`, - a `requirement file `_ when the value starts with ``-r`` (followed by a file path), - a `constraint file `_ when the value starts with ``-c`` (followed by a file path). If you are only defining :pep:`508` requirements (aka no pip requirement files), you should use :ref:`dependency_groups` instead. For example: .. tab:: TOML .. code-block:: toml [tool.tox.env_run_base] deps = [ "pytest>=8", "-r requirements.txt", "-c constraints.txt", ] .. tab:: INI .. code-block:: ini [testenv] deps = pytest>=7,<8 -r requirements.txt -c constraints.txt .. conf:: :keys: use_develop, usedevelop :default: false :version_added: 1.6 Install the current package in development mode using :pep:`660`. This means that the package will be installed in-place and editable. .. note:: ``package = editable`` is the preferred way to enable development/editable mode. See the details in :ref:`package`. .. note:: PEP-660 introduced a standardized way of installing a package in development mode, providing the same effect as if ``pip install -e`` was used. .. conf:: :keys: package :version_added: 4.0 When option can be one of ``wheel``, ``sdist``, ``editable``, ``editable-legacy``, ``skip``, or ``external``. If :ref:`use_develop` is set this becomes a constant of ``editable``. If :ref:`skip_install` is set this becomes a constant of ``skip``. .. conf:: :keys: wheel_build_env :version_added: 4.0 :default: - If :ref:`package` is set to ``wheel`` this will be the tox Python environment in which the wheel will be built. The value is generated to be unique per Python flavor and version, and prefixed with :ref:`package_env` value. This is to ensure the target interpreter and the generated wheel will be compatible. If you have a wheel that can be reused across multiple Python versions set this value to the same across them (to avoid building a new wheel for each one of them). .. conf:: :keys: extras :version_added: 2.4 :default: A list of "extras" from the package to be installed. For example, ``extras = testing`` is equivalent to ``[testing]`` in a ``pip install`` command. .. _external-package-builder: External package builder ~~~~~~~~~~~~~~~~~~~~~~~~ tox supports operating with externally built packages. External packages might be provided in two ways: - explicitly via the :ref:`--installpkg ` CLI argument, - setting the :ref:`package` to ``external`` and using a tox packaging environment named ``_external`` (see :ref:`package_env`) to build the package. The tox packaging environment takes all configuration flags of a :ref:`python environment `, plus the following: .. conf:: :keys: deps :default: :ref_suffix: external Name of the Python dependencies as specified by :pep:`440`. Installed into the environment prior running the build commands. All installer commands are executed using the :ref:`tox_root` as the current working directory. .. conf:: :keys: commands :default: :ref_suffix: external Commands to run that will build the package. If any command fails the packaging operation is considered failed and will fail all environments using that package. .. conf:: :keys: ignore_errors :default: False :ref_suffix: external When executing the commands keep going even if a sub-command exits with non-zero exit code. The overall status will be "commands failed", i.e. tox will exit non-zero in case any command failed. It may be helpful to note that this setting is analogous to the ``-k`` or ``--keep-going`` option of GNU Make. .. conf:: :keys: change_dir, changedir :default: {tox_root} :ref_suffix: external Change to this working directory when executing the package build command. If the directory does not exist yet, it will be created (required for Windows to be able to execute any command). .. conf:: :keys: package_glob :default: {envtmpdir}{/}dist{/}* A glob that should match the wheel/sdist file to install. If no file or multiple files is matched the packaging operation is considered failed and will raise an error. Python virtual environment ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. conf:: :keys: system_site_packages, sitepackages :default: False Create virtual environments that also have access to globally installed packages. Note the default value may be overwritten by the ``VIRTUALENV_SYSTEM_SITE_PACKAGES`` environment variable. .. warning:: In cases where a command line tool is also installed globally you have to make sure that you use the tool installed in the virtualenv by using ``python -m `` (if supported by the tool) or ``{env_bin_dir}/``. If you forget to do that you will get an error. .. conf:: :keys: always_copy, alwayscopy :default: False Force virtualenv to always copy rather than symlink. Note the default value may be overwritten by the ``VIRTUALENV_COPIES`` or ``VIRTUALENV_ALWAYS_COPY`` (in that order) environment variables. This is useful for situations where hardlinks don't work (e.g. running in VMS with Windows guests). .. conf:: :keys: download :version_added: 3.10 :default: False True if you want virtualenv to upgrade pip/wheel/setuptools to the latest version. Note the default value may be overwritten by the ``VIRTUALENV_DOWNLOAD`` environment variable. If (and only if) you want to choose a specific version (not necessarily the latest) then you can add ``VIRTUALENV_PIP=20.3.3`` (and similar) to your :ref:`set_env`. Python virtual environment packaging ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. conf:: :keys: meta_dir :version_added: 4.0.0 :default: {env_dir}/.meta Directory where to put the project metadata files. .. conf:: :keys: pkg_dir :version_added: 4.0.0 :default: {env_dir}/.dist Directory where to put project packages. .. conf:: :keys: config_settings_get_requires_for_build_sdist :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``get_requires_for_build_sdist`` backend API endpoint. .. conf:: :keys: config_settings_build_sdist :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``build_sdist`` backend API endpoint. .. conf:: :keys: config_settings_get_requires_for_build_wheel :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``get_requires_for_build_wheel`` backend API endpoint. .. conf:: :keys: config_settings_prepare_metadata_for_build_wheel :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``prepare_metadata_for_build_wheel`` backend API endpoint. .. conf:: :keys: config_settings_build_wheel :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``build_wheel`` backend API endpoint. .. conf:: :keys: config_settings_get_requires_for_build_editable :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``get_requires_for_build_editable`` backend API endpoint. .. conf:: :keys: config_settings_prepare_metadata_for_build_editable :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``prepare_metadata_for_build_editable`` backend API endpoint. .. conf:: :keys: config_settings_build_editable :version_added: 4.11 Config settings (``dict[str, str]``) passed to the ``build_editable`` backend API endpoint. .. conf:: :keys: fresh_subprocess :version_added: 4.14.0 :default: True if build backend is setuptools otherwise False A flag controlling if each call to the build backend should be done in a fresh subprocess or not (especially older build backends such as ``setuptools`` might require this to discover newly provisioned dependencies). Pip installer ~~~~~~~~~~~~~ .. conf:: :keys: install_command :default: python -I -m pip install {opts} {packages} :version_added: 1.6 Determines the command used for installing packages into the virtual environment; both the package under test and its dependencies (defined with :ref:`deps`). Must contain the substitution key ``{packages}`` which will be replaced by the package(s) to install. You should also accept ``{opts}`` -- it will contain index server options such as ``--pre`` (configured as ``pip_pre``). .. note:: You can also provide arbitrary commands to the ``install_command``. Please take care that these commands can be executed on the supported operating systems. When executing shell scripts we recommend to not specify the script directly but instead pass it to the appropriate shell as argument (e.g. prefer ``bash script.sh`` over ``script.sh``). .. conf:: :keys: list_dependencies_command :default: python -m pip freeze --all :version_added: 2.4 The ``list_dependencies_command`` setting is used for listing the packages installed into the virtual environment. This command will be executed only if executing on Continuous Integrations is detected (for example set environment variable ``CI=1``) or if journal is active. .. conf:: :keys: pip_pre :default: false :version_added: 1.9 If ``true``, adds ``--pre`` to the ``opts`` passed to :ref:`install_command`. This will cause it to install the latest available pre-release of any dependencies without a specified version. If ``false``, pip will only install final releases of unpinned dependencies. .. conf:: :keys: constrain_package_deps :default: false :version_added: 4.4.0 If ``constrain_package_deps`` is true, then tox will create and use ``{env_dir}{/}constraints.txt`` when installing package dependencies during ``install_package_deps`` stage. When this value is set to false, any conflicting package dependencies will override explicit dependencies and constraints passed to ``deps``. .. conf:: :keys: use_frozen_constraints :default: false :version_added: 4.4.0 When ``use_frozen_constraints`` is true, then tox will use the ``list_dependencies_command`` to enumerate package versions in order to create ``{env_dir}{/}constraints.txt``. Otherwise the package specifications explicitly listed under ``deps`` (or in requirements / constraints files referenced in ``deps``) will be used as the constraints. If ``constrain_package_deps`` is false, then this setting has no effect. User configuration ------------------ tox allows creation of user level config-file to modify default values of the CLI commands. It is located in the OS-specific user config directory under ``tox/config.ini`` path, see ``tox --help`` output for exact location. It can be changed via ``TOX_USER_CONFIG_FILE`` environment variable. Example configuration: .. code-block:: ini [tox] skip_missing_interpreters = true Set CLI flags via environment variables --------------------------------------- All configuration can be overridden via environment variables too, the naming convention here is ``TOX_