Changelog¶
Unreleased (2026-10-31)¶
4.67.5 (2026-10-31)¶
Fixed¶
A packaging environment whose
base_python(ordefault_base_python) is not installed no longer crashes withKeyError: 'skip_missing_interpreters'. It now fails with the missing interpreter, or skips the run environment whenskip_missing_interpretersis true, as tox did before 4.36.0 (#4213) by @gaborbernat. (#4212)Keep environment markers when a package extra refers to another extra of the same package.
For example,
demo[dev]; python_version < '3.10'keeps the version condition on dependencies fromdev(#4216) by @ericdelorefice and @gaborbernat.A
pylock.tomlor a tox user configuration file (TOX_USER_CONFIG_FILE) saved with a UTF-8 byte order mark, as some Windows editors do, is now read instead of failing with a TOML decode error or being ignored withfailed to read config file(#4217) by @pcbeingused333.With
args_are_pathsenabled, a positional argument naming an existing file whose rewritten path relative tochange_dirstarts with-(for exampletests/--config=evil.cfg) is now prefixed with./so the command still receives a path instead of an option (#4317) by @rahuldevikar and @gaborbernat. (#4218)An extending TOML
replacetable with a nonemptymarkernow raises an error instead of adding its internalvalueandmarkerkeys to deps or requires. Markers onset_envvalues remain supported (#4320) by @rahuldevikar and @gaborbernat. (#4220)A TOML type mismatch no longer includes an expanded string or container value. A malformed
commandssetting with{env:...}reports its type instead of the substituted text (#4327) by @rahuldevikar and @gaborbernat. (#4221)Keep artifacts supplied with
--installpkgout of tox’s provisioning environment while installing them in the requested test environments (#4304) by @Pratham2511 and @gaborbernat. (#4222)A
file:URI passed to--installpkgis now percent-decoded once instead of twice, so a path containing a literal%sequence, such as a directory namedfeature%2Flogin, selects the package the user named (#4300) by @pcbeingused333 and @gaborbernat. (#4223)A relative
TOX_INSTALL_PKGor user configurationinstall_pkgpath is now resolved against the invocation directory, as--installpkgalready was, so tox inspects and installs from the same path (#4333) by @rahuldevikar and @gaborbernat. (#4224)tox refuses a symlink or Windows junction at
meta_dirbecause the build frontend empties that directory during metadata preparation (#4332) by @rahuldevikar and @gaborbernat. (#4225)An explicitly empty
base_python(for example{env:TOXPYTHON:python3.11}withTOXPYTHONempty) now fails during configuration withbase_python for env <name> is empty. Blank entries in abase_pythonlist are ignored (#4326) by @rahuldevikar and @gaborbernat. (#4226)A path setting that expands to an empty value, such as
env_tmp_dir = {env:SCRATCH_DIR}withSCRATCH_DIRunset, now fails with a configuration error instead of resolving to the current directory, which tox could then clear (#4330) by @rahuldevikar and @gaborbernat. (#4227)Keep every value of a multi-value command line flag, such as
-f py legacy, with that flag. The command scanner took a later value matching a subcommand as the command, causing environments without that factor to run (#4319) by @rahuldevikar and @gaborbernat. (#4228)Unreadable wheels, invalid wheel metadata, and unreadable or empty source archives supplied through
--installpkgnow produce errors that name the artifact instead of internal error tracebacks (#4287) by @santhiprakash and @gaborbernat. (#4230)Reject NUL characters in
set_envfile assignments with a handled input error instead of a subprocess traceback (#4279) by @Doomguy-BFG9000 and @gaborbernat. (#4231)Limit each requirement or constraint file to 10 MiB, so oversized and endless includes fail with a size error. For remote files, tox checks a 120-second deadline between response body reads. Slow HTTP framing can delay that check (#4312) by @rahuldevikar and @gaborbernat. (#4232)
tox now validates inline script
dependenciesas requirements before installing them. An invalid entry such as a pip option fails before tox passes the dependencies to pip (#4306) by @santhiprakash and @gaborbernat. (#4233)Read static package dependencies and the
editable-legacyinstall path from the packaging environment’s package_root instead of the core one, so apackage_rootset in[testenv:.pkg]no longer pairs the built package with the dependencies declared next totox.ini(#4321) by @rahuldevikar and @gaborbernat. (#4234)A package environment path that is already a symlink no longer causes
tox listto createfile.lockunder the link target (#4311) by @rahuldevikar and @gaborbernat. (#4235)tox now expands
${VAR}in requirements and constraints files using the environment running pip, includingpass_envandset_env, instead of the tox process. A variable absent from that environment stays literal, so tox cannot put its host value in a fetched URL. To retain expansion, add it topass_envor define it withset_env(#4323) by @rahuldevikar and @gaborbernat. (#4236)Mask values when a flag or environment variable name contains a secret keyword after a newline (#4259) by @haigou-web and @gaborbernat. (#4237)
tox -hno longer prints secret-looking--key=valuevalues fromTOX_OVERRIDE. Conversion warnings also mask those values in invalidTOX_options (#4303) by @faresrafat3 and @gaborbernat. (#4238)A
tox.tomlorpyproject.tomlstring with literal braces around text containing a colon, such as a JSON argument holding a URL or a time, is now kept as written, as intox.ini, instead of being read as a{key:default}reference. Positional arguments such asset_env:xpassed into such braces through{posargs}no longer expand into the value of that setting (#4269) by @Anandb71 and @gaborbernat. (#4239)Reject wheel metadata entries over 8 MiB uncompressed, limiting memory use during package installation (#4328) by @rahuldevikar and @gaborbernat. (#4240)
Recreate an environment when its
.tox-info.jsoncontains a non-mapping value for a section that requires a mapping (#4258) by @haigou-web and @gaborbernat. (#4241)Preserve empty positional arguments when rewriting relative paths for
change_dir(#4256) by @Fire162 and @gaborbernat. (#4242)base_python_filerejects non-regular files, undecodable content, and version lines over 1024 characters with a handled error naming the file. It reads comments in bounded chunks, so a long comment can still precede the version (#4325) by @rahuldevikar and @gaborbernat. (#4243)base_python_filenow accepts only a Python version specifier (such as3.13orpypy3.10) from the version file. A path or program name there no longer makes tox start that program during interpreter discovery, and the rejected line is not echoed in the error message (#4324) by @rahuldevikar and @gaborbernat. (#4244)An inline deps or constraints entry that directly substitutes a host variable via
{env:NAME}or a TOMLreplace = "env"table now passes${OTHER}text in that value to pip unchanged. A TOML reference to the loaded entry keeps the same behavior. A${NAME}reference written in the configuration or a substitution default still expands (#4329) by @rahuldevikar and @gaborbernat. (#4245)pylocknow evaluates Python and platform markers using a complete environment from the target interpreter. Previously, missing values such asimplementation_versioncame from the Python running tox, which could select a package locked for the wrong interpreter (#4331) by @rahuldevikar and @gaborbernat. (#4246)For active packages in a
pylock.toml, reject whitespace or control characters in hash tokens, archive or VCS URLs, commit IDs, and subdirectories before writing pip requirements. A line break in one of these fields could add a pip option such as--index-url. The check also covers values pip expands from${VAR}references. Changing a referenced value reinstalls the locked packages (#4315) by @rahuldevikar and @gaborbernat. (#4247)A direct URL entry in requires (such as
tox @ file:///path/to/tox.whl) now triggers provisioning unless the installed distribution’sdirect_url.jsonrecords the requested source, including a supported archive hash, subdirectory, or VCS revision. pip discards fragment fields such asegg; these no longer trigger repeat provisioning. When the installer omits credentials from the origin record, a credentialed direct URL without a requested archive hash fails with an explanation instead of hanging during provisioning (#4314) by @rahuldevikar and @gaborbernat. (#4248)tox now rejects sdist members whose paths or link targets escape the extraction directory. On Python versions without the
tarfiledata filter, tox checks each member as it extracts the archive (#4316) by @rahuldevikar and @gaborbernat. (#4249)Report the file and line number for an invalid
set_envfile line, since its content may contain a secret (#4298) by @r3wretrhy and @gaborbernat. (#4250)Keep input bytes out of
tox configINI, JSON, and TOML output when a configuration key reads non-UTF-8 data (#4302) by @ducanhnguyen223, ducanhnguyen223 and @gaborbernat. (#4251)A pre-existing symlink at
.tox-info.jsonno longer supplies cached state. When tox writes state, it replaces the link and leaves its target untouched (#4322) by @rahuldevikar and @gaborbernat. (#4253)When rebuilding a stale bootstrap environment for
virtualenv_spec, tox removes a link at the cache path and creates the replacement withoutvenv’sclearoption. A link placed there after cleanup and before directory creation stops the rebuild without emptying its target (#4313) by @rahuldevikar and @gaborbernat. (#4254)Redirected Windows output now escapes characters its code page cannot encode instead of raising
UnicodeEncodeError. The stream keeps its encoding (#4257) by @haigou-web and @gaborbernat. (#4255)Read the Docs now fetches Git history and tags before installing tox, so VCS version detection can satisfy
tox-uv(#4337) by @gaborbernat. (#4336)A host variable substituted through
set_envinto deps or constraints now keeps${NAME}text literal for pip. A${NAME}written in the configuration still expands (#4342) by @gaborbernat. (#4338)On Windows, building a
virtualenv_specbootstrap environment no longer writes through a junction swapped into its cache entry. A linked project work directory still works; the work directory must allow temporary subdirectories (#4341) by @gaborbernat. (#4339)test_parallel_generaluses an absolute missing-interpreter path to avoid Windows registry probes in CI (#4346) by @gaborbernat. (#4344)A
set_envline with a substituted key keeps its value in one variable, even when the input contains a line break. A key that expands to=or a line separator raises an error (#4265) by @gaborbernat.A host environment value selected by
{env:NAME}that references itself twice could stall tox during recursive expansion. tox now stops expansion at the first depth-limit hit, logs one warning, and leaves the remaining text unexpanded (#4272) by @gaborbernat.An included
set_envkeeps{env:...}values intact when the source environment inherits the setting, usessetenvor comes from a generative section. The TOML string form"{[env.name]set_env}"does the same. Line breaks,;andfile|text inside values no longer becomeset_envsyntax (#4268) by @gaborbernat.An invalid
pylock.toml, including malformed TOML or non-UTF-8 bytes, now reportsinvalid pylock filewith the filename and the parser or decoder error instead of an internal traceback (#4215) by @PRINCE2-AI, Prince and @gaborbernat.Help with an invalid
-cconfiguration now looks for an inline plugin in the requested file’s parent directory or inside the selected directory (#4267) by @gaborbernat.INI commands now keep a path reference such as
{tox_root},{env_tmp_dir}or{env_python}within one argument, including when the path contains spaces, quotes or backslashes. The same applies to tox-provided values such as{host_python}and{tox_root_name}, entries of a list such as{base_python}, and file names matched by{glob:PATTERN}. Command values set with-xorTOX_OVERRIDEfollow the same rule (#4290) by @gaborbernat.INI commands that reference deps now preserve each pip option operand as one argument. A substituted
--find-linkspath containing spaces can no longer add options to the command. Thetox configdisplay escapes spaces, quotes and backslashes in those operands (#4276) by @gaborbernat.Keep a substitution within the quoted INI command argument it is part of:
"--title={env:TITLE}"is one argument even when the value ofTITLEholds quotes or whitespace, as it is for a TOML argument array. tox used to paste the value into the command text before splitting it, so a quote in the value ended the argument and the rest of the value arrived as further arguments of the command.install_commandandlist_dependencies_commandget the same handling (#4283) by @gaborbernat.Mask credentials in
requiresdirect URLs in missing-requirement messages and echoed provisioning commands (#4334) by @gaborbernat.Mask secret-looking inline flag values in result JSON command lists, retry warnings, subprocess start errors, path debug logs, unknown-argument errors, and
ExecuteRequestrepresentations (#4264) by @gaborbernat.On POSIX, tox now pins each directory on the path to the project root while reading or changing a
.venvredirect. A concurrent path swap can no longer redirect removal or replacement into another directory (#4308) by @gaborbernat.On POSIX, tox now resolves relative commands and
PATHentries from the command’s working directory. Theallowlist_externalscheck andTOX_LIMITED_SHEBANGinterpreter selection use the file that the child executes (#4275) by @gaborbernat.On Windows, INI command references such as
{[testenv:a]commands}now preserve argument boundaries when a positional argument contains an apostrophe or backslash.tox configdisplays the command with the same quoting tox uses to parse a reference (#4277) by @gaborbernat.On Windows, tox pins the project path while reading or changing a
.venvredirect. A concurrent directory rename or junction added to an empty project directory cannot redirect a write or removal into another project. Redirect writes replace.venvwith a temporary file, leaving the target of a swapped.venvsymlink or hard link unchanged (#4335) by @gaborbernat.On Windows, tox quotes arguments passed to
.batand.cmdcommands forcmd.exe. Values containing shell operators or percent signs reach the batch file without starting another command or expanding environment variables. Batch scripts that inspect raw%1may now see surrounding quotes for arguments that need them (#4288) by @gaborbernat.Pass each base_python entry to virtualenv as a separate
--pythonargument. virtualenv split the oldVIRTUALENV_PYTHONvalue on commas andos.pathsep, then tried the first candidate last; that could start an unintended program (#4292) by @gaborbernat.Prefix normalized dependency paths whose first component starts with
-using./on POSIX or.\on Windows. The resulting pip argument no longer starts with-(#4266) by @gaborbernat.Preserve
#in INI references to paths, sochange_dir,env_dirandset_env = file|...use the checkout directory when its name contains#. On POSIX, requirement-file paths with a space before#remain readable (#4285) by @gaborbernat.Preserve frozen dependency constraints when using
--no-captureor setting up an environment withtox exec(#4301) by @Pratham2511 and @gaborbernat.Reject a bootstrap cache parent that already resolves outside the work directory before opening its lock or creating an environment (#4345) by @gaborbernat.
Reject a line break in a substitution within one
depsorconstraintsentry, and a backslash ending a substituted requirement line. Also reject line breaks and trailing backslashes in globbed requirement paths and provisioning requirements. These values can no longer add pip options or consume the following entry (#4295) by @gaborbernat.Reject an entry separator supplied by a substitution within an INI list, set, dictionary or env_list entry. This prevents a value inside one requires entry from adding a requirement, and a value inside one env_list entry from selecting another environment. A substitution that occupies a whole entry can still expand to several entries. The same check applies to text overrides supplied with
-xorTOX_OVERRIDE(#4284) by @gaborbernat.Replace line breaks in positional arguments before quoting them for
{posargs}and INI command references. This prevents a line break in one argument from starting another command (#4294) by @gaborbernat.Shell completion now uses the
-c/--confpath from the typed line when loadingtoxfile.pyand offering environments. While that path is incomplete, completion loads no inline plugin (#4278) by @gaborbernat.The provisioned tox now starts with Python’s safe path option. During its
-m toxre-exec, Python no longer puts the start directory first onsys.path, where an unrelated file could replace tox or a dependency (#4270) by @gaborbernat.Validate built-in command options before selecting an inline plugin. An invalid option value no longer causes tox to import a plugin from an unselected project. Put
-c/--confor--rootbefore options defined by an inline plugin (#4281) by @gaborbernat.Values expanded from secret-named environment variables in requirements files no longer appear in the install cache, recreation warnings, or file-read errors. tox may recreate an existing environment once to replace a cache written by an older version (#4280) by @gaborbernat.
When positional arguments supply the command, as in
tox execorcommands = {posargs}, tox now leaves a bare program name such aspythonunchanged. It also leaves a bare executable first positional value unchanged, including when a command uses that value as data, because wrappers can run it as a program. A same-named file in the start directory no longer replaces the environment’s program. An explicit path such as./pythonstill follows args_are_paths (#4289) by @gaborbernat.With
TOX_LIMITED_SHEBANGenabled, tox now keeps quote and backslash characters in an unquoted shebang interpreter path. They no longer change the executable tox starts. The existing double-quoted form for paths with spaces remains supported (#4274) by @gaborbernat.With
args_are_pathson POSIX, tox now rewrites positional paths from the resolved change_dir. A linked.toxcan no longer redirect a positional path to a file beside the link target (#4273) by @gaborbernat.pylockanddependency_groupsnow usepackage_rootwhen a run has no package environment. They previously usedtox_rootin that case (#4299) by @pcbeingused333 and @gaborbernat.tox now rejects environment names that are not a single path component before creating an environment. This prevents a substituted
env_list, label or package environment name from selecting a directory outsidework_dir(#4271) by @gaborbernat.tox now resolves relative
env_dir,env_tmp_dir,env_log_dir,work_dir,temp_dir,package_root,meta_dir,pkg_dirandpackage_globvalues against tox_root. Withtox -c path/to/tox.inistarted elsewhere, it no longer clears or reuses those directories in the start directory or selects a package from there (#4291) by @gaborbernat.tox passes positional arguments,
{glob:PATTERN}matches andTOX_FACTOR_<label>overrides literally in INI configuration: a{...}or[]in them is no longer substituted again, sotox run -- '{env:SECRET}'hands the command{env:SECRET}instead of the variable’s value andtox run -- '{posargs} -x'stays one argument. TheDEFAULTSof{posargs:DEFAULTS}and referenced keys still expand their own substitutions (#4286) by @gaborbernat.
Security¶
Keep virtualenv’s pip seeder debug line visible and mask secret-named environment values before tox prints it (#4293) by @gaborbernat.
Mask secret-looking inline flags inside a command argument when INI parsing leaves several words in that argument (#4263) by @gaborbernat.
Reject pip options added through partial
depsorconstraintssubstitutions, including${VAR}expansion. tox still accepts options written on the same line in either setting (#4297) by @gaborbernat.Replace stale package staging links under the work directory and reject staging paths another account can change. Create the staged package exclusively so a substituted destination link cannot overwrite its target (#4305) by @gaborbernat.
Validate
virtualenv_specas avirtualenvrequirement with optional version specifiers before invoking pip (#4261) by @gaborbernat.Where descriptor-based
rmtreeandO_DIRECTORY/O_NOFOLLOWare available, clean environment, log, and temporary directories relative to an open directory descriptor so a symlink swap cannot redirect deletions outside tox’s work directory. Replace a link already at the cleanup path without emptying its target (#4296) by @gaborbernat.set_envenvironment files now split entries only at LF or CR line endings. Embedded Unicode separators no longer start a new variable (#4260) by @gaborbernat.
4.67.4 (2026-10-28)¶
Fixed¶
A dependency group entry that refers to the project’s own extra with an environment marker, such as
demo[dev]; python_version < "3.10", now keeps that marker on the extra’s requirements instead of installing them on every interpreter (#4211) by @ericdelorefice and @gaborbernat.
4.67.3 (2026-10-28)¶
Fixed¶
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_deps constraints 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)
4.67.2 (2026-10-27)¶
Packaging¶
Releases now run on the shared tox-dev/github-workflows pipeline, with a locked release toolchain and generated GitHub Release notes (#4202) by @gaborbernat.
4.67.1 (2026-10-18)¶
Fixed¶
Preserve ignore (
-) and invert (!) exit code prefixes on commands when referenced via TOML{ replace = "ref", ... }. (#4169)Installing from a
pylock.tomlwith no dependency_groups selected now uses the lock file’sdefault-groups, as PEP 751 specifies. Previously packages marked'default' in dependency_groups(as written bypdm export -f pylock) were skipped - by @pcbeingused333. (#4173)A positional
{factor:N}label in anenv_basenow resolves against that table’s ownfactors, so with severalenv_basetables or anenv_listproductit no longer expands to an empty string. (#4174)
4.67.0 (2026-10-17)¶
Added¶
Allow opting in to tox substitutions within TOML positional arguments with
substitute = true. (#4165)
Fixed¶
Keep capturing the output of the packaging backend with
--no-capture, sotox --no-captureno longer hangs atstarted backendwhile waiting for the backend’s reply. (#4163)A leading UTF-8 byte order mark in
tox.ini,setup.cfg,tox.tomlor a TOMLpyproject.tomlno longer stops the configuration from loading - editors on Windows may add one. (#4166)tox --no-provision <command>no longer treats the command as the JSON output path: a global option placed before a subcommand now keeps it, sotox --no-provision listlists the environments instead of writing a file namedlist. (#4168)
Documentation¶
Link overridden argparse methods and logging.Handler.name in the plugin API reference. (#4170)
4.66.0 (2026-10-16)¶
Added¶
set_envenvironment files acceptexport KEY=valuelines, settingKEY- by @RavSinghChandan. (#4161)
Fixed¶
Remember a failed interpreter lookup for a virtualenv environment instead of repeating the full
PATHscan for every setting that needs it, sotox configandtox runon configurations listing interpreters that are not installed are faster. (#4162)
4.65.6 (2026-10-15)¶
Fixed¶
4.65.5 (2026-10-14)¶
Fixed¶
Keep braces that are not a substitution in TOML configurations, as INI does, so
{}infind -execor a dict literal inpython -creaches the command intact (#4150)
4.65.4 (2026-10-12)¶
Documentation¶
Clarify how
TOX_environment variables set CLI option defaults and howTOX_OVERRIDEchanges configuration values. (#4146)
4.65.3 (2026-10-11)¶
Fixed¶
Allow
--skip-envwith-e,-m, and-fso it filters the selected environments (#4143)
4.65.2 (2026-10-10)¶
Fixed¶
A
dependency_groupsrun whose package root has nopyproject.tomlnow fails with the path it looked at, instead of installing none of the requested groups and reporting success - by @feiiiiii5. (#4142)
4.65.1 (2026-10-10)¶
Fixed¶
tox removes read-only files on Windows when it empties an environment’s
tmpor log directory, or the whole environment on recreate - by @SulimanAbdulrazzaq.A read-only file in the directory itself used to stop every later run with
internal error.A read-only file in a sub-directory used to stay behind without a warning. (#4138)
Packaging¶
4.65.0 (2026-10-09)¶
Added¶
Bump the default maximum CPython minor version to 3.15 in generative environment lists. (#4136)
Fixed¶
--result-jsonandtox config -ocreate the missing parent directory of the output file instead of crashing - by @SulimanAbdulrazzaq. (#4126)A
set_envenv file that is a directory or not UTF-8 fails the environment with a configuration error instead of a traceback, and a leading UTF-8 byte order mark no longer ends up in the first key - by @SulimanAbdulrazzaq. (#4127)A reused environment with
commands = []clearsenv_log_dirat the start of the run instead of keeping logs from the previous run - by @glaziermag. (#4130)
Documentation¶
Drop
@implfrom thetox_append_version_infoplugin doc examples, since it made tox skip the inline plugin - by @Rodrigo-Palma. (#4135)
4.64.10 (2026-10-08)¶
Fixed¶
Report an invalid configuration value as a one-line error naming the environment and key instead of a traceback, including
-xoverrides and values set by plugins - by @hfycium. (#4118)A command prefixed with
!that exits with0now fails the environment with exit code1; before, tox reported it as a success - by @feiiiiii5. (#4119)Recreating an environment or clearing its temporary and log directories removes symlinks to directories, leaving their targets intact - by @gaborbernat. (#4121)
A command prefixed with
!that cannot start, such as a missing executable, now fails the environment instead of passing - by @feiiiiii5. (#4125)
4.64.9 (2026-10-05)¶
Fixed¶
Resolve substitutions and
file|entries in set_env overrides passed through-xorTOX_OVERRIDE. Appended blocks replace inherited values while preserving explicit keys in the same or later overrides. Preserve these rules through section references, including native TOML arrays withextend = true. Resolve env-file selectors and values in the consuming environment. Prevent included values from overriding tox’s own variables - by @Rodrigo-Palma. (#4116)
4.64.8 (2026-10-03)¶
Fixed¶
tox combines
--no-binaryand--only-binaryacross the lines ofdepsand of requirements files the way pip does, where the last line used to replace the earlier ones. With--only-binary :all:and a--no-binaryexception, tox passes--only-binaryto pip first, so pip keeps the exception.tox configshows the merged values tox passes to pip - by @SulimanAbdulrazzaq. (#4110)tox configshowsdepswith every global option merged the way tox passes it to pip, a later-ireplacing an earlier one and repeated flags shown once, and reports the errortox runwould raise for invaliddeps.constraintsshows the configured files instead of the path oftox.ini, and a comment line inconstraintsno longer fails the run.depsthat give pip nothing to install no longer conflict withpylock.set_envincludesPIP_USER,TOX_ENV_DIR,TOX_ENV_NAME,TOX_WORK_DIRandVIRTUAL_ENV, the values tox sets for commands - by @gaborbernat. (#4111)A TOML
refto another environment’sdeps,constraintsorcommandsworks intox configandtox run. It used to fail with'PythonDeps' object is not iterableorCommand(args=[...]) is not list- by @gaborbernat. (#4112)In INI
commands,commands_preandcommands_post, a reference such aspip install {[testenv:x]deps}that shares its line with other text joins the referenced lines into that one command as arguments, as in tox 3. tox used to run each referenced line after the first as a separate command. A reference alone on its line still expands to one command per referenced line. This changesecho {[testenv:x]commands}, which now runs oneechowith every referenced command as its arguments - by @gaborbernat. (#4113)The JSON schema described requires with the text of provision_tox_env, so editors showed the wrong hover for it - by @gaborbernat. (#4115)
Documentation¶
The configuration reference listed wrong defaults for args_are_paths (
True), pkg_dir ({env_dir}/dist), skip_missing_interpreters (False), min_version (unset) and requires (tox) - by @Rodrigo-Palma. (#4114)
4.64.7 (2026-10-01)¶
Fixed¶
tox mansuggests~/.profileinstead of~/.zshrcwhen the shell is not fish, bash, zsh, csh or tcsh, for examplesh,kshor an unsetSHELL- by @Rodrigo-Palma.tox picks the shell from the executable name, so
/home/zshuser/bin/bashgets~/.bashrc.Outside fish, csh and tcsh, the reload hint reads
. <file>instead ofsource <file>, sincedashhas nosource.The fish line keeps the default man path when
MANPATHwas unset, instead of hiding every other man page.csh and tcsh get a
setenvline for~/.tcshrcor~/.cshrcinstead of anexportline for~/.profile. (#4109)
4.64.6 (2026-10-01)¶
Fixed¶
tox -eandTOXENVaccept every interpreter name that picks abase_pythonfor an environment the configuration does not declare - by @breken-ai.cpython313,cpython-3.13,graalpy311,jython2.7,rustpython3andironpython3select that interpreter instead of failing with “provided environments not found”.The
ddebug-build suffix works too, for examplepy313d.cython313now fails as an unknown environment; it used to run on the Python that tox runs under. (#4106)
A
set_envblock pulled in with{[section]set_env}now applies a PEP-508 marker only to the value it came with, as the inline and TOML forms already do - by @feiiiiii5. A false marker on an earlier line no longer hides a value that the inheriting environment, a later unconditional line or an environment file supplies. (#4107)set_envvalues resolve when tox reads them, so{env:KEY}sees the keys a block pulls in with{[section]set_env}, and a{ replace = "env" }table sees the keys next to it - by @gaborbernat, found by @breken-ai. Configurations that see a difference:A value pulled in from another section that refers to a key of the same block now gets the block’s value instead of the host variable.
A pulled-in line that refers to its own key, such as
PYTHONHASHSEED = {env:PYTHONHASHSEED:0}, reads the host variable or its default, as the same line written in place does. It used to read the value tox sets.A key written in an INI
set_envwins over the same key pulled in from another section, and a later pulled-in section wins over an earlier one, at every nesting level. A nested section could override the section that included it before.tox configshows the keys of every pulled-in section thattox runsets.A section that pulls itself in, a TOML
refto itself, and values that refer to each other fail the environment with the cycle. They used to fail with a traceback or “could not find python interpreter”, and values that referred to each other inside a pulled-in section read the host variables without a warning. (#4108)
4.64.5 (2026-09-29)¶
Fixed¶
4.64.4 (2026-09-27)¶
Fixed¶
Pass
--preonce, before the packages, in the defaultinstall_commandwith pip_pre set totrue. (#4097)Fix list conversion for command line defaults from environment variables and user configuration files. For example,
TOX_LABELS=old;newselects environments labeledoldornew, andTOX_LIST_KEYS_ONLY=env_name;depsselects both configuration keys. Support list-valued options without an explicit default or element type, including append actions. (#4098)
4.64.3 (2026-09-26)¶
Fixed¶
A
set_envwritten as a list of tables in TOML now keeps everyfileentry and honors the order of the entries, so merging one environment’sset_envinto another no longer drops the environment file it referenced (#4093) - by @Rodrigo-Palma.Each
{ file = "..." }entry is read; previously only the last one survived, because the entries were merged into a single table first and a table cannot hold the key twice.A variable set after a
fileentry wins over the value the file provides, matching thefile|form in INI; previously a repeated variable was pulled back to its first position, letting the file override it.A later entry that sets a variable without a marker clears the marker an earlier entry gave it, again matching the INI form. (#4093)
Create the package build environment
change_dirdirectory before running the build commands, as the documentation already promises. (#4095)
4.64.2 (2026-09-24)¶
Fixed¶
A tox environment with
env_dir = "{tox_root}/.venv"no longer crashes withFileExistsErrorafter another environment ran (#4090) - by @gaborbernat.With
venv_redirectunset, the new default, tox writes the redirect file unless a tox environment lives at.venv; withtrue, tox fails the run with an error naming that environment.tox deletes a redirect file it wrote where an environment should live, and fails the environment with an error naming any other file there. (#4091)
The PEP 832
.venvredirect file now names a deliberate development environment - by @gaborbernat.tox picks venv_redirect_env, else an environment named
dev, else the first that installs the project in development mode, and writes nothing without one, so a project that uses tox for tests alone gets no file.tox devenvpoints the redirect at the environment it creates, and later runs leave it in place.tox tells virtualenv to write no redirect file of its own beside the environments it builds. (#4092)
4.64.1 (2026-09-24)¶
Fixed¶
Apply
-x/--overrideandTOX_OVERRIDEvalues that target a section the configuration file does not define, such astox.skip_missing_interpreterson atox.iniwithout a[tox]section, instead of dropping them - by @gaborbernat. (#4089)
4.64.0 (2026-09-24)¶
Added¶
Point a PEP 832
.venvredirect file at a tox environment after each run, so editors such as VS Code or PyCharm pick it as the project interpreter instead of asking you for a path under.tox- by @gaborbernat.tox picks an environment named
dev, then one installing the project in development mode, then the first of env_list; set venv_redirect_env to choose another.tox leaves a
.venvdirectory alone, and a redirect file pointing outside its environments.tox removes the redirect while it recreates the target and writes it back once the run ends.
Set
venv_redirecttofalseto opt out.The feature is provisional while PEP 832 is a draft: a minor or patch release may change it in backward incompatible ways to follow the PEP. (#4013)
Fixed¶
The user configuration file is now read as UTF-8 instead of the platform’s locale encoding, so a config holding non-ASCII values is no longer silently discarded on Windows - by @MohammedAlkindi. (#4086)
Documentation¶
Fix the invalid table header in the TOML string substitution example. (#4081)
4.63.0 (2026-09-19)¶
Added¶
Plugins and test helpers can use
tox.execute.api.FinishedExecuteStatusto report a fixed exit code for a command that already finished or never started - by @gaborbernat. (#4080)
Fixed¶
Interrupting a parallel run with Ctrl-C no longer loses the log lines about stopping the package environment, which could appear or vanish depending on thread timing - by @gaborbernat. (#4079)
Optional dependencies declared in
pyproject.tomlunder a name that is not normalized, such asFoo_Bar, are now installed when requested asextras = foo-barwhile tox installs a package’s dependencies - by @gaborbernat. (#4080)
4.62.1 (2026-09-19)¶
Fixed¶
Clear obsolete markers when unconditional
set_envvalues override conditional entries, including environment files. (#4076)
4.62.0 (2026-09-19)¶
Added¶
Plugins can read a configuration value that may be unset through
ConfigSet.get_optional, which verifies the value against its declared type and returnsNonewhen it is not set - by @gaborbernat. (#4075)
Fixed¶
Setting
TOX_FACTOR_<label>to an empty value now resolves{factor:<label>}to an empty string instead of being ignored - by @gaborbernat. (#4073)
4.61.5 (2026-09-17)¶
Fixed¶
An empty
set_envlist in TOML no longer fails to load; like an empty table, it clears inherited variables - by @yuefdev. (#4065)A TOML factor range now rejects
trueorfalseasstartorstopinstead of reading them as1and0- by @yuefdev. (#4066)Preserve an explicitly empty
{factor:label:}fallback instead of using the declared factor group default. (#4072)
Documentation¶
4.61.4 (2026-09-09)¶
Fixed¶
Shebang parsing now uses
shlex, so a quoted interpreter path that contains spaces is kept as one argument whenTOX_LIMITED_SHEBANGrewrites the invocation - by @r3wretrhy. (#4064)
4.61.3 (2026-09-08)¶
Fixed¶
A
set_envenvironment file (file|.env) is now read as UTF-8 instead of the platform’s locale encoding, so non-ASCII values no longer arrive mangled on Windows - by @MohammedAlkindi. (#4059)Preserve UNC and extended-length paths in Windows commands, including quoted paths - by @MohammedAlkindi. (#4060)
Normalize project and extra names in dependency-group self-references - by @MohammedAlkindi. (#4061)
Register factor labels and defaults for bare labeled dicts in
env_list- by @dylanpulver. (#4062)
4.61.2 (2026-08-31)¶
Fixed¶
tox now expands a generative digit range only where a factor starts, so an environment such as
py313-django4-2keeps its name rather than becomingpy313-django4,3and2- by @MohammedAlkindi. (#4053)
Documentation¶
Document how factors work in one place, covering what a factor is, the characters tox accepts in one, the platform and architecture factors that apply to conditions without appearing in a name, and how selecting by factor differs from selecting by name - by @gaborbernat. (#4055)
Give a reference entry to the configuration keys that had none.
interrupt_post_commandsrunscommands_postafter an interrupt, andconfig_file_path,host_python,homeandtox_root_nameare constants a configuration can substitute - by @gaborbernat. (#4056)
4.61.1 (2026-08-28)¶
Fixed¶
Publish a JSON Schema that compiles under SchemaStore’s validator again, so editors pick up the configuration keys added since 4.56 - by @gaborbernat. (#4051)
4.61.0 (2026-08-28)¶
Added¶
A labeled factor group can now declare a
defaultfor{factor:label}to fall back on when no factor of that group is active in the environment name. SettingTOX_FACTOR_<label>resolves that label to a given value for a single run - by @gaborbernat. (#4045)A factor range now takes a label when you nest it under one, as in
factors = [{ py_version = { prefix = "3.", start = 12, stop = 14 } }], which makes{factor:py_version}available for ranges - by @gaborbernat. (#4046)
Fixed¶
Values passed via
--override/-xorTOX_OVERRIDEnow resolve substitutions such as{posargs},{env:VAR}and{env_name}, instead of reaching the environment as literal text - by @gaborbernat. (#4047)
Documentation¶
Point the virtualenv discovery link in the explanation documentation at its current location. (#4042)
4.60.1 (2026-08-25)¶
Fixed¶
Report a malformed
tox.iniorsetup.cfgas a handled error during config discovery instead of raising an unhandledconfigparser.Errortraceback - by @VXNCXNX (#4027)Report an invalid value in the ini
[tox]core section (such asmin_version,requiresorenv_list) as a handled error instead of an unhandled traceback, matching the existing TOML loader behavior - by @VXNCXNX (#4028)Report an invalid
--skip-env/TOX_SKIP_ENVregular expression as a handled error instead of raising an unhandledre.errortraceback - by @VXNCXNX (#4029)Keep
;inside values read from aset_envenvironment file (file|.env). Environment file lines are plainKEY=VALUEpairs and were incorrectly parsed with the PEP-508 marker splitter, which truncated values such asDATABASE_URL=postgresql://host/db?opt=1;sslmode=requireat the first semicolon - by @VXNCXNX (#4030)Report a handled configuration error instead of leaking a traceback when the selected configuration file exists but cannot be read - by @SirHegel. (#4031)
Report an empty
install_commandorlist_dependencies_commandin a TOML configuration as a handled error instead of an unhandled traceback - by @dylanpulver (#4041)
4.60.0 (2026-08-13)¶
Added¶
Add
{home}and{tox_root_name}substitutions; set work_dir to e.g."{home}/.local/state/tox/{tox_root_name}"to keep environments outside of the project tree - by @WhyNotHugo. (#4020)
Fixed¶
Provision the requested tox version before reading
env_list, allowing configuration syntax introduced by that version - by @CAOShurong (#4021)
Documentation¶
Fix nine source-code links in the onboarding guide that pointed at paths which no longer exist, and correct the class names of the TOML configuration sources and loaders they refer to - by @Yusuf-Gadelrab. (#4024)
4.59.0 (2026-08-10)¶
Added¶
The plugin and internal APIs now declare their types, and the code base passes
mypy --strictandpyreflynext toty- by @gaborjbernat.ConfigSet.getreturns a configuration value after checking it against its declared type, so plugins can dropcastaroundconf["key"]reads.The
tox_on_installhook andInstallertype theirargumentsasInstallArguments; installer subclasses may narrow it through the new second type parameter.Parseddeclares the CLI option surface, sooptions.<name>reads type-check.ConfigSet.add_configacceptsdefault=Nonefor optional values and infers the value type from callable defaults.The journal, the environment cache, and execute metadata hold
JsonValuecontent; structuredset_enventries match theSetEnvEntryshape. (#4014)
Documentation¶
Mark the INI configuration format as deprecated throughout the documentation - by @gaborbernat.
The tutorial, the configuration reference, and the migration how-to state that INI keeps working for existing projects but is frozen and receives no new features.
Every INI example tab, the configuration discovery diagram, and the man page carry a deprecation marker.
The tutorial no longer suggests generating a
tox.iniviatox quickstart. (#4017)
4.58.0 (2026-07-21)¶
Added¶
Test against Python 3.15 (beta) in CI and declare its classifier - by @gaborbernat. (#4001)
4.57.2 (2026-07-21)¶
Fixed¶
Fix package environment creation failures being misreported:
discard the partially registered configuration on failure, so the real error surfaces instead of a spurious
duplicate configuration definition;report the first creation failure in definition order, not a hash-random one;
build the PEP 517 frontend lazily, so
tox candtox lwork whenpyproject.tomlcannot be read. (#3987)
Fix state corruption in the environment creation machinery:
a failed run environment build no longer removes shared package environments other run environments still use;
a run environment registers with its package environment once, not twice with triple-counted usage;
circular
dependsreports the cycle as an error instead of a raw traceback;Skipraised by a plugin for a package environment marks the run environment package-skipped instead of crashing withUnboundLocalError. (#3991)
Fix two packaging regressions:
package = editableon a build backend without PEP-660 support now falls back toeditable-legacywith a warning instead of crashing, also when the project metadata is static;editable and wheel environments running after an
sdist-wheelenvironment build from the project sources again, instead of a stale temporary copy that made source edits invisible. (#3992)
An environment serving as both a run environment and a package environment now behaves predictably:
one defined through a
[testenv:...]-style section and referenced bypackage_envinherits frompkgenv/env_pkg_baseas documented, instead of silently keeping run environment defaults;one listed in
env_listwhile referenced as a package environment is reported as a configuration conflict up front, instead of failing late withcannot run packaging environmentor silently disappearing fromtox l. (#3993)
pylock.tomlinstalls now match the lock file:a package locked once per Python range installs only the version matching the environment’s interpreter;
packages locked to a local directory, VCS repository, or archive install from that source instead of resolving the name against the package index;
locked hashes are verified when every entry carries one;
changing a pip environment variable such as
PIP_INDEX_URLreinstalls, as it already did fordeps. (#3994)
Re-running tox no longer rebuilds an environment at random when
depsuses--no-binaryor--only-binarywith more than one package name. (#3995)A corrupted environment status file (
.tox-info.json) now always triggers an environment recreation instead of crashing tox with an internal error for some corruption shapes. (#3996)PEP 723 scripts saved with a UTF-8 byte order mark now have their inline metadata honored (previously
requires-pythonanddependencieswere silently ignored), and a script with invalid metadata reports a clear configuration error instead of an internal one. (#3997)Fix three command line defects:
tox c -o FILEwrites the default (ini) format to the file like the json and toml formats, without color codes;tox devenv -e ALLreports that exactly one environment is required instead of crashing;--no-provision FILErecords the pinned version for atox==Xrequirement instead of an empty string. (#3998)
Restore the documented fail-fast contract and make cleanup resilient:
--fail-fastin parallel mode lets already running environments finish and report their real outcomes, instead of interrupting them after a second and mislabeling them as skipped;environments canceled by fail fast before starting report as skipped;
the overall exit code under fail fast is the first failed environment’s exit code, as documented;
one environment failing to clean up no longer prevents the remaining environments from cleaning up (which could leave tox hanging on exit). (#3999)
Polish four behaviors around the edges of a run:
an empty
[tool.tox]stub inpyproject.tomlno longer hides atox.tomlnext to it;setting
CI=false(or empty) is respected as opting out of CI behavior;spinner animation frames stay out of redirected output, which now holds plain text only;
the JSON report marks skipped environments with
"skipped": trueso they are distinguishable from passes. (#4000)
4.57.1 (2026-07-20)¶
Fixed¶
Stop a lone quote in a
set_envvalue (e.g. an apostrophe incan't) from swallowing the;platform marker, which silently set the variable unconditionally with the marker text left in the value - by @chuenchen309. (#3988)Make
tox run-parallel -p 0turn parallelism off and run sequentially, as the-phelp (“zero is turn off”) and the legacy command already promise, instead of running at the CPU count - by @chuenchen309. (#3989)
4.57.0 (2026-07-17)¶
Added¶
Support debug (
Py_DEBUG) interpreters the way free-threaded builds are already handled. Thepy313dandpy313tdfactors select a debug build, abase_pythonpointing at one matches those factors and conflicts with factors that lack the suffix, and a debug build gets its ownd-tagged wheel build environment - by @chuenchen309. (#3986)
Fixed¶
Keep the free-threaded
tsuffix when deriving the base python spec from a path, so abase_pythonpointing at a free-threaded interpreter matchespy313tfactors and conflicts with factors that lack the suffix - by @chuenchen309. (#3986)
4.56.4 (2026-07-08)¶
Fixed¶
Discover debug (
Py_DEBUG) interpreters set asbase_python, such as Debian’spython3.13-dbg- the spec was misread as a machine nameddbgand no interpreter matched. Requirespython-discovery>=1.4.4- by @gaborbernat. (#3977)
4.56.3 (2026-07-08)¶
Fixed¶
Stop double-closing the child pty file descriptor when running under a tty, which could race a parallel run that had reused the freed descriptor number and cause intermittent
Bad file descriptor/Input/output errorfailures - by @apoorvdarshan. (#3975)
4.56.2 (2026-07-07)¶
Fixed¶
Fix a batch of latent defects found in a codebase audit:
stop duplicating
--extra-index-urlwhen a merged requirements line repeats an already-seen index;render
--no-binary/--only-binaryas comma-joined strings instead of leaking the internalsetinto the pip command line;report a clear error instead of
IndexErrorfor a bare one-argument flag (-c,-r,-f,-e) indepsor constraints;canonicalize
optional-dependencieskeys and self-referential (recursive) extra names so non-canonical spellings no longer silently drop dependencies;raise a clear error instead of
KeyErrorwhendependency_groupsis requested without a[dependency-groups]table;stop a native TOML
{ replace = "env" }reference from leaking its resolution chain into sibling list entries and tripping a spuriouscircular chainerror;expand the range that actually matched in a factor expression rather than the first identical digit-range substring;
strip the backslash from an escaped
\;inset_envvalues;skip option values during command auto-detection so an environment named like a subcommand (e.g.
tox -e list) is no longer misread;treat an empty list-typed environment variable (e.g.
TOX_DISCOVER=) as an empty list rather than[""];report an environment whose name is an empty string as present in
Configmembership tests;fail evaluation gracefully instead of crashing the driver thread when
tox p -p allis run with an empty selection;avoid rebuilding a throwaway PEP 517 frontend against the previous root when a package environment’s
rootis reassigned before a frontend exists;avoid crashing
create_session_viewwhen the package and its session copy share no common path (e.g. different Windows drives);close the pseudo-terminal file descriptors that leaked on every command run under a tty and on the terminal-attribute inheritance error path;
honor the stop signal in the Windows overlapped-I/O reader while a read is still pending, so shutdown no longer risks hanging on a child that holds its pipe open without producing output. (#3974)
4.56.1 (2026-06-25)¶
Fixed¶
Fix
{ replace = "if" ... extend = true }corrupting the resulting list whenthenorelseis a scalar string (e.g.then = "-v"): a non-empty scalar string is now appended as a single element instead of being iterated character-by-character, while a falseifwith noelse(yielding"") contributes nothing rather than an empty element, and list/set results are still spread into the parent. (#3969)
4.56.0 (2026-06-23)¶
Added¶
Derive virtualenv_spec automatically: when an environment targets a Python version the installed virtualenv can no longer create (e.g.
py38with virtualenv21.5+), tox now pins the newest virtualenv that still supports it and bootstraps it for that environment only. The downgrade happens only when everybase_pythoncandidate is unsupported, so environments targeting current interpreters are unaffected. This fixespy38(and other end-of-life interpreters) being silently skipped after a virtualenv upgrade - by @gaborbernat. (#3965) (#3965)
Fixed¶
The default value of
skip_missing_interpreterschanged fromTruetoFalse— missing interpreters now fail the run by default, matching tox 3 behavior. The tox 4 rewrite unintentionally changed this default. To restore the previous (incorrect) behavior, setskip_missing_interpreters = truein your tox configuration or pass--skip-missing-interpreterson the command line. (#3965)
Documentation¶
Fix nested list items being rendered with continued numbering instead of as sub-items in
development.rst,onboarding.rstandexplanation.rst. (#3960)Replace stale
http://tox.readthedocs.orgURL withhttps://tox.wikiinpyproject.toml(Homepage),.github/CONTRIBUTING.md, and.github/PULL_REQUEST_TEMPLATE.md. (#3963)
4.55.1 (2026-06-03)¶
Fixed¶
TOX_OVERRIDE(and-x/--override) now propagates through configuration references. Previously, overriding a base value that was later referenced via{[section]key}(ini) or{replace = "ref", of = [...]}(toml) was ignored because reference resolution read the raw file value, bypassing the override system - by @tales-aparecida. (#3950) (#3950)
4.55.0 (2026-05-28)¶
Added¶
Automatically pass the TERMINFO environment variable to tox subprocesses if the output is a TTY. This variable is used by Ghostty to communicate terminal capabilities to programs. (#3946)
Fixed¶
When the
constraintsconfiguration option is set,constrain_package_depsanduse_frozen_constraintsare now ignored. Previously, both the user-provided constraints file and the auto-generated constraints file were passed to pip duringinstall_package_deps, which could cause resolver conflicts when the same package appeared in both files - by @gaborbernat. (#3945) (#3945)
4.54.0 (2026-05-12)¶
Added¶
Declare the runtime dependencies of the
tox.pytestplugin (pytest,devpi-processandpytest-mock) under a newtestingextra, so plugin authors can pull them in viatox[testing]- by @gaborbernat. (#3938, #3940)
Fixed¶
Extend the generated TOML schema to cover every
replacetable form (env,ref,posargs,glob,if), including conditional replacements used insidecommands. A guard test asserts the schema stays in sync with the loader implementation so future replace types cannot be added without a corresponding schema entry. (#3939)
4.53.1 (2026-05-02)¶
Fixed¶
Hardening pass on user-facing logging and config parsing:
Mask secret-looking
--key=valueflag values in command logs (terminal warnings,.tox/<env>/log/*.log, andOutcome__repr__) using the same keyword regex previously applied to environment variable values.Resolve PEP 723
scriptpaths and reject any that escapetox_root; cap the script read at 5 MiB so a symlink to/dev/zerocannot exhaust memory.Replace
eval()of a constructedLiteral[...]string in the CLI parser with a directLiteral[tuple(action.choices)]subscript.Pass
timeout=30tourlopenwhen fetching a remote requirements file so a slow or unresponsive mirror cannot hangtoxindefinitely. (#3924)
Allow the generated TOML schema to validate array values for
deps. (#3929)Correct type annotations for
ArgumentParser.parse_argsandparse_known_argsoverrides following typeshed PR #15613, which widened theargsparameter fromSequence[str]toIterable[str]. The narrower type in tox’s overrides violated the Liskov substitution principle and causedinvalid-method-overrideerrors withty0.0.33. Also correct theoption_specannotation indocs/tox_conf.pytoClassVar[dict[str, Callable[[str], Any]]]matching the docutils stubs type. (#3932)
4.53.0 (2026-04-14)¶
Added¶
TOML
env_listnow accepts bare range dicts ({ prefix = "3.", start = 12, stop = 14 }) and bare labeled dicts ({ ecosystem = ["oci", "python"] }) as top-level items, removing the{ product = [...] }wrapper when there is only a single factor group - by @gaborbernat. (#3923)
Fixed¶
Nesting a range or labeled dict inside a
productfactor-group list now raises a clear error pointing at the un-nesting fix, instead of silently producing a malformed environment name - by @gaborbernat. (#3923)
4.52.1 (2026-04-09)¶
Fixed¶
Changing a resolution-affecting environment variable via
set_env(e.g.PIP_INDEX_URL) now invalidates the install cache and triggers a reinstall, rather than incorrectly reusing the cached environment - by @gaborbernat. (#3917)Use
normalize_isafrompython-discoveryfor architecture factor matching, supporting aliases likei686→x86andaarch64→arm64- by @rahuldevikar. (#3919)
4.52.0 (2026-03-30)¶
Added¶
Add
virtualenv-pep-723runner that reads dependencies and Python version from PEP 723 inline script metadata — no need to duplicate them in tox config - by @gaborbernat. (#3897)Support escaped dots (
\.) in-x/--overridekeys, allowing overrides to target environments with dots in their names such aspy3.14- by @gaborbernat. (#3910)
Fixed¶
Auto-generate the manpage from the CLI argparse parser at wheel build time, fixing broken section headers and documenting all commands and options - by @gaborbernat. (#3878)
4.51.0 (2026-03-27)¶
Added¶
Add
base_python_fileconfiguration option to read the base Python version from a file (e.g..python-version), similar to GitHub Actions’python-version-file- by @rahuldevikar (#3894)
Fixed¶
Prevent implicit machine ISA (e.g.
arm64,x86_64) from overriding explicit architecture factors in environment names, fixing cross-architecture conflicts in multiline factor conditionals - by @rahuldevikar. (#3903)Nested environment list configuration values are now properly parsed, validated and expanded by the TOML parser. This allows you to use generative environment lists in
tox-ghvia the TOML format. Previously this was only possible with the INI format. - by @Daverball (#3905)
4.50.3 (2026-03-20)¶
Fixed¶
Use separate
.pkgenvironments for free-threaded Python targets by including thetsuffix in the wheel build environment name (e.g.,.pkg-cpython314t), preventing wheel tag mismatches when building forpy314t- by @gaborbernat. (#3314)
4.50.2 (2026-03-19)¶
Fixed¶
Fix the sdist to include the missing
docs/man/tox.1.rstfile for building the manpage (#3889)
4.50.1 (2026-03-19)¶
Fixed¶
Detect and suggest normalized environment names when users specify dotted Python versions (e.g.,
py3.10-lint) that match existing environments with compact notation (e.g.,py310-lint), preventing silent fallback to base[testenv]configuration - by @gaborbernat. (#3877)
4.50.0 (2026-03-17)¶
Added¶
Add
interrupt_post_commandsoption to run cleanup commands even after SIGINT - by @gaborbernat. (#3858)Add
factor['NAME']andenv['VAR']subscript syntax for conditional expressions, enabling checks of factors with non-identifier names likefactor['3.14']. Addenv_namevariable to check the full environment name in conditions. (#3880)
Fixed¶
Fix multiple manpage issues: remove duplicate header/author/copyright sections, set
projectin Sphinx config, and compile the manpage to troff format at wheel-build time instead of shipping raw RST source - by @gaborbernat. (#3878)
Documentation¶
Document how to reference the built package path in commands via
TOX_PACKAGE- by @rahuldevikar (#3862)Fix broken TOML examples missing
extend = trueon conditional replacements inside lists, fix incorrectref ofpath in raw reference docs, and add a test that validates all doc config examples - by @gaborbernat (#3875)
4.49.1 (2026-03-09)¶
Fixed¶
Break deadlock in execution interrupt chain that caused ~18 flaky timeout failures across 9 tests on Windows/macOS CI by @gaborbernat. (#3869)
4.49.0 (2026-03-06)¶
Added¶
Add
{factor:label}substitution for TOML configs – factor groups inproductmatrices andenv_basefactors can now be labeled with single-key dicts (e.g.,{ecosystem = ["oci", "python"]}), enabling{factor:ecosystem}in any string value (descriptions, commands, etc.) to resolve to the active factor. Plain lists automatically get positional labels ({factor:0},{factor:1}, …) - by @gaborbernat. (#3860) (#3860)
Fixed¶
4.48.1 (2026-03-06)¶
Fixed¶
Command-type configuration values like
list_dependencies_commandcan now be referenced in TOML using the structured{replace = "ref"}syntax. The reference automatically extracts the command’s argument list for compatibility with TOML’slist[list[str]]structure - by @gaborbernat. (#3830)
Documentation¶
Replace archived
31z4/toxDocker image recommendation with instructions for building your own image using the official Python base image anduv- by @rahuldevikar. (#3855)
4.48.0 (2026-03-05)¶
Added¶
Add
--formatflag (ini,json,toml) and-o/--output-fileto theconfigcommand for machine-readable output with native types. JSON and TOML use the same key structure astox.toml(env.<name>for environments,toxfor core) and get syntax-highlighted on stdout - by @gaborbernat. (#3854)
Documentation¶
Add
fail_fastto the configuration reference documentation - by @rahuldevikar. (#578)
4.47.3 (2026-03-04)¶
Fixed¶
ignore_base_python_conflictnow also suppresses errors when an environment name contains multiple conflicting version-like factors (e.g.,unit-py3.10-2.16where bothpy3.10and2.16are detected as Python versions). Previously this flag only handled conflicts between explicitbase_pythonsettings and the environment name - by @gaborbernat. (#3850)
4.47.2 (2026-03-03)¶
Fixed¶
Handle
OSErrorwhen checking if positional arguments are existing paths inpos_args()— long arguments (e.g., pytest-kexpressions exceeding the 255-character filesystem name limit) no longer crash withOSError: [Errno 36] File name too long- by @yarikoptic. (#3847)
4.47.1 (2026-03-03)¶
Fixed¶
New-style version factors (e.g.,
3.10-tests) now correctly setbase_python- by @gaborbernat. (#3845)
4.47.0 (2026-03-01)¶
Added¶
Show clean error messages instead of stack traces when TOML configuration contains type mismatches (e.g.,
deps = [1]), wrapping failures inHandledErrorwith environment and key context - by @gaborbernat. (#3831)Add comprehensive tests asserting full error messages for every configurable field type when TOML config contains type mismatches - by @gaborbernat. (#3840)
Fixed¶
Fix type errors flagged by
tyforvirtualenvAPI changes (system_executablenullability andcached_py_info.PythonInforemoval), and correct the CI workflow matrix exclude forwindows-2025- by @gaborbernat. (#3837)base_pythonanddefault_base_pythonnow accept a string value in TOML configuration (e.g.,base_python = "python"is coerced to["python"]) instead of raisingTypeError- by @gaborbernat. (#3839)Pass stdin through to commands executed via
tox execso that piped input (e.g.,echo "foo" | tox exec -- python -c 'import sys; print(sys.stdin.read())') reaches the subprocess instead of being discarded - by @gaborbernat. (#3841)
4.46.3 (2026-02-25)¶
Fixed¶
Fix SchemaStore update workflow creating PRs with merge conflicts by branching from upstream master - by @gaborbernat. (#3828)
Fixed the minimum version of virtualenv, to avoid incompatibility. (#3829)
4.46.2 (2026-02-25)¶
Fixed¶
Fix SchemaStore update workflow authentication and PR creation for fork repositories - by @gaborbernat. (#3826)
4.46.1 (2026-02-25)¶
Fixed¶
Allow glob patterns (
*,?) independsconfiguration for ini files - by @gaborbernat. (#3822)Fix false positive schema validation errors with tombi by adding
additionalProperties: truetopartial-tox.jsonon SchemaStore - by @gaborbernat. (#3823)
4.46.0 (2026-02-24)¶
Added¶
Add architecture (ISA) awareness to Python discovery. tox now propagates the
machinefield (e.g.arm64,x86_64) from virtualenv’s interpreter info — derived fromsysconfig.get_platform()— through the Python specification, validation, and journal. This allows selecting a Python interpreter by CPU architecture via base_python (e.g.cpython3.12-64-arm64) and ensures tox validates the running interpreter’s architecture matches the requested one. Requiresvirtualenv >= 20.39- by @rahuldevikar. (#3069)Add
env_baseTOML sections for named environment templates that generate multiple environments from factor combinations via Cartesian product – by @gaborbernat. (#3817)
Fixed¶
Drop
chardetdependency and use BOM detection with locale fallback for requirements file decoding, matching pip’s own approach - by @gaborbernat. (#3818)Allow
--helpto render even when the configuration file is malformed or missing - by @gaborbernat. (#3819)
4.45.0 (2026-02-23)¶
Added¶
Enhance
tox schemacommand: addx-taplometadata for IDE integration, product dict support forenv_list, handleintandPythonConstraintstypes, fix$schemadraft-07 URI, and add schema freshness test. Addtox.tomlto SchemaStore catalog for automatic IDE validation - by @gaborbernat. (#1388)
Fixed¶
Add redirects for old documentation URLs that broke after the Diataxis restructure (e.g.
/config.html->/reference/config.html,/example/general.html->/index.html) usingsphinx-reredirects- by @gaborbernat. (#3806)Fix cross-section substitution
{[section]key}resolving to a literal unresolved reference instead of empty string when the referenced value contains only factor-conditional lines and no factors match the requesting environment - by @Fridayai700. (#3809)Fix circular dependency in
environment_variableswhenset_envreferences{env_site_packages_dir}or similar lazy constants, causingRecursionErrorsilently caught as “could not find python interpreter” - by @gaborbernat. (#3816)
4.44.0 (2026-02-20)¶
Added¶
Support PEP 751
pylock.tomllock files as dependency input via thepylockconfiguration option (mutually exclusive withdeps). Packages are filtered by extras, dependency groups, and platform markers evaluated against the target Python interpreter, then installed via pip with--no-deps- by @gaborbernat. (#3665)
Fixed¶
Fix unfactored continuation lines (e.g.
pytest \,--remote-data \) being incorrectly skipped when they follow a filtered factor-conditional line ending with\– thepending_skipflag now only drops terminal continuation pieces, preserving shared arguments that are themselves continuations - by @gaborbernat. (#3802)
4.43.0 (2026-02-20)¶
Added¶
Add TOML-native generative
env_listviaproductdict syntax – Cartesian product of factor groups with optional range dicts and exclusions - by @gaborbernat. (#3797)
Fixed¶
Pass
config_settings_build_wheelto pip as--config-settingswhen installing sdist packages, ensuring the build backend receives config settings during pip’s internal wheel build - by @gaborbernat. (#3125)Fix factor-conditional continuation lines (e.g.
cov: coverage run \/!cov: python \/somefile.py) where different factor prefixes on consecutive continuation lines caused prefixes to be passed as literal command arguments instead of being filtered - by @gaborbernat. (#3796)
Documentation¶
Integrate
sphinxcontrib-towncrierto render draft changelog entries directly in Sphinx, replacing the manual towncrier draft script - by @gaborbernat. (#3201)
4.42.0 (2026-02-20)¶
Added¶
Platform-dependent commands can now be specified using factor syntax without requiring the platform name in the environment name. The current platform (
sys.platformvalue likelinux,darwin,win32) is automatically available as an implicit factor, allowing configurations likelinux: pytestin INI orfactor.linuxin TOML conditional expressions to work in any environment. Additionally, TOML configurations can now usefactor.NAMEin conditional expressions to filter settings based on environment name factors, achieving feature parity with INI’s factor system - by @gaborbernat. (#2092)Add
{env_site_packages_dir_plat}/{envsitepackagesdir_plat}substitution that returns the platform-specific (platlib) site-packages directory. On some Linux distributions (Fedora, RHEL) this resolves tolib64instead oflib, which is no longer symlinked since virtualenv 20.x - by @gaborbernat. (#2302)External packaging environments (
package = external) now only run their build commands once per session, reusing the built package for all test environments that depend on them - by @gaborbernat. (#2729)Add
default_base_pythonconfiguration key to specify a fallback Python interpreter when no Python factor or explicitbase_pythonis defined. This allows projects to pin a default Python version for reproducibility across different machines without conflicting withpyXYfactor-named environments - by @gaborbernat. (#2846)CLI options added by plugins listed in
requiresare now accepted during provisioning instead of failing with “unrecognized arguments” - by @gaborbernat. (#2935)Warn about unused configuration keys during
tox run -v- by @gaborbernat. (#3188)Improve towncrier changelog structure with more granular categories:
breaking,deprecation,feature,bugfix,doc,packaging,contrib, andmisc- by @gaborbernat. (#3200)Add
--skip-env-installCLI flag to skip dependency and package installation, allowing reuse of existing environments when offline or when installation is unnecessary - by @gaborbernat. (#3310)Add
recreate_commandsconfiguration option to run cleanup commands (e.g. clearing external caches like pre-commit) before the environment directory is removed during recreation (-r) - by @gaborbernat. (#3423)Environments with unavailable runners (missing plugins) are now gracefully skipped instead of causing a fatal error, shown with status “NOT AVAILABLE”. If such an environment is explicitly requested with
-e, a clear error message is shown indicating which runner is missing and that the plugin may not be installed. Unavailable environments in the configuration don’t cause the overall run to fail - by @gaborbernat. (#3504)Add open-ended range expansion in generative env lists —
py3{9-}expands up to the latest supported CPython minor version andpy3{-13}expands down to the oldest supported one, both hardcoded at release time per the Python release cycle - by @gaborbernat. (#3583)Add
--no-capture(-i) CLI flag to disable output capture, allowing interactive programs like Python REPL to access the terminal directly. When enabled, subprocess inherits parent console handles instead of pipes, fixing issues where terminal APIs (e.g., querying console dimensions) fail on pipe handles. Mutually exclusive with--result-jsonand parallel mode - by @gaborjbernat. Fixes #3635. (#3635)Add
virtualenv_specconfiguration key that allows pinning a specific virtualenv version per environment (e.g.virtualenv_spec = "virtualenv<20.22.0"). When set, tox bootstraps the specified version in an isolated environment and drives it via subprocess, enabling environments targeting Python versions incompatible with the installed virtualenv - by @gaborbernat. (#3656)
Fixed¶
Suppress
BrokenPipeErrorduring backend teardown when interrupted, preventing traceback spam during KeyboardInterrupt - by @gaborjbernat. Fixes #2660. (#2660)Factor-specific multiline commands using backslash continuation (
\) no longer leak continuation lines into environments that don’t match the factor - by @gaborbernat. (#2912)--list-dependenciesoutput is now printed to stdout during parallel runs. Previously, the dependency list was captured in suspended output buffers and only shown on failure - by @gaborbernat. (#3322)Compound factor conditionals (e.g.,
np-cov: coverage) now correctly allow their individual factors to be used when specifying environments with-e. Previously, runningtox -e py310-np-covwith a factor conditionalnp-cov: coveragein the config would fail with “provided environments not found” because the individual factorcovwas not recognized as combinable - by @gaborbernat. (#3780)
Documentation¶
Document Debian/Ubuntu
python3-venvlimitation in known limitations - by @gaborbernat. (#3195)
4.41.0 (2026-02-19)¶
Added¶
Add
package = "deps-only"mode that installs the package’s dependencies (including extras) without building or installing the package itself. For projects with static PEP 621 metadata, dependencies are read directly frompyproject.tomlwithout creating a packaging environment - by @gaborbernat. (#2301)Prefer TOML-native configuration (
[tool.tox]) overlegacy_tox_iniwhen both are present inpyproject.toml, allowing users to include alegacy_tox_inisection withmin_versionfor older tox versions while using native TOML config for newer ones - by @rahuldevikar. (#3402)
Fixed¶
Fix PEP 517 backend crash detection to handle both
ENOENT(missing interpreter) and runtime crashes without hanging, and fix flakytest_provision_install_pkg_pep517integration test by using a pre-built wheel instead of an sdist to avoid devpi mirror dependency on setuptools - by @gaborjbernat. (#3774)
4.40.0 (2026-02-19)¶
Added¶
Add
{glob:PATTERN}substitution to expand file system glob/wildcard patterns in configuration values. Supports default values, recursive**matching, and both INI string syntax and TOML dict syntax ({ replace = "glob", pattern = "..." }) - by @gaborbernat. (#1571)Add
commands_retryconfiguration option to automatically retry failed commands - by @gaborbernat. (#1578)Automatically create a
.gitignorefile containing*in the tox work directory (typically.tox/) and in environment info directories, so that tox-managed files are not tracked by git - by @rahuldevikar. (#2530)Add conditional value selection via
replace = "if"in TOML configuration. Supports aconditionexpression withenv.VARlookups,==/!=comparisons, andand/or/notboolean logic to select betweenthenandelsevalues - by @gaborbernat. (#3650)Add
sdist-wheelpackage type that builds a wheel from a source distribution, ensuring the sdist is complete and the package can be correctly built from it — by @rahuldevikar. (#3687)
Fixed¶
Use positive exit code (
1) instead of-1when reporting failures across multiple environments. On Windows,cmd.exe’sIF ERRORLEVEL 1only matches exit codes>= 1, so the previous negative exit code was silently treated as success - by @radevika. Fixes #2945. (#2945)When
set_envboth inherits via cross-section substitution (e.g.,{[testenv]set_env}) and explicitly overrides the same variable, the explicit value was incorrectly replaced by the inherited one becauseload()moved the key from the raw dict to the materialized dict before the deferred substitution ran, making the protection check ineffective - by @gaborjbernat. Fixes #3773. (#3773)
4.39.0 (2026-02-18)¶
Added¶
Fixed¶
On Windows, ANSI color codes from child processes (like pytest, mypy) are now rendered correctly in terminals by enabling VT100 processing mode for subprocess output streams - by @gaborbernat. (#2337)
Concurrent tox processes no longer corrupt the provision environment (
.tox) – a file lock now serializes provisioning across processes - by @gaborbernat. (#2515)Config files (
tox.ini,setup.cfg) with unicode characters are now read correctly on Windows when running tox withpython -m -I(isolation mode) - by @gaborbernat. (#2692)set_envvalues explicitly defined in a section now take precedence over values inherited via cross-section substitution (e.g.,{[testenv]set_env}) - by @gaborbernat. (#2831)The
-eflag now supports brace expansion (e.g.tox -e 'py{38,39}-pytest{6.x,7.x}') instead of incorrectly splitting on commas inside braces - by @gaborbernat. (#2850)Posargs containing colons no longer crash tox when an inactive environment uses
{posargs}in path-like configuration values such asenv_dir- by @gaborbernat. (#2860)set_envvalues from cross-section substitution (e.g.,{[testenv]set_env}) now correctly override default environment variables likePYTHONHASHSEED- by @gaborbernat. (#2872)--force-depnow applies to package dependencies from project metadata (e.g.setup.cfginstall_requires,pyproject.tomldependencies), not just tox configdeps- by @gaborbernat. (#2943)Using
{posargs}inchange_dirno longer causes aRecursionError- by @gaborbernat. (#3062)Cross-section substitution (e.g.
{[testenv:a]commands}) now resolves environment-specific variables like{envpython},{envbindir},{envtmpdir}, and{envsitepackagesdir}in the calling environment’s context rather than the referenced environment’s context - by @gaborbernat. (#3075)Fix
ValueErrorcrash when using posargs on Windows withsubstdrive mappings –os.path.relpathfails across drive letters, so fall back to absolute paths when the relative path cannot be computed - by @gaborbernat. (#3086)TOX_OVERRIDEwith+=(append) now works correctly when the override key name differs from the config file key name (e.g., overridingpass_envwhen config usespassenv, or vice versa) - by @gaborbernat. (#3127)Fix spurious environment discovery from non-tox sections in
setup.cfg–packages = find:in[options]was incorrectly interpreted as a tox factor marker, creating a phantomfindenvironment - by @gaborbernat. (#3134)Requirements in
requireswith environment markers that evaluate to false (e.g.virtualenv<20.22.0; python_version < "3.8") are now correctly skipped during provisioning instead of causing an infinite provisioning loop - by @gaborbernat. (#3136)Running environments with
recreate = trueno longer destroys shared package environments (e.g..pkg), which previously causedFileNotFoundErrorwhen a subsequent environment tried to use the already-built wheel - by @gaborbernat. (#3146)Factor-conditional config values (e.g.
base_python = py312: python3.12) now correctly fall back to the default when no factors match the current environment, instead of producing an empty value - by @gaborbernat. (#3189)TOX_PARALLEL_NO_SPINNER/--parallel-no-spinnerno longer forces parallel mode in the legacy command, fixing output suppression for sequential runs in CI - by @gaborbernat. (#3193)Multiple
-eflags are now additive (tox r -e a -e bruns bothaandb), matching tox 3 behavior - by @gaborbernat. (#3199)Environments like
functional-py312no longer incorrectly match when onlyfunctional{-py310}is defined as a testenv section – factors from section headers are no longer treated as freely combinable with CLI-eselections by @gaborbernat. (#3219)On Windows, a trailing path separator (e.g. from
{/}) no longer causes the next command argument to be merged into the path - backslash before whitespace is now treated as a literal path separator rather than a space escape - by @gaborbernat. (#3222)Fix
{envtmpdir}and other env variable substitutions not expanding in external package environment commands - by @gaborbernat. (#3238) (#3238)On Windows, colored output is now preserved when running provisioned tox by explicitly passing the
--colored yesflag to the provisioned subprocess when the parent has colors enabled - by @gaborbernat. (#3331)set_envvalues defined after afile|reference now correctly take precedence over values loaded from the env file - by @gaborbernat. (#3335)The
baseconfiguration key now works correctly in TOML format (tox.tomlandpyproject.toml), allowing environments to inherit from arbitrary sections defined under[env.*]- by @gaborbernat. (#3497)Skip
toxfile.pyinline plugin when it uses hooks not available in the current tox version instead of crashing - this allows provisioning to upgrade tox to a version that supports those hooks - by @gaborbernat. (#3593)set_envsubstitution referencing{envsitepackagesdir},{envbindir}, or{envpython}for environments with missing interpreters now raisesSkipinstead ofRuntimeError, allowingskip_missing_interpretersto work correctly - by @gaborbernat. (#3597)A
setup.cfgwithout a[tox:tox]section no longer blocks discovery ofpyproject.tomlortox.tomlconfiguration files in the same directory - by @gaborbernat. (#3602)Fix pytest
INTERNALERRORon Python 3.15 caused by Pygments using deprecatedos.path.commonprefix()- by @gaborbernat. (#3733)Fix
RecursionErrorwhen TOMLset_envcontains substitutions like{env_site_packages_dir}that trigger config loading cycles – the TOML loader now defers string substitution inset_envvalues, matching the INI loader’s lazy resolution behavior - by @gaborbernat. (#3758)
Documentation¶
Document that interactive terminal programs (e.g., IPython) may not work correctly under tox due to the PTY-based output capture architecture - by @gaborbernat. (#2999)
4.38.0 (2026-02-17)¶
Added¶
Scope dependency rejection in PEP-517 package environments to only pure PEP-517 build types (
sdist,wheel,editable), allowing non-standard package types likeeditable-legacyto specify dependencies - by @rahuldevikar. (#3731)
4.37.0 (2026-02-17)¶
Added¶
Add
extra_setup_commandsconfiguration option to run commands after dependency and package installation but before test commands, useful with--notestfor separating setup from execution - by @gaborbernat. (#1504)
Fixed¶
Set
PIP_USER=0environment variable when running pip commands in virtualenvs to prevent pip from attempting--userinstalls when users havepip config --userconfigured globally — by @gaborbernat. (#3010)Fix TOML env_run_base and env_pkg_base deps being clobbered when referenced with additional deps in testenv configuration (#3393)
Normalize extra names when resolving dependencies so that underscores and hyphens are treated equivalently (e.g.
extras = snake_casenow matchesProvides-Extra: snake-casein wheel metadata) - by @Fridayai700. (#3433)Fix
setenvmodifications toPATHbeing overwritten when tox environment paths are set up - by @Fridayai700 (#3445)Fix
depsentries with~=version specifier being incorrectly treated as local paths instead of being passed through to pip - by @Fridayai700. (#3447)Fix factor selection via
TOX_FACTORSenvironment variable producing wrong results becauseappend+nargs="+"actions need nested list types for proper env var conversion - by @Fridayai700. (#3557)Fix custom
install_commandbeing ignored when specified in TOML configuration (tox.toml/pyproject.toml) - by @Fridayai700. (#3574)Fix env names containing dots (e.g.
py3.11) losing their description in TOML configuration - by @Fridayai700. (#3590)Run pre-commit on changelog.rst after towncrier build to ensure proper formatting before committing the release (#3717)
Fix type checker CI failure by adding
completionextras totypeandtype-minenvironments sotycan resolve theargcompleteimport - by @gaborbernat. (#3728)
Documentation¶
Restructured documentation using the Diátaxis framework to separate Tutorial, How-to guides, Reference, and Explanation content for better discoverability and user experience. (#3718)
4.36.1 (2026-02-17)¶
Fixed¶
Report TOML parse errors during config discovery instead of silently ignoring them - by @rahuldevikar. (#3030)
Adopt CPython’s subprocess stream handling to fix deadlocks and improve performance when reading subprocess output (#3715)
Documentation¶
Add Unix man page generation and installation support using sphinx-argparse-cli - by @gaborbernat. (#1409)
Document use of Python
loggingfor plugin authors in the how-to guides, covering verbosity levels, coloring, and best practices — by @rahuldevikar. (#3449)Add architecture documentation for new contributors under the development section - by @rahuldevikar (#3707)
4.36.0 (2026-02-15)¶
Added¶
Allow
skip_missing_interpretersto be set per environment, overriding the global setting. This enables marking specific environments as optional while keeping others required. (#435)Add
--fail-fastCLI flag andfail_fastper-environment config option to stop executing remaining environments when the first failure occurs - by @gaborbernat. (#578)Add shell completion support for bash, zsh, and fish via argcomplete - by @gaborbernat (#918)
Validate that configured extras exist in package metadata, raising a clear error for unknown extras - by @gaborbernat (#1113)
Add glob pattern support in
depends(e.g.depends = py3*) to match environments by wildcard instead of listing them explicitly - by @gaborbernat (#1152)Add
disallow_pass_envconfiguration option to exclude specific environment variables afterpass_envglob expansion - by @gaborbernat (#1387)Support
file:URIs in--installpkg(e.g.--installpkg file:///path/to/pkg.whl), including proper handling of percent-encoded characters - by @rahuldevikar. (#3498)Add GitHub Actions workflow dispatch for release preparation as alternative to local
tox r -e releasecommand - by @gaborbernat (#3704)
Changes¶
Switch type checker from
mypytoty- by @gaborbernat. (#3685)
Fixed¶
Raise an error when
depsis configured on a PEP-517 packaging environment (e.g..pkg), since build dependencies should be specified via the[build-system]table inpyproject.toml- by @rahuldevikar (#3412)Follow FORCE_COLOR recommendations: any non-empty value now enables color (previously only
yes,true, or1were accepted, and other values caused a crash). Also add support forTTY_COMPATIBLE(1forces color,0disables it) — by @rahuldevikar. (#3579)Return non-zero exit code from tox config when configuration exceptions occur. (#3649)
Fix flaky spinner test assertion caused by timing variations on slower systems. (#3692)
Documentation¶
Document how to provide environments via
toxfile.pyinline plugins usingtox_extend_envsandMemoryLoaderby @gaborbernat. (#828)Document shell completion setup for bash, zsh, and fish in the CLI reference - by @gaborbernat (#918)
Document negative factor conditions and multi-factor combinations with negation in the INI configuration reference - by @gaborbernat (#3276)
Add a substitution quick reference table covering all available
{...}replacement variables - by @gaborbernat (#3326)Add TOML configuration reference with complete examples for
tox.tomlandpyproject.tomlformats, and emphasize TOML as the recommended format throughout - by @gaborbernat (#3393)Document the
tox execsubcommand with usage examples in the how-to guides - by @gaborbernat (#3403)Comprehensive documentation improvements: added how-to guides for tox exec, CI/CD, coverage, build backends, labels, migration, debugging, and extras; expanded plugin documentation with all hook examples and packaging guide; added env var handling guide, factor conditions reference, and substitution quick reference; integrated docstrfmt for consistent RST formatting; fixed docstring issues in source code - by @gaborbernat (#3475)
Update
development.rstto reflect current standards: replace references toflake8/black/isort/pyupgradewithruff, remove outdated Python 2.7 compatibility note, and fix CI config filename - by @rahuldevikar (#3483)Drop
setup.pymentions from the installation page — by @rahuldevikar. (#3588)Restructure documentation following the Diataxis framework: add a step-by-step tutorial (
getting_started.rst), consolidate how-to recipes (howto.rst), refocus the user guide on conceptual explanation, and move plugin docs into their ownplugins/subdirectory. Remove the obsolete tox 3-to-4 migration guide (upgrading.rst) and FAQ, redistributing still-relevant content into the appropriate sections. All configuration examples now show TOML first with INI alongside - by @gaborbernat (#3702)
4.35.0 (2026-02-12)¶
Added¶
Show
toxfile.pyinline plugins intox --versionoutput, including anytox_append_version_info()result - by @rahuldevikar. (#3508)
Documentation¶
Document injected environment variables (
TOX_ENV_NAME,TOX_WORK_DIR,TOX_ENV_DIR,TOX_PACKAGE,VIRTUAL_ENV,PYTHONIOENCODING,__TOX_ENVIRONMENT_VARIABLE_ORIGINAL_CI) that tox automatically sets when running commands - by @rahuldevikar. (#3514)
4.34.1 (2026-01-09)¶
Fixed¶
Fix wheel corruption errors when the build backend updates the file in place - by @gaborbernat. (#3667)
4.34.0 (2026-01-08)¶
Added¶
4.33.0 (2026-01-02)¶
Added¶
Add support for conditional
set_envusing PEP-496 environment markers. In INI format useVAR=value; markersyntax, in TOML format useset_env.VAR = { value = "...", marker = "..." }– by @gaborbernat. (#3663)
Fixed¶
Added ‘LocalAppData’ to the default passed environment variables on Windows. (#3639)
Documentation¶
Sphinx is now set up to use sphinx-issues for referencing GitHub issues and pull requests in the docs – by @webknjaz. (#3202)
4.32.0 (2025-10-24)¶
Fixed¶
Expand braced range syntax in all internal sections of
tox.ini(e.g.deps,testenv). Syntax like py3{10-14} can be used in those sections now. - by @marcosboger (#3571)
Documentation¶
4.31.0 (2025-10-09)¶
4.30.3 (2025-10-02)¶
Fixed¶
Fix incorrect type annotation in
PythonPathPackageWithDeps.__init__()wheredepswas annotated asSequence[Package]but should beSequence[Requirement]to match actual runtime usage - by @PreistlyPython (#3607)Fix
Noneappearing as the config filename in error output when the user’s default config file is corrupt. - by @kurtmckee (#3611)
4.30.2 (2025-09-04)¶
Fixed¶
4.30.1 (2025-09-03)¶
Fixed¶
4.30.0 (2025-09-03)¶
Added¶
Add
__TOX_ENVIRONMENT_VARIABLE_ORIGINAL_CI, which passes through theCIvariable if present. This is intended for use by other libraries to detect if tox is running under CI. (#3442)
Fixed¶
Makes the error message more clear when pyproject.toml file cannot be loaded or is missing expected keys. (#3578)
The
tox_extend_envs() hookrecently added in #3591 turned out to not work well withtox run. It was fixed internally, not to exhaust the underlying iterator on the first use. – by @webknjaz (#3598)
4.29.0 (2025-08-29)¶
Added¶
A new tox life cycle event is now exposed for use via Plugins API – by @webknjaz. The corresponding hook point is
tox_extend_envs. It allows plugin authors to declare ephemeral environments that they can then populate through the in-memory configuration loader interface. This patch was made possible thanks to pair programming with @gaborbernat at PyCon US 2025. (#3510, #3591)
4.28.4 (2025-07-31)¶
Added¶
Pass ssh-agent variables
SSH_AGENT_PIDandSSH_AUTH_SOCKinpass_envby default. - by @daniilgankov (#3572)
4.28.3 (2025-07-25)¶
4.28.2 (2025-07-25)¶
Fixed¶
Don’t pass in the filter argument to tar.extractall on old Python versions - by @gaborbernat. (#3568)
4.28.1 (2025-07-22)¶
Fixed¶
Use tarfile.data_filter with
extractallonly on supported Python versions:>= 3.11.4>= 3.10.12and< 3.11>= 3.9.17and< 3.10by @gaborbernat. (#3565)
4.28.0 (2025-07-20)¶
Added¶
Added
constraintsto allow specifying constraints files for all dependencies. (#3550)Allow disabling tox plugins via the
TOX_DISABLED_EXTERNAL_PLUGINSenvironment variable - by @gaborbernat. (#3468)
Documentation¶
The
min_version/minversionconfig option is deprecated in favor of therequiresoption. (#3553)
4.27.0 (2025-06-17)¶
Added¶
Add
free_threadedflag to to"python"entries in json output of--result-json. (#3534)
Fixed¶
4.26.0 (2025-05-13)¶
Added¶
Fixed¶
4.25.0 (2025-03-27)¶
Added¶
Fixed¶
4.24.2 (2025-03-07)¶
Fixed¶
multiple source_type supports for the same filename. Like pyproject.toml can be load by both TomlPyProject & LegacyToml (#3117)
Support
set_env = { file = "conf{/}local.env"}for TOML format - by @juditnovak. (#3474)fix example on the docs (#3480)
--parallel-no-spinnernow respects max CPU set by--parallel N(#3495)
Documentation¶
4.24.1 (2025-01-21)¶
4.24.0 (2025-01-21)¶
Added¶
Fixed¶
Documentation¶
Fix typo in
docs/config.rstfrom{}to{:}. - by @wooshaun53 (#3424)Pass
NIX_LDandNIX_LD_LIBRARY_PATHvariables by default inpass_envto make generic binaries work under Nix/NixOS. - by @albertodonato (#3425)
4.23.2 (2024-10-22)¶
4.23.1 (2024-10-21)¶
Documentation¶
Fix bad example in documentation for dependency groups - by @gaborbernat. (#3240)
4.23.0 (2024-10-16)¶
Added¶
Add
NETRCto the list of environment variables always passed through. (#3410)
Documentation¶
replace
[tool.pyproject]and[tool.tox.pyproject]with[tool.tox]in config.rst (#3411)
4.22.0 (2024-10-15)¶
Added¶
Implement dependency group support as defined in PEP 735 - see dependency_groups - by @gaborbernat. (#3408)
4.21.2 (2024-10-03)¶
Fixed¶
4.21.1 (2024-10-02)¶
Fixed¶
Fix error when using
requireswithin a TOML configuration file - by @gaborbernat. (#3386)Fix error when using
depswithin a TOML configuration file - by @gaborbernat. (#3387)Multiple fixes for the TOML configuration by @gaborbernat.:
Do not fail when there is an empty command within
commands.Allow references for
set_envby accepting list of dictionaries for it.Do not try to be smart about reference unrolling, instead allow the user to control it via the
extendflag, available both forposargsandrefreplacements.The
refreplacementsrawkey has been renamed toof. (#3388)
4.21.0 (2024-09-30)¶
Added¶
Native TOML configuration support - by @gaborbernat. (#999)
Documentation¶
Update Loader docs - by :user:ziima (#3352)
4.20.0 (2024-09-18)¶
Added¶
Separate the list dependencies functionality to a separate abstract class allowing code reuse in plugins (such as
tox-uv) - by :gaborbernat`. (#3347)
4.19.0 (2024-09-17)¶
Added¶
Support
pypy-<major>.<minor>environment names for PyPy environments - by @gaborbernat. (#3346)
4.18.1 (2024-09-07)¶
Fixed¶
Documentation¶
Changes the
tox_env_teardowndocstring to explain the hook is called after a tox env was teared down. (#3305)
4.18.0 (2024-08-13)¶
Added¶
Fixed¶
Boost temporary directories cleanup in tests - by @ziima. (#3278)
Fix absolute base python paths conflicting - by @gaborbernat. (#3325)
4.17.1 (2024-08-07)¶
Fixed¶
Support for running
-e <major>.<minor>has been lost, fixing it - by @gaborbernat. (#2849)base_pythonnow accepts absolute paths to interpreter executable - by @paveldikov. (#3191)
4.17.0 (2024-08-05)¶
Added¶
Add
graalpyprefix as a supported base python (#3312)Add on_platform core configuration holding the tox platform and do not install package when exec an environment by @gaborbernat. (#3315)
Fixed¶
Add table with default environment variables per OS (#2753)
4.16.0 (2024-07-02)¶
Fixed¶
Add
windirto the default list of Windowspass_envenvironment variables. - by @kurtmckee (#3302)
Documentation¶
4.15.1 (2024-06-05)¶
Added¶
Fix
skip_missing_interpretersoption forpackage = wheel(#3269)
Fixed¶
4.15.0 (2024-04-26)¶
Added¶
Add support for multiple appending override options (-x, –override) on command line - by @amitschang. (#3261)
Add support for inverting exit code success criteria using bang (!) (#3271)
Fixed¶
Fix issue that the leading character
cwas dropped from packages in constraints files - by @jugmac00. (#3247)Allow appending to
depswith--override testenv.deps+=foo- by @stefanor. (#3256)Fix non-existing branch
rewritein the documentation tomain. (#3257)Update test typing for build 1.2.0, which has an explicit
Distributiontype - by @stefanor. (#3260)Fix broken input parsing for
--discoverflag. - by @mimre25 (#3272)
Documentation¶
4.14.2 (2024-03-22)¶
Fixed¶
Add provision arguments to ToxParser to fix crash when provisioning new tox environment without list-dependencies by @seyidaniels (#3190)
Documentation¶
Removed unused line from the
fresh_subprocessdocumentation. (#3241)
4.14.1 (2024-03-06)¶
Fixed¶
Fix crash with fresh subprocess, if the build backend is setuptools automatically enable fresh subprocesses for build backend calls - by @gaborbernat. (#3235)
4.14.0 (2024-03-05)¶
Added¶
Support enabling fresh subprocess for packaging build backends via fresh_subprocess - by @gaborbernat. (#3227)
Allow plugins attaching additional information to
--versionviatox_append_version_infomethod in the plugin module - by @gaborbernat. (#3234)
4.13.0 (2024-02-16)¶
Added¶
Extract virtual environment packaging code to its own base class not tied to
virtualenv- by @gaborbernat. (#3221)
Documentation¶
4.12.1 (2024-01-16)¶
Fixed¶
Fixed bug where running with –installpkg and multiple envs could not clean up between tests (#3165)
4.12.0 (2024-01-11)¶
Added¶
Always pass
FORCE_COLORandNO_COLORto the environment (#3172)
Fixed¶
--parallel-no-spinnerflag now implies--parallel(#3158)
Documentation¶
-Fix
open an issuelink in development.rst (#3179)
4.11.4 (2023-11-27)¶
Fixed¶
Documentation¶
Fix default value for
base_python- by @rpatterson. (#3156)
4.11.3 (2023-09-08)¶
Fixed¶
Handle
FileNotFoundErrorwhen thebase_pythoninterpreter doesn’t exist (#3105)
Documentation¶
4.11.2 (2023-09-07)¶
Fixed¶
Documentation¶
4.11.1 (2023-09-01)¶
Fixed¶
Allow passing in multiple overrides using the
;character and fix,being used as splitting values - by @gaborbernat. (#3112)
4.11.0 (2023-08-29)¶
Added¶
Add support for setting build backend
config_settingsin the configuration file - by @gaborbernat. (#3090)
4.10.0 (2023-08-21)¶
Added¶
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. (#3099)
Fixed¶
--override foo+=barappending syntax will now work correctly whenfoowasn’t defined intox.ini. (#3100)
4.9.0 (2023-08-16)¶
Added¶
4.8.0 (2023-08-12)¶
Added¶
--overridecan now take options in the form offoo+=barwhich will appendbarto the end of an existing list/dict, rather than replacing it. (#3087)
4.7.0 (2023-08-08)¶
Added¶
Make
--hashseeddefault toPYTHONHASHSEED, if defined - by @paravoid. The main motivation for this is to able to set the hash seed when building the documentation withtox -e docs, and thus avoid embedding a random value in the tox documentation for –help. This caused documentation builds to fail to build reproducibly. (#2942)
Fixed¶
Update a regular expression in tests to match the exception message in both Python 3.12 and older. (#3065)
Documentation¶
Fix broken links - by @gaborbernat. (#3072)
4.6.4 (2023-07-06)¶
Fixed¶
Fix hang and zombie process on interrupt (CTRL-C). (#3056)
4.6.3 (2023-06-19)¶
Fixed¶
Ensure that
get_requires_for_build_wheelis called beforeprepare_metadata_for_build_wheel, andget_requires_for_build_editableis called beforeprepare_metadata_for_build_editable- by @abravalheri. (#3043)
Documentation¶
Linked environment variable substitutions docs in
set_envandpass_envconfig docs. (#3039)
4.6.2 (2023-06-16)¶
Fixed¶
4.6.1 (2023-06-15)¶
4.6.0 (2023-06-05)¶
Added¶
Added
--list-dependenciesand--no-list-dependenciesCLI parameters. If unspecified, defaults to listing when in CI, but not otherwise. (#3024)
4.5.2 (2023-05-27)¶
Added¶
Add 3.12 support by @gaborbernat in https://github.com/tox-dev/tox/pull/2998
Fixed¶
fix legacy
tox --devenv venvby @asottile in https://github.com/tox-dev/tox/pull/3013Fix legacy devenv by @gaborbernat in https://github.com/tox-dev/tox/pull/3019
4.5.1.1 (2023-08-31)¶
4.5.1 (2023-05-25)¶
Fixed¶
4.5.0 (2023-04-24)¶
Added¶
Documentation¶
4.4.12 (2023-04-13)¶
Fixed¶
Avoid race conditions in tests using the
demo_pkg_inlinefixture. (#2985)
4.4.11 (2023-04-05)¶
Fixed¶
Fixed an issue where a tox plugin couldn’t change the value of
tox_root. (#2966)
4.4.10 (2023-04-05)¶
Fixed¶
Fix issue where
work_dirwas not correctly includingtox_rootfor test runs. (#2933)
4.4.9 (2023-04-05)¶
Fixed¶
Documentation¶
4.4.8 (2023-03-26)¶
Fixed¶
4.4.7 (2023-03-12)¶
Documentation¶
docs(config): fix temp_dir default value by @thecesrom in https://github.com/tox-dev/tox/pull/2932
docs: set html_last_updated_fmt to format string by @paravoid in https://github.com/tox-dev/tox/pull/2937
4.4.6 (2023-02-21)¶
Fixed¶
4.4.5 (2023-02-07)¶
Fixed¶
4.4.4 (2023-01-31)¶
Fixed¶
Forward
HOMEby default - by @gschaffner. (#2702)
4.4.3 (2023-01-30)¶
Fixed¶
4.4.2 (2023-01-25)¶
Fixed¶
Allow the user configuration file (default
<appdir>/tox/config.ini) to be overridden via theTOX_USER_CONFIG_FILEenvironment variable. Previously tox was looking at theTOX_CONFIG_FILEto override the user configuration, however that environment variable is already used to override the main configuration - by @masenf. (#2890)
4.4.1 (2023-01-25)¶
Fixed¶
4.4.0 (2023-01-25)¶
Added¶
Test environments now recognize boolean config keys
constrain_package_deps(default=true) anduse_frozen_constraints(default=false), which control how tox generates and applies constraints files when performinginstall_package_deps. Ifconstrain_package_depsis true (default), then tox will write out{env_dir}{/}constraints.txtand pass it topipduringinstall_package_deps. Ifuse_frozen_constraintsis false (default), the constraints will be taken from the specifications listed underdeps(and inside any requirements or constraints file referenced indeps). 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 thedepsnamed 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 @masenf. (#2386)
Fixed¶
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 windowscmd.exeshell - by @masenf. (#2635)
Documentation¶
Add information when command from
list_dependencies_commandconfiguration option is used. (#2883)
4.3.5 (2023-01-18)¶
Fixed¶
When building a
wheeloreditablepackage with a PEP 517 backend, no longer pass an emptymetadata_directoryto the backendbuild_wheelorbuild_editableendpoint. Some backends, such as PDM and poetry, will not generate package metadata in the presence of ametadata_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 @masenf. (#2880)
4.3.4 (2023-01-17)¶
Fixed¶
When executing via the provisioning environment (
.toxby default), runtoxin working directory of the parent process. Prior to this change (from tox 4.0.0), the provisionedtoxwould execute with{tox_root}as the working directory, which breaks when a relative path is passed to-cor--confandtoxis executed in a working directory other than{tox_root}- by @masenf. (#2876)
4.3.3 (2023-01-16)¶
Fixed¶
4.3.2 (2023-01-16)¶
Fixed¶
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 @masenf. (#2869)
4.3.1 (2023-01-15)¶
Fixed¶
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 @masenf. (#2863)
4.3.0 (2023-01-15)¶
Added¶
Rewrite substitution replacement parser - by @masenf
\acts as a proper escape for\in ini-style substitutionsThe 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_partis removed fromtox.config.loader.ini.replaceNew names exported from
tox.config.loader.ini.replace: -find_replace_expr-MatchArg-MatchError-MatchExpression- Note: the API forreplaceitself is unchanged. (#2732)
Improved documentation for factors and test env names - by @stephenfin. (#2852)
4.2.8 (2023-01-11)¶
Fixed¶
4.2.7 (2023-01-11)¶
Fixed¶
A testenv with multiple factors, one of which conflicts with a
base_pythonsetting intox.ini, will now use the correct Python interpreter version - by @stephenfin. (#2838)Explicitly list
wheelas requirement for the tests, as some of the tests error without it. (#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 apyprefix 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 base_python setting - by @stephenfin. (#2848)
4.2.6 (2023-01-06)¶
Fixed¶
Handle properly pip
--no-binary/--only-binaryoptions in requirements.txt format files. (#2814)
4.2.5 (2023-01-06)¶
Fixed¶
The combination of
usedevelop = trueand--skip-missing-interpreters=falsewill no longer fail for environments that were not invoked - by @stephenfin. (#2811)Fix an attribute error when
use_develop = trueis set and an unsupported interpreter version is requested - by @stephenfin. (#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 @stephenfin. (#2827)
4.2.4 (2023-01-05)¶
Fixed¶
Setting
[testenv] basepython = python3will no longer override the Python interpreter version requested by a factor, such aspy311- by @stephenfin. (#2754)Also accept tab after colon before factor filter expansion - by @pdecat. (#2823)
4.2.3 (2023-01-04)¶
Fixed¶
devenvdoes not respect the specified path when the package is a wheel file - by @gaborbernat. (#2815)Require space after colon before factor filter expansion, unless it is the last character of the line - by @pdecat. (#2822)
4.2.2 (2023-01-04)¶
Fixed¶
Add
CC,CFLAGS,CCSHARED,CXX,CPPFLAGS,LDFLAGS,PKG_CONFIGandPKG_CONFIG_SYSROOT_DIRto the default passed through environment variables list as these are needed for building various C-extensions - by @gaborbernat. (#2818)
4.2.1 (2023-01-03)¶
Fixed¶
Fix extracting extras from markers with more than 2 extras in an or chain - by @dconathan. (#2791)
4.2.0 (2023-01-03)¶
Added¶
Packaging environments now inherit from the
pkgenvsection, allowing to set all your packaging options in one place, and support thedepskey to set additional dependencies that will be installed afterpyproject.tomlstaticrequiresbut before backends dynamic requires - by @gaborbernat. (#2543)
Documentation¶
Document breaking changes with tox 4 and packaging environments - by @gaborbernat. (#2543)
Document how to handle environments whose names match
toxsubcommands - by @sirosen. (#2728)
4.1.3 (2023-01-02)¶
Fixed¶
Fail more gracefully when pip install_command is empty - by @jayaddison. (#2695)
Documentation¶
Add breaking-change documentation for empty
install_commandvalues - by @jayaddison. (#2695)
4.1.2 (2022-12-30)¶
Fixed¶
4.1.1 (2022-12-29)¶
Fixed¶
Fix logging error with emoji in git branch name. (#2768)
Documentation¶
4.1.0 (2022-12-29)¶
Added¶
Documentation¶
Fix a grammatical typo in docs/user_guide.rst. (#2787)
4.0.19 (2022-12-28)¶
Fixed¶
4.0.18 (2022-12-26)¶
Fixed¶
Strip leading and trailing whitespace when parsing elements in requirement files - by @gaborbernat. (#2773)
4.0.17 (2022-12-25)¶
Added¶
Suppress a report output when verbosity = 0. (#2697)
Fixed¶
4.0.16 (2022-12-20)¶
Fixed¶
Fix change_dir is relative to current working directory rather than to the tox_root when using the
-cargument to locate thetox.inifile - by @gaborbernat. (#2619)
4.0.15 (2022-12-19)¶
Fixed¶
Fix tox auto-provisioning not working and relax min_version default from
4.0to no version constraint - by @gaborbernat. (#2634)Fix assertion in
test_result_json_sequentialwhen interpreter_base_executableis a hardlink (macOS homebrew) by @masenf. (#2720)Complex negative factor filters not working - by @gaborbernat. (#2747)
4.0.14 (2022-12-18)¶
Fixed¶
Do not include non test environment sections or factor filters in INI configuration to factor discovery - by @gaborbernat. (#2746)
4.0.13 (2022-12-17)¶
Fixed¶
A plain section in INI configuration matching a tox environment name shadowed the laters configuration - by @gaborbernat. (#2636)
Fix space not accepted in factor filter expression - by @gaborbernat. (#2718)
4.0.12 (2022-12-16)¶
Fixed¶
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 @masenf. (#1773)
Fix python hash seed not being set - by @gaborbernat. (#2645)
Fix legacy CLI flags
--pre,--force-deps,--sitepackagesand--alwayscopynot working, and mark them as deprecated - by @gaborbernat. (#2690)
Documentation¶
Document user level config. (#2633)
4.0.11 (2022-12-14)¶
Added¶
Modified handling of
NO_COLORenvironment variable, consistent with de facto conventions: any non-empty string will enableNO_COLOR(disable colorized output); noNO_COLORvariable orNO_COLORwith an empty string will disableNO_COLOR(enable colorized output) - by @ptmcg. (#2719)
Fixed¶
TOX_SKIP_ENVenvironment variable now works again, and can also be set via the CLI argument--skip-envfor any command where-ecan be set - by @mgedmin. (#2698)tox configshould only show env_list arguments by default instead ofALL- by @gaborbernat. (#2726)
4.0.10 (2022-12-14)¶
Added¶
Add
py_dot_verandpy_implconstants 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 intox.ini- by @gaborbernat. (#2640)
Fixed¶
--helpnow reports the default verbosity level (which is WARNING) correctly. (#2707)
4.0.9 (2022-12-13)¶
Added¶
Add
tox_on_installandtox_env_teardownplugin hooks - by @gaborbernat. (#2687)Add
PKG_CONFIG_PATHto the default pass through environment list for python tox environments - by @gaborbernat. (#2700)
4.0.8 (2022-12-11)¶
Fixed¶
Fix multiple substitution on factor filtering in
tox.iniwhen multiple factor filters match - by @gaborbernat. (#2650)Fix regression in
requirements.txtparsing - by @gaborbernat. (#2682)
4.0.7 (2022-12-11)¶
Fixed¶
Support for
--no-depsflag within the deps - by @gaborbernat. (#2674)
4.0.6 (2022-12-10)¶
Added¶
4.0.5 (2022-12-09)¶
Fixed¶
Normalize extra names passed in (fixes extra groups not being picked up during installation) - by @gaborbernat. (#2655)
4.0.4 (2022-12-09)¶
Fixed¶
Disable logging from
distlib.utilandfilelockas these log messages are too verbose - by @gaborbernat. (#2655)Use
!randrepr()to better display erroneous values in exception fromStrConverter.to_bool()- by @ptmcg. (#2665)
Documentation¶
4.0.3 (2022-12-08)¶
Fixed¶
Always set environment variable
PYTHONIOENCODINGtoutf-8to ensure tox works under Windows custom encodings - by @gaborbernat. (#2422)Ensure change_dir is created if does not exist before executing commands - by @gaborbernat. (#2620)
Pass through
NUMBER_OF_PROCESSORSon Windows as is needed formultiprocessing.cpu_count- by @gaborbernat. (#2629)The core tox configuration now contains
host_pythonkey showing the host python executable path - by @gaborbernat. (#2630)
Documentation¶
Document that space separator is no longer valid for the passenv and instead one should use comma - by @gaborbernat. (#2615)
Document necessity to escape
#within INI configuration - by @jugmac00. (#2617)
4.0.2 (2022-12-07)¶
Fixed¶
Unescaped comma in substitution should not be replaced during INI expansion - by @gaborbernat. (#2616)
tox --showconfig -e py311reports tox section, though it should not - by @gaborbernat. (#2624)
4.0.1 (2022-12-07)¶
Fixed¶
Create session views of the build wheel/sdist into the temp_dir folder - by @gaborbernat. (#2612)
Default tox min_version to 4.0 instead of current tox version - by @gaborbernat. (#2613)
4.0.0 (2022-12-07)¶
Fixed¶
The temporary folder within the tox environment was named
.tempinstead of.tmp- by @gaborbernat. (#2608)
Documentation¶
Enumerate breaking changes of tox 4 in the FAQ, and also list major new improvements - by @gaborbernat. (#2587)
Document in the FAQ that tox 4 will raise a warning when finding conflicting environment names - by @gaborbernat. (#2602)
4.0.0rc4 (2022-12-06)¶
Fixed¶
Fix extras not being kept for install dependencies - by @gaborbernat. (#2603)
Deprecated¶
4.0.0rc3 (2022-12-05)¶
Added¶
Add
--exit-and-dump-afterflag 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 @gaborbernat. (#2595)
Fixed¶
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 @gaborbernat. (#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 @gaborbernat. (#2595)
4.0.0rc2 (2022-12-04)¶
Added¶
Support for recursive extras in Python package dependencies - by @gaborbernat. (#2567)
Fixed¶
Support in INI files for ignore exit code marker the
-without a subsequent space too - by @gaborbernat. (#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 @gaborbernat. (#2562)
Ensure only on run environment operates at a time on a packaging environment (fixes unexpected failures when running in parallel mode) - by @gaborbernat. (#2564)
Fallback to
editable-legacyif package target iseditablebut the build backend does not havebuild_editablehook - by @gaborbernat. (#2567)Allow reference replacement in INI configuration via keys that contain the
-character - by @gaborbernat. (#2569)Resolve symlinks when saving Python executable path - by @ssbarnea. (#2574)
Do not set
COLUMNSorLINESenvironment to the current TTY size if already set by the user - by @gaborbernat. (#2575)Add missing build[virtualenv] test dependency - by @ssbarnea. (#2576)
4.0.0rc1 (2022-11-29)¶
Added¶
Add support for generative section headers - by @gaborbernat. (#2362)
Fixed¶
4.0.0b3 (2022-11-27)¶
Added¶
Pass
PROGRAMDATA,PROGRAMFILES(x86),PROGRAMFILESenvironments on Windows by default as it is needed for discovering the VS C++ compiler and start testing against 3.11 - by @gaborbernat. (#2492)Support PEP-621 static metadata for getting package dependencies - by @gaborbernat. (#2499)
Add support for editable wheels, make it the default development mode and rename
dev-legacymode toeditable-legacy- by @gaborbernat. (#2502)
Fixed¶
Recognize
TERM=dumborNO_COLORenvironment variables. - by @ssbarnea. (#1290)Allow passing config directory without filename. - by @ssbarnea. (#2340)
Avoid ignored explicit argument ‘re’ console message. - by @ssbarnea. (#2342)
Display registered plugins with
tox --version- by @mxd4. (#2358)Allow
--hashto be specified in requirements.txt files. - by @masenf. (#2373)Avoid impossible minversion version requirements. - by @ssbarnea. (#2414)
Documentation¶
Add new documentation for tox 4 - by @gaborbernat. (#2408)
4.0.0b2 (2022-04-11)¶
Added¶
Use
toxconsole entry point name instead oftox4- by @gaborbernat. (#2344)Use
.toxas working directory instead of.tox/4- by @gaborbernat. (#2346)Switch to
hatchlingas build backend instead ofsetuptools- by @gaborbernat. (#2368)
Fixed¶
Fix CLI raises an error for
-vawithignored explicit argument 'a'- by @gaborbernat. (#2343)Do not interpolate values when parsing
tox.iniconfiguration files - by @gaborbernat. (#2350)
Documentation¶
4.0.0b1 (2022-02-05)¶
Added¶
Display a hint for unrecognized argument CLI parse failures to use
--separator to pass arguments to commands - by @gaborbernat. (#2183)Do not allow extending the config set beyond setup to ensures that all configuration values are visible via the config sub-command. - by @gaborbernat. (#2243)
Print a message when ignoring outcome of commands - by @gaborbernat. (#2315)
Fixed¶
Fix type annotation is broken for
tox.config.sets.ConfigSet.add_config()when adding a container type - by @gaborbernat. (#2233)Insert
TOX_WORK_DIR,TOX_ENV_NAME,TOX_ENV_DIRandVIRTUAL_ENVinto the environment variables for all tox environments to keep contract with tox version 3 - by @gaborbernat. (#2259)Fix plugin initialization order - core plugins first, then 3rd party and finally inline - by @gaborbernat. (#2264)
Legacy parallel mode should accept
-pflag without arguments - by @gaborbernat. (#2299)Sequential run fails because the packaging environment is deleted twice for sequential runs with recreate flag on - by @gaborbernat. (#2300)
Require Python 3.10 to generate docs - by @jugmac00. (#2321)
Environment assignment for output breaks when using
-rv(when we cannot guess upfront the verbosity level from the CLI arguments) - by @gaborbernat. (#2324)devenvcommand does not respect specified path - by @gaborbernat. (#2325)
Documentation¶
Enable link check during documentation build - by @gaborbernat. (#806)
Document ownership of the
tox.wikiroot domain - by @gaborbernat. (#2242)Document
tox.config.sets.ConfigSet.loaders()- by @gaborbernat. (#2287)Fix CLI documentation is missing and broken documentation references - by @gaborbernat. (#2310)
4.0.0a10 (2022-01-04)¶
Added¶
Support for grouping environment values together by applying labels to them either at core and environment level, and allow selecting them via the -m flag from the CLI - by @gaborbernat. (#238)
Support for environment files within the set_env configuration via the
file|prefix - by @gaborbernat. (#1938)Support for
--no-provisionflag - by @gaborbernat. (#1951)Missing
pyproject.tomlorsetup.pyfile at the tox root folder without the--install-pkgflag assumes no packaging - by @gaborbernat. (#1964)Add
externalpackage type for package (see External package builder), and extract package dependencies for packages passed in via –installpkg - by @gaborbernat. (#2204)Add support for rewriting script invocations that have valid shebang lines when the
TOX_LIMITED_SHEBANGenvironment variable is set and not empty - by @gaborbernat. (#2208)Support for the
--discoverCLI flag - by @gaborbernat. (#2245)Moved the python packaging logic into a dedicate package pyproject-api and use it as a dependency - by @gaborbernat. (#2274)
Drop python 3.6 support - by @gaborbernat. (#2275)
Support for selecting target environments with a given factor via the -f CLI environment flag - by @gaborbernat. (#2290)
Fixed¶
Fix
CTRL+Cis not stopping the process on Windows - by @gaborbernat. (#2159)Fix list/depends commands can create tox package environment as runtime environment and display an error message - by @gaborbernat. (#2234)
Deprecated¶
tox_add_core_configandtox_add_env_confignow take astate: Stateargument instead of a configuration one, andConfignot longer provides theenvsproperty (instead users should migrate toState.envs) - by @gaborbernat. (#2275)
4.0.0a9 (2021-09-16)¶
Added¶
Expose the parsed CLI arguments on the main configuration object for plugins and allow plugins to define their own configuration section – by @gaborbernat. (#2191)
Let tox run fail when all envs are skipped – by @jugmac00. (#2195)
Expose the configuration loading mechanism to plugins to define and load their own sections. Add
tox_add_env_configplugin hook called after the configuration environment is created for a tox environment and removedtox_configure. Add the main configuration object as argument totox_add_core_config. Move the environment list method from the state to the main configuration object to allow its use within plugins – by @gaborbernat. (#2200)Allow running code in plugins before and after commands via
tox_before_run_commandsandtox_after_run_commandsplugin points – by @gaborbernat. (#2201)Allow plugins to update the set_env and change the pass_env configurations – by @gaborbernat. (#2215)
Fixed¶
Fix env variable substitutions with defaults containing colon (e.g. URL) – by @comabrewer. (#2182)
Do not allow constructing
ConfigSetdirectly and implement__contains__forLoader– by @gaborbernat. (#2209)Fix old-new value on recreate cache miss-match are swapped – by @gaborbernat. (#2211)
Report fails when report does not support Unicode characters – by @gaborbernat. (#2213)
Documentation¶
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-devorganization - by @gaborbernat. (#1881)
4.0.0a8 (2021-08-21)¶
Added¶
Add support for allowlist_externals, commands not matching error - by @gaborbernat. (#1127)
Add outcome of environments into the result json (–result-json) under the
resultkey containingsuccessboolean,exit_codeinteger anddurationfloat value - by @gaborbernat. (#1405)Add
execsubcommand that allows users to run an arbitrary command within the tox environment (without needing to modify their configuration) - by @gaborbernat. (#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 ignore_base_python_conflict is not set or
False- by @gaborbernat. (#1840)Allow any Unix shell-style wildcards expression for pass_env - by @gaborbernat. (#2121)
Add support for args_are_paths flag - by @gaborbernat. (#2122)
Add support for env_log_dir (compared to tox 3 extend content and keep only last run entries) - by @gaborbernat. (#2123)
Add support for
{:}substitution in ini files as placeholder for the OS path separator - by @gaborbernat. (#2125)When cleaning directories (for tox environment,
env_log_dir,env_tmp_dirand 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 @gaborbernat. (#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 @gaborbernat. (#2172)
Fixed¶
Support
#character in path for the tox project - by @gaborbernat. (#763)If the command expression fails to parse with shlex fallback to literal pass through of the remaining elements - by @gaborbernat. (#1944)
tox config fails on –recreate flag, and once specified the output does not reflect the impact of the CLI flags - by @gaborbernat. (#2037)
Virtual environment creation for Python is always triggered at every run - by @gaborbernat. (#2041)
Add support for setting suicide_timeout, interrupt_timeout and terminate_timeout - by @gaborbernat. (#2124)
Parallel show output not working when there’s a packaging phase in the run - by @gaborbernat. (#2161)
Documentation¶
Note constraint files are a subset of requirement files - by @gaborbernat. (#1939)
Add a note about having a package with different Python requirements than tox and not specifying base_python - by @gaborbernat. (#1975)
Fix –runner is missing default value and documentation unclear - by @gaborbernat. (#2004)
4.0.0a7 (2021-07-28)¶
Added¶
Add support for configuration taken from the
setup.cfgfile -by @gaborbernat. (#1836)Add support for configuration taken from the
pyproject.tomlfile,toxsectionlegacy_tox_inikey - by @gaborbernat. (#1837)Add configuration documentation - by @gaborbernat. (#1914)
Implemented
[]substitution (alias for{posargs}) - by @hexagonrecursion. (#1928)Implement
[testenv] ignore_outcome- “a failing result of this testenv will not make tox fail” - by @hexagonrecursion. (#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 @gaborbernat. (#1963)Introduce the installer concept, and collect pip installation into a
pippackage, also attach to this the requirements file parsing which got a major rework - by @gaborbernat. (#1991)Support CPython
3.10-by @gaborbernat. (#2014)
Fixed¶
Environments with a platform mismatch are no longer silently skipped, but properly reported - by @jugmac00. (#1926)
Port pip requirements file parser to
toxto achieve full equivalency (such as support for the per requirement--install-optionand--global-optionflags) - by @gaborbernat. (#1929)Support for extras with paths for Python deps and requirement files - by @gaborbernat. (#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 @hexagonrecursion. (#1956)Enable setting a different
upstreamrepository for the coverage diff report. This has been hardcoded toupstream/rewriteuntil now. by @jugmac00. (#1972)Enable replacements (a.k.a section substitutions) for section names containing a dash in sections without the
testenv:prefix - by @jugmac00, @obestwalter, @eumiro. (#1985)Fix legacy list env command for empty/missing envlist - by @jugmac00. (#1987)
Requirements and constraints files handling got reimplemented, which should fix all open issues related to this area - by @gaborbernat. (#1991)
Evaluate factor conditions for
commandkeys - by @jugmac00. (#2002)Prefer f-strings instead of the str.format method - by @eumiro. (#2012)
Fix regex validation for SHA 512 hashes - by @jugmac00. (#2018)
Actually run all environments when
ALLis provided to the legacy env command - by @jugmac00. (#2112)Move from
appdirstoplatformdirs- by @gaborbernat. (#2117)Move from
tomltotomli- by @gaborbernat. (#2118)
Documentation¶
Start documenting the plugin interface. Added
tox_register_tox_env,tox_add_option,tox_add_core_config,tox_configure- by @gaborbernat. (#1991)Explain how
-vand-qflags play together to determine CLI verbosity level - by @jugmac00. (#2005)Start polishing the documentation for the upcoming final release - by @jugmac00. (#2006)
Update documentation about changelog entries for trivial changes - by @jugmac00. (#2007)
4.0.0a6 (2021-02-15)¶
Added¶
Add basic quickstart implementation (just use pytest with the current Python version) - by @gaborbernat. (#1829)
Support comments via the
#character within the ini configuration (to force a literal#use\#) - by @gaborbernat. (#1831)Add support for the
install_commandsettings in the virtual env test environments - by @gaborbernat. (#1832)Add support for the
package_rootsetupdir( Python scoped) configuration that sets the root directory used for packaging (the location of the historicalsetup.pyand modernpyproject.toml). This can be set at root level, or at tox environment level (the later takes precedence over the former) - by @gaborbernat. (#1838)Implement support for the
--installpkgCLI flag - by @gaborbernat. (#1839)Add support for the
list_dependencies_commandsettings in the virtual env test environments - by @gaborbernat. (#1842)Add support for the
ignore_errorssettings in tox test environments - by @gaborbernat. (#1843)Add support for the
pip_presettings for virtual environment based tox environments - by @gaborbernat. (#1844)Add support for the
platformsettings in tox test environments - by @gaborbernat. (#1845)Add support for the
recreatesettings in tox test environments - by @gaborbernat. (#1846)Allow Python test and packaging environments with version 2.7 - by @gaborbernat. (#1900)
Do not construct a requirements file for deps in virtualenv, instead pass content as CLI argument to pip - by @gaborbernat. (#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 @gaborbernat. (#1909)
The
_TOX_SHOW_THREADenvironment 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 @gaborbernat. (#1915)
Fixed¶
Normalize description text to collapse newlines and one or more than whitespace to a single space - by @gaborbernat. (#1829)
Support aliases in show config key specification (will print with the primary key) - by @gaborbernat. (#1831)
Show config no longer marks as unused keys that are inherited (e.g. if the key is coming from
testenvsection and our target istestenv:fix) - by @gaborbernat. (#1833)--alwayscopyand--sitepackageslegacy only flags do not work - by @gaborbernat. (#1839)Fix handling of
commands_pre/commands/commands_postto be in line with tox 3 (returned incorrect exit codes and post was not always executed) - by @gaborbernat. (#1843)Support requirement files containing
--hashconstraints - by @gaborbernat. (#1903)Fix a bug that caused tox to never finish when pulling configuration from a tox run environment that was never executed - by @gaborbernat. (#1915)
Deprecated¶
Drop support for
sdistsrcflag because introduces a significant complexity and is barely used (5 hits on a github search).--skip-missing-interpreters,--notest,--sdistonly,--installpkg,--developand--skip-pkg-installCLI flags are no longer available fordevenv(enforce the only sane value for these). By @gaborbernat (#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 @gaborbernat. (#1841)
4.0.0a5 (2021-01-23)¶
Added¶
Support the
system_site_packages/sitepackagesflag for virtual environment based tox environments - by @gaborbernat. (#1847)Support the
always_copy/alwayscopyflag for virtual environment based tox environments - by @gaborbernat. (#1848)Support the
downloadflag for virtual environment based tox environments - by @gaborbernat. (#1849)Recreate virtual environment based tox environments when the
virtualenvversion changes - by @gaborbernat. (#1865)
Fixed¶
Not all package dependencies are installed when different tox environments in the same run use different set of extras by @gaborbernat. (#1868)
Support
=separator in requirement file flags, directories as requirements and correctly set the root of the requirements file when using the--rootCLI flag to change the root - by @gaborbernat. (#1853)Cleanup local subprocess file handlers when exiting runs (fixes
ResourceWarning: unclosed fileerrors when running withenv PYTHONTRACEMALLOC=5 PYTHONDEVMODE=yunder a Python built with--with-pydebug) - by @gaborbernat. (#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
HandledErrorin 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 @gaborbernat. (#1864)
Documentation¶
Add CLI documentation - by @gaborbernat. (#1852)
4.0.0a4 (2021-01-16)¶
Added¶
Use
.tox/4instead of.tox4folder (so ignores for tox 3 works for tox 4 too), reminder we’ll rename this to just.toxbefore public release, however to encourage testing tox 4 in parallel with tox 3 this is helpful - by @gaborbernat. (#1812)Colorize the
configcommand: section headers are yellow, keys are green, values remained white, exceptions are light red and comments are cyan - by @gaborbernat. (#1821)
Fixed¶
Support legacy format (
-cconstraint.txt) of constraint files indeps, and expand constraint files too when viewing inside thedepsor calculating weather our environment is up to date or not - by @gaborbernat. (#1788)When specifying requirements/editable/constraint paths within
depsescape space, unless already escaped to support running specifying transitive requirements files within deps - by @gaborbernat. (#1792)When using a provisioned tox environment requesting
--recreatefailed withAttributeError- by @gaborbernat. (#1793)Fix
RequirementsFilefrom tox is rendered incorrectly inconfigcommand - by @gaborbernat. (#1820)Fix a bug in the configuration system where referring to the same named key in another env/section causes circular dependency error - by @gaborbernat. (#1821)
Raise
ValueErrorwith descriptive message when a requirements file specified does not exist - by @gaborbernat. (#1828)Support all valid requirement file specification without delimiting space in the
depsof thetox.ini- by @gaborbernat. (#1834)
Documentation¶
Add code style guide for contributors - by @gaborbernat. (#1734)
4.0.0a3 (2021-01-13)¶
Added¶
Raise exception when set env enters into a circular reference - by @gaborbernat. (#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
--discoverflag - by @gaborbernat. (#1784)
Fixed¶
Entries in the
set_envdoes not reference environments fromset_env- by @gaborbernat. (#1776)envsubstitution does not uses values fromset_env- by @gaborbernat. (#1779)Adopt tox 3 base pass env list, by adding:
on all platforms:
LANG,LANGUAGE,CURL_CA_BUNDLE,SSL_CERT_FILE,LD_LIBRARY_PATHandREQUESTS_CA_BUNLDE,on Windows:
SYSTEMDRIVE- by @gaborbernat. (#1780)
Fixed a bug that crashed tox where calling tox with the recreate flag and when multiple environments were reusing the same package - by @gaborbernat. (#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) ifbackend-pathis 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 @gaborbernat. (#1784)
Rework how we handle Python packaging environments:
the base packaging environment changed from
.packageto.pkg,merged the
sdist,wheelanddevseparate 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
sdistanddevpackages,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
dependsto use the packaging logic,add support skip missing interpreters for depends and show config, by @gaborbernat. (#1804)
4.0.0a2 (2021-01-09)¶
Added¶
Add option to disable colored output, and support
NO_COLORandFORCE_COLORenvironment variables - by @gaborbernat. (#1630)
Fixed¶
Fix coverage generation in CI - by @gaborbernat. (#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
\ninstead ofos.linesep,Windows Python 3.6 does not contain
_overlapped.ReadFileInto- by @gaborbernat. (#1556)
Documentation¶
Add base documentation by merging virtualenv structure with tox 3 - by @gaborbernat. (#1551)
3.28.0 (2022-12-14)¶
Added¶
3.27.1 (2022-11-13)¶
Fixed¶
3.27.0 (2022-10-25)¶
Fixed¶
Dropped
--build-optionin isolated builds, an alternative fix for theSetuptoolsDeprecationWarningabout using--global-option– by @adamchainz #2497Remove read-only files in
ensure_empty_dir. #2498Multiple tox instances no longer clobber the
.toxdirectory whenprovision_tox_envis used. - by @masenf #2515
Documentation¶
3.26.0 (2022-09-07)¶
Added¶
Fixed¶
Fix fallback to
pythonenvironment whenisolated_build = trueis set – by @Unrud #2474Fixed
SetuptoolsDeprecationWarningabout using--global-option– by @adamchainz #2478
3.25.1 (2022-06-29)¶
Fixed¶
sitepackages = truewill add user’s site-package to the python path on Windows as expected – by @niander #2402Avoid importing
pipeson Python 3.3+ to avoidDeprecationWarningon Python 3.11 – by @adamchainz #2417Fix
isolated_buildwhen the build process produces stderr at exit. #2449
Documentation¶
Explain advantages of
PIP_CONSTRAINTenvironment variable over--constraintargument. #2423
3.25.0 (2022-04-11)¶
Added¶
Ignore missing commands if they are prefixed by
-– by @cdown. #2315Add default environment variables (such as http_proxy) regardless of their case to passenv on UNIX – by @poggenhans. #2372
On Windows
PROGRAMFILES,PROGRAMFILES(X86), andPROGRAMDATAenvironment variables are now passed through, unmasking system values necessary to locate resources such as a C compiler. #2382
Fixed¶
Fixed failing isolated_build because setuptools warning was captured in
build_requires. – by @zariiii9003 #2332Avoid potential 30s delay caused by socket.getfqdn(). – by @ssbarnea #2375
Documentation¶
3.24.5 (2021-12-29)¶
Fixed¶
Fixed an issue where
usedevelopwould cause an invocation error if setup.py does not exist. – by @VincentVanlaer #2197
3.24.4 (2021-09-16)¶
Fixed¶
Documentation¶
3.24.3 (2021-08-21)¶
Fixed¶
Documentation¶
3.24.2 (2021-08-18)¶
Fixed¶
3.24.1 (2021-07-31)¶
Fixed¶
get_requires_for_build_sdisthook (PEP 517) is assumed to return an empty list if left unimplemented by the backend build system - by @oczkoisse #2130
Documentation¶
3.24.0 (2021-07-14)¶
Fixed¶
--devenvno longer modifies the directory in which the.toxenvironment is provisioned - by @isaac-ped #2065Fix show config when the package names are not in canonical form - by @gaborbernat. #2103
Documentation¶
Deprecated¶
toxno longer shows deprecation warnings fordistutils.sysconfigon Python 3.10 - by @9999years #2100
3.23.1 (2021-05-05)¶
Fixed¶
Distinguish between normal Windows Python and MSYS2 Python when looking for virtualenv executable path. Adds os.sep to
tox.interpreters.InterpreterInfo- by @jschwartzentruber #1982
Documentation¶
Update examples in the documentation to use
setenvin the[testenv]sections, not wrongly in the[tox]main section. - by @AndreyNautilus #1999
Packaging¶
3.23.0 (2021-03-03)¶
Added¶
tox can now be invoked with a new
--no-provisionflag that prevents provision, ifrequiresorminversionare not satisfied, tox will fail; if a path is specified as an argument to the flag (e.g. astox --no-provision missing.json) and provision is prevented, provision metadata are written as JSON to that path - by @hroncok #1921Unicode support in
pyproject.toml- by @domdfcoding #1940
3.22.0 (2021-02-16)¶
Added¶
3.21.4 (2021-02-02)¶
Fixed¶
3.21.3 (2021-01-28)¶
Fixed¶
3.21.2 (2021-01-19)¶
Fixed¶
Newer coverage tools update the
COV_CORE_CONTEXTenvironment variable, add it to the list of environment variables that can change in our pytest plugin - by @gaborbernat. #1854
3.21.1 (2021-01-13)¶
Added¶
Fixed¶
Packaging¶
3.21.0 (2021-01-08)¶
Added¶
Fixed¶
Fix the false
congratulationsmessage that appears when aKeyboardInterruptoccurs during package installation. - by @gnikonorov #1453Fix
platformsupport forinstall_command. - by @jayvdb #1464Fixed regression in v3.20.0 that caused escaped curly braces in setenv to break usage of the variable elsewhere in tox.ini. - by @jayvdb #1690
Prevent
{}and require{:is only followed by}. - by @jayvdb #1711Raise
MissingSubstitutionon access of broken ini setting. - by @jayvdb #1716
Documentation¶
Document more info about using
platformsetting. - by @prakhargurunani #1144Replace
indexserverin documentation with environment variables - by @ziima. #1357Document that the
passenvenvironment setting is case insensitive. - by @gnikonorov #1534
3.20.1 (2020-10-09)¶
Fixed¶
Relax importlib requirement to allow version<3 - by @usamasadiq #1682
3.20.0 (2020-09-01)¶
Added¶
Support for comments within
setenvand environment files via thefiles|prefix. - by @gaborbernat #1667
Fixed¶
3.19.0 (2020-08-06)¶
Added¶
Implement support for building projects having PEP 517#in-tree-build-backends
backend-pathsetting - by @webknjaz #1575Don’t require a tox config file for
tox --devenv- by @hroncok #1643
Fixed¶
Documentation¶
3.18.1 (2020-07-28)¶
Fixed¶
Fix
TypeErrorwhen using isolated_build with backends that are not submodules (e.g.maturin) #1629
3.18.0 (2020-07-23)¶
Deprecated¶
3.17.1 (2020-07-15)¶
Fixed¶
3.17.0 (2020-07-14)¶
Added¶
The long arguments
--verboseand--quiet(rather than only their short forms,-vand-q) are now accepted. #1612The
ResultLognow prefersHOSTNAMEenvironment variable value (if set) over the full qualified domain name of localhost. This makes it possible to disable an undesired DNS lookup, which happened on alltoxinvocations, including trivial ones - by @hroncok #1615
Documentation¶
Update packaging information for Flit. #1613
3.16.1 (2020-06-29)¶
Fixed¶
3.16.0 (2020-06-26)¶
Added¶
Allow skipping the package and installation step when passing the
--skip-pkg-install. This should be used in pair with the--notest, so you can separate environment setup and test run: .. code-block:: console tox -e py –notest tox -e py –skip-pkg-install by @gaborbernat. #1605
Performance¶
Improve config parsing performance by precompiling commonly used regular expressions - by @brettlangdon #1603
3.15.2 (2020-06-06)¶
Added¶
Fixed¶
Add an option to allow a process to suicide before sending the SIGTERM. - by @jhesketh #1497
PyPy 7.3.1 on Windows uses the
Scriptfolder instead ofbin. - by @gaborbernat #1597
3.15.1 (2020-05-20)¶
Fixed¶
tox --showconfigno longer tries to interpolate ‘%’ signs. #1585
3.15.0 (2020-05-02)¶
Added¶
Fixed¶
Respect attempts to change
PATHviasetenv- by @aklajnert. #1423Fix parsing of architecture in python interpreter name. - by @bruchar1 #1542
Prevent exception when command is empty. - by @bruchar1 #1544
Fix irrelevant Error message for invalid argument when running outside a directory with tox support files by @nkpro2000sr. #1547
Documentation¶
Improve documentation about config by adding tox environment description at start - by @stephenfin. #1573
3.14.6 (2020-03-25)¶
Fixed¶
Exclude virtualenv dependency versions with known regressions (20.0.[0-7]) - by @webknjaz. #1537
Fix
tox -handtox --hishows an error when run outside a directory with tox support files by @nkpro2000sr. #1539Fix ValueError on
tox -lfor atox.inifile that does not contain anenvlistdefinition. - by @jquast. #1343
3.14.5 (2020-02-16)¶
Added¶
Add
--discover(fallback toTOX_DISCOVERenvironment variable via path separator) to inject python executables to try as first step of a discovery - note the executable still needs to match the environment by @gaborbernat. #1526
3.14.4 (2020-02-13)¶
Added¶
Fixed¶
3.14.3 (2019-12-27)¶
Fixed¶
Packaging¶
Clarify legacy setup.py error message: python projects should commit to a strong consistency of message regarding packaging. We no-longer tell people to add a setup.py to their already configured pep-517 project, otherwise it could imply that pyproject.toml isn’t as well supported and recommended as it truly is - by @graingert #1478
3.14.2 (2019-12-02)¶
Fixed¶
Performance¶
Packaging¶
Use latest version of importlib_metadata package - by @kammala #1472
Mark poetry related tests as xfail since its dependency pyrsistent won’t install in ci due to missing wheels/build deps. - by @RonnyPfannschmidt #1474
3.14.1 (2019-11-13)¶
Fixed¶
fix reporting of exiting due to (real) signals - by @blueyed #1401
Bump minimal virtualenv to 16.0.0 to improve own transitive deps handling in some ancient envs. — by @webknjaz #1429
Adds
CURL_CA_BUNDLE,REQUESTS_CA_BUNDLE,SSL_CERT_FILEto the default passenv values. - by @ssbarnea #1437Fix nested tox execution in the parallel mode by separating the environment variable that let’s tox know it is invoked in the parallel mode (
_TOX_PARALLEL_ENV) from the variable that informs the tests that tox is running in parallel mode (TOX_PARALLEL_ENV). — by @hroncok #1444Fix provisioning from a pyvenv interpreter. — by @kentzo #1452 Deprecations (removal in next major release)
Python
3.4is no longer supported. — by @gaborbernat #1456
3.14.0 (2019-09-03)¶
Added¶
Changes¶
Fix relative URLs to files in the repo in
.github/PULL_REQUEST_TEMPLATE.md— by @webknjaz #1363Replace
importlib_metadatabackport withimportlib.metadatafrom the standard library on Python3.8+- by @hroncok #1367Render the change fragment help on the
docs/changelog/directory view on GitHub — by @webknjaz #1370
Fixed¶
Fix regression failing to detect future and past
py##factors - by @asottile #1377Honor environment markers in
requireslist - by @asottile #1380improve recreate check by allowing directories containing
.tox-config1(the marker file created by tox) - by @asottile #1383Recognize correctly interpreters that have suffixes (like python3.7-dbg). #1415
Documentation¶
3.13.2 (2019-07-01)¶
Fixed¶
on venv cleanup: add explicit check for pypy venv to make it possible to recreate it - by @obestwalter #1355
non canonical names within
requirescause infinite provisioning loop - by @gaborbernat #1359
3.13.1 (2019-06-25)¶
Fixed¶
3.13.0 (2019-06-24)¶
Added¶
Fixed¶
tox used Windows shell rules on non-Windows platforms when transforming positional arguments to a string - by @barneygale. #1336
3.12.1 (2019-05-23)¶
Fixed¶
3.12.0 (2019-05-23)¶
Added¶
Adding
TOX_PARALLEL_NO_SPINNERenvironment variable to disable the spinner in parallel mode for the purposes of clean output when using CI tools - by @zeroshift #1184
Fixed¶
When using
--parallelwith--result-jsonthe test results are now included the same way as with serial runs - by @fschulze #1295Turns out the output of the
py -0pis not stable yet and varies depending on various edge cases. Instead now we read the interpreter values directly from registry via PEP-514 - by @gaborbernat. #1306
3.11.1 (2019-05-16)¶
Fixed¶
When creating virtual environments we no longer ask the python to tell its path, but rather use the discovered path. #1301
3.11.0 (2019-05-15)¶
Added¶
--showconfigoverhaul:now fully generated via the config parser, so anyone can load it by using the built-in python config parser
the
toxsection contains all configuration data from configthe
toxsection contains ahost_pythonkey detailing the path of the host pythonthe
tox:versionsection contains the versions of all packages tox depends on with their versionpassing
-lnow allows only listing default target envsallows showing config for a given set of tox environments only via the
-ecli flag or theTOXENVenvironment variable, in this case thetoxandtox:versionsection is only shown if at least one verbosity flag is passed this should help inspecting the options. #1298
3.10.0 (2019-05-13)¶
Added¶
Virtual environments created now no longer upgrade pip/wheel/setuptools to the latest version. Instead the start packages after virtualenv creation now is whatever virtualenv has bundled in. This allows faster virtualenv creation and builds that are easier to reproduce. #448
Improve python discovery and add architecture support:
UNIX: - First, check if the tox host Python matches. - Second, check if the the canonical name (e.g.
python3.7,python3) matches or the base python is an absolute path, use that. - Third, check if the the canonical name without version matches (e.g.python,pypy) matches.Windows: - First, check if the tox host Python matches. - Second, use the
py.exeto list registered interpreters and any of those match. - Third, check if the the canonical name (e.g.python3.7,python3) matches or the base python is an absolute path, use that. - Fourth, check if the the canonical name without version matches (e.g.python,pypy) matches. - Finally, check for known locations (c:\python{major}{minor}\python.exe). tox environment configuration generation is now done in parallel (to alleviate the slowdown due to extra checks). #1290
Fixed¶
fix for
tox -lcommand: do not allow setting theTOXENVor the-eflag to override the listed default environment variables, they still show up under extra if non defined target - by @gaborbernat #720tox ignores unknown CLI arguments when provisioning is on and outside of the provisioned environment (allowing provisioning arguments to be forwarded freely) - by @gaborbernat #1270
3.9.0 (2019-04-17)¶
Added¶
Fixed¶
3.8.6 (2019-04-03)¶
Fixed¶
parallel_show_outputdoes not work with tox 3.8 #1245
3.8.5 (2019-04-03)¶
Fixed¶
the isolated build env now ignores
sitepackages,depsanddescriptionas these do not make sense - by @gaborbernat #1239Do not print timings with more than 3 decimal digits on Python 3 - by @mgedmin. #1241
3.8.4 (2019-04-01)¶
Fixed¶
3.8.3 (2019-03-29)¶
Fixed¶
don’t crash when version information is not available for a proposed base python - by @gaborbernat #1227
Do not print exception traceback when the provisioned tox fails - by @gaborbernat #1228
3.8.2 (2019-03-29)¶
Fixed¶
using -v and -e connected (as -ve) fails - by @gaborbernat #1218
Changes to the plugin tester module (cmd no longer sets
PYTHONPATH), andaction.popenno longer returns the command identifier information from within the logs. No public facing changes. #1222Spinner fails in CI on
UnicodeEncodeError- by @gaborbernat #1223
3.8.1 (2019-03-28)¶
Fixed¶
The
-eALLcommand line argument now expands theenvlistkey and includes all its environment. #1155Isolated build environment dependency overrides were not taken in consideration (and such it inherited the deps from the testenv section) - by @gaborbernat #1207
--result-jsonputs the command into setup section instead of test (pre and post commands are now also correctly put into the commands section) - by @gaborbernat #1210Set
setup.cfgencoding to UTF-8 as it contains Unicode characters. #1212Fix tox CI, better error reporting when locating via the py fails - by @gaborbernat #1215
3.8.0 (2019-03-27)¶
Added¶
tox now auto-provisions itself if needed (see Auto-provisioning). Plugins or minimum version of tox no longer need to be manually satisfied by the user, increasing their ease of use. - by @gaborbernat #998
tox will inject the
TOX_PARALLEL_ENVenvironment variable, set to the current running tox environment name, only when running in parallel mode. - by @gaborbernat #1139Parallel children now save their output to a disk logfile - by @gaborbernat #1143
Parallel children now are added to
--result-json- by @gaborbernat #1159Display pattern and
sys.platformwith platform mismatch - by @blueyed. #1176Setting the environment variable
TOX_REPORTER_TIMESTAMPto1will enable showing for each output line its delta since the tox startup. This can be especially handy when debugging parallel runs.- by @gaborbernat #1203
Fixed¶
In a posix shell, setting the PATH environment variable to an empty value is equivalent to not setting it at all; therefore we no longer if the user sets PYTHONPATH an empty string on python 3.4 or later - by @gaborbernat. #1092
Fixed bug of children process calls logs clashing (log already exists) - by @gaborbernat #1137
Interpreter discovery and virtualenv creation process calls that failed will now print out on the screen their output (via the logfile we automatically save) - by @gaborbernat #1150
Using
py2andpy3with a specificbasepythonwill no longer raise a warning unless the major version conflicts - by @demosdemon. #1153Fix missing error for
tox -e unknownwhen tox.ini declaresenvlist. - by @medmunds #1160Interrupting a tox call (e.g. via CTRL+C) now will ensure that spawn child processes (test calls, interpreter discovery, parallel sub-instances, provisioned hosts) are correctly stopped before exiting (via the pattern of INTERRUPT - 300 ms, TERMINATE - 200 ms, KILL signals) - by @gaborbernat #1172
Fix a
ResourceWarning: unclosed fileinAction- by @BoboTiG. #1179Fix deadlock when using
--paralleland having environments with lots of output - by @asottile. #1183Removed code that sometimes caused a difference in results between
--paralleland-pwhen usingposargs- by @timdaman #1192
Documentation¶
Add a
poetryexamples to packaging - by @gaborbernat #1163
3.7.0 (2019-01-11)¶
Added¶
Parallel mode added (alternative to
detoxwhich is being deprecated), for more details see Parallel mode - by @gaborbernat. #439Added command line shortcut
-sfor--skip-missing-interpreters- by @evandrocoan #1119 Deprecations (removal in next major release)Whitelisting of externals will be mandatory in tox 4: issue a deprecation warning as part of the already existing warning - by @obestwalter #1129
Documentation¶
Clarify explanations in examples and avoid unsupported end line comments - by @obestwalter #1110
Set to PULL_REQUEST_TEMPLATE.md use relative instead of absolute URLs - by @evandrocoan Fixed PULL_REQUEST_TEMPLATE.md path for changelog/examples.rst to docs/changelog/examples.rst - by @evandrocoan #1120
3.6.1 (2018-12-24)¶
Added¶
if the packaging phase successfully builds a package set it as environment variable under
TOX_PACKAGE(useful to make assertions on the built package itself, instead of just how it ends up after installation) - by @gaborbernat (#1081)
3.6.0 (2018-12-13)¶
Fixed¶
Documentation¶
Update Contributor Covenant URL to use https:// - by @jdufresne. (#1082)
Correct the capitalization of PyPI throughout the documentation - by @jdufresne. (#1084)
Link to related projects (Invoke and Nox) from the documentation - by @theacodes. (#1088)
Packaging¶
Include the license file in the wheel distribution - by @jdufresne. (#1083)
3.5.3 (2018-10-28)¶
Fixed¶
Fix bug with incorrectly defactorized dependencies - by @bartsanchez (#706)
do the same transformation to
egg_infofolders thatpkg_resourcesdoes; this makes it possible for hyphenated names to use thedevelop-inst-noopoptimization (cf. 910), which previously only worked with non-hyphenated egg names - by @hashbrowncipher (#1051)previously, if a project’s
setup.py --nameemitted extra information to stderr, tox would capture it and consider it part of the project’s name; now, emissions to stderr are printed to the console - by @hashbrowncipher (#1052)change the way we acquire interpreter information to make it compatible with
jythoninterpreter, note to create jython envs one needsvirtualenv > 16.0which will be released later @gaborbernat (#1073)
Documentation¶
document substitutions with additional content starting with a space cannot be alone on a line inside the ini file - by @gaborbernat (#437)
change the spelling of a single word from constrains to the proper word, constraints - by @metasyn (#1061)
Mention the minimum version required for
commands_pre/commands_postsupport. (#1071)
3.5.2 (2018-10-09)¶
Added¶
level three verbosity (
-vvv) show the packaging output - by @gaborbernat (#1047)
Fixed¶
session packages are now put inside a numbered directory (instead of prefix numbering it, because pip fails when wheels are not named according to PEP-491, and prefix numbering messes with this) - by @gaborbernat (#1042)
3.5.1 (2018-10-08)¶
Fixed¶
fix regression with
3.5.0: specifying--installpkgraisesAttributeError: 'str' object has no attribute 'basename'(#1042)
3.5.0 (2018-10-08)¶
Added¶
Added
temp_dirfolder configuration (defaults to{toxworkdir}/.tmp) that contains tox temporary files. Package builds now create a hard link (if possible, otherwise copy - notably in case of Windows Python 2.7) to the built file, and feed that file downstream (e.g. for pip to install it). The hard link is removed at the end of the run (what it points though is kept insidedistdir). This ensures that a tox session operates on the same package it built, even if a parallel tox run builds another version. Notedistdirwill contain only the last built package in such cases. by @gaborbernat (#1026)
Fixed¶
intermittent failures with
--parallel--safe-build, instead of mangling with the file paths now uses a lock to make the package build operation thread safe and is now on by default (--parallel--safe-buildis now deprecated) - by @gaborbernat (#1026)
Documentation¶
document tox environment recreate rules (recreate) - by @gaborbernat (#93)
document inside the
--helphow to disable colorized output via thePY_COLORSoperating system environment variable - by @gaborbernat (#163)document all global tox flags and a more concise format to express default and type - by @gaborbernat (#683)
document command line interface under the config section cli - by @gaborbernat (#829)
3.4.0 (2018-09-20)¶
Added¶
add
commands_preandcommands_postthat run before and after running thecommands(setup runs always, commands only if setup succeeds, teardown always - all run until the first failing command) - by @gaborbernat (#167)pyproject.tomlconfig support initially by just inline the tox.ini undertool.tox.legacy_tox_inikey; config source priority order ispyproject.toml,tox.iniand thensetup.cfg- by @gaborbernat (#814)use the os environment variable
TOX_SKIP_ENVto filter out tox environment names from the run list (set byenvlist) - by @gaborbernat (#824)always set
PIP_USER=0(do not install into the user site package, but inside the virtual environment created) andPIP_NO_DEPS=0(installing without dependencies can cause broken package installations) inside tox - by @gaborbernat (#838)tox will inject some environment variables that to indicate a command is running within tox:
TOX_WORK_DIRenv var is set to the tox work directory,TOX_ENV_NAMEis set to the current running tox environment name,TOX_ENV_DIRis set to the current tox environments working dir - by @gaborbernat (#847)While running tox invokes various commands (such as building the package, pip installing dependencies and so on), these were printed in case they failed as Python arrays. Changed the representation to a shell command, allowing the users to quickly replicate/debug the failure on their own - by @gaborbernat (#851)
skip missing interpreters value from the config file can now be overridden via the
--skip-missing-interpreterscli flag - by @gaborbernat (#903)keep additional environments config order when listing them - by @gaborbernat (#921)
allow injecting config value inside the ini file dependent of the fact that we’re connected to an interactive shell or not via exposing a
{tty}substitution - by @gaborbernat (#947)do not build sdist if skip install is specified for the envs to be run - by @gaborbernat (#974)
when verbosity level increases above two start passing through verbosity flags to pip - by @gaborbernat (#982)
when discovering the interpreter to use check if the tox host Python matches and use that if so - by @gaborbernat (#994)
-vvwill print out why a virtual environment is re-created whenever this operation is triggered - by @gaborbernat (#1004)
Fixed¶
add
--exists-action wto default pip flags to handle better VCS dependencies (pip documentation on this) - by @gaborbernat (#503)instead of assuming the Python version from the base python name ask the interpreter to reveal the version for the
ignore_basepython_conflictflag - by @gaborbernat (#908)PEP-517 packaging fails with sdist already exists, fixed via ensuring the dist folder is empty before invoking the backend and pypa/setuptools 1481 - by @gaborbernat (#1003)
Documentation¶
clarify that
pythonandpiprefer to the virtual environments executable - by @gaborbernat (#305)add Sphinx and mkdocs example of generating documentation via tox - by @gaborbernat (#374)
specify that
setup.cfgtox configuration needs to be inside thetox:toxnamespace - by @gaborbernat (#545)
3.3.0 (2018-09-11)¶
Added¶
PEP-517 source distribution support (create a
.packagevirtual environment to perform build operations inside) by @gaborbernat (#573)flit support via implementing
PEP-517by @gaborbernat (#820)packaging now is exposed as a hook via
tox_package(session, venv)- by @gaborbernat (#951)
Changes¶
Updated the VSTS build YAML to use the latest jobs and pools syntax - by @davidstaheli (#955)
Fixed¶
3.2.1 (2018-08-10)¶
Fixed¶
--parallel--safe-buildno longer cleans up its folders (distdir,distshare,log). - by @gaborbernat (#849)
3.2.0 (2018-08-10)¶
Added¶
Switch pip invocations to use the module
-m pipinstead of direct invocation. This could help avoid some of the shebang limitations. - by @gaborbernat (#935)Ability to specify package requirements for the tox run via the
tox.ini(toxsection under keyrequires- PEP-508 style): can be used to specify both plugin requirements or build dependencies. - by @gaborbernat (#783)Allow one to run multiple tox instances in parallel by providing the
--parallel--safe-buildflag. - by @gaborbernat (#849)
3.1.3 (2018-08-03)¶
Added¶
Python version testenvs are now automatically detected instead of comparing against a hard-coded list of supported versions. This enables
py38and eventuallypy39/py40/ etc. to work without requiring an upgrade totox. As such, the following public constants are now deprecated (and scheduled for removal intox4.0:CPYTHON_VERSION_TUPLES,PYPY_VERSION_TUPLES,OTHER_PYTHON_INTERPRETERS, andDEFAULT_FACTORS- by @asottile (#914)
Fixed¶
A caching issue that caused the
develop-inst-nodepsaction, which reinstalls the package under test, to always run has been resolved. Thedevelop-inst-noopaction, which, as the name suggests, is a no-op, will now run unless there are changes tosetup.pyorsetup.cfgfiles that have not been reflected - by @stephenfin (#909)
Documentation¶
Add a system overview section on the index page that explains briefly how tox works - by @gaborbernat. (#867)
3.1.2 (2018-07-12)¶
Fixed¶
Revert “Fix bug with incorrectly defactorized dependencies (#772)” due to a regression ((#799)) - by @obestwalter
3.1.1 (2018-07-09)¶
Fixed¶
PyPI documentation for
3.1.0is broken. Added test to check for this, and fix it by @gaborbernat. (#879)
3.1.0 (2018-07-08)¶
Added¶
Add support for multiple PyPy versions using default factors. This allows you to use, for example,
pypy27knowing that the correct interpreter will be used by default - by @stephenfin (#19)Add support to explicitly invoke interpreter directives for environments with long path lengths. In the event that
toxcannot invoke scripts with a system-limited shebang (e.x. a Linux host running a Jenkins Pipeline), a user can set the environment variableTOX_LIMITED_SHEBANGto workaround the system’s limitation (e.x.export TOX_LIMITED_SHEBANG=1) - by @jdknight (#794)introduce a constants module to be used internally and as experimental API - by @obestwalter (#798)
Make
py2andpy3aliases also resolve viapyon windows by @asottile. This enables the following things:tox -e py2andtox -e py3work on windows (they already work on posix); and settingbasepython=python2orbasepython=python3now works on windows. (#856)Replace the internal version parsing logic from the not well tested PEP-386 parser for the more general PEP-440. packaging >= 17.1 is now an install dependency by @gaborbernat. (#860)
Changes¶
make the already existing implicit API explicit - by @obestwalter (#800)
tweak codecov settings via .codecov.yml - by @obestwalter (#802)
Fixed¶
Add
ignore_basepython_conflict, which determines whether conflictingbasepythonsettings for environments containing default factors, such aspy27ordjango18-py35, should be ignored or result in warnings. This was a common source of misconfiguration and is rarely, if ever, desirable from a user perspective - by @stephenfin (#477)Fix bug with incorrectly defactorized dependencies (deps passed to pip were not de-factorized) - by @bartsanchez (#706)
Documentation¶
extend the plugin documentation and make lot of small fixes and improvements - by @obestwalter (#797)
tidy up tests - remove unused fixtures, update old cinstructs, etc. - by @obestwalter (#799)
Various improvements to documentation: open browser once documentation generation is done, show Github/Travis info on documentation page, remove duplicate header for changelog, generate unreleased news as DRAFT on top of changelog, make the changelog page more compact and readable (width up to 1280px) by @gaborbernat (#859)
improve tox quickstart and corresponding tests - by @obestwalter (#801)
Packaging¶
filter out unwanted files in package - by @obestwalter (#754)
3.0.0 (2018-04-02)¶
Added¶
toxdisplays exit code together withInvocationError- by @blueyed and @ederag. (#290)Hint for possible signal upon
InvocationError, on posix systems - by @ederag and @asottile. (#766)Add a
-qoption to progressively silence tox’s output. For each time you specify-qto tox, the output provided by tox reduces. This option allows you to see only your command output without the default verbosity of what tox is doing. This also counter-acts usage of-v. For example, runningtox -v -q ...will provide you with the default verbosity.tox -vv -qis equivalent totox -v. By @sigmavirus24 (#256)add support for negated factor conditions, e.g.
!dev: production_log- by @jurko-gospodnetic (#292)Headings like
installed: <packages>will not be printed if there is no output to display after the :, unless verbosity is set. By @cryvate (#601)Allow spaces in command line options to pip in deps. Where previously only
deps=-rreq.txtanddeps=--requirement=req.txtworked, now alsodeps=-r req.txtanddeps=--requirement req.txtwork - by @cryvate (#668)drop Python
2.6and3.3support:setuptoolsdropped supporting these, and as we depend on it we’ll follow up with doing the same (usetox <= 2.9.1if you still need this support) - by @gaborbernat (#679)Add tox_runenvreport as a possible plugin, allowing the overriding of the default behavior to execute a command to get the installed packages within a virtual environment - by @tonybaloney (#725)
Forward
PROCESSOR_ARCHITECTUREby default on Windows to fixplatform.machine(). (#740)
Changes¶
touched up
interpreters.pycode and added some missing tests for it - by @jurko-gospodnetic (#708)The
PYTHONDONTWRITEBYTECODEenvironment variable is no longer unset - by @stephenfin. (#744)
Fixed¶
Write directly to stdout buffer if possible to prevent str vs bytes issues - by @asottile (#426)
fix #672 reporting to json file when skip-missing-interpreters option is used - by @r2dan (#672)
avoid
Requested Python version (X.Y) not installedstderr output when a Python environment is looked up using thepyPython launcher on Windows and the environment is not found installed on the system - by @jurko-gospodnetic (#692)Fixed an issue where invocation of tox from the Python package, where invocation errors (failed actions) occur results in a change in the sys.stdout stream encoding in Python 3.x. New behavior is that sys.stdout is reset back to its original encoding after invocation errors - by @tonybaloney (#723)
The reading of command output sometimes failed with
IOError: [Errno 0] Erroron Windows, this was fixed by using a simpler method to update the read buffers. - by @fschulze (#727)(only affected rc releases) fix up tox.cmdline to be callable without args - by @gaborbernat. (#773)
(only affected rc releases) Revert breaking change of tox.cmdline not callable with no args - by @gaborbernat. (#773)
(only affected rc releases) fix #755 by reverting the
cmdlineimport to the old location and changing the entry point instead - by @fschulze (#755)Running
toxwithout asetup.pynow has a more friendly error message and gives troubleshooting suggestions - by @Volcyy. (#331)Fix pycodestyle (formerly pep8) errors E741 (ambiguous variable names, in this case, ‘l’s) and remove ignore of this error in tox.ini - by @cryvate (#663)
Documentation¶
Change favicon to the vector beach ball - by @hazalozturk (#748)
Change sphinx theme to alabaster and add logo/favicon - by @hazalozturk (#639)
3.0.0rc4 (2018-03-23)¶
3.0.0rc3 (2018-03-22)¶
Fixed¶
Revert breaking change of tox.cmdline not callable with no args - by @gaborbernat. (#773)
3.0.0rc2 (2018-03-03)¶
Added¶
Fixed¶
Documentation¶
Change favicon to the vector beach ball - by @hazalozturk (#748)
3.0.0rc1 (2018-01-28)¶
Added¶
Add a
-qoption to progressively silence tox’s output. For each time you specify-qto tox, the output provided by tox reduces. This option allows you to see only your command output without the default verbosity of what tox is doing. This also counter-acts usage of-v. For example, runningtox -v -q ...will provide you with the default verbosity.tox -vv -qis equivalent totox -v. By @sigmavirus24 (#256)add support for negated factor conditions, e.g.
!dev: production_log- by @jurko-gospodnetic (#292)Headings like
installed: <packages>will not be printed if there is no output to display after the :, unless verbosity is set. By @cryvate (#601)Allow spaces in command line options to pip in deps. Where previously only
deps=-rreq.txtanddeps=--requirement=req.txtworked, now alsodeps=-r req.txtanddeps=--requirement req.txtwork - by @cryvate (#668)drop Python
2.6and3.3support:setuptoolsdropped supporting these, and as we depend on it we’ll follow up with doing the same (usetox <= 2.9.1if you still need this support) - by @gaborbernat (#679)Add tox_runenvreport as a possible plugin, allowing the overriding of the default behavior to execute a command to get the installed packages within a virtual environment - by @tonybaloney (#725)
Forward
PROCESSOR_ARCHITECTUREby default on Windows to fixplatform.machine(). (#740)
Changes¶
The
PYTHONDONTWRITEBYTECODEenvironment variable is no longer unset - by @stephenfin. (#744)
Fixed¶
Write directly to stdout buffer if possible to prevent str vs bytes issues - by @asottile (#426)
fix #672 reporting to json file when skip-missing-interpreters option is used by @r2dan (#672)
avoid
Requested Python version (X.Y) not installedstderr output when a Python environment is looked up using thepyPython launcher on Windows and the environment is not found installed on the system - by @jurko-gospodnetic (#692)Fixed an issue where invocation of Tox from the Python package, where invocation errors (failed actions) occur results in a change in the sys.stdout stream encoding in Python 3.x. New behavior is that sys.stdout is reset back to its original encoding after invocation errors - by @tonybaloney (#723)
The reading of command output sometimes failed with
IOError: [Errno 0] Erroron Windows, this was fixed by using a simpler method to update the read buffers. - by @fschulze (#727)Running
toxwithout asetup.pynow has a more friendly error message and gives troubleshooting suggestions - by @Volcyy. (#331)
Documentation¶
Change sphinx theme to alabaster and add logo/favicon - by @hazalozturk (#639)
2.9.1 (2017-09-29)¶
Changes¶
integrated new release process and fixed changelog rendering for pypi.org - by @obestwalter.
2.9.0 (2017-09-29)¶
Added¶
tox --versionnow shows information about all registered plugins - by @obestwalter (#544)
Changes¶
Fixed¶
skip_installoverridesusedevelop(usedevelopis an option to choose the installation type if the package is installed andskip_installdetermines if it should be installed at all) - by @ferdonline (#571)
Documentation¶
add a badge to show build status of documentation on readthedocs.io - by @obestwalter.
add towncrier to allow adding changelog entries with the pull requests without generating merge conflicts; with this release notes are now grouped into four distinct collections:
Features,Bugfixes,Improved DocumentationandDeprecations and Removals. (#614)
2.9.0rc1 (2017-09-14)¶
Added¶
tox --versionnow shows information about all registered plugins - by obestwalter (#544)
Fixed¶
skip_installoverridesusedevelop(usedevelopis an option to choose the installation type if the package is installed andskip_installdetermines if it should be installed at all) - by ferdonline (#571)
Documentation¶
2.8.2 (2017-10-09)¶
Changes¶
#466: stop env var leakage if popen failed with resultjson or redirect
2.8.1 (2017-09-04)¶
Changes¶
pull request 599: fix problems with implementation of #515. Substitutions from other sections were not made anymore if they were not in
envlist. Thanks to Clark Boylan (@cboylan) for helping to get this fixed (pull request 597).
2.8.0 (2017-09-01)¶
Changes¶
#301: Expand nested substitutions in
tox.ini. Thanks @vlaci. Thanks to Eli Collins (@eli-collins) for creating a reproducer.#429: Forward
MSYSTEMby default on Windows. Thanks Marius Gedminas (@mgedmin) for reporting this.#484: Renamed
py.testtopytestthroughout the project. Thanks Slam (@3lnc).#504: With
-a: do not show additional environments header if there are none. Thanks @rndr.#515: Don’t require environment variables in test environments where they are not used. Thanks André Caron (@AndreLouisCaron).
#517: Forward
NUMBER_OF_PROCESSORSby default on Windows to fixmultiprocessor.cpu_count(). Thanks André Caron (@AndreLouisCaron).#518: Forward
USERPROFILEby default on Windows. Thanks André Caron (@AndreLouisCaron).pull request 528: Fix some of the warnings displayed by pytest 3.1.0. Thanks Bruno Oliveira (@nicoddemus).
pull request 547: Add regression test for #137. Thanks Martin Andrysík (@sifuraz).
pull request 553: Add an XFAIL test to reproduce upstream bug #203. Thanks Bartolomé Sánchez Salado (@bartsanchez).
pull request 580: Do not ignore Sphinx warnings anymore. Thanks Bernát Gábor (@gaborbernat).
pull request 588: Run pytest with xfail_strict and adapt affected tests.
Fixed¶
#326: Fix
OSError‘Not a directory’ when creating env on Jython 2.7.0. Thanks Nick Douma (@LordGaav).pull request 556: Report more meaningful errors on why virtualenv creation failed. Thanks @vlaci. Also thanks to Igor Sadchenko (@igor-sadchenko) for pointing out a problem with that PR before it hit the masses ☺
Documentation¶
#276: Remove easy_install from docs (TL;DR: use pip). Thanks Martin Andrysík (@sifuraz).
#315: add
--helpand--versionto helptox-quickstart. Thanks @vlaci.#449: add multi platform example to the docs. Thanks Aleks Bunin (@sashkab) and @rndr.
pull request 575: Add announcement doc to end all announcement docs (using only
CHANGELOGand Github issues since 2.5 already).pull request 585: Expand documentation to explain pass through of flags from deps to pip (e.g.
-rrequirements.txt,-cconstraints.txt). Thanks Alexander Loechel (@loechel).
Packaging¶
#474: Start using setuptools_scm for tag based versioning.
2.8.0rc2 (2017-08-26)¶
2.8.0rc1 (2017-08-13)¶
2.7.0 (2017-04-02)¶
Changes¶
pull request 450: Stop after the first installdeps and first testenv create hooks succeed. This changes the default behavior of
tox_testenv_createandtox_testenv_install_depsto not execute other registered hooks when the first hook returns a result that is notNone. Thanks Anthony Sottile (@asottile).#271 and #464: Improve environment information for users. New command line parameter:
-ashow all defined environments - not just the ones defined in (or generated from) envlist. New verbosity settings for-land-a: show user defined descriptions of the environments. This also works for generated environments from factors by concatenating factor descriptions into a complete description. Note that for backwards compatibility with scripts using the output of-lit’s output remains unchanged. Thanks Bernát Gábor (@gaborbernat).#431: Add ‘LANGUAGE’ to default passed environment variables. Thanks Paweł Adamczak (@pawelad).
#455: Add a Vagrantfile with a customized Arch Linux box for local testing. Thanks Oliver Bestwalter (@obestwalter).
#446: (infrastructure) Travis CI tests for tox now also run on OS X now. Thanks Jason R. Coombs (@jaraco).
Fixed¶
#454: Revert pull request 407, empty commands is not treated as an error. Thanks Anthony Sottile (@asottile).
Packaging¶
2.6.0 (2017-02-04)¶
Added¶
add “alwayscopy” config option to instruct virtualenv to always copy files instead of symlinking. Thanks Igor Duarte Cardoso (@igordcard).
add Python 3.6 to envlist and CI. Thanks Andrii Soldatenko (@andriisoldatenko).
Changes¶
pass setenv variables to setup.py during a usedevelop install. Thanks Eli Collins (@eli-collins).
replace all references to testrun.org with readthedocs ones. Thanks Oliver Bestwalter (@obestwalter).
Fixed¶
2.5.0 (2016-11-16)¶
Added¶
add support for py36 and py37 and add py36-dev and py37(nightly) to travis builds of tox. Thanks John Vandenberg.
add {:} substitution, which is replaced with os-specific path separator, thanks Lukasz Rogalski.
Changes¶
slightly backward incompatible: fix #310: the {posargs} substitution now properly preserves the tox command line positional arguments. Positional arguments with spaces are now properly handled. NOTE: if your tox invocation previously used extra quoting for positional arguments to work around #310, you need to remove the quoting. Example: tox – “‘some string’” # has to now be written simply as tox – “some string” thanks holger krekel. You can set
minversion = 2.5.0in the[tox]section oftox.inito make sure people using your tox.ini use the correct version.make “-h” and “–help-ini” options work even if there is no tox.ini, thanks holger krekel.
output from install command in verbose (-vv) mode is now printed to console instead of being redirected to file, thanks Lukasz Rogalski
Fixed¶
fix #359: add COMSPEC to default passenv on windows. Thanks @anthrotype.
fix #348: add py2 and py3 as default environments pointing to “python2” and “python3” basepython executables. Also fix #347 by updating the list of default envs in the tox basic example. Thanks Tobias McNulty.
fix #305:
downloadcachetest env config is now ignored as pip-8 does caching by default. Thanks holger krekel.fix #399. Make sure {envtmpdir} is created if it doesn’t exist at the start of a testenvironment run. Thanks Manuel Jacob.
fix #316: Lack of commands key in ini file is now treated as an error. Reported virtualenv status is ‘nothing to do’ instead of ‘commands succeeded’, with relevant error message displayed. Thanks Lukasz Rogalski.
2.4.1 (2016-10-12)¶
Fixed¶
fix #380: properly perform substitution again. Thanks Ian Cordasco.
2.4.0 (2016-10-12)¶
Added¶
addresses #66: add –workdir option to override where tox stores its “.tox” directory and all of the virtualenv environment. Thanks Danring.
new list_dependencies_command to influence how tox determines which dependencies are installed in a testenv.
added the “extras” environment option to specify the extras to use when doing the sdist or develop install. Contributed by Alex Grönholm.
Changes¶
remove PYTHONPATH from environment during the install phase because a tox-run should not have hidden dependencies and the test commands will also not see a PYTHONPATH. If this causes unforeseen problems it may be reverted in a bugfix release. Thanks Jason R. Coombs.
(experimental) New feature: When a search for a config file fails, tox tries loading setup.cfg with a section prefix of “tox”.
Fixed¶
fix #375, fix #330: warn against tox-setup.py integration as “setup.py test” should really just test with the current interpreter. Thanks Ronny Pfannschmidt.
fix #302: allow cross-testenv substitution where we substitute with
{x,y}generative syntax. Thanks Andrew Pashkin.fix #212: allow escaping curly brace chars “{” and “}” if you need the chars “{” and “}” to appear in your commands or other ini values. Thanks John Vandenberg.
fix #275: Introduce hooks
tox_runtest_preandtox_runtest_postwhich run before and after the tests of a venv, respectively. Thanks to Matthew Schinckel and itxaka serrano.fix #317: evaluate minversion before tox config is parsed completely. Thanks Sachi King for the PR.
Documentation¶
fix #352: prevent a configuration where envdir==toxinidir and refine docs to warn people about changing “envdir”. Thanks Oliver Bestwalter and holger krekel.
close #66: add documentation to jenkins page on how to avoid “too long shebang” lines when calling pip from tox. Note that we can not use “python -m pip install X” by default because the latter adds the CWD and pip will think X is installed if it is there. “pip install X” does not do that.
Deprecated¶
use pytest-catchlog instead of pytest-capturelog (latter is not maintained, uses deprecated pytest API)
Packaging¶
introduce per-venv list_dependencies_command which defaults to “pip freeze” to obtain the list of installed packages. Thanks Ted Shaw, Holger Krekel.
2.3.2 (2016-02-11)¶
Fixed¶
2.3.1 (2015-12-14)¶
Fixed¶
fix #294: re-allow cross-section substitution for setenv.
2.3.0 (2015-12-09)¶
Added¶
allow “#” in commands. This is slightly incompatible with commands sections that used a comment after a “" line continuation. Thanks David Stanek for the PR.
introduce experimental tox_testenv_create(venv, action) and tox_testenv_install_deps(venv, action) hooks to allow plugins to do additional work on creation or installing deps. These hooks are experimental mainly because of the involved “venv” and session objects whose current public API is not fully guaranteed.
Changes¶
internal: push some optional object creation into tests because tox core doesn’t need it.
Fixed¶
fix #285: make setenv processing fully lazy to fix regressions of tox-2.2.X and so that we can now have testenv attributes like “basepython” depend on environment variables that are set in a setenv section. Thanks Nelfin for some tests and initial work on a PR.
fix #289: fix build_sphinx target, thanks Barry Warsaw.
fix #252: allow environment names with special characters. Thanks Julien Castets for initial PR and patience.
Deprecated¶
DEPRECATE use of “indexservers” in tox.ini. It complicates the internal code and it is recommended to rather use the devpi system for managing indexes for pip.
2.2.1 (2015-12-09)¶
Fixed¶
fix bug where {envdir} substitution could not be used in setenv if that env value is then used in {basepython}. Thanks Florian Bruhin.
2.2.0 (2015-11-11)¶
Fixed¶
fix #265 and add LD_LIBRARY_PATH to passenv on linux by default because otherwise the python interpreter might not start up in certain configurations (redhat software collections). Thanks David Riddle.
fix #246: fix regression in config parsing by reordering such that {envbindir} can be used again in tox.ini. Thanks Olli Walsh.
fix #99: the {env:…} substitution now properly uses environment settings from the
setenvsection. Thanks Itxaka Serrano.fix #281: make –force-dep work when urls are present in dependency configs. Thanks Glyph Lefkowitz for reporting.
fix #174: add new
ignore_outcometestenv attribute which can be set to True in which case it will produce a warning instead of an error on a failed testenv command outcome. Thanks Rebecka Gulliksson for the PR.
Packaging¶
fix #280: properly skip missing interpreter if {envsitepackagesdir} is present in commands. Thanks BB:ceridwenv
2.1.1 (2015-06-23)¶
Changes¶
report skipped platforms as skips in the summary
Fixed¶
fix platform skipping for detox
2.1.0 (2015-06-19)¶
Added¶
allow envlist to be a multi-line list, to intersperse comments and have long envlist settings split more naturally. Thanks Andre Caron.
introduce a TOX_TESTENV_PASSENV setting which is honored when constructing the set of environment variables for test environments. Thanks Marc Abramowitz for pushing in this direction.
Changes¶
remove experimental –set-home option which was hardly used and hackily implemented (if people want home-directory isolation we should figure out a better way to do it, possibly through a plugin)
Fixed¶
2.0.2 (2015-06-03)¶
Added¶
add SYSTEMDRIVE into default passenv on windows to allow pip6 to work. Thanks Michael Krause.
Fixed¶
fix #247: tox now passes the LANG variable from the tox invocation environment to the test environment by default.
2.0.1 (2015-05-13)¶
Packaging¶
fix wheel packaging to properly require argparse on py26.
2.0.0 (2015-05-12)¶
Added¶
introduce experimental (not much documented yet) plugin system based on pytest’s externalized “pluggy” system. See tox/hookspecs.py for the current hooks.
introduce parser.add_testenv_attribute() to register an ini-variable for testenv sections. Can be used from plugins through the tox_add_option hook.
Changes¶
(new) introduce environment variable isolation: tox now only passes the PATH and PIP_INDEX_URL variable from the tox invocation environment to the test environment and on Windows also
SYSTEMROOT,PATHEXT,TEMPandTMPwhereas on unix additionallyTMPDIRis passed. If you need to pass through further environment variables you can use the newpassenvsetting, a space-separated list of environment variable names. Each name can make use of fnmatch-style glob patterns. All environment variables which exist in the tox-invocation environment will be copied to the test environment.a new
--help-inioption shows all possible testenv settings and their defaults.(new) introduce a way to specify on which platform a testenvironment is to execute: the new per-venv “platform” setting allows one to specify a regular expression which is matched against sys.platform. If platform is set and doesn’t match the platform spec in the test environment the test environment is ignored, no setup or tests are attempted.
show and store in json the version dependency information for each venv
tox has now somewhat pep8 clean code, thanks to Volodymyr Vitvitski.
rename internal files – tox offers no external API except for the experimental plugin hooks, use tox internals at your own risk.
Fixed¶
(new) add per-venv “ignore_errors” setting, which defaults to False. If
True, a non-zero exit code from one command will be ignored and further commands will be executed (which was the default behavior in tox < 2.0). IfFalse(the default), then a non-zero exit code from one command will abort execution of commands for that environment.fix #120: allow substitution for the commands section. Thanks Volodymyr Vitvitski.
fix #235: fix AttributeError with –installpkg. Thanks Volodymyr Vitvitski.
fix #240: allow one to specify empty argument list without it being rewritten to “.”. Thanks Daniel Hahler.
Deprecated¶
remove the long-deprecated “distribute” option as it has no effect these days.
DEPRECATE distshare in documentation
Packaging¶
fix #233: avoid hanging with tox-setuptools integration example. Thanks simonb.
1.9.2 (2015-03-23)¶
Changes¶
1.9.1 (2015-03-23)¶
Added¶
allow –force-dep to override dependencies in “-r” requirements files. Thanks Sontek for the PR.
Changes¶
use a file instead of a pipe for command output in “–result-json”. Fixes some termination issues with python2.6.
Fixed¶
fix #227: use “-m virtualenv” instead of “-mvirtualenv” to make it work with pyrun. Thanks Marc-Andre Lemburg.
1.9.0 (2015-02-24)¶
Changes¶
refine determination if we run from Jenkins, thanks Borge Lanes.
echo output to stdout when
--report-jsonis used
Fixed¶
fix #193: Remove
--prefrom the defaultinstall_command; by default tox will now only install final releases from PyPI for unpinned dependencies. Usepip_pre = truein a testenv or the--precommand-line option to restore the previous behavior.fix #199: fill resultlog structure ahead of virtualenv creation
fix #124: ignore command exit codes; when a command has a “-” prefix, tox will ignore the exit code of that command
fix #198: fix broken envlist settings, e.g. {py26,py27}{-lint,}
fix #191: lessen factor-use checks
Packaging¶
fix #11: add a
skip_installper-testenv setting which prevents the installation of a package. Thanks Julian Krause.
1.8.1 (2014-10-24)¶
Added¶
allow escaping curly braces with “". Thanks Marc Abramowitz for the PR.
allow “.” names in environment names such that “py27-django1.7” is a valid environment name. Thanks Alex Gaynor and Alex Schepanovski.
Changes¶
report subprocess exit code when execution fails. Thanks Marius Gedminas.
Fixed¶
fix #190: allow setenv to be empty.
1.8.0 (2014-09-24)¶
Changes¶
better report if we can’t get version_info from an interpreter executable. Thanks Floris Bruynooghe.
Fixed¶
Documentation¶
new multi-dimensional configuration support. Many thanks to Alexander Schepanovski for the complete PR with docs. And to Mike Bayer and others for testing and feedback.
1.7.2 (2014-07-15)¶
Added¶
support optional env variable substitution, thanks Morgan Fainberg for PR86.
Fixed¶
fix #150: parse {posargs} more like we used to do it pre 1.7.0. The 1.7.0 behavior broke a lot of OpenStack projects. See PR85 and the issue discussions for (far) more details, hopefully resulting in a more refined behavior in the 1.8 series. And thanks to Clark Boylan for the PR.
fix #59: add a config variable
skip-missing-interpretersas well as command line option--skip-missing-interpreterswhich won’t fail the build if Python interpreters listed in tox.ini are missing. Thanks Alexandre Conrad for PR104.fix #164: better traceback info in case of failing test commands. Thanks Marc Abramowitz for PR92.
limit python hashseed to 1024 on Windows to prevent possible memory errors. Thanks March Schlaich for the PR90.
1.7.1 (2014-03-28)¶
Fixed¶
1.7.0 (2014-01-29)¶
Added¶
introduce –no-network to tox’s own test suite to skip tests requiring networks
Changes¶
don’t lookup “pip-script” anymore but rather just “pip” on windows as this is a pip implementation detail and changed with pip-1.5. It might mean that tox-1.7 is not able to install a different pip version into a virtualenv anymore.
merged PR125: tox now sets “PYTHONHASHSEED” to a random value and offers a “–hashseed” option to repeat a test run with a specific seed. You can also use –hashsheed=noset to instruct tox to leave the value alone. Thanks Chris Jerdonek for all the work behind this.
rework and simplify “commands” parsing and in particular posargs substitutions to avoid various win32/posix related quoting issues.
make sure that the –installpkg option trumps any usedevelop settings in tox.ini or
Fixed¶
fix #132: removing zip_safe setting (so it defaults to false) to allow installation of tox via easy_install/eggs. Thanks Jenisys.
fix #126: depend on virtualenv>=1.11.2 so that we can rely (hopefully) on a pip version which supports –pre. (tox by default uses to –pre). also merged in PR84 so that we now call “virtualenv” directly instead of looking up interpreters. Thanks Ionel Maries Cristian. This also fixes #140.
fix #129: tox now uses Popen(…, universal_newlines=True) to force creation of unicode stdout/stderr streams. fixes a problem on specific platform configs when creating virtualenvs with Python3.3. Thanks Jorgen Schäfer or investigation and solution sketch.
fix #128: enable full substitution in install_command, thanks for the PR to Ronald Evers
fix #105 – don’t depend on an existing HOME directory from tox tests.
Packaging¶
drop Python2.5 compatibility because it became too hard due to the setuptools-2.0 dropping support. tox now has no support for creating python2.5 based environments anymore and all internal special-handling has been removed.
merged PR81: new option –force-dep which allows one to override tox.ini specified dependencies in setuptools-style. For example “–force-dep ‘django<1.6’” will make sure that any environment using “django” as a dependency will get the latest 1.5 release. Thanks Bruno Oliveria for the complete PR.
fix #130: you can now set install_command=easy_install {opts} {packages} and expect it to work for repeated tox runs (previously it only worked when always recreating). Thanks jenisys for precise reporting.
introduce –sitepackages to force sitepackages=True in all environments.
1.6.1 (2013-09-04)¶
Fixed¶
fix #116: make 1.6 introduced behavior of changing to a per-env HOME directory during install activities dependent on “–set-home” for now. Should re-establish the old behavior when no option is given.
fix #118: correctly have two tests use realpath(). Thanks Barry Warsaw.
fix test runs on environments without a home directory (in this case we use toxinidir as the homedir)
fix #102: change to {toxinidir} when installing dependencies. This allows one to use relative path like in “-rrequirements.txt”.
Security¶
fix #117: python2.5 fix: don’t use
--insecureoption because its very existence depends on presence of “ssl”. If you want to support python2.5/pip1.3.1 based test environments you need to install ssl and/or use PIP_INSECURE=1 throughsetenv. section.
Packaging¶
fix #119: {envsitepackagesdir} is now correctly computed and has a better test to prevent regression.
1.6.0 (2013-08-15)¶
Added¶
add –result-json option to write out detailed per-venv information into a json report file to be used by upstream tools.
Changes¶
remove toxbootstrap.py for now because it is broken.
if a HOMEDIR cannot be determined, use the toxinidir.
refactor interpreter information detection to live in new tox/interpreters.py file, tests in tests/test_interpreters.py.
Fixed¶
fix #91: python2.5 support by vendoring the virtualenv-1.9.1 script and forcing pip<1.4. Also the default [py25] environment modifies the default installer_command (new config option) to use pip without the “–pre” option which was introduced with pip-1.4 and is now required if you want to install non-stable releases. (tox defaults to install with “–pre” everywhere).
fix #1: empty setup files are properly detected, thanks Anthon van der Neuth
fix #109 and fix #111: multiple “-e” options are now combined (previously the last one would win). Thanks Anthon van der Neut.
Documentation¶
fix #35: add new EXPERIMENTAL “install_command” testenv-option to configure the installation command with options for dep/pkg install. Thanks Carl Meyer for the PR and docs.
Packaging¶
during installation of dependencies HOME is now set to a pseudo location ({envtmpdir}/pseudo-home). If an index url was specified a .pydistutils.cfg file will be written with an index_url setting so that packages defining
setup_requiresdependencies will not silently use your HOME-directory settings or PyPI.add new config options
usedevelopandskipsdistas well as a command line option--developto install the package-under-test in develop mode. thanks Monty Tailor for the PR.always unset PYTHONDONTWRITEBYTE because newer setuptools doesn’t like it
1.5.0 (2013-06-22)¶
Changes¶
make sure test commands are searched first in the virtualenv
re-fix #2 - add whitelist_externals to be used in
[testenv*]sections, allowing to avoid warnings for commands such asmake, used from the commands value.show (test) command that is being executed, thanks Lukasz Balcerzak
re-license tox to MIT license
depend on virtualenv-1.9.1
Fixed¶
fix #97 - allow substitutions to reference from other sections (thanks Krisztian Fekete)
Documentation¶
rename README.txt to README.rst to make bitbucket happier
Packaging¶
1.4.3 (2013-02-28)¶
Added¶
introduce -l|–listenv option to list configured environments (thanks Lukasz Balcerzak)
Changes¶
use pip-script.py instead of pip.exe on win32 to avoid the lock exe file on execution issue (thanks Philip Thiem)
issue #70 remove PYTHONDONTWRITEBYTECODE workaround now that virtualenv behaves properly (thanks g2p)
look for “tox.ini” files in parent dirs of current dir (closes #34)
the “py” environment now by default uses the current interpreter (sys.executable) make tox’ own setup.py test execute tests with it (closes #46)
change tests to not rely on os.path.expanduser (closes #60), also make mock session return args[1:] for more precise checking (closes #61) thanks to Barry Warsaw for both.
Fixed¶
fix #84 - pypy on windows creates a bin not a scripts venv directory (thanks Lukasz Balcerzak)
fix #48 - win32 detection of pypy and other interpreters that are on PATH (thanks Gustavo Picon)
fix grouping of index servers, it is now done by name instead of indexserver url, allowing to use it to separate dependencies into groups even if using the same default indexserver.
Documentation¶
fix downloadcache determination to work according to docs: Only make pip use a download cache if PIP_DOWNLOAD_CACHE or a downloadcache=PATH testenv setting is present. (The ENV setting takes precedence)
merged tox-quickstart command, contributed by Marc Abramowitz, which generates a default tox.ini after asking a few questions
Packaging¶
experimentally introduce –installpkg=PATH option to install a package rather than create/install an sdist package. This will still require and use tox.ini and tests from the current working dir (and not from the remote package).
substitute {envsitepackagesdir} with the package installation directory (closes #72) (thanks g2p)
1.4.2 (2012-07-20)¶
Changes¶
“python setup.py test” now runs tox tests via tox :) also added an example on how to do it for your project.
Fixed¶
fix some tests which fail if /tmp is a symlink to some other place
1.4.1 (2012-07-03)¶
Fixed¶
fix #41 better quoting on windows - you can now use “<” and “>” in deps specifications, thanks Chris Withers for reporting
1.4 (2012-06-13)¶
Added¶
support value substitution from other sections with the {[section]key} syntax
add python3.3 to the default env list, so early adopters can test
Changes¶
tweak and improve reporting
refactor reporting and virtualenv manipulation to be more accessible from 3rd party tools
drop python2.4 support (you can still have your tests run on
make the install step honor a testenv’s setenv setting (thanks Ralf Schmitt) v1.2 2011-11-10
remove the virtualenv.py that was distributed with tox and depend on >=virtualenv-1.6.4 (possible now since the latter fixes a few bugs that the inlining tried to work around)
Fixed¶
fix #26 - no warnings on absolute or relative specified paths for commands
fix #33 - commentchars are ignored in key-value settings allowing for specifying commands like: python -c “import sys ; print sys” which would formerly raise irritating errors because the “;” was considered a comment
fix #29 - correctly point to pytest explanation for importing modules fully qualified
fix: allow one to specify wildcard filesystem paths when specifying dependencies such that tox searches for the highest version
fix #10: work around UnicodeDecodeError when invoking pip (thanks Marc Abramowitz)
fix a problem with parsing {posargs} in tox commands (spotted by goodwill)
fix the warning check for commands to be installed in testenvironment (thanks Michael Foord for reporting)
Documentation¶
fix the links/checkout howtos in the docs python-2.4, just tox itself requires 2.5 or higher. v1.3 2011-12-21
Packaging¶
1.3 (2011-12-21)¶
Changes¶
make the install step honor a testenv’s setenv setting (thanks Ralf Schmitt)
Fixed¶
fix: allow to specify wildcard filesystem paths when specifying dependencies such that tox searches for the highest version
Packaging¶
fix issue issue21: clear PIP_REQUIRES_VIRTUALENV which avoids pip installing to the wrong environment, thanks to bb’s streeter
1.2 (2011-11-10)¶
Changes¶
remove the virtualenv.py that was distributed with tox and depend on >=virtualenv-1.6.4 (possible now since the latter fixes a few bugs that the inling tried to work around)
Fixed¶
fix issue10: work around UnicodeDecodeError when inokving pip (thanks Marc Abramowitz)
fix a problem with parsing {posargs} in tox commands (spotted by goodwill)
fix the warning check for commands to be installed in testevironment (thanks Michael Foord for reporting)
1.1 (2011-07-08)¶
Changes¶
inline virtualenv.py (1.6.1) script to avoid a number of issues, particularly failing to install python3 environments from a python2 virtualenv installation.
Fixed¶
Documentation¶
rework and enhance docs for display on readthedocs.org
Packaging¶
fixed/enhanced: except for initial install always call “-U –no-deps” for installing the sdist package to ensure that a package gets upgraded even if its version number did not change. (reported on TIP mailing list and IRC)
1.0 (2011-05-28)¶
Added¶
added a CONTRIBUTORS file
Changes¶
move repository and toxbootstrap links to https://bitbucket.org/hpk42/tox
toxbootstrap.py (used by jenkins build agents) now follows the latest release of virtualenv
change the positional argument specifier to use {posargs:} syntax and fix issues #15 and #10 by refining the argument parsing method (Chris Rose)
remove use of inipkg lazy importing logic - the namespace/imports are anyway very small with tox.
show path of the underlying virtualenv invocation and bootstrap virtualenv.py into a working subdir
Fixed¶
fix #7: introduce a “minversion” directive such that tox bails out if it does not have the correct version.
fix #24: introduce a way to set environment variables for for test commands (thanks Chris Rose)
fix #22: require virtualenv-1.6.1, obsoleting virtualenv5 (thanks Jannis Leidel) and making things work with pypy-1.5 and python3 more seamlessly
fix #20: document format of URLs for specifying dependencies
fix #19: substitute Hudson for Jenkins everywhere following the renaming of the project. NOTE: if you used the special [tox:hudson] section it will now need to be named [tox:jenkins].
fix issue 23 / apply some ReST fixes
fix a fspath related assertion to work with debian installs which uses symlinks
0.9 (2010-11-25)¶
Added¶
added support for working with different and multiple PyPI indexservers.
new option: -r|–recreate to force recreation of virtualenv
Changes¶
#1: Add a toxbootstrap.py script for tox, thanks to Sridhar Ratnakumar
depend on py>=1.4.0 which does not contain or install the py.test anymore which is now a separate distribution “pytest”.
Fixed¶
fix pip-installation mixups by always unsetting PIP_RESPECT_VIRTUALENV (thanks Armin Ronacher)
show logfile content if there is an error (makes CI output more readable)
0.8 (2010-07-30)¶
Changes¶
run pip/easy installs from the environment log directory, avoids naming clashes between env names and dependencies (thanks ronny)
require a more recent version of py lib
refactor and refine config detection to work from a single file and to detect the case where a python installation overwrote an old one and resulted in a new executable. This invalidates the existing virtualenvironment now.
change all internal source to strip trailing whitespaces
Fixed¶
work around a virtualenv limitation which crashes if PYTHONDONTWRITEBYTECODE is set.
0.6 (2010-07-12)¶
Fixed¶
fix OSX related bugs that could cause the caller’s environment to get screwed (sorry). tox was using the same file as virtualenv for tracking the Python executable dependency and there also was confusion wrt links. this should be fixed now.
fix long description, thanks Michael Foord
0.5 (2010-07-12)¶
Changes¶
initial release