Changelog

Unreleased (2026-10-31)

4.67.5 (2026-10-31)

Fixed

  • A packaging environment whose base_python (or default_base_python) is not installed no longer crashes with KeyError: 'skip_missing_interpreters'. It now fails with the missing interpreter, or skips the run environment when skip_missing_interpreters is 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 from dev (#4216) by @ericdelorefice and @gaborbernat.

  • A pylock.toml or 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 with failed to read config file (#4217) by @pcbeingused333.

  • With args_are_paths enabled, a positional argument naming an existing file whose rewritten path relative to change_dir starts with - (for example tests/--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 replace table with a nonempty marker now raises an error instead of adding its internal value and marker keys to deps or requires. Markers on set_env values remain supported (#4320) by @rahuldevikar and @gaborbernat. (#4220)

  • A TOML type mismatch no longer includes an expanded string or container value. A malformed commands setting with {env:...} reports its type instead of the substituted text (#4327) by @rahuldevikar and @gaborbernat. (#4221)

  • Keep artifacts supplied with --installpkg out of tox’s provisioning environment while installing them in the requested test environments (#4304) by @Pratham2511 and @gaborbernat. (#4222)

  • A file: URI passed to --installpkg is now percent-decoded once instead of twice, so a path containing a literal % sequence, such as a directory named feature%2Flogin, selects the package the user named (#4300) by @pcbeingused333 and @gaborbernat. (#4223)

  • A relative TOX_INSTALL_PKG or user configuration install_pkg path is now resolved against the invocation directory, as --installpkg already 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_dir because 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} with TOXPYTHON empty) now fails during configuration with base_python for env <name> is empty. Blank entries in a base_python list 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} with SCRATCH_DIR unset, 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 --installpkg now produce errors that name the artifact instead of internal error tracebacks (#4287) by @santhiprakash and @gaborbernat. (#4230)

  • Reject NUL characters in set_env file 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 dependencies as 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-legacy install path from the packaging environment’s package_root instead of the core one, so a package_root set in [testenv:.pkg] no longer pairs the built package with the dependencies declared next to tox.ini (#4321) by @rahuldevikar and @gaborbernat. (#4234)

  • A package environment path that is already a symlink no longer causes tox list to create file.lock under the link target (#4311) by @rahuldevikar and @gaborbernat. (#4235)

  • tox now expands ${VAR} in requirements and constraints files using the environment running pip, including pass_env and set_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 to pass_env or define it with set_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 -h no longer prints secret-looking --key=value values from TOX_OVERRIDE. Conversion warnings also mask those values in invalid TOX_ options (#4303) by @faresrafat3 and @gaborbernat. (#4238)

  • A tox.toml or pyproject.toml string 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 in tox.ini, instead of being read as a {key:default} reference. Positional arguments such as set_env:x passed 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.json contains 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_file rejects 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_file now accepts only a Python version specifier (such as 3.13 or pypy3.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 TOML replace = "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)

  • pylock now evaluates Python and platform markers using a complete environment from the target interpreter. Previously, missing values such as implementation_version came 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’s direct_url.json records the requested source, including a supported archive hash, subdirectory, or VCS revision. pip discards fragment fields such as egg; 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 tarfile data 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_env file line, since its content may contain a secret (#4298) by @r3wretrhy and @gaborbernat. (#4250)

  • Keep input bytes out of tox config INI, 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.json no 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 without venv’s clear option. 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_env into 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_spec bootstrap 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_general uses an absolute missing-interpreter path to avoid Windows registry probes in CI (#4346) by @gaborbernat. (#4344)

  • A set_env line 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_env keeps {env:...} values intact when the source environment inherits the setting, uses setenv or comes from a generative section. The TOML string form "{[env.name]set_env}" does the same. Line breaks, ; and file| text inside values no longer become set_env syntax (#4268) by @gaborbernat.

  • An invalid pylock.toml, including malformed TOML or non-UTF-8 bytes, now reports invalid pylock file with the filename and the parser or decoder error instead of an internal traceback (#4215) by @PRINCE2-AI, Prince and @gaborbernat.

  • Help with an invalid -c configuration 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 -x or TOX_OVERRIDE follow the same rule (#4290) by @gaborbernat.

  • INI commands that reference deps now preserve each pip option operand as one argument. A substituted --find-links path containing spaces can no longer add options to the command. The tox config display 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 of TITLE holds 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_command and list_dependencies_command get the same handling (#4283) by @gaborbernat.

  • Mask credentials in requires direct 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 ExecuteRequest representations (#4264) by @gaborbernat.

  • On POSIX, tox now pins each directory on the path to the project root while reading or changing a .venv redirect. 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 PATH entries from the command’s working directory. The allowlist_externals check and TOX_LIMITED_SHEBANG interpreter 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 config displays 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 .venv redirect. A concurrent directory rename or junction added to an empty project directory cannot redirect a write or removal into another project. Redirect writes replace .venv with a temporary file, leaving the target of a swapped .venv symlink or hard link unchanged (#4335) by @gaborbernat.

  • On Windows, tox quotes arguments passed to .bat and .cmd commands for cmd.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 %1 may now see surrounding quotes for arguments that need them (#4288) by @gaborbernat.

  • Pass each base_python entry to virtualenv as a separate --python argument. virtualenv split the old VIRTUALENV_PYTHON value on commas and os.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, so change_dir, env_dir and set_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-capture or setting up an environment with tox 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 deps or constraints entry, 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 -x or TOX_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/--conf path from the typed line when loading toxfile.py and 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 tox re-exec, Python no longer puts the start directory first on sys.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/--conf or --root before 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 exec or commands = {posargs}, tox now leaves a bare program name such as python unchanged. 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 ./python still follows args_are_paths (#4289) by @gaborbernat.

  • With TOX_LIMITED_SHEBANG enabled, 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_paths on POSIX, tox now rewrites positional paths from the resolved change_dir. A linked .tox can no longer redirect a positional path to a file beside the link target (#4273) by @gaborbernat.

  • pylock and dependency_groups now use package_root when a run has no package environment. They previously used tox_root in 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 outside work_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_dir and package_glob values against tox_root. With tox -c path/to/tox.ini started 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 and TOX_FACTOR_<label> overrides literally in INI configuration: a {...} or [] in them is no longer substituted again, so tox run -- '{env:SECRET}' hands the command {env:SECRET} instead of the variable’s value and tox run -- '{posargs} -x' stays one argument. The DEFAULTS of {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 deps or constraints substitutions, 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_spec as a virtualenv requirement with optional version specifiers before invoking pip (#4261) by @gaborbernat.

  • Where descriptor-based rmtree and O_DIRECTORY/O_NOFOLLOW are 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_env environment 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_list such as py3{16-} used to fail with ValueError: 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 its pattern and default, matching the INI {glob:PATTERN:DEFAULT} form, so pattern = "{env_name}/*.whl" matches files instead of a literal {env_name} directory (#4180) by @ag3ntsc4rn and @gaborbernat. (#4178)

  • --force-dep now matches dependency names after PEP 503 normalization, so --force-dep typing-extensions==4.9.0 replaces Typing_Extensions==4.12.2 in deps instead of passing both pins to pip, and replaces a Typing_Extensions requirement 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 in set_env whose default ends 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-index in a requirements file or deps now wins over --index-url and --extra-index-url on 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.toml no longer breaks dependency_groups or reading the package’s static dependencies from [project], and one in a base_python_file such as .python-version is no longer read as part of the Python version (#4188) by @pcbeingused333 and @gaborbernat.

  • --parallel auto now counts the CPUs tox may run on instead of every CPU in the machine, so it respects the CPU affinity mask set by taskset or a container’s cpuset (and PYTHON_CPU_COUNT on 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-json is 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 \uXXXX escapes (#4194) by @mehdimirzafaruk and @gaborbernat.

  • Glob character sets such as lint-[ab] and lint-[!a] in an ini depends now load, as the depends reference 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-parallel does (#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 PYTHONHASHSEED no longer makes every tox command fail with ValueError. 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.toml with no dependency_groups selected now uses the lock file’s default-groups, as PEP 751 specifies. Previously packages marked 'default' in dependency_groups (as written by pdm export -f pylock) were skipped - by @pcbeingused333. (#4173)

  • A positional {factor:N} label in an env_base now resolves against that table’s own factors, so with several env_base tables or an env_list product it 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, so tox --no-capture no longer hangs at started backend while waiting for the backend’s reply. (#4163)

  • A leading UTF-8 byte order mark in tox.ini, setup.cfg, tox.toml or a TOML pyproject.toml no 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, so tox --no-provision list lists the environments instead of writing a file named list. (#4168)

Documentation

  • Link overridden argparse methods and logging.Handler.name in the plugin API reference. (#4170)

4.66.0 (2026-10-16)

Added

Fixed

  • Remember a failed interpreter lookup for a virtualenv environment instead of repeating the full PATH scan for every setting that needs it, so tox config and tox run on configurations listing interpreters that are not installed are faster. (#4162)

4.65.6 (2026-10-15)

Fixed

  • Preserve literal single and double quotes in Windows command arguments. (#4159)

  • Keep quotes in positional arguments on Windows, so tox -- "'x'" passes 'x' to the command as on Linux (#4160)

4.65.5 (2026-10-14)

Fixed

  • Keep braces that are not a substitution in TOML configurations, as INI does, so {} in find -exec or a dict literal in python -c reaches the command intact (#4150)

4.65.4 (2026-10-12)

Documentation

  • Clarify how TOX_ environment variables set CLI option defaults and how TOX_OVERRIDE changes configuration values. (#4146)

4.65.3 (2026-10-11)

Fixed

  • Allow --skip-env with -e, -m, and -f so it filters the selected environments (#4143)

4.65.2 (2026-10-10)

Fixed

  • A dependency_groups run whose package root has no pyproject.toml now 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 tmp or 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

  • Use Python 3.15 for development and automation. (#4139)

  • Include the plugin documentation in source distributions so downstream packagers can run the plugin example tests. (#4140)

4.65.0 (2026-10-09)

Added

  • Bump the default maximum CPython minor version to 3.15 in generative environment lists. (#4136)

Fixed

  • --result-json and tox config -o create the missing parent directory of the output file instead of crashing - by @SulimanAbdulrazzaq. (#4126)

  • A set_env env 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 = [] clears env_log_dir at the start of the run instead of keeping logs from the previous run - by @glaziermag. (#4130)

Documentation

  • Drop @impl from the tox_append_version_info plugin 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 -x overrides and values set by plugins - by @hfycium. (#4118)

  • A command prefixed with ! that exits with 0 now fails the environment with exit code 1; 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 -x or TOX_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 with extend = 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-binary and --only-binary across the lines of deps and of requirements files the way pip does, where the last line used to replace the earlier ones. With --only-binary :all: and a --no-binary exception, tox passes --only-binary to pip first, so pip keeps the exception. tox config shows the merged values tox passes to pip - by @SulimanAbdulrazzaq. (#4110)

  • tox config shows deps with every global option merged the way tox passes it to pip, a later -i replacing an earlier one and repeated flags shown once, and reports the error tox run would raise for invalid deps. constraints shows the configured files instead of the path of tox.ini, and a comment line in constraints no longer fails the run. deps that give pip nothing to install no longer conflict with pylock. set_env includes PIP_USER, TOX_ENV_DIR, TOX_ENV_NAME, TOX_WORK_DIR and VIRTUAL_ENV, the values tox sets for commands - by @gaborbernat. (#4111)

  • A TOML ref to another environment’s deps, constraints or commands works in tox config and tox run. It used to fail with 'PythonDeps' object is not iterable or Command(args=[...]) is not list - by @gaborbernat. (#4112)

  • In INI commands, commands_pre and commands_post, a reference such as pip 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 changes echo {[testenv:x]commands}, which now runs one echo with 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

4.64.7 (2026-10-01)

Fixed

  • tox man suggests ~/.profile instead of ~/.zshrc when the shell is not fish, bash, zsh, csh or tcsh, for example sh, ksh or an unset SHELL - by @Rodrigo-Palma.

    • tox picks the shell from the executable name, so /home/zshuser/bin/bash gets ~/.bashrc.

    • Outside fish, csh and tcsh, the reload hint reads . <file> instead of source <file>, since dash has no source.

    • The fish line keeps the default man path when MANPATH was unset, instead of hiding every other man page.

    • csh and tcsh get a setenv line for ~/.tcshrc or ~/.cshrc instead of an export line for ~/.profile. (#4109)

4.64.6 (2026-10-01)

Fixed

  • tox -e and TOXENV accept every interpreter name that picks a base_python for an environment the configuration does not declare - by @breken-ai.

    • cpython313, cpython-3.13, graalpy311, jython2.7, rustpython3 and ironpython3 select that interpreter instead of failing with “provided environments not found”.

    • The d debug-build suffix works too, for example py313d.

    • cython313 now fails as an unknown environment; it used to run on the Python that tox runs under. (#4106)

  • A set_env block 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_env values 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_env wins 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 config shows the keys of every pulled-in section that tox run sets.

    • A section that pulls itself in, a TOML ref to 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

  • An invalid platform regular expression now fails the environment with a one-line error instead of a traceback, also for the provisioning environment - by @00200200. (#4103)

4.64.4 (2026-09-27)

Fixed

  • Pass --pre once, before the packages, in the default install_command with pip_pre set to true. (#4097)

  • Fix list conversion for command line defaults from environment variables and user configuration files. For example, TOX_LABELS=old;new selects environments labeled old or new, and TOX_LIST_KEYS_ONLY=env_name;deps selects 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_env written as a list of tables in TOML now keeps every file entry and honors the order of the entries, so merging one environment’s set_env into 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 file entry wins over the value the file provides, matching the file| 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_dir directory 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 with FileExistsError after another environment ran (#4090) - by @gaborbernat.

    • With venv_redirect unset, the new default, tox writes the redirect file unless a tox environment lives at .venv; with true, 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 .venv redirect 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 devenv points 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/--override and TOX_OVERRIDE values that target a section the configuration file does not define, such as tox.skip_missing_interpreters on a tox.ini without a [tox] section, instead of dropping them - by @gaborbernat. (#4089)

4.64.0 (2026-09-24)

Added

  • Point a PEP 832 .venv redirect 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 .venv directory 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_redirect to false to 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.FinishedExecuteStatus to 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.toml under a name that is not normalized, such as Foo_Bar, are now installed when requested as extras = foo-bar while tox installs a package’s dependencies - by @gaborbernat. (#4080)

4.62.1 (2026-09-19)

Fixed

  • Clear obsolete markers when unconditional set_env values 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 returns None when 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_env list in TOML no longer fails to load; like an empty table, it clears inherited variables - by @yuefdev. (#4065)

  • A TOML factor range now rejects true or false as start or stop instead of reading them as 1 and 0 - by @yuefdev. (#4066)

  • Preserve an explicitly empty {factor:label:} fallback instead of using the declared factor group default. (#4072)

Documentation

  • Loader.build documented a future parameter it no longer takes and left factory undocumented, so the plugin API reference listed a parameter that does not exist - by @hxperl. (#4070)

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 when TOX_LIMITED_SHEBANG rewrites the invocation - by @r3wretrhy. (#4064)

4.61.3 (2026-09-08)

Fixed

  • A set_env environment 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-2 keeps its name rather than becoming py313-django4, 3 and 2 - 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_commands runs commands_post after an interrupt, and config_file_path, host_python, home and tox_root_name are 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 default for {factor:label} to fall back on when no factor of that group is active in the environment name. Setting TOX_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/-x or TOX_OVERRIDE now 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.ini or setup.cfg as a handled error during config discovery instead of raising an unhandled configparser.Error traceback - by @VXNCXNX (#4027)

  • Report an invalid value in the ini [tox] core section (such as min_version, requires or env_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_ENV regular expression as a handled error instead of raising an unhandled re.error traceback - by @VXNCXNX (#4029)

  • Keep ; inside values read from a set_env environment file (file|.env). Environment file lines are plain KEY=VALUE pairs and were incorrectly parsed with the PEP-508 marker splitter, which truncated values such as DATABASE_URL=postgresql://host/db?opt=1;sslmode=require at 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_command or list_dependencies_command in 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 --strict and pyrefly next to ty - by @gaborjbernat.

    • ConfigSet.get returns a configuration value after checking it against its declared type, so plugins can drop cast around conf["key"] reads.

    • The tox_on_install hook and Installer type their arguments as InstallArguments; installer subclasses may narrow it through the new second type parameter.

    • Parsed declares the CLI option surface, so options.<name> reads type-check.

    • ConfigSet.add_config accepts default=None for optional values and infers the value type from callable defaults.

    • The journal, the environment cache, and execute metadata hold JsonValue content; structured set_env entries match the SetEnvEntry shape. (#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.ini via tox 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 c and tox l work when pyproject.toml cannot 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 depends reports the cycle as an error instead of a raw traceback;

    • Skip raised by a plugin for a package environment marks the run environment package-skipped instead of crashing with UnboundLocalError. (#3991)

  • Fix two packaging regressions:

    • package = editable on a build backend without PEP-660 support now falls back to editable-legacy with a warning instead of crashing, also when the project metadata is static;

    • editable and wheel environments running after an sdist-wheel environment 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 by package_env inherits from pkgenv/env_pkg_base as documented, instead of silently keeping run environment defaults;

    • one listed in env_list while referenced as a package environment is reported as a configuration conflict up front, instead of failing late with cannot run packaging environment or silently disappearing from tox l. (#3993)

  • pylock.toml installs 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_URL reinstalls, as it already did for deps. (#3994)

  • Re-running tox no longer rebuilds an environment at random when deps uses --no-binary or --only-binary with 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-python and dependencies were 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 FILE writes the default (ini) format to the file like the json and toml formats, without color codes;

    • tox devenv -e ALL reports that exactly one environment is required instead of crashing;

    • --no-provision FILE records the pinned version for a tox==X requirement instead of an empty string. (#3998)

  • Restore the documented fail-fast contract and make cleanup resilient:

    • --fail-fast in 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 in pyproject.toml no longer hides a tox.toml next 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": true so they are distinguishable from passes. (#4000)

4.57.1 (2026-07-20)

Fixed

  • Stop a lone quote in a set_env value (e.g. an apostrophe in can'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 0 turn parallelism off and run sequentially, as the -p help (“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. The py313d and py313td factors select a debug build, a base_python pointing at one matches those factors and conflicts with factors that lack the suffix, and a debug build gets its own d-tagged wheel build environment - by @chuenchen309. (#3986)

Fixed

  • Keep the free-threaded t suffix when deriving the base python spec from a path, so a base_python pointing at a free-threaded interpreter matches py313t factors and conflicts with factors that lack the suffix - by @chuenchen309. (#3986)

4.56.4 (2026-07-08)

Fixed

  • Discover debug (Py_DEBUG) interpreters set as base_python, such as Debian’s python3.13-dbg - the spec was misread as a machine named dbg and no interpreter matched. Requires python-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 error failures - 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-url when a merged requirements line repeats an already-seen index;

    • render --no-binary/--only-binary as comma-joined strings instead of leaking the internal set into the pip command line;

    • report a clear error instead of IndexError for a bare one-argument flag (-c, -r, -f, -e) in deps or constraints;

    • canonicalize optional-dependencies keys and self-referential (recursive) extra names so non-canonical spellings no longer silently drop dependencies;

    • raise a clear error instead of KeyError when dependency_groups is 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 spurious circular chain error;

    • expand the range that actually matched in a factor expression rather than the first identical digit-range substring;

    • strip the backslash from an escaped \; in set_env values;

    • 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 Config membership tests;

    • fail evaluation gracefully instead of crashing the driver thread when tox p -p all is run with an empty selection;

    • avoid rebuilding a throwaway PEP 517 frontend against the previous root when a package environment’s root is reassigned before a frontend exists;

    • avoid crashing create_session_view when 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 when then or else is 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 false if with no else (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. py38 with virtualenv 21.5+), tox now pins the newest virtualenv that still supports it and bootstraps it for that environment only. The downgrade happens only when every base_python candidate is unsupported, so environments targeting current interpreters are unaffected. This fixes py38 (and other end-of-life interpreters) being silently skipped after a virtualenv upgrade - by @gaborbernat. (#3965) (#3965)

Fixed

  • The default value of skip_missing_interpreters changed from True to False — 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, set skip_missing_interpreters = true in your tox configuration or pass --skip-missing-interpreters on the command line. (#3965)

Documentation

  • Fix nested list items being rendered with continued numbering instead of as sub-items in development.rst, onboarding.rst and explanation.rst. (#3960)

  • Replace stale http://tox.readthedocs.org URL with https://tox.wiki in pyproject.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 constraints configuration option is set, constrain_package_deps and use_frozen_constraints are now ignored. Previously, both the user-provided constraints file and the auto-generated constraints file were passed to pip during install_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.pytest plugin (pytest, devpi-process and pytest-mock) under a new testing extra, so plugin authors can pull them in via tox[testing] - by @gaborbernat. (#3938, #3940)

Fixed

  • Extend the generated TOML schema to cover every replace table form (env, ref, posargs, glob, if), including conditional replacements used inside commands. A guard test asserts the schema stays in sync with the loader implementation so future replace types cannot be added without a corresponding schema entry. (#3939)

4.53.1 (2026-05-02)

Fixed

  • Hardening pass on user-facing logging and config parsing:

    • Mask secret-looking --key=value flag values in command logs (terminal warnings, .tox/<env>/log/*.log, and Outcome __repr__) using the same keyword regex previously applied to environment variable values.

    • Resolve PEP 723 script paths and reject any that escape tox_root; cap the script read at 5 MiB so a symlink to /dev/zero cannot exhaust memory.

    • Replace eval() of a constructed Literal[...] string in the CLI parser with a direct Literal[tuple(action.choices)] subscript.

    • Pass timeout=30 to urlopen when fetching a remote requirements file so a slow or unresponsive mirror cannot hang tox indefinitely. (#3924)

  • Allow the generated TOML schema to validate array values for deps. (#3929)

  • Correct type annotations for ArgumentParser.parse_args and parse_known_args overrides following typeshed PR #15613, which widened the args parameter from Sequence[str] to Iterable[str]. The narrower type in tox’s overrides violated the Liskov substitution principle and caused invalid-method-override errors with ty 0.0.33. Also correct the option_spec annotation in docs/tox_conf.py to ClassVar[dict[str, Callable[[str], Any]]] matching the docutils stubs type. (#3932)

4.53.0 (2026-04-14)

Added

  • TOML env_list now accepts bare range dicts ({ prefix = "3.", start = 12, stop = 14 }) and bare labeled dicts ({ ecosystem = ["oci", "python"] }) as top-level items, removing the { product = [...] } wrapper when there is only a single factor group - by @gaborbernat. (#3923)

Fixed

  • Nesting a range or labeled dict inside a product factor-group list now raises a clear error pointing at the un-nesting fix, instead of silently producing a malformed environment name - by @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_isa from python-discovery for architecture factor matching, supporting aliases like i686 → x86 and aarch64 → arm64 - by @rahuldevikar. (#3919)

4.52.0 (2026-03-30)

Added

  • Add virtualenv-pep-723 runner that reads dependencies and Python version from PEP 723 inline script metadata — no need to duplicate them in tox config - by @gaborbernat. (#3897)

  • Support escaped dots (\.) in -x/--override keys, allowing overrides to target environments with dots in their names such as py3.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_file configuration 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-gh via the TOML format. Previously this was only possible with the INI format. - by @Daverball (#3905)

4.50.3 (2026-03-20)

Fixed

  • Use separate .pkg environments for free-threaded Python targets by including the t suffix in the wheel build environment name (e.g., .pkg-cpython314t), preventing wheel tag mismatches when building for py314t - by @gaborbernat. (#3314)

4.50.2 (2026-03-19)

Fixed

  • Fix the sdist to include the missing docs/man/tox.1.rst file 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_commands option to run cleanup commands even after SIGINT - by @gaborbernat. (#3858)

  • Add factor['NAME'] and env['VAR'] subscript syntax for conditional expressions, enabling checks of factors with non-identifier names like factor['3.14']. Add env_name variable to check the full environment name in conditions. (#3880)

Fixed

  • Fix multiple manpage issues: remove duplicate header/author/copyright sections, set project in Sphinx config, and compile the manpage to troff format at wheel-build time instead of shipping raw RST source - by @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 = true on conditional replacements inside lists, fix incorrect ref of path in raw reference docs, and add a test that validates all doc config examples - by @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 in product matrices and env_base factors can now be labeled with single-key dicts (e.g., {ecosystem = ["oci", "python"]}), enabling {factor:ecosystem} in any string value (descriptions, commands, etc.) to resolve to the active factor. Plain lists automatically get positional labels ({factor:0}, {factor:1}, …) - by @gaborbernat. (#3860) (#3860)

Fixed

  • Fix --showconfig and --help-ini legacy flags raising AttributeError after config format options were added by @rares985 (#3866)

4.48.1 (2026-03-06)

Fixed

  • Command-type configuration values like list_dependencies_command can now be referenced in TOML using the structured {replace = "ref"} syntax. The reference automatically extracts the command’s argument list for compatibility with TOML’s list[list[str]] structure - by @gaborbernat. (#3830)

Documentation

  • Replace archived 31z4/tox Docker image recommendation with instructions for building your own image using the official Python base image and uv - by @rahuldevikar. (#3855)

4.48.0 (2026-03-05)

Added

  • Add --format flag (ini, json, toml) and -o/--output-file to the config command for machine-readable output with native types. JSON and TOML use the same key structure as tox.toml (env.<name> for environments, tox for core) and get syntax-highlighted on stdout - by @gaborbernat. (#3854)

Documentation

  • Add fail_fast to the configuration reference documentation - by @rahuldevikar. (#578)

4.47.3 (2026-03-04)

Fixed

  • ignore_base_python_conflict now also suppresses errors when an environment name contains multiple conflicting version-like factors (e.g., unit-py3.10-2.16 where both py3.10 and 2.16 are detected as Python versions). Previously this flag only handled conflicts between explicit base_python settings and the environment name - by @gaborbernat. (#3850)

4.47.2 (2026-03-03)

Fixed

  • Handle OSError when checking if positional arguments are existing paths in pos_args() — long arguments (e.g., pytest -k expressions exceeding the 255-character filesystem name limit) no longer crash with OSError: [Errno 36] File name too long - by @yarikoptic. (#3847)

4.47.1 (2026-03-03)

Fixed

  • New-style version factors (e.g., 3.10-tests) now correctly set base_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 in HandledError with 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 ty for virtualenv API changes (system_executable nullability and cached_py_info.PythonInfo removal), and correct the CI workflow matrix exclude for windows-2025 - by @gaborbernat. (#3837)

  • base_python and default_base_python now accept a string value in TOML configuration (e.g., base_python = "python" is coerced to ["python"]) instead of raising TypeError - by @gaborbernat. (#3839)

  • Pass stdin through to commands executed via tox exec so that piped input (e.g., echo "foo" | tox exec -- python -c 'import sys; print(sys.stdin.read())') reaches the subprocess instead of being discarded - by @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 (*, ?) in depends configuration for ini files - by @gaborbernat. (#3822)

  • Fix false positive schema validation errors with tombi by adding additionalProperties: true to partial-tox.json on SchemaStore - by @gaborbernat. (#3823)

4.46.0 (2026-02-24)

Added

  • Add architecture (ISA) awareness to Python discovery. tox now propagates the machine field (e.g. arm64, x86_64) from virtualenv’s interpreter info — derived from sysconfig.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. Requires virtualenv >= 20.39 - by @rahuldevikar. (#3069)

  • Add env_base TOML sections for named environment templates that generate multiple environments from factor combinations via Cartesian product – by @gaborbernat. (#3817)

Fixed

  • Drop chardet dependency and use BOM detection with locale fallback for requirements file decoding, matching pip’s own approach - by @gaborbernat. (#3818)

  • Allow --help to render even when the configuration file is malformed or missing - by @gaborbernat. (#3819)

4.45.0 (2026-02-23)

Added

  • Enhance tox schema command: add x-taplo metadata for IDE integration, product dict support for env_list, handle int and PythonConstraints types, fix $schema draft-07 URI, and add schema freshness test. Add tox.toml to SchemaStore catalog for automatic IDE validation - by @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) using sphinx-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_variables when set_env references {env_site_packages_dir} or similar lazy constants, causing RecursionError silently caught as “could not find python interpreter” - by @gaborbernat. (#3816)

4.44.0 (2026-02-20)

Added

  • Support PEP 751 pylock.toml lock files as dependency input via the pylock configuration option (mutually exclusive with deps). Packages are filtered by extras, dependency groups, and platform markers evaluated against the target Python interpreter, then installed via pip with --no-deps - by @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 \ – the pending_skip flag 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_list via product dict syntax – Cartesian product of factor groups with optional range dicts and exclusions - by @gaborbernat. (#3797)

Fixed

  • Pass config_settings_build_wheel to pip as --config-settings when installing sdist packages, ensuring the build backend receives config settings during pip’s internal wheel build - by @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-towncrier to 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.platform value like linux, darwin, win32) is automatically available as an implicit factor, allowing configurations like linux: pytest in INI or factor.linux in TOML conditional expressions to work in any environment. Additionally, TOML configurations can now use factor.NAME in conditional expressions to filter settings based on environment name factors, achieving feature parity with INI’s factor system - by @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 to lib64 instead of lib, 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_python configuration key to specify a fallback Python interpreter when no Python factor or explicit base_python is defined. This allows projects to pin a default Python version for reproducibility across different machines without conflicting with pyXY factor-named environments - by @gaborbernat. (#2846)

  • CLI options added by plugins listed in requires are 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, and misc - by @gaborbernat. (#3200)

  • Add --skip-env-install CLI flag to skip dependency and package installation, allowing reuse of existing environments when offline or when installation is unnecessary - by @gaborbernat. (#3310)

  • Add recreate_commands configuration option to run cleanup commands (e.g. clearing external caches like pre-commit) before the environment directory is removed during recreation (-r) - by @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 and py3{-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-json and parallel mode - by @gaborjbernat. Fixes #3635. (#3635)

  • Add virtualenv_spec configuration key that allows pinning a specific virtualenv version per environment (e.g. virtualenv_spec = "virtualenv<20.22.0"). When set, tox bootstraps the specified version in an isolated environment and drives it via subprocess, enabling environments targeting Python versions incompatible with the installed virtualenv - by @gaborbernat. (#3656)

Fixed

  • Suppress BrokenPipeError during 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-dependencies output is now printed to stdout during parallel runs. Previously, the dependency list was captured in suspended output buffers and only shown on failure - by @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, running tox -e py310-np-cov with a factor conditional np-cov: coverage in the config would fail with “provided environments not found” because the individual factor cov was not recognized as combinable - by @gaborbernat. (#3780)

Documentation

  • Document Debian/Ubuntu python3-venv limitation 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 from pyproject.toml without creating a packaging environment - by @gaborbernat. (#2301)

  • Prefer TOML-native configuration ([tool.tox]) over legacy_tox_ini when both are present in pyproject.toml, allowing users to include a legacy_tox_ini section with min_version for older tox versions while using native TOML config for newer ones - by @rahuldevikar. (#3402)

Fixed

  • Fix PEP 517 backend crash detection to handle both ENOENT (missing interpreter) and runtime crashes without hanging, and fix flaky test_provision_install_pkg_pep517 integration test by using a pre-built wheel instead of an sdist to avoid devpi mirror dependency on setuptools - by @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_retry configuration option to automatically retry failed commands - by @gaborbernat. (#1578)

  • Automatically create a .gitignore file containing * in the tox work directory (typically .tox/) and in environment info directories, so that tox-managed files are not tracked by git - by @rahuldevikar. (#2530)

  • Add conditional value selection via replace = "if" in TOML configuration. Supports a condition expression with env.VAR lookups, ==/!= comparisons, and and/or/not boolean logic to select between then and else values - by @gaborbernat. (#3650)

  • Add sdist-wheel package type that builds a wheel from a source distribution, ensuring the sdist is complete and the package can be correctly built from it — by @rahuldevikar. (#3687)

Fixed

  • Use positive exit code (1) instead of -1 when reporting failures across multiple environments. On Windows, cmd.exe’s IF ERRORLEVEL 1 only matches exit codes >= 1, so the previous negative exit code was silently treated as success - by @radevika. Fixes #2945. (#2945)

  • When set_env both inherits via cross-section substitution (e.g., {[testenv]set_env}) and explicitly overrides the same variable, the explicit value was incorrectly replaced by the inherited one because load() moved the key from the raw dict to the materialized dict before the deferred substitution ran, making the protection check ineffective - by @gaborjbernat. Fixes #3773. (#3773)

4.39.0 (2026-02-18)

Added

  • Create a CACHEDIR.TAG file in the tox work directory (.tox) so that backup and archiving tools (e.g., tar --exclude-caches, Borg, restic) can automatically skip it - by @radevika. (#3334)

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 with python -m -I (isolation mode) - by @gaborbernat. (#2692)

  • set_env values explicitly defined in a section now take precedence over values inherited via cross-section substitution (e.g., {[testenv]set_env}) - by @gaborbernat. (#2831)

  • The -e flag now supports brace expansion (e.g. tox -e 'py{38,39}-pytest{6.x,7.x}') instead of incorrectly splitting on commas inside braces - by @gaborbernat. (#2850)

  • Posargs containing colons no longer crash tox when an inactive environment uses {posargs} in path-like configuration values such as env_dir - by @gaborbernat. (#2860)

  • set_env values from cross-section substitution (e.g., {[testenv]set_env}) now correctly override default environment variables like PYTHONHASHSEED - by @gaborbernat. (#2872)

  • --force-dep now applies to package dependencies from project metadata (e.g. setup.cfg install_requires, pyproject.toml dependencies), not just tox config deps - by @gaborbernat. (#2943)

  • Using {posargs} in change_dir no longer causes a RecursionError - 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 ValueError crash when using posargs on Windows with subst drive mappings – os.path.relpath fails across drive letters, so fall back to absolute paths when the relative path cannot be computed - by @gaborbernat. (#3086)

  • TOX_OVERRIDE with += (append) now works correctly when the override key name differs from the config file key name (e.g., overriding pass_env when config uses passenv, or vice versa) - by @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 phantom find environment - by @gaborbernat. (#3134)

  • Requirements in requires with environment markers that evaluate to false (e.g. virtualenv<20.22.0; python_version < "3.8") are now correctly skipped during provisioning instead of causing an infinite provisioning loop - by @gaborbernat. (#3136)

  • Running environments with recreate = true no longer destroys shared package environments (e.g. .pkg), which previously caused FileNotFoundError when a subsequent environment tried to use the already-built wheel - by @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-spinner no longer forces parallel mode in the legacy command, fixing output suppression for sequential runs in CI - by @gaborbernat. (#3193)

  • Multiple -e flags are now additive (tox r -e a -e b runs both a and b), matching tox 3 behavior - by @gaborbernat. (#3199)

  • Environments like functional-py312 no longer incorrectly match when only functional{-py310} is defined as a testenv section – factors from section headers are no longer treated as freely combinable with CLI -e selections by @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 yes flag to the provisioned subprocess when the parent has colors enabled - by @gaborbernat. (#3331)

  • set_env values defined after a file| reference now correctly take precedence over values loaded from the env file - by @gaborbernat. (#3335)

  • The base configuration key now works correctly in TOML format (tox.toml and pyproject.toml), allowing environments to inherit from arbitrary sections defined under [env.*] - by @gaborbernat. (#3497)

  • Skip toxfile.py inline plugin when it uses hooks not available in the current tox version instead of crashing - this allows provisioning to upgrade tox to a version that supports those hooks - by @gaborbernat. (#3593)

  • set_env substitution referencing {envsitepackagesdir}, {envbindir}, or {envpython} for environments with missing interpreters now raises Skip instead of RuntimeError, allowing skip_missing_interpreters to work correctly - by @gaborbernat. (#3597)

  • A setup.cfg without a [tox:tox] section no longer blocks discovery of pyproject.toml or tox.toml configuration files in the same directory - by @gaborbernat. (#3602)

  • Fix pytest INTERNALERROR on Python 3.15 caused by Pygments using deprecated os.path.commonprefix() - by @gaborbernat. (#3733)

  • Fix RecursionError when TOML set_env contains substitutions like {env_site_packages_dir} that trigger config loading cycles – the TOML loader now defers string substitution in set_env values, matching the INI loader’s lazy resolution behavior - by @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 like editable-legacy to specify dependencies - by @rahuldevikar. (#3731)

4.37.0 (2026-02-17)

Added

  • Add extra_setup_commands configuration option to run commands after dependency and package installation but before test commands, useful with --notest for separating setup from execution - by @gaborbernat. (#1504)

Fixed

  • Set PIP_USER=0 environment variable when running pip commands in virtualenvs to prevent pip from attempting --user installs when users have pip config --user configured globally — by @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_case now matches Provides-Extra: snake-case in wheel metadata) - by @Fridayai700. (#3433)

  • Fix setenv modifications to PATH being overwritten when tox environment paths are set up - by @Fridayai700 (#3445)

  • Fix deps entries with ~= version specifier being incorrectly treated as local paths instead of being passed through to pip - by @Fridayai700. (#3447)

  • Fix factor selection via TOX_FACTORS environment variable producing wrong results because append + nargs="+" actions need nested list types for proper env var conversion - by @Fridayai700. (#3557)

  • Fix custom install_command being 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 completion extras to type and type-min environments so ty can resolve the argcomplete import - 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 logging for 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_interpreters to be set per environment, overriding the global setting. This enables marking specific environments as optional while keeping others required. (#435)

  • Add --fail-fast CLI flag and fail_fast per-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_env configuration option to exclude specific environment variables after pass_env glob 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 release command - by @gaborbernat (#3704)

Changes

Fixed

  • Raise an error when deps is configured on a PEP-517 packaging environment (e.g. .pkg), since build dependencies should be specified via the [build-system] table in pyproject.toml - by @rahuldevikar (#3412)

  • Follow FORCE_COLOR recommendations: any non-empty value now enables color (previously only yes, true, or 1 were accepted, and other values caused a crash). Also add support for TTY_COMPATIBLE (1 forces color, 0 disables it) — by @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.py inline plugins using tox_extend_envs and MemoryLoader by @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.toml and pyproject.toml formats, and emphasize TOML as the recommended format throughout - by @gaborbernat (#3393)

  • Document the tox exec subcommand 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.rst to reflect current standards: replace references to flake8/black/isort/pyupgrade with ruff, remove outdated Python 2.7 compatibility note, and fix CI config filename - by @rahuldevikar (#3483)

  • Drop setup.py mentions 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 own plugins/ subdirectory. Remove the obsolete tox 3-to-4 migration guide (upgrading.rst) and FAQ, redistributing still-relevant content into the appropriate sections. All configuration examples now show TOML first with INI alongside - by @gaborbernat (#3702)

4.35.0 (2026-02-12)

Added

  • Show toxfile.py inline plugins in tox --version output, including any tox_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

  • Support installing extras from the current project in dependency groups. – by @czaki. (#3561)

4.33.0 (2026-01-02)

Added

  • Add support for conditional set_env using PEP-496 environment markers. In INI format use VAR=value; marker syntax, in TOML format use set_env.VAR = { value = "...", marker = "..." } – by @gaborbernat. (#3663)

Fixed

  • Added ‘LocalAppData’ to the default passed environment variables on Windows. (#3639)

Documentation

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

  • Add Python 3.14 and 3.14t to config examples - by @cclauss (#3626)

4.31.0 (2025-10-09)

4.30.3 (2025-10-02)

Fixed

  • Fix incorrect type annotation in PythonPathPackageWithDeps.__init__() where deps was annotated as Sequence[Package] but should be Sequence[Requirement] to match actual runtime usage - by @PreistlyPython (#3607)

  • Fix None appearing 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

  • Previously, when tox ran in an automatically provisioned environment, it could hang waiting for a PEP 517 build backend if used in conjunction with the --installpkg option. This has been fixed by properly tearing down the automatically provisioned environment after the tests. - by @vytas7 (#3600)

4.30.1 (2025-09-03)

Fixed

  • Prevent tox from hanging upon exit due to orphaned build threads and subprocesses when the --installpkg option is used with sdist. - by @vytas7 (#3530)

4.30.0 (2025-09-03)

Added

  • Add __TOX_ENVIRONMENT_VARIABLE_ORIGINAL_CI, which passes through the CI variable if present. This is intended for use by other libraries to detect if tox is running under CI. (#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() hook recently added in #3591 turned out to not work well with tox run. It was fixed internally, not to exhaust the underlying iterator on the first use. – by @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_PID and SSH_AUTH_SOCK in pass_env by 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

4.28.0 (2025-07-20)

Added

  • Added constraints to allow specifying constraints files for all dependencies. (#3550)

  • Allow disabling tox plugins via the TOX_DISABLED_EXTERNAL_PLUGINS environment variable - by @gaborbernat. (#3468)

Documentation

  • The min_version/minversion config option is deprecated in favor of the requires option. (#3553)

4.27.0 (2025-06-17)

Added

  • Add free_threaded flag to to "python" entries in json output of --result-json. (#3534)

Fixed

  • Fix dependency-group name normalization. (#3539)

  • Improves logging of environment variables by sorting them by key and redacting the values for the ones that are likely to contain secrets. (#3542)

4.26.0 (2025-05-13)

Added

  • Add support for free-threaded python builds. Factors like py313t will only pick builds with the GIL disabled while factors without trailing t will only pick builds without no-GIL support. (#3391)

  • Drop support for EOL Python 3.8. (#3527)

Fixed

  • Fix a regression issue related to inability to use file| substitution option in nested set_env sections of ini configurations since tox4 update. (#2435)

  • Fix TypeError for HelpFormatter with Python 3.14 (#3523)

4.25.0 (2025-03-27)

Added

  • Add support for number ranges in generative environments, more details here. - by @mimre25 (#3502)

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-spinner now respects max CPU set by --parallel N (#3495)

Documentation

  • Updates the documentation for os.environ['KEY'] when the variable does not exist - by @jugmac00. (#3456)

4.24.1 (2025-01-21)

4.24.0 (2025-01-21)

Added

  • Add a schema command to produce a JSON Schema for tox and the current plugins. - by @henryiii (#3446)

Fixed

  • Log exception name when subprocess execution produces one. - by @ssbarnea (#3450)

Documentation

  • Fix typo in docs/config.rst from {} to {:}. - by @wooshaun53 (#3424)

  • Pass NIX_LD and NIX_LD_LIBRARY_PATH variables by default in pass_env to make generic binaries work under Nix/NixOS. - by @albertodonato (#3425)

4.23.2 (2024-10-22)

4.23.1 (2024-10-21)

Documentation

4.23.0 (2024-10-16)

Added

  • Add NETRC to 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

4.21.2 (2024-10-03)

Fixed

  • Include tox.toml in sdist archives to fix test failures resulting from its lack. - by @mgorny (#3389)

4.21.1 (2024-10-02)

Fixed

  • Fix error when using requires within a TOML configuration file - by @gaborbernat. (#3386)

  • Fix error when using deps within 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_env by accepting list of dictionaries for it.

    • Do not try to be smart about reference unrolling, instead allow the user to control it via the extend flag, available both for posargs and ref replacements.

    • The ref replacements raw key has been renamed to of. (#3388)

4.21.0 (2024-09-30)

Added

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

  • Fix and test the string spec for the sys.executable interpreter (introduced in #3325) - by @hroncok (#3327)

Documentation

  • Changes the tox_env_teardown docstring to explain the hook is called after a tox env was teared down. (#3305)

4.18.0 (2024-08-13)

Added

  • Suppress spinner in parallel runs in CI - by @ziima. (#3318)

Fixed

4.17.1 (2024-08-07)

Fixed

  • Support for running -e <major>.<minor> has been lost, fixing it - by @gaborbernat. (#2849)

  • base_python now accepts absolute paths to interpreter executable - by @paveldikov. (#3191)

4.17.0 (2024-08-05)

Added

  • Add graalpy prefix 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 windir to the default list of Windows pass_env environment variables. - by @kurtmckee (#3302)

Documentation

    • Fix typo in configuration example and fix broken link to code style guide. - by @srenfo (#3297)

4.15.1 (2024-06-05)

Added

  • Fix skip_missing_interpreters option for package = wheel (#3269)

Fixed

  • Fix section substitution with setenv. (#3262)

  • Allow ConfigSet.add_config to receive parameterized generics for of_type. (#3288)

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 c was dropped from packages in constraints files - by @jugmac00. (#3247)

  • Allow appending to deps with --override testenv.deps+=foo - by @stefanor. (#3256)

  • Fix non-existing branch rewrite in the documentation to main. (#3257)

  • Update test typing for build 1.2.0, which has an explicit Distribution type - by @stefanor. (#3260)

  • Fix broken input parsing for --discover flag. - by @mimre25 (#3272)

Documentation

  • Rephrase --discover flag’s description to avoid confusion between paths and executables. - by @mimre25 (#3274)

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_subprocess documentation. (#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 --version via tox_append_version_info method 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

  • Documented usage of pytest with tox run-parallel - by @faph. (#3187)

  • Configuration: state in config directive sections their ini file sections - by @0cjs. (#3194)

  • Development: summarize important points experienced developers need to know - by @0cjs. (#3197)

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_COLOR and NO_COLOR to the environment (#3172)

Fixed

  • --parallel-no-spinner flag now implies --parallel (#3158)

Documentation

  • -Fix open an issue link in development.rst (#3179)

4.11.4 (2023-11-27)

Fixed

  • Fix terminal size of tox subcommands (fixes ipython, ipdb, prompt_toolkit, …). (#2999)

  • Fix quickstart command from requiring root positional argument (#3084)

  • Added ‘AppData’ to the default passed environment variables on Windows. (#3151)

Documentation

4.11.3 (2023-09-08)

Fixed

  • Handle FileNotFoundError when the base_python interpreter doesn’t exist (#3105)

Documentation

  • Explain how plugins are registered and discovered - by @hashar. (#3116)

4.11.2 (2023-09-07)

Fixed

  • Fix bug in config.rst by removing stray colons left over from (#3111) - by @posita. (#3118)

  • Provide example to make CLI help more helpful for -x/--override - by @posita. (#3119)

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_settings in 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+=bar appending syntax will now work correctly when foo wasn’t defined in tox.ini. (#3100)

4.9.0 (2023-08-16)

Added

  • Disallow command line environments which are not explicitly specified in the config file - by @tjsmart. (#2858)

4.8.0 (2023-08-12)

Added

  • --override can now take options in the form of foo+=bar which will append bar to the end of an existing list/dict, rather than replacing it. (#3087)

4.7.0 (2023-08-08)

Added

  • Make --hashseed default to PYTHONHASHSEED, if defined - by @paravoid. The main motivation for this is to able to set the hash seed when building the documentation with tox -e docs, and thus avoid embedding a random value in the tox documentation for –help. This caused documentation builds to fail to build reproducibly. (#2942)

Fixed

  • Update a regular expression in tests to match the exception message in both Python 3.12 and older. (#3065)

Documentation

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_wheel is called before prepare_metadata_for_build_wheel, and get_requires_for_build_editable is called before prepare_metadata_for_build_editable - by @abravalheri. (#3043)

Documentation

  • Linked environment variable substitutions docs in set_env and pass_env config docs. (#3039)

4.6.2 (2023-06-16)

Fixed

  • Avoid cache collision between editable wheel build and normal wheel build – by @f3flight. (#3035)

4.6.1 (2023-06-15)

4.6.0 (2023-06-05)

Added

  • Added --list-dependencies and --no-list-dependencies CLI parameters. If unspecified, defaults to listing when in CI, but not otherwise. (#3024)

4.5.2 (2023-05-27)

Added

Fixed

4.5.1.1 (2023-08-31)

4.5.1 (2023-05-25)

Fixed

4.5.0 (2023-04-24)

Added

  • When run with verbosity=1, the per-step timing summaries are suppressed at the end of the run. Thanks to @nedbat at the PyCon 2023 sprints. (#2891)

Documentation

  • Add FAQ entry on how to test EOL Python versions by @jugmac00. (#2989)

4.4.12 (2023-04-13)

Fixed

  • Avoid race conditions in tests using the demo_pkg_inline fixture. (#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_dir was not correctly including tox_root for test runs. (#2933)

4.4.9 (2023-04-05)

Fixed

  • Instead of raising UnicodeDecodeError when command output includes non-utf-8 bytes, tox will now use surrogateescape error handling to convert the unrecognized bytes to escape sequences according to PEP 383 - by @masenf. (#2969)

Documentation

  • Document running tox within a Docker container. (#1035)

  • Added python version 3.11 to installation.rst. (#2964)

4.4.8 (2023-03-26)

Fixed

  • tox.ini is now included in source distributions in order to make all tests pass. (#2939)

  • Fix --index-url and --find-links being used together in requirements.txt files. (#2959)

4.4.7 (2023-03-12)

Documentation

4.4.6 (2023-02-21)

Fixed

  • Plugins are now able to access tox.ini config sections using a custom prefix with the same suffix / name as a tox testenv - by @masenf (#2926)

4.4.5 (2023-02-07)

Fixed

  • Ignore labels when tox will provision a runtime environment (.tox) so that environment configurations which depend on provisioned plugins or specific tox versions are not accessed in the outer tox process where the configuration would be invalid - by @masenf. (#2916)

4.4.4 (2023-01-31)

Fixed

4.4.3 (2023-01-30)

Fixed

  • Tox will now expand self-referential extras discovered in package deps to respect local modifications to package metadata. This allows a package extra to explicitly depend on another package extra, which previously only worked with non-static metadata - by @masenf. (#2904)

4.4.2 (2023-01-25)

Fixed

  • Allow the user configuration file (default <appdir>/tox/config.ini) to be overridden via the TOX_USER_CONFIG_FILE environment variable. Previously tox was looking at the TOX_CONFIG_FILE to override the user configuration, however that environment variable is already used to override the main configuration - by @masenf. (#2890)

4.4.1 (2023-01-25)

Fixed

  • In tox 4.4.0 constrain_package_deps was introduced with a default value of True. This has been changed back to False, which restores the original behavior of tox 4.3.5 - by @masenf. (#2897)

4.4.0 (2023-01-25)

Added

  • Test environments now recognize boolean config keys constrain_package_deps (default=true) and use_frozen_constraints (default=false), which control how tox generates and applies constraints files when performing install_package_deps. If constrain_package_deps is true (default), then tox will write out {env_dir}{/}constraints.txt and pass it to pip during install_package_deps. If use_frozen_constraints is false (default), the constraints will be taken from the specifications listed under deps (and inside any requirements or constraints file referenced in deps). Otherwise, list_dependencies_command (pip freeze) is used to enumerate exact package specifications which will be written to the constraints file. In previous releases, conflicting package dependencies would silently override the deps named in the configuration, resulting in test runs against unexpected dependency versions, particularly when using tox factors to explicitly test with different versions of dependencies - by @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 windows cmd.exe shell - by @masenf. (#2635)

Documentation

  • Add information when command from list_dependencies_command configuration option is used. (#2883)

4.3.5 (2023-01-18)

Fixed

  • When building a wheel or editable package with a PEP 517 backend, no longer pass an empty metadata_directory to the backend build_wheel or build_editable endpoint. Some backends, such as PDM and poetry, will not generate package metadata in the presence of a metadata_directory, even if it is empty. Prior to this change, attempting to install a wheel created by tox using PDM or poetry would return an error like “There is no item named ‘my-package.0.1.dist-info/WHEEL’ in the archive” - by @masenf. (#2880)

4.3.4 (2023-01-17)

Fixed

  • When executing via the provisioning environment (.tox by default), run tox in working directory of the parent process. Prior to this change (from tox 4.0.0), the provisioned tox would execute with {tox_root} as the working directory, which breaks when a relative path is passed to -c or --conf and tox is executed in a working directory other than {tox_root} - by @masenf. (#2876)

4.3.3 (2023-01-16)

Fixed

  • The provision environment (.tox) will never inherit from testenv. During provisioning, other test environments are not processed, allowing the use of keys and values that may be registered by later tox version or provisioned plugins - by @masenf. (#2862)

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 substitutions

    • The resulting value of a substitution is no longer reprocessed in the context of the broader string. (Prior to this change, ini-values were repeatedly re-substituted until the expression no longer had modifications)

    • Migrate and update “Substitutions” section of Configuration page from v3 docs.

    • find_replace_part is removed from tox.config.loader.ini.replace

    • New names exported from tox.config.loader.ini.replace: - find_replace_expr - MatchArg - MatchError - MatchExpression - Note: the API for replace itself is unchanged. (#2732)

  • Improved documentation for factors and test env names - by @stephenfin. (#2852)

4.2.8 (2023-01-11)

Fixed

  • Allow using package names with env markers for pip’s --no-binary and --only-binary options - by @q0w. (#2814)

4.2.7 (2023-01-11)

Fixed

  • A testenv with multiple factors, one of which conflicts with a base_python setting in tox.ini, will now use the correct Python interpreter version - by @stephenfin. (#2838)

  • Explicitly list wheel as 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 a py prefix or other supported prefix (e.g. 3.10). These complex factors were initially supported with the release of tox 4.0 but has proven complicated to support. Instead, the simple factors supported by tox 3 e.g. (py310, pypy3) or period-separated equivalent (py3.10) introduced in tox 4 should be used. Users who wish to specify more specific Python version information should configure the base_python setting - by @stephenfin. (#2848)

4.2.6 (2023-01-06)

Fixed

  • Handle properly pip --no-binary / --only-binary options in requirements.txt format files. (#2814)

4.2.5 (2023-01-06)

Fixed

  • The combination of usedevelop = true and --skip-missing-interpreters=false will no longer fail for environments that were not invoked - by @stephenfin. (#2811)

  • Fix an attribute error when use_develop = true is 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 = python3 will no longer override the Python interpreter version requested by a factor, such as py311 - by @stephenfin. (#2754)

  • Also accept tab after colon before factor filter expansion - by @pdecat. (#2823)

4.2.3 (2023-01-04)

Fixed

  • devenv does 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_CONFIG and PKG_CONFIG_SYSROOT_DIR to 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 pkgenv section, allowing to set all your packaging options in one place, and support the deps key to set additional dependencies that will be installed after pyproject.toml static requires but before backends dynamic requires - by @gaborbernat. (#2543)

Documentation

  • Document breaking changes with tox 4 and packaging environments - by @gaborbernat. (#2543)

  • Document how to handle environments whose names match tox subcommands - by @sirosen. (#2728)

4.1.3 (2023-01-02)

Fixed

Documentation

  • Add breaking-change documentation for empty install_command values - by @jayaddison. (#2695)

4.1.2 (2022-12-30)

Fixed

  • Fix --skip-missing-interpreters behavior - by @q0w. (#2649)

  • Restore tox 3 behavior of showing the output of pip freeze, however now only active when running inside a CI environment - by @gaborbernat. (#2685)

  • Fix extracting extras from markers with many extras - by @q0w. (#2791)

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

  • -f can be used multiple times and on hyphenated factors (e.g. -f py311-django -f py39) - by @sirosen. (#2766)

Documentation

  • Fix a grammatical typo in docs/user_guide.rst. (#2787)

4.0.19 (2022-12-28)

Fixed

  • Create temp_dir if not exists - by @q0w. (#2770)

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

  • Fix --sdistonly behavior. (#2653)

  • Override toxworkdir with –workdir. (#2654)

4.0.16 (2022-12-20)

Fixed

4.0.15 (2022-12-19)

Fixed

  • Fix tox auto-provisioning not working and relax min_version default from 4.0 to no version constraint - by @gaborbernat. (#2634)

  • Fix assertion in test_result_json_sequential when interpreter _base_executable is 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, --sitepackages and --alwayscopy not 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_COLOR environment variable, consistent with de facto conventions: any non-empty string will enable NO_COLOR (disable colorized output); no NO_COLOR variable or NO_COLOR with an empty string will disable NO_COLOR (enable colorized output) - by @ptmcg. (#2719)

Fixed

  • TOX_SKIP_ENV environment variable now works again, and can also be set via the CLI argument --skip-env for any command where -e can be set - by @mgedmin. (#2698)

  • tox config should only show env_list arguments by default instead of ALL - by @gaborbernat. (#2726)

4.0.10 (2022-12-14)

Added

  • Add py_dot_ver and py_impl constants to environments to show the current Python implementation and dot version (e.g. 3.11) for the current environment. These can be also used as substitutions in tox.ini - by @gaborbernat. (#2640)

Fixed

  • --help now reports the default verbosity level (which is WARNING) correctly. (#2707)

4.0.9 (2022-12-13)

Added

4.0.8 (2022-12-11)

Fixed

  • Fix multiple substitution on factor filtering in tox.ini when multiple factor filters match - by @gaborbernat. (#2650)

  • Fix regression in requirements.txt parsing - by @gaborbernat. (#2682)

4.0.7 (2022-12-11)

Fixed

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.util and filelock as these log messages are too verbose - by @gaborbernat. (#2655)

  • Use !r and repr() to better display erroneous values in exception from StrConverter.to_bool() - by @ptmcg. (#2665)

Documentation

  • Document that running --showconfig or --help-ini with the -v flag will add interleaved debugging information, whereas tox v3 added extra lines at the start - by @jugmac00. (#2622)

  • Document that tox v4 errors when using -U when defining dependencies via deps - by @jugmac00. (#2631)

4.0.3 (2022-12-08)

Fixed

  • Always set environment variable PYTHONIOENCODING to utf-8 to 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_PROCESSORS on Windows as is needed for multiprocessing.cpu_count - by @gaborbernat. (#2629)

  • The core tox configuration now contains host_python key 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 py311 reports tox section, though it should not - by @gaborbernat. (#2624)

4.0.1 (2022-12-07)

Fixed

4.0.0 (2022-12-07)

Fixed

  • The temporary folder within the tox environment was named .temp instead 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

Deprecated

  • Remove deprecated configuration option whitelist_externals which was replaced by allowlist_externals - by @jugmac00. (#2599)

4.0.0rc3 (2022-12-05)

Added

  • Add --exit-and-dump-after flag that allows automatically killing tox if does not finish within the passed seconds, and dump the thread stacks (useful to debug tox when it seemingly hangs) - by @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-legacy if package target is editable but the build backend does not have build_editable hook - 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 COLUMNS or LINES environment 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

Fixed

  • Allow installing relative paths that go outside tox root folder. - by @ssbarnea. (#2366)

4.0.0b3 (2022-11-27)

Added

  • Improve coloring of logged commands - by @ssbarnea. (#2356)

  • Pass PROGRAMDATA, PROGRAMFILES(x86), PROGRAMFILES environments on Windows by default as it is needed for discovering the VS C++ compiler and start testing against 3.11 - by @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-legacy mode to editable-legacy - by @gaborbernat. (#2502)

Fixed

  • Recognize TERM=dumb or NO_COLOR environment 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 --hash to be specified in requirements.txt files. - by @masenf. (#2373)

  • Avoid impossible minversion version requirements. - by @ssbarnea. (#2414)

Documentation

4.0.0b2 (2022-04-11)

Added

Fixed

  • Fix CLI raises an error for -va with ignored explicit argument 'a' - by @gaborbernat. (#2343)

  • Do not interpolate values when parsing tox.ini configuration 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_DIR and VIRTUAL_ENV into 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 -p flag 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)

  • devenv command does not respect specified path - by @gaborbernat. (#2325)

Documentation

4.0.0a10 (2022-01-04)

Added

Fixed

  • Fix CTRL+C is 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_config and tox_add_env_config now take a state: State argument instead of a configuration one, and Config not longer provides the envs property (instead users should migrate to State.envs) - by @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_config plugin hook called after the configuration environment is created for a tox environment and removed tox_configure. Add the main configuration object as argument to tox_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_commands and tox_after_run_commands plugin 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 ConfigSet directly and implement __contains__ for Loader – 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-dev organization - 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 result key containing success boolean, exit_code integer and duration float value - by @gaborbernat. (#1405)

  • Add exec subcommand 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_dir and packaging metadata folders) do not delete the directory itself and recreate, but instead just delete its content (this allows the user to cd into it and still be in a valid folder after a new run) - by @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

Documentation

4.0.0a7 (2021-07-28)

Added

  • Add support for configuration taken from the setup.cfg file -by @gaborbernat. (#1836)

  • Add support for configuration taken from the pyproject.toml file, tox section legacy_tox_ini key - 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 pip package, 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 tox to achieve full equivalency (such as support for the per requirement --install-option and --global-option flags) - 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 upstream repository for the coverage diff report. This has been hardcoded to upstream/rewrite until 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)

  • Use importlib instead of __import__ - by @dmendek. (#1995)

  • Evaluate factor conditions for command keys - 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 ALL is provided to the legacy env command - by @jugmac00. (#2112)

  • Move from appdirs to platformdirs - by @gaborbernat. (#2117)

  • Move from toml to tomli - by @gaborbernat. (#2118)

Documentation

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_command settings in the virtual env test environments - by @gaborbernat. (#1832)

  • Add support for the package_root setupdir ( Python scoped) configuration that sets the root directory used for packaging (the location of the historical setup.py and modern pyproject.toml). This can be set at root level, or at tox environment level (the later takes precedence over the former) - by @gaborbernat. (#1838)

  • Implement support for the --installpkg CLI flag - by @gaborbernat. (#1839)

  • Add support for the list_dependencies_command settings in the virtual env test environments - by @gaborbernat. (#1842)

  • Add support for the ignore_errors settings in tox test environments - by @gaborbernat. (#1843)

  • Add support for the pip_pre settings for virtual environment based tox environments - by @gaborbernat. (#1844)

  • Add support for the platform settings in tox test environments - by @gaborbernat. (#1845)

  • Add support for the recreate settings 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_THREAD environment variable can be used to print alive threads when tox exists (useful to debug when tox hangs because of some non-finished thread) and also now prints the pid of the local subprocess when reporting the outcome of an execution - by @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 testenv section and our target is testenv:fix) - by @gaborbernat. (#1833)

  • --alwayscopy and --sitepackages legacy only flags do not work - by @gaborbernat. (#1839)

  • Fix handling of commands_pre/commands/commands_post to be in line with tox 3 (returned incorrect exit codes and post was not always executed) - by @gaborbernat. (#1843)

  • Support requirement files containing --hash constraints - 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 sdistsrc flag because introduces a significant complexity and is barely used (5 hits on a github search).

    • --skip-missing-interpreters, --notest, --sdistonly, --installpkg, --develop and --skip-pkg-install CLI flags are no longer available for devenv (enforce the only sane value for these). By @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/sitepackages flag for virtual environment based tox environments - by @gaborbernat. (#1847)

  • Support the always_copy/alwayscopy flag for virtual environment based tox environments - by @gaborbernat. (#1848)

  • Support the download flag for virtual environment based tox environments - by @gaborbernat. (#1849)

  • Recreate virtual environment based tox environments when the virtualenv version 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 --root CLI flag to change the root - by @gaborbernat. (#1853)

  • Cleanup local subprocess file handlers when exiting runs (fixes ResourceWarning: unclosed file errors when running with env PYTHONTRACEMALLOC=5 PYTHONDEVMODE=y under a Python built with --with-pydebug) - by @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 HandledError in the ini file loader,

    • skipped environments are logged now with their fail message at default verbosity level,

    • fix an error that made the show configuration command crash when making the string of a config value failed,

    • support empty-new lines within the set env configurations replacements, by @gaborbernat. (#1864)

Documentation

4.0.0a4 (2021-01-16)

Added

  • Use .tox/4 instead of .tox4 folder (so ignores for tox 3 works for tox 4 too), reminder we’ll rename this to just .tox before public release, however to encourage testing tox 4 in parallel with tox 3 this is helpful - by @gaborbernat. (#1812)

  • Colorize the config command: 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 in deps, and expand constraint files too when viewing inside the deps or calculating weather our environment is up to date or not - by @gaborbernat. (#1788)

  • When specifying requirements/editable/constraint paths within deps escape space, unless already escaped to support running specifying transitive requirements files within deps - by @gaborbernat. (#1792)

  • When using a provisioned tox environment requesting --recreate failed with AttributeError - by @gaborbernat. (#1793)

  • Fix RequirementsFile from tox is rendered incorrectly in config command - 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 ValueError with descriptive message when a requirements file specified does not exist - by @gaborbernat. (#1828)

  • Support all valid requirement file specification without delimiting space in the deps of the tox.ini - by @gaborbernat. (#1834)

Documentation

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 --discover flag - by @gaborbernat. (#1784)

Fixed

  • Entries in the set_env does not reference environments from set_env - by @gaborbernat. (#1776)

  • env substitution does not uses values from set_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_PATH and REQUESTS_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) if backend-path is empty.

    • Fix commands parsing on Windows (do not auto-escape \ - instead users should use the new {\}, and on parsed arguments strip both ' and " quoted outcomes).

    • Allow windows paths in substitution set/default (the : character used to separate substitution arguments may also be present in paths on Windows - do not support single capital letter values as substitution arguments) - by @gaborbernat. (#1784)

  • Rework how we handle Python packaging environments:

    • the base packaging environment changed from .package to .pkg,

    • merged the sdist, wheel and dev separate packaging implementations into one, and internally dynamically pick the one that’s needed,

    • the base packaging environment always uses the same Python environment as tox is installed into,

    • the base packaging environment is used to get the metadata of the project (via PEP-517) and to build sdist and dev packages,

    • for building wheels introduced a new per env configurable option wheel_build_env, if the target Python major/minor and implementation for the run tox environment and the base package tox environment matches set this to .pkg, otherwise this is .pkg-{implementation}{major}{minor},

    • internally now packaging environments can create further packaging environments they are responsible of managing,

    • updated depends to use the packaging logic,

    • add support skip missing interpreters for depends and show config, by @gaborbernat. (#1804)

4.0.0a2 (2021-01-09)

Added

  • Add option to disable colored output, and support NO_COLOR and FORCE_COLOR environment 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 \n instead of os.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

  • Support provision of tox 4 with the min_version option - by @hroncok #2661

3.27.1 (2022-11-13)

Fixed

  • Replaced deprecated license_file key with license_files in setup.cfg – by @mgorny. #2521

  • Add env cleanup to envreport - fix PYTHONPATH leak into “envreport” – by @f3flight. #2528

3.27.0 (2022-10-25)

Fixed

  • Dropped --build-option in isolated builds, an alternative fix for the SetuptoolsDeprecationWarning about using --global-option – by @adamchainz #2497

  • Remove read-only files in ensure_empty_dir. #2498

  • Multiple tox instances no longer clobber the .tox directory when provision_tox_env is used. - by @masenf #2515

Documentation

  • Clarify that install_command only takes one command - by @jugmac00 #2433

  • Documented problems with plugin and provision env - by @ziima. #2469

3.26.0 (2022-09-07)

Added

  • Use tomllib on Python 3.11 or later and tomli instead of toml library on lower versions - by @hroncok. #2463

Fixed

  • Fix fallback to python environment when isolated_build = true is set – by @Unrud #2474

  • Fixed SetuptoolsDeprecationWarning about using --global-option – by @adamchainz #2478

3.25.1 (2022-06-29)

Fixed

  • sitepackages = true will add user’s site-package to the python path on Windows as expected – by @niander #2402

  • Avoid importing pipes on Python 3.3+ to avoid DeprecationWarning on Python 3.11 – by @adamchainz #2417

  • Fix isolated_build when the build process produces stderr at exit. #2449

Documentation

  • Explain advantages of PIP_CONSTRAINT environment variable over --constraint argument. #2423

3.25.0 (2022-04-11)

Added

  • Ignore missing commands if they are prefixed by - – by @cdown. #2315

  • Add default environment variables (such as http_proxy) regardless of their case to passenv on UNIX – by @poggenhans. #2372

  • On Windows PROGRAMFILES, PROGRAMFILES(X86), and PROGRAMDATA environment 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 #2332

  • Avoid potential 30s delay caused by socket.getfqdn(). – by @ssbarnea #2375

Documentation

3.24.5 (2021-12-29)

Fixed

  • Fixed an issue where usedevelop would cause an invocation error if setup.py does not exist. – by @VincentVanlaer #2197

3.24.4 (2021-09-16)

Fixed

  • Fixed handling of -e ALL in parallel mode by ignoring the ALL in subprocesses – by @guahki. #2167

  • Prevent tox from using a truncated interpreter when using TOX_LIMITED_SHEBANG – by @jdknight. #2208

Documentation

  • Enabled the use of the favicon in the Sphinx docs first introduced in #764 but not integrated fully – @webknjaz #2177

3.24.3 (2021-08-21)

Fixed

  • --parallel reports now show ASCII OK/FAIL/SKIP lines when full Unicode output is not available - by @brettcs #1421

Documentation

  • Started enforcing valid references in Sphinx docs – @webknjaz #2168

3.24.2 (2021-08-18)

Fixed

  • include LC_ALL to implicit list of passenv variables - by @ssbarnea #2162

3.24.1 (2021-07-31)

Fixed

  • get_requires_for_build_sdist hook (PEP 517) is assumed to return an empty list if left unimplemented by the backend build system - by @oczkoisse #2130

Documentation

  • The documentation of install_command now also mentions that you can provide arbitrary commands - by @jugmac00 #2081

3.24.0 (2021-07-14)

Fixed

  • --devenv no longer modifies the directory in which the .tox environment is provisioned - by @isaac-ped #2065

  • Fix show config when the package names are not in canonical form - by @gaborbernat. #2103

Documentation

Deprecated

  • tox no longer shows deprecation warnings for distutils.sysconfig on 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

  • Fix a tox-conda isolation build bug - by @AntoineD. #2056

Documentation

  • Update examples in the documentation to use setenv in 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-provision flag that prevents provision, if requires or minversion are not satisfied, tox will fail; if a path is specified as an argument to the flag (e.g. as tox --no-provision missing.json) and provision is prevented, provision metadata are written as JSON to that path - by @hroncok #1921

  • Unicode support in pyproject.toml - by @domdfcoding #1940

3.22.0 (2021-02-16)

Added

  • The value of the requires configuration option is now exposed via the tox.config.Config object - by @hroncok #1918

3.21.4 (2021-02-02)

Fixed

  • Adapt tests not to assume the easy_install command exists, as it was removed from setuptools 52.0.0+ - by @hroncok #1893

3.21.3 (2021-01-28)

Fixed

  • Fix a killed tox (via SIGTERM) leaving the commands subprocesses running by handling it as if it were a KeyboardInterrupt - by @dajose #1772

3.21.2 (2021-01-19)

Fixed

  • Newer coverage tools update the COV_CORE_CONTEXT environment 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

  • Fix regression that broke using install_command in config replacements - by @jayvdb #1777

  • Fix regression parsing posargs default containing colon. - by @jayvdb #1785

Packaging

  • Enable building tox with setuptools_scm 4 and 5 by @hroncok #1799

3.21.0 (2021-01-08)

Added

  • Allow { and } in default of {env:key:default}. - by @jayvdb #1502

  • Allow {posargs} in setenv. - by @jayvdb #1695

  • Allow {/} to refer to os.sep. - by @jayvdb #1700

  • Make parsing [testenv] sections in setup.cfg official. - by @mauvilsa #1727

  • Relax importlib requirement to allow 3.0.0 or any newer version - by @pkolbus #1763

Fixed

  • Fix the false congratulations message that appears when a KeyboardInterrupt occurs during package installation. - by @gnikonorov #1453

  • Fix platform support for install_command. - by @jayvdb #1464

  • Fixed 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 #1711

  • Raise MissingSubstitution on access of broken ini setting. - by @jayvdb #1716

Documentation

  • Document more info about using platform setting. - by @prakhargurunani #1144

  • Replace indexserver in documentation with environment variables - by @ziima. #1357

  • Document that the passenv environment setting is case insensitive. - by @gnikonorov #1534

3.20.1 (2020-10-09)

Fixed

3.20.0 (2020-09-01)

Added

  • Support for comments within setenv and environment files via the files| prefix. - by @gaborbernat #1667

Fixed

  • Allow hyphens and empty factors in generative section name. - by @tyagdit #1636

  • Support for PEP517 in-tree build backend-path key in get-build-requires. - by @nizox #1654

  • Allow escaping curly braces in setenv. - by @mkenigs #1656

3.19.0 (2020-08-06)

Added

Fixed

  • skip setup.cfg if it has no tox:tox namespace - by @hroncok #1045

Documentation

  • Fixed grammar in top-level documentation - by @tfurf #1631

3.18.1 (2020-07-28)

Fixed

  • Fix TypeError when using isolated_build with backends that are not submodules (e.g. maturin) #1629

3.18.0 (2020-07-23)

Deprecated

  • Add allowlist_externals alias to whitelist_externals (whitelist_externals is now deprecated). - by @dajose #1491

3.17.1 (2020-07-15)

Fixed

  • Fix tests when the HOSTNAME environment variable is set, but empty string - by @hroncok #1616

3.17.0 (2020-07-14)

Added

  • The long arguments --verbose and --quiet (rather than only their short forms, -v and -q) are now accepted. #1612

  • The ResultLog now prefers HOSTNAME environment 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 all tox invocations, including trivial ones - by @hroncok #1615

Documentation

  • Update packaging information for Flit. #1613

3.16.1 (2020-06-29)

Fixed

  • Fixed the support for using {temp_dir} in tox.ini - by @webknjaz #1609

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

  • Allow to run the tests with pip 19.3.1 once again while preserving the ability to use pip 20.1 - by @hroncok #1594

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 Script folder instead of bin. - by @gaborbernat #1597

3.15.1 (2020-05-20)

Fixed

  • tox --showconfig no longer tries to interpolate ‘%’ signs. #1585

3.15.0 (2020-05-02)

Added

Fixed

  • Respect attempts to change PATH via setenv - by @aklajnert. #1423

  • Fix 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 -h and tox --hi shows an error when run outside a directory with tox support files by @nkpro2000sr. #1539

  • Fix ValueError on tox -l for a tox.ini file that does not contain an envlist definition. - by @jquast. #1343

3.14.5 (2020-02-16)

Added

  • Add --discover (fallback to TOX_DISCOVER environment 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

  • Add interrupt_timeout and terminate_timeout that configure delay between SIGINT, SIGTERM and SIGKILL when tox is interrupted. - by @sileht #1493

  • Add HTTP_PROXY, HTTPS_PROXY and NO_PROXY to default passenv. - by @pfmoore #1498

Fixed

  • Bump minimal six version needed to avoid using one incompatible with newer virtualenv. - by @ssbarnea #1519

  • Avoid pypy test failure due to undefined printout var. - by @ssbarnea #1521

3.14.3 (2019-12-27)

Fixed

  • Relax importlib requirement to allow either version 0 or 1 - by @chyzzqo2 #1476

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

  • Fix fallback to global configuration when running in Jenkins. - by @daneah #1428

  • Fix coloring on windows: colorama is a dep. - by @1138-4EB #1471

Performance

  • improve performance with internal lookup of Python version information - by @blueyed #1462

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_FILE to the default passenv values. - by @ssbarnea #1437

  • Fix 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 #1444

  • Fix provisioning from a pyvenv interpreter. — by @kentzo #1452 Deprecations (removal in next major release)

  • Python 3.4 is no longer supported. — by @gaborbernat #1456

3.14.0 (2019-09-03)

Added

  • Add support for minor versions with multiple digits tox -e py310 works for python3.10 - by @asottile #1374

  • Remove dependence on md5 hashing algorithm - by @asottile #1384

Changes

  • Fix relative URLs to files in the repo in .github/PULL_REQUEST_TEMPLATE.md — by @webknjaz #1363

  • Replace importlib_metadata backport with importlib.metadata from the standard library on Python 3.8+ - by @hroncok #1367

  • Render the change fragment help on the docs/changelog/ directory view on GitHub — by @webknjaz #1370

Fixed

  • Fix PythonSpec detection of python3.10 - by @asottile #1374

  • Fix regression failing to detect future and past py## factors - by @asottile #1377

  • Fix current_tox_py for pypy / pypy3 - by @asottile #1378

  • Honor environment markers in requires list - by @asottile #1380

  • improve recreate check by allowing directories containing .tox-config1 (the marker file created by tox) - by @asottile #1383

  • Recognize correctly interpreters that have suffixes (like python3.7-dbg). #1415

Documentation

  • clarify behavior if recreate is set to false - by @PJCampi #1399

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 requires cause infinite provisioning loop - by @gaborbernat #1359

3.13.1 (2019-06-25)

Fixed

3.13.0 (2019-06-24)

Added

  • Replace pkg_resources with importlib_metadata for speed - by @asottile. #1324

  • Add the --devenv ENVDIR option for creating development environments from [testenv] configurations - by @asottile. #1326

  • Refuse to delete envdir if it doesn’t look like a virtualenv - by @asottile. #1340

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

  • Ensure TOX_WORK_DIR is a native string in os.environ - by @asottile. #1313

  • Fix import and usage of winreg for python2.7 on windows - by @asottile. #1315

  • Fix Windows selects incorrect spec on first discovery - by @gaborbernat #1317

3.12.0 (2019-05-23)

Added

  • Adding TOX_PARALLEL_NO_SPINNER environment variable to disable the spinner in parallel mode for the purposes of clean output when using CI tools - by @zeroshift #1184

Fixed

  • When using --parallel with --result-json the test results are now included the same way as with serial runs - by @fschulze #1295

  • Turns out the output of the py -0p is 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

  • --showconfig overhaul:

    • now fully generated via the config parser, so anyone can load it by using the built-in python config parser

    • the tox section contains all configuration data from config

    • the tox section contains a host_python key detailing the path of the host python

    • the tox:version section contains the versions of all packages tox depends on with their version

    • passing -l now allows only listing default target envs

    • allows showing config for a given set of tox environments only via the -e cli flag or the TOXENV environment variable, in this case the tox and tox:version section 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.exe to 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 -l command: do not allow setting the TOXENV or the -e flag to override the listed default environment variables, they still show up under extra if non defined target - by @gaborbernat #720

  • tox 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

  • Fix congratulations when using ^C during virtualenv creation - by @asottile #1257

3.8.6 (2019-04-03)

Fixed

  • parallel_show_output does not work with tox 3.8 #1245

3.8.5 (2019-04-03)

Fixed

  • the isolated build env now ignores sitepackages, deps and description as these do not make sense - by @gaborbernat #1239

  • Do not print timings with more than 3 decimal digits on Python 3 - by @mgedmin. #1241

3.8.4 (2019-04-01)

Fixed

  • Fix sdist creation on python2.x when there is non-ascii output. #1234

  • fix typos in isolated.py that made it impossible to install package with requirements in pyproject.toml - by @unmade #1236

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), and action.popen no longer returns the command identifier information from within the logs. No public facing changes. #1222

  • Spinner fails in CI on UnicodeEncodeError - by @gaborbernat #1223

3.8.1 (2019-03-28)

Fixed

  • The -eALL command line argument now expands the envlist key and includes all its environment. #1155

  • Isolated build environment dependency overrides were not taken in consideration (and such it inherited the deps from the testenv section) - by @gaborbernat #1207

  • --result-json puts the command into setup section instead of test (pre and post commands are now also correctly put into the commands section) - by @gaborbernat #1210

  • Set setup.cfg encoding to UTF-8 as it contains Unicode characters. #1212

  • Fix 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_ENV environment variable, set to the current running tox environment name, only when running in parallel mode. - by @gaborbernat #1139

  • Parallel children now save their output to a disk logfile - by @gaborbernat #1143

  • Parallel children now are added to --result-json - by @gaborbernat #1159

  • Display pattern and sys.platform with platform mismatch - by @blueyed. #1176

  • Setting the environment variable TOX_REPORTER_TIMESTAMP to 1 will 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 py2 and py3 with a specific basepython will no longer raise a warning unless the major version conflicts - by @demosdemon. #1153

  • Fix missing error for tox -e unknown when tox.ini declares envlist. - by @medmunds #1160

  • Resolve symlinks with toxworkdir - by @blueyed. #1169

  • Interrupting 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 file in Action - by @BoboTiG. #1179

  • Fix deadlock when using --parallel and having environments with lots of output - by @asottile. #1183

  • Removed code that sometimes caused a difference in results between --parallel and -p when using posargs - by @timdaman #1192

Documentation

3.7.0 (2019-01-11)

Added

  • Parallel mode added (alternative to detox which is being deprecated), for more details see Parallel mode - by @gaborbernat. #439

  • Added command line shortcut -s for --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

  • On windows, check sys.executable before others for interpreter version lookup. This matches what happens on non-windows. (#1087)

  • Don’t rewrite {posargs} substitution for absolute paths. (#1095)

  • Correctly fail tox --notest when setup fails. (#1097)

Documentation

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_info folders that pkg_resources does; this makes it possible for hyphenated names to use the develop-inst-noop optimization (cf. 910), which previously only worked with non-hyphenated egg names - by @hashbrowncipher (#1051)

  • previously, if a project’s setup.py --name emitted 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 jython interpreter, note to create jython envs one needs virtualenv > 16.0 which 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_post support. (#1071)

3.5.2 (2018-10-09)

Added

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 --installpkg raises AttributeError: 'str' object has no attribute 'basename' (#1042)

3.5.0 (2018-10-08)

Added

  • Added temp_dir folder 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 inside distdir). This ensures that a tox session operates on the same package it built, even if a parallel tox run builds another version. Note distdir will 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-build is now deprecated) - by @gaborbernat (#1026)

Documentation

  • document tox environment recreate rules (recreate) - by @gaborbernat (#93)

  • document inside the --help how to disable colorized output via the PY_COLORS operating 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_pre and commands_post that run before and after running the commands (setup runs always, commands only if setup succeeds, teardown always - all run until the first failing command) - by @gaborbernat (#167)

  • pyproject.toml config support initially by just inline the tox.ini under tool.tox.legacy_tox_ini key; config source priority order is pyproject.toml, tox.ini and then setup.cfg - by @gaborbernat (#814)

  • use the os environment variable TOX_SKIP_ENV to filter out tox environment names from the run list (set by envlist) - by @gaborbernat (#824)

  • always set PIP_USER=0 (do not install into the user site package, but inside the virtual environment created) and PIP_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_DIR env var is set to the tox work directory, TOX_ENV_NAME is set to the current running tox environment name, TOX_ENV_DIR is 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-interpreters cli 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)

  • -vv will print out why a virtual environment is re-created whenever this operation is triggered - by @gaborbernat (#1004)

Fixed

  • add --exists-action w to 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_conflict flag - 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 python and pip refer to the virtual environments executable - by @gaborbernat (#305)

  • add Sphinx and mkdocs example of generating documentation via tox - by @gaborbernat (#374)

  • specify that setup.cfg tox configuration needs to be inside the tox:tox namespace - by @gaborbernat (#545)

3.3.0 (2018-09-11)

Added

Changes

  • Updated the VSTS build YAML to use the latest jobs and pools syntax - by @davidstaheli (#955)

Fixed

  • fix TOX_LIMITED_SHEBANG when running under python3 - by @asottile (#931)

3.2.1 (2018-08-10)

Fixed

  • --parallel--safe-build no 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 pip instead 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 (tox section under key requires - 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-build flag. - 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 py38 and eventually py39 / py40 / etc. to work without requiring an upgrade to tox. As such, the following public constants are now deprecated (and scheduled for removal in tox 4.0: CPYTHON_VERSION_TUPLES, PYPY_VERSION_TUPLES, OTHER_PYTHON_INTERPRETERS, and DEFAULT_FACTORS - by @asottile (#914)

Fixed

  • A caching issue that caused the develop-inst-nodeps action, which reinstalls the package under test, to always run has been resolved. The develop-inst-noop action, which, as the name suggests, is a no-op, will now run unless there are changes to setup.py or setup.cfg files 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.0 is 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, pypy27 knowing 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 tox cannot invoke scripts with a system-limited shebang (e.x. a Linux host running a Jenkins Pipeline), a user can set the environment variable TOX_LIMITED_SHEBANG to 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 py2 and py3 aliases also resolve via py on windows by @asottile. This enables the following things: tox -e py2 and tox -e py3 work on windows (they already work on posix); and setting basepython=python2 or basepython=python3 now 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

Fixed

  • Add ignore_basepython_conflict, which determines whether conflicting basepython settings for environments containing default factors, such as py27 or django18-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

3.0.0 (2018-04-02)

Added

  • tox displays exit code together with InvocationError - by @blueyed and @ederag. (#290)

  • Hint for possible signal upon InvocationError, on posix systems - by @ederag and @asottile. (#766)

  • Add a -q option to progressively silence tox’s output. For each time you specify -q to 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, running tox -v -q ... will provide you with the default verbosity. tox -vv -q is equivalent to tox -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.txt and deps=--requirement=req.txt worked, now also deps=-r req.txt and deps=--requirement req.txt work - by @cryvate (#668)

  • drop Python 2.6 and 3.3 support: setuptools dropped supporting these, and as we depend on it we’ll follow up with doing the same (use tox <= 2.9.1 if 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_ARCHITECTURE by default on Windows to fix platform.machine(). (#740)

Changes

  • touched up interpreters.py code and added some missing tests for it - by @jurko-gospodnetic (#708)

  • The PYTHONDONTWRITEBYTECODE environment 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 installed stderr output when a Python environment is looked up using the py Python 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] Error on 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 cmdline import to the old location and changing the entry point instead - by @fschulze (#755)

  • Running tox without a setup.py now 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

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

  • fix #755 by reverting the cmdline import to the old location and changing the entry point instead - by @fschulze (#755)

Documentation

3.0.0rc1 (2018-01-28)

Added

  • Add a -q option to progressively silence tox’s output. For each time you specify -q to 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, running tox -v -q ... will provide you with the default verbosity. tox -vv -q is equivalent to tox -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.txt and deps=--requirement=req.txt worked, now also deps=-r req.txt and deps=--requirement req.txt work - by @cryvate (#668)

  • drop Python 2.6 and 3.3 support: setuptools dropped supporting these, and as we depend on it we’ll follow up with doing the same (use tox <= 2.9.1 if 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_ARCHITECTURE by default on Windows to fix platform.machine(). (#740)

Changes

  • The PYTHONDONTWRITEBYTECODE environment 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 installed stderr output when a Python environment is looked up using the py Python 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] Error on Windows, this was fixed by using a simpler method to update the read buffers. - by @fschulze (#727)

  • Running tox without a setup.py now 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 --version now shows information about all registered plugins - by @obestwalter (#544)

Changes

Fixed

  • skip_install overrides usedevelop (usedevelop is an option to choose the installation type if the package is installed and skip_install determines 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 Documentation and Deprecations and Removals. (#614)

2.9.0rc1 (2017-09-14)

Added

  • tox --version now shows information about all registered plugins - by obestwalter (#544)

Fixed

  • skip_install overrides usedevelop (usedevelop is an option to choose the installation type if the package is installed and skip_install determines if it should be installed at all) - by ferdonline (#571)

Documentation

  • 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 Documentation and Deprecations and Removals. (#614)

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 MSYSTEM by default on Windows. Thanks Marius Gedminas (@mgedmin) for reporting this.

  • #484: Renamed py.test to pytest throughout 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_PROCESSORS by default on Windows to fix multiprocessor.cpu_count(). Thanks André Caron (@AndreLouisCaron).

  • #518: Forward USERPROFILE by 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 --help and --version to 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 CHANGELOG and 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_create and tox_testenv_install_deps to not execute other registered hooks when the first hook returns a result that is not None. Thanks Anthony Sottile (@asottile).

  • #271 and #464: Improve environment information for users. New command line parameter: -a show all defined environments - not just the ones defined in (or generated from) envlist. New verbosity settings for -l and -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 -l it’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

Packaging

  • #464: Fix incorrect egg-info location for modified package_dir in setup.py. Thanks Selim Belhaouane (@selimb).

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

  • fix #323 by avoiding virtualenv14 is not used on py32 (although we don’t officially support py32). Thanks Jason R. Coombs (@jaraco).

  • fix glob resolution from TOX_TESTENV_PASSENV env variable Thanks Allan Feldman (@a-feld).

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.0 in the [tox] section of tox.ini to 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: downloadcache test 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_pre and tox_runtest_post which 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

  • fix #314: fix command invocation with .py scripts on windows.

  • fix #279: allow cross-section substitution when the value contains posargs. Thanks Sachi King for the PR.

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 setenv section. 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_outcome testenv 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

  • fix #258, fix #248, fix #253: for non-test commands (installation, venv creation) we pass in the full invocation environment.

  • fix #259: passenv is now a line-list which allows interspersing comments. Thanks stefano-m.

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, TEMP and TMP whereas on unix additionally TMPDIR is passed. If you need to pass through further environment variables you can use the new passenv setting, 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-ini option 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). If False (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

  • backout ability that –force-dep substitutes name/versions in requirement files due to various issues. This fixes #228, fixes #230, fixes #231 which popped up with 1.9.1.

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-json is used

Fixed

  • fix #193: Remove --pre from the default install_command; by default tox will now only install final releases from PyPI for unpinned dependencies. Use pip_pre = true in a testenv or the --pre command-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_install per-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

  • fix #148: remove “__PYVENV_LAUNCHER__” from os.environ when starting subprocesses. Thanks Steven Myint.

  • fix #152: set VIRTUAL_ENV when running test commands, thanks Florian Ludwig.

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-interpreters as well as command line option --skip-missing-interpreters which 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

  • fix #162: don’t list python 2.5 as compatible/supported

  • fix #158 and fix #155: windows/virtualenv properly works now: call virtualenv through “python -m virtualenv” with the same interpreter which invoked tox. Thanks Chris Withers, Ionel Maries Cristian.

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 --insecure option 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 through setenv. 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_requires dependencies will not silently use your HOME-directory settings or PyPI.

  • add new config options usedevelop and skipsdist as well as a command line option --develop to 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 as make, 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

  • fix #104: use setuptools by default, instead of distribute, now that setuptools has distribute merged.

  • fix #92 - fix {envsitepackagesdir} to actually work again

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

  • fix #32 - use –system-site-packages and don’t pass –no-site-packages

  • fix issue #21: clear PIP_REQUIRES_VIRTUALENV which avoids pip installing to the wrong environment, thanks to bb’s streeter

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

  • fix #5 - don’t require argparse for python versions that have it

  • fix #6 - recreate virtualenv if installing dependencies failed

  • fix #3 - fix example on frontpage

  • fix #2 - warn if a test command does not come from the test environment

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