chore(deps): update all dependencies #9

Merged
finkregh merged 1 commit from renovate/all into main 2026-07-30 16:28:03 +00:00
Collaborator

This PR contains the following updates:

Package Type Update Change
https://code.forgejo.org/actions/checkout action digest de0fac2fbc6f39
hyperloglog project.dependencies patch 0.1.50.1.8
mypy (changelog) project.optional-dependencies minor 2.1.02.3.0
numpy (changelog) project.dependencies minor 2.4.62.5.1
pytest (changelog) project.optional-dependencies minor 9.0.39.1.1
pytest (changelog) dependency-groups minor 9.0.39.1.1
ruff (source, changelog) project.optional-dependencies minor 0.15.140.16.0
ruff (source, changelog) dependency-groups minor 0.15.140.16.0
ty (changelog) dependency-groups patch 0.0.390.0.65
typer (changelog) project.dependencies minor 0.25.10.27.0

Release Notes

python/mypy (mypy)

v2.3.0

Compare Source

v2.2.0

Compare Source

numpy/numpy (numpy)

v2.5.1: (July 4, 2026)

Compare Source

NumPy 2.5.1 Release Notes

The NumPy 2.5.1 is a patch release that fixes bugs discovered after the 2.5.0
release. The most noticeable is the fix is to the numpy datetime cython API
which should allow downstream to support NumPy versions older than 2.5.
Preparation for Python 3.15 continues along with typing improvements.

This release supports Python versions 3.12-3.14

Changes

  • The minimum supported GCC version has been updated from 9.3.0 to 10.3.0

    (gh-31843)

Contributors

A total of 10 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.

  • Adhyan Gupta +
  • Ankit Ahlawat
  • Charles Harris
  • Iason Krommydas
  • Joren Hammudoglu
  • Kumar Aditya
  • Nathan Goldbaum
  • Sebastian Berg
  • Ties Jan Hefting +
  • Vineet Kumar

Pull requests merged

A total of 20 pull requests were merged for this release.

  • #​31707: MAINT: Prepare 2.5.x for further development
  • #​31721: CI: fix new cython-lint errors (#​31711)
  • #​31723: MAINT: Update meson to match main
  • #​31729: TST: use setup-sde instead of curl to get SDE binaries (#​31727)
  • #​31829: BUG: Relax finfo to be easier accessible for all user dtypes...
  • #​31831: TYP: Fix flatiter.__next__ return type for object_ and...
  • #​31832: BUG: avoid deadlocks using NpyString API (#​31682)
  • #​31833: BUG: fix out array leak in reduceat and accumulate when dtype...
  • #​31835: BUG: fix numpy datetime cython APIs to be compatible with older...
  • #​31836: TYP: Fix incorrect dtype inference of asarray([]) (#​31732)
  • #​31837: TYP: Fix np.ma.masked_array 2.5.0 regression
  • #​31838: FIX: Refactor error handling in array_setstate to prevent typecode...
  • #​31839: TST: xfail multithreaded BLAS test more generously
  • #​31840: MAINT: Rename subroutine for crackfortran tests
  • #​31842: BUG: fix leak in reductions when a ufunc override errors or is...
  • #​31849: BLD: set minimum required gcc version to 10.3 (#​31843)
  • #​31855: CI: fix hangs on MacOS ASan CI (#​31853)
  • #​31856: BUG: fix several bugs in StringDType operations (#​31846)
  • #​31857: BUG: Fix segfault in MT19937 by preventing recursive seed lists...
  • #​31858: BUG: Fix signed integer overflow in datetime.c (#​31688)

v2.5.0: (June 21, 2026)

Compare Source

NumPy 2.5.0 Release Notes

Numpy 2.5.0 is a transitional release. It drops support for Python 3.11,
marking the end of distutils, and expires a large number of deprecations made
in the 2.0.x release. It also improves free threading and brings sorting into
compliance with the array-api standard with the addition of descending sorts.
There is also a fair amount of preparation for Python 3.15, which will be
supported starting with the first rc.

This release supports Python versions 3.12-3.14.

Highlights

  • Distutils has been removed,
  • Many expired deprecations, see below,
  • Many new deprecations, see below,
  • Many static typing improvements.
  • Improved support for free threading,
  • Support for descending sorts,

See New Features below for other additions.

Deprecations

  • numpy.char.chararray is deprecated. Use an ndarray with a string or bytes dtype instead.

    (gh-30605)

  • numpy.take now correctly checks if the result can be cast to the provided
    out=out under the same-kind rule. A DeprecationWarning is given now
    when this check fails. Previously, take incorrectly checked if out
    could be cast to the result (the wrong direction). This deprecation also
    affects compress and possibly other functions. (Future versions of NumPy
    may tighten the casting check further.)

    (gh-30615)

  • The numpy.char.[as]array functions are deprecated. Use an
    numpy.[as]array with a string or bytes dtype instead.

    (gh-30802)

  • Setting the dtype attribute is deprecated because mutating an array is unsafe
    if an array is shared, especially by multiple threads. As an alternative,
    you can create a view with a new dtype via array.view(dtype=new_dtype).

    (gh-29244)

  • Setting the shape attribute is deprecated because mutating an array is
    unsafe if an array is shared, especially by multiple threads. As an
    alternative, you can create a new view via np.reshape or
    np.ndarray.reshape. For example: x = np.arange(15); x = np.reshape(x, (3, 5)).
    To ensure no copy is made from the data, one can use np.reshape(..., copy=False).

    While setting the shape on an array is discouraged, for cases where it is
    difficult to work around, e.g., in __array_finalize__, it is possible
    with the private method np.ndarray._set_shape.

    (gh-29536)

  • Using the generic unit in numpy.timedelta64 is deprecated since this
    can lead to unexpected behavior such as non-transitive comparison, see
    gh-28287 for details. As
    an alternative, specify an explicit unit such as 's' (seconds) or 'D'
    (days) when constructing numpy.timedelta64. Due to this change, operations
    that implicitly rely on the generic unit are also deprecated. For
    example:

    arr = np.array([1, 2, 3], dtype="m8[s]")
    

1 is implicitly converted to generic timedelta64

  arr + 1

