Skip to content

Scheduled weekly dependency update for week 13#427

Open
pyup-bot wants to merge 23 commits intomainfrom
pyup-scheduled-update-2026-03-30
Open

Scheduled weekly dependency update for week 13#427
pyup-bot wants to merge 23 commits intomainfrom
pyup-scheduled-update-2026-03-30

Conversation

@pyup-bot
Copy link
Copy Markdown
Collaborator

Update attrs from 25.3.0 to 26.1.0.

The bot wasn't able to find a changelog for this release. Got an idea?

Links

Update cattrs from 25.1.1 to 26.1.0.

Changelog

26.1.0

- Add the {mod}`tomllib <cattrs.preconf.tomllib>` preconf converter.
See [here](https://catt.rs/en/latest/preconf.html#tomllib) for details.
([716](https://github.com/python-attrs/cattrs/pull/716))
- Customizing un/structuring of _attrs_ classes, dataclasses, TypedDicts and dict NamedTuples is now possible by using `Annotated[T, override()]` on fields.
See [here](https://catt.rs/en/stable/customizing.html#using-typing-annotated-t-override) for more details.
([717](https://github.com/python-attrs/cattrs/pull/717))
- Fix structuring of nested generic classes with stringified annotations.
([688](https://github.com/python-attrs/cattrs/pull/688))
- Python 3.9 is no longer supported, as it is end-of-life. Use previous versions on this Python version.
([698](https://github.com/python-attrs/cattrs/pull/698))
- Apply the attrs converter to the default value before checking if it is equal to the attribute's value, when `omit_if_default` is true and an attrs converter is specified.
([696](https://github.com/python-attrs/cattrs/pull/696))
- Use the optional `_value_` type hint to structure and unstructure enums if present.
([699](https://github.com/python-attrs/cattrs/issues/699))
- Aliases (when in use) now properly generate rename metadata in generated hooks.
([706](https://github.com/python-attrs/cattrs/issues/706) [#710](https://github.com/python-attrs/cattrs/pull/710))
- _cattrs_ now tracks performance using [codspeed](https://codspeed.io/python-attrs/cattrs).
([703](https://github.com/python-attrs/cattrs/pull/703))
- The {mod}`tomlkit <cattrs.preconf.tomlkit>` preconf converter now properly handles native `date` objects when structuring.
([707](https://github.com/python-attrs/cattrs/issues/707) [#708](https://github.com/python-attrs/cattrs/pull/708))
- The {mod}`tomlkit <cattrs.preconf.tomlkit>` preconf converter now passes date objects directly to _tomlkit_ for unstructuring.
([707](https://github.com/python-attrs/cattrs/issues/707) [#708](https://github.com/python-attrs/cattrs/pull/708))
- Enum handling has been optimized by switching to hook factories, improving performance especially for plain enums.
([705](https://github.com/python-attrs/cattrs/pull/705))
- Fix {func}`cattrs.strategies.include_subclasses` when used with {func}`cattrs.strategies.configure_tagged_union` and classes using diamond inheritance.
([685](https://github.com/python-attrs/cattrs/issues/685) [#713](https://github.com/python-attrs/cattrs/pull/713))
- Fix {func}`cattrs.strategies.configure_tagged_union` when used with recursive type aliases.
([678](https://github.com/python-attrs/cattrs/issues/678) [#714](https://github.com/python-attrs/cattrs/pull/714))

25.3.0

- **Potentially breaking**: [Abstract sets](https://docs.python.org/3/library/collections.abc.html#collections.abc.Set) are now structured into frozensets.
This allows hashability, better immutability and is more consistent with the [`collections.abc.Set`](https://docs.python.org/3/library/collections.abc.html#collections.abc.Set) type.
See [Migrations](https://catt.rs/en/latest/migrations.html#abstract-sets-structuring-into-frozensets) for steps to restore legacy behavior.
([686](https://github.com/python-attrs/cattrs/pull/686))
- Python 3.14 is now supported and part of the test matrix.
([653](https://github.com/python-attrs/cattrs/pull/653))
- Fix unstructuring NewTypes with the {class}`BaseConverter`.
([684](https://github.com/python-attrs/cattrs/pull/684))
- Make some Hypothesis tests more robust.
([684](https://github.com/python-attrs/cattrs/pull/684))
- {func}`cattrs.strategies.include_subclasses` now works with generic parent classes and the tagged union strategy.
([683](https://github.com/python-attrs/cattrs/pull/683))

25.2.0

- **Potentially breaking**: Sequences are now structured into tuples.
This allows hashability, better immutability and is more consistent with the [`collections.abc.Sequence`](https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence) type.
See [Migrations](https://catt.rs/en/latest/migrations.html#sequences-structuring-into-tuples) for steps to restore legacy behavior.
([663](https://github.com/python-attrs/cattrs/pull/663))
- Add a `use_alias` parameter to {class}`cattrs.Converter`.
{func}`cattrs.gen.make_dict_unstructure_fn_from_attrs`, {func}`cattrs.gen.make_dict_unstructure_fn`,
{func}`cattrs.gen.make_dict_structure_fn_from_attrs`, {func}`cattrs.gen.make_dict_structure_fn`
and {func}`cattrs.gen.typeddicts.make_dict_structure_fn` will use the value for the `use_alias` parameter from the given converter by default now.
If you're using these functions directly, the old behavior can be restored by passing in the desired value directly.
([596](https://github.com/python-attrs/cattrs/issues/596) [#660](https://github.com/python-attrs/cattrs/pull/660))
- The [union passthrough strategy](https://catt.rs/en/stable/strategies.html#union-passthrough) now by default accepts ints for unions that contain floats but not ints,
when configured to be able to handle both ints and floats.
This more closely matches the [current typing behavior](https://typing.python.org/en/latest/spec/special-types.html#special-cases-for-float-and-complex).
([656](https://github.com/python-attrs/cattrs/issues/656) [#668](https://github.com/python-attrs/cattrs/pull/668))
- Fix unstructuring of generic classes with stringified annotations.
([661](https://github.com/python-attrs/cattrs/issues/661) [#662](https://github.com/python-attrs/cattrs/issues/662)
- For {class}`cattrs.errors.StructureHandlerNotFoundError` and {class}`cattrs.errors.ForbiddenExtraKeysError`
correctly set {attr}`BaseException.args` in `super()` and hence make them pickable.
([666](https://github.com/python-attrs/cattrs/pull/666))
- The default disambiguation hook factory is now only enabled for converters with `unstructure_strat=AS_DICT` (the default).
Since the strategy doesn't support tuples, it is skipped for `unstructure_strat=AS_TUPLE` converters.
([673](https://github.com/python-attrs/cattrs/pull/673))
- Switch to [`uv`](https://docs.astral.sh/uv/) and [`just`](https://just.systems/man/en/) in lieu of PDM, tox and Make.
See [the Contributing section](https://catt.rs/en/v25.2.0/contributing.html#get-started) for new workflow instructions.
([671](https://github.com/python-attrs/cattrs/pull/671))
Links

Update exceptiongroup from 1.3.0 to 1.3.1.

Changelog

1.3.1

- Fixed ``AttributeError: 'TracebackException' object has no attribute 'exceptions'``
when formatting unpickled TBEs from another Python process which did not apply the
``exceptiongroup`` patches
(`144 <https://github.com/agronholm/exceptiongroup/issues/144>`_)
Links

Update fonttools from 4.59.0 to 4.62.1.

Changelog

4.62.1

----------------------------

- [feaLib] Extend contextual rule merging to all rule types: single subst, GSUB/GPOS
named lookups, ignore rules, and chained alternate subst (4061).

4.62.0

----------------------------

- [diff] Add new ``fonttools diff`` command for comparing font files, imported from the
``fdiff`` project and heavily reworked (1190, 4007, 4009, 4011, 4013, 4019).
- [feaLib] Fix ``VariableScalar`` interpolation bug with non-linear avar mappings. Also
decouple ``VariableScalar`` from compiled fonts, allowing it to work with designspace data
before compilation (3938, 4054).
- [feaLib] Fix ``VariableScalar`` axis ordering and iterative delta rounding to match fontc
behavior (4053).
- [feaLib] Merge chained multi subst rules with same context into a single subtable instead of
emitting one subtable per glyph (4016, 4058).
- [feaLib] Pass location to ``ConditionsetStatement`` to fix glyphsLib round-tripping
(fontra/fontra-glyphs130, 4057).
- [feaLib] Write ``0xFFFF`` instead of ``0`` for missing nameIDs in ``cv`` feature params
(4010, 4012).
- [cmap] Fix ``CmapSubtable.__lt__()`` ``TypeError`` on Python 3 when subtables share the
same encoding record, and add compile-time validation for unique encoding records (4035,
4055).
- [svgLib] Skip non-element XML nodes (comments, processing instructions) when drawing SVG
paths (4042, 4043).
- [glifLib] Fix regression reading glyph outlines when ``glyphObject=None`` (4030, 4031).
- [pointPen] Fix ``SegmentToPointPen`` edge case: only remove a duplicate final point on
``closePath()`` if it is an on-curve point (4014, 4015).
- [cffLib] **SECURITY** Replace ``eval()`` with ``safeEval()`` in ``parseBlendList()`` to
prevent arbitrary code execution from crafted TTX files (4039, 4040).
- [ttLib] Remove defunct Adobe SING Glyphlet tables (``META``, ``SING``, ``GMAP``, ``GPKG``)
(4044).
- [varLib.interpolatable] Various bugfixes: fix swapped nodeTypes assignment, duplicate
kink-detector condition, typos, CFF2 vsindex parsing, glyph existence check, and plot
helpers (4046).
- [varLib.models] Fix ``getSubModel`` not forwarding ``extrapolate``/``axisRanges``; check
location uniqueness after stripping zeros (4047).
- [varLib] Fix ``--variable-fonts`` filter in ``build_many``; remove dead code and fix
comments (4048).
- [avar] Preserve existing name table in build; keep ``unbuild`` return types consistent;
validate ``map`` CLI coordinates (4051).
- [cu2qu/qu2cu] Add input validation: reject non-positive tolerances, validate curve inputs
and list lengths (4052).
- [colorLib] Raise a clear ``ColorLibError`` when base glyphs are missing from glyphMap,
instead of a confusing ``KeyError`` (4041).
- [glyf] Remove unnecessary ``fvar`` table dependency (4017).
- [fvar/trak] Remove unnecessary ``name`` table dependency (4018).
- [ufoLib] Relax guideline validation to follow the updated spec (3537, 3553).
- [ttFont] Fix ``saveXML`` regression with empty table lists, clarify docstring (4025, 4026,
4056).
- [setup.py] Link ``libm`` for Cython extensions using math functions (4028, 4029).
- Add typing annotations for ``DSIG``, ``DefaultTable``, ``ttProgram`` (4033).

4.61.1

----------------------------

- [otlLib] buildCoverage: return empty Coverage instead of None (4003, 4004).
- [instancer] bug fix in ``avar2`` full instancing (4002).
- [designspaceLib] Preserve empty conditionsets when serializing to XML (4001).
- [fontBu ilder] Fix FontBuilder ``setupOS2()`` default params globally polluted (3996, 3997).
- [ttFont] Add more typing annotations to ttFont, xmlWriter, sfnt, varLib.models and others (3952, 3826).
- Explicitly test and declare support for Python 3.14, even though we were already shipping pre-built wheels for it (3990).

4.61.0

----------------------------

- [varLib.main]: **SECURITY** Only use basename(vf.filename) to prevent path traversal attacks when
running ``fonttools varLib`` command, or code which invokes ``fonttools.varLib.main()``.
Fixes CVE-2025-66034, see:
https://github.com/fonttools/fonttools/security/advisories/GHSA-768j-98cg-p3fv.
- [feaLib] Sort BaseLangSysRecords by tag (3986).
- Drop support for EOL Python 3.9 (3982).
- [instancer] Support --remove-overlaps for fonts with CFF2 table (3975).
- [CFF2ToCFF] Add --remove-overlaps option (3976).
- [feaLib] Raise an error for rsub with NULL target (3979).
- [bezierTools] Fix logic bug in curveCurveIntersections (3963).
- [feaLib] Error when condition sets have the same name (3958).
- [cu2qu.ufo] skip processing empty glyphs to support sparse kerning masters (3956).
- [unicodedata] Update to Unicode 17. Require ``unicodedata2 >= 17.0.0`` when installed with 'unicode' extra.

4.60.2

----------------------------

- **Backport release** Same as 4.61.0 but without "Drop support for EOL Python 3.9" change to allow
downstream projects still on Python 3.9 to avail of the security fix for CVE-2025-66034 (3994, 3999).

4.60.1

----------------------------

- [ufoLib] Reverted accidental method name change in ``UFOReader.getKerningGroupConversionRenameMaps``
that broke compatibility with downstream projects like defcon (3948, 3947, robotools/defcon478).
- [ufoLib] Added test coverage for ``getKerningGroupConversionRenameMaps`` method (3950).
- [subset] Don't try to subset BASE table; pass it through by default instead (3949).
- [subset] Remove empty BaseRecord entries in MarkBasePos lookups (3897, 3892).
- [subset] Add pruning for MarkLigPos and MarkMarkPos lookups (3946).
- [subset] Remove duplicate features when subsetting (3945).
- [Docs] Added documentation for the visitor module (3944).

4.60.0

----------------------------

- [pointPen] Allow ``reverseFlipped`` parameter of ``DecomposingPointPen`` to take a ``ReverseFlipped``
enum value to control whether/how to reverse contour direction of flipped components, in addition to
the existing True/False. This allows to set ``ReverseFlipped.ON_CURVE_FIRST`` to ensure that
the decomposed outline starts with an on-curve point before being reversed, for better consistency
with other segment-oriented contour transformations. The change is backward compatible, and the
default behavior hasn't changed (3934).
- [filterPen] Added ``ContourFilterPointPen``, base pen for buffered contour operations, and
``OnCurveStartPointPen`` filter to ensure contours start with an on-curve point (3934).
- [cu2qu] Fixed difference in cython vs pure-python complex division by real number (3930).
- [varLib.avar] Refactored and added some new sub-modules and scripts (3926).
* ``varLib.avar.build`` module to build avar (and a missing fvar) binaries into a possibly empty TTFont,
* ``varLib.avar.unbuild`` module to print a .designspace snippet that would generate the same avar binary,
* ``varLib.avar.map`` module to take TTFont and do the mapping, in user/normalized space,
* ``varLib.avar.plan`` module moved from ``varLib.avarPlanner``.
The bare ``fonttools varLib.avar`` script is deprecated, in favour of ``fonttools varLib.avar.build`` (or ``unbuild``).
- [interpolatable] Clarify ``linear_sum_assignment`` backend options and minimal dependency
usage (3927).
- [post] Speed up ``build_psNameMapping`` (3923).
- [ufoLib] Added typing annotations to fontTools.ufoLib (3875).

4.59.2

----------------------------

- [varLib] Clear ``USE_MY_METRICS`` component flags when inconsistent across masters (3912).
- [varLib.instancer] Avoid negative advance width/height values when instatiating HVAR/VVAR,
(unlikely in well-behaved fonts) (3918).
- [subset] Fix shaping behaviour when pruning empty mark sets (3915, harfbuzz/harfbuzz5499).
- [cu2qu] Fixed ``dot()`` product of perpendicular vectors not always returning exactly 0.0
in all Python implementations (3911)
- [varLib.instancer] Implemented fully-instantiating ``avar2`` fonts (3909).
- [feaLib] Allow float values in ``VariableScalar``'s axis locations (3906, 3907).
- [cu2qu] Handle special case in ``calc_intersect`` for degenerate cubic curves where 3 to 4
control points are equal (3904).

4.59.1

----------------------------

- [featureVars] Update OS/2.usMaxContext if possible after addFeatureVariationsRaw (3894).
- [vhmtx] raise TTLibError('not enough data...') when hmtx/vmtx are truncated (3843, 3901).
- [feaLib] Combine duplicate features that have the same set of lookups regardless of the order in which those lookups are added to the feature (3895).
- [varLib] Deprecate ``varLib.mutator`` in favor of ``varLib.instancer``. The latter
provides equivalent full (static font) instancing in addition to partial VF instancing.
CLI users should replace ``fonttools varLib.mutator`` with ``fonttools varLib.instancer``.
API users should migrate to ``fontTools.varLib.instancer.instantiateVariableFont`` (2680).
Links

Update lxml from 6.0.0 to 6.0.2.

Changelog

6.0.2

==================

Bugs fixed
----------

* LP2125278: Compilation with libxml2 2.15.0 failed.
Original patch by Xi Ruoyao.

* Setting ``decompress=True`` in the parser had no effect in libxml2 2.15.

* Binary wheels on Linux and macOS use the library version libxml2 2.14.6.
See https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.14.6

* Test failures in libxml2 2.15.0 were fixed.

Other changes
-------------

* Binary wheels for Py3.9-3.11 on the ``riscv64`` architecture were added.

* Error constants were updated to match libxml2 2.15.0.

* Built using Cython 3.1.4.

6.0.1

==================

Bugs fixed
----------

* LP2116333: ``lxml.sax._getNsTag()`` could fail with an exception on malformed input.

* GH467: Some test adaptations were made for libxml2 2.15.
Patch by Nick Wellnhofer.

* LP2119510, GH473: A Python compatibility test was fixed for Python 3.14+.
Patch by Lumír Balhar.

* GH471: Wheels for "riscv64" on recent Python versions were added.
Patch by ffgan.

* GH469: The wheel build no longer requires the ``wheel`` package unconditionally.
Patch by Miro Hrončok.

* Binary wheels use the library version libxml2 2.14.5.
See https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.14.5

* Windows binary wheels continue to use a security patched library version libxml2 2.11.9.
Links

Update msgpack from 1.1.1 to 1.1.2.

Changelog

1.1.2

=====

Release Date: 2025-10-08

This release does not change source code. It updates only building wheels:

* Update Cython to v3.1.4
* Update cibuildwheel to v3.2.0
* Drop Python 3.8
* Add Python 3.14
* Add windows-arm
Links

Update orjson from 3.11.0 to 3.11.7.

Changelog

3.11.7

Changed

- Use a faster library to serialize `float`. Users with byte-exact regression
tests should note positive exponents are now written using a `+`, e.g.,
`1.2e+30` instead of `1.2e30`. Both formats are spec-compliant.
- ABI compatibility with CPython 3.15 alpha 5 free-threading.

3.11.6

Changed

- orjson now includes code licensed under the Mozilla Public License 2.0 (MPL-2.0).
- Drop support for Python 3.9.
- ABI compatibility with CPython 3.15 alpha 5.
- Build now depends on Rust 1.89 or later instead of 1.85.

Fixed

- Fix sporadic crash serializing deeply nested `list` of `dict`.

3.11.5

Changed

- Show simple error message instead of traceback when attempting to
build on unsupported Python versions.

3.11.4

Changed

- ABI compatibility with CPython 3.15 alpha 1.
- Publish PyPI wheels for 3.14 and manylinux i686, manylinux arm7,
manylinux ppc64le, manylinux s390x.
- Build now requires a C compiler.

3.11.3

Fixed

- Fix PyPI project metadata when using maturin 1.9.2 or later.

3.11.2

Fixed

- Fix build using Rust 1.89 on amd64.

Changed

- Build now depends on Rust 1.85 or later instead of 1.82.

3.11.1

Changed

- Publish PyPI wheels for CPython 3.14.

Fixed

- Fix `str` on big-endian architectures. This was introduced in 3.11.0.
Links

Update typing-extensions from 4.14.1 to 4.15.0.

Changelog

4.15.0

No user-facing changes since 4.15.0rc1.

4.15.0rc1

- Add the `typing_extensions.disjoint_base` decorator, as specified
in PEP 800. Patch by Jelle Zijlstra.
- Add `typing_extensions.type_repr`, a backport of
[`annotationlib.type_repr`](https://docs.python.org/3.14/library/annotationlib.html#annotationlib.type_repr),
introduced in Python 3.14 (CPython PR [124551](https://github.com/python/cpython/pull/124551),
originally by Jelle Zijlstra). Patch by Semyon Moroz.
- Fix behavior of type params in `typing_extensions.evaluate_forward_ref`. Backport of
CPython PR [137227](https://github.com/python/cpython/pull/137227) by Jelle Zijlstra.
Links

Update black from 25.1.0 to 26.3.1.

Changelog

26.3.1

Stable style

- Prevent Jupyter notebook magic masking collisions from corrupting cells by using
exact-length placeholders for short magics and aborting if a placeholder can no longer
be unmasked safely (5038)

Configuration

- Always hash cache filename components derived from `--python-cell-magics` so custom
magic names cannot affect cache paths (5038)

_Blackd_

- Disable browser-originated requests by default, add configurable origin allowlisting
and request body limits, and bound executor submissions to improve backpressure
(5039)

26.3.0

Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted (4964)
- Fix crash on standalone comment in lambda default arguments (4993)
- Preserve parentheses when ` type: ignore` comments would be merged with other
comments on the same line, preventing AST equivalence failures (4888)

Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
a trailing comma (4884)
- Fix `string_processing` crashing on unassigned long string literals with trailing
commas (one-item tuples) (4929)
- Simplify implementation of the power operator "hugging" logic (4918)

Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
frozen environments (4930)

Performance

- Introduce winloop for windows as an alternative to uvloop (4996)
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
(4996)
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
installation and creation of either a uvloop/winloop evenloop or default eventloop
(4996)

Output

- Emit a clear warning when the target Python version is newer than the running Python
version, since AST safety checks cannot parse newer syntax. Also replace the
misleading "INTERNAL ERROR" message with an actionable error explaining the version
mismatch (4983)

_Blackd_

- Introduce winloop to be used when windows in use which enables blackd to run faster on
windows when winloop is installed. (4996)

Integrations

- Remove unused gallery script (5030)
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
enabled so that only version specifiers are accepted and direct references such as
`black  https://...` are rejected. Users should upgrade to the latest version of the
action as soon as possible. This update is received automatically when using
`psf/blackstable`, and is independent of the version of Black installed by the
action. (5031)

Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
`simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
(4987)
- Add detailed documentation for formatting Jupyter Notebooks (5009)

26.1.0

Highlights

Introduces the 2026 stable style (4892), stabilizing the following changes:

- `always_one_newline_after_import`: Always force one blank line after import
statements, except when the line after the import is a comment or an import statement
(4489)
- `fix_fmt_skip_in_one_liners`: Fix ` fmt: skip` behavior on one-liner declarations,
such as `def foo(): return "mock"  fmt: skip`, where previously the declaration would
have been incorrectly collapsed (4800)
- `fix_module_docstring_detection`: Fix module docstrings being treated as normal
strings if preceded by comments (4764)
- `fix_type_expansion_split`: Fix type expansions split in generic functions (4777)
- `multiline_string_handling`: Make expressions involving multiline strings more compact
(1879)
- `normalize_cr_newlines`: Add `\r` style newlines to the potential newlines to
normalize file newlines both from and to (4710)
- `remove_parens_around_except_types`: Remove parentheses around multiple exception
types in `except` and `except*` without `as` (4720)
- `remove_parens_from_assignment_lhs`: Remove unnecessary parentheses from the left-hand
side of assignments while preserving magic trailing commas and intentional multiline
formatting (4865)
- `standardize_type_comments`: Format type comments which have zero or more spaces
between `` and `type:` or between `type:` and value to ` type: (value)` (4645)

The following change was not in any previous stable release:

- Regenerated the `_width_table.py` and added tests for the Khmer language (4253)

This release alo bumps `pathspec` to v1 and fixes inconsistencies with Git's
`.gitignore` logic (4958). Now, files will be ignored if a pattern matches them, even
if the parent directory is directly unignored. For example, Black would previously
format `exclude/not_this/foo.py` with this `.gitignore`:


exclude/
!exclude/not_this/


Now, `exclude/not_this/foo.py` will remain ignored. To ensure `exclude/not_this/` and
all of it's children are included in formatting (and in Git), use this `.gitignore`:


*/exclude/*
!*/exclude/not_this/


This new behavior matches Git. The leading `*/` are only necessary if you wish to ignore
matching subdirectories (like the previous behavior did), and not just matching root
directories.

Output

- Explicitly shutdown the multiprocessing manager when run in diff mode too (4952)

Integrations

- Upgraded PyPI upload workflow to use Trusted Publishing (4611)

25.12.0

Highlights

- Black no longer supports running with Python 3.9 (4842)

Stable style

- Fix bug where comments preceding ` fmt: off`/` fmt: on` blocks were incorrectly
removed, particularly affecting Jupytext's ` %% [markdown]` comments (4845)
- Fix crash when multiple ` fmt: skip` comments are used in a multi-part if-clause, on
string literals, or on dictionary entries with long lines (4872)
- Fix possible crash when `fmt: ` directives aren't on the top level (4856)

Preview style

- Fix `fmt: skip` skipping the line after instead of the line it's on (4855)
- Remove unnecessary parentheses from the left-hand side of assignments while preserving
magic trailing commas and intentional multiline formatting (4865)
- Fix `fix_fmt_skip_in_one_liners` crashing on `with` statements (4853)
- Fix `fix_fmt_skip_in_one_liners` crashing on annotated parameters (4854)
- Fix new lines being added after imports with ` fmt: skip` on them (4894)

Packaging

- Releases now include arm64 Windows binaries and wheels (4814)

Integrations

- Add `output-file` input to GitHub Action `psf/black` to write formatter output to a
file for artifact capture and log cleanliness (4824)

25.11.0

Highlights

- Enable base 3.14 support (4804)
- Add support for the new Python 3.14 t-string syntax introduced by PEP 750 (4805)

Stable style

- Fix bug where comments between ` fmt: off` and ` fmt: on` were reformatted (4811)
- Comments containing fmt directives now preserve their exact formatting instead of
being normalized (4811)

Preview style

- Move `multiline_string_handling` from `--unstable` to `--preview` (4760)
- Fix bug where module docstrings would be treated as normal strings if preceded by
comments (4764)
- Fix bug where python 3.12 generics syntax split line happens weirdly (4777)
- Standardize type comments to form ` type: <value>` (4645)
- Fix `fix_fmt_skip_in_one_liners` preview feature to respect ` fmt: skip` for compound
statements with semicolon-separated bodies (4800)

Configuration

- Add `no_cache` option to control caching behavior. (4803)

Packaging

- Releases now include arm64 Linux binaries (4773)

Output

- Write unchanged content to stdout when excluding formatting from stdin using pipes
(4610)

_Blackd_

- Implemented BlackDClient. This simple python client allows to easily send formatting
requests to blackd (4774)

Integrations

- Enable 3.14 base CI (4804)
- Enhance GitHub Action `psf/black` to support the `required-version` major-version-only
"stability" format when using pyproject.toml (4770)
- Improve error message for vim plugin users. It now handles independently vim version
- Vim: Warn on unsupported Vim and Python versions independently (4772)
- Vim: Print the import paths when importing black fails (4675)
- Vim: Fix handling of virtualenvs that have a different Python version (4675)

25.9.0

Highlights

- Remove support for pre-python 3.7 `await/async` as soft keywords/variable names
(4676)

Stable style

- Fix crash while formatting a long `del` statement containing tuples (4628)
- Fix crash while formatting expressions using the walrus operator in complex `with`
statements (4630)
- Handle ` fmt: skip` followed by a comment at the end of file (4635)
- Fix crash when a tuple appears in the `as` clause of a `with` statement (4634)
- Fix crash when tuple is used as a context manager inside a `with` statement (4646)
- Fix crash when formatting a `\` followed by a `\r` followed by a comment (4663)
- Fix crash on a `\\r\n` (4673)
- Fix crash on `await ...` (where `...` is a literal `Ellipsis`) (4676)
- Fix crash on parenthesized expression inside a type parameter bound (4684)
- Fix crash when using line ranges excluding indented single line decorated items
(4670)

Preview style

- Fix a bug where one-liner functions/conditionals marked with ` fmt: skip` would still
be formatted (4552)
- Improve `multiline_string_handling` with ternaries and dictionaries (4657)
- Fix a bug where `string_processing` would not split f-strings directly after
expressions (4680)
- Wrap the `in` clause of comprehensions across lines if necessary (4699)
- Remove parentheses around multiple exception types in `except` and `except*` without
`as`. (4720)
- Add `\r` style newlines to the potential newlines to normalize file newlines both from
and to (4710)

Parser

- Rewrite tokenizer to improve performance and compliance (4536)
- Fix bug where certain unusual expressions (e.g., lambdas) were not accepted in type
parameter bounds and defaults. (4602)

Performance

- Avoid using an extra process when running with only one worker (4734)

Integrations

- Fix the version check in the vim file to reject Python 3.8 (4567)
- Enhance GitHub Action `psf/black` to read Black version from an additional section in
pyproject.toml: `[project.dependency-groups]` (4606)
- Build gallery docker image with python3-slim and reduce image size (4686)

Documentation

- Add FAQ entry for windows emoji not displaying (4714)
Links

Update click from 8.1.8 to 8.3.1.

Changelog

8.3.0

--------------

Released 2025-09-17

-   **Improved flag option handling**: Reworked the relationship between ``flag_value``
 and ``default`` parameters for better consistency:

 * The ``default`` parameter value is now preserved as-is and passed directly
   to CLI functions (no more unexpected transformations)
 * Exception: flag options with ``default=True`` maintain backward compatibility
   by defaulting to their ``flag_value``
 * The ``default`` parameter can now be any type (``bool``, ``None``, etc.)
 * Fixes inconsistencies reported in: :issue:`1992` :issue:`2514` :issue:`2610`
   :issue:`3024` :pr:`3030`
-   Allow ``default`` to be set on ``Argument`` for ``nargs = -1``. :issue:`2164`
 :pr:`3030`
-   Show correct auto complete value for ``nargs`` option in combination with flag
 option :issue:`2813`
-   Fix handling of quoted and escaped parameters in Fish autocompletion. :issue:`2995` :pr:`3013`
-   Lazily import ``shutil``. :pr:`3023`
-   Properly forward exception information to resources registered with
 ``click.core.Context.with_resource()``. :issue:`2447` :pr:`3058`
-   Fix regression related to EOF handling in ``CliRunner``. :issue:`2939` :pr:`2940`

8.2.2

-------------

Released 2025-07-31

-   Fix reconciliation of ``default``, ``flag_value`` and ``type`` parameters for
 flag options, as well as parsing and normalization of environment variables.
 :issue:`2952` :pr:`2956`
-   Fix typing issue in ``BadParameter`` and ``MissingParameter`` exceptions for the
 parameter ``param_hint`` that did not allow for a sequence of string where the
 underlying function ``_join_param_hints`` allows for it. :issue:`2777` :pr:`2990`
-   Use the value of ``Enum`` choices to render their default value in help
 screen. Refs :issue:`2911` :pr:`3004`
-   Fix completion for the Z shell (``zsh``) for completion items containing
 colons. :issue:`2703` :pr:`2846`
-   Don't include envvar in error hint when not configured. :issue:`2971` :pr:`2972`
-   Fix a rare race in ``click.testing.StreamMixer``'s finalization that manifested
 as a ``ValueError`` on close in a multi-threaded test session.
 :issue:`2993` :pr:`2991`

8.2.1

-------------

Released 2025-05-20

-   Fix flag value handling for flag options with a provided type. :issue:`2894`
 :issue:`2897` :pr:`2930`
-   Fix shell completion for nested groups. :issue:`2906` :pr:`2907`
-   Flush ``sys.stderr`` at the end of ``CliRunner.invoke``. :issue:`2682`
-   Fix EOF handling for stdin input in CliRunner. :issue:`2787`

8.2.0

-------------

Released 2025-05-10

-   Drop support for Python 3.7, 3.8, and 3.9. :pr:`2588` :pr:`2893`
-   Use modern packaging metadata with ``pyproject.toml`` instead of ``setup.cfg``.
 :pr:`2438`
-   Use ``flit_core`` instead of ``setuptools`` as build backend. :pr:`2543`
-   Deprecate the ``__version__`` attribute. Use feature detection, or
 ``importlib.metadata.version("click")``, instead. :issue:`2598`
-   ``BaseCommand`` is deprecated. ``Command`` is the base class for all
 commands. :issue:`2589`
-   ``MultiCommand`` is deprecated. ``Group`` is the base class for all group
 commands. :issue:`2590`
-   The current parser and related classes and methods, are deprecated.
 :issue:`2205`

 -   ``OptionParser`` and the ``parser`` module, which is a modified copy of
     ``optparse`` in the standard library.
 -   ``Context.protected_args`` is unneeded. ``Context.args`` contains any
     remaining arguments while parsing.
 -   ``Parameter.add_to_parser`` (on both ``Argument`` and ``Option``) is
     unneeded. Parsing works directly without building a separate parser.
 -   ``split_arg_string`` is moved from ``parser`` to ``shell_completion``.

-   Enable deferred evaluation of annotations with
 ``from __future__ import annotations``. :pr:`2270`
-   When generating a command's name from a decorated function's name, the
 suffixes ``_command``, ``_cmd``, ``_group``, and ``_grp`` are removed.
 :issue:`2322`
-   Show the ``types.ParamType.name`` for ``types.Choice`` options within
 ``--help`` message if ``show_choices=False`` is specified.
 :issue:`2356`
-   Do not display default values in prompts when ``Option.show_default`` is
 ``False``. :pr:`2509`
-   Add ``get_help_extra`` method on ``Option`` to fetch the generated extra
 items used in ``get_help_record`` to render help text. :issue:`2516`
 :pr:`2517`
-   Keep stdout and stderr streams independent in ``CliRunner``. Always
 collect stderr output and never raise an exception. Add a new
 output stream to simulate what the user sees in its terminal. Removes
 the ``mix_stderr`` parameter in ``CliRunner``. :issue:`2522` :pr:`2523`
-   ``Option.show_envvar`` now also shows environment variable in error messages.
 :issue:`2695` :pr:`2696`
-   ``Context.close`` will be called on exit. This results in all
 ``Context.call_on_close`` callbacks and context managers added via
 ``Context.with_resource`` to be closed on exit as well. :pr:`2680`
-   Add ``ProgressBar(hidden: bool)`` to allow hiding the progressbar. :issue:`2609`
-   A ``UserWarning`` will be shown when multiple parameters attempt to use the
 same name. :issue:`2396`
-   When using ``Option.envvar`` with ``Option.flag_value``, the ``flag_value``
 will always be used instead of the value of the environment variable.
 :issue:`2746` :pr:`2788`
-   Add ``Choice.get_invalid_choice_message`` method for customizing the
 invalid choice message. :issue:`2621` :pr:`2622`
-   If help is shown because ``no_args_is_help`` is enabled (defaults to ``True``
 for groups, ``False`` for commands), the exit code is 2 instead of 0.
 :issue:`1489` :pr:`1489`
-   Contexts created during shell completion are closed properly, fixing
 a ``ResourceWarning`` when using ``click.File``. :issue:`2644` :pr:`2800`
 :pr:`2767`
-   ``click.edit(filename)`` now supports passing an iterable of filenames in
 case the editor supports editing multiple files at once. Its return type
 is now also typed: ``AnyStr`` if ``text`` is passed, otherwise ``None``.
 :issue:`2067` :pr:`2068`
-   Specialized typing of ``progressbar(length=...)`` as ``ProgressBar[int]``.
 :pr:`2630`
-   Improve ``echo_via_pager`` behaviour in face of errors.
 :issue:`2674`

 -   Terminate the pager in case a generator passed to ``echo_via_pager``
     raises an exception.
 -   Ensure to always close the pipe to the pager process and wait for it
     to terminate.
 -   ``echo_via_pager`` will not ignore ``KeyboardInterrupt`` anymore. This
     allows the user to search for future output of the generator when
     using less and then aborting the program using ctrl-c.

-   ``deprecated: bool | str`` can now be used on options and arguments. This
 previously was only available for ``Command``. The message can now also be
 customised by using a ``str`` instead of a ``bool``. :issue:`2263` :pr:`2271`

 -   ``Command.deprecated`` formatting in ``--help`` changed from
     ``(Deprecated) help`` to ``help (DEPRECATED)``.
 -   Parameters cannot be required nor prompted or an error is raised.
 -   A warning will be printed when something deprecated is used.

-   Add a ``catch_exceptions`` parameter to ``CliRunner``. If
 ``catch_exceptions`` is not passed to ``CliRunner.invoke``, the value
 from ``CliRunner`` is used. :issue:`2817` :pr:`2818`
-   ``Option.flag_value`` will no longer have a default value set based on
 ``Option.default`` if ``Option.is_flag`` is ``False``. This results in
 ``Option.default`` not needing to implement `__bool__`. :pr:`2829`
-   Incorrect ``click.edit`` typing has been corrected. :pr:`2804`
-   ``Choice`` is now generic and supports any iterable value.
 This allows you to use enums and other non-``str`` values. :pr:`2796`
 :issue:`605`
-   Fix setup of help option's defaults when using a custom class on its
 decorator. Removes ``HelpOption``. :issue:`2832` :pr:`2840`
Links

Update coverage from 7.9.2 to 7.13.5.

Changelog

7.13.5

---------------------------

- Fix: `issue 2138`_ describes a memory leak that happened when repeatedly
using the Coverage API with in-memory data. This is now fixed.

- Fix: the markdown-formatted coverage report didn't fully escape special
characters in file paths (`issue 2141`_). This would be very unlikely to
cause a problem, but now it's done properly, thanks to `Ellie Ayla
<pull 2142_>`_.

- Fix: the C extension wouldn't build on VS2019, but now it does (`issue
2145`_).

.. _issue 2138: https://github.com/coveragepy/coveragepy/issues/2138
.. _issue 2141: https://github.com/coveragepy/coveragepy/issues/2141
.. _pull 2142: https://github.com/coveragepy/coveragepy/pull/2142
.. _issue 2145: https://github.com/coveragepy/coveragepy/issues/2145

.. _changes_7-13-4:

7.13.4

---------------------------

- Fix: the third-party code fix in 7.13.3 required examining the parent
directories where coverage was run. In the unusual situation that one of the
parent directories is unreadable, a PermissionError would occur, as
described in `issue 2129`_. This is now fixed.

- Fix: in test suites that change sys.path, coverage.py could fail with
"RuntimeError: Set changed size during iteration" as described and fixed in
`pull 2130`_. Thanks, Noah Fatsi.

- We now publish ppc64le wheels, thanks to `Pankhudi Jain <pull 2121_>`_.

.. _pull 2121: https://github.com/coveragepy/coveragepy/pull/2121
.. _issue 2129: https://github.com/coveragepy/coveragepy/issues/2129
.. _pull 2130: https://github.com/coveragepy/coveragepy/pull/2130


.. _changes_7-13-3:

7.13.3

---------------------------

- Fix: in some situations, third-party code was measured when it shouldn't have
been, slowing down test execution. This happened with layered virtual
environments such as uv sometimes makes. The problem is fixed, closing `issue
2082`_. Now any directory on sys.path that is inside a virtualenv is
considered third-party code.

.. _issue 2082: https://github.com/coveragepy/coveragepy/issues/2082


.. _changes_7-13-2:

7.13.2

---------------------------

- Fix: when Python is installed via symlinks, for example with Homebrew, the
standard library files could be incorrectly included in coverage reports.
This is now fixed, closing `issue 2115`_.

- Fix: if a data file is created with no read permissions, the combine step
would fail completely. Now a warning is issued and the file is skipped.
Closes `issue 2117`_.

.. _issue 2115: https://github.com/coveragepy/coveragepy/issues/2115
.. _issue 2117: https://github.com/coveragepy/coveragepy/issues/2117


.. _changes_7-13-1:

7.13.1

---------------------------

- Added: the JSON report now includes a ``"start_line"`` key for function and
class regions, indicating the first line of the region in the source. Closes
`issue 2110`_.

- Added: The ``debug data`` command now takes file names as arguments on the
command line, so you can inspect specific data files without needing to set
the ``COVERAGE_FILE`` environment variable.

- Fix: the JSON report used to report module docstrings as executed lines,
which no other report did, as described in `issue 2105`_. This is now fixed,
thanks to Jianrong Zhao.

- Fix: coverage.py uses a more disciplined approach to detecting where
third-party code is installed, and avoids measuring it. This shouldn't change
any behavior. If you find that it does, please get in touch.

- Performance: data files that will be combined now record their hash as part
of the file name. This lets us skip duplicate data more quickly, speeding the
combining step.

- Docs: added a section explaining more about what is considered a missing
branch and how it is reported: :ref:`branch_explain`, as requested in `issue
1597`_. Thanks to `Ayisha Mohammed <pull 2092_>`_.

- Tests: the test suite misunderstood what core was being tested if
``COVERAGE_CORE`` wasn't set on 3.14+. This is now fixed, closing `issue
2109`_.

.. _issue 1597: https://github.com/coveragepy/coveragepy/issues/1597
.. _pull 2092: https://github.com/coveragepy/coveragepy/pull/2092
.. _issue 2105: https://github.com/coveragepy/coveragepy/issues/2105
.. _issue 2109: https://github.com/coveragepy/coveragepy/issues/2109
.. _issue 2110: https://github.com/coveragepy/coveragepy/issues/2110


.. _changes_7-13-0:

7.13.0

---------------------------

- Feature: coverage.py now supports :file:`.coveragerc.toml` configuration
files. These files use TOML syntax and take priority over
:file:`pyproject.toml` but lower priority than :file:`.coveragerc` files.
Closes `issue 1643`_ thanks to `Olena Yefymenko <pull 1952_>`_.

- Fix: we now include a permanent .pth file which is installed with the code,
fixing `issue 2084`_.  In 7.12.1b1 this was done incorrectly: it didn't work
when using the source wheel (``py3-none-any``).  This is now fixed. Thanks,
`Henry Schreiner <pull 2100_>`_.

- Deprecated: when coverage.py is installed, it creates three command entry
points: ``coverage``, ``coverage3``, and ``coverage-3.10`` (if installed for
Python 3.10). The second and third of these are not needed and will
eventually be removed. They still work for now, but print a message about
their deprecation.

.. _issue 1643: https://github.com/coveragepy/coveragepy/issues/1643
.. _pull 1952: https://github.com/coveragepy/coveragepy/pull/1952
.. _pull 2100: https://github.com/coveragepy/coveragepy/pull/2100


.. _changes_7-12-1b1:

7.12.1b1

-----------------------------

- Fix: coverage.py now includes a permanent .pth file in the distribution which
is installed with the code. This fixes `issue 2084`_: failure to patch for
subprocess measurement when site-packages is not writable.

.. _issue 2084: https://github.com/coveragepy/coveragepy/issues/2084


.. _changes_7-12-0:

7.12.0

---------------------------

- The HTML report now shows separate coverage totals for statements and
branches, as well as the usual combined coverage percentage. Thanks to Ryuta
Otsuka for the `discussion <issue 2081_>`_ and the `implementation
<pull 2085_>`_.

- The JSON report now includes separate coverage totals for statements and
branches, thanks to `Ryuta Otsuka <pull 2090_>`_.

- Fix: ``except*`` clauses were not handled properly under the "sysmon"
measurement core, causing KeyError exceptions as described in `issue 2086`_.
This is now fixed.

- Fix: we now defend against aggressive mocking of ``open()`` that could cause
errors inside coverage.py.  An example of a failure is in `issue 2083`_.

- Fix: in unusual cases where a test suite intentionally exhausts the system's
file descriptors to test handling errors in ``open()``, coverage.py would
fail when trying to open source files, as described in `issue 2091`_.  This
is now fixed.

- A small tweak to the HTML report: file paths now use thin spaces around
slashes to make them easier to read.

.. _issue 2081: https://github.com/coveragepy/coveragepy/issues/2081
.. _issue 2083: https://github.com/coveragepy/coveragepy/issues/2083
.. _pull 2085: https://github.com/coveragepy/coveragepy/pull/2085
.. _issue 2086: https://github.com/coveragepy/coveragepy/issues/2086
.. _pull 2090: https://github.com/coveragepy/coveragepy/pull/2090
.. _issue 2091: https://github.com/coveragepy/coveragepy/issues/2091


.. _changes_7-11-3:

7.11.3

---------------------------

- Fix: the 7.11.1 changes meant that conflicts between a requested measurement
core and other settings would raise an error. This was a breaking change from
previous behavior, as reported in `issue 2076`_ and `issue 2078`_.

The previous behavior has been restored: when the requested core conflicts
with other settings, another core is used instead, and a warning is issued.

- For contributors: the repo has moved from Ned's `nedbat GitHub account`_ to
the `coveragepy GitHub organization`_. The default branch has changed from
master to main.

.. _issue 2076: https://github.com/coveragepy/coveragepy/issues/2076
.. _issue 2078: https://github.com/coveragepy/coveragepy/issues/2078
.. _nedbat GitHub account: https://github.com/nedbat
.. _coveragepy GitHub organization: https://github.com/coveragepy


.. _changes_7-11-2:

7.11.2

---------------------------

- Fix: using the "sysmon" measurement core in 7.11.1, if Python code was
claimed to come from a non-Python file, a ``NotPython`` exception could be
raised. This could happen for example with Jinja templates compiled to
Python, as reported in `issue 2077`_. This is now fixed.

- Doc: corrected the first entry in the 7.11.1 changelog.

.. _issue 2077: https://github.com/coveragepy/coveragepy/issues/2077


.. _changes_7-11-1:

7.11.1

---------------------------

- Fix: some chanages to details of how the measurement core is chosen, and how
conflicting settings are handled. The "sysmon" core cannot be used with some
concurrency settings, with dynamic context, and in Python 3.12/3.13, with
branch measurement.

- If the core is not specified and defaults to "sysmon" (Python 3.14+), but
 other settings conflict with sysmon, then the "ctrace" core will be used
 instead with no warning. For concurrency conflicts, this used to produce an
 error, as described in `issue 2064`_.

- If the "sysmon" core is explicitly requested in your configuration, but
 other settings conflict, an error is now raised. This used to produce a
 warning.

- Fix: some multi-line case clauses or for loops (and probably other
constructs) could cause incorrect claims of missing branches with the
sys.monitoring core, as described in `issue 2070`_. This is now fixed.

- Fix: when running in pytest under coverage, a ``breakpoint()`` would stop in
the wrong frame, one level down from where it should, as described in `issue
1420`_. This was due to a coverage change in v6.4.1 that seemed to give a
slight performance improvement, but I couldn't reproduce the performance
gain, so it's been reverted, fixing the debugger problem.

- A new debug option ``--debug=core`` shows which core is in use and why.

- Split ``sqlite`` debugging information out of the ``sys`` :ref:`coverage
debug <cmd_debug>` and :ref:`cmd_run_debug` options since it's bulky and not
very useful.

- Updated the :ref:`howitworks` page to better describe the three different
measurement cores.

.. _issue 1420: https://github.com/coveragepy/coveragepy/issues/1420
.. _issue 2064: https://github.com/coveragepy/coveragepy/issues/2064
.. _issue 2070: https://github.com/coveragepy/coveragepy/issues/2070


.. _changes_7-11-0:

7.11.0

---------------------------

- Dropped support for Python 3.9, declared support for Python 3.15 alpha.


.. _changes_7-10-7:

7.10.7

---------------------------

- Performance: with branch coverage in large files, generating HTML, JSON, or
LCOV reports could take far too long due to some quadratic behavior when
creating the function and class index pages.  This is now fixed, closing
`issue 2048`_.  Thanks to Daniel Diniz for help diagnosing the problem.

- Most warnings and a few errors now have links to a page in the docs
explaining the specific message.  Closes `issue 1921`_.

.. _issue 1921: https://github.com/coveragepy/coveragepy/issues/1921
.. _issue 2048: https://github.com/coveragepy/coveragepy/issues/2048


.. _changes_7-10-6:

7.10.6

---------------------------

- Fix: ``source`` directories were not properly communicated to subprocesses
that ran in different directories, as reported in `issue 1499`_.  This is now
fixed.

- Performance: `Alex Gaynor continues fine-tuning <pull 2038_>`_ the speed of
combination, especially with many contexts.

.. _issue 1499: https://github.com/coveragepy/coveragepy/issues/1499
.. _pull 2038: https://github.com/coveragepy/coveragepy/pull/2038


.. _changes_7-10-5:

7.10.5

---------------------------

- Big speed improvements for ``coverage combine``: it's now about twice as
fast! Huge thanks to Alex Gaynor for pull requests `2032 <pull 2032_>`_,
`2033 <pull 2033_>`_, and `2034 <pull 2034_>`_.

.. _pull 2032: https://github.com/coveragepy/coveragepy/pull/2032
.. _pull 2033: https://github.com/coveragepy/coveragepy/pull/2033
.. _pull 2034: https://github.com/coveragepy/coveragepy/pull/2034


.. _changes_7-10-4:

7.10.4

---------------------------

- Added ``patch = fork`` for times when the built-in forking support is
insufficient.

- Fix: ``patch = execv`` also inherits the entire coverage configuration now.


.. _changes_7-10-3:

7.10.3

---------------------------

- Fixes for ``patch = subprocess``:

- If subprocesses spawned yet more subprocesses simultaneously, some coverage
 could be missed.  This is now fixed, closing `issue 2024`_.

- If subprocesses were created in other directories, their data files were
 stranded there and not combined into the totals, as described in `issue
 2025`_.  This is now fixed.

- On Windows (or maybe only some Windows?) the patch would fail with a
 ``ModuleNotFound`` error trying to import coverage.  This is now fixed,
 closing `issue 2022`_.

- Originally only options set in the coverage configuration file would apply
 to subprocesses.  Options set on the ``coverage run`` command line (such as
 ``--branch``) wouldn't be communicated to the subprocesses.  This could
 lead to combining failures, as described in `issue 2021`_. Now the entire
 configuration is used in subprocesses, regardless of its origin.

- Added ``debug=patch`` to help diagnose problems.

- Fix: really close all SQLite databases, even in-memory ones. Closes `issue
2017`_.

.. _issue 2017: https://github.com/coveragepy/coveragepy/issues/2017
.. _issue 2021: https://github.com/coveragepy/coveragepy/issues/2021
.. _issue 2022: https://github.com/coveragepy/coveragepy/issues/2022
.. _issue 2024: https://github.com/coveragepy/coveragepy/issues/2024
.. _issue 2025: https://github.com/coveragepy/coveragepy/issues/2025


.. _changes_7-10-2:

7.10.2

---------------------------

- Fix: some code with NOP bytecodes could report missing branches that are
actually executed. This is now fixed, closing `issue 1999`_. Python 3.9
still shows the problem.

.. _issue 1999: https://github.com/coveragepy/coveragepy/issues/1999


.. _changes_7-10-1:

7.10.1

---------------------------

- Fix: the exclusion for ``if TYPE_CHECKING:`` was wrong: it marked the branch
as partial, but it should have been a line exclusion so the entire clause
would be excluded. Improves `issue 831`_.

- Fix: changed where .pth files are written for ``patch = subprocess``, closing
`issue 2006`_.

.. _issue 2006: https://github.com/coveragepy/coveragepy/issues/2006


.. _changes_7-10-0:

7.10.0

---------------------------

- A new configuration option: ":ref:`config_run_patch`" specifies named patches
to work around some limitations in coverage measurement.  These patches are
available:

- ``patch = _exit`` lets coverage save its data even when :func:`os._exit()
 <python:os._exit>` is used to abruptly end the process.  This closes
 long-standing `issue 310`_ as well as its duplicates: `issue 312`_, `issue
 1673`_, `issue 1845`_, and `issue 1941`_.

- ``patch = subprocess`` measures coverage in Python subprocesses created
 with :mod:`subprocess`, :func:`os.system`, or one of the :func:`execv
 <python:os.execl>` or :func:`spawnv <python:os.spawnl>` family of
 functions. Closes old `issue 367`_, its duplicate `issue 378`_ and old
 `issue 689`_.

- ``patch = execv`` adjusts the :func:`execv <python:os.execl>` family of
 functions to save coverage data before ending the current program and
 starting the next. Not available on Windows. Closes `issue 43`_ after 15
 years!

- The HTML report now dimly colors subsequent lines in multi-line statements.
They used to have no color.  This gives a better indication of the amount of
code missing in the report.  Closes `issue 1308`_.

- Two new exclusion patterns are part of the defaults: ``...`` is automatically
excluded as a line and ``if TYPE_CHECKING:`` is excluded as a branch.  Closes
`issue 831`_.

- A new command-line option: ``--save-signal=USR1`` specifies a signal that
coverage.py will listen for.  When the signal is sent, the coverage data will
be saved.  This makes it possible to save data from within long-running
processes.  Thanks, `Arkady Gilinsky <pull 1998_>`_.

- A new configuration option: ":ref:`config_report_partial_also`" is a list of
regexes to add as pragmas for partial branches.  This parallels the
":ref:`config_report_exclude_also`" setting for adding line exclusion
patterns.

- A few file path configuration settings didn't allow for tilde expansion:
:ref:`config_json_output`, :ref:`config_lcov_output` and
:ref:`config_run_debug_file`.  This is now fixed.

- Wheels are included for 3.14 now that 3.14 rc1 is available.

- We no longer ship a PyPy-specific wheel. PyPy will install the pure-Python
wheel.  Closes `issue 2001`_.

- In the very unusual situation of not having a current frame, coverage no
longer crashes when using the sysmon core, fixing `issue 2005`_.

.. _issue 43: https://github.com/coveragepy/coveragepy/issues/43
.. _issue 310: https://github.com/coveragepy/coveragepy/issues/310
.. _issue 312: https://github.com/coveragepy/coveragepy/issues/312
.. _issue 367: https://github.com/coveragepy/coveragepy/issues/367
.. _issue 378: https://github.com/coveragepy/coveragepy/issues/378
.. _issue 689: https://github.com/coveragepy/coveragepy/issues/689
.. _issue 831: https://github.com/coveragepy/coveragepy/issues/831
.. _issue 1308: https://github.com/coveragepy/coveragepy/issues/1308
.. _issue 1673: https://github.com/coveragepy/coveragepy/issues/1673
.. _issue 1845: https://github.com/coveragepy/coveragepy/issues/1845
.. _issue 1941: https://github.com/coveragepy/coveragepy/issues/1941
.. _pull 1998: https://github.com/coveragepy/coveragepy/pull/1998
.. _issue 2001: https://github.com/coveragepy/coveragepy/issues/2001
.. _issue 2005: https://github.com/coveragepy/coveragepy/issues/2005

.. _changes_7-9-2:
Links

Update iniconfig from 2.1.0 to 2.3.0.

Changelog

2.2.0

=====

* drop Python 3.8 and 3.9 support (now requires Python >= 3.10)
* add Python 3.14 classifier
* migrate from hatchling to setuptools 77 with setuptools_scm
* adopt PEP 639 license specifiers and PEP 740 build attestations
* migrate from black + pyupgrade to ruff
* migrate CI to uv and unified test workflow
* automate GitHub releases and PyPI publishing via Trusted Publishing
* include tests in sdist
* modernize code for Python 3.10+ (remove __future__ annotations, TYPE_CHECKING guards)
* rename _ParsedLine to ParsedLine
Links

Update isort from 6.0.1 to 8.0.1.

Changelog

8.0.0

- Removed `--old-finders` and `--magic-placement` flags and `old_finders` configuration option. The legacy finder logic that relied on environment introspection has been removed (2445) joao-faria-dev
- Update the `plone` profile to not clash with `black` (2456) ale-rt

6.1.0

- Add python 3.14 classifier and badge (2409) staticdev
- Drop use of non-standard pkg_resources API (2405) dvarrazzo
Links

Update mypy from 1.17.0 to 1.19.1.

Changelog

1.19.1

- Fix noncommutative joins with bounded TypeVars (Shantanu, PR [20345](https://github.com/python/mypy/pull/20345))
- Respect output format for cached runs by serializing raw errors in cache metas (Ivan Levkivskyi, PR [20372](https://github.com/python/mypy/pull/20372))
- Allow `types.NoneType` in match cases (A5rocks, PR [20383](https://github.com/python/mypy/pull/20383))
- Fix mypyc generator regression with empty tuple (BobTheBuidler, PR [20371](https://github.com/python/mypy/pull/20371))
- Fix crash involving Unpack-ed TypeVarTuple (Shantanu, PR [20323](https://github.com/python/mypy/pull/20323))
- Fix crash on star import of redefinition (Ivan Levkivskyi, PR [20333](https://github.com/python/mypy/pull/20333))
- Fix crash on typevar with forward ref used in other module (Ivan Levkivskyi, PR [20334](https://github.com/python/mypy/pull/20334))
- Fail with an explicit error on PyPy (Ivan Levkivskyi, PR [20389](https://github.com/python/mypy/pull/20389))

Acknowledgements

Thanks to all mypy contributors who contributed to this release:
- A5rocks
- BobTheBuidler
- bzoracler
- Chainfire
- Christoph Tyralla
- David Foster
- Frank Dana
- Guo Ci
- iap
- Ivan Levkivskyi
- James Hilton-Balfe
- jhance
- Joren Hammudoglu
- Jukka Lehtosalo
- KarelKenens
- Kevin Kannammalil
- Marc Mueller
- Michael Carlstrom
- Michael J. Sullivan
- Piotr Sawicki
- Randolf Scholz
- Shantanu
- Sigve Sebastian Farstad
- sobolevn
- Stanislav Terliakov
- Stephen Morton
- Theodore Ando
- Thiago J. Barbalho
- wyattscarpenter

I’d also like to thank my employer, Dropbox, for supporting mypy development.

1.19

We’ve just uploaded mypy 1.19.0 to the Python Package Index ([PyPI](https://pypi.org/project/mypy/)).
Mypy is a static type checker for Python. This release includes new features, performance
improvements and bug fixes. You can install it as follows:

 python3 -m pip install -U mypy

You can read the full documentation for this release on [Read the Docs](http://mypy.readthedocs.io).

Python 3.9 Support Ending Soon

This is the last mypy feature release that supports Python 3.9, which reached
end of life in October 2025.

Performance Improvements
- Switch to a more dynamic SCC processing logic (Ivan Levkivskyi, PR [200

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant