Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: tox-dev/tox
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 4.42.0
Choose a base ref
...
head repository: tox-dev/tox
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 4.43.0
Choose a head ref
  • 5 commits
  • 19 files changed
  • 2 contributors

Commits on Feb 20, 2026

  1. 📝 docs(infra): integrate sphinxcontrib-towncrier (#3798)

    The `sphinxcontrib-towncrier` package was listed as a docs dependency
    but never actually wired into the Sphinx configuration. Instead, the
    `setup()` function in `docs/conf.py` shelled out to `towncrier build
    --draft`, wrote a generated `_draft.rst` file, and included it via `..
    include::`. This required a `.gitignore` entry and an `exclude_patterns`
    entry to manage the generated file.
    
    This replaces that approach with the `sphinxcontrib.towncrier.ext`
    extension, which renders draft changelog entries natively via the
    `towncrier-draft-entries` directive. The draft section only appears in
    non-release builds (via Sphinx's `.. only:: not is_release`
    conditional), matching the pattern used by yarl and other aio-libs
    projects.
    
    **Changes:**
    - Added `sphinxcontrib.towncrier.ext` to Sphinx extensions with
    `towncrier_draft_*` config
    - Replaced `.. include:: _draft.rst` in `changelog.rst` with `..
    towncrier-draft-entries::` directive
    - Removed the manual `towncrier build --draft` script from `setup()` and
    its unused imports
    - Removed `_draft.rst` from `.gitignore` and `exclude_patterns`
    
    Fixes #3201
    gaborbernat authored Feb 20, 2026
    Configuration menu
    Copy the full SHA
    0f4da83 View commit details
    Browse the repository at this point in the history
  2. ✨ feat(toml): add generative env_list via product dict (#3797)

    TOML users have had to manually enumerate every environment in
    `env_list` when they need a test matrix, while INI users could write
    concise expressions like `py3{12,13}-django{42,50}`. This gap made TOML
    configuration verbose and error-prone for projects with large matrices,
    and was one of the most visible feature disparities between the two
    formats.
    
    ✨ This introduces a TOML-native `product` dict syntax that leverages
    TOML's type system instead of mimicking INI's string-based brace
    expansion. Factor groups are expressed as arrays of strings or range
    dicts, and tox computes the Cartesian product joining combinations with
    `-`. Range dicts (`{ prefix = "py3", start = 12, stop = 14 }`) generate
    sequential factors, with open-ended bounds matching INI's `py3{10-}`
    behavior. An `exclude` key allows skipping specific combinations — a
    capability not available in INI at all.
    
    ```toml
    env_list = [
        "lint",
        { product = [
            { prefix = "py3", start = 12, stop = 14 },
            ["django42", "django50"],
        ] },
    ]
    ```
    
    Documentation has been updated across all four Diataxis dimensions
    (tutorial, how-to, reference, explanation) with TOML shown first in all
    tab pairs. The "TOML feature gaps" section has been renamed to "Format
    comparison" since generative `env_list` was the last major functional
    gap — only generative section names remain INI-exclusive. The JSON
    schema has been extended to validate `product` dicts with their factor
    groups and optional `exclude` arrays.
    gaborbernat authored Feb 20, 2026
    Configuration menu
    Copy the full SHA
    b11c645 View commit details
    Browse the repository at this point in the history
  3. 🐛 fix(config): restore factor conditional continuations (#3799)

    Commit 78eb394 (#3787) moved continuation line collapsing (`\`) before
    factor filtering to fix #2912, where factor-specific multiline commands
    leaked continuation lines into non-matching environments. However, this
    broke the common pattern of using different factor prefixes on
    consecutive continuation lines — the collapsed single line caused
    prefixes like `!cov:` to be passed as literal command arguments instead
    of being filtered.
    
    ```ini
    commands =
        cov: coverage run \
        !cov: python \
            somefile.py
    ```
    
    Running `tox -e py-cov` produced `coverage run '!cov:' python
    somefile.py` instead of `coverage run somefile.py`.
    
    The fix restores the original order (factor filter first, collapse `\`
    after) and makes `filter_for_env` continuation-aware. Two flags track
    whether a kept line has an active backslash chain
    (`active_continuation`) and whether a filtered-out line's continuation
    should be skipped (`pending_skip`). An unfactored continuation line is
    only dropped when it is exclusively reachable through removed factored
    lines, preserving the fix for #2912 while restoring the conditional
    continuation pattern from #3796.
    
    Fixes #3796.
    gaborbernat authored Feb 20, 2026
    Configuration menu
    Copy the full SHA
    413b963 View commit details
    Browse the repository at this point in the history
  4. 🐛 fix(pip): pass config_settings to pip for sdist install (#3800)

    When `package = sdist`, tox builds an sdist via PEP-517 and then hands
    it to pip for installation. Pip internally builds a wheel from that
    sdist, but `config_settings_build_wheel` was never forwarded as
    `--config-settings` flags. This meant build backends couldn't honor
    wheel-build config settings during pip's internal build phase, silently
    ignoring user configuration. The `sdist-wheel` package type wasn't
    affected since tox builds the wheel directly with config settings in
    that flow.
    
    The fix threads `config_settings_build_wheel` from the `.pkg`
    environment through `SdistPackage` and into the pip install command as
    `--config-settings=KEY=VALUE` flags. This keeps the data flow explicit —
    config settings travel with the package object rather than requiring the
    installer to reach back into the package environment's configuration.
    
    Fixes #3125
    gaborbernat authored Feb 20, 2026
    Configuration menu
    Copy the full SHA
    8517abc View commit details
    Browse the repository at this point in the history
  5. release 4.43.0

    gaborbernat committed Feb 20, 2026
    Configuration menu
    Copy the full SHA
    f4855f3 View commit details
    Browse the repository at this point in the history
Loading