(gh-29619)

  • Resizing a Numpy array in place is deprecated since mutating an array is
    unsafe if an array is shared, especially by multiple threads. As an
    alternative, you can create a resized array via np.resize.

    (gh-30181)

  • numpy.fix is deprecated, use numpy.trunc instead. It is faster and
    follows the Array API standard. Both functions provide identical
    functionality: rounding array elements towards zero.

    (gh-30644)

  • numpy.ma.round_ is deprecated. numpy.ma.round can be used as a
    replacement.

    (gh-30738)

  • numpy.typename is deprecated because the names returned by it were
    outdated and inconsistent. numpy.dtype.name can be used as a
    replacement.

    (gh-30774)

  • Inputs other than integers are deprecated for numpy.triu_indices and
    numpy.tril_indices. Non-integer values for the M, k and N
    parameters of numpy.tri are deprecated. Non-integer values for the k
    parameter of both numpy.tril_indices_from and numpy.triu_indices_from
    are deprecated.

    (gh-30869)

  • Deprecations in custom dtype property and __array_finalize__.

    Previously arr.view(dtype=new_dtype) called arr.dtype = new_dtype
    also for subclasses, i.e., the attribute setting. That path is now
    deprecated and refined, meaning that even subclasses that do not see this
    DeprecationWarning may wish to update their code.

    A subclass that does any dtype specific logic (i.e. verifying the dtype
    in __array_finalize__ or has a dtype property) should now:

    • Set _set_dtype = None in which case arr.view(dtype=new_dtype)
      will call __array_finalize__ with the new dtype, ensuring that
      any validation __array_finalize__ will run is done.
    • Or, for a quick fix, define _set_dtype as a function (calling
      ndarray._set_dtype() to avoid DeprecationWarnings.
      (Future versions might migrate towards the _set_dtype = None path.)

    Ideally, follow NumPy's deprecation to prevent dtype mutation by users.
    The use of ndarray._set_dtype() may be necessary for some subclass
    finalization patterns, but should otherwise be avoided.

    (gh-31293)

Expired deprecations

  • numpy.distutils has been removed

    (gh-30340)

  • Passing None as dtype to np.finfo will now raise a TypeError
    (deprecated since 1.25)

    (gh-30460)

  • numpy.cross no longer supports 2-dimensional vectors.
    (Deprecated since 2.0)

    (gh-30461)

  • numpy._core.numerictypes.maximum_sctype has been removed.
    (deprecated since 2.0)

    (gh-30462)

  • numpy.row_stack has been removed in favor of numpy.vstack.
    (deprecated since 2.0)

    (gh-30463)

  • get_array_wrap has been removed.
    (deprecated since 2.0)

    (gh-30463)

  • recfromtxt and recfromcsv have been removed from numpy.lib._npyio
    in favor of numpy.genfromtxt.
    (deprecated since 2.0)

    (gh-30467)

  • The numpy.chararray re-export of numpy.char.chararray has been removed.
    (deprecated since 2.0)

    (gh-30604)

  • bincount now raises a TypeError for non-integer inputs.
    (deprecated since 2.1)

    (gh-30610)

  • The numpy.lib.math alias for the standard library math module has
    been removed.
    (deprecated since 1.25)

    (gh-30612)

  • Data type alias 'a' was removed in favor of 'S'.
    (deprecated since 2.0)

    (gh-30613)

  • _add_newdoc_ufunc(ufunc, newdoc) has been removed in favor of
    ufunc.__doc__ = newdoc.
    (deprecated since 2.2)

    (gh-30614)

Compatibility notes

linalg.eig and linalg.eigvals now always return complex arrays

Previously, the return values depended on whether the eigenvalues happen to lie
on the real line (which, for a general, non-symmetric matrix, is not
guaranteed).

This change makes consistent what was a value-dependent result. To retain the
previous behavior, do:

w = eigvals(a)
if np.any(w.imag == 0):  # this is what NumPy used to do
    w = w.real

If your matrix is symmetrix/hermitian, use eigh and eigvalsh instead of
eig and eigvals. These are guaranteed to return real values. A common
case is covariance matrices, which are symmetric and positive definite by
construction.

(gh-30411)

MSVC support

NumPy now requires minimum MSVC 19.35 toolchain version on Windows platforms.
This corresponds to Visual Studio 2022 version 17.5 Preview 2 or newer.

(gh-30489)

Cython support

NumPy's Cython headers (accessed via cimport numpy) now require Cython 3.0
or newer to build. If you try to compile a project that depends on NumPy's
Cython headers using Cython 0.29 or older, you will see a message like this:

Error compiling Cython file:
------------------------------------------------------------
...

versions.


#

See init.cython-30.pxd for the real Cython header


#

DEF err = int('Build aborted: the NumPy Cython headers require Cython 3.0.0 or newer.')
  ------------------------------------------------------------

  /path/to/site-packages/numpy/__init__.pxd:11:13: Error in compile-time expression:
  ValueError: invalid literal for int() with base 10: 
  'Build aborted: the NumPy Cython headers require Cython 3.0.0 or newer.'

Note that the invalid integer is not a bug in NumPy - we are intentionally
generating this error to avoid triggering a more obscure error later in the
build when an older Cython version tries to use a Cython feature that was not
available in the old Cython version.

(gh-30770)

numpy.where no longer truncates Python integers

Previously, if the x or y argument of numpy.where was a Python
integer that was out of range of the output type, it would be silently
truncated. Now, an OverflowError will be raised instead.

This change also applies to the underlying C API function PyArray_Where.

(gh-30803)

Default memory allocator change

NumPy now uses PyMem_RawMalloc and PyMem_RawFree as the default memory
allocator, instead of system's malloc and free directly.

(gh-30846)

from_dlpack raises BufferError instead of RuntimeError

np.from_dlpack now raises BufferError instead of RuntimeError when
the incoming DLPack tensor has an unsupported device, dtype, or exceeds the
maximum number of dimensions. This aligns with the DLPack and Array API
specifications, which recommend BufferError for data that cannot be
imported.

(gh-30937)

Corrections to the BTPE binomial sampler

Two independent errors in the Stirling series of the acceptance/rejection step
of the BTPE algorithm used by numpy.random.Generator.binomial have been
corrected:

  • The third and fourth error terms were added rather than subtracted. This sign
    error was inherited from section 5.3 of the original 1988 paper by
    Kachitvichyanukul & Schmeiser, which incorrectly adds all four terms.
  • The leading coefficient had a digit-swap typo (13680 instead of
    13860) that was introduced in the initial implementation.

As a result, Generator.binomial and Generator.multinomial, which uses
binomial internally, may now return different samples for the same seed.

The legacy numpy.random.RandomState.binomial and
numpy.random.RandomState.multinomial are not affected: they preserve the
original (incorrect) behavior, so existing streams remain reproducible.

(gh-31238)

datetime64/timedelta64 arithmetic raises on overflow

Addition, subtraction, and integer multiplication of datetime64 and
timedelta64 values now raise OverflowError when the result would
overflow int64 or land on the NaT sentinel value. Previously these
operations silently wrapped, often producing a value that was indistinguishable
from NaT. This matches the overflow checking already performed by
unit-conversion casts.

(gh-31378)

C API changes

  • It is now possible to register "real" and "imag" ArrayMethods via
    PyUFunc_AddLoopsFromSpecs. These will be used for imag and real
    and should normally set *view_offset in their resolve_descriptors
    function to allow the array attributes to return views.

    (gh-30984)

  • New PyDataType_TYPE, PyDataType_KIND, PyDataType_BYTEORDER and
    PyDataType_TYPEOBJ accessor macros to the C API. Together with the other
    accessor macros added for the NumPy 2.0 transition, these allow accessing the
    fields of PyArray_Descr structs without any direct field accesses.

    (gh-30994)

  • NumPy now supports the stable ABI for free-threaded Python as described in
    803{.interpreted-text role="pep"}.

    (gh-31091)

  • PyArray_DescrFromScalar now returns the full dtype descriptor for scalars
    of user-defined parametric data types, including any dtype parameters.
    Parameters were previously silently discarded, which could cause incorrect
    results in operations like astype on scalar objects. Internally, the
    function now delegates to discover_descr_from_pyobject, which handles
    parametric dtypes correctly.

    (gh-31067)

New Features

  • It is now possible to register user-dtypes for dlpack export and import
    via numpy.dtypes.register_dlpack_dtype. This functionality is meant to
    be used with care by user-dtype authors.

    (gh-31256)

Pixi package definitions

Pixi package definitions have been added for different kinds
of from-source builds of NumPy. These can be used in
downstream Pixi workspaces via the pixi-build feature.

Definitions for both default and AddressSanitizer-instrumented
(asan) builds are available in the source code under the
pixi-packages/ directory.

linux-64 and osx-arm64 platforms are supported.

(gh-30381)

numpy.ndarray now supports structural pattern matching

numpy.ndarray and its subclasses now have the Py_TPFLAGS_SEQUENCE flag
set, enabling structural pattern matching (PEP 634) with match/case
statements. This also enables Cython to optimize integer indexing operations.
See `arrays.ndarray.pattern-matching{.interpreted-text role="ref"}` for details.

(gh-30653)

Added N-D evaluation functions to the polynomial package

New functions polyvalnd, chebvalnd, legvalnd, hermvalnd,
hermevalnd, and lagvalnd have been added to evaluate polynomials
in arbitrary dimensions, analogous to the existing 2D and 3D evaluators.

(gh-30857)

New "descending" keyword argument for numpy.sort and numpy.argsort

Users can now pass the descending=True keyword argument to numpy.sort
and numpy.argsort to sort and argsort arrays in descending order. NaN
values, if present, are sorted to the end of the array in both ascending and
descending sorts. This feature is available for all built-in dtypes except
void, object, and generic. Note that SIMD optimizations for sorting
are currently not available for descending sorts, so performance may be slower.

(gh-31345)

Improvements

For f2py, the behaviour of intent(inplace) has improved. Previously,
if an input array did not have the right dtype or order, the input array was
modified in-place, changing its dtype and replacing its data by a corrected
copy. Now, instead, the corrected copy is kept a separate array, which, after
being passed and presumably modified by the fortran routine, is copied back to
the input routine. The above means one no longer has the risk that
pre-existing views or slices of the input array start pointing to unallocated
memory (at the price of increased overhead for the write-back copy at the end
of the call).

A potential problem would be that one might get very different results if one,
e.g., previously passed in an integer array where a double array was expected:
the writeback to integer would likely give wrong results. To avoid such
situations, intent(inplace) will now only allow arrays that have equivalent
type to that used in the fortran routine, i.e., dtype.kind is the same. For
instance, a routine expecting double would be able to receive float, but would
raise on integer input.

(gh-29929)

f2py modules now show allocatable arrays in dir()

Allocatable module variables wrapped by f2py now appear in dir()
output, matching their accessibility by name.

(gh-30965)

StringDType comparisons now correctly handle embedded NULL bytes.

(gh-31662)

Performance improvements and changes

Improved performance of numpy.searchsorted

The C++ binary search implementation used by numpy.searchsorted now has a
much better performance when searching for multiple keys. The new
implementation batches binary search steps across all keys to leverage cache
locality and out-of-order execution. Benchmarks show the new implementation can
be up to 20 times faster for hundreds of thousands keys while single-key
performance remains comparable to previous versions.

(gh-30517)

Improved scaling of ufuncs on free-threading

NumPy's ufuncs now scale significantly better on free-threading builds
of CPython due to the following optimizations:

  • Lock-free dispatch table: The ufuncs dispatch table is now implemented as
    a lock-free concurrent hash map, allowing multiple threads to call ufuncs
    without contention.
  • Immortal shared objects: Certain shared objects, such as global memory
    handlers, have been made immortal. This effectively reduces reference
    counting contention across threads.
  • Optimized memory allocation: NumPy now utilizes PyMem_RawMalloc and
    PyMem_RawFree for memory allocation. On Python 3.15 and newer, this
    leverages mimalloc and significantly reduces memory allocation overhead
    in multi-threaded workloads.

(gh-30846)

Faster reductions on small/medium contiguous arrays

numpy.sum, numpy.prod, numpy.any, numpy.all, and other
reductions with an identity value now use a fast path when the input is a
contiguous, aligned, non-object array and the reduction covers all axes
(axis=None) with no special arguments. Typical speedup is ~1.3x on small
arrays; numpy.any / numpy.all on contiguous boolean arrays can see
speedup up to 1.9x.

(gh-31274)

Typing improvements and changes

numpy.linalg typing improvements and preliminary shape-typing support

Input and output dtypes for numpy.linalg functions are now more precise.
Several of these functions also gain preliminary shape-typing support while
remaining backward compatible. For example, the return type of
numpy.linalg.matmul now depends on the shape-type of its inputs, or fall
back to the backward-compatible return type if the shape-types are unknown at
type-checking time. Because of limitations in Python's type system and current
type-checkers, shape-typing cannot cover every situation and is often only
implemented for the most common lower-rank cases.

(gh-30480)

numpy.ma typing annotations

The numpy.ma module is now fully covered by typing annotations. This
includes annotations for masked arrays, masks, and various functions and
methods. With this, NumPy has achieved 100% typing coverage across all its
submodules.

(gh-30566)

Shape-typing support for many functions and methods

Many functions and methods now have shape-aware return type annotations.
Type-checkers can now infer the number of dimensions of the returned array
through common operations. For example, np.linspace(0, 1) is now typed as a
1-d float64 array, and np.sum(x, keepdims=True) has the same number of
dimensions as x.

This covers numpy.linalg functions, array creation functions (like
asarray, from{buffer,string,file,iter,regex}), range functions
(linspace, logspace, geomspace), aggregation functions and methods
(sum, mean, std, var, min, max, all, any,
etc.), sorting (sort, argsort, argpartition), cumulative operations
(cumsum, cumprod, etc.), set operations (unique_values,
intersect1d, union1d, etc.), and various other functions including
nonzero, transpose, diagonal, atleast_{1,2,3}d, clip,
round, inner, bincount, and fft.fftfreq. Several of these also
gained more precise return dtype annotations as part of this work.

Shape-typing is still a work-in-progress, so coverage is not yet complete.
Because of limitations in Python's type system and current type-checkers,
shape-typing is often only implemented for the most common lower-rank cases.

(gh-31172)

numpy.fft typing improvements and preliminary shape-typing support

The numpy.fft functions now support non-float64/complex128 dtypes
and gain preliminary shape-typing support. For example, the return type of
numpy.fft.fft now depends on the shape-type of its inputs, falling back to
the backward-compatible return type when the shape-types are unknown at
type-checking time.

(gh-31226)

Changes

Structured array copies now use memcpy for contiguous dtypes

Copying structured arrays with identical dtypes now uses memcpy instead of
field-by-field transfer when the dtype has a contiguous layout (no gaps between
fields). A new NPY_NOT_TRIVIALLY_COPYABLE dtype flag is set on structured
dtypes that have gaps in their memory layout, such as those created with
explicit offsets or via multi-field indexing. Only these dtypes continue to
use the slower field-by-field copy.

This means that padding bytes in contiguous structured dtypes (e.g. those
created without explicit offsets) may now be copied as part of the
memcpy, whereas previously they were left untouched. Code that relies on
padding bytes being preserved during structured array copies may be affected.

(gh-29270)

numpy.ctypeslib.as_ctypes now does not support scalar types

The function numpy.ctypeslib.as_ctypes has been updated to only accept
numpy.ndarray. Passing a scalar type (e.g., numpy.int32(5)) will now
raise a TypeError. This change was made to avoid the issue
gh-30354 and to enforce the
readonly nature of scalar types in NumPy. The previous behavior relied on
undocumented implicit temporary arrays and was not well-defined. Users who
need to convert scalar types to ctypes should first convert them to an array
(e.g., numpy.asarray) before passing them to numpy.ctypeslib.as_ctypes.

(gh-30538)

__array_interface__ changes on scalars

Scalars now export the __array_interface__ directly rather than including
an array copy as a __ref entry. This means that scalars are now exported as
read-only while they previously exported as writeable. The path via __ref
was undocumented and not consistently used even within NumPy itself.

(gh-30538)

meshgrid now always returns a tuple

np.meshgrid previously used to return a list when sparse was true and
copy was false. Now, it always returns a tuple regardless of the
arguments.

(gh-30707)

numpy.triu_indices now accepts unsigned integers

numpy.triu_indices previously used to error in some cases when unsigned integers
were given as arguments. Now, it accepts them in all cases.

(gh-30869)

The array attributes .real and .imag now behave differently for object
arrays and return getattr(element, "real", element) or getattr(element, "imag", 0)
elementwise. Additionally, the return for both is now read-only to avoid possible
in-place changes having no effect.

This change also affects np.isreal() which uses arr.imag.

Previously, .imag always returned 0 while .real returned the
original array unmodified. The new behavior now returnes the correct values
for complex Python objects but may also lead to surprises for example if
element.real() is a method and not a property.

(gh-30984)

NumPy's internal memory allocations now use PyMem_RawMalloc

NumPy's internal memory allocations now use PyMem_RawMalloc instead of
malloc and can be tracked by tracemalloc.

(gh-31503)

pytest-dev/pytest (pytest)

v9.1.1

Compare Source

pytest 9.1.1 (2026-06-19)
Bug fixes
  • #​14220: Fixed a logic bug in pytest.RaisesGroup which would might cause it to display incorrect "It matches FooError() which was paired with BarError" messages.
  • #​14591: Fixed a regression in pytest 9.1.0 which caused overriding a parametrized fixture with an indirect @​pytest.mark.parametrize to fail with "duplicate parametrization of '<fixture name>'".
  • #​14606: Fixed list-item typing errors from mypy in @pytest.mark.parametrize <pytest.mark.parametrize ref> argvalues parameter.
  • #​14608: Fixed a regression in pytest 9.1.0 where conftest.py files located in <invocation dir>/test* were no longer loaded as initial conftests when invoked without arguments.
    This could cause certain hooks (like pytest_addoption) in these files to not fire.

v9.1.0

Compare Source

pytest 9.1.0 (2026-06-13)
Removals and backward incompatible breaking changes
  • #​14533: When using --doctest-modules, autouse fixtures with module, package or session scope that are defined inline in Python test modules (not plugins or conftests) will now possibly execute twice.

    If this is undesirable, move the fixture definition to a conftest.py file if possible.

    Technical explanation for those interested:
    When using --doctest-modules, pytest possibly collects Python modules twice, once as pytest.Module and once as a DoctestModule (depending on the configuration).
    Due to improvements in pytest's fixture implementation, if e.g. the DoctestModule collects a fixture, it is now visible to it only, and not to the Module.
    This means that both need to register the fixtures independently.

Deprecations (removal in next major release)
  • #​10819: Added a deprecation warning for class-scoped fixtures defined as instance methods (without @classmethod). Such fixtures set attributes on a different instance than the test methods use, leading to unexpected behavior. Use @classmethod decorator instead -- by yastcher.

    See 10819 and 14011.

  • #​12882: Calling request.getfixturevalue() <pytest.FixtureRequest.getfixturevalue> during teardown to request a fixture that was not already requested is now deprecated and will become an error in pytest 10.

    See dynamic-fixture-request-during-teardown for details.

  • #​13409: Using non-~collections.abc.Collection iterables (such as generators, iterators, or custom iterable objects) for the argvalues parameter in @pytest.mark.parametrize <pytest.mark.parametrize ref> and metafunc.parametrize <pytest.Metafunc.parametrize> is now deprecated.

    These iterables get exhausted after the first iteration,
    leading to tests getting unexpectedly skipped in cases such as running pytest.main() multiple times,
    using class-level parametrize decorators,
    or collecting tests multiple times.

    See parametrize-iterators for details and suggestions.

  • #​13946: The private config.inicfg attribute is now deprecated.
    Use config.getini() <pytest.Config.getini> to access configuration values instead.

    See config-inicfg for more details.

  • #​14004: Passing baseid to ~pytest.FixtureDef or nodeid strings to fixture registration APIs is now deprecated. These are internal pytest APIs that are used by some plugins.

    Use the node parameter instead for fixture scoping. This enables more robust node-based
    matching instead of string prefix matching.
    If you've used nodeid=None, pass node=session instead.

    This will be removed in pytest 10.

  • #​14335: The method of configuring hooks using markers, deprecated since pytest 7.2, is now scheduled to be removed in pytest 10.
    See hook-markers for more details.

  • #​14434: The --pastebin option is now deprecated.
    The same functionality is now available in an external plugin, pytest-pastebin.
    See pastebin-deprecated for more details.

  • #​14513: The private FixtureDef.has_location attribute is now deprecated and will be removed in pytest 10.
    See fixturedef-has-location-deprecated for details.

  • #​1764: pytest.console_main is now deprecated and will be removed in pytest 10.
    It was never intended for programmatic use; use pytest.main instead.

New features
  • #​12376: Added pytest.register_fixture() to register fixtures using an imperative interface.

    This is an advanced function intended for use by plugins.

    Normally, fixtures should be registered declaratively using the @pytest.fixture <pytest.fixture> decorator.
    Pytest looks for these fixture definitions during the collection phase and registers them automatically.
    For some plugin usecases the declarative interface can be cumbersome or unviable, in which case this imperative interface can be used.

  • #​14023: Added --report-chars long CLI option.

  • #​14371: Added --max-warnings command-line option and max_warnings configuration option to fail the test run when the number of warnings exceeds a given threshold -- by miketheman.

  • #​6757: Added the assertion_text_diff_style configuration option, allowing
    string equality failures to be rendered as separate Left: and Right:
    blocks instead of ndiff output.

  • #​8395: Added support for ~datetime.datetime and ~datetime.timedelta comparisons with pytest.approx. An explicit abs or rel tolerance as a ~datetime.timedelta is required and relative tolerance is not supported for datetime comparisons -- by hamza-mobeen.

Improvements in existing functionality
  • #​11225: pytest.warns now shows "Regex pattern did not match" instead of "DID NOT WARN" when warnings were emitted but the match pattern did not match.

  • #​11295: Improved output of --fixtures-per-test by excluding internal-implementation fixtures generated by @pytest.mark.parametrize and similar.

  • #​13241: pytest.raises, pytest.warns and pytest.deprecated_call now uses ParamSpec for the type hint to the (old and not recommended) callable overload, instead of Any. This allows type checkers to raise errors when passing incorrect function parameters.
    func can now also be passed as a kwarg, which the type hint previously showed as possible but didn't accept.

  • #​13862: Improved the readability of "DID NOT RAISE" error messages by using the exception type's name instead of its repr.

  • #​14026: Added test coverage for compiled regex patterns in pytest.raises match parameter.

  • #​14137: pytest.ScopeName is now public to allow using it in function signatures.

  • #​14342: Marked yield_fixture as deprecated to type checkers using the deprecated decorator. Note it
    has originally been deprecated <yield-fixture-deprecated> in pytest 6.2 already.

  • #​14373: Added type annotations for pytest.approx.

  • #​14430: When using --setup-show, a space is now printed after the test name (and possibly used fixtures), to separate it from the test result.

  • #​14441: Reduced the default number of gc.collect() passes in the unraisableexception plugin from 5 to 1 on CPython, where reference counting makes a single pass sufficient. PyPy retains 5 passes due to object resurrection via __del__. This can noticeably speed up test suites that trigger many pytester runs.

  • #​14461: Improved assertion failure explanations for equality comparisons between mapping objects that are not dict instances.

  • #​14513: The order in which fixture definitions overriding each other are resolved is now determined first by their visibility in the collection tree rather than by the order in which they are registered.

    A fixture defined for a more specific node (e.g. a module or an item) now always takes precedence over one with the same name defined for a more general node (e.g. the session), even when the more general one was registered later.
    Fixtures with non-comparable visibility or the same visibility keep the existing behavior of "last registered wins".
    This change is supposed to only affect plugins which register multiple fixtures programmatically with the same name.

  • #​14524: Add official Python 3.15 support.

  • #​1764: Improved argparse program name to show pytest, python -m pytest, or pytest.main() based on how pytest was invoked, making help and error messages clearer.

  • #​8265: Emit a PytestCollectionWarning when a module-level __getattr__ returns None for pytestmark instead of raising AttributeError.

    Previously this caused a cryptic TypeError: got None instead of Mark error.
    Now pytest issues a helpful warning and continues collecting the module normally.

Bug fixes
  • #​13192: Fixed | (pipe) not being treated as a regex meta-character that needs escaping in pytest.raises(match=...) <pytest.raises>.

  • #​13484: Fixed -W option values being duplicated in Config.known_args_namespace.

  • #​13626: Fixed function-scoped fixture values being kept alive after a test was interrupted by KeyboardInterrupt or early exit,
    allowing them to potentially be released more promptly.

  • #​13784: Fixed capteesys producing doubled output when used with --capture=no (-s).

  • #​13817: Fixed a secondary AttributeError masking the original error when an option argument fails to initialize.

  • #​13884: Fixed rare internal IndexError caused by builtins.compile being overridden in client code.

  • #​13885: Fixed autouse fixtures defined inside a unittest.TestCase class running even when the class is decorated with unittest.skip or unittest.skipIf -- regression since pytest 8.1.0.

  • #​13917: unittest.SkipTest is no longer considered an interactive exception, i.e. pytest_exception_interact is no longer called for it.

  • #​13963: Fixed subtests running with pytest-xdist when their contexts contain objects that are not JSON-serializable.

    Fixes pytest-dev/pytest-xdist#1273.

  • #​14004: Fixed conftest.py fixture scoping when testpaths points outside of the rootdir <rootdir>.

    Previously, fixtures from nested conftest.py files would incorrectly leak to sibling directories
    when using a relative testpaths like ../tests/sdk.

    Conftest fixtures are now parsed during Directory <pytest.Directory> collection, using the Directory node for proper scoping.

  • #​14050: Display dictionary differences in assertion failures using the original key insertion order instead of sorted order.

  • #​14080: fix missing type annotations on Pytester.makepyfile and Pytester.maketxtfile methods.

  • #​14114: An exception from pytest_fixture_post_finalizer no longer prevents fixtures from being torn down, causing additional errors in the following tests.

  • #​14161: Fixed monkeypatch.setattr() <pytest.MonkeyPatch.setattr> leaving a stale entry on the undo stack when the underlying setattr() call fails (e.g. on immutable targets), causing an AttributeError crash during teardown.

  • #​14214: Fixed -v hint in pytest.raises match diff not working because assertion verbosity was not propagated.

  • #​14234: Allow pytest.HIDDEN_PARAM <hidden-param> in @pytest.mark.parametrize(ids=...) <pytest.mark.parametrize ref> typing.

  • #​14248: Fixed direct parametrization causing the static fixture closure (as reflected in request.fixturenames <pytest.FixtureRequest.fixturenames>) to omit fixtures that are requested transitively from overridden fixtures.

  • #​14263: Unraisable exceptions from finalizers are now collected during pytest_unconfigure, before pytest tears down the warning filters installed for the session. Previously the collection ran from a cleanup callback whose order relative to other plugins' cleanups was not guaranteed, so an active error filter could be removed before the exception surfaced and a late resource leak would pass silently. A -W error filter, or any filter matching pytest.PytestUnraisableExceptionWarning, now promotes these exceptions to failures regardless of plugin cleanup order.

  • #​14377: Fixed crash in Config.get_terminal_writer when an assertion fails with the terminalreporter plugin disabled.

  • #​14381: Fixed -V (short form of --version) to properly display the current version.

  • #​14389: Improved pytest.raises(..., match=...) <pytest.raises> failures to suppress the mismatched exception as a cause of the resulting AssertionError.

  • #​14392: Fixed a bug in pytest.raises(match=...) <pytest.raises> "fully escaped" detection, causing the regex diff display to be shown in some instances when the raw string diff display should be shown instead.

  • #​14442: Fixed a regression in pytest 9.0 where --strict-markers and --strict-config specified through addopts were silently ignored.

    Note that when targeting pytest >= 9.0, it's nicer to use strict_markers and strict_config, or strict mode <strict mode>.

  • #​14456: Fixed pytest.approx not recognizing types with __array_interface__ as numpy-like arrays.

  • #​14474: Fixed a regression where -k and -m expressions containing both backslash characters in identifiers and string literal arguments would incorrectly raise a SyntaxError about escaping.

  • #​14483: Fixed JUnit XML report incorrectly escaping high Unicode codepoints (supplementary plane characters like emoji) in test failure messages. -- by EternalRights

  • #​14492: Fixed Code.getargs() incorrectly including local variable names in the returned argument tuple for functions with *args and/or **kwargs. The method was using co_flags bitmask values (4 and 8) directly as counts instead of converting them to 1 via bool(), and was not accounting for co_kwonlyargcount when var=True.

  • #​3697: Logging capture now works for non-propagating loggers.
    Previously only logs which reached the root logger were captured.
    This includes caplog and the "Captured log calls" test reporting.

  • #​3850: Fixed JUnit XML report: the tests attribute of the <testsuite> element now always matches the number of <testcase> elements in the file. In some cases (test passes but fails during teardown) the tests attribute would report an incorrect number of testcases in the XML file.

  • #​5848: pytest_fixture_post_finalizer is no longer called extra times for the same fixture teardown in some cases.

  • #​719: Fixed @pytest.mark.parametrize <pytest.mark.parametrize ref> not unpacking single-element tuple values when using a string argnames with a trailing comma (e.g., "arg,").

    The trailing comma form now correctly behaves like the tuple form ("arg",), treating argvalues as a list of tuples to unpack.

Improved documentation
  • #​11022: Document safer alternatives and scope guidance for monkeypatching standard library functions.
  • #​11307: Document that @pytest.hookimpl(specname=...) only works for function names starting with pytest_.
  • #​13038: Document that doctests do not support parametrized fixtures, including parametrized autouse fixtures.
  • #​13155: Clarified how the request fixture provides indirect parametrization values via request.param.
  • #​13304: Clarified in the documentation that hook implementations defined in conftest.py files are not available to other plugins during their pytest_addoption() execution, as conftest files are discovered and loaded after builtin and third-party plugins have been initialized. However, initial conftest files themselves can implement pytest_addoption() to add their own command-line options.
  • #​13902: Clarified how subtest progress markers are shown in the documentation.
  • #​14012: The ini options ref section of the API Reference now specified the type and default value of every configuration option.
  • #​14148: Documented a safe pytestconfig.cache access pattern when the
    cacheprovider plugin is disabled.
  • #​14303: The documentation is now built with Sphinx >= 9.
  • #​14465: Updated the hooks how-to page to link the newhooks.py file in pytest-xdist at tag v3.8.0 instead of an unrelated 2017-era commit under the old layout. Pointing at a tag keeps the example in sync with the version users actually install, while remaining stable when the project's main branch moves on.
Miscellaneous internal changes
  • #​14582: Improved the recursion traceback test to exercise all requested traceback styles.
astral-sh/ruff (ruff)

v0.16.0

Compare Source

Released on 2026-07-23.

Check out the blog post for a migration
guide and overview of the changes!

Breaking changes
  • Ruff now enables a much larger set of rules by default (413, up from 59). See the blog post for
    more details and the new Default Rules page for a
    full listing of the enabled rules. Note that this is primarily an expansion, but 18 of the more
    opinionated pycodestyle (E) and pyflakes (F) rules have been removed from the default set:
    E401, E402, E701, E702, E703, E711, E712, E713, E714, E721, E731, E741,
    E742, E743, F403, F405, F406, and F722.

  • Ruff can now format Python code blocks in Markdown files and will do this by default. See the
    documentation for more details.

  • Ruff now supports ruff: ignore comments at the ends of lines, like noqa comments, or on the line preceding a diagnostic. For example, these both suppress an unused-import (F401) diagnostic:

    import math  # ruff: ignore[F401]
    
    # ruff: ignore[F401]
    import os
    
  • Fixes are now shown in check and format --check output:

    ❯ ruff format --check .
    unformatted: File would be reformatted
     --> try.md:1:1
      |
    1 | ```python
      - import   math
    2 + import math
    3 | ```
      |
    
    1 file would be reformatted
    

    This example also shows off the Markdown formatting.

  • format --check now supports the same output formats as the linter, including the github and
    gitlab outputs for rendering annotations in CI:

    ❯ ruff format --check --output-format github .
    ::error title=ruff (unformatted),file=try.md,line=2,col=8,endLine=2,endColumn=10::try.md:2:8: unformatted: File would be reformatted
    

    See the CLI help or documentation for the
    full list of supported formats.

  • The filename, location, end_location, fix.edits[].location, and fix.edits[].end_location
    fields in the JSON output format may now be null rather than defaulting to the empty string and
    row 1, column 1, respectively.

Stabilization

The following rules have been stabilized and are no longer in preview:

The following behaviors have been stabilized:

Preview features
  • [pyupgrade] Fix false positive with TypeVar default before Python 3.13 (UP040) (#​26888)
Bug fixes
  • [ruff] Fix missing check on unrecognized early bound (RUF016) (#​26986)
Rule changes
  • Insert a space after the colon in Ruff suppression comments (#​27123)
Performance
  • [pyupgrade] Speed up unnecessary-future-import (UP010) (#​27047)
Documentation
  • [ruff] Add missing period in "Why is this bad?" section (RUF200) (#​26930)
  • [flake8-simplify] Clarify os.environ behavior on Windows (SIM112) (#​26972)
  • [pydocstyle] Document fix safety (D400) (#​26971)
Contributors

v0.15.22

Compare Source

Release Notes

Released on 2026-07-16.

Preview features
  • [pycodestyle] Add an autofix for E402 (#​22212)
  • [refurb] Allow subclassing builtins in stub files (FURB189) (#​26812)
  • [ruff] Add rule to replace noqa comments with ruff:ignore (RUF105) (#​26423)
  • [ruff] Add rule to use human-readable names in ruff:ignore comments (RUF106) (#​26682)
  • [ruff] Add rule to use human-readable names in configuration selectors (RUF201) (#​26772)
Bug fixes
  • [flake8-pyi] Fix false positive in __all__ (PYI053) (#​26872)
Rule changes
  • [pylint] Ignore mutable type updates in redefined-loop-name (PLW2901) (#​25733)
Performance
  • Avoid redundant lexer token bookkeeping (#​26765)
  • Avoid redundant pending-indentation writes (#​26774)
  • Avoid unnecessary identifier lookahead (#​26525)
  • Reuse parser scratch buffers (#​26798)
Documentation
  • Document argfile support (#​26803)
  • [flake8-datetimez] Clarify naming guidance for datetime.today (DTZ002) (#​26658)
  • [pycodestyle] Document E731 fix safety (#​26847)
  • [ruff] Clarify intentional async contexts for unused-async (RUF029) (#​26641)
Contributors
Install ruff 0.15.22
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-installer.ps1 | iex"
Download ruff 0.15.22
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

v0.15.21

Compare Source

Release Notes

Released on 2026-07-09.

Preview features
  • Add --add-ignore for adding ruff:ignore comments (#​26346)
  • [flake8-comprehensions] Drop C409 tuple comprehension preview behavior (#​25707)
  • Avoid whitespace normalization when formatting comments (#​26455)
  • [pyupgrade] Lint and fix use of deprecated abc decorators (UP051) (#​26417)
Bug fixes
  • Refine non-empty f-string detection (#​26526)
  • Detect syntax errors in individual notebook cells (#​26419)
  • [flake8-implicit-str-concat] Fix ISC003 autofix incorrectly stripping + from comments (#​26554)
Rule changes
  • [flake8-executable] Mark EXE004 fix as unsafe (#​26033)
  • [flake8-pyi] Mark PYI061 fixes as unsafe in Python files (#​26533)
  • [pydocstyle] Skip overload-with-docstring in stub files (D418) (#​26318)
Performance
  • Avoid per-token source index visitor calls (#​26506)
  • Cache parenthesized expression boundaries in the formatter (#​26344)
  • Improve performance of rendering edits in preview mode (#​26565)
  • Inline fits_element in formatter (#​26429)
  • Inline formatter printing hot paths (#​26504)
  • Lazily create builtin bindings (#​26510)
  • Skip empty trivia scans in the source indexer (#​26507)
  • Use ICF for macOS release builds (#​25780)
Formatter
  • Add --extend-exclude to ruff format (#​26372)
Documentation
  • Add "How does Ruff's import sorting compare to isort?" link to README (#​26530)
  • Fix Mozilla Firefox repository link in README (#​26537)
  • [flake8-bandit] Fix misleading docstring for mako-templates (S702) (#​26432)
  • [ruff] Fix non-triggering example for if-key-in-dict-del (RUF051) (#​26433)
Contributors
Install ruff 0.15.21
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-installer.ps1 | iex"
Download ruff 0.15.21
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

v0.15.20

Compare Source

Release Notes

Released on 2026-06-25.

Preview features
  • Allow human-readable names in rule selectors (#​25887)
  • Emit a warning instead of an error for unknown rule selectors (#​26113)
  • Match noqa shebang handling in ruff:ignore comments (#​26286)
  • [ruff] Remove pytest-fixture-autouse (RUF076) (#​26240, #​26371)
Documentation
  • Add versioning sections to custom crate READMEs (#​26317)
  • Update ruff_python_parser README for crates.io (#​26315)
  • [perflint] Clarify that PERF402 applies to any iterable (#​26242)
Contributors
Install ruff 0.15.20
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-installer.ps1 | iex"
Download ruff 0.15.20
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

v0.15.19

Compare Source

Release Notes

Released on 2026-06-23.

Preview features
  • Support human-readable names when hovering suppression comments and in code actions (#​26114)
Bug fixes
  • Fall back to default settings when editor-only settings are invalid (#​26244)
  • Fix panic when inserting text at a notebook cell boundary (#​26111)
Rule changes
  • [pylint] Update fix suggestions for __floor__, __trunc__, __length_hint__, and __matmul__ variants (PLC2801) (#​26239)
Performance
  • Avoid allocating when parsing single string literals (#​26200)
  • Avoid reallocating singleton call arguments (#​26223)
  • Lazily create source files for lint diagnostics (#​26226)
  • Optimize formatter text width and indentation (#​26236)
  • Reserve capacity for builtin bindings (#​26229)
  • Skip repeated-key checks for singleton dictionaries (#​26228)
  • Use ArrayVec for qualified name segments (#​26224)
Documentation
  • [flake8-pyi] Note that PYI051 is an opinionated stylistic rule (#​26179)
  • [pyupgrade] Clarify UP029 as a Python 2 compatibility rule (#​26243)
Other changes
  • Publish Ruff crates to crates.io (#​26271)
Contributors
Install ruff 0.15.19
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-installer.ps1 | iex"
Download ruff 0.15.19
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

v0.15.18

Compare Source

Release Notes

Released on 2026-06-18.

Preview features
  • Handle nested ruff:ignore comments (#​25791)
  • Stop displaying severity in output (#​26050)
  • Use human-readable names in CLI output (#​25937)
  • Use human-readable names in LSP and playground diagnostics (#​26058)
  • [pydocstyle] Prevent property docstrings starting with verbs (D421) (#​23775)
  • [flake8-pyi] Extend PYI033 to Python files (#​26129)
Bug fixes
  • Detect equivalent numeric mapping keys (#​26009)
  • Detect mapping keys equivalent to booleans (#​25982)
  • Detect repeated signed and complex dictionary keys (#​26007)
Rule changes
  • [flake8-pyi] Rename PYI033 to legacy-type-comment (#​26131)
Performance
  • Use ThinVec for call keywords (#​25999)
  • Inline parser recovery context checks (#​26038)
  • Match parser keywords as bytes (#​26037)
  • Move value parsing out of lexing (#​25360)
Server
  • Render subdiagnostics and secondary annotations as related information (#​26011)
Documentation
  • Update fix availability for always-fixable rules (#​26091)
  • [flake8-tidy-imports] Add fix safety section (TID252) (#​17491)
Parser
  • Reject __debug__ lambda parameters (#​26022)
  • Reject _ as a match-pattern target (#​25977)
  • Reject multiple starred names in sequence patterns (#​25976)
  • Reject parenthesized star imports (#​26021)
  • Reject starred comprehension targets (#​26023)
  • Reject unparenthesized generator expressions in class bases (#​25978)
  • Reject yield expressions after commas (#​26024)
  • Validate function type parameter default order (#​25981)
Playground
Contributors
Install ruff 0.15.18
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-installer.ps1 | iex"
Download ruff 0.15.18
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

v0.15.17

Compare Source

Release Notes

Released on 2026-06-11.

Preview features
  • Allow human-readable names in suppression comments (#​25614)
  • Fix handling of ignore comments within a disable/enable pair (#​25845)
  • Prioritize human-readable names in CLI output (#​25869)
  • Respect diagnostic start and parent ranges and trailing comments in ruff:ignore suppressions (#​25673)
  • [flake8-async] Add trio.as_safe_channel to safe decorators (ASYNC119) (#​25775)
  • [flake8-pytest-style] Also check pytest_asyncio fixtures (#​25375)
  • [ruff] Ban pytest autouse fixtures (RUF076) (#​25477)
  • [pyupgrade] Add from __future__ import annotations automatically (UP007, UP045) (#​23259)
Bug fixes
  • Fix diagnostic when ruff:enable or ruff:disable appears where ruff:ignore is expected (#​25700)
  • [pyupgrade] Preserve leading empty literals to avoid syntax errors (UP032) (#​25491)
Rule changes
  • [flake8-pytest-style] Clarify diagnostic message for single parameters (PT007) (#​25592)
  • [numpy] Drop autofix for np.in1d (NPY201) (#​25612)
  • [pylint] Exempt Python version comparisons (PLR2004) (#​25743)
Performance
  • Reserve AST Vecs with correct capacity for common cases (#​25451)
Formatter
  • Preserve whitespace for Quarto cell option comments (#​25641)
CLI
Other changes
  • Fix playground diagnostics scrollbars (#​25642)
Contributors
Install ruff 0.15.17
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-installer.ps1 | iex"
Download ruff 0.15.17
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

v0.15.16

Compare Source

Release Notes

Released on 2026-06-04.

Preview features
  • [flake8-async] Implement yield-in-context-manager-in-async-generator (ASYNC119) (#​24644)
  • [pylint] Narrow diagnostic range and exclude cases without exception handlers (PLW0717) (#​25440)
  • [ruff] Treat yield before break from a terminal loop as terminal (RUF075) (#​25447)
Bug fixes
  • [eradicate] Avoid flagging ruff:ignore comments as code (ERA001) (#​25537)
  • [eradicate] Fix ERA001/RUF100 conflict when noqa is on commented-out code (#​25414)
  • [pyflakes] Avoid removing the format call when it would change behavior (F523) (#​25320)
  • [pylint] Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (PLE2510, PLE2512, PLE2513, PLE2514, PLE2515) (#​25544)
  • [pyupgrade] Avoid converting format calls with more kinds of side effects (UP032) (#​25484)
Rule changes
  • [flake8-pytest-style] Avoid fixes for ambiguous argnames and argvalues combinations (PT006) (#​24776)
Performance
  • Drop excess capacity from statement suites during parsing (#​25368)
Documentation
  • [pydocstyle] Improve discoverability of rules enabled for each convention (#​24973)
  • [ruff] Restore example code for Python versions before 3.15 (RUF017) (#​25439)
  • Fix typo bin/activebin/activate in tutorial (#​25473)
Other changes
  • Shrink additional parser AST collections (#​25465)
Contributors
Install ruff 0.15.16
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-installer.ps1 | iex"
Download ruff 0.15.16
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

v0.15.15

Compare Source

Release Notes

Released on 2026-05-28.

Preview features
  • Fix Markdown closing fence handling (#​25310)
  • [pyflakes] Report duplicate imports in typing.TYPE_CHECKING block (F811) (#​22560)
Bug fixes
  • [pyflakes] Treat function-scope bare annotations as locals per PEP 526 (F821) (#​21540)
Performance
  • Avoid redundant TokenValue drops in the lexer (#​25300)
  • Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens Vec size (#​25354)
  • Use ThinVec in AST to shrink Stmt (#​25361)
Documentation
  • Fix line-length example for --config option (#​25389)
  • [flake8-comprehensions] Document RecursionError edge case in __len__ (C416) (#​25286)
  • [mccabe] Improve example (C901) (#​25287)
  • [pyupgrade] Clarify fix safety docs (UP007, UP045) (#​25288)
  • [refurb] Document FURB192 exception change for empty sequences (#​25317)
  • [ruff] Document false negative for user-defined types (RUF013) (#​25289)
Formatter
  • Fix formatting of lambdas nested within f-strings (#​25398)
Server
  • Return code action for codeAction/resolve requests that contain no or no valid URL (#​25365)
Other changes
  • Expand semantic syntax errors for invalid walruses (#​25415)
Contributors
Install ruff 0.15.15
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-installer.ps1 | iex"
Download ruff 0.15.15
File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
astral-sh/ty (ty)

v0.0.65

Compare Source

Released on 2026-07-29.

LSP server
  • Support comprehension walruses in IDE features (#​26476)
Library support
  • Pydantic: Allow mutation of private attributes on frozen models (#​27257)
  • Pydantic: Synthesize __replace__ for models (#​27220)
Diagnostics
  • Correct ParamSpec forwarded-argument diagnostic locations (#​27263)
  • Recover forwarded callable object and constructor sources (#​27264)
  • Recover forwarded functools.partial diagnostic sources (#​27265)
Core type checking
  • Fix gradual class assignability with generic receivers (#​27223)
  • Lazily materialize protocol attributes (#​27267)
  • Narrow tagged unions through all type kinds (#​27226)
  • Prefer static constrained TypeVar solutions (#​27057)
  • Preserve frozen-dataclass setter delegation (#​27217)
  • Preserve inference when filtering constructor overloads (#​27254)
  • Reject frozen-dataclass field deletion through subclasses (#​27001)
  • Stabilize recursive type-constraint ordering (#​27176)
  • Support materialized class type expressions (#​27258)
Performance
  • Avoid quadratic inference for large literal unions (#​27178)
  • Cache protocol receiver binding (#​27301)
Contributors

v0.0.64

Compare Source

Released on 2026-07-27.

Bug fixes
  • Fix identity narrowing for NewTypes (#​26439)
  • Make reachability analysis idempotent (#​27163)
LSP server
  • Fix ParamSpec declaration hover and type navigation (#​27183)
  • Implement LSP textDocument/implementation request (#​25410)
  • Introduce shared primitives for parsing backticks in docstrings (#​26928)
  • Render NumPy docstrings as structured Markdown (#​25925)
CLI
  • Add --exclude-scripts and --include-scripts (#​27169)
  • Discover uv workspace roots (#​25551)
Diagnostics
  • Add a lint rule for combined abstract and final decorators (#​26932)
  • Change --add-ignore to add space after the colon for ty: ignore (#​27120)
  • Fix missing-override-decorator suggestion before Python 3.12 (#​27166)
  • Reuse full call diagnostics for implicit setter calls (#​27115)
Configuration
  • Allow unresolved unused venv home paths (#​27162)
  • Simplify script metadata query (#​27121)
Core type checking
  • Decorate only overload implementation signatures (#​27147)
  • Don't consider known-instance types, generic aliases or non-singleton special-form types to be single-valued (#​27137)
  • Improve identity comparison inference for singleton types (#​27126)
  • Improve tuple membership and rich comparison inference (#​27164)
  • Model walrus bindings from comprehensions (#​26466)
  • Narrow tagged unions using identity comparisons (#​27130)
  • Preserve Self in __new__ calls (#​27003)
  • Preserve receiver constraints when binding overloaded methods (#​27038)
  • Support generic manual PEP 695 type aliases (#​27083)
  • Treat bivariance as covariant (#​24319)
Performance
  • Avoid cycles when resolving ModuleType globals (#​27182)
  • Avoid expanding optional enum comparisons (#​27105)
  • Avoid repeated inference when copying mixed TypedDict unions (#​27108)
  • Improve importer performance (#​27159)
  • Improve union and intersection builder performance (#​27167)
Contributors

v0.0.63

Compare Source

Released on 2026-07-23.

Core type checking
  • Handle generic stringified PEP 613 (typing.TypeAlias) type aliases (#​27092)
  • Allow equality narrowing across non-final classes (#​27031)
  • Allow interpolated string literals to be promoted to str (#​27104)
  • Fix double specialization of generic type aliases (#​27058)
  • Fix intersections of type and TypeForm (#​27099)
  • When narrowing from a match statement leads a variable x to be inferred as A & B, infer the type of x.attr as <type of A.attr> & <type of B.attr> (#​27103)
Library support
  • Pydantic: Stricter validation of sub-model fields in lax mode (#​27091)
  • Pydantic: Support special underscore parameters in BaseSettings models (#​27098)
Performance
  • Avoid exponential narrowing of optional dynamic match subjects (#​27100)
  • Avoid normalizing cached absolute file paths (#​26998)
Contributors

v0.0.62

Compare Source

Released on 2026-07-21.

Bug fixes
  • Guard recursive Protocol and TypedDict relations (#​26990)
  • Prevent stack overflows in recursive type relation checks (#​26503)
  • Recover from cancelled file indexing (#​26876)
Diagnostics
  • Avoid editing ignore comments with trailing reasons (#​26939)
  • Prefer innermost inline suppressions (#​26940)
  • Remove unused own-line ignore comments (#​27013)
  • Reuse applicable own-line suppressions in --add-ignore (#​26925)
Configuration
  • Respect rules and analysis in PEP 723 script metadata configurations (#​26671)
Core type checking
  • Accept gradual constrained TypeVar solutions (#​26965)
  • Avoid recursive TypeVarTuple alias expansion (#​27032)
  • Check inherited method conflicts via the MRO (#​27019)
  • Contextually infer custom __setattr__ assignments (#​27015)
  • Fix Callable isinstance reachability (#​26970)
  • Fix Just[float] protocol matching (#​27053)
  • Fix Self binding for classmethod __new__ constructors (#​27030)
  • Fix nested short-circuit flow snapshots (#​26956)
  • Gate TypedDict PEP 728 parameters by Python version (#​26968)
  • Improve match reachability inference around value-pattern branches (#​26979)
  • Make membership and equality narrowing consistent (#​26982)
  • Preserve constrained TypeVar equality narrowing (#​26988)
  • Preserve constrained TypeVar inequality narrowing (#​26995)
  • Preserve unsatisfiable generic call constraints (#​26964)
  • Respect bounded typevars in union inference (#​27023)
  • Respect metaclass __setattr__ for class attributes (#​27000)
Performance
  • Cache non-terminal-call reachability prefixes (#​26810)
  • Cache protocol Self binding (#​26997)
  • Cache sparse reachability checkpoints (#​26811)
  • Defer statement-call narrowing gates (#​26793)
Contributors

v0.0.61

Compare Source

Released on 2026-07-17.

Bug fixes
  • Avoid recursive protocol structural comparisons (#​26721)
LSP server
  • Render Google docstrings as structured Markdown (#​26599)
Library support
  • Pydantic: Collect field metadata through subscripted generic Annotated aliases (#​26885)
Diagnostics
  • Avoid extending own-line suppressions in --add-ignore (#​26808)
Core type checking
  • Derive descriptor setter domains for protocols (#​26683)
  • Enforce declared receiver TypeVar domains (#​26863)
  • Infer isinstance results for aliases and type variables (#​26961)
  • Infer isinstance results for fixed class tuples (#​26935)
  • Narrow inline list and set membership checks (#​26955)
  • Narrow tagged unions by tag truthiness (#​26887)
  • Narrow walrus expression values (#​26949)
  • Project intersections in to_instance (#​26892)
  • Remove inferable TypeVar artifacts recursively (#​26787)
  • Respect mixin receiver domains in method overrides (#​26941)
  • Support TypeVarTuple and Unpack (#​25240)
Performance
  • Deduplicate completion labels (#​26890)
  • Only collect expected types for files open in the editor (#​25546)
  • Parallelize subtype hierarchy search (#​26875)
  • Share heap-backed parser names with CharStr (#​26594)
  • Use the new incremental checker from the ignore crate (#​26933)
Contributors

v0.0.60

Compare Source

Released on 2026-07-15.

Bug fixes
  • Expand transparent callable workaround with overloads and Awaitable[T] (#​26761)
  • Separate type-mapping caches by transformation mode (#​26857)
  • Avoid recursive protocol union redundancy checks (#​26689)
  • Handle recursive protocols in redundant-cast checks (#​26708)
LSP server
  • Prevent type that is written with a code span from being incorrectly re-wrapped during docstring Markdown rendering (#​26723)
Library support
  • Pydantic: Support populate_by_name and custom initializers (#​26764)
  • Pydantic: Warn about immediately discarded extra arguments (#​26762)
Diagnostics
  • Narrow TypeGuard keyword arguments and remove invalid-type-guard-call (#​26809)
  • Support own-line suppression comments (#​26785)
Core type checking
  • Derive descriptor setter domains for protocols (#​26683)
  • Handle cycles in derived constraint relations (#​26814)
  • Implement unified generic call inference (#​26141)
  • Preserve constraints from bound receivers (#​26776)
  • Project exact-length narrowing through TypeVars (#​26852)
  • Resolve PEP 695 aliases in type[...] annotations (#​26842)
  • Retain sequence pattern narrowing in successful match cases (#​26807)
  • Support class and static protocol methods (#​26574)
  • Support class objects satisfying instance-method protocols (#​26789)
  • Support type[Protocol] (#​26649)
  • Sync vendored typeshed stubs (#​26840). Typeshed diff
  • Treat transparent callable decorators consistently in class assignments (#​26720)
Performance
  • Compare overloaded protocol method returns pairwise (#​26684)
  • Extend PathBounds fast-path to support both upper and lower bounds (#​26782)
  • Skip Self type scans for non-generic instances (#​26703)
Contributors

v0.0.59

Compare Source

Released on 2026-07-12.

Bug fixes
  • Guard descriptor classification cycles (#​26690)
  • Respect init=False in dataclass field-order checks (#​26749)
  • Avoid duplicate diagnostics for overloaded TypeIs (#​26716)
Library support
  • Pydantic: Support custom __init__ methods (#​26699)
  • Pydantic: Support field metadata in Annotated (#​26650)
Core type checking
  • Allow unsound equality-based narrowing for builtins (#​26414)
  • Bind Self in implicit dunder calls (#​26711)
  • Correct protocol method receiver binding (#​26701)
  • Exempt ParamSpec callables from the dunder descriptor heuristic (#​26696)
  • Remove transitive TypeVar artifacts during collection inference (#​26714)
LSP server
  • Avoid broad invalidation from file check eligibility (#​26741)
  • Correct how we expand tabs in docstrings (#​26679)
  • Resolve ambiguity in Google-style docstring parsing in favour of observations from popular projects (#​26673)
CLI
  • Avoid allocation for every stdout write (#​26698)
  • Buffer diagnostic output (#​26702)
Performance
  • Cache generic context (#​26745)
  • Cache known class instances (#​26746)
  • Reuse common TypedDict constraints through intersections (#​26747)
  • Use purpose-specific types for completion and module text (#​26664)
Contributors

v0.0.58

Compare Source

Released on 2026-07-09.

Bug fixes
  • Fix protocol matching for class variables (#​26669)
  • Fix reflected binary dispatch for runtime classes (#​26623)
  • Support cached properties in protocols (#​26681)
Diagnostics
  • Add assignability context to upper-bound diagnostics (#​26645)
  • Add blanket ignore comment rule (#​26426)
  • Improve protocol attribute diagnostic context (#​26644)
Library support
  • Pydantic: Add fields from mixin classes (#​26631)
  • Pydantic: Add support for validate_by_{name,alias} (#​26598)
  • Pydantic: Add support for validation_alias (#​26629)
  • Pydantic: Fix float conversion in unions (#​26655)
  • Pydantic: Ignore private attributes (#​26630)
  • Pydantic: Make BaseSettings fields optional by default (#​26628)
  • Pydantic: Recognize frozen models via config (#​26648)
  • Pydantic: Support dict model configurations (#​26632)
  • Pydantic: Support validation of RootModel fields (#​26634)
  • Pydantic: Understand ellipsis as providing no default value (#​26637)
Core type checking
  • Gate membership narrowing on __contains__ semantics (#​25964)
  • Handle callable classes in solver (#​26090)
  • Infer ModuleType.__doc__ as str in the presence of a docstring (#​26505)
  • Infer metaclass-declared attributes on class instances (#​26512)
  • Respect user stub overlays during module resolution (#​26123)
Performance
  • Avoid allocating decorated parameter names (#​26666)
  • Optimize TypeCollector (#​26593)
Contributors

v0.0.57

Compare Source

Released on 2026-07-07.

Bug fixes
  • Detect async generator expressions containing await (#​26568)
  • Preserve exhaustive gradual match patterns (#​26523)
LSP server
  • Fix selection range behavior for strings (#​26532)
  • Recognize that dedent ends doctest block when parsing docstrings for signature help (#​26552)
  • Render reStructuredText hyperlinks as Markdown in hover docstrings (#​25907)
  • Update __slots__ string when renaming an attribute (#​26438)
Documentation
  • Document PYTHONPATH support in module discovery (#​3889)
Library support
  • Add support for extra arguments in Pydantic model constructors (#​26520)
  • Detect Pydantic model configurations (#​26573)
  • Distinguish lax and strict mode for Pydantic models (#​26587)
Core type checking
  • Fix subtyping/assignability for @property protocol members (#​25332)
  • Narrow isinstance against intersections containing invalid member (#​26545)
  • Narrow match subjects through structural patterns (#​25942)
  • Preserve generic functools.partial signatures (#​24583)
  • Preserve generic variadic callback semantics (#​26521)
  • Preserve invariant materialization on generic specializations (#​26578)
  • Preserve literal enum member names (#​26592)
Performance
  • Avoid exponential invariant constraint paths (#​26538)
  • Batch parallel jobs when finding references (#​26534)
  • Build module names directly in CompactString (#​26546)
  • Elide default use-def state (#​26398)
  • Reuse owned buffers for string literals (#​26547)
  • Use ICF for macOS release builds (#​3709)
  • Use cached class literal lookup for is_subclass_of (#​26585)
Contributors

v0.0.56

Compare Source

Released on 2026-07-01.

Bug fixes
  • Avoid MRO cycle when collecting NamedTuple fields (#​26464)
  • Model int and str enum value normalization (#​26349)
  • Prefer reflected operators by runtime class (#​26434, #​26474)
CLI
  • Exit with status 130 when interrupted (#​26465)
Performance
  • Avoid exponential OR-pattern reachability (#​26481)
  • Reduce bound typevar identity overhead (#​26396)
Core type checking
  • Infer generic class pattern capture types (#​26479)
  • Narrow exact tuples through sequence patterns (#​26424)
  • Recognize inherited enum member constructors (#​26410)
  • Respect return-context inference when filtering overloads (#​26454)
  • Sync vendored typeshed stubs (#​26501). Typeshed diff
Contributors

v0.0.55

Compare Source

Released on 2026-06-26.

LSP server
  • Render full diagnostics in color (#​26384)
Documentation
  • Document colored diagnostic output (#​3858)
Performance
  • Improve vendored filesystem concurrency (#​26408)
  • Optimize enum comparisons in equality evaluation (#​26340)
  • Remove redundant semantic index shrinks (#​26392)
  • Use never-change durability for one-shot checks (#​26359)
Core type checking
  • Correct enum alias detection and scalar constructors (#​26345)
  • Fix structural pattern binding inference (#​26411)
  • Improve variable-length tuple slicing (#​26151)
  • Infer class and mapping pattern bindings (#​25941)
  • Infer empty collection constructors from later uses (#​26389)
  • Skip shadowed submodule bindings during import analysis (#​26385)
  • Sync vendored typeshed stubs (#​26406). Typeshed diff
  • Track literal iterable emptiness for reachability (#​25222)
  • Validate positional class patterns against __match_args__ (#​26195)
Contributors

v0.0.54

Compare Source

Released on 2026-06-25.

Bug fixes
  • Avoid duplicate configuration error output (#​26375)
  • Avoid stack overflows in reachability analysis (#​26272)
  • Fix divergent recursive tuple cycle handling in ty (#​26316)
  • Fix panic from relation queries during cycle recovery (#​26335)
  • Fix panics by reverting recursive TypeOf cycle recovery (#​26339)
  • Support basic usages of __class__ closure cells in methods (#​26329)
LSP server
  • Fix typealias token classification inconsistency (#​26255)
  • Implement rust-analyzer's "Click for full compiler diagnostic" feature (#​26269)
Performance
  • Co-locate retained definition usage state (#​26019)
  • Use never-change durability for immutable file inputs (#​26353)
Diagnostics
  • Reject undeclared protocol instance attributes (#​26336)
Core type checking
  • Allow replacing ordinary methods with compatible functions (#​26158)
  • Distinguish typing.TypedDict from typing_extensions.TypedDict (#​25843)
  • Don't treat non-empty ranges as single-valued (#​26351)
  • Handle TypeVar bounds over type[...] in attribute lookup (#​26146)
  • Infer definite equality comparison results (#​26337)
  • Infer mismatched literal comparisons (#​26313)
  • match statements: make class-pattern fallthrough member-aware (#​26283)
  • match statements: prove TypedDict structural patterns exhaustive (#​26285)
  • match statements: resolve positional class-pattern exhaustiveness (#​26284)
  • Model non-exhaustive enum member sets (enum.Flags) (#​26277)
  • Reduce retained definition map storage (#​26348)
  • Reuse equality semantics for membership compatibility (#​25955)
  • Sync vendored typeshed stubs to support builtins.sentinel (#​26341)
  • Treat non-empty range calls as non-empty for reachability (#​25220)
  • Use assignability for divergent constraints (#​26334)
  • Widen inferred class-valued instance attributes (#​26338)
Contributors

v0.0.53

Compare Source

Released on 2026-06-23.

Bug fixes
  • Avoid bypassing lazy constraints for Divergent (#​26288)
  • Avoid recursion when projecting narrowing constraints (#​26276)
  • Fix ParamSpec callable signature extraction for callable instances (#​26279)
  • Make multi-arm TypeOf cycle recovery monotonic (#​26275)
LSP server
  • Document all special forms in ty_extensions (#​26263)
Performance
  • Avoid cloning fallback condition flow snapshots (#​26203)
  • Avoid constructing discarded speculative diagnostics (#​26251)
  • Avoid path lookups when sorting same-file diagnostics (#​26257)
  • Cache is_never_satisfied results (#​26261)
  • Defer applying type context to simple standalone expressions (#​26252)
Core type checking
  • Infer types for names bound in match patterns (#​25940)
  • Preserve regular kind for callable instances (#​26253)
  • Simplify intersections of invariant generic types with Any specializations (#​26127)
Contributors

v0.0.52

Compare Source

Released on 2026-06-22.

Bug fixes
  • Avoid shadowing hints for attribute assignments (#​26164)
  • Fix dict.pop overloads to accept arbitrary keys with defaults (#​26241)
  • Normalize recursive TypeOf across multiple union arms (#​26230)
  • Normalize recursive TypeOf growth during cycle recovery (#​26163)
  • Normalize recursive protocol growth during cycle recovery (#​26246)
  • Preserve generic alias identity during cycle recovery (#​26166)
  • Recover from dynamic class code generator cycles (#​26167)
LSP server
  • Add a go-to destination for Divergent (#​26162)
  • Publish diagnostics for all open files after a single file is saved (#​25929)
  • Render Markdown for reStructuredText fields in docstrings on hover (#​25903)
CLI
  • Make error-on-warning the default (#​26157)
Diagnostics
  • Make rendering of fix diffs more concise (#​26161)
Performance
  • Avoid allocating disabled error context trees (#​26191)
  • Avoid lookup maps for small place tables (#​26177)
  • Avoid moving boxed use-def map builders (#​26211)
  • Avoid transient AST ID merge map (#​26185)
  • Batch signature typevar freshness scans (#​26196)
  • Box large semantic index builders (#​26186)
  • Build frozen definition maps directly (#​26188)
  • Compact use-def binding interner keys (#​26193)
  • Consume condition flow snapshots (#​26189)
  • Lazily allocate reachability caches (#​26194)
  • Remove redundant use-def state shrinking (#​26206)
  • Reuse the first union bindings buffer (#​26225)
  • Short-circuit terminal narrowing constraints (#​26215)
  • Solve simple constraint conjunctions directly (#​25879)
  • Store cycle-detector cache entries inline (#​26183)
  • Stream indexed AST construction (#​26184)
  • Suppress discarded TypedDict diagnostics (#​26250)
  • Use SmallVec for CycleDetector::seen (#​26181)
  • Use a SmallVec for seen type aliases (#​26187)
Core type checking
  • Raise limit for number of non-recursive union literals (#​25212)
  • Preserve gradual behavior for explicit Any subclasses (#​26034)
  • Preserve metaclasses when inheriting from intersection-typed bases (#​26145)
  • Recognize exhaustive matches over finite tuples (#​26132)
Contributors

v0.0.51

Compare Source

Released on 2026-06-18.

Bug fixes
  • Fix bound TypeVar default cycle recovery (#​26124)
  • Support Annotated[Any, ...] as a class base (#​26133)
LSP server
  • Suggest keyword-only arguments between variadic parameters (#​26134)
Core type checking
  • Avoid assuming classes with Any or Unknown bases are descriptors (#​26120)
  • Infer simpler types in complex lambda cycles (#​26137)
  • Preserve exact class objects during identity narrowing (#​26117)
Diagnostics
  • Preserve unpacking diagnostics for nested assignment targets (#​26121)
Performance
  • Compact indexed AST node storage (#​25998)
  • Discard dead DNF branches in intersection building (#​26144)
Documentation
  • Remove broken gradual guarantee link (#​3806)
Contributors

v0.0.50

Compare Source

Released on 2026-06-17.

Bug fixes
  • Avoid cross-TypeVar leakage in generic inference (#​26099)
  • Fix panic from oscillating collection-use constraints (#​26031)
  • Preserve type variables in fixed tuple aliases (#​26041)
  • Respect ParamSpec binding contexts (#​25993)
  • Show bare Final as a special form on hover (#​26029)
  • Support options in functional dataclass calls (#​25989)
LSP server
  • Add context-sensitive keyword completions (#​26036)
  • Fix wildcard import symbol range (#​25740)
  • Highlight decorated methods consistently (#​26003)
  • Preserve narrowing after qualified TYPE_CHECKING (#​26051)
  • Respect client's content format preference (#​25957)
  • Retain all diagnostic annotations in the server (#​26006)
  • Track unused-binding captures across nested scopes (#​25536)
Diagnostics
  • Fix override diagnostics for decorated methods (#​25671)
  • Improve duplicate-base diagnostics (#​26107)
  • Reject invalid dataclass flag combinations (#​25985)
  • Reject legacy TypeVars in PEP 695 class bases (#​25975)
  • Reject legacy TypeVars in PEP 695 functions (#​25979)
  • Respect @no_type_check in function validation (#​25994)
Performance
  • Avoid rebuilding unchanged specializations (#​25826)
  • Avoid redundant equality intersections (#​26057)
  • Avoid retaining empty use-def tables (#​26018)
  • Compact retained definition inference extras (#​25838)
  • Deduplicate retained scope inference types (#​25846)
  • Disable LRU tracking for one-shot checks (#​26106)
  • Fast path collection literals with exact type contexts (#​25878)
  • Flatten retained declaration states (#​25912)
  • Improve flow snapshot performance (#​26012)
  • Skip stub package checks in stub-free search paths (#​25963)
  • Speed up large-union narrowing (#​26048)
  • Speed up module resolution for projects with many search paths (#​25962)
  • Store cumulative binding end offsets (#​25913)
  • Use compact frozen representation for narrowing constraints (#​25990)
Core type checking
  • Annotate intersection and negation types using & and ~ (#​26035)
  • Diagnose zero-step slices on lists (#​25966)
  • Full-scope bidirectional inference for non-empty collection literals (#​25280)
  • Improve equality-based narrowing for ==, !=, and match (#​25788)
  • Infer precise values for standard-library enums (#​26103)
  • Make equality evaluation cycle-aware (#​26055)
  • Narrow equality across IntEnum classes (#​26079)
  • Narrow tuple expression match subjects (#​25874)
  • Preserve literal types for loop variables over literal collections (#​25083)
  • Preserve negative narrowing for starred sequence patterns (#​25927)
  • Preserve non-final types in Hashable unions (#​26039)
  • Support enum literals as tagged-union discriminants (#​25855)
  • Sync vendored typeshed stubs (#​25952). Typeshed diff
  • Sync vendored typeshed stubs (#​25997). Typeshed diff
  • Synthesize NamedTuple __match_args__ (#​25934)
  • Treat assigned enum hooks conservatively (#​25958)
  • Validate deprecated warning categories (#​26025)
Contributors

v0.0.49

Compare Source

Released on 2026-06-11.

Bug fixes
  • Fix site-package error when multiple versions of Python are installed in system path (#​25769)
Diagnostics
  • Point at attribute's binding site in `invalid-await diagnostic (#​24628)
  • Report redefined legacy TypeVars (#​25854)
Performance
  • Add dedicated TDDs for narrowing constraints (#​25834)
  • Avoid caching same-file raw signatures (#​25761)
  • Cache reachability evaluations during inference (#​25696)
  • Compact retained definition maps (#​25737)
  • Omit redundant definition inference owner keys (#​25837)
Core type checking
  • Preserve nominal type of enum.property instances (#​25849)
  • Restrict length narrowing to types that encode their length (#​25840)
  • Use peer context for collection literals (#​25848)
Contributors

v0.0.48

Compare Source

Released on 2026-06-10.

Performance
  • Avoid redundant constraint saturation work (#​25786)
Core type checking
Contributors

v0.0.47

Compare Source

Released on 2026-06-10.

Bug fixes
  • Avoid panicking on encountering a recursive NamedTuple that references a recursive NewType (#​25764)
  • Fix out-of-bound panic in notebooks involving suppression comments (#​25629)
Core type checking
Performance and memory-usage improvements
  • Avoid caching specialization-invariant known instances (#​25816)
  • Avoid resolving overload sets for ordinary functions (#​25817)
  • Store common definition inference results inline (#​25814)
  • Use Box<SystemPath> etc. in Files (#​25554)
Contributors

v0.0.46

Compare Source

Released on 2026-06-08.

Bug fixes
  • Avoid crash when hovering over Callable (#​25759)
Core type checking
  • Support Callable() in match statement class patterns (#​25541)
  • Improve support for enum.property (#​25681)
Contributors

v0.0.45

Compare Source

Released on 2026-06-08.

Bug fixes
  • Avoid treating dynamic class attributes as instance attributes (#​25678)
  • Fix divergence in recursive inference due to ambiguous overload (#​25548)
  • Preserve literal promotion for mixed bounds (#​25648)
Diagnostics
  • Add missing-type-argument lint rule (#​25617)
Core type checking
  • Add support for narrowing on tuple match cases (#​25493)
  • Check implicit open TypedDict extra items (#​25628)
  • Create fresh copies of generic callable typevars (#​24949)
  • Preserve deprecation on replacement functions (#​25688)
  • Preserve intersection receivers during attribute lookup (#​25626)
  • Preserve transparent callable decorators (#​25030)
Performance
  • Avoid AST load for callable description names (#​25728)
  • Avoid caching absent class decorators and type parameters (#​25689)
  • Avoid caching atomic type specializations (#​25663)
  • Avoid caching constant constraint relations (#​25656)
  • Avoid caching missing implicit attributes (#​25649)
  • Avoid caching trivial class-header queries (#​25692)
  • Avoid caching trivial member lookups (#​25661)
  • Bypass member lookup for module imports (#​25723)
  • Cache constraint implication checks (#​25714)
  • Cache upper-bound satisfiability (#​25710)
  • Compact retained function type signatures (#​25669)
  • Compact retained use-def bindings (#​25682)
  • Consolidate retained narrowing constraints (#​25660)
  • Construct trivial constraint sets directly (#​25659)
  • Resolve function descriptors directly (#​25675)
  • Share code-generator classification across specializations (#​25701)
  • Share parameter lists with Arc (#​25735)
  • Use same-file expression inference in reachability (#​25694)
Contributors

v0.0.44

Compare Source

Released on 2026-06-04.

Bug fixes
  • Avoid treating sys.implementation.version like sys.version_info (#​25608)
  • Fix anchor point for override diagnostics (#​25621)
LSP server
Performance
  • Add caching for pattern match narrowing (#​25613)
  • Compact retained definition and expression identities (#​25606)
  • Reuse expression cache for TypedDict union inference (#​25643)
  • Upgrade Salsa (#​25545)
Core type checking
  • Enable narrowing for unions of TypedDict (#​25188)
Contributors

v0.0.43

Compare Source

Released on 2026-06-03.

Bug fixes
  • Don't inject Unknown from non-callable elements of intersection call (#​25538)
  • Don't needlessly disambiguate the same type alias (#​25563)
  • Fix variance inference for nested type aliases (#​25567)
  • Ignore rejected member annotations for synthesized bindings (#​25427)
  • Normalize dynamic class literals in cycle recovery (#​25558)
  • Register file roots for first-party search paths (#​25522)
  • Treat union-bound typevars like unions for possibly-missing-attribute (#​25561)
LSP server
  • Suppress importable completions that are already in scope (#​25479)
Performance
  • Avoid retaining duplicate function signatures (#​25609)
  • Compact retained definition inference results (#​25593)
  • Compact retained definition kinds (#​25610)
  • Compact retained definitions by node (#​25498)
  • Consolidate AST ID reverse lookup (#​25455)
  • Consolidate retained use-def definition maps (#​25499)
  • Omit redundant definitions-by-node entries (#​25501)
  • Reuse common protocol constraints for TypedDict unions (#​25598)
Diagnostics
  • Improve error context for not-iterable diagnostics (#​24944)
Core type checking
  • Detect disjointness due to incompatible generic specializations (#​24822)
  • Distinguish typing.Callable from collections.abc.Callable (#​24954)
  • Include nested global/nonlocal bindings in type inference (#​25387)
  • Optional lower/upper bounds in individual constraints (#​25435)
  • Preserve slice-bound types in subscript inference (#​25446)
  • Reject Self in type aliases (#​25529)
  • Require literal booleans for TypedDict flags (#​25594)
  • Support narrowing on lengths (#​25347)
  • Synthesize precise __len__ methods for literals (#​25600)
  • Use callable type context to implicitly specialize generic class (#​25471)
  • expand type aliases inside type context unions (#​25553)
Contributors

v0.0.42

Compare Source

Released on 2026-06-01.

Bug fixes
  • Fix narrowing of enum literal unions by member identity (#​25520)
  • Detect recursive expansion in constraint-set solving (#​25442)
Core type checking
Performance
  • Avoid redundant work for empty collection context (#​25527)
  • Deduplicate retained use-def place states (#​25450)
  • Compact retained semantic maps (#​25238)
Contributors

v0.0.41

Compare Source

Released on 2026-05-31.

Bug fixes
  • Avoid panic for deferred dataclass field annotations (#​25444)
  • Avoid panic from cycle in function decorator inference (#​25475)
  • Ignore rejected assignments for synthesized bindings (#​25340)
  • Infer bool for not applied to dynamic values (#​25445)
  • Use diagnostic message as tie-breaker when sorting (#​25424)
LSP server
  • Add call hierarchy support (#​25338)
  • Add function parentheses completion (#​25305)
  • Display docs for matching parameter when hovering over the name of an argument passed by keyword (#​25283)
  • Document completeFunctionParentheses editor setting (#​3513)
Diagnostics
  • Introduce opt-in missing-override-decorator rule (#​25111)
  • Improve diagnostics for syntax errors in forward annotations (#​25158)
  • Improve diagnostic for failed assignment to a Callable type (#​25308)
Core type checking
  • Narrow bound method overloads by receiver (#​24707)
  • Add disjointness for protocol method members (#​25315)
  • Avoid treating metaclass declarations as populated values (#​25432)
  • Use TypeForm in ty_extensions (#​25421)
Performance
  • Avoid storing redundant reachability indexes (#​25453)
  • Compact retained semantic arrays (#​25454)
  • Remove excess capacity from more Salsa cached collections (#​25411)
  • Use compact sets for more immutable fields (#​25476)
  • Use ThinVec for sparse kwargs bindings (#​25457)
Contributors

v0.0.40

Compare Source

Released on 2026-05-27.

Bug fixes
  • Accept complete enum-literal alias unions as enums (#​25341)
  • Fix diagnostics in ignored folders after adding new files (#​25236)
  • Show LiteralString when hovering over an inline of a literal string in an IDE (#​25373)
LSP server
  • Follow aliases when attempting to map a definition in a stub file to its "real" runtime definition (#​25328)
  • Treat Python notebook text documents as Python sources (#​25393)
  • Fix autocompletion for elements inside incomplete list comprehensions (#​25326)
Diagnostics
  • Add a subdiagnostic help message to invalid-generic-class diagnostics regarding incompatible variance (#​25385)
Core type checking
  • Ignore and reject annotations on non-name targets (#​25324)
  • Infer class attributes assigned by metaclass initialization (#​25342)
  • Reject inconsistent generic bases in "dynamic" classes created using type(...), types.new_type(...), etc. (#​25413)
  • Resolve enum names for all unions arms in Literal enum subsets (#​25379)
  • Support typing.TypeForm (#​25334)
  • Fix many issues in the generics solver by using constraint sets more widely to solve type variables (#​24540)
Contributors
fastapi/typer (typer)

v0.27.0

Compare Source

Breaking Changes
Internal

v0.26.8

Compare Source

Fixes
  • 🐛 Make second column of Rich help output reflect the type consistently, even when using metavar. PR #​1410 by @​svlandeg.
  • 🐛 Fix formatting in NoSuchOption.format_message(). PR #​1843 by @​foomunleong.
Docs
  • 📝 Update docs badges: remove Publish badge, it doesn't give extra information. PR #​1850 by @​tiangolo.
  • 📝 Fix formatting for help link to support GitHub-specific overview edge-case. PR #​1826 by @​phalberg.
Internal

v0.26.7

Compare Source

Fixes

v0.26.6

Compare Source

Fixes
Internal

v0.26.5

Compare Source

Fixes
  • 🐛 Ensure that hidden commands are not shown when Rich markup is disabled. PR #​1812 by @​svlandeg.
Internal

v0.26.4

Compare Source

Features
Internal

v0.26.3

Compare Source

Refactors
Internal

v0.26.2

Compare Source

Fixes
  • 🐛 Ensure that an envvar set for a typer.Option list is split on whitespace. PR #​1791 by @​svlandeg.

v0.26.1

Compare Source

Fixes
Internal

v0.26.0

Compare Source

Breaking Changes
  • Vendor Click and streamline Typer's functionality and code base. PR #​1774 by @​svlandeg.
    • Typer no longer depends on Click as a third party dependency, it vendors (includes the source code of) Click.
    • This simplifies the work done by both Click and Typer teams.
    • It allows Typer to evolve independently, and enables several new planned features.
    • It will solve several dependency conflict situations for projects that use some packages that depend on Click and some that depend on Typer.
    • This also means that Click-specific functionality is no longer supported, like extracting the Click app and adding Click-specific plug-ins, or customizing the field types with Click-specific types.
    • You can read more about it in the docs for Vendored Click.
Docs
Internal

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate.

This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | https://code.forgejo.org/actions/checkout | action | digest | `de0fac2` → `fbc6f39` | | [hyperloglog](https://github.com/svpcom/hyperloglog) | project.dependencies | patch | `0.1.5` → `0.1.8` | | [mypy](https://github.com/python/mypy) ([changelog](https://mypy.readthedocs.io/en/latest/changelog.html)) | project.optional-dependencies | minor | `2.1.0` → `2.3.0` | | [numpy](https://github.com/numpy/numpy) ([changelog](https://numpy.org/doc/stable/release)) | project.dependencies | minor | `2.4.6` → `2.5.1` | | [pytest](https://github.com/pytest-dev/pytest) ([changelog](https://docs.pytest.org/en/stable/changelog.html)) | project.optional-dependencies | minor | `9.0.3` → `9.1.1` | | [pytest](https://github.com/pytest-dev/pytest) ([changelog](https://docs.pytest.org/en/stable/changelog.html)) | dependency-groups | minor | `9.0.3` → `9.1.1` | | [ruff](https://docs.astral.sh/ruff) ([source](https://github.com/astral-sh/ruff), [changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | project.optional-dependencies | minor | `0.15.14` → `0.16.0` | | [ruff](https://docs.astral.sh/ruff) ([source](https://github.com/astral-sh/ruff), [changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | dependency-groups | minor | `0.15.14` → `0.16.0` | | [ty](https://github.com/astral-sh/ty) ([changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)) | dependency-groups | patch | `0.0.39` → `0.0.65` | | [typer](https://github.com/fastapi/typer) ([changelog](https://typer.tiangolo.com/release-notes/)) | project.dependencies | minor | `0.25.1` → `0.27.0` | --- ### Release Notes <details> <summary>python/mypy (mypy)</summary> ### [`v2.3.0`](https://github.com/python/mypy/compare/v2.2.0...v2.3.0) [Compare Source](https://github.com/python/mypy/compare/v2.2.0...v2.3.0) ### [`v2.2.0`](https://github.com/python/mypy/compare/v2.1.0...v2.2.0) [Compare Source](https://github.com/python/mypy/compare/v2.1.0...v2.2.0) </details> <details> <summary>numpy/numpy (numpy)</summary> ### [`v2.5.1`](https://github.com/numpy/numpy/releases/tag/v2.5.1): (July 4, 2026) [Compare Source](https://github.com/numpy/numpy/compare/v2.5.0...v2.5.1) ### NumPy 2.5.1 Release Notes The NumPy 2.5.1 is a patch release that fixes bugs discovered after the 2.5.0 release. The most noticeable is the fix is to the numpy datetime cython API which should allow downstream to support NumPy versions older than 2.5. Preparation for Python 3.15 continues along with typing improvements. This release supports Python versions 3.12-3.14 #### Changes - The minimum supported GCC version has been updated from 9.3.0 to 10.3.0 ([gh-31843](https://github.com/numpy/numpy/pull/31843)) #### Contributors A total of 10 people contributed to this release. People with a "+" by their names contributed a patch for the first time. - Adhyan Gupta + - Ankit Ahlawat - Charles Harris - Iason Krommydas - Joren Hammudoglu - Kumar Aditya - Nathan Goldbaum - Sebastian Berg - Ties Jan Hefting + - Vineet Kumar #### Pull requests merged A total of 20 pull requests were merged for this release. - [#&#8203;31707](https://github.com/numpy/numpy/pull/31707): MAINT: Prepare 2.5.x for further development - [#&#8203;31721](https://github.com/numpy/numpy/pull/31721): CI: fix new `cython-lint` errors ([#&#8203;31711](https://github.com/numpy/numpy/issues/31711)) - [#&#8203;31723](https://github.com/numpy/numpy/pull/31723): MAINT: Update meson to match main - [#&#8203;31729](https://github.com/numpy/numpy/pull/31729): TST: use setup-sde instead of curl to get SDE binaries ([#&#8203;31727](https://github.com/numpy/numpy/issues/31727)) - [#&#8203;31829](https://github.com/numpy/numpy/pull/31829): BUG: Relax finfo to be easier accessible for all user dtypes... - [#&#8203;31831](https://github.com/numpy/numpy/pull/31831): TYP: Fix `flatiter.__next__` return type for `object_` and... - [#&#8203;31832](https://github.com/numpy/numpy/pull/31832): BUG: avoid deadlocks using NpyString API ([#&#8203;31682](https://github.com/numpy/numpy/issues/31682)) - [#&#8203;31833](https://github.com/numpy/numpy/pull/31833): BUG: fix out array leak in reduceat and accumulate when dtype... - [#&#8203;31835](https://github.com/numpy/numpy/pull/31835): BUG: fix numpy datetime cython APIs to be compatible with older... - [#&#8203;31836](https://github.com/numpy/numpy/pull/31836): TYP: Fix incorrect dtype inference of `asarray([])` ([#&#8203;31732](https://github.com/numpy/numpy/issues/31732)) - [#&#8203;31837](https://github.com/numpy/numpy/pull/31837): TYP: Fix `np.ma.masked_array` 2.5.0 regression - [#&#8203;31838](https://github.com/numpy/numpy/pull/31838): FIX: Refactor error handling in array\_setstate to prevent typecode... - [#&#8203;31839](https://github.com/numpy/numpy/pull/31839): TST: xfail multithreaded BLAS test more generously - [#&#8203;31840](https://github.com/numpy/numpy/pull/31840): MAINT: Rename subroutine for crackfortran tests - [#&#8203;31842](https://github.com/numpy/numpy/pull/31842): BUG: fix leak in reductions when a ufunc override errors or is... - [#&#8203;31849](https://github.com/numpy/numpy/pull/31849): BLD: set minimum required gcc version to 10.3 ([#&#8203;31843](https://github.com/numpy/numpy/issues/31843)) - [#&#8203;31855](https://github.com/numpy/numpy/pull/31855): CI: fix hangs on MacOS ASan CI ([#&#8203;31853](https://github.com/numpy/numpy/issues/31853)) - [#&#8203;31856](https://github.com/numpy/numpy/pull/31856): BUG: fix several bugs in StringDType operations ([#&#8203;31846](https://github.com/numpy/numpy/issues/31846)) - [#&#8203;31857](https://github.com/numpy/numpy/pull/31857): BUG: Fix segfault in MT19937 by preventing recursive seed lists... - [#&#8203;31858](https://github.com/numpy/numpy/pull/31858): BUG: Fix signed integer overflow in datetime.c ([#&#8203;31688](https://github.com/numpy/numpy/issues/31688)) ### [`v2.5.0`](https://github.com/numpy/numpy/releases/tag/v2.5.0): (June 21, 2026) [Compare Source](https://github.com/numpy/numpy/compare/v2.4.6...v2.5.0) ### NumPy 2.5.0 Release Notes Numpy 2.5.0 is a transitional release. It drops support for Python 3.11, marking the end of distutils, and expires a large number of deprecations made in the 2.0.x release. It also improves free threading and brings sorting into compliance with the array-api standard with the addition of descending sorts. There is also a fair amount of preparation for Python 3.15, which will be supported starting with the first rc. This release supports Python versions 3.12-3.14. #### Highlights - Distutils has been removed, - Many expired deprecations, see below, - Many new deprecations, see below, - Many static typing improvements. - Improved support for free threading, - Support for descending sorts, See New Features below for other additions. #### Deprecations - `numpy.char.chararray` is deprecated. Use an `ndarray` with a string or bytes dtype instead. ([gh-30605](https://github.com/numpy/numpy/pull/30605)) - `numpy.take` now correctly checks if the result can be cast to the provided `out=out` under the same-kind rule. A `DeprecationWarning` is given now when this check fails. Previously, `take` incorrectly checked if `out` could be cast to the result (the wrong direction). This deprecation also affects `compress` and possibly other functions. (Future versions of NumPy may tighten the casting check further.) ([gh-30615](https://github.com/numpy/numpy/pull/30615)) - The `numpy.char.[as]array` functions are deprecated. Use an `numpy.[as]array` with a string or bytes dtype instead. ([gh-30802](https://github.com/numpy/numpy/pull/30802)) - Setting the dtype attribute is deprecated because mutating an array is unsafe if an array is shared, especially by multiple threads. As an alternative, you can create a view with a new dtype via `array.view(dtype=new_dtype)`. ([gh-29244](https://github.com/numpy/numpy/pull/29244)) - Setting the `shape` attribute is deprecated because mutating an array is unsafe if an array is shared, especially by multiple threads. As an alternative, you can create a new view via `np.reshape` or `np.ndarray.reshape`. For example: `x = np.arange(15); x = np.reshape(x, (3, 5))`. To ensure no copy is made from the data, one can use `np.reshape(..., copy=False)`. While setting the shape on an array is discouraged, for cases where it is difficult to work around, e.g., in `__array_finalize__`, it is possible with the private method `np.ndarray._set_shape`. ([gh-29536](https://github.com/numpy/numpy/pull/29536)) - Using the `generic` unit in `numpy.timedelta64` is deprecated since this can lead to unexpected behavior such as non-transitive comparison, see [gh-28287](https://github.com/numpy/numpy/issues/28287) for details. As an alternative, specify an explicit unit such as `'s'` (seconds) or `'D'` (days) when constructing `numpy.timedelta64`. Due to this change, operations that implicitly rely on the `generic` unit are also deprecated. For example: ``` arr = np.array([1, 2, 3], dtype="m8[s]") ``` ### `1` is implicitly converted to generic timedelta64 ``` arr + 1 ``` ([gh-29619](https://github.com/numpy/numpy/pull/29619)) - Resizing a Numpy array in place is deprecated since mutating an array is unsafe if an array is shared, especially by multiple threads. As an alternative, you can create a resized array via `np.resize`. ([gh-30181](https://github.com/numpy/numpy/pull/30181)) - `numpy.fix` is deprecated, use `numpy.trunc` instead. It is faster and follows the Array API standard. Both functions provide identical functionality: rounding array elements towards zero. ([gh-30644](https://github.com/numpy/numpy/pull/30644)) - `numpy.ma.round_` is deprecated. `numpy.ma.round` can be used as a replacement. ([gh-30738](https://github.com/numpy/numpy/pull/30738)) - `numpy.typename` is deprecated because the names returned by it were outdated and inconsistent. `numpy.dtype.name` can be used as a replacement. ([gh-30774](https://github.com/numpy/numpy/pull/30774)) - Inputs other than integers are deprecated for `numpy.triu_indices` and `numpy.tril_indices`. Non-integer values for the `M`, `k` and `N` parameters of `numpy.tri` are deprecated. Non-integer values for the `k` parameter of both `numpy.tril_indices_from` and `numpy.triu_indices_from` are deprecated. ([gh-30869](https://github.com/numpy/numpy/pull/30869)) - Deprecations in custom `dtype` property and `__array_finalize__`. Previously `arr.view(dtype=new_dtype)` called `arr.dtype = new_dtype` also for subclasses, i.e., the attribute setting. That path is now deprecated and refined, meaning that even subclasses that do not see this `DeprecationWarning` may wish to update their code. A subclass that does any `dtype` specific logic (i.e. verifying the dtype in `__array_finalize__` or has a `dtype` property) should now: - Set `_set_dtype = None` in which case `arr.view(dtype=new_dtype)` will call `__array_finalize__` with the new dtype, ensuring that any validation `__array_finalize__` will run is done. - Or, for a quick fix, define `_set_dtype` as a function (calling `ndarray._set_dtype()` to avoid `DeprecationWarnings`. (Future versions might migrate towards the `_set_dtype = None` path.) Ideally, follow NumPy's deprecation to prevent `dtype` mutation by users. The use of `ndarray._set_dtype()` may be necessary for some subclass finalization patterns, but should otherwise be avoided. ([gh-31293](https://github.com/numpy/numpy/pull/31293)) #### Expired deprecations - `numpy.distutils` has been removed ([gh-30340](https://github.com/numpy/numpy/pull/30340)) - Passing `None` as dtype to `np.finfo` will now raise a `TypeError` (deprecated since 1.25) ([gh-30460](https://github.com/numpy/numpy/pull/30460)) - `numpy.cross` no longer supports 2-dimensional vectors. (Deprecated since 2.0) ([gh-30461](https://github.com/numpy/numpy/pull/30461)) - `numpy._core.numerictypes.maximum_sctype` has been removed. (deprecated since 2.0) ([gh-30462](https://github.com/numpy/numpy/pull/30462)) - `numpy.row_stack` has been removed in favor of `numpy.vstack`. (deprecated since 2.0) ([gh-30463](https://github.com/numpy/numpy/pull/30463)) - `get_array_wrap` has been removed. (deprecated since 2.0) ([gh-30463](https://github.com/numpy/numpy/pull/30463)) - `recfromtxt` and `recfromcsv` have been removed from `numpy.lib._npyio` in favor of `numpy.genfromtxt`. (deprecated since 2.0) ([gh-30467](https://github.com/numpy/numpy/pull/30467)) - The `numpy.chararray` re-export of `numpy.char.chararray` has been removed. (deprecated since 2.0) ([gh-30604](https://github.com/numpy/numpy/pull/30604)) - `bincount` now raises a `TypeError` for non-integer inputs. (deprecated since 2.1) ([gh-30610](https://github.com/numpy/numpy/pull/30610)) - The `numpy.lib.math` alias for the standard library `math` module has been removed. (deprecated since 1.25) ([gh-30612](https://github.com/numpy/numpy/pull/30612)) - Data type alias `'a'` was removed in favor of `'S'`. (deprecated since 2.0) ([gh-30613](https://github.com/numpy/numpy/pull/30613)) - `_add_newdoc_ufunc(ufunc, newdoc)` has been removed in favor of `ufunc.__doc__ = newdoc`. (deprecated since 2.2) ([gh-30614](https://github.com/numpy/numpy/pull/30614)) #### Compatibility notes ##### `linalg.eig` and `linalg.eigvals` now always return complex arrays Previously, the return values depended on whether the eigenvalues happen to lie on the real line (which, for a general, non-symmetric matrix, is not guaranteed). This change makes consistent what was a value-dependent result. To retain the previous behavior, do: ``` w = eigvals(a) if np.any(w.imag == 0): # this is what NumPy used to do w = w.real ``` If your matrix is symmetrix/hermitian, use `eigh` and `eigvalsh` instead of `eig` and `eigvals`. These are guaranteed to return real values. A common case is covariance matrices, which are symmetric and positive definite by construction. ([gh-30411](https://github.com/numpy/numpy/pull/30411)) ##### MSVC support NumPy now requires minimum MSVC 19.35 toolchain version on Windows platforms. This corresponds to Visual Studio 2022 version 17.5 Preview 2 or newer. ([gh-30489](https://github.com/numpy/numpy/pull/30489)) ##### Cython support NumPy's Cython headers (accessed via `cimport numpy`) now require Cython 3.0 or newer to build. If you try to compile a project that depends on NumPy's Cython headers using Cython 0.29 or older, you will see a message like this: ``` Error compiling Cython file: ------------------------------------------------------------ ... ``` ### versions. ``` # ``` ### See **init**.cython-30.pxd for the real Cython header ``` # DEF err = int('Build aborted: the NumPy Cython headers require Cython 3.0.0 or newer.') ------------------------------------------------------------ /path/to/site-packages/numpy/__init__.pxd:11:13: Error in compile-time expression: ValueError: invalid literal for int() with base 10: 'Build aborted: the NumPy Cython headers require Cython 3.0.0 or newer.' ``` Note that the invalid integer is not a bug in NumPy - we are intentionally generating this error to avoid triggering a more obscure error later in the build when an older Cython version tries to use a Cython feature that was not available in the old Cython version. ([gh-30770](https://github.com/numpy/numpy/pull/30770)) ##### `numpy.where` no longer truncates Python integers Previously, if the `x` or `y` argument of `numpy.where` was a Python integer that was out of range of the output type, it would be silently truncated. Now, an `OverflowError` will be raised instead. This change also applies to the underlying C API function `PyArray_Where`. ([gh-30803](https://github.com/numpy/numpy/pull/30803)) ##### Default memory allocator change NumPy now uses `PyMem_RawMalloc` and `PyMem_RawFree` as the default memory allocator, instead of system's `malloc` and `free` directly. ([gh-30846](https://github.com/numpy/numpy/pull/30846)) ##### `from_dlpack` raises `BufferError` instead of `RuntimeError` `np.from_dlpack` now raises `BufferError` instead of `RuntimeError` when the incoming DLPack tensor has an unsupported device, dtype, or exceeds the maximum number of dimensions. This aligns with the DLPack and Array API specifications, which recommend `BufferError` for data that cannot be imported. ([gh-30937](https://github.com/numpy/numpy/pull/30937)) ##### Corrections to the BTPE binomial sampler Two independent errors in the Stirling series of the acceptance/rejection step of the BTPE algorithm used by `numpy.random.Generator.binomial` have been corrected: - The third and fourth error terms were added rather than subtracted. This sign error was inherited from section 5.3 of the original 1988 paper by Kachitvichyanukul & Schmeiser, which incorrectly adds all four terms. - The leading coefficient had a digit-swap typo (`13680` instead of `13860`) that was introduced in the initial implementation. As a result, `Generator.binomial` and `Generator.multinomial`, which uses binomial internally, may now return different samples for the same seed. The legacy `numpy.random.RandomState.binomial` and `numpy.random.RandomState.multinomial` are not affected: they preserve the original (incorrect) behavior, so existing streams remain reproducible. ([gh-31238](https://github.com/numpy/numpy/pull/31238)) ##### `datetime64`/`timedelta64` arithmetic raises on overflow Addition, subtraction, and integer multiplication of `datetime64` and `timedelta64` values now raise `OverflowError` when the result would overflow `int64` or land on the `NaT` sentinel value. Previously these operations silently wrapped, often producing a value that was indistinguishable from `NaT`. This matches the overflow checking already performed by unit-conversion casts. ([gh-31378](https://github.com/numpy/numpy/pull/31378)) #### C API changes - It is now possible to register `"real"` and `"imag"` ArrayMethods via `PyUFunc_AddLoopsFromSpecs`. These will be used for `imag` and `real` and should normally set `*view_offset` in their `resolve_descriptors` function to allow the array attributes to return views. ([gh-30984](https://github.com/numpy/numpy/pull/30984)) - New `PyDataType_TYPE`, `PyDataType_KIND`, `PyDataType_BYTEORDER` and `PyDataType_TYPEOBJ` accessor macros to the C API. Together with the other accessor macros added for the NumPy 2.0 transition, these allow accessing the fields of `PyArray_Descr` structs without any direct field accesses. ([gh-30994](https://github.com/numpy/numpy/pull/30994)) - NumPy now supports the stable ABI for free-threaded Python as described in `803`{.interpreted-text role="pep"}. ([gh-31091](https://github.com/numpy/numpy/pull/31091)) - `PyArray_DescrFromScalar` now returns the full dtype descriptor for scalars of user-defined parametric data types, including any dtype parameters. Parameters were previously silently discarded, which could cause incorrect results in operations like `astype` on scalar objects. Internally, the function now delegates to `discover_descr_from_pyobject`, which handles parametric dtypes correctly. ([gh-31067](https://github.com/numpy/numpy/pull/31067)) #### New Features - It is now possible to register user-dtypes for dlpack export and import via `numpy.dtypes.register_dlpack_dtype`. This functionality is meant to be used with care by user-dtype authors. ([gh-31256](https://github.com/numpy/numpy/pull/31256)) ##### Pixi package definitions Pixi package definitions have been added for different kinds of from-source builds of NumPy. These can be used in downstream Pixi workspaces via the `pixi-build` feature. Definitions for both `default` and AddressSanitizer-instrumented (`asan`) builds are available in the source code under the `pixi-packages/` directory. `linux-64` and `osx-arm64` platforms are supported. ([gh-30381](https://github.com/numpy/numpy/pull/30381)) ##### `numpy.ndarray` now supports structural pattern matching `numpy.ndarray` and its subclasses now have the `Py_TPFLAGS_SEQUENCE` flag set, enabling structural pattern matching (PEP 634) with `match`/`case` statements. This also enables Cython to optimize integer indexing operations. See `` `arrays.ndarray.pattern-matching ``{.interpreted-text role="ref"}\` for details. ([gh-30653](https://github.com/numpy/numpy/pull/30653)) ##### Added N-D evaluation functions to the polynomial package New functions `polyvalnd`, `chebvalnd`, `legvalnd`, `hermvalnd`, `hermevalnd`, and `lagvalnd` have been added to evaluate polynomials in arbitrary dimensions, analogous to the existing 2D and 3D evaluators. ([gh-30857](https://github.com/numpy/numpy/pull/30857)) ##### New "descending" keyword argument for `numpy.sort` and `numpy.argsort` Users can now pass the `descending=True` keyword argument to `numpy.sort` and `numpy.argsort` to sort and argsort arrays in descending order. NaN values, if present, are sorted to the end of the array in both ascending and descending sorts. This feature is available for all built-in dtypes except `void`, `object`, and `generic`. Note that SIMD optimizations for sorting are currently not available for descending sorts, so performance may be slower. ([gh-31345](https://github.com/numpy/numpy/pull/31345)) #### Improvements For `f2py`, the behaviour of `intent(inplace)` has improved. Previously, if an input array did not have the right dtype or order, the input array was modified in-place, changing its dtype and replacing its data by a corrected copy. Now, instead, the corrected copy is kept a separate array, which, after being passed and presumably modified by the fortran routine, is copied back to the input routine. The above means one no longer has the risk that pre-existing views or slices of the input array start pointing to unallocated memory (at the price of increased overhead for the write-back copy at the end of the call). A potential problem would be that one might get very different results if one, e.g., previously passed in an integer array where a double array was expected: the writeback to integer would likely give wrong results. To avoid such situations, `intent(inplace)` will now only allow arrays that have equivalent type to that used in the fortran routine, i.e., `dtype.kind` is the same. For instance, a routine expecting double would be able to receive float, but would raise on integer input. ([gh-29929](https://github.com/numpy/numpy/pull/29929)) ##### `f2py` modules now show allocatable arrays in `dir()` Allocatable module variables wrapped by `f2py` now appear in `dir()` output, matching their accessibility by name. ([gh-30965](https://github.com/numpy/numpy/pull/30965)) ##### `StringDType` comparisons now correctly handle embedded NULL bytes. ([gh-31662](https://github.com/numpy/numpy/pull/31662)) #### Performance improvements and changes ##### Improved performance of `numpy.searchsorted` The C++ binary search implementation used by `numpy.searchsorted` now has a much better performance when searching for multiple keys. The new implementation batches binary search steps across all keys to leverage cache locality and out-of-order execution. Benchmarks show the new implementation can be up to 20 times faster for hundreds of thousands keys while single-key performance remains comparable to previous versions. ([gh-30517](https://github.com/numpy/numpy/pull/30517)) ##### Improved scaling of ufuncs on free-threading NumPy's ufuncs now scale significantly better on free-threading builds of CPython due to the following optimizations: - **Lock-free dispatch table:** The ufuncs dispatch table is now implemented as a lock-free concurrent hash map, allowing multiple threads to call ufuncs without contention. - **Immortal shared objects:** Certain shared objects, such as global memory handlers, have been made immortal. This effectively reduces reference counting contention across threads. - **Optimized memory allocation:** NumPy now utilizes `PyMem_RawMalloc` and `PyMem_RawFree` for memory allocation. On Python 3.15 and newer, this leverages `mimalloc` and significantly reduces memory allocation overhead in multi-threaded workloads. ([gh-30846](https://github.com/numpy/numpy/pull/30846)) ##### Faster reductions on small/medium contiguous arrays `numpy.sum`, `numpy.prod`, `numpy.any`, `numpy.all`, and other reductions with an identity value now use a fast path when the input is a contiguous, aligned, non-object array and the reduction covers all axes (`axis=None`) with no special arguments. Typical speedup is \~1.3x on small arrays; `numpy.any` / `numpy.all` on contiguous boolean arrays can see speedup up to 1.9x. ([gh-31274](https://github.com/numpy/numpy/pull/31274)) #### Typing improvements and changes ##### `numpy.linalg` typing improvements and preliminary shape-typing support Input and output dtypes for `numpy.linalg` functions are now more precise. Several of these functions also gain preliminary shape-typing support while remaining backward compatible. For example, the return type of `numpy.linalg.matmul` now depends on the shape-type of its inputs, or fall back to the backward-compatible return type if the shape-types are unknown at type-checking time. Because of limitations in Python's type system and current type-checkers, shape-typing cannot cover every situation and is often only implemented for the most common lower-rank cases. ([gh-30480](https://github.com/numpy/numpy/pull/30480)) ##### `numpy.ma` typing annotations The `numpy.ma` module is now fully covered by typing annotations. This includes annotations for masked arrays, masks, and various functions and methods. With this, NumPy has achieved 100% typing coverage across all its submodules. ([gh-30566](https://github.com/numpy/numpy/pull/30566)) ##### Shape-typing support for many functions and methods Many functions and methods now have shape-aware return type annotations. Type-checkers can now infer the number of dimensions of the returned array through common operations. For example, `np.linspace(0, 1)` is now typed as a 1-d `float64` array, and `np.sum(x, keepdims=True)` has the same number of dimensions as `x`. This covers `numpy.linalg` functions, array creation functions (like `asarray`, `from{buffer,string,file,iter,regex}`), range functions (`linspace`, `logspace`, `geomspace`), aggregation functions and methods (`sum`, `mean`, `std`, `var`, `min`, `max`, `all`, `any`, etc.), sorting (`sort`, `argsort`, `argpartition`), cumulative operations (`cumsum`, `cumprod`, etc.), set operations (`unique_values`, `intersect1d`, `union1d`, etc.), and various other functions including `nonzero`, `transpose`, `diagonal`, `atleast_{1,2,3}d`, `clip`, `round`, `inner`, `bincount`, and `fft.fftfreq`. Several of these also gained more precise return dtype annotations as part of this work. Shape-typing is still a work-in-progress, so coverage is not yet complete. Because of limitations in Python's type system and current type-checkers, shape-typing is often only implemented for the most common lower-rank cases. ([gh-31172](https://github.com/numpy/numpy/pull/31172)) ##### `numpy.fft` typing improvements and preliminary shape-typing support The `numpy.fft` functions now support non-`float64`/`complex128` dtypes and gain preliminary shape-typing support. For example, the return type of `numpy.fft.fft` now depends on the shape-type of its inputs, falling back to the backward-compatible return type when the shape-types are unknown at type-checking time. ([gh-31226](https://github.com/numpy/numpy/pull/31226)) #### Changes ##### Structured array copies now use `memcpy` for contiguous dtypes Copying structured arrays with identical dtypes now uses `memcpy` instead of field-by-field transfer when the dtype has a contiguous layout (no gaps between fields). A new `NPY_NOT_TRIVIALLY_COPYABLE` dtype flag is set on structured dtypes that have gaps in their memory layout, such as those created with explicit `offsets` or via multi-field indexing. Only these dtypes continue to use the slower field-by-field copy. This means that padding bytes in contiguous structured dtypes (e.g. those created without explicit `offsets`) may now be copied as part of the `memcpy`, whereas previously they were left untouched. Code that relies on padding bytes being preserved during structured array copies may be affected. ([gh-29270](https://github.com/numpy/numpy/pull/29270)) ##### `numpy.ctypeslib.as_ctypes` now does not support scalar types The function `numpy.ctypeslib.as_ctypes` has been updated to only accept `numpy.ndarray`. Passing a scalar type (e.g., `numpy.int32(5)`) will now raise a `TypeError`. This change was made to avoid the issue [gh-30354](https://github.com/numpy/numpy/issues/30354) and to enforce the readonly nature of scalar types in NumPy. The previous behavior relied on undocumented implicit temporary arrays and was not well-defined. Users who need to convert scalar types to ctypes should first convert them to an array (e.g., `numpy.asarray`) before passing them to `numpy.ctypeslib.as_ctypes`. ([gh-30538](https://github.com/numpy/numpy/pull/30538)) ##### `__array_interface__` changes on scalars Scalars now export the `__array_interface__` directly rather than including an array copy as a `__ref` entry. This means that scalars are now exported as read-only while they previously exported as writeable. The path via `__ref` was undocumented and not consistently used even within NumPy itself. ([gh-30538](https://github.com/numpy/numpy/pull/30538)) ##### `meshgrid` now always returns a tuple `np.meshgrid` previously used to return a list when `sparse` was true and `copy` was false. Now, it always returns a tuple regardless of the arguments. ([gh-30707](https://github.com/numpy/numpy/pull/30707)) ##### `numpy.triu_indices` now accepts `unsigned integers` `numpy.triu_indices` previously used to error in some cases when `unsigned integers` were given as arguments. Now, it accepts them in all cases. ([gh-30869](https://github.com/numpy/numpy/pull/30869)) ##### `object` dtype in `.real` and `.imag` and related functions The array attributes `.real` and `.imag` now behave differently for object arrays and return `getattr(element, "real", element)` or `getattr(element, "imag", 0)` elementwise. Additionally, the return for both is now read-only to avoid possible in-place changes having no effect. This change also affects `np.isreal()` which uses `arr.imag`. Previously, `.imag` always returned `0` while `.real` returned the original array unmodified. The new behavior now returnes the correct values for complex Python objects but may also lead to surprises for example if `element.real()` is a method and not a property. ([gh-30984](https://github.com/numpy/numpy/pull/30984)) ##### NumPy's internal memory allocations now use `PyMem_RawMalloc` NumPy's internal memory allocations now use `PyMem_RawMalloc` instead of `malloc` and can be tracked by `tracemalloc`. ([gh-31503](https://github.com/numpy/numpy/pull/31503)) </details> <details> <summary>pytest-dev/pytest (pytest)</summary> ### [`v9.1.1`](https://github.com/pytest-dev/pytest/releases/tag/9.1.1) [Compare Source](https://github.com/pytest-dev/pytest/compare/9.1.0...9.1.1) ##### pytest 9.1.1 (2026-06-19) ##### Bug fixes - [#&#8203;14220](https://github.com/pytest-dev/pytest/issues/14220): Fixed a logic bug in `pytest.RaisesGroup` which would might cause it to display incorrect "It matches <span class="title-ref">FooError()</span> which was paired with <span class="title-ref">BarError</span>" messages. - [#&#8203;14591](https://github.com/pytest-dev/pytest/issues/14591): Fixed a regression in pytest 9.1.0 which caused overriding a parametrized fixture with an indirect <span class="title-ref">[@&#8203;pytest](https://github.com/pytest).mark.parametrize</span> to fail with "duplicate parametrization of '\<fixture name>'". - [#&#8203;14606](https://github.com/pytest-dev/pytest/issues/14606): Fixed `list-item` typing errors from mypy in `@pytest.mark.parametrize <pytest.mark.parametrize ref>` `argvalues` parameter. - [#&#8203;14608](https://github.com/pytest-dev/pytest/issues/14608): Fixed a regression in pytest 9.1.0 where `conftest.py` files located in `<invocation dir>/test*` were no longer loaded as initial conftests when invoked without arguments. This could cause certain hooks (like `pytest_addoption`) in these files to not fire. ### [`v9.1.0`](https://github.com/pytest-dev/pytest/releases/tag/9.1.0) [Compare Source](https://github.com/pytest-dev/pytest/compare/9.0.3...9.1.0) ##### pytest 9.1.0 (2026-06-13) ##### Removals and backward incompatible breaking changes - [#&#8203;14533](https://github.com/pytest-dev/pytest/issues/14533): When using `--doctest-modules`, autouse fixtures with `module`, `package` or `session` scope that are defined inline in Python test modules (not plugins or conftests) will now possibly execute twice. If this is undesirable, move the fixture definition to a `conftest.py` file if possible. Technical explanation for those interested: When using <span class="title-ref">--doctest-modules</span>, pytest possibly collects Python modules twice, once as `pytest.Module` and once as a `DoctestModule` (depending on the configuration). Due to improvements in pytest's fixture implementation, if e.g. the `DoctestModule` collects a fixture, it is now visible to it only, and not to the `Module`. This means that both need to register the fixtures independently. ##### Deprecations (removal in next major release) - [#&#8203;10819](https://github.com/pytest-dev/pytest/issues/10819): Added a deprecation warning for class-scoped fixtures defined as instance methods (without `@classmethod`). Such fixtures set attributes on a different instance than the test methods use, leading to unexpected behavior. Use `@classmethod` decorator instead -- by `yastcher`. See `10819` and `14011`. - [#&#8203;12882](https://github.com/pytest-dev/pytest/issues/12882): Calling `request.getfixturevalue() <pytest.FixtureRequest.getfixturevalue>` during teardown to request a fixture that was not already requested is now deprecated and will become an error in pytest 10. See `dynamic-fixture-request-during-teardown` for details. - [#&#8203;13409](https://github.com/pytest-dev/pytest/issues/13409): Using non-`~collections.abc.Collection` iterables (such as generators, iterators, or custom iterable objects) for the `argvalues` parameter in `@pytest.mark.parametrize <pytest.mark.parametrize ref>` and `metafunc.parametrize <pytest.Metafunc.parametrize>` is now deprecated. These iterables get exhausted after the first iteration, leading to tests getting unexpectedly skipped in cases such as running `pytest.main()` multiple times, using class-level parametrize decorators, or collecting tests multiple times. See `parametrize-iterators` for details and suggestions. - [#&#8203;13946](https://github.com/pytest-dev/pytest/issues/13946): The private `config.inicfg` attribute is now deprecated. Use `config.getini() <pytest.Config.getini>` to access configuration values instead. See `config-inicfg` for more details. - [#&#8203;14004](https://github.com/pytest-dev/pytest/issues/14004): Passing `baseid` to `~pytest.FixtureDef` or `nodeid` strings to fixture registration APIs is now deprecated. These are internal pytest APIs that are used by some plugins. Use the `node` parameter instead for fixture scoping. This enables more robust node-based matching instead of string prefix matching. If you've used `nodeid=None`, pass `node=session` instead. This will be removed in pytest 10. - [#&#8203;14335](https://github.com/pytest-dev/pytest/issues/14335): The method of configuring hooks using markers, deprecated since pytest 7.2, is now scheduled to be removed in pytest 10. See `hook-markers` for more details. - [#&#8203;14434](https://github.com/pytest-dev/pytest/issues/14434): The `--pastebin` option is now deprecated. The same functionality is now available in an external plugin, `pytest-pastebin`. See `pastebin-deprecated` for more details. - [#&#8203;14513](https://github.com/pytest-dev/pytest/issues/14513): The private `FixtureDef.has_location` attribute is now deprecated and will be removed in pytest 10. See `fixturedef-has-location-deprecated` for details. - [#&#8203;1764](https://github.com/pytest-dev/pytest/issues/1764): `pytest.console_main` is now deprecated and will be removed in pytest 10. It was never intended for programmatic use; use `pytest.main` instead. ##### New features - [#&#8203;12376](https://github.com/pytest-dev/pytest/issues/12376): Added `pytest.register_fixture()` to register fixtures using an imperative interface. This is an advanced function intended for use by plugins. Normally, fixtures should be registered declaratively using the `@pytest.fixture <pytest.fixture>` decorator. Pytest looks for these fixture definitions during the collection phase and registers them automatically. For some plugin usecases the declarative interface can be cumbersome or unviable, in which case this imperative interface can be used. - [#&#8203;14023](https://github.com/pytest-dev/pytest/issues/14023): Added <span class="title-ref">--report-chars</span> long CLI option. - [#&#8203;14371](https://github.com/pytest-dev/pytest/issues/14371): Added `--max-warnings` command-line option and `max_warnings` configuration option to fail the test run when the number of warnings exceeds a given threshold -- by `miketheman`. - [#&#8203;6757](https://github.com/pytest-dev/pytest/issues/6757): Added the `assertion_text_diff_style` configuration option, allowing string equality failures to be rendered as separate `Left:` and `Right:` blocks instead of `ndiff` output. - [#&#8203;8395](https://github.com/pytest-dev/pytest/issues/8395): Added support for `~datetime.datetime` and `~datetime.timedelta` comparisons with `pytest.approx`. An explicit `abs` or `rel` tolerance as a `~datetime.timedelta` is required and relative tolerance is not supported for datetime comparisons -- by `hamza-mobeen`. ##### Improvements in existing functionality - [#&#8203;11225](https://github.com/pytest-dev/pytest/issues/11225): `pytest.warns` now shows "Regex pattern did not match" instead of "DID NOT WARN" when warnings were emitted but the `match` pattern did not match. - [#&#8203;11295](https://github.com/pytest-dev/pytest/issues/11295): Improved output of `--fixtures-per-test` by excluding internal-implementation fixtures generated by `@pytest.mark.parametrize` and similar. - [#&#8203;13241](https://github.com/pytest-dev/pytest/issues/13241): `pytest.raises`, `pytest.warns` and `pytest.deprecated_call` now uses `ParamSpec` for the type hint to the (old and not recommended) callable overload, instead of `Any`. This allows type checkers to raise errors when passing incorrect function parameters. `func` can now also be passed as a kwarg, which the type hint previously showed as possible but didn't accept. - [#&#8203;13862](https://github.com/pytest-dev/pytest/issues/13862): Improved the readability of "DID NOT RAISE" error messages by using the exception type's name instead of its <span class="title-ref">repr</span>. - [#&#8203;14026](https://github.com/pytest-dev/pytest/issues/14026): Added test coverage for compiled regex patterns in `pytest.raises` match parameter. - [#&#8203;14137](https://github.com/pytest-dev/pytest/issues/14137): <span class="title-ref">pytest.ScopeName</span> is now public to allow using it in function signatures. - [#&#8203;14342](https://github.com/pytest-dev/pytest/issues/14342): Marked `yield_fixture` as deprecated to type checkers using the `deprecated` decorator. Note it `has originally been deprecated <yield-fixture-deprecated>` in pytest 6.2 already. - [#&#8203;14373](https://github.com/pytest-dev/pytest/issues/14373): Added type annotations for `pytest.approx`. - [#&#8203;14430](https://github.com/pytest-dev/pytest/issues/14430): When using `--setup-show`, a space is now printed after the test name (and possibly used fixtures), to separate it from the test result. - [#&#8203;14441](https://github.com/pytest-dev/pytest/issues/14441): Reduced the default number of `gc.collect()` passes in the `unraisableexception` plugin from 5 to 1 on CPython, where reference counting makes a single pass sufficient. PyPy retains 5 passes due to object resurrection via `__del__`. This can noticeably speed up test suites that trigger many pytester runs. - [#&#8203;14461](https://github.com/pytest-dev/pytest/issues/14461): Improved assertion failure explanations for equality comparisons between mapping objects that are not `dict` instances. - [#&#8203;14513](https://github.com/pytest-dev/pytest/issues/14513): The order in which fixture definitions overriding each other are resolved is now determined first by their *visibility* in the collection tree rather than by the order in which they are registered. A fixture defined for a more specific node (e.g. a module or an item) now always takes precedence over one with the same name defined for a more general node (e.g. the session), even when the more general one was registered later. Fixtures with non-comparable visibility or the same visibility keep the existing behavior of "last registered wins". This change is supposed to only affect plugins which register multiple fixtures programmatically with the same name. - [#&#8203;14524](https://github.com/pytest-dev/pytest/issues/14524): Add official Python 3.15 support. - [#&#8203;1764](https://github.com/pytest-dev/pytest/issues/1764): Improved argparse program name to show `pytest`, `python -m pytest`, or `pytest.main()` based on how pytest was invoked, making help and error messages clearer. - [#&#8203;8265](https://github.com/pytest-dev/pytest/issues/8265): Emit a `PytestCollectionWarning` when a module-level `__getattr__` returns `None` for `pytestmark` instead of raising `AttributeError`. Previously this caused a cryptic `TypeError: got None instead of Mark` error. Now pytest issues a helpful warning and continues collecting the module normally. ##### Bug fixes - [#&#8203;13192](https://github.com/pytest-dev/pytest/issues/13192): Fixed <span class="title-ref">|</span> (pipe) not being treated as a regex meta-character that needs escaping in `pytest.raises(match=...) <pytest.raises>`. - [#&#8203;13484](https://github.com/pytest-dev/pytest/issues/13484): Fixed `-W` option values being duplicated in `Config.known_args_namespace`. - [#&#8203;13626](https://github.com/pytest-dev/pytest/issues/13626): Fixed function-scoped fixture values being kept alive after a test was interrupted by `KeyboardInterrupt` or early exit, allowing them to potentially be released more promptly. - [#&#8203;13784](https://github.com/pytest-dev/pytest/issues/13784): Fixed `capteesys` producing doubled output when used with `--capture=no` (`-s`). - [#&#8203;13817](https://github.com/pytest-dev/pytest/issues/13817): Fixed a secondary <span class="title-ref">AttributeError</span> masking the original error when an option argument fails to initialize. - [#&#8203;13884](https://github.com/pytest-dev/pytest/issues/13884): Fixed rare internal IndexError caused by <span class="title-ref">builtins.compile</span> being overridden in client code. - [#&#8203;13885](https://github.com/pytest-dev/pytest/issues/13885): Fixed autouse fixtures defined inside a `unittest.TestCase` class running even when the class is decorated with `unittest.skip` or `unittest.skipIf` -- regression since pytest 8.1.0. - [#&#8203;13917](https://github.com/pytest-dev/pytest/issues/13917): `unittest.SkipTest` is no longer considered an interactive exception, i.e. `pytest_exception_interact` is no longer called for it. - [#&#8203;13963](https://github.com/pytest-dev/pytest/issues/13963): Fixed subtests running with `pytest-xdist` when their contexts contain objects that are not JSON-serializable. Fixes [pytest-dev/pytest-xdist#1273](https://github.com/pytest-dev/pytest-xdist/issues/1273). - [#&#8203;14004](https://github.com/pytest-dev/pytest/issues/14004): Fixed conftest.py fixture scoping when `testpaths` points outside of the `rootdir <rootdir>`. Previously, fixtures from nested conftest.py files would incorrectly leak to sibling directories when using a relative `testpaths` like `../tests/sdk`. Conftest fixtures are now parsed during `Directory <pytest.Directory>` collection, using the `Directory` node for proper scoping. - [#&#8203;14050](https://github.com/pytest-dev/pytest/issues/14050): Display dictionary differences in assertion failures using the original key insertion order instead of sorted order. - [#&#8203;14080](https://github.com/pytest-dev/pytest/issues/14080): fix missing type annotations on `Pytester.makepyfile` and `Pytester.maketxtfile` methods. - [#&#8203;14114](https://github.com/pytest-dev/pytest/issues/14114): An exception from `pytest_fixture_post_finalizer` no longer prevents fixtures from being torn down, causing additional errors in the following tests. - [#&#8203;14161](https://github.com/pytest-dev/pytest/issues/14161): Fixed `monkeypatch.setattr() <pytest.MonkeyPatch.setattr>` leaving a stale entry on the undo stack when the underlying `setattr()` call fails (e.g. on immutable targets), causing an `AttributeError` crash during teardown. - [#&#8203;14214](https://github.com/pytest-dev/pytest/issues/14214): Fixed `-v` hint in `pytest.raises` match diff not working because assertion verbosity was not propagated. - [#&#8203;14234](https://github.com/pytest-dev/pytest/issues/14234): Allow `pytest.HIDDEN_PARAM <hidden-param>` in `@pytest.mark.parametrize(ids=...) <pytest.mark.parametrize ref>` typing. - [#&#8203;14248](https://github.com/pytest-dev/pytest/issues/14248): Fixed direct parametrization causing the static fixture closure (as reflected in `request.fixturenames <pytest.FixtureRequest.fixturenames>`) to omit fixtures that are requested transitively from overridden fixtures. - [#&#8203;14263](https://github.com/pytest-dev/pytest/issues/14263): Unraisable exceptions from finalizers are now collected during `pytest_unconfigure`, before pytest tears down the warning filters installed for the session. Previously the collection ran from a cleanup callback whose order relative to other plugins' cleanups was not guaranteed, so an active `error` filter could be removed before the exception surfaced and a late resource leak would pass silently. A `-W error` filter, or any filter matching `pytest.PytestUnraisableExceptionWarning`, now promotes these exceptions to failures regardless of plugin cleanup order. - [#&#8203;14377](https://github.com/pytest-dev/pytest/issues/14377): Fixed crash in <span class="title-ref">Config.get\_terminal\_writer</span> when an assertion fails with the `terminalreporter` plugin disabled. - [#&#8203;14381](https://github.com/pytest-dev/pytest/issues/14381): Fixed `-V` (short form of `--version`) to properly display the current version. - [#&#8203;14389](https://github.com/pytest-dev/pytest/issues/14389): Improved `pytest.raises(..., match=...) <pytest.raises>` failures to suppress the mismatched exception as a cause of the resulting `AssertionError`. - [#&#8203;14392](https://github.com/pytest-dev/pytest/issues/14392): Fixed a bug in `pytest.raises(match=...) <pytest.raises>` "fully escaped" detection, causing the regex diff display to be shown in some instances when the raw string diff display should be shown instead. - [#&#8203;14442](https://github.com/pytest-dev/pytest/issues/14442): Fixed a regression in pytest 9.0 where `--strict-markers` and `--strict-config` specified through `addopts` were silently ignored. Note that when targeting pytest >= 9.0, it's nicer to use `strict_markers` and `strict_config`, or `strict mode <strict mode>`. - [#&#8203;14456](https://github.com/pytest-dev/pytest/issues/14456): Fixed `pytest.approx` not recognizing types with `__array_interface__` as numpy-like arrays. - [#&#8203;14474](https://github.com/pytest-dev/pytest/issues/14474): Fixed a regression where `-k` and `-m` expressions containing both backslash characters in identifiers and string literal arguments would incorrectly raise a `SyntaxError` about escaping. - [#&#8203;14483](https://github.com/pytest-dev/pytest/issues/14483): Fixed JUnit XML report incorrectly escaping high Unicode codepoints (supplementary plane characters like emoji) in test failure messages. -- by `EternalRights` - [#&#8203;14492](https://github.com/pytest-dev/pytest/issues/14492): Fixed `Code.getargs()` incorrectly including local variable names in the returned argument tuple for functions with `*args` and/or `**kwargs`. The method was using `co_flags` bitmask values (`4` and `8`) directly as counts instead of converting them to `1` via `bool()`, and was not accounting for `co_kwonlyargcount` when `var=True`. - [#&#8203;3697](https://github.com/pytest-dev/pytest/issues/3697): Logging capture now works for non-propagating loggers. Previously only logs which reached the root logger were captured. This includes `caplog` and the "Captured log calls" test reporting. - [#&#8203;3850](https://github.com/pytest-dev/pytest/issues/3850): Fixed JUnit XML report: the `tests` attribute of the `<testsuite>` element now always matches the number of `<testcase>` elements in the file. In some cases (test passes but fails during teardown) the `tests` attribute would report an incorrect number of testcases in the XML file. - [#&#8203;5848](https://github.com/pytest-dev/pytest/issues/5848): `pytest_fixture_post_finalizer` is no longer called extra times for the same fixture teardown in some cases. - [#&#8203;719](https://github.com/pytest-dev/pytest/issues/719): Fixed `@pytest.mark.parametrize <pytest.mark.parametrize ref>` not unpacking single-element tuple values when using a string argnames with a trailing comma (e.g., `"arg,"`). The trailing comma form now correctly behaves like the tuple form `("arg",)`, treating argvalues as a list of tuples to unpack. ##### Improved documentation - [#&#8203;11022](https://github.com/pytest-dev/pytest/issues/11022): Document safer alternatives and scope guidance for monkeypatching standard library functions. - [#&#8203;11307](https://github.com/pytest-dev/pytest/issues/11307): Document that `@pytest.hookimpl(specname=...)` only works for function names starting with `pytest_`. - [#&#8203;13038](https://github.com/pytest-dev/pytest/issues/13038): Document that doctests do not support parametrized fixtures, including parametrized autouse fixtures. - [#&#8203;13155](https://github.com/pytest-dev/pytest/issues/13155): Clarified how the `request` fixture provides indirect parametrization values via `request.param`. - [#&#8203;13304](https://github.com/pytest-dev/pytest/issues/13304): Clarified in the documentation that hook implementations defined in `conftest.py` files are not available to other plugins during their `pytest_addoption()` execution, as conftest files are discovered and loaded after builtin and third-party plugins have been initialized. However, initial conftest files themselves can implement `pytest_addoption()` to add their own command-line options. - [#&#8203;13902](https://github.com/pytest-dev/pytest/issues/13902): Clarified how subtest progress markers are shown in the documentation. - [#&#8203;14012](https://github.com/pytest-dev/pytest/issues/14012): The `ini options ref` section of the API Reference now specified the type and default value of every configuration option. - [#&#8203;14148](https://github.com/pytest-dev/pytest/issues/14148): Documented a safe `pytestconfig.cache` access pattern when the `cacheprovider` plugin is disabled. - [#&#8203;14303](https://github.com/pytest-dev/pytest/issues/14303): The documentation is now built with Sphinx >= 9. - [#&#8203;14465](https://github.com/pytest-dev/pytest/issues/14465): Updated the hooks how-to page to link the `newhooks.py` file in `pytest-xdist` at tag `v3.8.0` instead of an unrelated 2017-era commit under the old layout. Pointing at a tag keeps the example in sync with the version users actually install, while remaining stable when the project's main branch moves on. ##### Miscellaneous internal changes - [#&#8203;14582](https://github.com/pytest-dev/pytest/issues/14582): Improved the recursion traceback test to exercise all requested traceback styles. </details> <details> <summary>astral-sh/ruff (ruff)</summary> ### [`v0.16.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0160) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.22...0.16.0) Released on 2026-07-23. Check out the [blog post](https://astral.sh/blog/ruff-v0.16.0) for a migration guide and overview of the changes! ##### Breaking changes - Ruff now enables a much larger set of rules by default (413, up from 59). See the blog post for more details and the new [Default Rules](https://docs.astral.sh/ruff/default-rules/) page for a full listing of the enabled rules. Note that this is primarily an expansion, but 18 of the more opinionated pycodestyle (`E`) and pyflakes (`F`) rules have been removed from the default set: `E401`, `E402`, `E701`, `E702`, `E703`, `E711`, `E712`, `E713`, `E714`, `E721`, `E731`, `E741`, `E742`, `E743`, `F403`, `F405`, `F406`, and `F722`. - Ruff can now format Python code blocks in Markdown files and will do this by default. See the [documentation](https://docs.astral.sh/ruff/formatter/#markdown-code-formatting) for more details. - Ruff now supports `ruff: ignore` comments at the ends of lines, like `noqa` comments, or on the line preceding a diagnostic. For example, these both suppress an [`unused-import`](https://docs.astral.sh/ruff/rules/unused-import/) (`F401`) diagnostic: ```py import math # ruff: ignore[F401] # ruff: ignore[F401] import os ``` - Fixes are now shown in `check` and `format --check` output: ````console ❯ ruff format --check . unformatted: File would be reformatted --> try.md:1:1 | 1 | ```python - import math 2 + import math 3 | ``` | 1 file would be reformatted ```` This example also shows off the Markdown formatting. - `format --check` now supports the same output formats as the linter, including the `github` and `gitlab` outputs for rendering annotations in CI: ```console ❯ ruff format --check --output-format github . ::error title=ruff (unformatted),file=try.md,line=2,col=8,endLine=2,endColumn=10::try.md:2:8: unformatted: File would be reformatted ``` See the CLI help or [documentation](https://docs.astral.sh/ruff/settings/#output-format) for the full list of supported formats. - The `filename`, `location`, `end_location`, `fix.edits[].location`, and `fix.edits[].end_location` fields in the JSON output format may now be `null` rather than defaulting to the empty string and row 1, column 1, respectively. ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`airflow3-incompatible-function-signature`](https://docs.astral.sh/ruff/rules/airflow3-incompatible-function-signature) (`AIR303`) - [`missing-copyright-notice`](https://docs.astral.sh/ruff/rules/missing-copyright-notice) (`CPY001`) - [`unnecessary-from-float`](https://docs.astral.sh/ruff/rules/unnecessary-from-float) (`FURB164`) - [`sorted-min-max`](https://docs.astral.sh/ruff/rules/sorted-min-max) (`FURB192`) - [`implicit-string-concatenation-in-collection-literal`](https://docs.astral.sh/ruff/rules/implicit-string-concatenation-in-collection-literal) (`ISC004`) - [`log-exception-outside-except-handler`](https://docs.astral.sh/ruff/rules/log-exception-outside-except-handler) (`LOG004`) - [`invalid-bool-return-type`](https://docs.astral.sh/ruff/rules/invalid-bool-return-type) (`PLE0304`) - [`too-many-positional-arguments`](https://docs.astral.sh/ruff/rules/too-many-positional-arguments) (`PLR0917`) - [`stop-iteration-return`](https://docs.astral.sh/ruff/rules/stop-iteration-return) (`PLR1708`) - [`none-not-at-end-of-union`](https://docs.astral.sh/ruff/rules/none-not-at-end-of-union) (`RUF036`) - [`access-annotations-from-class-dict`](https://docs.astral.sh/ruff/rules/access-annotations-from-class-dict) (`RUF063`) - [`duplicate-entry-in-dunder-all`](https://docs.astral.sh/ruff/rules/duplicate-entry-in-dunder-all) (`RUF068`) The following behaviors have been stabilized: - [`blind-except`](https://docs.astral.sh/ruff/rules/blind-except) (`BLE001`) is now suppressed when the exception is logged via `logging` methods other than `critical`, `error` and `exception`. - [`future-required-type-annotation`](https://docs.astral.sh/ruff/rules/future-required-type-annotation) (`FA102`) now checks for additional [PEP 585](https://peps.python.org/pep-0585/)-compatible APIs, such as those from `collections.abc`. - [`f-string-in-get-text-func-call`](https://docs.astral.sh/ruff/rules/f-string-in-get-text-func-call) (`INT001`), [`format-in-get-text-func-call`](https://docs.astral.sh/ruff/rules/format-in-get-text-func-call) (`INT002`), and [`printf-in-get-text-func-call`](https://docs.astral.sh/ruff/rules/printf-in-get-text-func-call) (`INT003`) now check for additional common ways of using the `gettext` module, such as assigning it to `builtins._`. - [`suspicious-url-open-usage`](https://docs.astral.sh/ruff/rules/suspicious-url-open-usage) (`S310`) now resolves local string literal bindings to avoid more false positives. - [`snmp-insecure-version`](https://docs.astral.sh/ruff/rules/snmp-insecure-version) (`S508`) and [`snmp-weak-cryptography`](https://docs.astral.sh/ruff/rules/snmp-weak-cryptography) (`S509`) now support the recommended API from newer versions of PySNMP. - [`typing-text-str-alias`](https://docs.astral.sh/ruff/rules/typing-text-str-alias) (`UP019`) now recognizes `typing_extensions.Text` in addition to `typing.Text`. ##### Preview features - \[`pyupgrade`] Fix false positive with `TypeVar` default before Python 3.13 (`UP040`) ([#&#8203;26888](https://github.com/astral-sh/ruff/pull/26888)) ##### Bug fixes - \[`ruff`] Fix missing check on unrecognized early bound (`RUF016`) ([#&#8203;26986](https://github.com/astral-sh/ruff/pull/26986)) ##### Rule changes - Insert a space after the colon in Ruff suppression comments ([#&#8203;27123](https://github.com/astral-sh/ruff/pull/27123)) ##### Performance - \[`pyupgrade`] Speed up `unnecessary-future-import` (`UP010`) ([#&#8203;27047](https://github.com/astral-sh/ruff/pull/27047)) ##### Documentation - \[`ruff`] Add missing period in "Why is this bad?" section (`RUF200`) ([#&#8203;26930](https://github.com/astral-sh/ruff/pull/26930)) - \[`flake8-simplify`] Clarify `os.environ` behavior on Windows (`SIM112`) ([#&#8203;26972](https://github.com/astral-sh/ruff/pull/26972)) - \[`pydocstyle`] Document fix safety (`D400`) ([#&#8203;26971](https://github.com/astral-sh/ruff/pull/26971)) ##### Contributors - [@&#8203;jonathandung](https://github.com/jonathandung) - [@&#8203;Joosboy](https://github.com/Joosboy) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Andrej730](https://github.com/Andrej730) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;zaniebot](https://github.com/zaniebot) ### [`v0.15.22`](https://github.com/astral-sh/ruff/releases/tag/0.15.22) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.21...0.15.22) ##### Release Notes Released on 2026-07-16. ##### Preview features - \[`pycodestyle`] Add an autofix for `E402` ([#&#8203;22212](https://github.com/astral-sh/ruff/pull/22212)) - \[`refurb`] Allow subclassing builtins in stub files (`FURB189`) ([#&#8203;26812](https://github.com/astral-sh/ruff/pull/26812)) - \[`ruff`] Add rule to replace `noqa` comments with `ruff:ignore` (`RUF105`) ([#&#8203;26423](https://github.com/astral-sh/ruff/pull/26423)) - \[`ruff`] Add rule to use human-readable names in `ruff:ignore` comments (`RUF106`) ([#&#8203;26682](https://github.com/astral-sh/ruff/pull/26682)) - \[`ruff`] Add rule to use human-readable names in configuration selectors (`RUF201`) ([#&#8203;26772](https://github.com/astral-sh/ruff/pull/26772)) ##### Bug fixes - \[`flake8-pyi`] Fix false positive in `__all__` (`PYI053`) ([#&#8203;26872](https://github.com/astral-sh/ruff/pull/26872)) ##### Rule changes - \[`pylint`] Ignore mutable type updates in `redefined-loop-name` (`PLW2901`) ([#&#8203;25733](https://github.com/astral-sh/ruff/pull/25733)) ##### Performance - Avoid redundant lexer token bookkeeping ([#&#8203;26765](https://github.com/astral-sh/ruff/pull/26765)) - Avoid redundant pending-indentation writes ([#&#8203;26774](https://github.com/astral-sh/ruff/pull/26774)) - Avoid unnecessary identifier lookahead ([#&#8203;26525](https://github.com/astral-sh/ruff/pull/26525)) - Reuse parser scratch buffers ([#&#8203;26798](https://github.com/astral-sh/ruff/pull/26798)) ##### Documentation - Document argfile support ([#&#8203;26803](https://github.com/astral-sh/ruff/pull/26803)) - \[`flake8-datetimez`] Clarify naming guidance for `datetime.today` (`DTZ002`) ([#&#8203;26658](https://github.com/astral-sh/ruff/pull/26658)) - \[`pycodestyle`] Document `E731` fix safety ([#&#8203;26847](https://github.com/astral-sh/ruff/pull/26847)) - \[`ruff`] Clarify intentional async contexts for `unused-async` (`RUF029`) ([#&#8203;26641](https://github.com/astral-sh/ruff/pull/26641)) ##### Contributors - [@&#8203;dwego](https://github.com/dwego) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Joosboy](https://github.com/Joosboy) - [@&#8203;KaufmanDmitriy](https://github.com/KaufmanDmitriy) - [@&#8203;PeterJCLaw](https://github.com/PeterJCLaw) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;charliermarsh](https://github.com/charliermarsh) ##### Install ruff 0.15.22 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.22 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` ### [`v0.15.21`](https://github.com/astral-sh/ruff/releases/tag/0.15.21) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.20...0.15.21) ##### Release Notes Released on 2026-07-09. ##### Preview features - Add `--add-ignore` for adding `ruff:ignore` comments ([#&#8203;26346](https://github.com/astral-sh/ruff/pull/26346)) - \[`flake8-comprehensions`] Drop `C409` tuple comprehension preview behavior ([#&#8203;25707](https://github.com/astral-sh/ruff/pull/25707)) - Avoid whitespace normalization when formatting comments ([#&#8203;26455](https://github.com/astral-sh/ruff/pull/26455)) - \[`pyupgrade`] Lint and fix use of deprecated `abc` decorators (`UP051`) ([#&#8203;26417](https://github.com/astral-sh/ruff/pull/26417)) ##### Bug fixes - Refine non-empty f-string detection ([#&#8203;26526](https://github.com/astral-sh/ruff/pull/26526)) - Detect syntax errors in individual notebook cells ([#&#8203;26419](https://github.com/astral-sh/ruff/pull/26419)) - \[`flake8-implicit-str-concat`] Fix `ISC003` autofix incorrectly stripping `+` from comments ([#&#8203;26554](https://github.com/astral-sh/ruff/pull/26554)) ##### Rule changes - \[`flake8-executable`] Mark `EXE004` fix as unsafe ([#&#8203;26033](https://github.com/astral-sh/ruff/pull/26033)) - \[`flake8-pyi`] Mark `PYI061` fixes as unsafe in Python files ([#&#8203;26533](https://github.com/astral-sh/ruff/pull/26533)) - \[`pydocstyle`] Skip `overload-with-docstring` in stub files (`D418`) ([#&#8203;26318](https://github.com/astral-sh/ruff/pull/26318)) ##### Performance - Avoid per-token source index visitor calls ([#&#8203;26506](https://github.com/astral-sh/ruff/pull/26506)) - Cache parenthesized expression boundaries in the formatter ([#&#8203;26344](https://github.com/astral-sh/ruff/pull/26344)) - Improve performance of rendering edits in preview mode ([#&#8203;26565](https://github.com/astral-sh/ruff/pull/26565)) - Inline `fits_element` in formatter ([#&#8203;26429](https://github.com/astral-sh/ruff/pull/26429)) - Inline formatter printing hot paths ([#&#8203;26504](https://github.com/astral-sh/ruff/pull/26504)) - Lazily create builtin bindings ([#&#8203;26510](https://github.com/astral-sh/ruff/pull/26510)) - Skip empty trivia scans in the source indexer ([#&#8203;26507](https://github.com/astral-sh/ruff/pull/26507)) - Use ICF for macOS release builds ([#&#8203;25780](https://github.com/astral-sh/ruff/pull/25780)) ##### Formatter - Add `--extend-exclude` to `ruff format` ([#&#8203;26372](https://github.com/astral-sh/ruff/pull/26372)) ##### Documentation - Add "How does Ruff's import sorting compare to isort?" link to README ([#&#8203;26530](https://github.com/astral-sh/ruff/pull/26530)) - Fix Mozilla Firefox repository link in README ([#&#8203;26537](https://github.com/astral-sh/ruff/pull/26537)) - \[`flake8-bandit`] Fix misleading docstring for `mako-templates` (`S702`) ([#&#8203;26432](https://github.com/astral-sh/ruff/pull/26432)) - \[`ruff`] Fix non-triggering example for `if-key-in-dict-del` (`RUF051`) ([#&#8203;26433](https://github.com/astral-sh/ruff/pull/26433)) ##### Contributors - [@&#8203;EkriirkE](https://github.com/EkriirkE) - [@&#8203;tingerrr](https://github.com/tingerrr) - [@&#8203;s-rigaud](https://github.com/s-rigaud) - [@&#8203;nikolauspschuetz](https://github.com/nikolauspschuetz) - [@&#8203;Avasam](https://github.com/Avasam) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;omar-y-abdi](https://github.com/omar-y-abdi) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;sylvestre](https://github.com/sylvestre) - [@&#8203;shaanmajid](https://github.com/shaanmajid) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;baltasarblanco](https://github.com/baltasarblanco) - [@&#8203;Sanjays2402](https://github.com/Sanjays2402) - [@&#8203;ZedThree](https://github.com/ZedThree) - [@&#8203;servusdei2018](https://github.com/servusdei2018) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;jesco-absolute](https://github.com/jesco-absolut) - [@&#8203;velikodniy](https://github.com/velikodniy) - [@&#8203;zaniebot](https://github.com/zaniebot) - [@&#8203;epage](https://github.com/epage) ##### Install ruff 0.15.21 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.21 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` ### [`v0.15.20`](https://github.com/astral-sh/ruff/releases/tag/0.15.20) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.19...0.15.20) ##### Release Notes Released on 2026-06-25. ##### Preview features - Allow human-readable names in rule selectors ([#&#8203;25887](https://github.com/astral-sh/ruff/pull/25887)) - Emit a warning instead of an error for unknown rule selectors ([#&#8203;26113](https://github.com/astral-sh/ruff/pull/26113)) - Match `noqa` shebang handling in `ruff:ignore` comments ([#&#8203;26286](https://github.com/astral-sh/ruff/pull/26286)) - \[`ruff`] Remove `pytest-fixture-autouse` (`RUF076`) ([#&#8203;26240](https://github.com/astral-sh/ruff/pull/26240), [#&#8203;26371](https://github.com/astral-sh/ruff/pull/26371)) ##### Documentation - Add versioning sections to custom crate READMEs ([#&#8203;26317](https://github.com/astral-sh/ruff/pull/26317)) - Update `ruff_python_parser` README for crates.io ([#&#8203;26315](https://github.com/astral-sh/ruff/pull/26315)) - \[`perflint`] Clarify that `PERF402` applies to any iterable ([#&#8203;26242](https://github.com/astral-sh/ruff/pull/26242)) ##### Contributors - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;trilamsr](https://github.com/trilamsr) ##### Install ruff 0.15.20 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.20 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` ### [`v0.15.19`](https://github.com/astral-sh/ruff/releases/tag/0.15.19) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.18...0.15.19) ##### Release Notes Released on 2026-06-23. ##### Preview features - Support human-readable names when hovering suppression comments and in code actions ([#&#8203;26114](https://github.com/astral-sh/ruff/pull/26114)) ##### Bug fixes - Fall back to default settings when editor-only settings are invalid ([#&#8203;26244](https://github.com/astral-sh/ruff/pull/26244)) - Fix panic when inserting text at a notebook cell boundary ([#&#8203;26111](https://github.com/astral-sh/ruff/pull/26111)) ##### Rule changes - \[`pylint`] Update fix suggestions for `__floor__`, `__trunc__`, `__length_hint__`, and `__matmul__` variants (`PLC2801`) ([#&#8203;26239](https://github.com/astral-sh/ruff/pull/26239)) ##### Performance - Avoid allocating when parsing single string literals ([#&#8203;26200](https://github.com/astral-sh/ruff/pull/26200)) - Avoid reallocating singleton call arguments ([#&#8203;26223](https://github.com/astral-sh/ruff/pull/26223)) - Lazily create source files for lint diagnostics ([#&#8203;26226](https://github.com/astral-sh/ruff/pull/26226)) - Optimize formatter text width and indentation ([#&#8203;26236](https://github.com/astral-sh/ruff/pull/26236)) - Reserve capacity for builtin bindings ([#&#8203;26229](https://github.com/astral-sh/ruff/pull/26229)) - Skip repeated-key checks for singleton dictionaries ([#&#8203;26228](https://github.com/astral-sh/ruff/pull/26228)) - Use ArrayVec for qualified name segments ([#&#8203;26224](https://github.com/astral-sh/ruff/pull/26224)) ##### Documentation - \[`flake8-pyi`] Note that `PYI051` is an opinionated stylistic rule ([#&#8203;26179](https://github.com/astral-sh/ruff/pull/26179)) - \[`pyupgrade`] Clarify `UP029` as a Python 2 compatibility rule ([#&#8203;26243](https://github.com/astral-sh/ruff/pull/26243)) ##### Other changes - Publish Ruff crates to crates.io ([#&#8203;26271](https://github.com/astral-sh/ruff/pull/26271)) ##### Contributors - [@&#8203;MakenRosa](https://github.com/MakenRosa) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;trilamsr](https://github.com/trilamsr) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;sanjibani](https://github.com/sanjibani) - [@&#8203;charliermarsh](https://github.com/charliermarsh) ##### Install ruff 0.15.19 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.19 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` ### [`v0.15.18`](https://github.com/astral-sh/ruff/releases/tag/0.15.18) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.17...0.15.18) ##### Release Notes Released on 2026-06-18. ##### Preview features - Handle nested `ruff:ignore` comments ([#&#8203;25791](https://github.com/astral-sh/ruff/pull/25791)) - Stop displaying severity in output ([#&#8203;26050](https://github.com/astral-sh/ruff/pull/26050)) - Use human-readable names in CLI output ([#&#8203;25937](https://github.com/astral-sh/ruff/pull/25937)) - Use human-readable names in LSP and playground diagnostics ([#&#8203;26058](https://github.com/astral-sh/ruff/pull/26058)) - \[`pydocstyle`] Prevent property docstrings starting with verbs (`D421`) ([#&#8203;23775](https://github.com/astral-sh/ruff/pull/23775)) - \[`flake8-pyi`] Extend `PYI033` to Python files ([#&#8203;26129](https://github.com/astral-sh/ruff/pull/26129)) ##### Bug fixes - Detect equivalent numeric mapping keys ([#&#8203;26009](https://github.com/astral-sh/ruff/pull/26009)) - Detect mapping keys equivalent to booleans ([#&#8203;25982](https://github.com/astral-sh/ruff/pull/25982)) - Detect repeated signed and complex dictionary keys ([#&#8203;26007](https://github.com/astral-sh/ruff/pull/26007)) ##### Rule changes - \[`flake8-pyi`] Rename `PYI033` to `legacy-type-comment` ([#&#8203;26131](https://github.com/astral-sh/ruff/pull/26131)) ##### Performance - Use `ThinVec` for call keywords ([#&#8203;25999](https://github.com/astral-sh/ruff/pull/25999)) - Inline parser recovery context checks ([#&#8203;26038](https://github.com/astral-sh/ruff/pull/26038)) - Match parser keywords as bytes ([#&#8203;26037](https://github.com/astral-sh/ruff/pull/26037)) - Move value parsing out of lexing ([#&#8203;25360](https://github.com/astral-sh/ruff/pull/25360)) ##### Server - Render subdiagnostics and secondary annotations as related information ([#&#8203;26011](https://github.com/astral-sh/ruff/pull/26011)) ##### Documentation - Update fix availability for always-fixable rules ([#&#8203;26091](https://github.com/astral-sh/ruff/pull/26091)) - \[`flake8-tidy-imports`] Add fix safety section (`TID252`) ([#&#8203;17491](https://github.com/astral-sh/ruff/pull/17491)) ##### Parser - Reject `__debug__` lambda parameters ([#&#8203;26022](https://github.com/astral-sh/ruff/pull/26022)) - Reject `_` as a match-pattern target ([#&#8203;25977](https://github.com/astral-sh/ruff/pull/25977)) - Reject multiple starred names in sequence patterns ([#&#8203;25976](https://github.com/astral-sh/ruff/pull/25976)) - Reject parenthesized star imports ([#&#8203;26021](https://github.com/astral-sh/ruff/pull/26021)) - Reject starred comprehension targets ([#&#8203;26023](https://github.com/astral-sh/ruff/pull/26023)) - Reject unparenthesized generator expressions in class bases ([#&#8203;25978](https://github.com/astral-sh/ruff/pull/25978)) - Reject `yield` expressions after commas ([#&#8203;26024](https://github.com/astral-sh/ruff/pull/26024)) - Validate function type parameter default order ([#&#8203;25981](https://github.com/astral-sh/ruff/pull/25981)) ##### Playground - Make diagnostic links clickable ([#&#8203;26104](https://github.com/astral-sh/ruff/pull/26104)) - Use diagnostic tags ([#&#8203;26105](https://github.com/astral-sh/ruff/pull/26105)) ##### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;gtkacz](https://github.com/gtkacz) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;Kalmaegi](https://github.com/Kalmaegi) ##### Install ruff 0.15.18 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.18 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` ### [`v0.15.17`](https://github.com/astral-sh/ruff/releases/tag/0.15.17) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.16...0.15.17) ##### Release Notes Released on 2026-06-11. ##### Preview features - Allow human-readable names in suppression comments ([#&#8203;25614](https://github.com/astral-sh/ruff/pull/25614)) - Fix handling of `ignore` comments within a `disable`/`enable` pair ([#&#8203;25845](https://github.com/astral-sh/ruff/pull/25845)) - Prioritize human-readable names in CLI output ([#&#8203;25869](https://github.com/astral-sh/ruff/pull/25869)) - Respect diagnostic start and parent ranges and trailing comments in `ruff:ignore` suppressions ([#&#8203;25673](https://github.com/astral-sh/ruff/pull/25673)) - \[`flake8-async`] Add `trio.as_safe_channel` to safe decorators (`ASYNC119`) ([#&#8203;25775](https://github.com/astral-sh/ruff/pull/25775)) - \[`flake8-pytest-style`] Also check `pytest_asyncio` fixtures ([#&#8203;25375](https://github.com/astral-sh/ruff/pull/25375)) - \[`ruff`] Ban `pytest` autouse fixtures (`RUF076`) ([#&#8203;25477](https://github.com/astral-sh/ruff/pull/25477)) - \[`pyupgrade`] Add `from __future__ import annotations` automatically (`UP007`, `UP045`) ([#&#8203;23259](https://github.com/astral-sh/ruff/pull/23259)) ##### Bug fixes - Fix diagnostic when `ruff:enable` or `ruff:disable` appears where `ruff:ignore` is expected ([#&#8203;25700](https://github.com/astral-sh/ruff/pull/25700)) - \[`pyupgrade`] Preserve leading empty literals to avoid syntax errors (`UP032`) ([#&#8203;25491](https://github.com/astral-sh/ruff/pull/25491)) ##### Rule changes - \[`flake8-pytest-style`] Clarify diagnostic message for single parameters (`PT007`) ([#&#8203;25592](https://github.com/astral-sh/ruff/pull/25592)) - \[`numpy`] Drop autofix for `np.in1d` (`NPY201`) ([#&#8203;25612](https://github.com/astral-sh/ruff/pull/25612)) - \[`pylint`] Exempt Python version comparisons (`PLR2004`) ([#&#8203;25743](https://github.com/astral-sh/ruff/pull/25743)) ##### Performance - Reserve AST `Vec`s with correct capacity for common cases ([#&#8203;25451](https://github.com/astral-sh/ruff/pull/25451)) ##### Formatter - Preserve whitespace for Quarto cell option comments ([#&#8203;25641](https://github.com/astral-sh/ruff/pull/25641)) ##### CLI - Allow rule names in `ruff rule` ([#&#8203;25640](https://github.com/astral-sh/ruff/pull/25640)) ##### Other changes - Fix playground diagnostics scrollbars ([#&#8203;25642](https://github.com/astral-sh/ruff/pull/25642)) ##### Contributors - [@&#8203;SuryanshSS1011](https://github.com/SuryanshSS1011) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;romero-deshaw](https://github.com/romero-deshaw) - [@&#8203;karlhillx](https://github.com/karlhillx) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;11happy](https://github.com/11happy) - [@&#8203;Kilo59](https://github.com/Kilo59) - [@&#8203;oconnor663](https://github.com/oconnor663) - [@&#8203;LeonidasZhak](https://github.com/LeonidasZhak) - [@&#8203;DavisVaughan](https://github.com/DavisVaughan) - [@&#8203;MeGaGiGaGon](https://github.com/MeGaGiGaGon) - [@&#8203;jonathandung](https://github.com/jonathandung) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;brianmego](https://github.com/brianmego) ##### Install ruff 0.15.17 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.17 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` ### [`v0.15.16`](https://github.com/astral-sh/ruff/releases/tag/0.15.16) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.15...0.15.16) ##### Release Notes Released on 2026-06-04. ##### Preview features - \[`flake8-async`] Implement `yield-in-context-manager-in-async-generator` (`ASYNC119`) ([#&#8203;24644](https://github.com/astral-sh/ruff/pull/24644)) - \[`pylint`] Narrow diagnostic range and exclude cases without exception handlers (`PLW0717`) ([#&#8203;25440](https://github.com/astral-sh/ruff/pull/25440)) - \[`ruff`] Treat `yield` before `break` from a terminal loop as terminal (`RUF075`) ([#&#8203;25447](https://github.com/astral-sh/ruff/pull/25447)) ##### Bug fixes - \[`eradicate`] Avoid flagging `ruff:ignore` comments as code (`ERA001`) ([#&#8203;25537](https://github.com/astral-sh/ruff/pull/25537)) - \[`eradicate`] Fix `ERA001`/`RUF100` conflict when `noqa` is on commented-out code ([#&#8203;25414](https://github.com/astral-sh/ruff/pull/25414)) - \[`pyflakes`] Avoid removing the `format` call when it would change behavior (`F523`) ([#&#8203;25320](https://github.com/astral-sh/ruff/pull/25320)) - \[`pylint`] Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (`PLE2510`, `PLE2512`, `PLE2513`, `PLE2514`, `PLE2515`) ([#&#8203;25544](https://github.com/astral-sh/ruff/pull/25544)) - \[`pyupgrade`] Avoid converting `format` calls with more kinds of side effects (`UP032`) ([#&#8203;25484](https://github.com/astral-sh/ruff/pull/25484)) ##### Rule changes - \[`flake8-pytest-style`] Avoid fixes for ambiguous `argnames` and `argvalues` combinations (`PT006`) ([#&#8203;24776](https://github.com/astral-sh/ruff/pull/24776)) ##### Performance - Drop excess capacity from statement suites during parsing ([#&#8203;25368](https://github.com/astral-sh/ruff/pull/25368)) ##### Documentation - \[`pydocstyle`] Improve discoverability of rules enabled for each convention ([#&#8203;24973](https://github.com/astral-sh/ruff/pull/24973)) - \[`ruff`] Restore example code for Python versions before 3.15 (`RUF017`) ([#&#8203;25439](https://github.com/astral-sh/ruff/pull/25439)) - Fix typo `bin/active` → `bin/activate` in tutorial ([#&#8203;25473](https://github.com/astral-sh/ruff/pull/25473)) ##### Other changes - Shrink additional parser AST collections ([#&#8203;25465](https://github.com/astral-sh/ruff/pull/25465)) ##### Contributors - [@&#8203;Redslayer112](https://github.com/Redslayer112) - [@&#8203;koriyoshi2041](https://github.com/koriyoshi2041) - [@&#8203;George-Ogden](https://github.com/George-Ogden) - [@&#8203;TejasAmle](https://github.com/TejasAmle) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;loganrosen](https://github.com/loganrosen) - [@&#8203;RafaelJohn9](https://github.com/RafaelJohn9) - [@&#8203;adityasingh2400](https://github.com/adityasingh2400) ##### Install ruff 0.15.16 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.16 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` ### [`v0.15.15`](https://github.com/astral-sh/ruff/releases/tag/0.15.15) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.14...0.15.15) ##### Release Notes Released on 2026-05-28. ##### Preview features - Fix Markdown closing fence handling ([#&#8203;25310](https://github.com/astral-sh/ruff/pull/25310)) - \[`pyflakes`] Report duplicate imports in `typing.TYPE_CHECKING` block (`F811`) ([#&#8203;22560](https://github.com/astral-sh/ruff/pull/22560)) ##### Bug fixes - \[`pyflakes`] Treat function-scope bare annotations as locals per PEP 526 (`F821`) ([#&#8203;21540](https://github.com/astral-sh/ruff/pull/21540)) ##### Performance - Avoid redundant `TokenValue` drops in the lexer ([#&#8203;25300](https://github.com/astral-sh/ruff/pull/25300)) - Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens `Vec` size ([#&#8203;25354](https://github.com/astral-sh/ruff/pull/25354)) - Use `ThinVec` in AST to shrink `Stmt` ([#&#8203;25361](https://github.com/astral-sh/ruff/pull/25361)) ##### Documentation - Fix `line-length` example for `--config` option ([#&#8203;25389](https://github.com/astral-sh/ruff/pull/25389)) - \[`flake8-comprehensions`] Document `RecursionError` edge case in `__len__` (`C416`) ([#&#8203;25286](https://github.com/astral-sh/ruff/pull/25286)) - \[`mccabe`] Improve example (`C901`) ([#&#8203;25287](https://github.com/astral-sh/ruff/pull/25287)) - \[`pyupgrade`] Clarify fix safety docs (`UP007`, `UP045`) ([#&#8203;25288](https://github.com/astral-sh/ruff/pull/25288)) - \[`refurb`] Document `FURB192` exception change for empty sequences ([#&#8203;25317](https://github.com/astral-sh/ruff/pull/25317)) - \[`ruff`] Document false negative for user-defined types (`RUF013`) ([#&#8203;25289](https://github.com/astral-sh/ruff/pull/25289)) ##### Formatter - Fix formatting of lambdas nested within f-strings ([#&#8203;25398](https://github.com/astral-sh/ruff/pull/25398)) ##### Server - Return code action for `codeAction/resolve` requests that contain no or no valid URL ([#&#8203;25365](https://github.com/astral-sh/ruff/pull/25365)) ##### Other changes - Expand semantic syntax errors for invalid walruses ([#&#8203;25415](https://github.com/astral-sh/ruff/pull/25415)) ##### Contributors - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;adityasingh2400](https://github.com/adityasingh2400) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;fallintoplace](https://github.com/fallintoplace) - [@&#8203;martin-schlossarek](https://github.com/martin-schlossarek) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Ruchir28](https://github.com/Ruchir28) ##### Install ruff 0.15.15 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.15 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ##### Verifying GitHub Artifact Attestations The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the [GitHub CLI](https://cli.github.com/manual/gh_attestation_verify): ```sh gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff ``` You can also download the attestation from [GitHub](https://github.com/astral-sh/ruff/attestations) and verify against that directly: ```sh gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation> ``` </details> <details> <summary>astral-sh/ty (ty)</summary> ### [`v0.0.65`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0065) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.64...0.0.65) Released on 2026-07-29. ##### LSP server - Support comprehension walruses in IDE features ([#&#8203;26476](https://github.com/astral-sh/ruff/pull/26476)) ##### Library support - Pydantic: Allow mutation of private attributes on frozen models ([#&#8203;27257](https://github.com/astral-sh/ruff/pull/27257)) - Pydantic: Synthesize `__replace__` for models ([#&#8203;27220](https://github.com/astral-sh/ruff/pull/27220)) ##### Diagnostics - Correct `ParamSpec` forwarded-argument diagnostic locations ([#&#8203;27263](https://github.com/astral-sh/ruff/pull/27263)) - Recover forwarded callable object and constructor sources ([#&#8203;27264](https://github.com/astral-sh/ruff/pull/27264)) - Recover forwarded `functools.partial` diagnostic sources ([#&#8203;27265](https://github.com/astral-sh/ruff/pull/27265)) ##### Core type checking - Fix gradual class assignability with generic receivers ([#&#8203;27223](https://github.com/astral-sh/ruff/pull/27223)) - Lazily materialize protocol attributes ([#&#8203;27267](https://github.com/astral-sh/ruff/pull/27267)) - Narrow tagged unions through all type kinds ([#&#8203;27226](https://github.com/astral-sh/ruff/pull/27226)) - Prefer static constrained TypeVar solutions ([#&#8203;27057](https://github.com/astral-sh/ruff/pull/27057)) - Preserve frozen-dataclass setter delegation ([#&#8203;27217](https://github.com/astral-sh/ruff/pull/27217)) - Preserve inference when filtering constructor overloads ([#&#8203;27254](https://github.com/astral-sh/ruff/pull/27254)) - Reject frozen-dataclass field deletion through subclasses ([#&#8203;27001](https://github.com/astral-sh/ruff/pull/27001)) - Stabilize recursive type-constraint ordering ([#&#8203;27176](https://github.com/astral-sh/ruff/pull/27176)) - Support materialized class type expressions ([#&#8203;27258](https://github.com/astral-sh/ruff/pull/27258)) ##### Performance - Avoid quadratic inference for large literal unions ([#&#8203;27178](https://github.com/astral-sh/ruff/pull/27178)) - Cache protocol receiver binding ([#&#8203;27301](https://github.com/astral-sh/ruff/pull/27301)) ##### Contributors - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;benedikt-bartscher](https://github.com/benedikt-bartscher) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) ### [`v0.0.64`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0064) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.63...0.0.64) Released on 2026-07-27. ##### Bug fixes - Fix identity narrowing for NewTypes ([#&#8203;26439](https://github.com/astral-sh/ruff/pull/26439)) - Make reachability analysis idempotent ([#&#8203;27163](https://github.com/astral-sh/ruff/pull/27163)) ##### LSP server - Fix ParamSpec declaration hover and type navigation ([#&#8203;27183](https://github.com/astral-sh/ruff/pull/27183)) - Implement LSP `textDocument/implementation` request ([#&#8203;25410](https://github.com/astral-sh/ruff/pull/25410)) - Introduce shared primitives for parsing backticks in docstrings ([#&#8203;26928](https://github.com/astral-sh/ruff/pull/26928)) - Render NumPy docstrings as structured Markdown ([#&#8203;25925](https://github.com/astral-sh/ruff/pull/25925)) ##### CLI - Add `--exclude-scripts` and `--include-scripts` ([#&#8203;27169](https://github.com/astral-sh/ruff/pull/27169)) - Discover uv workspace roots ([#&#8203;25551](https://github.com/astral-sh/ruff/pull/25551)) ##### Diagnostics - Add a lint rule for combined abstract and final decorators ([#&#8203;26932](https://github.com/astral-sh/ruff/pull/26932)) - Change `--add-ignore` to add space after the colon for `ty: ignore` ([#&#8203;27120](https://github.com/astral-sh/ruff/pull/27120)) - Fix `missing-override-decorator` suggestion before Python 3.12 ([#&#8203;27166](https://github.com/astral-sh/ruff/pull/27166)) - Reuse full call diagnostics for implicit setter calls ([#&#8203;27115](https://github.com/astral-sh/ruff/pull/27115)) ##### Configuration - Allow unresolved unused venv home paths ([#&#8203;27162](https://github.com/astral-sh/ruff/pull/27162)) - Simplify script metadata query ([#&#8203;27121](https://github.com/astral-sh/ruff/pull/27121)) ##### Core type checking - Decorate only overload implementation signatures ([#&#8203;27147](https://github.com/astral-sh/ruff/pull/27147)) - Don't consider known-instance types, generic aliases or non-singleton special-form types to be single-valued ([#&#8203;27137](https://github.com/astral-sh/ruff/pull/27137)) - Improve identity comparison inference for singleton types ([#&#8203;27126](https://github.com/astral-sh/ruff/pull/27126)) - Improve tuple membership and rich comparison inference ([#&#8203;27164](https://github.com/astral-sh/ruff/pull/27164)) - Model walrus bindings from comprehensions ([#&#8203;26466](https://github.com/astral-sh/ruff/pull/26466)) - Narrow tagged unions using identity comparisons ([#&#8203;27130](https://github.com/astral-sh/ruff/pull/27130)) - Preserve `Self` in `__new__` calls ([#&#8203;27003](https://github.com/astral-sh/ruff/pull/27003)) - Preserve receiver constraints when binding overloaded methods ([#&#8203;27038](https://github.com/astral-sh/ruff/pull/27038)) - Support generic manual PEP 695 type aliases ([#&#8203;27083](https://github.com/astral-sh/ruff/pull/27083)) - Treat bivariance as covariant ([#&#8203;24319](https://github.com/astral-sh/ruff/pull/24319)) ##### Performance - Avoid cycles when resolving `ModuleType` globals ([#&#8203;27182](https://github.com/astral-sh/ruff/pull/27182)) - Avoid expanding optional enum comparisons ([#&#8203;27105](https://github.com/astral-sh/ruff/pull/27105)) - Avoid repeated inference when copying mixed `TypedDict` unions ([#&#8203;27108](https://github.com/astral-sh/ruff/pull/27108)) - Improve importer performance ([#&#8203;27159](https://github.com/astral-sh/ruff/pull/27159)) - Improve union and intersection builder performance ([#&#8203;27167](https://github.com/astral-sh/ruff/pull/27167)) ##### Contributors - [@&#8203;perfloop-agent](https://github.com/perfloop-agent) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;TrapsterDK](https://github.com/TrapsterDK) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;denyszhak](https://github.com/denyszhak) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) ### [`v0.0.63`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0063) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.62...0.0.63) Released on 2026-07-23. ##### Core type checking - Handle generic stringified PEP 613 (`typing.TypeAlias`) type aliases ([#&#8203;27092](https://github.com/astral-sh/ruff/pull/27092)) - Allow equality narrowing across non-final classes ([#&#8203;27031](https://github.com/astral-sh/ruff/pull/27031)) - Allow interpolated string literals to be promoted to `str` ([#&#8203;27104](https://github.com/astral-sh/ruff/pull/27104)) - Fix double specialization of generic type aliases ([#&#8203;27058](https://github.com/astral-sh/ruff/pull/27058)) - Fix intersections of `type` and `TypeForm` ([#&#8203;27099](https://github.com/astral-sh/ruff/pull/27099)) - When narrowing from a `match` statement leads a variable `x` to be inferred as `A & B`, infer the type of `x.attr` as `<type of A.attr> & <type of B.attr>` ([#&#8203;27103](https://github.com/astral-sh/ruff/pull/27103)) ##### Library support - Pydantic: Stricter validation of sub-model fields in lax mode ([#&#8203;27091](https://github.com/astral-sh/ruff/pull/27091)) - Pydantic: Support special underscore parameters in `BaseSettings` models ([#&#8203;27098](https://github.com/astral-sh/ruff/pull/27098)) ##### Performance - Avoid exponential narrowing of optional dynamic `match` subjects ([#&#8203;27100](https://github.com/astral-sh/ruff/pull/27100)) - Avoid normalizing cached absolute file paths ([#&#8203;26998](https://github.com/astral-sh/ruff/pull/26998)) ##### Contributors - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;carljm](https://github.com/carljm) ### [`v0.0.62`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0062) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.61...0.0.62) Released on 2026-07-21. ##### Bug fixes - Guard recursive `Protocol` and `TypedDict` relations ([#&#8203;26990](https://github.com/astral-sh/ruff/pull/26990)) - Prevent stack overflows in recursive type relation checks ([#&#8203;26503](https://github.com/astral-sh/ruff/pull/26503)) - Recover from cancelled file indexing ([#&#8203;26876](https://github.com/astral-sh/ruff/pull/26876)) ##### Diagnostics - Avoid editing ignore comments with trailing reasons ([#&#8203;26939](https://github.com/astral-sh/ruff/pull/26939)) - Prefer innermost inline suppressions ([#&#8203;26940](https://github.com/astral-sh/ruff/pull/26940)) - Remove unused own-line ignore comments ([#&#8203;27013](https://github.com/astral-sh/ruff/pull/27013)) - Reuse applicable own-line suppressions in `--add-ignore` ([#&#8203;26925](https://github.com/astral-sh/ruff/pull/26925)) ##### Configuration - Respect `rules` and `analysis` in PEP 723 script metadata configurations ([#&#8203;26671](https://github.com/astral-sh/ruff/pull/26671)) ##### Core type checking - Accept gradual constrained TypeVar solutions ([#&#8203;26965](https://github.com/astral-sh/ruff/pull/26965)) - Avoid recursive TypeVarTuple alias expansion ([#&#8203;27032](https://github.com/astral-sh/ruff/pull/27032)) - Check inherited method conflicts via the MRO ([#&#8203;27019](https://github.com/astral-sh/ruff/pull/27019)) - Contextually infer custom `__setattr__` assignments ([#&#8203;27015](https://github.com/astral-sh/ruff/pull/27015)) - Fix `Callable` `isinstance` reachability ([#&#8203;26970](https://github.com/astral-sh/ruff/pull/26970)) - Fix `Just[float]` protocol matching ([#&#8203;27053](https://github.com/astral-sh/ruff/pull/27053)) - Fix `Self` binding for classmethod `__new__` constructors ([#&#8203;27030](https://github.com/astral-sh/ruff/pull/27030)) - Fix nested short-circuit flow snapshots ([#&#8203;26956](https://github.com/astral-sh/ruff/pull/26956)) - Gate `TypedDict` PEP 728 parameters by Python version ([#&#8203;26968](https://github.com/astral-sh/ruff/pull/26968)) - Improve `match` reachability inference around value-pattern branches ([#&#8203;26979](https://github.com/astral-sh/ruff/pull/26979)) - Make membership and equality narrowing consistent ([#&#8203;26982](https://github.com/astral-sh/ruff/pull/26982)) - Preserve constrained TypeVar equality narrowing ([#&#8203;26988](https://github.com/astral-sh/ruff/pull/26988)) - Preserve constrained TypeVar inequality narrowing ([#&#8203;26995](https://github.com/astral-sh/ruff/pull/26995)) - Preserve unsatisfiable generic call constraints ([#&#8203;26964](https://github.com/astral-sh/ruff/pull/26964)) - Respect bounded typevars in union inference ([#&#8203;27023](https://github.com/astral-sh/ruff/pull/27023)) - Respect metaclass `__setattr__` for class attributes ([#&#8203;27000](https://github.com/astral-sh/ruff/pull/27000)) ##### Performance - Cache non-terminal-call reachability prefixes ([#&#8203;26810](https://github.com/astral-sh/ruff/pull/26810)) - Cache protocol `Self` binding ([#&#8203;26997](https://github.com/astral-sh/ruff/pull/26997)) - Cache sparse reachability checkpoints ([#&#8203;26811](https://github.com/astral-sh/ruff/pull/26811)) - Defer statement-call narrowing gates ([#&#8203;26793](https://github.com/astral-sh/ruff/pull/26793)) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;mtshiba](https://github.com/mtshiba) ### [`v0.0.61`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0061) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.60...0.0.61) Released on 2026-07-17. ##### Bug fixes - Avoid recursive protocol structural comparisons ([#&#8203;26721](https://github.com/astral-sh/ruff/pull/26721)) ##### LSP server - Render Google docstrings as structured Markdown ([#&#8203;26599](https://github.com/astral-sh/ruff/pull/26599)) ##### Library support - Pydantic: Collect field metadata through subscripted generic `Annotated` aliases ([#&#8203;26885](https://github.com/astral-sh/ruff/pull/26885)) ##### Diagnostics - Avoid extending own-line suppressions in `--add-ignore` ([#&#8203;26808](https://github.com/astral-sh/ruff/pull/26808)) ##### Core type checking - Derive descriptor setter domains for protocols ([#&#8203;26683](https://github.com/astral-sh/ruff/pull/26683)) - Enforce declared receiver TypeVar domains ([#&#8203;26863](https://github.com/astral-sh/ruff/pull/26863)) - Infer `isinstance` results for aliases and type variables ([#&#8203;26961](https://github.com/astral-sh/ruff/pull/26961)) - Infer `isinstance` results for fixed class tuples ([#&#8203;26935](https://github.com/astral-sh/ruff/pull/26935)) - Narrow inline list and set membership checks ([#&#8203;26955](https://github.com/astral-sh/ruff/pull/26955)) - Narrow tagged unions by tag truthiness ([#&#8203;26887](https://github.com/astral-sh/ruff/pull/26887)) - Narrow walrus expression values ([#&#8203;26949](https://github.com/astral-sh/ruff/pull/26949)) - Project intersections in `to_instance` ([#&#8203;26892](https://github.com/astral-sh/ruff/pull/26892)) - Remove inferable TypeVar artifacts recursively ([#&#8203;26787](https://github.com/astral-sh/ruff/pull/26787)) - Respect mixin receiver domains in method overrides ([#&#8203;26941](https://github.com/astral-sh/ruff/pull/26941)) - Support `TypeVarTuple` and `Unpack` ([#&#8203;25240](https://github.com/astral-sh/ruff/pull/25240)) ##### Performance - Deduplicate completion labels ([#&#8203;26890](https://github.com/astral-sh/ruff/pull/26890)) - Only collect expected types for files open in the editor ([#&#8203;25546](https://github.com/astral-sh/ruff/pull/25546)) - Parallelize subtype hierarchy search ([#&#8203;26875](https://github.com/astral-sh/ruff/pull/26875)) - Share heap-backed parser names with CharStr ([#&#8203;26594](https://github.com/astral-sh/ruff/pull/26594)) - Use the new incremental checker from the `ignore` crate ([#&#8203;26933](https://github.com/astral-sh/ruff/pull/26933)) ##### Contributors - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;denyszhak](https://github.com/denyszhak) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Aethryl](https://github.com/Aethryl) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) ### [`v0.0.60`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0060) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.59...0.0.60) Released on 2026-07-15. ##### Bug fixes - Expand transparent callable workaround with overloads and `Awaitable[T]` ([#&#8203;26761](https://github.com/astral-sh/ruff/pull/26761)) - Separate type-mapping caches by transformation mode ([#&#8203;26857](https://github.com/astral-sh/ruff/pull/26857)) - Avoid recursive protocol union redundancy checks ([#&#8203;26689](https://github.com/astral-sh/ruff/pull/26689)) - Handle recursive protocols in redundant-cast checks ([#&#8203;26708](https://github.com/astral-sh/ruff/pull/26708)) ##### LSP server - Prevent type that is written with a code span from being incorrectly re-wrapped during docstring Markdown rendering ([#&#8203;26723](https://github.com/astral-sh/ruff/pull/26723)) ##### Library support - Pydantic: Support `populate_by_name` and custom initializers ([#&#8203;26764](https://github.com/astral-sh/ruff/pull/26764)) - Pydantic: Warn about immediately discarded extra arguments ([#&#8203;26762](https://github.com/astral-sh/ruff/pull/26762)) ##### Diagnostics - Narrow TypeGuard keyword arguments and remove `invalid-type-guard-call` ([#&#8203;26809](https://github.com/astral-sh/ruff/pull/26809)) - Support own-line suppression comments ([#&#8203;26785](https://github.com/astral-sh/ruff/pull/26785)) ##### Core type checking - Derive descriptor setter domains for protocols ([#&#8203;26683](https://github.com/astral-sh/ruff/pull/26683)) - Handle cycles in derived constraint relations ([#&#8203;26814](https://github.com/astral-sh/ruff/pull/26814)) - Implement unified generic call inference ([#&#8203;26141](https://github.com/astral-sh/ruff/pull/26141)) - Preserve constraints from bound receivers ([#&#8203;26776](https://github.com/astral-sh/ruff/pull/26776)) - Project exact-length narrowing through TypeVars ([#&#8203;26852](https://github.com/astral-sh/ruff/pull/26852)) - Resolve PEP 695 aliases in type\[...] annotations ([#&#8203;26842](https://github.com/astral-sh/ruff/pull/26842)) - Retain sequence pattern narrowing in successful `match` cases ([#&#8203;26807](https://github.com/astral-sh/ruff/pull/26807)) - Support class and static protocol methods ([#&#8203;26574](https://github.com/astral-sh/ruff/pull/26574)) - Support class objects satisfying instance-method protocols ([#&#8203;26789](https://github.com/astral-sh/ruff/pull/26789)) - Support `type[Protocol]` ([#&#8203;26649](https://github.com/astral-sh/ruff/pull/26649)) - Sync vendored typeshed stubs ([#&#8203;26840](https://github.com/astral-sh/ruff/pull/26840)). [Typeshed diff](https://github.com/python/typeshed/compare/b9090e99745ac1511d8efd828622b11a9a3623e8...b00c387c669cb50d5d388d77b74c2e832e147fe8) - Treat transparent callable decorators consistently in class assignments ([#&#8203;26720](https://github.com/astral-sh/ruff/pull/26720)) ##### Performance - Compare overloaded protocol method returns pairwise ([#&#8203;26684](https://github.com/astral-sh/ruff/pull/26684)) - Extend `PathBounds` fast-path to support both upper and lower bounds ([#&#8203;26782](https://github.com/astral-sh/ruff/pull/26782)) - Skip `Self` type scans for non-generic instances ([#&#8203;26703](https://github.com/astral-sh/ruff/pull/26703)) ##### Contributors - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;RasmusNygren](https://github.com/RasmusNygren) ### [`v0.0.59`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0059) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.58...0.0.59) Released on 2026-07-12. ##### Bug fixes - Guard descriptor classification cycles ([#&#8203;26690](https://github.com/astral-sh/ruff/pull/26690)) - Respect `init=False` in dataclass field-order checks ([#&#8203;26749](https://github.com/astral-sh/ruff/pull/26749)) - Avoid duplicate diagnostics for overloaded TypeIs ([#&#8203;26716](https://github.com/astral-sh/ruff/pull/26716)) ##### Library support - Pydantic: Support custom `__init__` methods ([#&#8203;26699](https://github.com/astral-sh/ruff/pull/26699)) - Pydantic: Support field metadata in `Annotated` ([#&#8203;26650](https://github.com/astral-sh/ruff/pull/26650)) ##### Core type checking - Allow unsound equality-based narrowing for builtins ([#&#8203;26414](https://github.com/astral-sh/ruff/pull/26414)) - Bind Self in implicit dunder calls ([#&#8203;26711](https://github.com/astral-sh/ruff/pull/26711)) - Correct protocol method receiver binding ([#&#8203;26701](https://github.com/astral-sh/ruff/pull/26701)) - Exempt ParamSpec callables from the dunder descriptor heuristic ([#&#8203;26696](https://github.com/astral-sh/ruff/pull/26696)) - Remove transitive TypeVar artifacts during collection inference ([#&#8203;26714](https://github.com/astral-sh/ruff/pull/26714)) ##### LSP server - Avoid broad invalidation from file check eligibility ([#&#8203;26741](https://github.com/astral-sh/ruff/pull/26741)) - Correct how we expand tabs in docstrings ([#&#8203;26679](https://github.com/astral-sh/ruff/pull/26679)) - Resolve ambiguity in Google-style docstring parsing in favour of observations from popular projects ([#&#8203;26673](https://github.com/astral-sh/ruff/pull/26673)) ##### CLI - Avoid allocation for every stdout write ([#&#8203;26698](https://github.com/astral-sh/ruff/pull/26698)) - Buffer diagnostic output ([#&#8203;26702](https://github.com/astral-sh/ruff/pull/26702)) ##### Performance - Cache generic context ([#&#8203;26745](https://github.com/astral-sh/ruff/pull/26745)) - Cache known class instances ([#&#8203;26746](https://github.com/astral-sh/ruff/pull/26746)) - Reuse common TypedDict constraints through intersections ([#&#8203;26747](https://github.com/astral-sh/ruff/pull/26747)) - Use purpose-specific types for completion and module text ([#&#8203;26664](https://github.com/astral-sh/ruff/pull/26664)) ##### Contributors - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;sharkdp](https://github.com/sharkdp) ### [`v0.0.58`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0058) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.57...0.0.58) Released on 2026-07-09. ##### Bug fixes - Fix protocol matching for class variables ([#&#8203;26669](https://github.com/astral-sh/ruff/pull/26669)) - Fix reflected binary dispatch for runtime classes ([#&#8203;26623](https://github.com/astral-sh/ruff/pull/26623)) - Support cached properties in protocols ([#&#8203;26681](https://github.com/astral-sh/ruff/pull/26681)) ##### Diagnostics - Add assignability context to upper-bound diagnostics ([#&#8203;26645](https://github.com/astral-sh/ruff/pull/26645)) - Add blanket ignore comment rule ([#&#8203;26426](https://github.com/astral-sh/ruff/pull/26426)) - Improve protocol attribute diagnostic context ([#&#8203;26644](https://github.com/astral-sh/ruff/pull/26644)) ##### Library support - Pydantic: Add fields from mixin classes ([#&#8203;26631](https://github.com/astral-sh/ruff/pull/26631)) - Pydantic: Add support for `validate_by_{name,alias}` ([#&#8203;26598](https://github.com/astral-sh/ruff/pull/26598)) - Pydantic: Add support for `validation_alias` ([#&#8203;26629](https://github.com/astral-sh/ruff/pull/26629)) - Pydantic: Fix float conversion in unions ([#&#8203;26655](https://github.com/astral-sh/ruff/pull/26655)) - Pydantic: Ignore private attributes ([#&#8203;26630](https://github.com/astral-sh/ruff/pull/26630)) - Pydantic: Make `BaseSettings` fields optional by default ([#&#8203;26628](https://github.com/astral-sh/ruff/pull/26628)) - Pydantic: Recognize frozen models via config ([#&#8203;26648](https://github.com/astral-sh/ruff/pull/26648)) - Pydantic: Support dict model configurations ([#&#8203;26632](https://github.com/astral-sh/ruff/pull/26632)) - Pydantic: Support validation of `RootModel` fields ([#&#8203;26634](https://github.com/astral-sh/ruff/pull/26634)) - Pydantic: Understand ellipsis as providing no default value ([#&#8203;26637](https://github.com/astral-sh/ruff/pull/26637)) ##### Core type checking - Gate membership narrowing on `__contains__` semantics ([#&#8203;25964](https://github.com/astral-sh/ruff/pull/25964)) - Handle callable classes in solver ([#&#8203;26090](https://github.com/astral-sh/ruff/pull/26090)) - Infer `ModuleType.__doc__` as `str` in the presence of a docstring ([#&#8203;26505](https://github.com/astral-sh/ruff/pull/26505)) - Infer metaclass-declared attributes on class instances ([#&#8203;26512](https://github.com/astral-sh/ruff/pull/26512)) - Respect user stub overlays during module resolution ([#&#8203;26123](https://github.com/astral-sh/ruff/pull/26123)) ##### Performance - Avoid allocating decorated parameter names ([#&#8203;26666](https://github.com/astral-sh/ruff/pull/26666)) - Optimize `TypeCollector` ([#&#8203;26593](https://github.com/astral-sh/ruff/pull/26593)) ##### Contributors - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;kaapstorm](https://github.com/kaapstorm) ### [`v0.0.57`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0057) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.56...0.0.57) Released on 2026-07-07. ##### Bug fixes - Detect async generator expressions containing await ([#&#8203;26568](https://github.com/astral-sh/ruff/pull/26568)) - Preserve exhaustive gradual match patterns ([#&#8203;26523](https://github.com/astral-sh/ruff/pull/26523)) ##### LSP server - Fix selection range behavior for strings ([#&#8203;26532](https://github.com/astral-sh/ruff/pull/26532)) - Recognize that dedent ends doctest block when parsing docstrings for signature help ([#&#8203;26552](https://github.com/astral-sh/ruff/pull/26552)) - Render reStructuredText hyperlinks as Markdown in hover docstrings ([#&#8203;25907](https://github.com/astral-sh/ruff/pull/25907)) - Update `__slots__` string when renaming an attribute ([#&#8203;26438](https://github.com/astral-sh/ruff/pull/26438)) ##### Documentation - Document PYTHONPATH support in module discovery ([#&#8203;3889](https://github.com/astral-sh/ty/pull/3889)) ##### Library support - Add support for extra arguments in Pydantic model constructors ([#&#8203;26520](https://github.com/astral-sh/ruff/pull/26520)) - Detect Pydantic model configurations ([#&#8203;26573](https://github.com/astral-sh/ruff/pull/26573)) - Distinguish lax and strict mode for Pydantic models ([#&#8203;26587](https://github.com/astral-sh/ruff/pull/26587)) ##### Core type checking - Fix subtyping/assignability for `@property` protocol members ([#&#8203;25332](https://github.com/astral-sh/ruff/pull/25332)) - Narrow `isinstance` against intersections containing invalid member ([#&#8203;26545](https://github.com/astral-sh/ruff/pull/26545)) - Narrow match subjects through structural patterns ([#&#8203;25942](https://github.com/astral-sh/ruff/pull/25942)) - Preserve generic `functools.partial` signatures ([#&#8203;24583](https://github.com/astral-sh/ruff/pull/24583)) - Preserve generic variadic callback semantics ([#&#8203;26521](https://github.com/astral-sh/ruff/pull/26521)) - Preserve invariant materialization on generic specializations ([#&#8203;26578](https://github.com/astral-sh/ruff/pull/26578)) - Preserve literal enum member names ([#&#8203;26592](https://github.com/astral-sh/ruff/pull/26592)) ##### Performance - Avoid exponential invariant constraint paths ([#&#8203;26538](https://github.com/astral-sh/ruff/pull/26538)) - Batch parallel jobs when finding references ([#&#8203;26534](https://github.com/astral-sh/ruff/pull/26534)) - Build module names directly in `CompactString` ([#&#8203;26546](https://github.com/astral-sh/ruff/pull/26546)) - Elide default use-def state ([#&#8203;26398](https://github.com/astral-sh/ruff/pull/26398)) - Reuse owned buffers for string literals ([#&#8203;26547](https://github.com/astral-sh/ruff/pull/26547)) - Use ICF for macOS release builds ([#&#8203;3709](https://github.com/astral-sh/ty/pull/3709)) - Use cached class literal lookup for `is_subclass_of` ([#&#8203;26585](https://github.com/astral-sh/ruff/pull/26585)) ##### Contributors - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;fenghourun](https://github.com/fenghourun) - [@&#8203;zaniebot](https://github.com/zaniebot) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;shaanmajid](https://github.com/shaanmajid) - [@&#8203;jvdillon](https://github.com/jvdillon) - [@&#8203;sqqueak](https://github.com/sqqueak) - [@&#8203;SuryanshSS1011](https://github.com/SuryanshSS1011) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;lerebear](https://github.com/lerebear) ### [`v0.0.56`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0056) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.55...0.0.56) Released on 2026-07-01. ##### Bug fixes - Avoid MRO cycle when collecting NamedTuple fields ([#&#8203;26464](https://github.com/astral-sh/ruff/pull/26464)) - Model `int` and `str` enum value normalization ([#&#8203;26349](https://github.com/astral-sh/ruff/pull/26349)) - Prefer reflected operators by runtime class ([#&#8203;26434](https://github.com/astral-sh/ruff/pull/26434), [#&#8203;26474](https://github.com/astral-sh/ruff/pull/26474)) ##### CLI - Exit with status 130 when interrupted ([#&#8203;26465](https://github.com/astral-sh/ruff/pull/26465)) ##### Performance - Avoid exponential OR-pattern reachability ([#&#8203;26481](https://github.com/astral-sh/ruff/pull/26481)) - Reduce bound typevar identity overhead ([#&#8203;26396](https://github.com/astral-sh/ruff/pull/26396)) ##### Core type checking - Infer generic class pattern capture types ([#&#8203;26479](https://github.com/astral-sh/ruff/pull/26479)) - Narrow exact tuples through sequence patterns ([#&#8203;26424](https://github.com/astral-sh/ruff/pull/26424)) - Recognize inherited enum member constructors ([#&#8203;26410](https://github.com/astral-sh/ruff/pull/26410)) - Respect return-context inference when filtering overloads ([#&#8203;26454](https://github.com/astral-sh/ruff/pull/26454)) - Sync vendored typeshed stubs ([#&#8203;26501](https://github.com/astral-sh/ruff/pull/26501)). [Typeshed diff](https://github.com/python/typeshed/compare/3c6221722aac5bd9dbfc5fbf7b4f0bf64b2c5724...b9090e99745ac1511d8efd828622b11a9a3623e8) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;sharkdp](https://github.com/sharkdp) ### [`v0.0.55`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0055) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.54...0.0.55) Released on 2026-06-26. ##### LSP server - Render full diagnostics in color ([#&#8203;26384](https://github.com/astral-sh/ruff/pull/26384)) ##### Documentation - Document colored diagnostic output ([#&#8203;3858](https://github.com/astral-sh/ty/pull/3858)) ##### Performance - Improve vendored filesystem concurrency ([#&#8203;26408](https://github.com/astral-sh/ruff/pull/26408)) - Optimize enum comparisons in equality evaluation ([#&#8203;26340](https://github.com/astral-sh/ruff/pull/26340)) - Remove redundant semantic index shrinks ([#&#8203;26392](https://github.com/astral-sh/ruff/pull/26392)) - Use never-change durability for one-shot checks ([#&#8203;26359](https://github.com/astral-sh/ruff/pull/26359)) ##### Core type checking - Correct enum alias detection and scalar constructors ([#&#8203;26345](https://github.com/astral-sh/ruff/pull/26345)) - Fix structural pattern binding inference ([#&#8203;26411](https://github.com/astral-sh/ruff/pull/26411)) - Improve variable-length tuple slicing ([#&#8203;26151](https://github.com/astral-sh/ruff/pull/26151)) - Infer class and mapping pattern bindings ([#&#8203;25941](https://github.com/astral-sh/ruff/pull/25941)) - Infer empty collection constructors from later uses ([#&#8203;26389](https://github.com/astral-sh/ruff/pull/26389)) - Skip shadowed submodule bindings during import analysis ([#&#8203;26385](https://github.com/astral-sh/ruff/pull/26385)) - Sync vendored typeshed stubs ([#&#8203;26406](https://github.com/astral-sh/ruff/pull/26406)). [Typeshed diff](https://github.com/python/typeshed/compare/8e6a886ca5b14742924be721d345a619762d6e93...3c6221722aac5bd9dbfc5fbf7b4f0bf64b2c5724) - Track literal iterable emptiness for reachability ([#&#8203;25222](https://github.com/astral-sh/ruff/pull/25222)) - Validate positional class patterns against `__match_args__` ([#&#8203;26195](https://github.com/astral-sh/ruff/pull/26195)) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;felixscherz](https://github.com/felixscherz) ### [`v0.0.54`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0054) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.53...0.0.54) Released on 2026-06-25. ##### Bug fixes - Avoid duplicate configuration error output ([#&#8203;26375](https://github.com/astral-sh/ruff/pull/26375)) - Avoid stack overflows in reachability analysis ([#&#8203;26272](https://github.com/astral-sh/ruff/pull/26272)) - Fix divergent recursive tuple cycle handling in ty ([#&#8203;26316](https://github.com/astral-sh/ruff/pull/26316)) - Fix panic from relation queries during cycle recovery ([#&#8203;26335](https://github.com/astral-sh/ruff/pull/26335)) - Fix panics by reverting recursive `TypeOf` cycle recovery ([#&#8203;26339](https://github.com/astral-sh/ruff/pull/26339)) - Support basic usages of `__class__` closure cells in methods ([#&#8203;26329](https://github.com/astral-sh/ruff/pull/26329)) ##### LSP server - Fix typealias token classification inconsistency ([#&#8203;26255](https://github.com/astral-sh/ruff/pull/26255)) - Implement rust-analyzer's "Click for full compiler diagnostic" feature ([#&#8203;26269](https://github.com/astral-sh/ruff/pull/26269)) ##### Performance - Co-locate retained definition usage state ([#&#8203;26019](https://github.com/astral-sh/ruff/pull/26019)) - Use never-change durability for immutable file inputs ([#&#8203;26353](https://github.com/astral-sh/ruff/pull/26353)) ##### Diagnostics - Reject undeclared protocol instance attributes ([#&#8203;26336](https://github.com/astral-sh/ruff/pull/26336)) ##### Core type checking - Allow replacing ordinary methods with compatible functions ([#&#8203;26158](https://github.com/astral-sh/ruff/pull/26158)) - Distinguish `typing.TypedDict` from `typing_extensions.TypedDict` ([#&#8203;25843](https://github.com/astral-sh/ruff/pull/25843)) - Don't treat non-empty ranges as single-valued ([#&#8203;26351](https://github.com/astral-sh/ruff/pull/26351)) - Handle TypeVar bounds over `type[...]` in attribute lookup ([#&#8203;26146](https://github.com/astral-sh/ruff/pull/26146)) - Infer definite equality comparison results ([#&#8203;26337](https://github.com/astral-sh/ruff/pull/26337)) - Infer mismatched literal comparisons ([#&#8203;26313](https://github.com/astral-sh/ruff/pull/26313)) - `match` statements: make class-pattern fallthrough member-aware ([#&#8203;26283](https://github.com/astral-sh/ruff/pull/26283)) - `match` statements: prove TypedDict structural patterns exhaustive ([#&#8203;26285](https://github.com/astral-sh/ruff/pull/26285)) - `match` statements: resolve positional class-pattern exhaustiveness ([#&#8203;26284](https://github.com/astral-sh/ruff/pull/26284)) - Model non-exhaustive enum member sets (`enum.Flag`s) ([#&#8203;26277](https://github.com/astral-sh/ruff/pull/26277)) - Reduce retained definition map storage ([#&#8203;26348](https://github.com/astral-sh/ruff/pull/26348)) - Reuse equality semantics for membership compatibility ([#&#8203;25955](https://github.com/astral-sh/ruff/pull/25955)) - Sync vendored typeshed stubs to support `builtins.sentinel` ([#&#8203;26341](https://github.com/astral-sh/ruff/pull/26341)) - Treat non-empty `range` calls as non-empty for reachability ([#&#8203;25220](https://github.com/astral-sh/ruff/pull/25220)) - Use assignability for divergent constraints ([#&#8203;26334](https://github.com/astral-sh/ruff/pull/26334)) - Widen inferred class-valued instance attributes ([#&#8203;26338](https://github.com/astral-sh/ruff/pull/26338)) ##### Contributors - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;sqqueak](https://github.com/sqqueak) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;MichaReiser](https://github.com/MichaReiser) ### [`v0.0.53`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0053) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.52...0.0.53) Released on 2026-06-23. ##### Bug fixes - Avoid bypassing lazy constraints for `Divergent` ([#&#8203;26288](https://github.com/astral-sh/ruff/pull/26288)) - Avoid recursion when projecting narrowing constraints ([#&#8203;26276](https://github.com/astral-sh/ruff/pull/26276)) - Fix ParamSpec callable signature extraction for callable instances ([#&#8203;26279](https://github.com/astral-sh/ruff/pull/26279)) - Make multi-arm `TypeOf` cycle recovery monotonic ([#&#8203;26275](https://github.com/astral-sh/ruff/pull/26275)) ##### LSP server - Document all special forms in `ty_extensions` ([#&#8203;26263](https://github.com/astral-sh/ruff/pull/26263)) ##### Performance - Avoid cloning fallback condition flow snapshots ([#&#8203;26203](https://github.com/astral-sh/ruff/pull/26203)) - Avoid constructing discarded speculative diagnostics ([#&#8203;26251](https://github.com/astral-sh/ruff/pull/26251)) - Avoid path lookups when sorting same-file diagnostics ([#&#8203;26257](https://github.com/astral-sh/ruff/pull/26257)) - Cache `is_never_satisfied` results ([#&#8203;26261](https://github.com/astral-sh/ruff/pull/26261)) - Defer applying type context to simple standalone expressions ([#&#8203;26252](https://github.com/astral-sh/ruff/pull/26252)) ##### Core type checking - Infer types for names bound in match patterns ([#&#8203;25940](https://github.com/astral-sh/ruff/pull/25940)) - Preserve regular kind for callable instances ([#&#8203;26253](https://github.com/astral-sh/ruff/pull/26253)) - Simplify intersections of invariant generic types with `Any` specializations ([#&#8203;26127](https://github.com/astral-sh/ruff/pull/26127)) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;carljm](https://github.com/carljm) ### [`v0.0.52`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0052) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.51...0.0.52) Released on 2026-06-22. ##### Bug fixes - Avoid shadowing hints for attribute assignments ([#&#8203;26164](https://github.com/astral-sh/ruff/pull/26164)) - Fix dict.pop overloads to accept arbitrary keys with defaults ([#&#8203;26241](https://github.com/astral-sh/ruff/pull/26241)) - Normalize recursive `TypeOf` across multiple union arms ([#&#8203;26230](https://github.com/astral-sh/ruff/pull/26230)) - Normalize recursive `TypeOf` growth during cycle recovery ([#&#8203;26163](https://github.com/astral-sh/ruff/pull/26163)) - Normalize recursive protocol growth during cycle recovery ([#&#8203;26246](https://github.com/astral-sh/ruff/pull/26246)) - Preserve generic alias identity during cycle recovery ([#&#8203;26166](https://github.com/astral-sh/ruff/pull/26166)) - Recover from dynamic class code generator cycles ([#&#8203;26167](https://github.com/astral-sh/ruff/pull/26167)) ##### LSP server - Add a go-to destination for `Divergent` ([#&#8203;26162](https://github.com/astral-sh/ruff/pull/26162)) - Publish diagnostics for all open files after a single file is saved ([#&#8203;25929](https://github.com/astral-sh/ruff/pull/25929)) - Render Markdown for reStructuredText fields in docstrings on hover ([#&#8203;25903](https://github.com/astral-sh/ruff/pull/25903)) ##### CLI - Make `error-on-warning` the default ([#&#8203;26157](https://github.com/astral-sh/ruff/pull/26157)) ##### Diagnostics - Make rendering of fix diffs more concise ([#&#8203;26161](https://github.com/astral-sh/ruff/pull/26161)) ##### Performance - Avoid allocating disabled error context trees ([#&#8203;26191](https://github.com/astral-sh/ruff/pull/26191)) - Avoid lookup maps for small place tables ([#&#8203;26177](https://github.com/astral-sh/ruff/pull/26177)) - Avoid moving boxed use-def map builders ([#&#8203;26211](https://github.com/astral-sh/ruff/pull/26211)) - Avoid transient AST ID merge map ([#&#8203;26185](https://github.com/astral-sh/ruff/pull/26185)) - Batch signature typevar freshness scans ([#&#8203;26196](https://github.com/astral-sh/ruff/pull/26196)) - Box large semantic index builders ([#&#8203;26186](https://github.com/astral-sh/ruff/pull/26186)) - Build frozen definition maps directly ([#&#8203;26188](https://github.com/astral-sh/ruff/pull/26188)) - Compact use-def binding interner keys ([#&#8203;26193](https://github.com/astral-sh/ruff/pull/26193)) - Consume condition flow snapshots ([#&#8203;26189](https://github.com/astral-sh/ruff/pull/26189)) - Lazily allocate reachability caches ([#&#8203;26194](https://github.com/astral-sh/ruff/pull/26194)) - Remove redundant use-def state shrinking ([#&#8203;26206](https://github.com/astral-sh/ruff/pull/26206)) - Reuse the first union bindings buffer ([#&#8203;26225](https://github.com/astral-sh/ruff/pull/26225)) - Short-circuit terminal narrowing constraints ([#&#8203;26215](https://github.com/astral-sh/ruff/pull/26215)) - Solve simple constraint conjunctions directly ([#&#8203;25879](https://github.com/astral-sh/ruff/pull/25879)) - Store cycle-detector cache entries inline ([#&#8203;26183](https://github.com/astral-sh/ruff/pull/26183)) - Stream indexed AST construction ([#&#8203;26184](https://github.com/astral-sh/ruff/pull/26184)) - Suppress discarded TypedDict diagnostics ([#&#8203;26250](https://github.com/astral-sh/ruff/pull/26250)) - Use SmallVec for `CycleDetector::seen` ([#&#8203;26181](https://github.com/astral-sh/ruff/pull/26181)) - Use a SmallVec for seen type aliases ([#&#8203;26187](https://github.com/astral-sh/ruff/pull/26187)) ##### Core type checking - Raise limit for number of non-recursive union literals ([#&#8203;25212](https://github.com/astral-sh/ruff/pull/25212)) - Preserve gradual behavior for explicit Any subclasses ([#&#8203;26034](https://github.com/astral-sh/ruff/pull/26034)) - Preserve metaclasses when inheriting from intersection-typed bases ([#&#8203;26145](https://github.com/astral-sh/ruff/pull/26145)) - Recognize exhaustive matches over finite tuples ([#&#8203;26132](https://github.com/astral-sh/ruff/pull/26132)) ##### Contributors - [@&#8203;JamBalaya56562](https://github.com/JamBalaya56562) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;Minibrams](https://github.com/Minibrams) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;charliermarsh](https://github.com/charliermarsh) ### [`v0.0.51`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0051) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.50...0.0.51) Released on 2026-06-18. ##### Bug fixes - Fix bound TypeVar default cycle recovery ([#&#8203;26124](https://github.com/astral-sh/ruff/pull/26124)) - Support `Annotated[Any, ...]` as a class base ([#&#8203;26133](https://github.com/astral-sh/ruff/pull/26133)) ##### LSP server - Suggest keyword-only arguments between variadic parameters ([#&#8203;26134](https://github.com/astral-sh/ruff/pull/26134)) ##### Core type checking - Avoid assuming classes with `Any` or `Unknown` bases are descriptors ([#&#8203;26120](https://github.com/astral-sh/ruff/pull/26120)) - Infer simpler types in complex lambda cycles ([#&#8203;26137](https://github.com/astral-sh/ruff/pull/26137)) - Preserve exact class objects during identity narrowing ([#&#8203;26117](https://github.com/astral-sh/ruff/pull/26117)) ##### Diagnostics - Preserve unpacking diagnostics for nested assignment targets ([#&#8203;26121](https://github.com/astral-sh/ruff/pull/26121)) ##### Performance - Compact indexed AST node storage ([#&#8203;25998](https://github.com/astral-sh/ruff/pull/25998)) - Discard dead DNF branches in intersection building ([#&#8203;26144](https://github.com/astral-sh/ruff/pull/26144)) ##### Documentation - Remove broken gradual guarantee link ([#&#8203;3806](https://github.com/astral-sh/ty/pull/3806)) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;sharkdp](https://github.com/sharkdp) ### [`v0.0.50`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0050) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.49...0.0.50) Released on 2026-06-17. ##### Bug fixes - Avoid cross-TypeVar leakage in generic inference ([#&#8203;26099](https://github.com/astral-sh/ruff/pull/26099)) - Fix panic from oscillating collection-use constraints ([#&#8203;26031](https://github.com/astral-sh/ruff/pull/26031)) - Preserve type variables in fixed tuple aliases ([#&#8203;26041](https://github.com/astral-sh/ruff/pull/26041)) - Respect ParamSpec binding contexts ([#&#8203;25993](https://github.com/astral-sh/ruff/pull/25993)) - Show bare `Final` as a special form on hover ([#&#8203;26029](https://github.com/astral-sh/ruff/pull/26029)) - Support options in functional dataclass calls ([#&#8203;25989](https://github.com/astral-sh/ruff/pull/25989)) ##### LSP server - Add context-sensitive keyword completions ([#&#8203;26036](https://github.com/astral-sh/ruff/pull/26036)) - Fix wildcard import symbol range ([#&#8203;25740](https://github.com/astral-sh/ruff/pull/25740)) - Highlight decorated methods consistently ([#&#8203;26003](https://github.com/astral-sh/ruff/pull/26003)) - Preserve narrowing after qualified `TYPE_CHECKING` ([#&#8203;26051](https://github.com/astral-sh/ruff/pull/26051)) - Respect client's content format preference ([#&#8203;25957](https://github.com/astral-sh/ruff/pull/25957)) - Retain all diagnostic annotations in the server ([#&#8203;26006](https://github.com/astral-sh/ruff/pull/26006)) - Track unused-binding captures across nested scopes ([#&#8203;25536](https://github.com/astral-sh/ruff/pull/25536)) ##### Diagnostics - Fix override diagnostics for decorated methods ([#&#8203;25671](https://github.com/astral-sh/ruff/pull/25671)) - Improve `duplicate-base` diagnostics ([#&#8203;26107](https://github.com/astral-sh/ruff/pull/26107)) - Reject invalid dataclass flag combinations ([#&#8203;25985](https://github.com/astral-sh/ruff/pull/25985)) - Reject legacy TypeVars in PEP 695 class bases ([#&#8203;25975](https://github.com/astral-sh/ruff/pull/25975)) - Reject legacy TypeVars in PEP 695 functions ([#&#8203;25979](https://github.com/astral-sh/ruff/pull/25979)) - Respect `@no_type_check` in function validation ([#&#8203;25994](https://github.com/astral-sh/ruff/pull/25994)) ##### Performance - Avoid rebuilding unchanged specializations ([#&#8203;25826](https://github.com/astral-sh/ruff/pull/25826)) - Avoid redundant equality intersections ([#&#8203;26057](https://github.com/astral-sh/ruff/pull/26057)) - Avoid retaining empty use-def tables ([#&#8203;26018](https://github.com/astral-sh/ruff/pull/26018)) - Compact retained definition inference extras ([#&#8203;25838](https://github.com/astral-sh/ruff/pull/25838)) - Deduplicate retained scope inference types ([#&#8203;25846](https://github.com/astral-sh/ruff/pull/25846)) - Disable LRU tracking for one-shot checks ([#&#8203;26106](https://github.com/astral-sh/ruff/pull/26106)) - Fast path collection literals with exact type contexts ([#&#8203;25878](https://github.com/astral-sh/ruff/pull/25878)) - Flatten retained declaration states ([#&#8203;25912](https://github.com/astral-sh/ruff/pull/25912)) - Improve flow snapshot performance ([#&#8203;26012](https://github.com/astral-sh/ruff/pull/26012)) - Skip stub package checks in stub-free search paths ([#&#8203;25963](https://github.com/astral-sh/ruff/pull/25963)) - Speed up large-union narrowing ([#&#8203;26048](https://github.com/astral-sh/ruff/pull/26048)) - Speed up module resolution for projects with many search paths ([#&#8203;25962](https://github.com/astral-sh/ruff/pull/25962)) - Store cumulative binding end offsets ([#&#8203;25913](https://github.com/astral-sh/ruff/pull/25913)) - Use compact frozen representation for narrowing constraints ([#&#8203;25990](https://github.com/astral-sh/ruff/pull/25990)) ##### Core type checking - Annotate intersection and negation types using `&` and `~` ([#&#8203;26035](https://github.com/astral-sh/ruff/pull/26035)) - Diagnose zero-step slices on lists ([#&#8203;25966](https://github.com/astral-sh/ruff/pull/25966)) - Full-scope bidirectional inference for non-empty collection literals ([#&#8203;25280](https://github.com/astral-sh/ruff/pull/25280)) - Improve equality-based narrowing for `==`, `!=`, and `match` ([#&#8203;25788](https://github.com/astral-sh/ruff/pull/25788)) - Infer precise values for standard-library enums ([#&#8203;26103](https://github.com/astral-sh/ruff/pull/26103)) - Make equality evaluation cycle-aware ([#&#8203;26055](https://github.com/astral-sh/ruff/pull/26055)) - Narrow equality across IntEnum classes ([#&#8203;26079](https://github.com/astral-sh/ruff/pull/26079)) - Narrow tuple expression match subjects ([#&#8203;25874](https://github.com/astral-sh/ruff/pull/25874)) - Preserve literal types for loop variables over literal collections ([#&#8203;25083](https://github.com/astral-sh/ruff/pull/25083)) - Preserve negative narrowing for starred sequence patterns ([#&#8203;25927](https://github.com/astral-sh/ruff/pull/25927)) - Preserve non-final types in Hashable unions ([#&#8203;26039](https://github.com/astral-sh/ruff/pull/26039)) - Support enum literals as tagged-union discriminants ([#&#8203;25855](https://github.com/astral-sh/ruff/pull/25855)) - Sync vendored typeshed stubs ([#&#8203;25952](https://github.com/astral-sh/ruff/pull/25952)). [Typeshed diff](https://github.com/python/typeshed/compare/32b95c1f59aa2c8edd7f2a5fd3bdfeed639ee1a7...feeb9aa8dde3ae9269b13f3bae435b82d8538b76) - Sync vendored typeshed stubs ([#&#8203;25997](https://github.com/astral-sh/ruff/pull/25997)). [Typeshed diff](https://github.com/python/typeshed/compare/32b95c1f59aa2c8edd7f2a5fd3bdfeed639ee1a7...feeb9aa8dde3ae9269b13f3bae435b82d8538b76) - Synthesize NamedTuple `__match_args__` ([#&#8203;25934](https://github.com/astral-sh/ruff/pull/25934)) - Treat assigned enum hooks conservatively ([#&#8203;25958](https://github.com/astral-sh/ruff/pull/25958)) - Validate deprecated warning categories ([#&#8203;26025](https://github.com/astral-sh/ruff/pull/26025)) ##### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;ankddev](https://github.com/ankddev) - [@&#8203;sqqueak](https://github.com/sqqueak) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;denyszhak](https://github.com/denyszhak) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;charliermarsh](https://github.com/charliermarsh) ### [`v0.0.49`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0049) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.48...0.0.49) Released on 2026-06-11. ##### Bug fixes - Fix site-package error when multiple versions of Python are installed in system path ([#&#8203;25769](https://github.com/astral-sh/ruff/pull/25769)) ##### Diagnostics - Point at attribute's binding site in \`invalid-await diagnostic ([#&#8203;24628](https://github.com/astral-sh/ruff/pull/24628)) - Report redefined legacy TypeVars ([#&#8203;25854](https://github.com/astral-sh/ruff/pull/25854)) ##### Performance - Add dedicated TDDs for narrowing constraints ([#&#8203;25834](https://github.com/astral-sh/ruff/pull/25834)) - Avoid caching same-file raw signatures ([#&#8203;25761](https://github.com/astral-sh/ruff/pull/25761)) - Cache reachability evaluations during inference ([#&#8203;25696](https://github.com/astral-sh/ruff/pull/25696)) - Compact retained definition maps ([#&#8203;25737](https://github.com/astral-sh/ruff/pull/25737)) - Omit redundant definition inference owner keys ([#&#8203;25837](https://github.com/astral-sh/ruff/pull/25837)) ##### Core type checking - Preserve nominal type of `enum.property` instances ([#&#8203;25849](https://github.com/astral-sh/ruff/pull/25849)) - Restrict length narrowing to types that encode their length ([#&#8203;25840](https://github.com/astral-sh/ruff/pull/25840)) - Use peer context for collection literals ([#&#8203;25848](https://github.com/astral-sh/ruff/pull/25848)) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;cheparity](https://github.com/cheparity) - [@&#8203;carljm](https://github.com/carljm) ### [`v0.0.48`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0048) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.47...0.0.48) Released on 2026-06-10. ##### Performance - Avoid redundant constraint saturation work ([#&#8203;25786](https://github.com/astral-sh/ruff/pull/25786)) ##### Core type checking - Add support for TypedDict `extra_items` ([#&#8203;25591](https://github.com/astral-sh/ruff/pull/25591)) - Improve `closed=True` TypedDict precision ([#&#8203;25651](https://github.com/astral-sh/ruff/pull/25651)) - Require subtyping for transitive constraint pivots ([#&#8203;25778](https://github.com/astral-sh/ruff/pull/25778)) - Sync vendored typeshed stubs ([#&#8203;25828](https://github.com/astral-sh/ruff/pull/25828)). [Typeshed diff](https://github.com/python/typeshed/compare/d3504ddc24c92b960a9661813efcdef10fad6d29...32b95c1f59aa2c8edd7f2a5fd3bdfeed639ee1a7) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;MichaReiser](https://github.com/MichaReiser) ### [`v0.0.47`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0047) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.46...0.0.47) Released on 2026-06-10. ##### Bug fixes - Avoid panicking on encountering a recursive NamedTuple that references a recursive NewType ([#&#8203;25764](https://github.com/astral-sh/ruff/pull/25764)) - Fix out-of-bound panic in notebooks involving suppression comments ([#&#8203;25629](https://github.com/astral-sh/ruff/pull/25629)) ##### Core type checking - Preserve overloads through callable protocol decorators ([#&#8203;25806](https://github.com/astral-sh/ruff/pull/25806)) - Sync vendored typeshed stubs ([#&#8203;25779](https://github.com/astral-sh/ruff/pull/25779)). [Typeshed diff](https://github.com/python/typeshed/compare/4a47505dd891ac8a94ba7f4b578899c72727ce23...d3504ddc24c92b960a9661813efcdef10fad6d29) ##### Performance and memory-usage improvements - Avoid caching specialization-invariant known instances ([#&#8203;25816](https://github.com/astral-sh/ruff/pull/25816)) - Avoid resolving overload sets for ordinary functions ([#&#8203;25817](https://github.com/astral-sh/ruff/pull/25817)) - Store common definition inference results inline ([#&#8203;25814](https://github.com/astral-sh/ruff/pull/25814)) - Use `Box<SystemPath>` etc. in `Files` ([#&#8203;25554](https://github.com/astral-sh/ruff/pull/25554)) ##### Contributors - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;charliermarsh](https://github.com/charliermarsh) ### [`v0.0.46`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0046) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.45...0.0.46) Released on 2026-06-08. ##### Bug fixes - Avoid crash when hovering over Callable ([#&#8203;25759](https://github.com/astral-sh/ruff/pull/25759)) ##### Core type checking - Support `Callable()` in match statement class patterns ([#&#8203;25541](https://github.com/astral-sh/ruff/pull/25541)) - Improve support for `enum.property` ([#&#8203;25681](https://github.com/astral-sh/ruff/pull/25681)) ##### Contributors - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;thejchap](https://github.com/thejchap) ### [`v0.0.45`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0045) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.44...0.0.45) Released on 2026-06-08. ##### Bug fixes - Avoid treating dynamic class attributes as instance attributes ([#&#8203;25678](https://github.com/astral-sh/ruff/pull/25678)) - Fix divergence in recursive inference due to ambiguous overload ([#&#8203;25548](https://github.com/astral-sh/ruff/pull/25548)) - Preserve literal promotion for mixed bounds ([#&#8203;25648](https://github.com/astral-sh/ruff/pull/25648)) ##### Diagnostics - Add `missing-type-argument` lint rule ([#&#8203;25617](https://github.com/astral-sh/ruff/pull/25617)) ##### Core type checking - Add support for narrowing on tuple match cases ([#&#8203;25493](https://github.com/astral-sh/ruff/pull/25493)) - Check implicit open TypedDict extra items ([#&#8203;25628](https://github.com/astral-sh/ruff/pull/25628)) - Create fresh copies of generic callable typevars ([#&#8203;24949](https://github.com/astral-sh/ruff/pull/24949)) - Preserve deprecation on replacement functions ([#&#8203;25688](https://github.com/astral-sh/ruff/pull/25688)) - Preserve intersection receivers during attribute lookup ([#&#8203;25626](https://github.com/astral-sh/ruff/pull/25626)) - Preserve transparent callable decorators ([#&#8203;25030](https://github.com/astral-sh/ruff/pull/25030)) ##### Performance - Avoid AST load for callable description names ([#&#8203;25728](https://github.com/astral-sh/ruff/pull/25728)) - Avoid caching absent class decorators and type parameters ([#&#8203;25689](https://github.com/astral-sh/ruff/pull/25689)) - Avoid caching atomic type specializations ([#&#8203;25663](https://github.com/astral-sh/ruff/pull/25663)) - Avoid caching constant constraint relations ([#&#8203;25656](https://github.com/astral-sh/ruff/pull/25656)) - Avoid caching missing implicit attributes ([#&#8203;25649](https://github.com/astral-sh/ruff/pull/25649)) - Avoid caching trivial class-header queries ([#&#8203;25692](https://github.com/astral-sh/ruff/pull/25692)) - Avoid caching trivial member lookups ([#&#8203;25661](https://github.com/astral-sh/ruff/pull/25661)) - Bypass member lookup for module imports ([#&#8203;25723](https://github.com/astral-sh/ruff/pull/25723)) - Cache constraint implication checks ([#&#8203;25714](https://github.com/astral-sh/ruff/pull/25714)) - Cache upper-bound satisfiability ([#&#8203;25710](https://github.com/astral-sh/ruff/pull/25710)) - Compact retained function type signatures ([#&#8203;25669](https://github.com/astral-sh/ruff/pull/25669)) - Compact retained use-def bindings ([#&#8203;25682](https://github.com/astral-sh/ruff/pull/25682)) - Consolidate retained narrowing constraints ([#&#8203;25660](https://github.com/astral-sh/ruff/pull/25660)) - Construct trivial constraint sets directly ([#&#8203;25659](https://github.com/astral-sh/ruff/pull/25659)) - Resolve function descriptors directly ([#&#8203;25675](https://github.com/astral-sh/ruff/pull/25675)) - Share code-generator classification across specializations ([#&#8203;25701](https://github.com/astral-sh/ruff/pull/25701)) - Share parameter lists with `Arc` ([#&#8203;25735](https://github.com/astral-sh/ruff/pull/25735)) - Use same-file expression inference in reachability ([#&#8203;25694](https://github.com/astral-sh/ruff/pull/25694)) ##### Contributors - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;reginaldl](https://github.com/reginaldl) ### [`v0.0.44`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0044) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.43...0.0.44) Released on 2026-06-04. ##### Bug fixes - Avoid treating `sys.implementation.version` like `sys.version_info` ([#&#8203;25608](https://github.com/astral-sh/ruff/pull/25608)) - Fix anchor point for override diagnostics ([#&#8203;25621](https://github.com/astral-sh/ruff/pull/25621)) ##### LSP server - Show type alias value on hover ([#&#8203;25381](https://github.com/astral-sh/ruff/pull/25381)) ##### Performance - Add caching for pattern match narrowing ([#&#8203;25613](https://github.com/astral-sh/ruff/pull/25613)) - Compact retained definition and expression identities ([#&#8203;25606](https://github.com/astral-sh/ruff/pull/25606)) - Reuse expression cache for TypedDict union inference ([#&#8203;25643](https://github.com/astral-sh/ruff/pull/25643)) - Upgrade Salsa ([#&#8203;25545](https://github.com/astral-sh/ruff/pull/25545)) ##### Core type checking - Enable narrowing for unions of TypedDict ([#&#8203;25188](https://github.com/astral-sh/ruff/pull/25188)) ##### Contributors - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;pierrem964](https://github.com/pierrem964) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;Hugo-Polloli](https://github.com/Hugo-Polloli) ### [`v0.0.43`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0043) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.42...0.0.43) Released on 2026-06-03. ##### Bug fixes - Don't inject `Unknown` from non-callable elements of intersection call ([#&#8203;25538](https://github.com/astral-sh/ruff/pull/25538)) - Don't needlessly disambiguate the same type alias ([#&#8203;25563](https://github.com/astral-sh/ruff/pull/25563)) - Fix variance inference for nested type aliases ([#&#8203;25567](https://github.com/astral-sh/ruff/pull/25567)) - Ignore rejected member annotations for synthesized bindings ([#&#8203;25427](https://github.com/astral-sh/ruff/pull/25427)) - Normalize dynamic class literals in cycle recovery ([#&#8203;25558](https://github.com/astral-sh/ruff/pull/25558)) - Register file roots for first-party search paths ([#&#8203;25522](https://github.com/astral-sh/ruff/pull/25522)) - Treat union-bound typevars like unions for `possibly-missing-attribute` ([#&#8203;25561](https://github.com/astral-sh/ruff/pull/25561)) ##### LSP server - Suppress importable completions that are already in scope ([#&#8203;25479](https://github.com/astral-sh/ruff/pull/25479)) ##### Performance - Avoid retaining duplicate function signatures ([#&#8203;25609](https://github.com/astral-sh/ruff/pull/25609)) - Compact retained definition inference results ([#&#8203;25593](https://github.com/astral-sh/ruff/pull/25593)) - Compact retained definition kinds ([#&#8203;25610](https://github.com/astral-sh/ruff/pull/25610)) - Compact retained definitions by node ([#&#8203;25498](https://github.com/astral-sh/ruff/pull/25498)) - Consolidate AST ID reverse lookup ([#&#8203;25455](https://github.com/astral-sh/ruff/pull/25455)) - Consolidate retained use-def definition maps ([#&#8203;25499](https://github.com/astral-sh/ruff/pull/25499)) - Omit redundant definitions-by-node entries ([#&#8203;25501](https://github.com/astral-sh/ruff/pull/25501)) - Reuse common protocol constraints for TypedDict unions ([#&#8203;25598](https://github.com/astral-sh/ruff/pull/25598)) ##### Diagnostics - Improve error context for not-iterable diagnostics ([#&#8203;24944](https://github.com/astral-sh/ruff/pull/24944)) ##### Core type checking - Detect disjointness due to incompatible generic specializations ([#&#8203;24822](https://github.com/astral-sh/ruff/pull/24822)) - Distinguish `typing.Callable` from `collections.abc.Callable` ([#&#8203;24954](https://github.com/astral-sh/ruff/pull/24954)) - Include nested `global`/`nonlocal` bindings in type inference ([#&#8203;25387](https://github.com/astral-sh/ruff/pull/25387)) - Optional lower/upper bounds in individual constraints ([#&#8203;25435](https://github.com/astral-sh/ruff/pull/25435)) - Preserve slice-bound types in subscript inference ([#&#8203;25446](https://github.com/astral-sh/ruff/pull/25446)) - Reject `Self` in type aliases ([#&#8203;25529](https://github.com/astral-sh/ruff/pull/25529)) - Require literal booleans for TypedDict flags ([#&#8203;25594](https://github.com/astral-sh/ruff/pull/25594)) - Support narrowing on lengths ([#&#8203;25347](https://github.com/astral-sh/ruff/pull/25347)) - Synthesize precise `__len__` methods for literals ([#&#8203;25600](https://github.com/astral-sh/ruff/pull/25600)) - Use callable type context to implicitly specialize generic class ([#&#8203;25471](https://github.com/astral-sh/ruff/pull/25471)) - expand type aliases inside type context unions ([#&#8203;25553](https://github.com/astral-sh/ruff/pull/25553)) ##### Contributors - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;cheparity](https://github.com/cheparity) - [@&#8203;kouhe3](https://github.com/kouhe3) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;oconnor663](https://github.com/oconnor663) ### [`v0.0.42`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0042) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.41...0.0.42) Released on 2026-06-01. ##### Bug fixes - Fix narrowing of enum literal unions by member identity ([#&#8203;25520](https://github.com/astral-sh/ruff/pull/25520)) - Detect recursive expansion in constraint-set solving ([#&#8203;25442](https://github.com/astral-sh/ruff/pull/25442)) ##### Core type checking - Support tagged-union narrowing for nominal types ([#&#8203;24916](https://github.com/astral-sh/ruff/pull/24916)) - Extend `Generator` assignability workaround to Python 3.13+ ([#&#8203;25472](https://github.com/astral-sh/ruff/pull/25472)) - Sync vendored typeshed stubs ([#&#8203;25514](https://github.com/astral-sh/ruff/pull/25514)). [Typeshed diff](https://github.com/python/typeshed/compare/e4d32e01bee44241a5e7c33298c261175b9f1bdb...4a47505dd891ac8a94ba7f4b578899c72727ce23) ##### Performance - Avoid redundant work for empty collection context ([#&#8203;25527](https://github.com/astral-sh/ruff/pull/25527)) - Deduplicate retained use-def place states ([#&#8203;25450](https://github.com/astral-sh/ruff/pull/25450)) - Compact retained semantic maps ([#&#8203;25238](https://github.com/astral-sh/ruff/pull/25238)) ##### Contributors - [@&#8203;aholyoke](https://github.com/aholyoke) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;sharkdp](https://github.com/sharkdp) ### [`v0.0.41`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0041) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.40...0.0.41) Released on 2026-05-31. ##### Bug fixes - Avoid panic for deferred dataclass field annotations ([#&#8203;25444](https://github.com/astral-sh/ruff/pull/25444)) - Avoid panic from cycle in function decorator inference ([#&#8203;25475](https://github.com/astral-sh/ruff/pull/25475)) - Ignore rejected assignments for synthesized bindings ([#&#8203;25340](https://github.com/astral-sh/ruff/pull/25340)) - Infer `bool` for `not` applied to dynamic values ([#&#8203;25445](https://github.com/astral-sh/ruff/pull/25445)) - Use diagnostic message as tie-breaker when sorting ([#&#8203;25424](https://github.com/astral-sh/ruff/pull/25424)) ##### LSP server - Add call hierarchy support ([#&#8203;25338](https://github.com/astral-sh/ruff/pull/25338)) - Add function parentheses completion ([#&#8203;25305](https://github.com/astral-sh/ruff/pull/25305)) - Display docs for matching parameter when hovering over the name of an argument passed by keyword ([#&#8203;25283](https://github.com/astral-sh/ruff/pull/25283)) - Document `completeFunctionParentheses` editor setting ([#&#8203;3513](https://github.com/astral-sh/ty/pull/3513)) ##### Diagnostics - Introduce opt-in `missing-override-decorator` rule ([#&#8203;25111](https://github.com/astral-sh/ruff/pull/25111)) - Improve diagnostics for syntax errors in forward annotations ([#&#8203;25158](https://github.com/astral-sh/ruff/pull/25158)) - Improve diagnostic for failed assignment to a `Callable` type ([#&#8203;25308](https://github.com/astral-sh/ruff/pull/25308)) ##### Core type checking - Narrow bound method overloads by receiver ([#&#8203;24707](https://github.com/astral-sh/ruff/pull/24707)) - Add disjointness for protocol method members ([#&#8203;25315](https://github.com/astral-sh/ruff/pull/25315)) - Avoid treating metaclass declarations as populated values ([#&#8203;25432](https://github.com/astral-sh/ruff/pull/25432)) - Use `TypeForm` in `ty_extensions` ([#&#8203;25421](https://github.com/astral-sh/ruff/pull/25421)) ##### Performance - Avoid storing redundant reachability indexes ([#&#8203;25453](https://github.com/astral-sh/ruff/pull/25453)) - Compact retained semantic arrays ([#&#8203;25454](https://github.com/astral-sh/ruff/pull/25454)) - Remove excess capacity from more Salsa cached collections ([#&#8203;25411](https://github.com/astral-sh/ruff/pull/25411)) - Use compact sets for more immutable fields ([#&#8203;25476](https://github.com/astral-sh/ruff/pull/25476)) - Use ThinVec for sparse kwargs bindings ([#&#8203;25457](https://github.com/astral-sh/ruff/pull/25457)) ##### Contributors - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;lerebear](https://github.com/lerebear) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;mhuen](https://github.com/mhuen) - [@&#8203;jelle-openai](https://github.com/jelle-openai) ### [`v0.0.40`](https://github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0040) [Compare Source](https://github.com/astral-sh/ty/compare/0.0.39...0.0.40) Released on 2026-05-27. ##### Bug fixes - Accept complete enum-literal alias unions as enums ([#&#8203;25341](https://github.com/astral-sh/ruff/pull/25341)) - Fix diagnostics in ignored folders after adding new files ([#&#8203;25236](https://github.com/astral-sh/ruff/pull/25236)) - Show `LiteralString` when hovering over an inline of a literal string in an IDE ([#&#8203;25373](https://github.com/astral-sh/ruff/pull/25373)) ##### LSP server - Follow aliases when attempting to map a definition in a stub file to its "real" runtime definition ([#&#8203;25328](https://github.com/astral-sh/ruff/pull/25328)) - Treat Python notebook text documents as Python sources ([#&#8203;25393](https://github.com/astral-sh/ruff/pull/25393)) - Fix autocompletion for elements inside incomplete list comprehensions ([#&#8203;25326](https://github.com/astral-sh/ruff/pull/25326)) ##### Diagnostics - Add a subdiagnostic help message to `invalid-generic-class` diagnostics regarding incompatible variance ([#&#8203;25385](https://github.com/astral-sh/ruff/pull/25385)) ##### Core type checking - Ignore and reject annotations on non-name targets ([#&#8203;25324](https://github.com/astral-sh/ruff/pull/25324)) - Infer class attributes assigned by metaclass initialization ([#&#8203;25342](https://github.com/astral-sh/ruff/pull/25342)) - Reject inconsistent generic bases in "dynamic" classes created using `type(...)`, `types.new_type(...)`, etc. ([#&#8203;25413](https://github.com/astral-sh/ruff/pull/25413)) - Resolve enum names for all unions arms in `Literal` enum subsets ([#&#8203;25379](https://github.com/astral-sh/ruff/pull/25379)) - Support `typing.TypeForm` ([#&#8203;25334](https://github.com/astral-sh/ruff/pull/25334)) - Fix many issues in the generics solver by using constraint sets more widely to solve type variables ([#&#8203;24540](https://github.com/astral-sh/ruff/pull/24540)) ##### Contributors - [@&#8203;anuraaga](https://github.com/anuraaga) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Dev-X25874](https://github.com/Dev-X25874) </details> <details> <summary>fastapi/typer (typer)</summary> ### [`v0.27.0`](https://github.com/fastapi/typer/releases/tag/0.27.0) [Compare Source](https://github.com/fastapi/typer/compare/0.26.8...0.27.0) ##### Breaking Changes - 💥 Update metavar printing. PR [#&#8203;1863](https://github.com/fastapi/typer/pull/1863) by [@&#8203;svlandeg](https://github.com/svlandeg). ##### Internal - ⬆ Bump the python-packages group across 1 directory with 5 updates. PR [#&#8203;1896](https://github.com/fastapi/typer/pull/1896) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆️ Bump ty to 0.0.53. PR [#&#8203;1877](https://github.com/fastapi/typer/pull/1877) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov). - ⬆ Bump the github-actions group across 1 directory with 4 updates. PR [#&#8203;1897](https://github.com/fastapi/typer/pull/1897) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - 🔧 Set Dependabot schedule interval to "monthly". PR [#&#8203;1873](https://github.com/fastapi/typer/pull/1873) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov). - ⬆ Bump pre-commit hooks. PR [#&#8203;1895](https://github.com/fastapi/typer/pull/1895) by [@&#8203;tiangolo](https://github.com/tiangolo). - 👷 Add GH workflow to bump pre-commit hook versions. PR [#&#8203;1872](https://github.com/fastapi/typer/pull/1872) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov). - 👷 Fix latest-changes checkout target. PR [#&#8203;1883](https://github.com/fastapi/typer/pull/1883) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆️ Update issue-manager to 0.8.1. PR [#&#8203;1880](https://github.com/fastapi/typer/pull/1880) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆ Bump the github-actions group across 1 directory with 8 updates. PR [#&#8203;1874](https://github.com/fastapi/typer/pull/1874) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump the python-packages group across 1 directory with 5 updates. PR [#&#8203;1876](https://github.com/fastapi/typer/pull/1876) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆️ Update latest-changes to 0.6.1. PR [#&#8203;1879](https://github.com/fastapi/typer/pull/1879) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆ Bump <https://github.com/crate-ci/typos> from v1.46.0 to 1.47.2 in the pre-commit group across 1 directory. PR [#&#8203;1834](https://github.com/fastapi/typer/pull/1834) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump pydantic-settings from 2.14.1 to 2.14.2. PR [#&#8203;1849](https://github.com/fastapi/typer/pull/1849) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). ### [`v0.26.8`](https://github.com/fastapi/typer/releases/tag/0.26.8) [Compare Source](https://github.com/fastapi/typer/compare/0.26.7...0.26.8) ##### Fixes - 🐛 Make second column of Rich help output reflect the type consistently, even when using `metavar`. PR [#&#8203;1410](https://github.com/fastapi/typer/pull/1410) by [@&#8203;svlandeg](https://github.com/svlandeg). - 🐛 Fix formatting in `NoSuchOption.format_message()`. PR [#&#8203;1843](https://github.com/fastapi/typer/pull/1843) by [@&#8203;foomunleong](https://github.com/foomunleong). ##### Docs - 📝 Update docs badges: remove Publish badge, it doesn't give extra information. PR [#&#8203;1850](https://github.com/fastapi/typer/pull/1850) by [@&#8203;tiangolo](https://github.com/tiangolo). - 📝 Fix formatting for help link to support GitHub-specific overview edge-case. PR [#&#8203;1826](https://github.com/fastapi/typer/pull/1826) by [@&#8203;phalberg](https://github.com/phalberg). ##### Internal - 👷 Simplify pull request workflow triggers. PR [#&#8203;1858](https://github.com/fastapi/typer/pull/1858) by [@&#8203;tiangolo](https://github.com/tiangolo). - 👷 Update issue-manager to 0.7.1. PR [#&#8203;1857](https://github.com/fastapi/typer/pull/1857) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆️ Update issue-manager to 0.7.0. PR [#&#8203;1856](https://github.com/fastapi/typer/pull/1856) by [@&#8203;tiangolo](https://github.com/tiangolo). - 🔒️ Update zizmor workflow security checks. PR [#&#8203;1854](https://github.com/fastapi/typer/pull/1854) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆️ Group Dependabot updates. PR [#&#8203;1853](https://github.com/fastapi/typer/pull/1853) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆️ Update Dependabot ecosystem coverage. PR [#&#8203;1851](https://github.com/fastapi/typer/pull/1851) by [@&#8203;tiangolo](https://github.com/tiangolo). - 👷 Fix alls-green test dependency. PR [#&#8203;1848](https://github.com/fastapi/typer/pull/1848) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆ Bump cryptography from 46.0.7 to 48.0.1. PR [#&#8203;1841](https://github.com/fastapi/typer/pull/1841) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump pyjwt from 2.12.0 to 2.13.0. PR [#&#8203;1839](https://github.com/fastapi/typer/pull/1839) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump the github-actions group across 1 directory with 3 updates. PR [#&#8203;1828](https://github.com/fastapi/typer/pull/1828) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump the python-packages group with 3 updates. PR [#&#8203;1829](https://github.com/fastapi/typer/pull/1829) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). ### [`v0.26.7`](https://github.com/fastapi/typer/releases/tag/0.26.7) [Compare Source](https://github.com/fastapi/typer/compare/0.26.6...0.26.7) ##### Fixes - 🐛 Respect wait=False when launching URLs with xdg-open. PR [#&#8203;1820](https://github.com/fastapi/typer/pull/1820) by [@&#8203;patrick91](https://github.com/patrick91). ### [`v0.26.6`](https://github.com/fastapi/typer/releases/tag/0.26.6) [Compare Source](https://github.com/fastapi/typer/compare/0.26.5...0.26.6) ##### Fixes - 🐛 Ensure that the default of a list argument is used correctly. PR [#&#8203;1821](https://github.com/fastapi/typer/pull/1821) by [@&#8203;svlandeg](https://github.com/svlandeg). ##### Internal - 👷 Speed up the CI by shuffling the test matrix. PR [#&#8203;1815](https://github.com/fastapi/typer/pull/1815) by [@&#8203;svlandeg](https://github.com/svlandeg). ### [`v0.26.5`](https://github.com/fastapi/typer/releases/tag/0.26.5) [Compare Source](https://github.com/fastapi/typer/compare/0.26.4...0.26.5) ##### Fixes - 🐛 Ensure that hidden commands are not shown when Rich markup is disabled. PR [#&#8203;1812](https://github.com/fastapi/typer/pull/1812) by [@&#8203;svlandeg](https://github.com/svlandeg). ##### Internal - 🔥 Remove old stub packages. PR [#&#8203;1810](https://github.com/fastapi/typer/pull/1810) by [@&#8203;tiangolo](https://github.com/tiangolo). ### [`v0.26.4`](https://github.com/fastapi/typer/releases/tag/0.26.4) [Compare Source](https://github.com/fastapi/typer/compare/0.26.3...0.26.4) ##### Features - 📝 Update AI Library Skill to avoid verbose code for CLI Options. PR [#&#8203;1808](https://github.com/fastapi/typer/pull/1808) by [@&#8203;tiangolo](https://github.com/tiangolo). ##### Internal - 👷 Add CI to create draft release after merging a `release` PR. PR [#&#8203;1807](https://github.com/fastapi/typer/pull/1807) by [@&#8203;tiangolo](https://github.com/tiangolo). - 👷 Update labeler to accept label `release`. PR [#&#8203;1806](https://github.com/fastapi/typer/pull/1806) by [@&#8203;tiangolo](https://github.com/tiangolo). - 👷 Update GitHub Action permissions for prepare-release. PR [#&#8203;1804](https://github.com/fastapi/typer/pull/1804) by [@&#8203;tiangolo](https://github.com/tiangolo). - 👷 Add GitHub Actions prepare release workflow. PR [#&#8203;1802](https://github.com/fastapi/typer/pull/1802) by [@&#8203;tiangolo](https://github.com/tiangolo). - 👷 Update publish action, do not use uv cache. PR [#&#8203;1803](https://github.com/fastapi/typer/pull/1803) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆ Bump the python-packages group across 1 directory with 5 updates. PR [#&#8203;1793](https://github.com/fastapi/typer/pull/1793) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). ### [`v0.26.3`](https://github.com/fastapi/typer/releases/tag/0.26.3) [Compare Source](https://github.com/fastapi/typer/compare/0.26.2...0.26.3) ##### Refactors - ♻️ Unify the testing functionality. PR [#&#8203;1792](https://github.com/fastapi/typer/pull/1792) by [@&#8203;svlandeg](https://github.com/svlandeg). ##### Internal - 👷 Update version of latest-changes GitHub action. PR [#&#8203;1798](https://github.com/fastapi/typer/pull/1798) by [@&#8203;tiangolo](https://github.com/tiangolo). ### [`v0.26.2`](https://github.com/fastapi/typer/releases/tag/0.26.2) [Compare Source](https://github.com/fastapi/typer/compare/0.26.1...0.26.2) ##### Fixes - 🐛 Ensure that an envvar set for a `typer.Option` list is split on whitespace. PR [#&#8203;1791](https://github.com/fastapi/typer/pull/1791) by [@&#8203;svlandeg](https://github.com/svlandeg). ### [`v0.26.1`](https://github.com/fastapi/typer/releases/tag/0.26.1) [Compare Source](https://github.com/fastapi/typer/compare/0.26.0...0.26.1) ##### Fixes - 🐛 Ensure that an envvar set for `typer.Option` works as expected. PR [#&#8203;1788](https://github.com/fastapi/typer/pull/1788) by [@&#8203;svlandeg](https://github.com/svlandeg). ##### Internal - ⬆ Bump python-dotenv from 1.2.1 to 1.2.2. PR [#&#8203;1714](https://github.com/fastapi/typer/pull/1714) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). ### [`v0.26.0`](https://github.com/fastapi/typer/releases/tag/0.26.0) [Compare Source](https://github.com/fastapi/typer/compare/0.25.1...0.26.0) ##### Breaking Changes - ➖ Vendor Click and streamline Typer's functionality and code base. PR [#&#8203;1774](https://github.com/fastapi/typer/pull/1774) by [@&#8203;svlandeg](https://github.com/svlandeg). - Typer no longer depends on Click as a third party dependency, it vendors (includes the source code of) Click. - This simplifies the work done by both Click and Typer teams. - It allows Typer to evolve independently, and enables several new planned features. - It will solve several dependency conflict situations for projects that use some packages that depend on Click and some that depend on Typer. - This also means that Click-specific functionality is no longer supported, like extracting the Click app and adding Click-specific plug-ins, or customizing the field types with Click-specific types. - You can read more about it in the docs for [Vendored Click](https://typer.tiangolo.com/tutorial/click/). ##### Docs - 📝 Update and simplify docs about help and management. PR [#&#8203;1778](https://github.com/fastapi/typer/pull/1778) by [@&#8203;tiangolo](https://github.com/tiangolo). - 📝 Update contributing docs, reference central docs. PR [#&#8203;1777](https://github.com/fastapi/typer/pull/1777) by [@&#8203;tiangolo](https://github.com/tiangolo). - 📝 Update security policy. PR [#&#8203;1775](https://github.com/fastapi/typer/pull/1775) by [@&#8203;tiangolo](https://github.com/tiangolo). - 📝 Update link syntax to minimal Markdown. PR [#&#8203;1623](https://github.com/fastapi/typer/pull/1623) by [@&#8203;tiangolo](https://github.com/tiangolo). - 📝 Update and simplify usage of admonitions. PR [#&#8203;1755](https://github.com/fastapi/typer/pull/1755) by [@&#8203;tiangolo](https://github.com/tiangolo). ##### Internal - 📌 Pin max version of Click to `>= 8.2.1, < 8.4` temporarily to prevent incompatibilities. PR [#&#8203;1753](https://github.com/fastapi/typer/pull/1753) by [@&#8203;tiangolo](https://github.com/tiangolo). - Superseded by vendoring Click. - 👷 Configure Dependabot to group updates and update weekly. PR [#&#8203;1768](https://github.com/fastapi/typer/pull/1768) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov). - 🔥 Remove config files now in central GitHub repo. PR [#&#8203;1780](https://github.com/fastapi/typer/pull/1780) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆ Bump idna from 3.11 to 3.15. PR [#&#8203;1771](https://github.com/fastapi/typer/pull/1771) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump pymdown-extensions from 10.21.2 to 10.21.3. PR [#&#8203;1772](https://github.com/fastapi/typer/pull/1772) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - 📝 Fix categorization of PR 1475 in release notes. PR [#&#8203;1769](https://github.com/fastapi/typer/pull/1769) by [@&#8203;svlandeg](https://github.com/svlandeg). - ✅ Add Fish shell completion tests for colon options. PR [#&#8203;1475](https://github.com/fastapi/typer/pull/1475) by [@&#8203;Mohamed-Elwasila](https://github.com/Mohamed-Elwasila). - ✅ Extend completion unit tests for zsh, powershell and pwsh. PR [#&#8203;1767](https://github.com/fastapi/typer/pull/1767) by [@&#8203;ADiTyaRaj8969](https://github.com/ADiTyaRaj8969). - ⬆ Bump actions/github-script from 7.1.0 to 9.0.0. PR [#&#8203;1746](https://github.com/fastapi/typer/pull/1746) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - 🔧 Fix GitHub link in docs. PR [#&#8203;1754](https://github.com/fastapi/typer/pull/1754) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆️ Migrate to Zensical. PR [#&#8203;1470](https://github.com/fastapi/typer/pull/1470) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆ Bump urllib3 from 2.6.3 to 2.7.0. PR [#&#8203;1741](https://github.com/fastapi/typer/pull/1741) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - 🔧 Remove unnecessary Ruff rule. PR [#&#8203;1752](https://github.com/fastapi/typer/pull/1752) by [@&#8203;tiangolo](https://github.com/tiangolo). - 🔒️ Add zizmor and fix audit findings. PR [#&#8203;1705](https://github.com/fastapi/typer/pull/1705) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov). - 🔒️ Only allow team members to modify dependencies. PR [#&#8203;1744](https://github.com/fastapi/typer/pull/1744) by [@&#8203;svlandeg](https://github.com/svlandeg). - ⬆ Bump mypy from 2.0.0 to 2.1.0. PR [#&#8203;1742](https://github.com/fastapi/typer/pull/1742) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump pydantic-settings from 2.14.0 to 2.14.1. PR [#&#8203;1739](https://github.com/fastapi/typer/pull/1739) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump ty from 0.0.34 to 0.0.35. PR [#&#8203;1740](https://github.com/fastapi/typer/pull/1740) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump actions/add-to-project from 1.0.2 to 2.0.0. PR [#&#8203;1731](https://github.com/fastapi/typer/pull/1731) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump actions/labeler from 6.0.1 to 6.1.0. PR [#&#8203;1734](https://github.com/fastapi/typer/pull/1734) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump pydantic from 2.13.3 to 2.13.4. PR [#&#8203;1736](https://github.com/fastapi/typer/pull/1736) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump prek from 0.3.11 to 0.3.13. PR [#&#8203;1735](https://github.com/fastapi/typer/pull/1735) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump mypy from 1.20.2 to 2.0.0. PR [#&#8203;1737](https://github.com/fastapi/typer/pull/1737) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - 👷 Add pre-commit for typos. PR [#&#8203;1730](https://github.com/fastapi/typer/pull/1730) by [@&#8203;tiangolo](https://github.com/tiangolo). - ⬆ Bump ty from 0.0.33 to 0.0.34. PR [#&#8203;1729](https://github.com/fastapi/typer/pull/1729) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). - ⬆ Bump ty from 0.0.32 to 0.0.33. PR [#&#8203;1724](https://github.com/fastapi/typer/pull/1724) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot). </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNjguMiIsInVwZGF0ZWRJblZlciI6IjQzLjI2OC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
chore(deps): update https://code.forgejo.org/actions/checkout digest to fbc6f39
All checks were successful
/ Get release information (pull_request) Successful in 22s
/ Unittests and try build -- Python 3.14 (pull_request) Successful in 29s
22978b4f27

📋 Changelog

📦 Version Information

  • Current version: 0.2.8
  • Previous version: 0.2.8

Unreleased (22978b4..22978b4)

Miscellaneous Chores

Generated by cocogitto

## 📋 Changelog **📦 Version Information** - Current version: `0.2.8` - Previous version: `0.2.8` ## Unreleased ([22978b4..22978b4](https://git.h.oluflorenzen.de/finkregh/zfs-estimator/compare/22978b4..22978b4)) #### Miscellaneous Chores - (**deps**) update https://code.forgejo.org/actions/checkout digest to fbc6f39 - ([22978b4](https://git.h.oluflorenzen.de/finkregh/zfs-estimator/commit/22978b4f27406553fdb60ef41afe31c1c7ae85b4)) - renovate-forgejo *Generated by [cocogitto](https://github.com/cocogitto/cocogitto)*
renovate-forgejo changed title from chore(deps): update https://code.forgejo.org/actions/checkout digest to fbc6f39 to chore(deps): update all dependencies 2026-07-30 16:06:29 +00:00
Author
Collaborator

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: uv.lock
Command failed: install-tool python 3.14.6

### ⚠️ Artifact update problem Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is. ♻ Renovate will retry this branch, including artifacts, only when one of the following happens: - any of the package files in this branch needs updating, or - the branch becomes conflicted, or - you click the rebase/retry checkbox if found above, or - you rename this PR's title to start with "rebase!" to trigger it manually The artifact failure details are included below: ##### File name: uv.lock ``` Command failed: install-tool python 3.14.6 ```
finkregh deleted branch renovate/all 2026-07-30 16:28:03 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
finkregh/zfs-estimator!9
No description provided.