Bug fixes
- An open-ended factor range whose explicit bound sits outside the supported CPython window no longer expands to nothing. An INI
env_listsuch aspy3{16-}used to fail withValueError: py3{}, and a TOML range dict expanded to an empty axis, dropping that dimension from the matrix (#4176) by @HyperionBurn and @gaborbernat. - A TOML
replace = "glob"table now substitutes itspatternanddefault, matching the INI{glob:PATTERN:DEFAULT}form, sopattern = "{env_name}/*.whl"matches files instead of a literal{env_name}directory (#4180) by @ag3ntsc4rn and @gaborbernat. (#4178) --force-depnow matches dependency names after PEP 503 normalization, so--force-dep typing-extensions==4.9.0replacesTyping_Extensions==4.12.2indepsinstead of passing both pins to pip, and replaces aTyping_Extensionsrequirement from the package metadata, where tox used to drop the forced pin (#4181) by @ag3ntsc4rn and @gaborbernat. (#4179){glob:PATTERN:DEFAULT}with a single-letter pattern and an absolute default, such as{glob:z:/fallback}, no longer expands to an empty string on POSIX: tox now looks for a Windows drive letter in the pattern only on Windows (#4183) by @JingHao-Leon and @gaborbernat. (#4182)- A TOML
{ replace = "env" }table inset_envwhosedefaultends in a backslash now resolves to the variable or the default, instead of the literal{env:...}text (#4185) by @JingHao-Leon and @gaborbernat. (#4184) --no-indexin a requirements file ordepsnow wins over--index-urland--extra-index-urlon the same or a later line, as in pip. Previously tox dropped it and installed from those indexes, and from PyPI too when given an--extra-index-url(#4187) by @syahra712 and @gaborbernat.- A leading UTF-8 byte order mark in
pyproject.tomlno longer breaksdependency_groupsor reading the package's static dependencies from[project], and one in abase_python_filesuch as.python-versionis no longer read as part of the Python version (#4188) by @pcbeingused333 and @gaborbernat. --parallel autonow counts the CPUs tox may run on instead of every CPU in the machine, so it respects the CPU affinity mask set bytasksetor a container's cpuset (andPYTHON_CPU_COUNTon Python 3.13+) (#4190) by @mehdimirzafaruk and @gaborbernat.- A TOML
{ replace = "ref", env = ..., key = ... }now takes a path (change_dir,env_dir), set (extras,labels,dependency_groups) or environment list (depends) value from another environment, instead of failing validation of the referencing key (#4192) by @pcbeingused333 and @gaborbernat. --result-jsonis now always written as UTF-8 instead of the locale's preferred encoding. Captured output that a legacy Windows code page cannot represent, or that holds bytes which are not valid UTF-8, no longer crashes the run at the end with a truncated file; the invalid bytes are stored as\uXXXXescapes (#4194) by @mehdimirzafaruk and @gaborbernat.- Glob character sets such as
lint-[ab]andlint-[!a]in an inidependsnow load, as thedependsreference documents, instead of failing to load the configuration (#4195) by @nk-batman21 and @gaborbernat. - Disable the parallel spinner by default in CI for the legacy command, as
tox run-paralleldoes (#4196) by @Rodrigo-Palma and @gaborbernat. - Leave extras, editables, local directories and source archives out of the
constrain_package_depsconstraints file, so pip no longer rejects it (#4203) by @ericdelorefice and @gaborbernat. - An empty
PYTHONHASHSEEDno longer makes every tox command fail withValueError. tox treats it as unset, as Python does, and picks a random seed (#4205) by @devYRPauli and @gaborbernat.
Documentation
- Explain how to quote command arguments built from
[vars]values that contain spaces, and how quotes stored in those values pair with the quotes around them (#4197) by @Blues-berry and @gaborbernat. (#4191)
New Contributors
- @devYRPauli made their first contribution in #4205
- @JingHao-Leon made their first contribution in #4183
- @HyperionBurn made their first contribution in #4176
- @ag3ntsc4rn made their first contribution in #4180
- @ericdelorefice made their first contribution in #4203
- @nk-batman21 made their first contribution in #4195
- @mehdimirzafaruk made their first contribution in #4194
- @Blues-berry made their first contribution in #4197