Skip to content

Speed up the generation of no-member suggestions#10277

Merged
Pierre-Sassoulas merged 4 commits intopylint-dev:mainfrom
correctmost:cm/speed-up-no-member
Mar 25, 2025
Merged

Speed up the generation of no-member suggestions#10277
Pierre-Sassoulas merged 4 commits intopylint-dev:mainfrom
correctmost:cm/speed-up-no-member

Conversation

@correctmost
Copy link
Copy Markdown
Contributor

Type of Changes

Type
🔨 Refactoring

Description

Previously, edit distances were calculated for strings that had length differences greater than the maximum suggestion threshold.

Related PR:

Stats

I profiled yt-dlp (commit bd0a6681) with the following .pylintrc file:

[MAIN]
jobs=1

[MESSAGES CONTROL]
disable=all
enable=no-member

[REPORTS]
reports=no
score=no

Before

Command Mean [s] Min [s] Max [s] Relative
pylint --recursive=y . 39.161 ± 0.175 38.929 39.548 1.00
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   103292    3.706    0.000    5.653    0.000 pylint/checkers/typecheck.py:153(_string_distance)
 19623350    1.938    0.000    1.938    0.000 {built-in method builtins.min}
      245    0.039    0.000    5.747    0.023 pylint/checkers/typecheck.py:171(_similar_names)

After

Command Mean [s] Min [s] Max [s] Relative
pylint --recursive=y . 37.009 ± 0.249 36.650 37.333 1.00
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    15159    0.460    0.000    0.704    0.000 pylint/checkers/typecheck.py:153(_string_distance)
  2429889    0.244    0.000    0.244    0.000 {built-in method builtins.min}
      245    0.035    0.000    0.807    0.003 pylint/checkers/typecheck.py:175(_similar_names)

Previously, edit distances were calculated for strings that had
length differences greater than the maximum suggestion threshold.
@codecov
Copy link
Copy Markdown

codecov bot commented Mar 15, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 95.89%. Comparing base (3457433) to head (ab59393).
⚠️ Report is 261 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main   #10277   +/-   ##
=======================================
  Coverage   95.89%   95.89%           
=======================================
  Files         175      175           
  Lines       19073    19082    +9     
=======================================
+ Hits        18290    18299    +9     
  Misses        783      783           
Files with missing lines Coverage Δ
pylint/checkers/typecheck.py 96.67% <100.00%> (+0.03%) ⬆️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Copy link
Copy Markdown
Member

@Pierre-Sassoulas Pierre-Sassoulas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow, a 5+% improvement ! That's nice.

It seems like a well known problems that we should not have to optimize ourselves though.

Would you mind comparing this with using difflib.SequenceMatcher ? I suggested something but it might not directly work. And I don't like adding dependencies but maybe using https://pypi.org/project/edlib/ would be worth it (it seems it's faster than difflib)..

@correctmost
Copy link
Copy Markdown
Contributor Author

Would you mind comparing this with using difflib.SequenceMatcher ?

difflib.get_close_matches is about 200ms faster than the PR code.

One drawback is that it may be hard to map existing missing-member-hint-distance values to cutoff ratios because of the different distance algorithms and because of floating point math. For example, I would expect "buff" not to match "buffer" in the first two cases:

import difflib

difflib.get_close_matches("buff", ["buffer"], n=3, cutoff=0.75)
-> ['buffer']

difflib.get_close_matches("buff", ["buffer"], n=3, cutoff=0.80)
-> ['buffer']

difflib.get_close_matches("buff", ["buffer"], n=3, cutoff=0.80000001)
-> []

Here's a separate case where I would expect a match but don't see one:

import difflib

difflib.get_close_matches("x", ["z"], n=3, cutoff=0.00001)
-> []

Python's own attribute suggestion code does not seem to use difflib:
https://github.com/python/cpython/blob/a931a8b32415f311008dbb3f09079aae1e6d7a3d/Lib/traceback.py#L1538-L1545


Here's the patch I used:
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index edef5188b..ab280e38b 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -6,9 +6,8 @@
 
 from __future__ import annotations
 
-import heapq
+import difflib
 import itertools
-import operator
 import re
 import shlex
 import sys
@@ -170,7 +169,7 @@ def _string_distance(seq1: str, seq2: str) -> int:
 
 def _similar_names(
     owner: SuccessfulInferenceResult,
-    attrname: str | None,
+    attrname: str,
     distance_threshold: int,
     max_choices: int,
 ) -> list[str]:
@@ -179,31 +178,24 @@ def _similar_names(
     The similar names are searched given a distance metric and only
     a given number of choices will be returned.
     """
-    possible_names: list[tuple[str, int]] = []
-    names = _node_names(owner)
+    if not attrname:
+        return []
 
-    for name in names:
-        if name == attrname:
-            continue
+    names = _node_names(owner)
+    possible_names = [name for name in names if name != attrname]
 
-        distance = _string_distance(attrname or "", name)
-        if distance <= distance_threshold:
-            possible_names.append((name, distance))
+    ratio = distance_threshold / len(attrname)
+    if distance_threshold == 1 and ratio == 1:
+        ratio = 0.5
 
-    # Now get back the values with a minimum, up to the given
-    # limit or choices.
-    picked = [
-        name
-        for (name, _) in heapq.nsmallest(
-            max_choices, possible_names, key=operator.itemgetter(1)
-        )
-    ]
-    return sorted(picked)
+    threshold = 1 - ratio - 0.0001
+    choices = difflib.get_close_matches(attrname, possible_names, max_choices, threshold)
+    return sorted(choices)
 
 
 def _missing_member_hint(
     owner: SuccessfulInferenceResult,
-    attrname: str | None,
+    attrname: str,
     distance_threshold: int,
     max_choices: int,
 ) -> str:
@@ -1209,7 +1201,7 @@ accessed. Python regular expressions are accepted.",
             if self.linter.config.missing_member_hint:
                 hint = _missing_member_hint(
                     owner,
-                    node.attrname,
+                    node.attrname or "",
                     self.linter.config.missing_member_hint_distance,
                     self.linter.config.missing_member_max_choices,
                 )

@Pierre-Sassoulas
Copy link
Copy Markdown
Member

Neat.

It seems traceback use levenshtein distance while difflib use an algo that "does not yield minimal edit sequences, but does tend to yield matches that “look right” to people." (can't link the part of the doc specifically; https://docs.python.org/3/library/difflib.html)

Which would make https://pypi.org/project/edlib/ a better candidate as it's an optimized levenshtein distance ? Or we can copy paste the traceback code and not deal with a dependency if there isn't a big difference in performance ?

@Pierre-Sassoulas Pierre-Sassoulas modified the milestones: 3.3.6, 3.3.7 Mar 20, 2025
@correctmost
Copy link
Copy Markdown
Contributor Author

I re-ran the benchmarks on an updated system (which is a bit slower now):

Baseline (main)

Command Mean [s] Min [s] Max [s] Relative
pylint --recursive=y . 41.209 ± 0.157 40.921 41.426 1.00

Current PR

Command Mean [s] Min [s] Max [s] Relative
pylint --recursive=y . 39.484 ± 0.194 39.195 39.816 1.00

traceback._levenshtein_distance

Command Mean [s] Min [s] Max [s] Relative
pylint --recursive=y . 39.363 ± 0.195 39.168 39.831 1.00

edlib

Command Mean [s] Min [s] Max [s] Relative
pylint --recursive=y . 39.296 ± 0.149 39.045 39.481 1.00

My preference is to move forward with the PR branch for these reasons:

  • I don't think the additional speed-up is worth adding a dependency on edlib. Also, the performance gains would be greatest for codebases that don't actively fix Pylint warnings :) (i.e., codebases with lots of no-member errors).
  • The traceback._levenshtein_distance implementation assigns different substitution costs for moves (cost of 2) and case differences (cost of 1). This makes it tricky to honor existing missing-member-hint-distance values in a backward-compatible manner.
  • Copying the traceback._levenshtein_distance code into Pylint would require reading and updating license text, which is a bit tedious.

Patches tested

traceback._levenshtein_distance patch
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index edef5188b..dddfa7da0 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -12,6 +12,7 @@ import operator
 import re
 import shlex
 import sys
+import traceback
 from collections.abc import Callable, Iterable
 from functools import cached_property, singledispatch
 from re import Pattern
@@ -170,7 +171,7 @@ def _string_distance(seq1: str, seq2: str) -> int:
 
 def _similar_names(
     owner: SuccessfulInferenceResult,
-    attrname: str | None,
+    attrname: str,
     distance_threshold: int,
     max_choices: int,
 ) -> list[str]:
@@ -182,12 +183,15 @@ def _similar_names(
     possible_names: list[tuple[str, int]] = []
     names = _node_names(owner)
 
+    # Multiply by two because _levenshtein_distance considers move changes to have a cost of 2
+    max_cost = distance_threshold * 2
+
     for name in names:
         if name == attrname:
             continue
 
-        distance = _string_distance(attrname or "", name)
-        if distance <= distance_threshold:
+        distance = traceback._levenshtein_distance(attrname, name, max_cost)
+        if distance <= max_cost:
             possible_names.append((name, distance))
 
     # Now get back the values with a minimum, up to the given
@@ -203,7 +207,7 @@ def _similar_names(
 
 def _missing_member_hint(
     owner: SuccessfulInferenceResult,
-    attrname: str | None,
+    attrname: str,
     distance_threshold: int,
     max_choices: int,
 ) -> str:
@@ -1209,7 +1213,7 @@ accessed. Python regular expressions are accepted.",
             if self.linter.config.missing_member_hint:
                 hint = _missing_member_hint(
                     owner,
-                    node.attrname,
+                    node.attrname or "",
                     self.linter.config.missing_member_hint_distance,
                     self.linter.config.missing_member_max_choices,
                 )
edlib patch
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index edef5188b..594d16b56 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -20,6 +20,7 @@ from typing import TYPE_CHECKING, Any, Literal, Union
 import astroid
 import astroid.exceptions
 import astroid.helpers
+import edlib
 from astroid import arguments, bases, nodes, util
 from astroid.nodes import _base_nodes
 from astroid.typing import InferenceResult, SuccessfulInferenceResult
@@ -170,7 +171,7 @@ def _string_distance(seq1: str, seq2: str) -> int:
 
 def _similar_names(
     owner: SuccessfulInferenceResult,
-    attrname: str | None,
+    attrname: str,
     distance_threshold: int,
     max_choices: int,
 ) -> list[str]:
@@ -186,7 +187,7 @@ def _similar_names(
         if name == attrname:
             continue
 
-        distance = _string_distance(attrname or "", name)
+        distance = edlib.align(attrname, name)["editDistance"]
         if distance <= distance_threshold:
             possible_names.append((name, distance))
 
@@ -203,7 +204,7 @@ def _similar_names(
 
 def _missing_member_hint(
     owner: SuccessfulInferenceResult,
-    attrname: str | None,
+    attrname: str,
     distance_threshold: int,
     max_choices: int,
 ) -> str:
@@ -1209,7 +1210,7 @@ accessed. Python regular expressions are accepted.",
             if self.linter.config.missing_member_hint:
                 hint = _missing_member_hint(
                     owner,
-                    node.attrname,
+                    node.attrname or "",
                     self.linter.config.missing_member_hint_distance,
                     self.linter.config.missing_member_max_choices,
                 )

Copy link
Copy Markdown
Member

@Pierre-Sassoulas Pierre-Sassoulas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the benchmarks ! I agree with your analysis.

DanielNoord
DanielNoord previously approved these changes Mar 24, 2025
@github-actions

This comment has been minimized.

@Pierre-Sassoulas Pierre-Sassoulas dismissed stale reviews from DanielNoord and themself via ab59393 March 25, 2025 12:27
@Pierre-Sassoulas Pierre-Sassoulas enabled auto-merge (squash) March 25, 2025 12:28
@Pierre-Sassoulas Pierre-Sassoulas merged commit 9a6168d into pylint-dev:main Mar 25, 2025
45 checks passed
github-actions bot pushed a commit that referenced this pull request Mar 25, 2025
Previously, edit distances were calculated for strings that had
length differences greater than the maximum suggestion threshold.
Remove handling of missing-member-hint-distance = 0

Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
(cherry picked from commit 9a6168d)
@github-actions
Copy link
Copy Markdown
Contributor

🤖 According to the primer, this change has no effect on the checked open source code. 🤖🎉

This comment was generated for commit ab59393

Pierre-Sassoulas pushed a commit that referenced this pull request Mar 25, 2025
Previously, edit distances were calculated for strings that had
length differences greater than the maximum suggestion threshold.
Remove handling of missing-member-hint-distance = 0

Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
(cherry picked from commit 9a6168d)

Co-authored-by: correctmost <134317971+correctmost@users.noreply.github.com>
@correctmost correctmost deleted the cm/speed-up-no-member branch March 25, 2025 19:02
luketainton pushed a commit to luketainton/repos_PwnedPW that referenced this pull request Jan 5, 2026
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.3` -> `<4.1.0,>=4.0.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pylint/4.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pylint/3.3.4/4.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>pylint-dev/pylint (pylint)</summary>

### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0)

[Compare Source](pylint-dev/pylint@v3.3.9...v4.0.0)

- Pylint now supports Python 3.14.

- Pylint's inference engine (`astroid`) is now much more precise,
  understanding implicit booleanness and ternary expressions. (Thanks [@&#8203;zenlyj](https://github.com/zenlyj)!)

Consider this example:

```python
class Result:
    errors: dict | None = None

result = Result()
if result.errors:
    result.errors[field_key]

### inference engine understands result.errors cannot be None
### pylint no longer raises unsubscriptable-object
```

The required `astroid` version is now 4.0.0. See the [astroid changelog](https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-4-0-0) for additional fixes, features, and performance improvements applicable to pylint.

- Handling of `invalid-name` at the module level was patchy. Now,
  module-level constants that are reassigned are treated as variables and checked
  against `--variable-rgx` rather than `--const-rgx`. Module-level lists,
  sets, and objects can pass against either regex.

Here, `LIMIT` is reassigned, so pylint only uses `--variable-rgx`:

```python
LIMIT = 500  # [invalid-name]
if sometimes:
    LIMIT = 1  # [invalid-name]
```

If this is undesired, refactor using *exclusive* assignment so that it is
evident that this assignment happens only once:

```python
if sometimes:
    LIMIT = 1
else:
    LIMIT = 500  # exclusive assignment: uses const regex, no warning
```

Lists, sets, and objects still pass against either `const-rgx` or `variable-rgx`
even if reassigned, but are no longer completely skipped:

```python
MY_LIST = []
my_list = []
My_List = []  # [invalid-name]
```

Remember to adjust the [regexes](https://pylint.readthedocs.io/en/latest/user_guide/messages/convention/invalid-name.html) and [allow lists](https://pylint.readthedocs.io/en/latest/user_guide/configuration/all-options.html#good-names) to your liking.

## Breaking Changes

- `invalid-name` now distinguishes module-level constants that are assigned only once
  from those that are reassigned and now applies `--variable-rgx` to the latter. Values
  other than literals (lists, sets, objects) can pass against either the constant or
  variable regexes (e.g. "LOGGER" or "logger" but not "LoGgEr").

  Remember that `--good-names` or `--good-names-rgxs` can be provided to explicitly
  allow good names.

  Closes [#&#8203;3585](pylint-dev/pylint#3585)

- The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated
  and will be removed.

  Refs [#&#8203;6052](pylint-dev/pylint#6052)

- Commented out code blocks such as `#    bar() # TODO: remove dead code` will no longer emit `fixme`.

  Refs [#&#8203;9255](pylint-dev/pylint#9255)

- `pyreverse` `Run` was changed to no longer call `sys.exit()` in its `__init__`.
  You should now call `Run(args).run()` which will return the exit code instead.
  Having a class that always raised a `SystemExit` exception was considered a bug.

  Normal usage of pyreverse through the CLI will not be affected by this change.

  Refs [#&#8203;9689](pylint-dev/pylint#9689)

- The `suggestion-mode` option was removed, as pylint now always emits user-friendly hints instead
  of false-positive error messages. You should remove it from your conf if it's defined.

  Refs [#&#8203;9962](pylint-dev/pylint#9962)

- The `async.py` checker module has been renamed to `async_checker.py` since `async` is a Python keyword
  and cannot be imported directly. This allows for better testing and extensibility of the async checker functionality.

  Refs [#&#8203;10071](pylint-dev/pylint#10071)

- The message-id of `continue-in-finally` was changed from `E0116` to `W0136`. The warning is
  now emitted for every Python version since it will raise a syntax warning in Python 3.14.
  See [PEP 765 - Disallow return/break/continue that exit a finally block](https://peps.python.org/pep-0765/).

  Refs [#&#8203;10480](pylint-dev/pylint#10480)

- Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead.

  Refs [#&#8203;10583](pylint-dev/pylint#10583)

- Version requirement for `isort` has been bumped to >=5.0.0.
  The internal compatibility for older `isort` versions exposed via `pylint.utils.IsortDriver` has
  been removed.

  Refs [#&#8203;10637](pylint-dev/pylint#10637)

## New Features

- `comparison-of-constants` now uses the unicode from the ast instead of reformatting from
  the node's values preventing some bad formatting due to `utf-8` limitation. The message now uses
  `"` instead of `'` to better work with what the python ast returns.

  Refs [#&#8203;8736](pylint-dev/pylint#8736)

- Enhanced pyreverse to properly distinguish between UML relationship types (association, aggregation, composition) based on object ownership semantics. Type annotations without assignment are now treated as associations, parameter assignments as aggregations, and object instantiation as compositions.

  Closes [#&#8203;9045](pylint-dev/pylint#9045)
  Closes [#&#8203;9267](pylint-dev/pylint#9267)

- The `fixme` check can now search through docstrings as well as comments, by using
  `check-fixme-in-docstring = true` in the `[tool.pylint.miscellaneous]` section.

  Closes [#&#8203;9255](pylint-dev/pylint#9255)

- The `use-implicit-booleaness-not-x` checks now distinguish between comparisons
  used in boolean contexts and those that are not, enabling them to provide more accurate refactoring suggestions.

  Closes [#&#8203;9353](pylint-dev/pylint#9353)

- The verbose option now outputs the filenames of the files that have been checked.
  Previously, it only included the number of checked and skipped files.

  Closes [#&#8203;9357](pylint-dev/pylint#9357)

- colorized reporter now colorizes messages/categories that have been configured as `fail-on` in red inverse.
  This makes it easier to quickly find the errors that are causing pylint CI job failures.

  Closes [#&#8203;9898](pylint-dev/pylint#9898)

- Enhanced support for [@&#8203;property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.

  Closes [#&#8203;10057](pylint-dev/pylint#10057)

- Add --max-depth option to pyreverse to control diagram complexity. A depth of 0 shows only top-level packages, 1 shows one level of subpackages, etc.
  This helps manage visualization of large codebases by limiting the depth of displayed packages and classes.

  Refs [#&#8203;10077](pylint-dev/pylint#10077)

- Handle deferred evaluation of annotations in Python 3.14.

  Closes [#&#8203;10149](pylint-dev/pylint#10149)

- Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).

  Closes [#&#8203;10236](pylint-dev/pylint#10236)

- `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`.

  Closes [#&#8203;10242](pylint-dev/pylint#10242)

- pypy 3.11 is now officially supported.

  Refs [#&#8203;10287](pylint-dev/pylint#10287)

- Add support for Python 3.14.

  Refs [#&#8203;10467](pylint-dev/pylint#10467)

- Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style.

  Refs [#&#8203;10541](pylint-dev/pylint#10541)

## New Checks

- Add `match-statements` checker and the following message:
  `bare-name-capture-pattern`.
  This will emit an error message when a name capture pattern is used in a match statement which would make the remaining patterns unreachable.
  This code is a SyntaxError at runtime.

  Closes [#&#8203;7128](pylint-dev/pylint#7128)

- Add new check `async-context-manager-with-regular-with` to detect async context managers used with regular `with` statements instead of `async with`.

  Refs [#&#8203;10408](pylint-dev/pylint#10408)

- Add `break-in-finally` warning. Using `break` inside the `finally` clause
  will raise a syntax warning in Python 3.14.
  See `PEP 765 - Disallow return/break/continue that exit a finally block <https://peps.python.org/pep-0765/>`\_.

  Refs [#&#8203;10480](pylint-dev/pylint#10480)

- Add new checks for invalid uses of class patterns in :keyword:`match`.

  - :ref:`invalid-match-args-definition` is emitted if :py:data:`object.__match_args__` isn't a tuple of strings.
  - :ref:`too-many-positional-sub-patterns` if there are more positional sub-patterns than specified in :py:data:`object.__match_args__`.
  - :ref:`multiple-class-sub-patterns` if there are multiple sub-patterns for the same attribute.

  Refs [#&#8203;10559](pylint-dev/pylint#10559)

- Add additional checks for suboptimal uses of class patterns in :keyword:`match`.

  - :ref:`match-class-bind-self` is emitted if a name is bound to `self` instead of
    using an `as` pattern.
  - :ref:`match-class-positional-attributes` is emitted if a class pattern has positional
    attributes when keywords could be used.

  Refs [#&#8203;10587](pylint-dev/pylint#10587)

- Add a `consider-math-not-float` message. `float("nan")` and `float("inf")` are slower
  than their counterpart `math.inf` and `math.nan` by a factor of 4 (notwithstanding
  the initial import of math) and they are also not well typed when using mypy.
  This check also catches typos in float calls as a side effect.

  The :ref:`pylint.extensions.code_style` need to be activated for this check to work.

  Refs [#&#8203;10621](pylint-dev/pylint#10621)

## False Positives Fixed

- Fix a false positive for `used-before-assignment` when a variable defined under
  an `if` and via a named expression (walrus operator) is used later when guarded
  under the same `if` test.

  Closes [#&#8203;10061](pylint-dev/pylint#10061)

- Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14.

  Closes [#&#8203;10632](pylint-dev/pylint#10632)

## False Negatives Fixed

- Fix false negative for `used-before-assignment` when a `TYPE_CHECKING` import is used as a type annotation prior to erroneous usage.

  Refs [#&#8203;8893](pylint-dev/pylint#8893)

- Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.

  Refs [#&#8203;9667](pylint-dev/pylint#9667)

- Check module-level constants with type annotations for `invalid-name`.
  Remember to adjust `const-naming-style` or `const-rgx` to your liking.

  Closes [#&#8203;9770](pylint-dev/pylint#9770)

- Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.

  Closes [#&#8203;9894](pylint-dev/pylint#9894)

- We now raise a `logging-too-few-args` for format string with no
  interpolation arguments at all (i.e. for something like `logging.debug("Awaiting process %s")`
  or `logging.debug("Awaiting process {pid}")`). Previously we did not raise for such case.

  Closes [#&#8203;9999](pylint-dev/pylint#9999)

- Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later.

  Closes [#&#8203;10028](pylint-dev/pylint#10028)

- Fix a false negative for `possibly-used-before-assignment` when a variable is conditionally defined
  and later assigned to a type-annotated variable.

  Closes [#&#8203;10421](pylint-dev/pylint#10421)

- Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence.

  Refs [#&#8203;10453](pylint-dev/pylint#10453)

- Count match cases for `too-many-branches` check.

  Refs [#&#8203;10542](pylint-dev/pylint#10542)

- Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement.

  Refs [#&#8203;10633](pylint-dev/pylint#10633)

## Other Bug Fixes

- When displaying unicode with surrogates (or other potential `UnicodeEncodeError`),
  pylint will now display a '?' character (using `encode(encoding="utf-8", errors="replace")`)
  instead of crashing. The functional tests classes are also updated to handle this case.

  Closes [#&#8203;8736](pylint-dev/pylint#8736)

- Fixed unidiomatic-typecheck only checking left-hand side.

  Closes [#&#8203;10217](pylint-dev/pylint#10217)

- Fix a crash caused by malformed format strings when using `.format` with keyword arguments.

  Closes [#&#8203;10282](pylint-dev/pylint#10282)

- Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions.

  Closes [#&#8203;10508](pylint-dev/pylint#10508)

- Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max`
  instead of `min` or `max` directly.

  Closes [#&#8203;10626](pylint-dev/pylint#10626)

- Fixed a crash in :ref:`unnecessary-dict-index-lookup` when the index of an enumerated list
  was deleted inside a for loop.

  Closes [#&#8203;10627](pylint-dev/pylint#10627)

## Other Changes

- Remove support for launching pylint with Python 3.9.
  Code that supports Python 3.9 can still be linted with the `--py-version=3.9` setting.

  Refs [#&#8203;10405](pylint-dev/pylint#10405)

## Internal Changes

- Modified test framework to allow for different test output for different Python versions.

  Refs [#&#8203;10382](pylint-dev/pylint#10382)

### [`v3.3.9`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.9)

[Compare Source](pylint-dev/pylint@v3.3.8...v3.3.9)

## What's new in Pylint 3.3.9?

Release date: 2025-10-05

## False Positives Fixed

- Fix used-before-assignment for PEP 695 type aliases and parameters.

  Closes [#&#8203;9815](pylint-dev/pylint#9815)

- No longer flag undeprecated functions in `importlib.resources` as deprecated.

  Closes [#&#8203;10593](pylint-dev/pylint#10593)

- Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions.

  Closes [#&#8203;10508](pylint-dev/pylint#10508)

- Fix false positive `undefined-variable` (E0602) for for-loop variable shadowing patterns like `for item in item:` when the variable was previously defined.

  Closes [#&#8203;10562](pylint-dev/pylint#10562)

## Other Bug Fixes

- Fixed crash in 'unnecessary-list-index-lookup' when starting an enumeration using
  minus the length of an iterable inside a dict comprehension when the len call was only
  made in this dict comprehension, and not elsewhere. Also changed the approach,
  to use inference in all cases but the simple ones, so we don't have to fix crashes
  one by one for arbitrarily complex expressions in enumerate.

  Closes [#&#8203;10510](pylint-dev/pylint#10510)

### [`v3.3.8`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.8)

[Compare Source](pylint-dev/pylint@v3.3.7...v3.3.8)

## What's new in Pylint 3.3.8?

Release date: 2025-08-09

This patch release includes an exceptional fix for a false negative issue. For details, see: [#&#8203;10482 (comment)](pylint-dev/pylint#10482 (comment))

## False Positives Fixed

- Fix false positives for `possibly-used-before-assignment` when variables are exhaustively
  assigned within a `match` block.

  Closes [#&#8203;9668](pylint-dev/pylint#9668)

- Fix false positive for `missing-raises-doc` and `missing-yield-doc` when the method length is less than docstring-min-length.

  Refs [#&#8203;10104](pylint-dev/pylint#10104)

- Fix a false positive for `unused-variable` when multiple except handlers bind the same name under a try block.

  Closes [#&#8203;10426](pylint-dev/pylint#10426)

## False Negatives Fixed

- Fix false-negative for `used-before-assignment` with `from __future__ import annotations` in function definitions.

  Refs [#&#8203;10482](pylint-dev/pylint#10482)

## Other Bug Fixes

- Fix a bug in Pyreverse where aggregations and associations were included in diagrams regardless of the selected --filter-mode (such as PUB\_ONLY, ALL, etc.).

  Closes [#&#8203;10373](pylint-dev/pylint#10373)

- Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output.

  Closes [#&#8203;10402](pylint-dev/pylint#10402)

### [`v3.3.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.7)

[Compare Source](pylint-dev/pylint@v3.3.6...v3.3.7)

## What's new in Pylint 3.3.7?

Release date: 2025-05-04

## False Positives Fixed

- Comparisons between two calls to `type()` won't raise an `unidiomatic-typecheck` warning anymore, consistent with the behavior applied only for `==` previously.

  Closes [#&#8203;10161](pylint-dev/pylint#10161)

## Other Bug Fixes

- Fixed a crash when importing a class decorator that did not exist with the same name as a class attribute after the class definition.

  Closes [#&#8203;10105](pylint-dev/pylint#10105)

- Fix a crash caused by malformed format strings when using `.format` with keyword arguments.

  Closes [#&#8203;10282](pylint-dev/pylint#10282)

- Using a slice as a class decorator now raises a `not-callable` message instead of crashing. A lot of checks that dealt with decorators (too many to list) are now shortcut if the decorator can't immediately be inferred to a function or class definition.

  Closes [#&#8203;10334](pylint-dev/pylint#10334)

## Other Changes

- The algorithm used for `no-member` suggestions is now more efficient and cuts the
  calculation when the distance score is already above the threshold.

  Refs [#&#8203;10277](pylint-dev/pylint#10277)

### [`v3.3.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.6)

[Compare Source](pylint-dev/pylint@v3.3.5...v3.3.6)

## What's new in Pylint 3.3.6?

Release date: 2025-03-20

## False Positives Fixed

- Fix a false positive for `used-before-assignment` when an inner function's return type
  annotation is a class defined at module scope.

  Closes [#&#8203;9391](pylint-dev/pylint#9391)

### [`v3.3.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.5)

[Compare Source](pylint-dev/pylint@v3.3.4...v3.3.5)

## What's new in Pylint 3.3.5?

Release date: 2025-03-09

## False Positives Fixed

- Fix false positives for `use-implicit-booleaness-not-comparison`, `use-implicit-booleaness-not-comparison-to-string`
  and `use-implicit-booleaness-not-comparison-to-zero` when chained comparisons are checked.

  Closes [#&#8203;10065](pylint-dev/pylint#10065)

- Fix a false positive for `invalid-getnewargs-ex-returned` when the tuple or dict has been assigned to a name.

  Closes [#&#8203;10208](pylint-dev/pylint#10208)

- Remove `getopt` and `optparse` from the list of deprecated modules.

  Closes [#&#8203;10211](pylint-dev/pylint#10211)

## Other Bug Fixes

- Fixed conditional import x.y causing false positive possibly-used-before-assignment.

  Closes [#&#8203;10081](pylint-dev/pylint#10081)

- Fix a crash when something besides a class is found in an except handler.

  Closes [#&#8203;10106](pylint-dev/pylint#10106)

- Fixed raising invalid-name when using camelCase for private methods with two leading underscores.

  Closes [#&#8203;10189](pylint-dev/pylint#10189)

## Other Changes

- Upload release assets to PyPI via Trusted Publishing.

  Closes [#&#8203;10256](pylint-dev/pylint#10256)

</details>

---

### Configuration

📅 **Schedule**: 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 is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJsaW50aW5nIl19-->

Reviewed-on: https://git.tainton.uk/repos/PwnedPW/pulls/302
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 15, 2026
This MR contains the following updates:

| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [deptry](https://github.com/fpgmaas/deptry) ([changelog](https://github.com/fpgmaas/deptry/blob/main/CHANGELOG.md)) | dev | minor | `^0.16.1` → `^0.24.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/fpgmaas/deptry/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fpgmaas/deptry) |
| [flake8](https://github.com/pycqa/flake8) ([changelog](https://flake8.pycqa.org/en/latest/release-notes/index.html)) | dev | minor | `7.1.0` → `7.3.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pycqa/flake8/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pycqa/flake8) |
| [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear#change-log) ([changelog](https://github.com/PyCQA/flake8-bugbear#change-log)) | dev | minor | `24.4.26` → `24.12.12` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PyCQA/flake8-bugbear/badge)](https://securityscorecards.dev/viewer/?uri=github.com/PyCQA/flake8-bugbear) |
| [mypy](https://github.com/python/mypy) ([changelog](https://mypy.readthedocs.io/en/latest/changelog.html)) | dev | minor | `1.10.1` → `1.19.1` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/python/mypy/badge)](https://securityscorecards.dev/viewer/?uri=github.com/python/mypy) |
| [pip-licenses](https://github.com/raimon49/pip-licenses) ([changelog](https://github.com/raimon49/pip-licenses/releases)) | dev | minor | `5.0.0` → `5.5.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/raimon49/pip-licenses/badge)](https://securityscorecards.dev/viewer/?uri=github.com/raimon49/pip-licenses) |
| [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | dev | minor | `3.2.4` → `3.3.9` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pylint-dev/pylint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pylint-dev/pylint) |
| [pylint-pydantic](https://github.com/fcfangcc/pylint-pydantic) | dev | minor | `^0.3.2` → `^0.4.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/fcfangcc/pylint-pydantic/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fcfangcc/pylint-pydantic) |
| [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) ([changelog](https://pytest-asyncio.readthedocs.io/en/latest/reference/changelog.html)) | test | minor | `^0.23.6` → `^0.26.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-asyncio/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-asyncio) |
| [pytest-celery](https://github.com/celery/pytest-celery) | test | minor | `1.0.0` → `1.2.1` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/celery/pytest-celery/badge)](https://securityscorecards.dev/viewer/?uri=github.com/celery/pytest-celery) |
| [pytest-memray](https://github.com/bloomberg/pytest-memray) | test | minor | `1.7.0` → `1.8.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/bloomberg/pytest-memray/badge)](https://securityscorecards.dev/viewer/?uri=github.com/bloomberg/pytest-memray) |
| [pytest-mock](https://github.com/pytest-dev/pytest-mock) ([changelog](https://pytest-mock.readthedocs.io/en/latest/changelog.html)) | test | minor | `3.14.0` → `3.15.1` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-mock/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-mock) |
| [pytest-random-order](https://github.com/jbasko/pytest-random-order) | test | minor | `1.1.1` → `1.2.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/jbasko/pytest-random-order/badge)](https://securityscorecards.dev/viewer/?uri=github.com/jbasko/pytest-random-order) |
| [python-gitlab](https://github.com/python-gitlab/python-gitlab) ([changelog](https://github.com/python-gitlab/python-gitlab/blob/main/CHANGELOG.md)) | dev | minor | `6.0.0` → `6.5.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/python-gitlab/python-gitlab/badge)](https://securityscorecards.dev/viewer/?uri=github.com/python-gitlab/python-gitlab) |
| [zstandard](https://github.com/indygreg/python-zstandard) | dev | minor | `^0.23.0` → `^0.25.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/indygreg/python-zstandard/badge)](https://securityscorecards.dev/viewer/?uri=github.com/indygreg/python-zstandard) |

---

### Release Notes

<details>
<summary>fpgmaas/deptry (deptry)</summary>

### [`v0.24.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0240---2025-11-09)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.23.1...0.24.0)

##### Breaking changes

##### Python 3.9 support dropped

Support for Python 3.9 has been dropped, as it has reached its end of life.

##### PyPy 3.10 support dropped, 3.11 added

Support for PyPy 3.10 has been dropped, since it is unsupported. We now only test against PyPy 3.11, and only publish wheels for this version.

##### Features

- Add GitHub Actions annotations reporter ([#&#8203;1059](https://github.com/fpgmaas/deptry/pull/1059))
- Add support for Python 3.14 ([#&#8203;1224](https://github.com/fpgmaas/deptry/pull/1224))
- Drop support for Python 3.9 ([#&#8203;1328](https://github.com/fpgmaas/deptry/pull/1328))
- Publish wheels for PyPy 3.11 and drop 3.10 ([#&#8203;1227](https://github.com/fpgmaas/deptry/pull/1227))

##### Full Changelog

### [`v0.23.1`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0231---2025-07-30)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.23.0...0.23.1)

##### Bug Fixes

- Improve handling of `TYPE_CHECKING` blocks by supporting `import typing as t` and checking `t.TYPE_CHECKING` ([#&#8203;1218](https://github.com/fpgmaas/deptry/pull/1218))
- Fix missing hyperlink in report output ([#&#8203;1162](https://github.com/fpgmaas/deptry/pull/1162))

##### Full Changelog

### [`v0.23.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0230---2025-01-25)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.22.0...0.23.0)

##### Features

- Correctly detect transitive dependencies with different module names ([#&#8203;1033](https://github.com/fpgmaas/deptry/pull/1033))

##### Full Changelog

### [`v0.22.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0220---2025-01-10)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.21.2...0.22.0)

Poetry 2.0 introduced support
for [defining project metadata in PEP 621](https://python-poetry.org/blog/announcing-poetry-2.0.0/). This is now
supported by *deptry*. [Documentation](https://deptry.com/supported-dependency-managers/#poetry) has been updated to
detail *deptry*'s behavior.

##### Features

- Support PEP 621 in Poetry 2.0+ ([#&#8203;1003](https://github.com/fpgmaas/deptry/pull/1003))

##### Full Changelog

### [`v0.21.2`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0212---2024-12-19)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.21.1...0.21.2)

##### Miscellaneous

- Provide wheels for musllinux ([#&#8203;979](https://github.com/fpgmaas/deptry/pull/979))

##### Full Changelog

### [`v0.21.1`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0211---2024-11-15)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.21.0...0.21.1)

##### Bug Fixes

- Handle string requirements files for `setuptools` dynamic
  dependencies ([#&#8203;945](https://github.com/fpgmaas/deptry/pull/945))

##### Full Changelog

### [`v0.21.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0210---2024-11-08)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.20.0...0.21.0)

##### Breaking changes

##### Ignore files handling

Unless [`--exclude`](https://deptry.com/usage/#exclude) is used, *deptry* excludes files found in common ignore
files (`.gitignore`, `.ignore`, `$HOME/.config/git/ignore`. ...), by using [`ignore`](https://crates.io/crates/ignore)
Rust crate. The default behaviour has been changed, so that now:

- git-related ignore rules (`.gitignore`, `$HOME/.config/git/ignore`, ...) are only used if *deptry* is run inside a git
  repository
- `.gitignore` files that are in parent directories of the git repository from where deptry is run are not
  used (previously, *deptry* would traverse parent directories up to the root system)

If you were using `.gitignore` files for non-git repositories, you might want to switch to `.ignore` files, or use
[`--extend-exclude`](https://deptry.com/usage/#extend-exclude).

##### Requirements files parsing

*deptry* now uses [`requirements-parser`](https://pypi.org/project/requirements-parser/) to parse dependencies from
requirements files, meaning that it can now extract nested requirements files referenced in other requirements files
without having to explicitly configure it in *deptry*.

For instance, if you have:

```python

# requirements.txt
-r cli-requirements.txt
httpx==0.27.2
```

```python

# cli-requirements.txt
click==8.1.7
```

With the default configuration, when parsing `requirements.txt`, both `httpx` and `click` will now be listed as
dependencies by *deptry*, while previously, only `httpx` was, unless *deptry* was instructed about
`cli-requirements.txt` by using [`--requirements-files`](https://deptry.com/usage/#requirements-files). This new
behaviour also impacts development requirements files, that can be overridden by
using [`--requirements-files-dev`](https://deptry.com/usage/#requirements-files-dev).

##### Python 3.8 support dropped

Support for Python 3.8 has been dropped, as it has reached its end of life.

##### Features

- *deptry* now detects development dependencies from `[dependency-groups]` section, introduced
  by [PEP 735](https://peps.python.org/pep-0735/) ([#&#8203;892](https://github.com/fpgmaas/deptry/pull/892))
- *deptry* now supports `setuptools` dynamic dependencies set in `[tool.setuptools.dynamic]` section,
  see <https://deptry.com/supported-dependency-managers/#setuptools> for more
  details ([#&#8203;894](https://github.com/fpgmaas/deptry/pull/894), [#&#8203;724](https://github.com/fpgmaas/deptry/pull/724))
- Drop support for Python 3.8 ([#&#8203;874](https://github.com/fpgmaas/deptry/pull/874))
- Improve ignore handling ([#&#8203;908](https://github.com/fpgmaas/deptry/pull/908))
- Parse requirements files with `requirements-parser`, adding support for parsing nested requirements
  files referenced with `-r <requirement_file>` ([#&#8203;913](https://github.com/fpgmaas/deptry/pull/913))

##### Full Changelog

### [`v0.20.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0200---2024-08-27)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.19.1...0.20.0)

##### Breaking changes

In release [0.15.0](https://github.com/fpgmaas/deptry/releases/tag/0.15.0), we announced the deprecation of the
following flags:

- `--requirements-txt` (and its `requirements_txt` setting counterpart in `pyproject.toml`)
- `--requirements-txt-dev` (and its `requirements_txt_dev` setting counterpart in `pyproject.toml`)

Those flags have now been removed. If you relied on them, you should now use, respectively:

- `--requirements-files` (and its `requirements_files` setting counterpart in `pyproject.toml`)
- `--requirements-files-dev` (and its `requirements_files_dev` setting counterpart in `pyproject.toml`)

##### Features

- deptry now detects [uv](https://github.com/astral-sh/uv) and reads development dependencies from
  `[uv.tool.dev-dependencies]` section ([#&#8203;816](https://github.com/fpgmaas/deptry/pull/816))
- Dynamically set max terminal width for better readability when displaying
  help ([#&#8203;817](https://github.com/fpgmaas/deptry/pull/817))
- Remove deprecated `--requirements-txt`/`--requirements-txt-dev`
  flags ([#&#8203;819](https://github.com/fpgmaas/deptry/pull/819))

##### Full Changelog

### [`v0.19.1`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0191---2024-08-10)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.19.0...0.19.1)

##### Features

- Add back PEP 420 support behind `--experimental-namespace-package` feature
  flag ([#&#8203;808](https://github.com/fpgmaas/deptry/pull/808))
- Add support for Python 3.13 ([#&#8203;713](https://github.com/fpgmaas/deptry/pull/713), [#&#8203;809](https://github.com/fpgmaas/deptry/pull/809))

##### Miscellaneous

- Provide Windows ARM64 wheels for Python ([#&#8203;807](https://github.com/fpgmaas/deptry/pull/807))

##### Full Changelog

### [`v0.19.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0190---2024-08-08)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.18.0...0.19.0)

This release reverts [#&#8203;753](https://github.com/fpgmaas/deptry/pull/753) that caused a noticeable performance regression on large
codebases. The intent of the initial MR was to support projects following PEP 420, so if your project currently relies
on this behaviour, feel free to manifest your interest in [#&#8203;740](https://github.com/fpgmaas/deptry/issues/740).

##### Bug Fixes

- Revert "fix(core): use `rglob` to guess local Python modules ([#&#8203;753](https://github.com/fpgmaas/deptry/issues/753))" ([#&#8203;798](https://github.com/fpgmaas/deptry/pull/798))

##### New Contributors

- [@&#8203;huisman](https://github.com/huisman) made their first contribution in [#&#8203;796](https://github.com/fpgmaas/deptry/pull/796)

##### Full Changelog

### [`v0.18.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0180---2024-07-31)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.17.0...0.18.0)

##### Features

- Support imports using `importlib.import_module` ([#&#8203;782](https://github.com/fpgmaas/deptry/pull/782))

##### New Contributors

- [@&#8203;lmmx](https://github.com/lmmx) made their first contribution in [#&#8203;782](https://github.com/fpgmaas/deptry/pull/782)

##### Full Changelog

### [`v0.17.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0170---2024-07-20)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.16.2...0.17.0)

##### Features

- Add a new rule `DEP005` to detect project dependencies that are in the standard library. ([#&#8203;761](https://github.com/fpgmaas/deptry/pull/761))

##### Full Changelog

### [`v0.16.2`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0162---2024-07-05)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.16.1...0.16.2)

##### Bug Fixes

- Avoid crashing on PEP 621 and Poetry projects with no dependencies ([#&#8203;752](https://github.com/fpgmaas/deptry/pull/752))
- Recursively search for Python files to detect local modules, to better support namespace packages ([#&#8203;753](https://github.com/fpgmaas/deptry/pull/753))

##### Miscellaneous

- Provide macOS ARM wheels for PyPy ([#&#8203;691](https://github.com/fpgmaas/deptry/pull/691))

##### Full Changelog

</details>

<details>
<summary>pycqa/flake8 (flake8)</summary>

### [`v7.3.0`](https://github.com/pycqa/flake8/compare/7.2.0...7.3.0)

[Compare Source](https://github.com/pycqa/flake8/compare/7.2.0...7.3.0)

### [`v7.2.0`](https://github.com/pycqa/flake8/compare/7.1.2...7.2.0)

[Compare Source](https://github.com/pycqa/flake8/compare/7.1.2...7.2.0)

### [`v7.1.2`](https://github.com/pycqa/flake8/compare/7.1.1...7.1.2)

[Compare Source](https://github.com/pycqa/flake8/compare/7.1.1...7.1.2)

### [`v7.1.1`](https://github.com/pycqa/flake8/compare/7.1.0...7.1.1)

[Compare Source](https://github.com/pycqa/flake8/compare/7.1.0...7.1.1)

</details>

<details>
<summary>PyCQA/flake8-bugbear (flake8-bugbear)</summary>

### [`v24.12.12`](https://github.com/PyCQA/flake8-bugbear/releases/tag/24.12.12)

[Compare Source](https://github.com/PyCQA/flake8-bugbear/compare/24.10.31...24.12.12)

- B012 and B025 now also handle try/except\* ([#&#8203;500](https://github.com/PyCQA/flake8-bugbear/issues/500))
- Skip B028 if warnings.warn is called with `*args` or `**kwargs` ([#&#8203;501](https://github.com/PyCQA/flake8-bugbear/issues/501))
- Add B911: itertools.batched without strict= ([#&#8203;502](https://github.com/PyCQA/flake8-bugbear/issues/502))
- Readme has anchors per check (they do not seem to render on GitHub tho)

### [`v24.10.31`](https://github.com/PyCQA/flake8-bugbear/releases/tag/24.10.31)

[Compare Source](https://github.com/PyCQA/flake8-bugbear/compare/24.8.19...24.10.31)

- B041: New dictionary same key AND value check ([#&#8203;496](https://github.com/PyCQA/flake8-bugbear/issues/496))
- B037: Fix typo in error message
- B024: No longer treats assigned class variables as abstract ([#&#8203;471](https://github.com/PyCQA/flake8-bugbear/issues/471))
- Bump required attrs version to 22.2.0

### [`v24.8.19`](https://github.com/PyCQA/flake8-bugbear/releases/tag/24.8.19)

[Compare Source](https://github.com/PyCQA/flake8-bugbear/compare/24.4.26...24.8.19)

- B910: implement to suggest using Counter() instead of defaultdict(int) ([#&#8203;489](https://github.com/PyCQA/flake8-bugbear/issues/489))
- B901: Do not trigger with explicit Generator return type ([#&#8203;481](https://github.com/PyCQA/flake8-bugbear/issues/481))
- B008: add some comments, rename b008\_extend\_immutable\_calls ([#&#8203;476](https://github.com/PyCQA/flake8-bugbear/issues/476))
- B040: exception with note added not reraised or used ([#&#8203;477](https://github.com/PyCQA/flake8-bugbear/issues/477))
- B039, Add `ContextVar` with mutable literal or function call as default
- B040: Add Exception with added note not reraised. ([#&#8203;474](https://github.com/PyCQA/flake8-bugbear/issues/474))
- Run tests in Python 3.13
- Type annotated code ([#&#8203;481](https://github.com/PyCQA/flake8-bugbear/issues/481) + [#&#8203;483](https://github.com/PyCQA/flake8-bugbear/issues/483))
- Replace hash with unsafe\_hash ([#&#8203;486](https://github.com/PyCQA/flake8-bugbear/issues/486))

</details>

<details>
<summary>python/mypy (mypy)</summary>

### [`v1.19.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1191)

[Compare Source](https://github.com/python/mypy/compare/v1.19.0...v1.19.1)

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

### [`v1.19.0`](https://github.com/python/mypy/compare/v1.18.2...v1.19.0)

[Compare Source](https://github.com/python/mypy/compare/v1.18.2...v1.19.0)

### [`v1.18.2`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1182)

[Compare Source](https://github.com/python/mypy/compare/v1.18.1...v1.18.2)

- Fix crash on recursive alias (Ivan Levkivskyi, MR [19845](https://github.com/python/mypy/pull/19845))
- Add additional guidance for stubtest errors when runtime is `object.__init__` (Stephen Morton, MR [19733](https://github.com/python/mypy/pull/19733))
- Fix handling of None values in f-string expressions in mypyc (BobTheBuidler, MR [19846](https://github.com/python/mypy/pull/19846))

### [`v1.18.1`](https://github.com/python/mypy/compare/v1.17.1...v1.18.1)

[Compare Source](https://github.com/python/mypy/compare/v1.17.1...v1.18.1)

### [`v1.17.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1171)

[Compare Source](https://github.com/python/mypy/compare/v1.17.0...v1.17.1)

- Retain `None` as constraints bottom if no bottoms were provided (Stanislav Terliakov, MR [19485](https://github.com/python/mypy/pull/19485))
- Fix "ignored exception in `hasattr`" in dmypy (Stanislav Terliakov, MR [19428](https://github.com/python/mypy/pull/19428))
- Prevent a crash when InitVar is redefined with a method in a subclass (Stanislav Terliakov, MR [19453](https://github.com/python/mypy/pull/19453))

### [`v1.17.0`](https://github.com/python/mypy/compare/v1.16.1...v1.17.0)

[Compare Source](https://github.com/python/mypy/compare/v1.16.1...v1.17.0)

### [`v1.16.1`](https://github.com/python/mypy/compare/v1.16.0...v1.16.1)

[Compare Source](https://github.com/python/mypy/compare/v1.16.0...v1.16.1)

### [`v1.16.0`](https://github.com/python/mypy/compare/v1.15.0...v1.16.0)

[Compare Source](https://github.com/python/mypy/compare/v1.15.0...v1.16.0)

### [`v1.15.0`](https://github.com/python/mypy/compare/v1.14.1...v1.15.0)

[Compare Source](https://github.com/python/mypy/compare/v1.14.1...v1.15.0)

### [`v1.14.1`](https://github.com/python/mypy/compare/v1.14.0...v1.14.1)

[Compare Source](https://github.com/python/mypy/compare/v1.14.0...v1.14.1)

### [`v1.14.0`](https://github.com/python/mypy/compare/v1.13.0...v1.14.0)

[Compare Source](https://github.com/python/mypy/compare/v1.13.0...v1.14.0)

### [`v1.13.0`](https://github.com/python/mypy/compare/v1.12.1...v1.13.0)

[Compare Source](https://github.com/python/mypy/compare/v1.12.1...v1.13.0)

### [`v1.12.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1121)

[Compare Source](https://github.com/python/mypy/compare/v1.12.0...v1.12.1)

- Fix crash when showing partially analyzed type in error message (Ivan Levkivskyi, MR [17961](https://github.com/python/mypy/pull/17961))
- Fix iteration over union (when self type is involved) (Shantanu, MR [17976](https://github.com/python/mypy/pull/17976))
- Fix type object with type var default in union context (Jukka Lehtosalo, MR [17991](https://github.com/python/mypy/pull/17991))
- Revert change to `os.path` stubs affecting use of `os.PathLike[Any]` (Shantanu, MR [17995](https://github.com/python/mypy/pull/17995))

### [`v1.12.0`](https://github.com/python/mypy/compare/v1.11.2...v1.12.0)

[Compare Source](https://github.com/python/mypy/compare/v1.11.2...v1.12.0)

### [`v1.11.2`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1112)

[Compare Source](https://github.com/python/mypy/compare/v1.11.1...v1.11.2)

- Alternative fix for a union-like literal string (Ivan Levkivskyi, MR [17639](https://github.com/python/mypy/pull/17639))
- Unwrap `TypedDict` item types before storing (Ivan Levkivskyi, MR [17640](https://github.com/python/mypy/pull/17640))

### [`v1.11.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1111)

[Compare Source](https://github.com/python/mypy/compare/v1.11.0...v1.11.1)

- Fix `RawExpressionType.accept` crash with `--cache-fine-grained` (Anders Kaseorg, MR [17588](https://github.com/python/mypy/pull/17588))
- Fix PEP 604 isinstance caching (Shantanu, MR [17563](https://github.com/python/mypy/pull/17563))
- Fix `typing.TypeAliasType` being undefined on python < 3.12 (Nikita Sobolev, MR [17558](https://github.com/python/mypy/pull/17558))
- Fix `types.GenericAlias` lookup crash (Shantanu, MR [17543](https://github.com/python/mypy/pull/17543))

### [`v1.11.0`](https://github.com/python/mypy/compare/v1.10.1...v1.11.0)

[Compare Source](https://github.com/python/mypy/compare/v1.10.1...v1.11.0)

</details>

<details>
<summary>raimon49/pip-licenses (pip-licenses)</summary>

### [`v5.5.0`](https://github.com/raimon49/pip-licenses/blob/HEAD/CHANGELOG.md#550)

- Replace dependency on `tomli` with builtin `tomllib` for Python 3.11
- Added support for `License-Expression` metadata field, see [PEP 639](https://peps.python.org/pep-0639/)
- Added `--from=expression` option
- Breaking change: The `--from=all` output now includes the `License-Expression` value
- Fixed KeyError with `--partial` and `--allow-only` if a license matches multiple allowed licenses.
- Declare support for Python 3.13 and 3.14
- Added RST/Sphinx workflow example for `--with-license-file` option in documentation

</details>

<details>
<summary>pylint-dev/pylint (pylint)</summary>

### [`v3.3.9`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.9)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.8...v3.3.9)

## What's new in Pylint 3.3.9?

Release date: 2025-10-05

## False Positives Fixed

- Fix used-before-assignment for PEP 695 type aliases and parameters.

  Closes [#&#8203;9815](https://github.com/pylint-dev/pylint/issues/9815)

- No longer flag undeprecated functions in `importlib.resources` as deprecated.

  Closes [#&#8203;10593](https://github.com/pylint-dev/pylint/issues/10593)

- Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions.

  Closes [#&#8203;10508](https://github.com/pylint-dev/pylint/issues/10508)

- Fix false positive `undefined-variable` (E0602) for for-loop variable shadowing patterns like `for item in item:` when the variable was previously defined.

  Closes [#&#8203;10562](https://github.com/pylint-dev/pylint/issues/10562)

## Other Bug Fixes

- Fixed crash in 'unnecessary-list-index-lookup' when starting an enumeration using
  minus the length of an iterable inside a dict comprehension when the len call was only
  made in this dict comprehension, and not elsewhere. Also changed the approach,
  to use inference in all cases but the simple ones, so we don't have to fix crashes
  one by one for arbitrarily complex expressions in enumerate.

  Closes [#&#8203;10510](https://github.com/pylint-dev/pylint/issues/10510)

### [`v3.3.8`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.8)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.7...v3.3.8)

## What's new in Pylint 3.3.8?

Release date: 2025-08-09

This patch release includes an exceptional fix for a false negative issue. For details, see: [#&#8203;10482 (comment)](https://github.com/pylint-dev/pylint/pull/10482#issuecomment-3164514082)

## False Positives Fixed

- Fix false positives for `possibly-used-before-assignment` when variables are exhaustively
  assigned within a `match` block.

  Closes [#&#8203;9668](https://github.com/pylint-dev/pylint/issues/9668)

- Fix false positive for `missing-raises-doc` and `missing-yield-doc` when the method length is less than docstring-min-length.

  Refs [#&#8203;10104](https://github.com/pylint-dev/pylint/issues/10104)

- Fix a false positive for `unused-variable` when multiple except handlers bind the same name under a try block.

  Closes [#&#8203;10426](https://github.com/pylint-dev/pylint/issues/10426)

## False Negatives Fixed

- Fix false-negative for `used-before-assignment` with `from __future__ import annotations` in function definitions.

  Refs [#&#8203;10482](https://github.com/pylint-dev/pylint/issues/10482)

## Other Bug Fixes

- Fix a bug in Pyreverse where aggregations and associations were included in diagrams regardless of the selected --filter-mode (such as PUB\_ONLY, ALL, etc.).

  Closes [#&#8203;10373](https://github.com/pylint-dev/pylint/issues/10373)

- Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output.

  Closes [#&#8203;10402](https://github.com/pylint-dev/pylint/issues/10402)

### [`v3.3.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.7)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.6...v3.3.7)

## What's new in Pylint 3.3.7?

Release date: 2025-05-04

## False Positives Fixed

- Comparisons between two calls to `type()` won't raise an `unidiomatic-typecheck` warning anymore, consistent with the behavior applied only for `==` previously.

  Closes [#&#8203;10161](https://github.com/pylint-dev/pylint/issues/10161)

## Other Bug Fixes

- Fixed a crash when importing a class decorator that did not exist with the same name as a class attribute after the class definition.

  Closes [#&#8203;10105](https://github.com/pylint-dev/pylint/issues/10105)

- Fix a crash caused by malformed format strings when using `.format` with keyword arguments.

  Closes [#&#8203;10282](https://github.com/pylint-dev/pylint/issues/10282)

- Using a slice as a class decorator now raises a `not-callable` message instead of crashing. A lot of checks that dealt with decorators (too many to list) are now shortcut if the decorator can't immediately be inferred to a function or class definition.

  Closes [#&#8203;10334](https://github.com/pylint-dev/pylint/issues/10334)

## Other Changes

- The algorithm used for `no-member` suggestions is now more efficient and cuts the
  calculation when the distance score is already above the threshold.

  Refs [#&#8203;10277](https://github.com/pylint-dev/pylint/issues/10277)

### [`v3.3.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.6)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.5...v3.3.6)

## What's new in Pylint 3.3.6?

Release date: 2025-03-20

## False Positives Fixed

- Fix a false positive for `used-before-assignment` when an inner function's return type
  annotation is a class defined at module scope.

  Closes [#&#8203;9391](https://github.com/pylint-dev/pylint/issues/9391)

### [`v3.3.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.5)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.4...v3.3.5)

## What's new in Pylint 3.3.5?

Release date: 2025-03-09

## False Positives Fixed

- Fix false positives for `use-implicit-booleaness-not-comparison`, `use-implicit-booleaness-not-comparison-to-string`
  and `use-implicit-booleaness-not-comparison-to-zero` when chained comparisons are checked.

  Closes [#&#8203;10065](https://github.com/pylint-dev/pylint/issues/10065)

- Fix a false positive for `invalid-getnewargs-ex-returned` when the tuple or dict has been assigned to a name.

  Closes [#&#8203;10208](https://github.com/pylint-dev/pylint/issues/10208)

- Remove `getopt` and `optparse` from the list of deprecated modules.

  Closes [#&#8203;10211](https://github.com/pylint-dev/pylint/issues/10211)

## Other Bug Fixes

- Fixed conditional import x.y causing false positive possibly-used-before-assignment.

  Closes [#&#8203;10081](https://github.com/pylint-dev/pylint/issues/10081)

- Fix a crash when something besides a class is found in an except handler.

  Closes [#&#8203;10106](https://github.com/pylint-dev/pylint/issues/10106)

- Fixed raising invalid-name when using camelCase for private methods with two leading underscores.

  Closes [#&#8203;10189](https://github.com/pylint-dev/pylint/issues/10189)

## Other Changes

- Upload release assets to PyPI via Trusted Publishing.

  Closes [#&#8203;10256](https://github.com/pylint-dev/pylint/issues/10256)

### [`v3.3.4`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.4)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.3...v3.3.4)

## Other Bug Fixes

- Fixes "skipped files" count calculation; the previous method was displaying an arbitrary number.

  Closes [#&#8203;10073](https://github.com/pylint-dev/pylint/issues/10073)

- Fixes a crash that occurred when pylint was run in a container on a host with cgroupsv2 and restrictions on CPU usage.

  Closes [#&#8203;10103](https://github.com/pylint-dev/pylint/issues/10103)

- Relaxed the requirements for isort so pylint can benefit from isort 6.

  Closes [#&#8203;10203](https://github.com/pylint-dev/pylint/issues/10203)

### [`v3.3.3`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.3)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.2...v3.3.3)

## What's new in Pylint 3.3.3?

Release date: 2024-12-23

## False Positives Fixed

- Fix false positives for `undefined-variable` for classes using Python 3.12
  generic type syntax.

  Closes [#&#8203;9335](https://github.com/pylint-dev/pylint/issues/9335)

- Fix a false positive for `use-implicit-booleaness-not-len`. No lint should be emitted for
  generators (`len` is not defined for generators).

  Refs [#&#8203;10100](https://github.com/pylint-dev/pylint/issues/10100)

## Other Bug Fixes

- Fix `Unable to import 'collections.abc' (import-error)` on Python 3.13.1.

  Closes [#&#8203;10112](https://github.com/pylint-dev/pylint/issues/10112)

### [`v3.3.2`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.2)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.1...v3.3.2)

## False Positives Fixed

- Fix a false positive for `potential-index-error` when an indexed iterable
  contains a starred element that evaluates to more than one item.

  Closes [#&#8203;10076](https://github.com/pylint-dev/pylint/issues/10076)

## Other Bug Fixes

- Fixes the issue with --source-root option not working when the source files are in a subdirectory of the source root (e.g. when using a /src layout).

  Closes [#&#8203;10026](https://github.com/pylint-dev/pylint/issues/10026)

### [`v3.3.1`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.1)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.0...v3.3.1)

## What's new in Pylint 3.3.1?

Release date: 2024-09-24

## False Positives Fixed

- Fix regression causing some f-strings to not be inferred as strings.

  Closes [#&#8203;9947](https://github.com/pylint-dev/pylint/issues/9947)

### [`v3.3.0`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.0)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.7...v3.3.0)

Release date: 2024-09-20

## Changes requiring user actions

- We migrated `symilar` to argparse, from getopt, so the error and help output changed
  (for the better). We exit with 2 instead of sometime 1, sometime 2. The error output
  is not captured by the runner anymore. It's not possible to use a value for the
  boolean options anymore (`--ignore-comments 1` should become `--ignore-comments`).

  Refs [#&#8203;9731](https://github.com/pylint-dev/pylint/issues/9731)

## New Features

- Add new `declare-non-slot` error which reports when a class has a `__slots__` member and a type hint on the class is not present in `__slots__`.

  Refs [#&#8203;9499](https://github.com/pylint-dev/pylint/issues/9499)

## New Checks

- Added `too-many-positional-arguments` to allow distinguishing the configuration for too many
  total arguments (with keyword-only params specified after `*`) from the configuration
  for too many positional-or-keyword or positional-only arguments.

  As part of evaluating whether this check makes sense for your project, ensure you
  adjust the value of `--max-positional-arguments`.

  Closes [#&#8203;9099](https://github.com/pylint-dev/pylint/issues/9099)

- Add `using-exception-groups-in-unsupported-version` and
  `using-generic-type-syntax-in-unsupported-version` for uses of Python 3.11+ or
  3.12+ features on lower supported versions provided with `--py-version`.

  Closes [#&#8203;9791](https://github.com/pylint-dev/pylint/issues/9791)

- Add `using-assignment-expression-in-unsupported-version` for uses of `:=` (walrus operator)
  on Python versions below 3.8 provided with `--py-version`.

  Closes [#&#8203;9820](https://github.com/pylint-dev/pylint/issues/9820)

- Add `using-positional-only-args-in-unsupported-version` for uses of positional-only args on
  Python versions below 3.8 provided with `--py-version`.

  Closes [#&#8203;9823](https://github.com/pylint-dev/pylint/issues/9823)

- Add `unnecessary-default-type-args` to the `typing` extension to detect the use
  of unnecessary default type args for `typing.Generator` and `typing.AsyncGenerator`.

  Refs [#&#8203;9938](https://github.com/pylint-dev/pylint/issues/9938)

## False Negatives Fixed

- Fix computation of never-returning function: `Never` is handled in addition to `NoReturn`, and priority is given to the explicit `--never-returning-functions` option.

  Closes [#&#8203;7565](https://github.com/pylint-dev/pylint/issues/7565).

- Fix a false negative for `await-outside-async` when await is inside Lambda.

  Refs [#&#8203;9653](https://github.com/pylint-dev/pylint/issues/9653)

- Fix a false negative for `duplicate-argument-name` by including `positional-only`, `*args` and `**kwargs` arguments in the check.

  Closes [#&#8203;9669](https://github.com/pylint-dev/pylint/issues/9669)

- Fix false negative for `multiple-statements` when multiple statements are present on `else` and `finally` lines of `try`.

  Refs [#&#8203;9759](https://github.com/pylint-dev/pylint/issues/9759)

- Fix false negatives when `isinstance` does not have exactly two arguments.
  pylint now emits a `too-many-function-args` or `no-value-for-parameter`
  appropriately for `isinstance` calls.

  Closes [#&#8203;9847](https://github.com/pylint-dev/pylint/issues/9847)

## Other Bug Fixes

- `--enable` with `--disable=all` now produces an error, when an unknown msg code is used. Internal `pylint` messages are no longer affected by `--disable=all`.

  Closes [#&#8203;9403](https://github.com/pylint-dev/pylint/issues/9403)

- Impossible to compile regexes for paths in the configuration or argument given to pylint won't crash anymore but
  raise an argparse error and display the error message from `re.compile` instead.

  Closes [#&#8203;9680](https://github.com/pylint-dev/pylint/issues/9680)

- Fix a bug where a `tox.ini` file with pylint configuration was ignored and it exists in the current directory.

  `.cfg` and `.ini` files containing a `Pylint` configuration may now use a section named `[pylint]`. This enhancement impacts the scenario where these file types are used as defaults when they are present and have not been explicitly referred to, using the `--rcfile` option.

  Closes [#&#8203;9727](https://github.com/pylint-dev/pylint/issues/9727)

- Improve file discovery for directories that are not python packages.

  Closes [#&#8203;9764](https://github.com/pylint-dev/pylint/issues/9764)

## Other Changes

- Remove support for launching pylint with Python 3.8.
  Code that supports Python 3.8 can still be linted with the `--py-version=3.8` setting.

  Refs [#&#8203;9774](https://github.com/pylint-dev/pylint/issues/9774)

- Add support for Python 3.13.

  Refs [#&#8203;9852](https://github.com/pylint-dev/pylint/issues/9852)

## Internal Changes

- All variables, classes, functions and file names containing the word 'similar', when it was,
  in fact, referring to 'symilar' (the standalone program for the duplicate-code check) were renamed
  to 'symilar'.

  Closes [#&#8203;9734](https://github.com/pylint-dev/pylint/issues/9734)

- Remove old-style classes (Python 2) code and remove check for new-style class since everything is new-style in Python 3. Updated doc for exception checker to remove reference to new style class.

  Refs [#&#8203;9925](https://github.com/pylint-dev/pylint/issues/9925)

### [`v3.2.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.7)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.6...v3.2.7)

## What's new in Pylint 3.2.7?

Release date: 2024-08-31

## False Positives Fixed

- Fixed a false positive `unreachable` for `NoReturn` coroutine functions.

  Closes [#&#8203;9840](https://github.com/pylint-dev/pylint/issues/9840)

## Other Bug Fixes

- Fix crash in refactoring checker when calling a lambda bound as a method.

  Closes [#&#8203;9865](https://github.com/pylint-dev/pylint/issues/9865)

- Fix a crash in `undefined-loop-variable` when providing the `iterable` argument to `enumerate()`.

  Closes [#&#8203;9875](https://github.com/pylint-dev/pylint/issues/9875)

- Fix to address indeterminacy of error message in case a module name is same as another in a separate namespace.

  Refs [#&#8203;9883](https://github.com/pylint-dev/pylint/issues/9883)

### [`v3.2.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.6)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.5...v3.2.6)

## What's new in Pylint 3.2.6?

Release date: 2024-07-21

## False Positives Fixed

- Quiet false positives for `unexpected-keyword-arg` when pylint cannot
  determine which of two or more dynamically defined classes is being instantiated.

  Closes [#&#8203;9672](https://github.com/pylint-dev/pylint/issues/9672)

- Fix a false positive for `missing-param-doc` where a method which is decorated with `typing.overload` was expected to have a docstring specifying its parameters.

  Closes [#&#8203;9739](https://github.com/pylint-dev/pylint/issues/9739)

- Fix a regression that raised `invalid-name` on class attributes merely
  overriding invalid names from an ancestor.

  Closes [#&#8203;9765](https://github.com/pylint-dev/pylint/issues/9765)

- Treat `assert_never()` the same way when imported from `typing_extensions`.

  Closes [#&#8203;9780](https://github.com/pylint-dev/pylint/issues/9780)

- Fix a false positive for `consider-using-min-max-builtin` when the assignment target is an attribute.

  Refs [#&#8203;9800](https://github.com/pylint-dev/pylint/issues/9800)

## Other Bug Fixes

- Fix an `AssertionError` arising from properties that return partial functions.

  Closes [#&#8203;9214](https://github.com/pylint-dev/pylint/issues/9214)

- Fix a crash when a subclass extends `__slots__`.

  Closes [#&#8203;9814](https://github.com/pylint-dev/pylint/issues/9814)

### [`v3.2.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.5)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.4...v3.2.5)

## What's new in Pylint 3.2.5 ?

Release date: 2024-06-28

## Other Bug Fixes

- Fixed a false positive `unreachable-code` when using `typing.Any` as return type in python
  3.8, the `typing.NoReturn` are not taken into account anymore for python 3.8 however.

  Closes [#&#8203;9751](https://github.com/pylint-dev/pylint/issues/9751)

</details>

<details>
<summary>fcfangcc/pylint-pydantic (pylint-pydantic)</summary>

### [`v0.4.1`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.4.1)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.4.0...v0.4.1)

fixed [#&#8203;41](https://github.com/fcfangcc/pylint-pydantic/issues/41)

### [`v0.4.0`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.4.0)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.5...v0.4.0)

1. Support pylint4
2. Remove support for python3.9

### [`v0.3.5`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.3.5)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.4...v0.3.5)

- updates setup to add 3.13
- updates workflow with 3.13
- updates logic of transform\_pydantic\_json to resolve
  contribution by [@&#8203;litsolac](https://github.com/litsolac)

### [`v0.3.4`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.3.4)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.3...v0.3.4)

fixed [#&#8203;35](https://github.com/fcfangcc/pylint-pydantic/issues/35)

### [`v0.3.3`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.3.3)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.2...v0.3.3)

Fixed
[#&#8203;33](https://github.com/fcfangcc/pylint-pydantic/issues/33)
[#&#8203;32](https://github.com/fcfangcc/pylint-pydantic/issues/32)

</details>

<details>
<summary>pytest-dev/pytest-asyncio (pytest-asyncio)</summary>

### [`v0.26.0`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.26.0): pytest-asyncio 0.26.0

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.3...v0.26.0)

- Adds configuration option that sets default event loop scope for all tests [#&#8203;793](https://github.com/pytest-dev/pytest-asyncio/issues/793)
- Improved type annotations for `pytest_asyncio.fixture` [#&#8203;1045](https://github.com/pytest-dev/pytest-asyncio/pull/1045)
- Added `typing-extensions` as additional dependency for Python `<3.10` [#&#8203;1045](https://github.com/pytest-dev/pytest-asyncio/pull/1045)

### [`v0.25.3`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.3): pytest-asyncio 0.25.3

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.2...v0.25.3)

- Avoid errors in cleanup of async generators when event loop is already closed [#&#8203;1040](https://github.com/pytest-dev/pytest-asyncio/issues/1040)

### [`v0.25.2`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.2): pytest-asyncio 0.25.2

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.1...v0.25.2)

- Call `loop.shutdown_asyncgens()` before closing the event loop to ensure async generators are closed in the same manner as `asyncio.run` does [#&#8203;1034](https://github.com/pytest-dev/pytest-asyncio/pull/1034)

### [`v0.25.1`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.1): pytest-asyncio 0.25.1

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.0...v0.25.1)

- Fixes an issue that caused a broken event loop when a function-scoped test was executed in between two tests with wider loop scope [#&#8203;950](https://github.com/pytest-dev/pytest-asyncio/issues/950)
- Improves test collection speed in auto mode [#&#8203;1020](https://github.com/pytest-dev/pytest-asyncio/pull/1020)
- Corrects the warning that is emitted upon redefining the event\_loop fixture

### [`v0.25.0`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.0): pytest-asyncio 0.25.0

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.24.0...v0.25.0)

### 0.25.0 (2024-12-13)

- Deprecated: Added warning when asyncio test requests async `@pytest.fixture` in strict mode. This will become an error in a future version of flake8-asyncio. [#&#8203;979](https://github.com/pytest-dev/pytest-asyncio/pull/979)
- Updates the error message about *pytest.mark.asyncio*'s *scope* keyword argument to say *loop\_scope* instead. [#&#8203;1004](https://github.com/pytest-dev/pytest-asyncio/pull/1004)
- Verbose log displays correct parameter name: asyncio\_default\_fixture\_loop\_scope [#&#8203;990](https://github.com/pytest-dev/pytest-asyncio/pull/990)
- Propagates *contextvars* set in async fixtures to other fixtures and tests on Python 3.11 and above. [#&#8203;1008](https://github.com/pytest-dev/pytest-asyncio/pull/1008)

### [`v0.24.0`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.24.0): pytest-asyncio 0.24.0

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.23.8...v0.24.0)

### 0.24.0 (2024-08-22)

- BREAKING: Updated minimum supported pytest version to v8.2.0
- Adds an optional *loop\_scope* keyword argument to *pytest.mark.asyncio*. This argument controls which event loop is used to run the marked async test. [#&#8203;706](https://github.com/pytest-dev/pytest-asyncio/issues/706), [#&#8203;871](https://github.com/pytest-dev/pytest-asyncio/pull/871)
- Deprecates the optional *scope* keyword argument to *pytest.mark.asyncio* for API consistency with `pytest_asyncio.fixture`. Users are encouraged to use the *loop\_scope* keyword argument, which does exactly the same.
- Raises an error when passing *scope* or *loop\_scope* as a positional argument to `@pytest.mark.asyncio`. [#&#8203;812](https://github.com/pytest-dev/pytest-asyncio/issues/812)
- Fixes a bug that caused module-scoped async fixtures to fail when reused in other modules [#&#8203;862](https://github.com/pytest-dev/pytest-asyncio/issues/862) [#&#8203;668](https://github.com/pytest-dev/pytest-asyncio/issues/668)

### [`v0.23.8`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.23.8): pytest-asyncio 0.23.8

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.23.7...v0.23.8)

### 0.23.8 (2024-07-17)

- Fixes a bug that caused duplicate markers in async tests [#&#8203;813](https://github.com/pytest-dev/pytest-asyncio/issues/813)

#### Known issues

As of v0.23, pytest-asyncio attaches an asyncio event loop to each item of the test suite (i.e. session, packages, modules, classes, functions) and allows tests to be run in those loops when marked accordingly. Pytest-asyncio currently assumes that async fixture scope is correlated with the new event loop scope. This prevents fixtures from being evaluated independently from the event loop scope and breaks some existing test suites (see [#&#8203;706](https://github.com/pytest-dev/pytest-asyncio/issues/706)). For example, a test suite may require all fixtures and tests to run in the same event loop, but have async fixtures that are set up and torn down for each module. If you're affected by this issue, please continue using the v0.21 release, until it is resolved.

</details>

<details>
<summary>celery/pytest-celery (pytest-celery)</summary>

### [`v1.2.1`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#121)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.2.0...v1.2.1)

\=====
:release-date: 30 July, 2025
:release-by: Tomer Nosrati

### [`v1.2.0`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#120)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.3...v1.2.0)

\=====
:release-date: 21 February, 2025
:release-by: Tomer Nosrati

### [`v1.1.3`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#113)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.2...v1.1.3)

\=====
:release-date: 20 September, 2024
:release-by: Tomer Nosrati

### [`v1.1.2`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#112)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.1...v1.1.2)

\=====
:release-date: 14 September, 2024
:release-by: Tomer Nosrati

### [`v1.1.1`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#111)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.0...v1.1.1)

\=====
:release-date: 12 August, 2024
:release-by: Tomer Nosrati

### [`v1.1.0`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#110)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.0.1...v1.1.0)

\=====
:release-date: 11 August, 2024
:release-by: Tomer Nosrati

### [`v1.0.1`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#101)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.0.0...v1.0.1)

\=====
:release-date: 17 July, 2024
:release-by: Tomer Nosrati

</details>

<details>
<summary>bloomberg/pytest-memray (pytest-memray)</summary>

### [`v1.8.0`](https://github.com/bloomberg/pytest-memray/releases/tag/v1.8.0)

[Compare Source](https://github.com/bloomberg/pytest-memray/compare/1.7.0...v1.8.0)

#### What's Changed

- Bump pypa/gh-action-pypi-publish from 1.9.0 to 1.10.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;124](https://github.com/bloomberg/pytest-memray/pull/124)
- Bump pypa/gh-action-pypi-publish from 1.10.0 to 1.10.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;125](https://github.com/bloomberg/pytest-memray/pull/125)
- Bump pypa/gh-action-pypi-publish from 1.10.1 to 1.10.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;127](https://github.com/bloomberg/pytest-memray/pull/127)
- Bump pypa/gh-action-pypi-publish from 1.10.2 to 1.11.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;129](https://github.com/bloomberg/pytest-memray/pull/129)
- Bump pypa/gh-action-pypi-publish from 1.11.0 to 1.12.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;139](https://github.com/bloomberg/pytest-memray/pull/139)
- Declare 3.14 support by [@&#8203;godlygeek](https://github.com/godlygeek) in [#&#8203;148](https://github.com/bloomberg/pytest-memray/pull/148)
- Bump actions/download-artifact from 4 to 5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;146](https://github.com/bloomberg/pytest-memray/pull/146)
- Bump actions/checkout from 4 to 5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;147](https://github.com/bloomberg/pytest-memray/pull/147)
- Release 1.8.0 by [@&#8203;pablogsal](https://github.com/pablogsal) in [#&#8203;149](https://github.com/bloomberg/pytest-memray/pull/149)

**Full Changelog**: <https://github.com/bloomberg/pytest-memray/compare/1.7.0...v1.8.0>

</details>

<details>
<summary>pytest-dev/pytest-mock (pytest-mock)</summary>

### [`v3.15.1`](https://github.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#3151)

[Compare Source](https://github.com/pytest-dev/pytest-mock/compare/v3.15.0...v3.15.1)

*2025-09-16*

- `#&#8203;529 <https://github.com/pytest-dev/pytest-mock/issues/529>`\_: Fixed `itertools._tee object has no attribute error` -- now `duplicate_iterators=True` must be passed to `mocker.spy` to duplicate iterators.

### [`v3.15.0`](https://github.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#3150)

[Compare Source](https://github.com/pytest-dev/pytest-mock/compare/v3.14.1...v3.15.0)

*2025-09-04*

- Python 3.8 (EOL) is no longer supported.
- `#&#8203;524 <https://github.com/pytest-dev/pytest-mock/pull/524>`\_: Added `spy_return_iter` to `mocker.spy`, which contains a duplicate of the return value of the spied method if it is an `Iterator`.

### [`v3.14.1`](https://github.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#3141-2025-05-26)

[Compare Source](https://github.com/pytest-dev/pytest-mock/compare/v3.14.0...v3.14.1)

- `#&#8203;503 <https://github.com/pytest-dev/pytest-mock/pull/503>`\_: Python 3.14 is now officially supported.

</details>

<details>
<summary>jbasko/pytest-random-order (pytest-random-order)</summary>

### [`v1.2.0`](https://github.com/jbasko/pytest-random-order/compare/v1.1.1...v1.2.0)

[Compare Source](https://github.com/jbasko/pytest-random-order/compare/v1.1.1...v1.2.0)

</details>

<details>
<summary>python-gitlab/python-gitlab (python-gitlab)</summary>

### [`v6.5.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v650-2025-10-17)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.4.0...v6.5.0)

##### Bug Fixes

- **semantic-release**: Enable CHANGELOG.md generation
  ([`fb9693b`](https://github.com/python-gitlab/python-gitlab/commit/fb9693bf1e6798149196e57fed87bf2588ad3b47))

##### Continuous Integration

- **stale**: Fix permission for stale action and allow manual run
  ([`9357a37`](https://github.com/python-gitlab/python-gitlab/commit/9357a374702dcc8049a6d8af636f48c736d3f160))

##### Documentation

- **pull\_mirror**: Fix incorrect start() method usage example
  ([`2acac19`](https://github.com/python-gitlab/python-gitlab/commit/2acac19356c8624def90c7e54237b256bceece18))

##### Features

- **api**: Add content\_ref and dry\_run\_ref parameters to ProjectCiLintManager
  ([`e8d2538`](https://github.com/python-gitlab/python-gitlab/commit/e8d2538cdf85a7c57babbc00074efbdab97548cd))

- **users**: Implement 'skip\_confirmation' in users 'emails' creation
  ([`2981730`](https://github.com/python-gitlab/python-gitlab/commit/298173017be387f26aa0828cae1e9a48e3cce328))

### [`v6.4.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v640-2025-09-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.3.0...v6.4.0)

##### Features

- **users**: Implement missing arguments in users 'list'
  ([`99923d4`](https://github.com/python-gitlab/python-gitlab/commit/99923d40dcb4f32f02bcbc5e8ef5ec4b77e3cb02))

- **users**: Sort 'user list' arguments against documentation
  ([`99923d4`](https://github.com/python-gitlab/python-gitlab/commit/99923d40dcb4f32f02bcbc5e8ef5ec4b77e3cb02))

### [`v6.3.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v630-2025-08-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.2.0...v6.3.0)

##### Features

- Add sync method to force remote mirror updates
  ([`f3c6678`](https://github.com/python-gitlab/python-gitlab/commit/f3c6678482b7ca35b1dd1e3bc49fc0c56cd03639))

- **api**: Add missing ProjectJob list filters
  ([`5fe0e71`](https://github.com/python-gitlab/python-gitlab/commit/5fe0e715448b00a666f76cdce6db321686f6a271))

- **api**: Add missing ProjectPackageManager list filters
  ([`b1696be`](https://github.com/python-gitlab/python-gitlab/commit/b1696be5fb223028755e303069e23e42a11cab42))

- **users**: Implement support for 'admins' in administrators 'list'
  ([`aaed51c`](https://github.com/python-gitlab/python-gitlab/commit/aaed51cdec65c8acabe8b9a39fd18c7e1e48519c))

### [`v6.2.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v620-2025-07-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.1.0...v6.2.0)

##### Build System

- **release**: Use correct python-semantic-release/publish-action
  ([`2f20634`](https://github.com/python-gitlab/python-gitlab/commit/2f20634b9700bc802177278ffdd7bdf83ef1605a))

##### Continuous Integration

- **stale**: Improve formatting of stale message
  ([`0ef20d1`](https://github.com/python-gitlab/python-gitlab/commit/0ef20d1b0ee6cd82c4e34003aca4c0c72935f4d9))

- **stale**: Increase `operations-per-run` to 500
  ([`326e1a4`](https://github.com/python-gitlab/python-gitlab/commit/326e1a46881467f41dc3de5f060ac654924fbe40))

##### Features

- **api**: Add ListMixin to ProjectIssueDiscussionNoteManager
  ([`f908f0e`](https://github.com/python-gitlab/python-gitlab/commit/f908f0e82840a5df374e8fbfb1298608d23f02bd))

- **api**: Add ListMixin to ProjectMergeRequestDiscussionNoteManager
  ([`865339a`](https://github.com/python-gitlab/python-gitlab/commit/865339ac037fb125280180b05a2c4e44067dc5e9))

### [`v6.1.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v610-2025-06-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.0.0...v6.1.0)

##### Chores

- Update to mypy 1.16.0 and resolve issues found
  ([`f734c58`](https://github.com/python-gitlab/python-gitlab/commit/f734c586e3fe5a0e866bcf60030107ca142fa763))

##### Documentation

- Update CONTRIBUTING.rst with policy on issue management
  ([`45dda50`](https://github.com/python-gitlab/python-gitlab/commit/45dda50ff4c0e01307480befa86498600563f818))

##### Features

- **api**: Add listing user contributed projects
  ([`98c1307`](https://github.com/python-gitlab/python-gitlab/commit/98c13074127ae46d85545498746d55c8b75aef48))

- **api**: Add support for project tag list filters
  ([`378a836`](https://github.com/python-gitlab/python-gitlab/commit/378a836bf5744ca6c9409dd60899e5d2f90b55be))

- **api**: Pipeline inputs support
  ([#&#8203;3194](https://github.com/python-gitlab/python-gitlab/pull/3194),
  [`306c4b1`](https://github.com/python-gitlab/python-gitlab/commit/306c4b1931e2b03d7cbcef5773668e876d5644b1))

- **const**: Add PLANNER\_ACCESS constant
  ([`ba6f174`](https://github.com/python-gitlab/python-gitlab/commit/ba6f174896f908ba711e1e3e8ebf4692c86bd3d4))

- **groups**: Add protectedbranches to group class
  ([#&#8203;3164](https://github.com/python-gitlab/python-gitlab/pull/3164),
  [`bfd31a8`](https://github.com/python-gitlab/python-gitlab/commit/bfd31a867547dffb2c2d54127e184fefa058cb30))

</details>

<details>
<summary>indygreg/python-zstandard (zstandard)</summary>

### [`v0.25.0`](https://github.com/indygreg/python-zstandard/releases/tag/0.25.0)

[Compare Source](https://github.com/indygreg/python-zstandard/compare/0.24.0...0.25.0)

- PyO3 Rust created upgraded from 0.24 to 0.25. ([#&#8203;273](https://github.com/indygreg/python-zstandard/issues/273))
- We now use `Py_REFCNT(obj)` instead of accessing `(*obj)->ob_refcnt` directly.
  This fixes a nogil / multi-threaded compile error. ([#&#8203;201](https://github.com/indygreg/python-zstandard/issues/201), [#&#8203;275](https://github.com/indygreg/python-zstandard/issues/275))
- A zstandard commit to fix qsort detection on BSD operating systems
  has been backported. ([#&#8203;272](https://github.com/indygreg/python-zstandard/issues/272))
- The `PYTHON_ZSTANDARD_IMPORT_POLICY` environment variable now has leading
  and trailing whitespace stripped. Values like ` cffi` and `cffi ` are
  now equivalent to `cffi`.
- The CI jobs for building wheels have been overhauled to always use
  `cibuildwheel` and `uv` (where possible). This change should be backwards
  compatible. But wheel building for this project has historically been
  fragile and there may be unwanted changes. We're optimistic that standardizing
  on uv (except for musllinux ppc64le and s390x where uv isn't available)
  will lead to more stability over time.
- CI now runs tests against the wheels we distribute. Previously, we ran
  tests against a separate build that was theoretically identical. But the
  builds may have been subtly different, leading to preventable bugs in our
  wheels. (Enabling this test coverage did not uncover any failures.)
- The `pyproject.toml` build backend has been switched from
  `setuptools.build_meta:__legacy__` to `setuptools.build_meta`.
- The setuptools build dependency has been upgraded from <69.0.0 to >=77.0.0.
  Modern versions of setuptools broke
  `--config-settings=--build-option=...` as part of implementing PEP 660.
  A workaround is to use `--config-settings=--global-option=...` instead.
  `--global-option` apparently is deprecated and the setuptools folks have yet
  to figure out how to thread config settings into `setup.py` invocations.
  (`--build-option` is sent to the `build_wheel` command but not the
  `build_editable` command.)
- Python 3.14 wheels are now built with `manylinux_2_28` (versus
  `manylinux2014`) for older Python versions. This may raise the minimum
  glibc version, effectively dropping support for Debian 8 and 9, Ubuntu
  13.10 through 18.04, Fedora 19 to 28, and RHEL/Centos 7. However, in
  practice most platforms don't container newer glibc symbols and are still
  ABI compatible with `manylinux2014` and glibc 2.17.
- We now require cffi >= 2.0.0b on Python 3.14. <3.14 still requires 1.17.
  ([#&#8203;274](https://github.com/indygreg/python-zstandard/issues/274))
- The cffi backend is now automatically disabled for free-threaded builds
  on Python <3.14, as cffi didn't implement free-threaded support until
  the 2.0 release. ([#&#8203;274](https://github.com/indygreg/python-zstandard/issues/274))
- Added CI coverage for free-threaded CPython 3.13 and 3.14. We do not yet
  formally support free-threaded builds. ([#&#8203;276](https://github.com/indygreg/python-zstandard/issues/276))
- The C and Rust backends now declare the GIL as unused.
- The `pythoncapi_compat.h` file has been upgraded to the latest version. ([#&#8203;278](https://github.com/indygreg/python-zstandard/issues/278))
- `setup.py` now depends on `packaging` and uses `packaging.version.Version`
  for version comparisons. This removes some deprecation warnings from usage of
  legacy distutils `Version` classes.
- Relax run-time libzstd version checking in C extension from exactly 1.5.7
  to >=1.5.6. ([#&#8203;254](https://github.com/indygreg/python-zstandard/issues/254), [#&#8203;267](https://github.com/indygreg/python-zstandard/issues/267))
- C extension types now (correctly) declare their fully qualified type names
  as `zstandard.backend_c.*` versus `zstd.*` before. The names have been
  subtly broken for years. We believe the only practical exposure to this change
  is via pickling (possibly encountered when using the `multiprocessing` or
  `concurrent.futures` packages), which would fail to pickle types like
  `ZstdError` before since the fully qualified type name referenced an
  incorrect and likely missing package (`zstd`). ([#&#8203;248](https://github.com/indygreg/python-zstandard/issues/248))

### [`v0.24.0`](https://github.com/indygreg/python-zstandard/releases/tag/0.24.0)

[Compare Source](https://github.com/indygreg/python-zstandard/compare/0.23.0...0.24.0)

### Backwards Compatibility Notes

- Support for Python 3.8 has been dropped because it reached end of life. Python 3.9 is the minimum supported Python version. The code should still be compatible with Python 3.8 and removing of version checks from `setup.py` will likely yield a working install. However, this is not officially supported.

### Changes

- Bundled zstd library upgraded from 1.5.6 to 1.5.7. ([#&#8203;255](https://github.com/indygreg/python-zstandard/issues/255))
- We now use and require cffi 1.17.0 or newer. Previously, the constraint was >=1.11.0 on Python <3.13.
- The `pyproject.toml` file now defines a `[project]` section.
- We now use GitHub's native ARM Linux runners to build wheels and run tests. Previously, Linux ARM wheels were built inside a QEMU virtualized environment and we didn't run tests on this platform.
- We now use GitHub's native ARM Windows runners to build wheels and run tests. Previously, Windows ARM wheels were cross compiled from an x86-64 runner and we never ran tests for the Windows ARM platform.
- We now `collections.abs.Buffer` on Python 3.12+ instead of `typing.ByteString`, as `typing.ByteString` was deprecated and later removed. ([#&#8203;238](https://github.co…
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 15, 2026
chore(deps): update root dev dependencies (minor) (minor)

This MR contains the following updates:

| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [deptry](https://github.com/fpgmaas/deptry) ([changelog](https://github.com/fpgmaas/deptry/blob/main/CHANGELOG.md)) | dev | minor | `^0.16.1` → `^0.24.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/fpgmaas/deptry/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fpgmaas/deptry) |
| [flake8](https://github.com/pycqa/flake8) ([changelog](https://flake8.pycqa.org/en/latest/release-notes/index.html)) | dev | minor | `7.1.0` → `7.3.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pycqa/flake8/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pycqa/flake8) |
| [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear#change-log) ([changelog](https://github.com/PyCQA/flake8-bugbear#change-log)) | dev | minor | `24.4.26` → `24.12.12` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PyCQA/flake8-bugbear/badge)](https://securityscorecards.dev/viewer/?uri=github.com/PyCQA/flake8-bugbear) |
| [mypy](https://github.com/python/mypy) ([changelog](https://mypy.readthedocs.io/en/latest/changelog.html)) | dev | minor | `1.10.1` → `1.19.1` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/python/mypy/badge)](https://securityscorecards.dev/viewer/?uri=github.com/python/mypy) |
| [pip-licenses](https://github.com/raimon49/pip-licenses) ([changelog](https://github.com/raimon49/pip-licenses/releases)) | dev | minor | `5.0.0` → `5.5.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/raimon49/pip-licenses/badge)](https://securityscorecards.dev/viewer/?uri=github.com/raimon49/pip-licenses) |
| [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | dev | minor | `3.2.4` → `3.3.9` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pylint-dev/pylint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pylint-dev/pylint) |
| [pylint-pydantic](https://github.com/fcfangcc/pylint-pydantic) | dev | minor | `^0.3.2` → `^0.4.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/fcfangcc/pylint-pydantic/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fcfangcc/pylint-pydantic) |
| [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) ([changelog](https://pytest-asyncio.readthedocs.io/en/latest/reference/changelog.html)) | test | minor | `^0.23.6` → `^0.26.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-asyncio/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-asyncio) |
| [pytest-celery](https://github.com/celery/pytest-celery) | test | minor | `1.0.0` → `1.2.1` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/celery/pytest-celery/badge)](https://securityscorecards.dev/viewer/?uri=github.com/celery/pytest-celery) |
| [pytest-memray](https://github.com/bloomberg/pytest-memray) | test | minor | `1.7.0` → `1.8.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/bloomberg/pytest-memray/badge)](https://securityscorecards.dev/viewer/?uri=github.com/bloomberg/pytest-memray) |
| [pytest-mock](https://github.com/pytest-dev/pytest-mock) ([changelog](https://pytest-mock.readthedocs.io/en/latest/changelog.html)) | test | minor | `3.14.0` → `3.15.1` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-mock/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-mock) |
| [pytest-random-order](https://github.com/jbasko/pytest-random-order) | test | minor | `1.1.1` → `1.2.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/jbasko/pytest-random-order/badge)](https://securityscorecards.dev/viewer/?uri=github.com/jbasko/pytest-random-order) |
| [python-gitlab](https://github.com/python-gitlab/python-gitlab) ([changelog](https://github.com/python-gitlab/python-gitlab/blob/main/CHANGELOG.md)) | dev | minor | `6.0.0` → `6.5.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/python-gitlab/python-gitlab/badge)](https://securityscorecards.dev/viewer/?uri=github.com/python-gitlab/python-gitlab) |
| [zstandard](https://github.com/indygreg/python-zstandard) | dev | minor | `^0.23.0` → `^0.25.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/indygreg/python-zstandard/badge)](https://securityscorecards.dev/viewer/?uri=github.com/indygreg/python-zstandard) |

---

### Release Notes

<details>
<summary>fpgmaas/deptry (deptry)</summary>

### [`v0.24.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0240---2025-11-09)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.23.1...0.24.0)

##### Breaking changes

##### Python 3.9 support dropped

Support for Python 3.9 has been dropped, as it has reached its end of life.

##### PyPy 3.10 support dropped, 3.11 added

Support for PyPy 3.10 has been dropped, since it is unsupported. We now only test against PyPy 3.11, and only publish wheels for this version.

##### Features

- Add GitHub Actions annotations reporter ([#&#8203;1059](https://github.com/fpgmaas/deptry/pull/1059))
- Add support for Python 3.14 ([#&#8203;1224](https://github.com/fpgmaas/deptry/pull/1224))
- Drop support for Python 3.9 ([#&#8203;1328](https://github.com/fpgmaas/deptry/pull/1328))
- Publish wheels for PyPy 3.11 and drop 3.10 ([#&#8203;1227](https://github.com/fpgmaas/deptry/pull/1227))

##### Full Changelog

### [`v0.23.1`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0231---2025-07-30)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.23.0...0.23.1)

##### Bug Fixes

- Improve handling of `TYPE_CHECKING` blocks by supporting `import typing as t` and checking `t.TYPE_CHECKING` ([#&#8203;1218](https://github.com/fpgmaas/deptry/pull/1218))
- Fix missing hyperlink in report output ([#&#8203;1162](https://github.com/fpgmaas/deptry/pull/1162))

##### Full Changelog

### [`v0.23.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0230---2025-01-25)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.22.0...0.23.0)

##### Features

- Correctly detect transitive dependencies with different module names ([#&#8203;1033](https://github.com/fpgmaas/deptry/pull/1033))

##### Full Changelog

### [`v0.22.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0220---2025-01-10)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.21.2...0.22.0)

Poetry 2.0 introduced support
for [defining project metadata in PEP 621](https://python-poetry.org/blog/announcing-poetry-2.0.0/). This is now
supported by *deptry*. [Documentation](https://deptry.com/supported-dependency-managers/#poetry) has been updated to
detail *deptry*'s behavior.

##### Features

- Support PEP 621 in Poetry 2.0+ ([#&#8203;1003](https://github.com/fpgmaas/deptry/pull/1003))

##### Full Changelog

### [`v0.21.2`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0212---2024-12-19)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.21.1...0.21.2)

##### Miscellaneous

- Provide wheels for musllinux ([#&#8203;979](https://github.com/fpgmaas/deptry/pull/979))

##### Full Changelog

### [`v0.21.1`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0211---2024-11-15)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.21.0...0.21.1)

##### Bug Fixes

- Handle string requirements files for `setuptools` dynamic
  dependencies ([#&#8203;945](https://github.com/fpgmaas/deptry/pull/945))

##### Full Changelog

### [`v0.21.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0210---2024-11-08)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.20.0...0.21.0)

##### Breaking changes

##### Ignore files handling

Unless [`--exclude`](https://deptry.com/usage/#exclude) is used, *deptry* excludes files found in common ignore
files (`.gitignore`, `.ignore`, `$HOME/.config/git/ignore`. ...), by using [`ignore`](https://crates.io/crates/ignore)
Rust crate. The default behaviour has been changed, so that now:

- git-related ignore rules (`.gitignore`, `$HOME/.config/git/ignore`, ...) are only used if *deptry* is run inside a git
  repository
- `.gitignore` files that are in parent directories of the git repository from where deptry is run are not
  used (previously, *deptry* would traverse parent directories up to the root system)

If you were using `.gitignore` files for non-git repositories, you might want to switch to `.ignore` files, or use
[`--extend-exclude`](https://deptry.com/usage/#extend-exclude).

##### Requirements files parsing

*deptry* now uses [`requirements-parser`](https://pypi.org/project/requirements-parser/) to parse dependencies from
requirements files, meaning that it can now extract nested requirements files referenced in other requirements files
without having to explicitly configure it in *deptry*.

For instance, if you have:

```python

# requirements.txt
-r cli-requirements.txt
httpx==0.27.2
```

```python

# cli-requirements.txt
click==8.1.7
```

With the default configuration, when parsing `requirements.txt`, both `httpx` and `click` will now be listed as
dependencies by *deptry*, while previously, only `httpx` was, unless *deptry* was instructed about
`cli-requirements.txt` by using [`--requirements-files`](https://deptry.com/usage/#requirements-files). This new
behaviour also impacts development requirements files, that can be overridden by
using [`--requirements-files-dev`](https://deptry.com/usage/#requirements-files-dev).

##### Python 3.8 support dropped

Support for Python 3.8 has been dropped, as it has reached its end of life.

##### Features

- *deptry* now detects development dependencies from `[dependency-groups]` section, introduced
  by [PEP 735](https://peps.python.org/pep-0735/) ([#&#8203;892](https://github.com/fpgmaas/deptry/pull/892))
- *deptry* now supports `setuptools` dynamic dependencies set in `[tool.setuptools.dynamic]` section,
  see <https://deptry.com/supported-dependency-managers/#setuptools> for more
  details ([#&#8203;894](https://github.com/fpgmaas/deptry/pull/894), [#&#8203;724](https://github.com/fpgmaas/deptry/pull/724))
- Drop support for Python 3.8 ([#&#8203;874](https://github.com/fpgmaas/deptry/pull/874))
- Improve ignore handling ([#&#8203;908](https://github.com/fpgmaas/deptry/pull/908))
- Parse requirements files with `requirements-parser`, adding support for parsing nested requirements
  files referenced with `-r <requirement_file>` ([#&#8203;913](https://github.com/fpgmaas/deptry/pull/913))

##### Full Changelog

### [`v0.20.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0200---2024-08-27)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.19.1...0.20.0)

##### Breaking changes

In release [0.15.0](https://github.com/fpgmaas/deptry/releases/tag/0.15.0), we announced the deprecation of the
following flags:

- `--requirements-txt` (and its `requirements_txt` setting counterpart in `pyproject.toml`)
- `--requirements-txt-dev` (and its `requirements_txt_dev` setting counterpart in `pyproject.toml`)

Those flags have now been removed. If you relied on them, you should now use, respectively:

- `--requirements-files` (and its `requirements_files` setting counterpart in `pyproject.toml`)
- `--requirements-files-dev` (and its `requirements_files_dev` setting counterpart in `pyproject.toml`)

##### Features

- deptry now detects [uv](https://github.com/astral-sh/uv) and reads development dependencies from
  `[uv.tool.dev-dependencies]` section ([#&#8203;816](https://github.com/fpgmaas/deptry/pull/816))
- Dynamically set max terminal width for better readability when displaying
  help ([#&#8203;817](https://github.com/fpgmaas/deptry/pull/817))
- Remove deprecated `--requirements-txt`/`--requirements-txt-dev`
  flags ([#&#8203;819](https://github.com/fpgmaas/deptry/pull/819))

##### Full Changelog

### [`v0.19.1`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0191---2024-08-10)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.19.0...0.19.1)

##### Features

- Add back PEP 420 support behind `--experimental-namespace-package` feature
  flag ([#&#8203;808](https://github.com/fpgmaas/deptry/pull/808))
- Add support for Python 3.13 ([#&#8203;713](https://github.com/fpgmaas/deptry/pull/713), [#&#8203;809](https://github.com/fpgmaas/deptry/pull/809))

##### Miscellaneous

- Provide Windows ARM64 wheels for Python ([#&#8203;807](https://github.com/fpgmaas/deptry/pull/807))

##### Full Changelog

### [`v0.19.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0190---2024-08-08)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.18.0...0.19.0)

This release reverts [#&#8203;753](https://github.com/fpgmaas/deptry/pull/753) that caused a noticeable performance regression on large
codebases. The intent of the initial MR was to support projects following PEP 420, so if your project currently relies
on this behaviour, feel free to manifest your interest in [#&#8203;740](https://github.com/fpgmaas/deptry/issues/740).

##### Bug Fixes

- Revert "fix(core): use `rglob` to guess local Python modules ([#&#8203;753](https://github.com/fpgmaas/deptry/issues/753))" ([#&#8203;798](https://github.com/fpgmaas/deptry/pull/798))

##### New Contributors

- [@&#8203;huisman](https://github.com/huisman) made their first contribution in [#&#8203;796](https://github.com/fpgmaas/deptry/pull/796)

##### Full Changelog

### [`v0.18.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0180---2024-07-31)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.17.0...0.18.0)

##### Features

- Support imports using `importlib.import_module` ([#&#8203;782](https://github.com/fpgmaas/deptry/pull/782))

##### New Contributors

- [@&#8203;lmmx](https://github.com/lmmx) made their first contribution in [#&#8203;782](https://github.com/fpgmaas/deptry/pull/782)

##### Full Changelog

### [`v0.17.0`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0170---2024-07-20)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.16.2...0.17.0)

##### Features

- Add a new rule `DEP005` to detect project dependencies that are in the standard library. ([#&#8203;761](https://github.com/fpgmaas/deptry/pull/761))

##### Full Changelog

### [`v0.16.2`](https://github.com/fpgmaas/deptry/blob/HEAD/CHANGELOG.md#0162---2024-07-05)

[Compare Source](https://github.com/fpgmaas/deptry/compare/0.16.1...0.16.2)

##### Bug Fixes

- Avoid crashing on PEP 621 and Poetry projects with no dependencies ([#&#8203;752](https://github.com/fpgmaas/deptry/pull/752))
- Recursively search for Python files to detect local modules, to better support namespace packages ([#&#8203;753](https://github.com/fpgmaas/deptry/pull/753))

##### Miscellaneous

- Provide macOS ARM wheels for PyPy ([#&#8203;691](https://github.com/fpgmaas/deptry/pull/691))

##### Full Changelog

</details>

<details>
<summary>pycqa/flake8 (flake8)</summary>

### [`v7.3.0`](https://github.com/pycqa/flake8/compare/7.2.0...7.3.0)

[Compare Source](https://github.com/pycqa/flake8/compare/7.2.0...7.3.0)

### [`v7.2.0`](https://github.com/pycqa/flake8/compare/7.1.2...7.2.0)

[Compare Source](https://github.com/pycqa/flake8/compare/7.1.2...7.2.0)

### [`v7.1.2`](https://github.com/pycqa/flake8/compare/7.1.1...7.1.2)

[Compare Source](https://github.com/pycqa/flake8/compare/7.1.1...7.1.2)

### [`v7.1.1`](https://github.com/pycqa/flake8/compare/7.1.0...7.1.1)

[Compare Source](https://github.com/pycqa/flake8/compare/7.1.0...7.1.1)

</details>

<details>
<summary>PyCQA/flake8-bugbear (flake8-bugbear)</summary>

### [`v24.12.12`](https://github.com/PyCQA/flake8-bugbear/releases/tag/24.12.12)

[Compare Source](https://github.com/PyCQA/flake8-bugbear/compare/24.10.31...24.12.12)

- B012 and B025 now also handle try/except\* ([#&#8203;500](https://github.com/PyCQA/flake8-bugbear/issues/500))
- Skip B028 if warnings.warn is called with `*args` or `**kwargs` ([#&#8203;501](https://github.com/PyCQA/flake8-bugbear/issues/501))
- Add B911: itertools.batched without strict= ([#&#8203;502](https://github.com/PyCQA/flake8-bugbear/issues/502))
- Readme has anchors per check (they do not seem to render on GitHub tho)

### [`v24.10.31`](https://github.com/PyCQA/flake8-bugbear/releases/tag/24.10.31)

[Compare Source](https://github.com/PyCQA/flake8-bugbear/compare/24.8.19...24.10.31)

- B041: New dictionary same key AND value check ([#&#8203;496](https://github.com/PyCQA/flake8-bugbear/issues/496))
- B037: Fix typo in error message
- B024: No longer treats assigned class variables as abstract ([#&#8203;471](https://github.com/PyCQA/flake8-bugbear/issues/471))
- Bump required attrs version to 22.2.0

### [`v24.8.19`](https://github.com/PyCQA/flake8-bugbear/releases/tag/24.8.19)

[Compare Source](https://github.com/PyCQA/flake8-bugbear/compare/24.4.26...24.8.19)

- B910: implement to suggest using Counter() instead of defaultdict(int) ([#&#8203;489](https://github.com/PyCQA/flake8-bugbear/issues/489))
- B901: Do not trigger with explicit Generator return type ([#&#8203;481](https://github.com/PyCQA/flake8-bugbear/issues/481))
- B008: add some comments, rename b008\_extend\_immutable\_calls ([#&#8203;476](https://github.com/PyCQA/flake8-bugbear/issues/476))
- B040: exception with note added not reraised or used ([#&#8203;477](https://github.com/PyCQA/flake8-bugbear/issues/477))
- B039, Add `ContextVar` with mutable literal or function call as default
- B040: Add Exception with added note not reraised. ([#&#8203;474](https://github.com/PyCQA/flake8-bugbear/issues/474))
- Run tests in Python 3.13
- Type annotated code ([#&#8203;481](https://github.com/PyCQA/flake8-bugbear/issues/481) + [#&#8203;483](https://github.com/PyCQA/flake8-bugbear/issues/483))
- Replace hash with unsafe\_hash ([#&#8203;486](https://github.com/PyCQA/flake8-bugbear/issues/486))

</details>

<details>
<summary>python/mypy (mypy)</summary>

### [`v1.19.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1191)

[Compare Source](https://github.com/python/mypy/compare/v1.19.0...v1.19.1)

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

### [`v1.19.0`](https://github.com/python/mypy/compare/v1.18.2...v1.19.0)

[Compare Source](https://github.com/python/mypy/compare/v1.18.2...v1.19.0)

### [`v1.18.2`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1182)

[Compare Source](https://github.com/python/mypy/compare/v1.18.1...v1.18.2)

- Fix crash on recursive alias (Ivan Levkivskyi, MR [19845](https://github.com/python/mypy/pull/19845))
- Add additional guidance for stubtest errors when runtime is `object.__init__` (Stephen Morton, MR [19733](https://github.com/python/mypy/pull/19733))
- Fix handling of None values in f-string expressions in mypyc (BobTheBuidler, MR [19846](https://github.com/python/mypy/pull/19846))

### [`v1.18.1`](https://github.com/python/mypy/compare/v1.17.1...v1.18.1)

[Compare Source](https://github.com/python/mypy/compare/v1.17.1...v1.18.1)

### [`v1.17.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1171)

[Compare Source](https://github.com/python/mypy/compare/v1.17.0...v1.17.1)

- Retain `None` as constraints bottom if no bottoms were provided (Stanislav Terliakov, MR [19485](https://github.com/python/mypy/pull/19485))
- Fix "ignored exception in `hasattr`" in dmypy (Stanislav Terliakov, MR [19428](https://github.com/python/mypy/pull/19428))
- Prevent a crash when InitVar is redefined with a method in a subclass (Stanislav Terliakov, MR [19453](https://github.com/python/mypy/pull/19453))

### [`v1.17.0`](https://github.com/python/mypy/compare/v1.16.1...v1.17.0)

[Compare Source](https://github.com/python/mypy/compare/v1.16.1...v1.17.0)

### [`v1.16.1`](https://github.com/python/mypy/compare/v1.16.0...v1.16.1)

[Compare Source](https://github.com/python/mypy/compare/v1.16.0...v1.16.1)

### [`v1.16.0`](https://github.com/python/mypy/compare/v1.15.0...v1.16.0)

[Compare Source](https://github.com/python/mypy/compare/v1.15.0...v1.16.0)

### [`v1.15.0`](https://github.com/python/mypy/compare/v1.14.1...v1.15.0)

[Compare Source](https://github.com/python/mypy/compare/v1.14.1...v1.15.0)

### [`v1.14.1`](https://github.com/python/mypy/compare/v1.14.0...v1.14.1)

[Compare Source](https://github.com/python/mypy/compare/v1.14.0...v1.14.1)

### [`v1.14.0`](https://github.com/python/mypy/compare/v1.13.0...v1.14.0)

[Compare Source](https://github.com/python/mypy/compare/v1.13.0...v1.14.0)

### [`v1.13.0`](https://github.com/python/mypy/compare/v1.12.1...v1.13.0)

[Compare Source](https://github.com/python/mypy/compare/v1.12.1...v1.13.0)

### [`v1.12.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1121)

[Compare Source](https://github.com/python/mypy/compare/v1.12.0...v1.12.1)

- Fix crash when showing partially analyzed type in error message (Ivan Levkivskyi, MR [17961](https://github.com/python/mypy/pull/17961))
- Fix iteration over union (when self type is involved) (Shantanu, MR [17976](https://github.com/python/mypy/pull/17976))
- Fix type object with type var default in union context (Jukka Lehtosalo, MR [17991](https://github.com/python/mypy/pull/17991))
- Revert change to `os.path` stubs affecting use of `os.PathLike[Any]` (Shantanu, MR [17995](https://github.com/python/mypy/pull/17995))

### [`v1.12.0`](https://github.com/python/mypy/compare/v1.11.2...v1.12.0)

[Compare Source](https://github.com/python/mypy/compare/v1.11.2...v1.12.0)

### [`v1.11.2`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1112)

[Compare Source](https://github.com/python/mypy/compare/v1.11.1...v1.11.2)

- Alternative fix for a union-like literal string (Ivan Levkivskyi, MR [17639](https://github.com/python/mypy/pull/17639))
- Unwrap `TypedDict` item types before storing (Ivan Levkivskyi, MR [17640](https://github.com/python/mypy/pull/17640))

### [`v1.11.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-1111)

[Compare Source](https://github.com/python/mypy/compare/v1.11.0...v1.11.1)

- Fix `RawExpressionType.accept` crash with `--cache-fine-grained` (Anders Kaseorg, MR [17588](https://github.com/python/mypy/pull/17588))
- Fix PEP 604 isinstance caching (Shantanu, MR [17563](https://github.com/python/mypy/pull/17563))
- Fix `typing.TypeAliasType` being undefined on python < 3.12 (Nikita Sobolev, MR [17558](https://github.com/python/mypy/pull/17558))
- Fix `types.GenericAlias` lookup crash (Shantanu, MR [17543](https://github.com/python/mypy/pull/17543))

### [`v1.11.0`](https://github.com/python/mypy/compare/v1.10.1...v1.11.0)

[Compare Source](https://github.com/python/mypy/compare/v1.10.1...v1.11.0)

</details>

<details>
<summary>raimon49/pip-licenses (pip-licenses)</summary>

### [`v5.5.0`](https://github.com/raimon49/pip-licenses/blob/HEAD/CHANGELOG.md#550)

- Replace dependency on `tomli` with builtin `tomllib` for Python 3.11
- Added support for `License-Expression` metadata field, see [PEP 639](https://peps.python.org/pep-0639/)
- Added `--from=expression` option
- Breaking change: The `--from=all` output now includes the `License-Expression` value
- Fixed KeyError with `--partial` and `--allow-only` if a license matches multiple allowed licenses.
- Declare support for Python 3.13 and 3.14
- Added RST/Sphinx workflow example for `--with-license-file` option in documentation

</details>

<details>
<summary>pylint-dev/pylint (pylint)</summary>

### [`v3.3.9`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.9)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.8...v3.3.9)

## What's new in Pylint 3.3.9?

Release date: 2025-10-05

## False Positives Fixed

- Fix used-before-assignment for PEP 695 type aliases and parameters.

  Closes [#&#8203;9815](https://github.com/pylint-dev/pylint/issues/9815)

- No longer flag undeprecated functions in `importlib.resources` as deprecated.

  Closes [#&#8203;10593](https://github.com/pylint-dev/pylint/issues/10593)

- Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions.

  Closes [#&#8203;10508](https://github.com/pylint-dev/pylint/issues/10508)

- Fix false positive `undefined-variable` (E0602) for for-loop variable shadowing patterns like `for item in item:` when the variable was previously defined.

  Closes [#&#8203;10562](https://github.com/pylint-dev/pylint/issues/10562)

## Other Bug Fixes

- Fixed crash in 'unnecessary-list-index-lookup' when starting an enumeration using
  minus the length of an iterable inside a dict comprehension when the len call was only
  made in this dict comprehension, and not elsewhere. Also changed the approach,
  to use inference in all cases but the simple ones, so we don't have to fix crashes
  one by one for arbitrarily complex expressions in enumerate.

  Closes [#&#8203;10510](https://github.com/pylint-dev/pylint/issues/10510)

### [`v3.3.8`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.8)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.7...v3.3.8)

## What's new in Pylint 3.3.8?

Release date: 2025-08-09

This patch release includes an exceptional fix for a false negative issue. For details, see: [#&#8203;10482 (comment)](https://github.com/pylint-dev/pylint/pull/10482#issuecomment-3164514082)

## False Positives Fixed

- Fix false positives for `possibly-used-before-assignment` when variables are exhaustively
  assigned within a `match` block.

  Closes [#&#8203;9668](https://github.com/pylint-dev/pylint/issues/9668)

- Fix false positive for `missing-raises-doc` and `missing-yield-doc` when the method length is less than docstring-min-length.

  Refs [#&#8203;10104](https://github.com/pylint-dev/pylint/issues/10104)

- Fix a false positive for `unused-variable` when multiple except handlers bind the same name under a try block.

  Closes [#&#8203;10426](https://github.com/pylint-dev/pylint/issues/10426)

## False Negatives Fixed

- Fix false-negative for `used-before-assignment` with `from __future__ import annotations` in function definitions.

  Refs [#&#8203;10482](https://github.com/pylint-dev/pylint/issues/10482)

## Other Bug Fixes

- Fix a bug in Pyreverse where aggregations and associations were included in diagrams regardless of the selected --filter-mode (such as PUB\_ONLY, ALL, etc.).

  Closes [#&#8203;10373](https://github.com/pylint-dev/pylint/issues/10373)

- Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output.

  Closes [#&#8203;10402](https://github.com/pylint-dev/pylint/issues/10402)

### [`v3.3.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.7)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.6...v3.3.7)

## What's new in Pylint 3.3.7?

Release date: 2025-05-04

## False Positives Fixed

- Comparisons between two calls to `type()` won't raise an `unidiomatic-typecheck` warning anymore, consistent with the behavior applied only for `==` previously.

  Closes [#&#8203;10161](https://github.com/pylint-dev/pylint/issues/10161)

## Other Bug Fixes

- Fixed a crash when importing a class decorator that did not exist with the same name as a class attribute after the class definition.

  Closes [#&#8203;10105](https://github.com/pylint-dev/pylint/issues/10105)

- Fix a crash caused by malformed format strings when using `.format` with keyword arguments.

  Closes [#&#8203;10282](https://github.com/pylint-dev/pylint/issues/10282)

- Using a slice as a class decorator now raises a `not-callable` message instead of crashing. A lot of checks that dealt with decorators (too many to list) are now shortcut if the decorator can't immediately be inferred to a function or class definition.

  Closes [#&#8203;10334](https://github.com/pylint-dev/pylint/issues/10334)

## Other Changes

- The algorithm used for `no-member` suggestions is now more efficient and cuts the
  calculation when the distance score is already above the threshold.

  Refs [#&#8203;10277](https://github.com/pylint-dev/pylint/issues/10277)

### [`v3.3.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.6)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.5...v3.3.6)

## What's new in Pylint 3.3.6?

Release date: 2025-03-20

## False Positives Fixed

- Fix a false positive for `used-before-assignment` when an inner function's return type
  annotation is a class defined at module scope.

  Closes [#&#8203;9391](https://github.com/pylint-dev/pylint/issues/9391)

### [`v3.3.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.5)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.4...v3.3.5)

## What's new in Pylint 3.3.5?

Release date: 2025-03-09

## False Positives Fixed

- Fix false positives for `use-implicit-booleaness-not-comparison`, `use-implicit-booleaness-not-comparison-to-string`
  and `use-implicit-booleaness-not-comparison-to-zero` when chained comparisons are checked.

  Closes [#&#8203;10065](https://github.com/pylint-dev/pylint/issues/10065)

- Fix a false positive for `invalid-getnewargs-ex-returned` when the tuple or dict has been assigned to a name.

  Closes [#&#8203;10208](https://github.com/pylint-dev/pylint/issues/10208)

- Remove `getopt` and `optparse` from the list of deprecated modules.

  Closes [#&#8203;10211](https://github.com/pylint-dev/pylint/issues/10211)

## Other Bug Fixes

- Fixed conditional import x.y causing false positive possibly-used-before-assignment.

  Closes [#&#8203;10081](https://github.com/pylint-dev/pylint/issues/10081)

- Fix a crash when something besides a class is found in an except handler.

  Closes [#&#8203;10106](https://github.com/pylint-dev/pylint/issues/10106)

- Fixed raising invalid-name when using camelCase for private methods with two leading underscores.

  Closes [#&#8203;10189](https://github.com/pylint-dev/pylint/issues/10189)

## Other Changes

- Upload release assets to PyPI via Trusted Publishing.

  Closes [#&#8203;10256](https://github.com/pylint-dev/pylint/issues/10256)

### [`v3.3.4`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.4)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.3...v3.3.4)

## Other Bug Fixes

- Fixes "skipped files" count calculation; the previous method was displaying an arbitrary number.

  Closes [#&#8203;10073](https://github.com/pylint-dev/pylint/issues/10073)

- Fixes a crash that occurred when pylint was run in a container on a host with cgroupsv2 and restrictions on CPU usage.

  Closes [#&#8203;10103](https://github.com/pylint-dev/pylint/issues/10103)

- Relaxed the requirements for isort so pylint can benefit from isort 6.

  Closes [#&#8203;10203](https://github.com/pylint-dev/pylint/issues/10203)

### [`v3.3.3`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.3)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.2...v3.3.3)

## What's new in Pylint 3.3.3?

Release date: 2024-12-23

## False Positives Fixed

- Fix false positives for `undefined-variable` for classes using Python 3.12
  generic type syntax.

  Closes [#&#8203;9335](https://github.com/pylint-dev/pylint/issues/9335)

- Fix a false positive for `use-implicit-booleaness-not-len`. No lint should be emitted for
  generators (`len` is not defined for generators).

  Refs [#&#8203;10100](https://github.com/pylint-dev/pylint/issues/10100)

## Other Bug Fixes

- Fix `Unable to import 'collections.abc' (import-error)` on Python 3.13.1.

  Closes [#&#8203;10112](https://github.com/pylint-dev/pylint/issues/10112)

### [`v3.3.2`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.2)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.1...v3.3.2)

## False Positives Fixed

- Fix a false positive for `potential-index-error` when an indexed iterable
  contains a starred element that evaluates to more than one item.

  Closes [#&#8203;10076](https://github.com/pylint-dev/pylint/issues/10076)

## Other Bug Fixes

- Fixes the issue with --source-root option not working when the source files are in a subdirectory of the source root (e.g. when using a /src layout).

  Closes [#&#8203;10026](https://github.com/pylint-dev/pylint/issues/10026)

### [`v3.3.1`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.1)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.0...v3.3.1)

## What's new in Pylint 3.3.1?

Release date: 2024-09-24

## False Positives Fixed

- Fix regression causing some f-strings to not be inferred as strings.

  Closes [#&#8203;9947](https://github.com/pylint-dev/pylint/issues/9947)

### [`v3.3.0`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.0)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.7...v3.3.0)

Release date: 2024-09-20

## Changes requiring user actions

- We migrated `symilar` to argparse, from getopt, so the error and help output changed
  (for the better). We exit with 2 instead of sometime 1, sometime 2. The error output
  is not captured by the runner anymore. It's not possible to use a value for the
  boolean options anymore (`--ignore-comments 1` should become `--ignore-comments`).

  Refs [#&#8203;9731](https://github.com/pylint-dev/pylint/issues/9731)

## New Features

- Add new `declare-non-slot` error which reports when a class has a `__slots__` member and a type hint on the class is not present in `__slots__`.

  Refs [#&#8203;9499](https://github.com/pylint-dev/pylint/issues/9499)

## New Checks

- Added `too-many-positional-arguments` to allow distinguishing the configuration for too many
  total arguments (with keyword-only params specified after `*`) from the configuration
  for too many positional-or-keyword or positional-only arguments.

  As part of evaluating whether this check makes sense for your project, ensure you
  adjust the value of `--max-positional-arguments`.

  Closes [#&#8203;9099](https://github.com/pylint-dev/pylint/issues/9099)

- Add `using-exception-groups-in-unsupported-version` and
  `using-generic-type-syntax-in-unsupported-version` for uses of Python 3.11+ or
  3.12+ features on lower supported versions provided with `--py-version`.

  Closes [#&#8203;9791](https://github.com/pylint-dev/pylint/issues/9791)

- Add `using-assignment-expression-in-unsupported-version` for uses of `:=` (walrus operator)
  on Python versions below 3.8 provided with `--py-version`.

  Closes [#&#8203;9820](https://github.com/pylint-dev/pylint/issues/9820)

- Add `using-positional-only-args-in-unsupported-version` for uses of positional-only args on
  Python versions below 3.8 provided with `--py-version`.

  Closes [#&#8203;9823](https://github.com/pylint-dev/pylint/issues/9823)

- Add `unnecessary-default-type-args` to the `typing` extension to detect the use
  of unnecessary default type args for `typing.Generator` and `typing.AsyncGenerator`.

  Refs [#&#8203;9938](https://github.com/pylint-dev/pylint/issues/9938)

## False Negatives Fixed

- Fix computation of never-returning function: `Never` is handled in addition to `NoReturn`, and priority is given to the explicit `--never-returning-functions` option.

  Closes [#&#8203;7565](https://github.com/pylint-dev/pylint/issues/7565).

- Fix a false negative for `await-outside-async` when await is inside Lambda.

  Refs [#&#8203;9653](https://github.com/pylint-dev/pylint/issues/9653)

- Fix a false negative for `duplicate-argument-name` by including `positional-only`, `*args` and `**kwargs` arguments in the check.

  Closes [#&#8203;9669](https://github.com/pylint-dev/pylint/issues/9669)

- Fix false negative for `multiple-statements` when multiple statements are present on `else` and `finally` lines of `try`.

  Refs [#&#8203;9759](https://github.com/pylint-dev/pylint/issues/9759)

- Fix false negatives when `isinstance` does not have exactly two arguments.
  pylint now emits a `too-many-function-args` or `no-value-for-parameter`
  appropriately for `isinstance` calls.

  Closes [#&#8203;9847](https://github.com/pylint-dev/pylint/issues/9847)

## Other Bug Fixes

- `--enable` with `--disable=all` now produces an error, when an unknown msg code is used. Internal `pylint` messages are no longer affected by `--disable=all`.

  Closes [#&#8203;9403](https://github.com/pylint-dev/pylint/issues/9403)

- Impossible to compile regexes for paths in the configuration or argument given to pylint won't crash anymore but
  raise an argparse error and display the error message from `re.compile` instead.

  Closes [#&#8203;9680](https://github.com/pylint-dev/pylint/issues/9680)

- Fix a bug where a `tox.ini` file with pylint configuration was ignored and it exists in the current directory.

  `.cfg` and `.ini` files containing a `Pylint` configuration may now use a section named `[pylint]`. This enhancement impacts the scenario where these file types are used as defaults when they are present and have not been explicitly referred to, using the `--rcfile` option.

  Closes [#&#8203;9727](https://github.com/pylint-dev/pylint/issues/9727)

- Improve file discovery for directories that are not python packages.

  Closes [#&#8203;9764](https://github.com/pylint-dev/pylint/issues/9764)

## Other Changes

- Remove support for launching pylint with Python 3.8.
  Code that supports Python 3.8 can still be linted with the `--py-version=3.8` setting.

  Refs [#&#8203;9774](https://github.com/pylint-dev/pylint/issues/9774)

- Add support for Python 3.13.

  Refs [#&#8203;9852](https://github.com/pylint-dev/pylint/issues/9852)

## Internal Changes

- All variables, classes, functions and file names containing the word 'similar', when it was,
  in fact, referring to 'symilar' (the standalone program for the duplicate-code check) were renamed
  to 'symilar'.

  Closes [#&#8203;9734](https://github.com/pylint-dev/pylint/issues/9734)

- Remove old-style classes (Python 2) code and remove check for new-style class since everything is new-style in Python 3. Updated doc for exception checker to remove reference to new style class.

  Refs [#&#8203;9925](https://github.com/pylint-dev/pylint/issues/9925)

### [`v3.2.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.7)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.6...v3.2.7)

## What's new in Pylint 3.2.7?

Release date: 2024-08-31

## False Positives Fixed

- Fixed a false positive `unreachable` for `NoReturn` coroutine functions.

  Closes [#&#8203;9840](https://github.com/pylint-dev/pylint/issues/9840)

## Other Bug Fixes

- Fix crash in refactoring checker when calling a lambda bound as a method.

  Closes [#&#8203;9865](https://github.com/pylint-dev/pylint/issues/9865)

- Fix a crash in `undefined-loop-variable` when providing the `iterable` argument to `enumerate()`.

  Closes [#&#8203;9875](https://github.com/pylint-dev/pylint/issues/9875)

- Fix to address indeterminacy of error message in case a module name is same as another in a separate namespace.

  Refs [#&#8203;9883](https://github.com/pylint-dev/pylint/issues/9883)

### [`v3.2.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.6)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.5...v3.2.6)

## What's new in Pylint 3.2.6?

Release date: 2024-07-21

## False Positives Fixed

- Quiet false positives for `unexpected-keyword-arg` when pylint cannot
  determine which of two or more dynamically defined classes is being instantiated.

  Closes [#&#8203;9672](https://github.com/pylint-dev/pylint/issues/9672)

- Fix a false positive for `missing-param-doc` where a method which is decorated with `typing.overload` was expected to have a docstring specifying its parameters.

  Closes [#&#8203;9739](https://github.com/pylint-dev/pylint/issues/9739)

- Fix a regression that raised `invalid-name` on class attributes merely
  overriding invalid names from an ancestor.

  Closes [#&#8203;9765](https://github.com/pylint-dev/pylint/issues/9765)

- Treat `assert_never()` the same way when imported from `typing_extensions`.

  Closes [#&#8203;9780](https://github.com/pylint-dev/pylint/issues/9780)

- Fix a false positive for `consider-using-min-max-builtin` when the assignment target is an attribute.

  Refs [#&#8203;9800](https://github.com/pylint-dev/pylint/issues/9800)

## Other Bug Fixes

- Fix an `AssertionError` arising from properties that return partial functions.

  Closes [#&#8203;9214](https://github.com/pylint-dev/pylint/issues/9214)

- Fix a crash when a subclass extends `__slots__`.

  Closes [#&#8203;9814](https://github.com/pylint-dev/pylint/issues/9814)

### [`v3.2.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.5)

[Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.4...v3.2.5)

## What's new in Pylint 3.2.5 ?

Release date: 2024-06-28

## Other Bug Fixes

- Fixed a false positive `unreachable-code` when using `typing.Any` as return type in python
  3.8, the `typing.NoReturn` are not taken into account anymore for python 3.8 however.

  Closes [#&#8203;9751](https://github.com/pylint-dev/pylint/issues/9751)

</details>

<details>
<summary>fcfangcc/pylint-pydantic (pylint-pydantic)</summary>

### [`v0.4.1`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.4.1)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.4.0...v0.4.1)

fixed [#&#8203;41](https://github.com/fcfangcc/pylint-pydantic/issues/41)

### [`v0.4.0`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.4.0)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.5...v0.4.0)

1. Support pylint4
2. Remove support for python3.9

### [`v0.3.5`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.3.5)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.4...v0.3.5)

- updates setup to add 3.13
- updates workflow with 3.13
- updates logic of transform\_pydantic\_json to resolve
  contribution by [@&#8203;litsolac](https://github.com/litsolac)

### [`v0.3.4`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.3.4)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.3...v0.3.4)

fixed [#&#8203;35](https://github.com/fcfangcc/pylint-pydantic/issues/35)

### [`v0.3.3`](https://github.com/fcfangcc/pylint-pydantic/releases/tag/v0.3.3)

[Compare Source](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.2...v0.3.3)

Fixed
[#&#8203;33](https://github.com/fcfangcc/pylint-pydantic/issues/33)
[#&#8203;32](https://github.com/fcfangcc/pylint-pydantic/issues/32)

</details>

<details>
<summary>pytest-dev/pytest-asyncio (pytest-asyncio)</summary>

### [`v0.26.0`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.26.0): pytest-asyncio 0.26.0

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.3...v0.26.0)

- Adds configuration option that sets default event loop scope for all tests [#&#8203;793](https://github.com/pytest-dev/pytest-asyncio/issues/793)
- Improved type annotations for `pytest_asyncio.fixture` [#&#8203;1045](https://github.com/pytest-dev/pytest-asyncio/pull/1045)
- Added `typing-extensions` as additional dependency for Python `<3.10` [#&#8203;1045](https://github.com/pytest-dev/pytest-asyncio/pull/1045)

### [`v0.25.3`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.3): pytest-asyncio 0.25.3

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.2...v0.25.3)

- Avoid errors in cleanup of async generators when event loop is already closed [#&#8203;1040](https://github.com/pytest-dev/pytest-asyncio/issues/1040)

### [`v0.25.2`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.2): pytest-asyncio 0.25.2

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.1...v0.25.2)

- Call `loop.shutdown_asyncgens()` before closing the event loop to ensure async generators are closed in the same manner as `asyncio.run` does [#&#8203;1034](https://github.com/pytest-dev/pytest-asyncio/pull/1034)

### [`v0.25.1`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.1): pytest-asyncio 0.25.1

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.0...v0.25.1)

- Fixes an issue that caused a broken event loop when a function-scoped test was executed in between two tests with wider loop scope [#&#8203;950](https://github.com/pytest-dev/pytest-asyncio/issues/950)
- Improves test collection speed in auto mode [#&#8203;1020](https://github.com/pytest-dev/pytest-asyncio/pull/1020)
- Corrects the warning that is emitted upon redefining the event\_loop fixture

### [`v0.25.0`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.25.0): pytest-asyncio 0.25.0

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.24.0...v0.25.0)

### 0.25.0 (2024-12-13)

- Deprecated: Added warning when asyncio test requests async `@pytest.fixture` in strict mode. This will become an error in a future version of flake8-asyncio. [#&#8203;979](https://github.com/pytest-dev/pytest-asyncio/pull/979)
- Updates the error message about *pytest.mark.asyncio*'s *scope* keyword argument to say *loop\_scope* instead. [#&#8203;1004](https://github.com/pytest-dev/pytest-asyncio/pull/1004)
- Verbose log displays correct parameter name: asyncio\_default\_fixture\_loop\_scope [#&#8203;990](https://github.com/pytest-dev/pytest-asyncio/pull/990)
- Propagates *contextvars* set in async fixtures to other fixtures and tests on Python 3.11 and above. [#&#8203;1008](https://github.com/pytest-dev/pytest-asyncio/pull/1008)

### [`v0.24.0`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.24.0): pytest-asyncio 0.24.0

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.23.8...v0.24.0)

### 0.24.0 (2024-08-22)

- BREAKING: Updated minimum supported pytest version to v8.2.0
- Adds an optional *loop\_scope* keyword argument to *pytest.mark.asyncio*. This argument controls which event loop is used to run the marked async test. [#&#8203;706](https://github.com/pytest-dev/pytest-asyncio/issues/706), [#&#8203;871](https://github.com/pytest-dev/pytest-asyncio/pull/871)
- Deprecates the optional *scope* keyword argument to *pytest.mark.asyncio* for API consistency with `pytest_asyncio.fixture`. Users are encouraged to use the *loop\_scope* keyword argument, which does exactly the same.
- Raises an error when passing *scope* or *loop\_scope* as a positional argument to `@pytest.mark.asyncio`. [#&#8203;812](https://github.com/pytest-dev/pytest-asyncio/issues/812)
- Fixes a bug that caused module-scoped async fixtures to fail when reused in other modules [#&#8203;862](https://github.com/pytest-dev/pytest-asyncio/issues/862) [#&#8203;668](https://github.com/pytest-dev/pytest-asyncio/issues/668)

### [`v0.23.8`](https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.23.8): pytest-asyncio 0.23.8

[Compare Source](https://github.com/pytest-dev/pytest-asyncio/compare/v0.23.7...v0.23.8)

### 0.23.8 (2024-07-17)

- Fixes a bug that caused duplicate markers in async tests [#&#8203;813](https://github.com/pytest-dev/pytest-asyncio/issues/813)

#### Known issues

As of v0.23, pytest-asyncio attaches an asyncio event loop to each item of the test suite (i.e. session, packages, modules, classes, functions) and allows tests to be run in those loops when marked accordingly. Pytest-asyncio currently assumes that async fixture scope is correlated with the new event loop scope. This prevents fixtures from being evaluated independently from the event loop scope and breaks some existing test suites (see [#&#8203;706](https://github.com/pytest-dev/pytest-asyncio/issues/706)). For example, a test suite may require all fixtures and tests to run in the same event loop, but have async fixtures that are set up and torn down for each module. If you're affected by this issue, please continue using the v0.21 release, until it is resolved.

</details>

<details>
<summary>celery/pytest-celery (pytest-celery)</summary>

### [`v1.2.1`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#121)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.2.0...v1.2.1)

\=====
:release-date: 30 July, 2025
:release-by: Tomer Nosrati

### [`v1.2.0`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#120)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.3...v1.2.0)

\=====
:release-date: 21 February, 2025
:release-by: Tomer Nosrati

### [`v1.1.3`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#113)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.2...v1.1.3)

\=====
:release-date: 20 September, 2024
:release-by: Tomer Nosrati

### [`v1.1.2`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#112)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.1...v1.1.2)

\=====
:release-date: 14 September, 2024
:release-by: Tomer Nosrati

### [`v1.1.1`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#111)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.1.0...v1.1.1)

\=====
:release-date: 12 August, 2024
:release-by: Tomer Nosrati

### [`v1.1.0`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#110)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.0.1...v1.1.0)

\=====
:release-date: 11 August, 2024
:release-by: Tomer Nosrati

### [`v1.0.1`](https://github.com/celery/pytest-celery/blob/HEAD/Changelog.rst#101)

[Compare Source](https://github.com/celery/pytest-celery/compare/v1.0.0...v1.0.1)

\=====
:release-date: 17 July, 2024
:release-by: Tomer Nosrati

</details>

<details>
<summary>bloomberg/pytest-memray (pytest-memray)</summary>

### [`v1.8.0`](https://github.com/bloomberg/pytest-memray/releases/tag/v1.8.0)

[Compare Source](https://github.com/bloomberg/pytest-memray/compare/1.7.0...v1.8.0)

#### What's Changed

- Bump pypa/gh-action-pypi-publish from 1.9.0 to 1.10.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;124](https://github.com/bloomberg/pytest-memray/pull/124)
- Bump pypa/gh-action-pypi-publish from 1.10.0 to 1.10.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;125](https://github.com/bloomberg/pytest-memray/pull/125)
- Bump pypa/gh-action-pypi-publish from 1.10.1 to 1.10.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;127](https://github.com/bloomberg/pytest-memray/pull/127)
- Bump pypa/gh-action-pypi-publish from 1.10.2 to 1.11.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;129](https://github.com/bloomberg/pytest-memray/pull/129)
- Bump pypa/gh-action-pypi-publish from 1.11.0 to 1.12.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;139](https://github.com/bloomberg/pytest-memray/pull/139)
- Declare 3.14 support by [@&#8203;godlygeek](https://github.com/godlygeek) in [#&#8203;148](https://github.com/bloomberg/pytest-memray/pull/148)
- Bump actions/download-artifact from 4 to 5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;146](https://github.com/bloomberg/pytest-memray/pull/146)
- Bump actions/checkout from 4 to 5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;147](https://github.com/bloomberg/pytest-memray/pull/147)
- Release 1.8.0 by [@&#8203;pablogsal](https://github.com/pablogsal) in [#&#8203;149](https://github.com/bloomberg/pytest-memray/pull/149)

**Full Changelog**: <https://github.com/bloomberg/pytest-memray/compare/1.7.0...v1.8.0>

</details>

<details>
<summary>pytest-dev/pytest-mock (pytest-mock)</summary>

### [`v3.15.1`](https://github.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#3151)

[Compare Source](https://github.com/pytest-dev/pytest-mock/compare/v3.15.0...v3.15.1)

*2025-09-16*

- `#&#8203;529 <https://github.com/pytest-dev/pytest-mock/issues/529>`\_: Fixed `itertools._tee object has no attribute error` -- now `duplicate_iterators=True` must be passed to `mocker.spy` to duplicate iterators.

### [`v3.15.0`](https://github.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#3150)

[Compare Source](https://github.com/pytest-dev/pytest-mock/compare/v3.14.1...v3.15.0)

*2025-09-04*

- Python 3.8 (EOL) is no longer supported.
- `#&#8203;524 <https://github.com/pytest-dev/pytest-mock/pull/524>`\_: Added `spy_return_iter` to `mocker.spy`, which contains a duplicate of the return value of the spied method if it is an `Iterator`.

### [`v3.14.1`](https://github.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#3141-2025-05-26)

[Compare Source](https://github.com/pytest-dev/pytest-mock/compare/v3.14.0...v3.14.1)

- `#&#8203;503 <https://github.com/pytest-dev/pytest-mock/pull/503>`\_: Python 3.14 is now officially supported.

</details>

<details>
<summary>jbasko/pytest-random-order (pytest-random-order)</summary>

### [`v1.2.0`](https://github.com/jbasko/pytest-random-order/compare/v1.1.1...v1.2.0)

[Compare Source](https://github.com/jbasko/pytest-random-order/compare/v1.1.1...v1.2.0)

</details>

<details>
<summary>python-gitlab/python-gitlab (python-gitlab)</summary>

### [`v6.5.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v650-2025-10-17)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.4.0...v6.5.0)

##### Bug Fixes

- **semantic-release**: Enable CHANGELOG.md generation
  ([`fb9693b`](https://github.com/python-gitlab/python-gitlab/commit/fb9693bf1e6798149196e57fed87bf2588ad3b47))

##### Continuous Integration

- **stale**: Fix permission for stale action and allow manual run
  ([`9357a37`](https://github.com/python-gitlab/python-gitlab/commit/9357a374702dcc8049a6d8af636f48c736d3f160))

##### Documentation

- **pull\_mirror**: Fix incorrect start() method usage example
  ([`2acac19`](https://github.com/python-gitlab/python-gitlab/commit/2acac19356c8624def90c7e54237b256bceece18))

##### Features

- **api**: Add content\_ref and dry\_run\_ref parameters to ProjectCiLintManager
  ([`e8d2538`](https://github.com/python-gitlab/python-gitlab/commit/e8d2538cdf85a7c57babbc00074efbdab97548cd))

- **users**: Implement 'skip\_confirmation' in users 'emails' creation
  ([`2981730`](https://github.com/python-gitlab/python-gitlab/commit/298173017be387f26aa0828cae1e9a48e3cce328))

### [`v6.4.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v640-2025-09-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.3.0...v6.4.0)

##### Features

- **users**: Implement missing arguments in users 'list'
  ([`99923d4`](https://github.com/python-gitlab/python-gitlab/commit/99923d40dcb4f32f02bcbc5e8ef5ec4b77e3cb02))

- **users**: Sort 'user list' arguments against documentation
  ([`99923d4`](https://github.com/python-gitlab/python-gitlab/commit/99923d40dcb4f32f02bcbc5e8ef5ec4b77e3cb02))

### [`v6.3.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v630-2025-08-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.2.0...v6.3.0)

##### Features

- Add sync method to force remote mirror updates
  ([`f3c6678`](https://github.com/python-gitlab/python-gitlab/commit/f3c6678482b7ca35b1dd1e3bc49fc0c56cd03639))

- **api**: Add missing ProjectJob list filters
  ([`5fe0e71`](https://github.com/python-gitlab/python-gitlab/commit/5fe0e715448b00a666f76cdce6db321686f6a271))

- **api**: Add missing ProjectPackageManager list filters
  ([`b1696be`](https://github.com/python-gitlab/python-gitlab/commit/b1696be5fb223028755e303069e23e42a11cab42))

- **users**: Implement support for 'admins' in administrators 'list'
  ([`aaed51c`](https://github.com/python-gitlab/python-gitlab/commit/aaed51cdec65c8acabe8b9a39fd18c7e1e48519c))

### [`v6.2.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v620-2025-07-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.1.0...v6.2.0)

##### Build System

- **release**: Use correct python-semantic-release/publish-action
  ([`2f20634`](https://github.com/python-gitlab/python-gitlab/commit/2f20634b9700bc802177278ffdd7bdf83ef1605a))

##### Continuous Integration

- **stale**: Improve formatting of stale message
  ([`0ef20d1`](https://github.com/python-gitlab/python-gitlab/commit/0ef20d1b0ee6cd82c4e34003aca4c0c72935f4d9))

- **stale**: Increase `operations-per-run` to 500
  ([`326e1a4`](https://github.com/python-gitlab/python-gitlab/commit/326e1a46881467f41dc3de5f060ac654924fbe40))

##### Features

- **api**: Add ListMixin to ProjectIssueDiscussionNoteManager
  ([`f908f0e`](https://github.com/python-gitlab/python-gitlab/commit/f908f0e82840a5df374e8fbfb1298608d23f02bd))

- **api**: Add ListMixin to ProjectMergeRequestDiscussionNoteManager
  ([`865339a`](https://github.com/python-gitlab/python-gitlab/commit/865339ac037fb125280180b05a2c4e44067dc5e9))

### [`v6.1.0`](https://github.com/python-gitlab/python-gitlab/blob/HEAD/CHANGELOG.md#v610-2025-06-28)

[Compare Source](https://github.com/python-gitlab/python-gitlab/compare/v6.0.0...v6.1.0)

##### Chores

- Update to mypy 1.16.0 and resolve issues found
  ([`f734c58`](https://github.com/python-gitlab/python-gitlab/commit/f734c586e3fe5a0e866bcf60030107ca142fa763))

##### Documentation

- Update CONTRIBUTING.rst with policy on issue management
  ([`45dda50`](https://github.com/python-gitlab/python-gitlab/commit/45dda50ff4c0e01307480befa86498600563f818))

##### Features

- **api**: Add listing user contributed projects
  ([`98c1307`](https://github.com/python-gitlab/python-gitlab/commit/98c13074127ae46d85545498746d55c8b75aef48))

- **api**: Add support for project tag list filters
  ([`378a836`](https://github.com/python-gitlab/python-gitlab/commit/378a836bf5744ca6c9409dd60899e5d2f90b55be))

- **api**: Pipeline inputs support
  ([#&#8203;3194](https://github.com/python-gitlab/python-gitlab/pull/3194),
  [`306c4b1`](https://github.com/python-gitlab/python-gitlab/commit/306c4b1931e2b03d7cbcef5773668e876d5644b1))

- **const**: Add PLANNER\_ACCESS constant
  ([`ba6f174`](https://github.com/python-gitlab/python-gitlab/commit/ba6f174896f908ba711e1e3e8ebf4692c86bd3d4))

- **groups**: Add protectedbranches to group class
  ([#&#8203;3164](https://github.com/python-gitlab/python-gitlab/pull/3164),
  [`bfd31a8`](https://github.com/python-gitlab/python-gitlab/commit/bfd31a867547dffb2c2d54127e184fefa058cb30))

</details>

<details>
<summary>indygreg/python-zstandard (zstandard)</summary>

### [`v0.25.0`](https://github.com/indygreg/python-zstandard/releases/tag/0.25.0)

[Compare Source](https://github.com/indygreg/python-zstandard/compare/0.24.0...0.25.0)

- PyO3 Rust created upgraded from 0.24 to 0.25. ([#&#8203;273](https://github.com/indygreg/python-zstandard/issues/273))
- We now use `Py_REFCNT(obj)` instead of accessing `(*obj)->ob_refcnt` directly.
  This fixes a nogil / multi-threaded compile error. ([#&#8203;201](https://github.com/indygreg/python-zstandard/issues/201), [#&#8203;275](https://github.com/indygreg/python-zstandard/issues/275))
- A zstandard commit to fix qsort detection on BSD operating systems
  has been backported. ([#&#8203;272](https://github.com/indygreg/python-zstandard/issues/272))
- The `PYTHON_ZSTANDARD_IMPORT_POLICY` environment variable now has leading
  and trailing whitespace stripped. Values like ` cffi` and `cffi ` are
  now equivalent to `cffi`.
- The CI jobs for building wheels have been overhauled to always use
  `cibuildwheel` and `uv` (where possible). This change should be backwards
  compatible. But wheel building for this project has historically been
  fragile and there may be unwanted changes. We're optimistic that standardizing
  on uv (except for musllinux ppc64le and s390x where uv isn't available)
  will lead to more stability over time.
- CI now runs tests against the wheels we distribute. Previously, we ran
  tests against a separate build that was theoretically identical. But the
  builds may have been subtly different, leading to preventable bugs in our
  wheels. (Enabling this test coverage did not uncover any failures.)
- The `pyproject.toml` build backend has been switched from
  `setuptools.build_meta:__legacy__` to `setuptools.build_meta`.
- The setuptools build dependency has been upgraded from <69.0.0 to >=77.0.0.
  Modern versions of setuptools broke
  `--config-settings=--build-option=...` as part of implementing PEP 660.
  A workaround is to use `--config-settings=--global-option=...` instead.
  `--global-option` apparently is deprecated and the setuptools folks have yet
  to figure out how to thread config settings into `setup.py` invocations.
  (`--build-option` is sent to the `build_wheel` command but not the
  `build_editable` command.)
- Python 3.14 wheels are now built with `manylinux_2_28` (versus
  `manylinux2014`) for older Python versions. This may raise the minimum
  glibc version, effectively dropping support for Debian 8 and 9, Ubuntu
  13.10 through 18.04, Fedora 19 to 28, and RHEL/Centos 7. However, in
  practice most platforms don't container newer glibc symbols and are still
  ABI compatible with `manylinux2014` and glibc 2.17.
- We now require cffi >= 2.0.0b on Python 3.14. <3.14 still requires 1.17.
  ([#&#8203;274](https://github.com/indygreg/python-zstandard/issues/274))
- The cffi backend is now automatically disabled for free-threaded builds
  on Python <3.14, as cffi didn't implement free-threaded support until
  the 2.0 release. ([#&#8203;274](https://github.com/indygreg/python-zstandard/issues/274))
- Added CI coverage for free-threaded CPython 3.13 and 3.14. We do not yet
  formally support free-threaded builds. ([#&#8203;276](https://github.com/indygreg/python-zstandard/issues/276))
- The C and Rust backends now declare the GIL as unused.
- The `pythoncapi_compat.h` file has been upgraded to the latest version. ([#&#8203;278](https://github.com/indygreg/python-zstandard/issues/278))
- `setup.py` now depends on `packaging` and uses `packaging.version.Version`
  for version comparisons. This removes some deprecation warnings from usage of
  legacy distutils `Version` classes.
- Relax run-time libzstd version checking in C extension from exactly 1.5.7
  to >=1.5.6. ([#&#8203;254](https://github.com/indygreg/python-zstandard/issues/254), [#&#8203;267](https://github.com/indygreg/python-zstandard/issues/267))
- C extension types now (correctly) declare their fully qualified type names
  as `zstandard.backend_c.*` versus `zstd.*` before. The names have been
  subtly broken for years. We believe the only practical exposure to this change
  is via pickling (possibly encountered when using the `multiprocessing` or
  `concurrent.futures` packages), which would fail to pickle types like
  `ZstdError` before since the fully qualified type name referenced an
  incorrect and likely missing package (`zstd`). ([#&#8203;248](https://github.com/indygreg/python-zstandard/issues/248))

### [`v0.24.0`](https://github.com/indygreg/python-zstandard/releases/tag/0.24.0)

[Compare Source](https://github.com/indygreg/python-zstandard/compare/0.23.0...0.24.0)

### Backwards Compatibility Notes

- Support for Python 3.8 has been dropped because it reached end of life. Python 3.9 is the minimum supported Python version. The code should still be compatible with Python 3.8 and removing of version checks from `setup.py` will likely yield a working install. However, this is not officially supported.

### Changes

- Bundled zstd library upgraded from 1.5.6 to 1.5.7. ([#&#8203;255](https://github.com/indygreg/python-zstandard/issues/255))
- We now use and require cffi 1.17.0 or newer. Previously, the constraint was >=1.11.0 on Python <3.13.
- The `pyproject.toml` file now defines a `[project]` section.
- We now use GitHub's native ARM Linux runners to build wheels and run tests. Previously, Linux ARM wheels were built inside a QEMU virtualized environment and we didn't run tests on this platform.
- We now use GitHub's native ARM Windows runners to build wheels and run tests. Previously, Windows ARM wheels were cross compiled from an x86-64 runner and we never ran tests for the Windows ARM platform.
- We now `collections.abs.Buffer` on Python 3.12+ instead of `typing.ByteString`, as `typing.ByteString` was dep…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants