build(deps): update dependency ruff to ~=0.11.2
Metadata
Current evaluation
Merged automated dependency update upgrading ruff from ~=0.7.0 to ~=0.11.2. Approved by one reviewer, passed all CI checks, and modified a single configuration file.
Suggested action: —
No scores available.
Issue body
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff) ([source](https://redirect.github.com/astral-sh/ruff), [changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | `~=0.7.0` -> `~=0.11.2` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) |
---
### Release Notes
<details>
<summary>astral-sh/ruff (ruff)</summary>
### [`v0.11.2`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0112)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.11.1...0.11.2)
##### Preview features
- \[syntax-errors] Fix false-positive syntax errors emitted for annotations on variadic parameters before Python 3.11 ([#​16878](https://redirect.github.com/astral-sh/ruff/pull/16878))
### [`v0.11.1`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0111)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.11.0...0.11.1)
##### Preview features
- \[`airflow`] Add `chain`, `chain_linear` and `cross_downstream` for `AIR302` ([#​16647](https://redirect.github.com/astral-sh/ruff/pull/16647))
- \[syntax-errors] Improve error message and range for pre-PEP-614 decorator syntax errors ([#​16581](https://redirect.github.com/astral-sh/ruff/pull/16581))
- \[syntax-errors] PEP 701 f-strings before Python 3.12 ([#​16543](https://redirect.github.com/astral-sh/ruff/pull/16543))
- \[syntax-errors] Parenthesized context managers before Python 3.9 ([#​16523](https://redirect.github.com/astral-sh/ruff/pull/16523))
- \[syntax-errors] Star annotations before Python 3.11 ([#​16545](https://redirect.github.com/astral-sh/ruff/pull/16545))
- \[syntax-errors] Star expression in index before Python 3.11 ([#​16544](https://redirect.github.com/astral-sh/ruff/pull/16544))
- \[syntax-errors] Unparenthesized assignment expressions in sets and indexes ([#​16404](https://redirect.github.com/astral-sh/ruff/pull/16404))
##### Bug fixes
- Server: Allow `FixAll` action in presence of version-specific syntax errors ([#​16848](https://redirect.github.com/astral-sh/ruff/pull/16848))
- \[`flake8-bandit`] Allow raw strings in `suspicious-mark-safe-usage` (`S308`) [#​16702](https://redirect.github.com/astral-sh/ruff/issues/16702) ([#​16770](https://redirect.github.com/astral-sh/ruff/pull/16770))
- \[`refurb`] Avoid panicking `unwrap` in `verbose-decimal-constructor` (`FURB157`) ([#​16777](https://redirect.github.com/astral-sh/ruff/pull/16777))
- \[`refurb`] Fix starred expressions fix (`FURB161`) ([#​16550](https://redirect.github.com/astral-sh/ruff/pull/16550))
- Fix `--statistics` reporting for unsafe fixes ([#​16756](https://redirect.github.com/astral-sh/ruff/pull/16756))
##### Rule changes
- \[`flake8-executables`] Allow `uv run` in shebang line for `shebang-missing-python` (`EXE003`) ([#​16849](https://redirect.github.com/astral-sh/ruff/pull/16849),[#​16855](https://redirect.github.com/astral-sh/ruff/pull/16855))
##### CLI
- Add `--exit-non-zero-on-format` ([#​16009](https://redirect.github.com/astral-sh/ruff/pull/16009))
##### Documentation
- Update Ruff tutorial to avoid non-existent fix in `__init__.py` ([#​16818](https://redirect.github.com/astral-sh/ruff/pull/16818))
- \[`flake8-gettext`] Swap `format-` and `printf-in-get-text-func-call` examples (`INT002`, `INT003`) ([#​16769](https://redirect.github.com/astral-sh/ruff/pull/16769))
### [`v0.11.0`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0110)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.10.0...0.11.0)
This is a follow-up to release 0.10.0. Because of a mistake in the release process, the `requires-python` inference changes were not included in that release. Ruff 0.11.0 now includes this change as well as the stabilization of the preview behavior for `PGH004`.
##### Breaking changes
- **Changes to how the Python version is inferred when a `target-version` is not specified** ([#​16319](https://redirect.github.com/astral-sh/ruff/pull/16319))
In previous versions of Ruff, you could specify your Python version with:
- The `target-version` option in a `ruff.toml` file or the `[tool.ruff]` section of a pyproject.toml file.
- The `project.requires-python` field in a `pyproject.toml` file with a `[tool.ruff]` section.
These options worked well in most cases, and are still recommended for fine control of the Python version. However, because of the way Ruff discovers config files, `pyproject.toml` files without a `[tool.ruff]` section would be ignored, including the `requires-python` setting. Ruff would then use the default Python version (3.9 as of this writing) instead, which is surprising when you've attempted to request another version.
In v0.10, config discovery has been updated to address this issue:
- If Ruff finds a `ruff.toml` file without a `target-version`, it will check
for a `pyproject.toml` file in the same directory and respect its
`requires-python` version, even if it does not contain a `[tool.ruff]`
section.
- If Ruff finds a user-level configuration, the `requires-python` field of the closest `pyproject.toml` in a parent directory will take precedence.
- If there is no config file (`ruff.toml`or `pyproject.toml` with a
`[tool.ruff]` section) in the directory of the file being checked, Ruff will
search for the closest `pyproject.toml` in the parent directories and use its
`requires-python` setting.
##### Stabilization
The following behaviors have been stabilized:
- [`blanket-noqa`](https://docs.astral.sh/ruff/rules/blanket-noqa/) (`PGH004`): Also detect blanked file-level noqa comments (and not just line level comments).
##### Preview features
- \[syntax-errors] Tuple unpacking in `for` statement iterator clause before Python 3.9 ([#​16558](https://redirect.github.com/astral-sh/ruff/pull/16558))
### [`v0.10.0`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0100)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.10...0.10.0)
Check out the [blog post](https://astral.sh/blog/ruff-v0.10.0) for a migration guide and overview of the changes!
##### Breaking changes
See also, the "Remapped rules" section which may result in disabled rules.
- **Changes to how the Python version is inferred when a `target-version` is not specified** ([#​16319](https://redirect.github.com/astral-sh/ruff/pull/16319))
Because of a mistake in the release process, the `requires-python` inference changes are not included in this release and instead shipped as part of 0.11.0.
You can find a description of this change in the 0.11.0 section.
- **Updated `TYPE_CHECKING` behavior** ([#​16669](https://redirect.github.com/astral-sh/ruff/pull/16669))
Previously, Ruff only recognized typechecking blocks that tested the `typing.TYPE_CHECKING` symbol. Now, Ruff recognizes any local variable named `TYPE_CHECKING`. This release also removes support for the legacy `if 0:` and `if False:` typechecking checks. Use a local `TYPE_CHECKING` variable instead.
- **More robust noqa parsing** ([#​16483](https://redirect.github.com/astral-sh/ruff/pull/16483))
The syntax for both file-level and in-line suppression comments has been unified and made more robust to certain errors. In most cases, this will result in more suppression comments being read by Ruff, but there are a few instances where previously read comments will now log an error to the user instead. Please refer to the documentation on [*Error suppression*](https://docs.astral.sh/ruff/linter/#error-suppression) for the full specification.
- **Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment** ([#​14005](https://redirect.github.com/astral-sh/ruff/pull/14005))
This change fixes a bug in the formatter where it introduced unnecessary parentheses around with statements with a single context manager and a trailing comment. This change may result in a change in formatting for some users.
- **Bump alpine default tag to 3.21 for derived Docker images** ([#​16456](https://redirect.github.com/astral-sh/ruff/pull/16456))
Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Now the ruff:alpine image will use 3.21 instead of 3.20 and ruff:alpine3.20 will no longer be updated.
##### Deprecated Rules
The following rules have been deprecated:
- [`non-pep604-isinstance`](https://docs.astral.sh/ruff/rules/non-pep604-isinstance/) (`UP038`)
- [`suspicious-xmle-tree-usage`](https://docs.astral.sh/ruff/rules/suspicious-xmle-tree-usage/) (`S320`)
##### Remapped rules
The following rules have been remapped to new rule codes:
- \[`unsafe-markup-use`]: `RUF035` to `S704`
##### Stabilization
The following rules have been stabilized and are no longer in preview:
- [`batched-without-explicit-strict`](https://docs.astral.sh/ruff/rules/batched-without-explicit-strict) (`B911`)
- [`unnecessary-dict-comprehension-for-iterable`](https://docs.astral.sh/ruff/rules/unnecessary-dict-comprehension-for-iterable) (`C420`)
- [`datetime-min-max`](https://docs.astral.sh/ruff/rules/datetime-min-max) (`DTZ901`)
- [`fast-api-unused-path-parameter`](https://docs.astral.sh/ruff/rules/fast-api-unused-path-parameter) (`FAST003`)
- [`root-logger-call`](https://docs.astral.sh/ruff/rules/root-logger-call) (`LOG015`)
- [`len-test`](https://docs.astral.sh/ruff/rules/len-test) (`PLC1802`)
- [`shallow-copy-environ`](https://docs.astral.sh/ruff/rules/shallow-copy-environ) (`PLW1507`)
- [`os-listdir`](https://docs.astral.sh/ruff/rules/os-listdir) (`PTH208`)
- [`invalid-pathlib-with-suffix`](https://docs.astral.sh/ruff/rules/invalid-pathlib-with-suffix) (`PTH210`)
- [`invalid-assert-message-literal-argument`](https://docs.astral.sh/ruff/rules/invalid-assert-message-literal-argument) (`RUF040`)
- [`unnecessary-nested-literal`](https://docs.astral.sh/ruff/rules/unnecessary-nested-literal) (`RUF041`)
- [`unnecessary-cast-to-int`](https://docs.astral.sh/ruff/rules/unnecessary-cast-to-int) (`RUF046`)
- [`map-int-version-parsing`](https://docs.astral.sh/ruff/rules/map-int-version-parsing) (`RUF048`)
- [`if-key-in-dict-del`](https://docs.astral.sh/ruff/rules/if-key-in-dict-del) (`RUF051`)
- [`unsafe-markup-use`](https://docs.astral.sh/ruff/rules/unsafe-markup-use) (`S704`). This rule has also been renamed from `RUF035`.
- [`split-static-string`](https://docs.astral.sh/ruff/rules/split-static-string) (`SIM905`)
- [`runtime-cast-value`](https://docs.astral.sh/ruff/rules/runtime-cast-value) (`TC006`)
- [`unquoted-type-alias`](https://docs.astral.sh/ruff/rules/unquoted-type-alias) (`TC007`)
- [`non-pep646-unpack`](https://docs.astral.sh/ruff/rules/non-pep646-unpack) (`UP044`)
The following behaviors have been stabilized:
- [`bad-staticmethod-argument`](https://docs.astral.sh/ruff/rules/bad-staticmethod-argument/) (`PLW0211`) [`invalid-first-argument-name-for-class-method`](https://docs.astral.sh/ruff/rules/invalid-first-argument-name-for-class-method/) (`N804`): `__new__` methods are now no longer flagged by `invalid-first-argument-name-for-class-method` (`N804`) but instead by `bad-staticmethod-argument` (`PLW0211`)
- [`bad-str-strip-call`](https://docs.astral.sh/ruff/rules/bad-str-strip-call/) (`PLE1310`): The rule now applies to objects which are known to have type `str` or `bytes`.
- [`custom-type-var-for-self`](https://docs.astral.sh/ruff/rules/custom-type-var-for-self/) (`PYI019`): More accurate detection of custom `TypeVars` replaceable by `Self`. The range of the diagnostic is now the full function header rather than just the return annotation.
- [`invalid-argument-name`](https://docs.astral.sh/ruff/rules/invalid-argument-name/) (`N803`): Ignore argument names of functions decorated with `typing.override`
- [`invalid-envvar-default`](https://docs.astral.sh/ruff/rules/invalid-envvar-default/) (`PLW1508`): Detect default value arguments to `os.environ.get` with invalid type.
- [`pytest-raises-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-raises-with-multiple-statements/) (`PT012`) [`pytest-warns-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-warns-with-multiple-statements/) (`PT031`): Allow `for` statements with an empty body in `pytest.raises` and `pytest.warns` `with` statements.
- [`redundant-open-modes`](https://docs.astral.sh/ruff/rules/redundant-open-modes/) (`UP015`): The diagnostic range is now the range of the redundant mode argument where it previously was the range of the entire open call. You may have to replace your `noqa` comments when suppressing `UP015`.
- [`stdlib-module-shadowing`](https://docs.astral.sh/ruff/rules/stdlib-module-shadowing/) (`A005`): Changes the default value of `lint.flake8-builtins.strict-checking` from `true` to `false`.
- [`type-none-comparison`](https://docs.astral.sh/ruff/rules/type-none-comparison/) (`FURB169`): Now also recognizes `type(expr) is type(None)` comparisons where `expr` isn't a name expression.
The following fixes or improvements to fixes have been stabilized:
- [`repeated-equality-comparison`](https://docs.astral.sh/ruff/rules/repeated-equality-comparison/) (`PLR1714`) ([#​16685](https://redirect.github.com/astral-sh/ruff/pull/16685))
- [`needless-bool`](https://docs.astral.sh/ruff/rules/needless-bool/) (`SIM103`) ([#​16684](https://redirect.github.com/astral-sh/ruff/pull/16684))
- [`unused-private-type-var`](https://docs.astral.sh/ruff/rules/unused-private-type-var/) (`PYI018`) ([#​16682](https://redirect.github.com/astral-sh/ruff/pull/16682))
##### Server
- Remove logging output for `ruff.printDebugInformation` ([#​16617](https://redirect.github.com/astral-sh/ruff/pull/16617))
##### Configuration
- \[`flake8-builtins`] Deprecate the `builtins-` prefixed options in favor of the unprefixed options (e.g. `builtins-allowed-modules` is now deprecated in favor of `allowed-modules`) ([#​16092](https://redirect.github.com/astral-sh/ruff/pull/16092))
##### Bug fixes
- \[flake8-bandit] Fix mixed-case hash algorithm names (S324) ([#​16552](https://redirect.github.com/astral-sh/ruff/pull/16552))
##### CLI
- \[ruff] Fix `last_tag`/`commits_since_last_tag` for `version` command ([#​16686](https://redirect.github.com/astral-sh/ruff/pull/16686))
### [`v0.9.10`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0910)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.9...0.9.10)
##### Preview features
- \[`ruff`] Add new rule `RUF059`: Unused unpacked assignment ([#​16449](https://redirect.github.com/astral-sh/ruff/pull/16449))
- \[`syntax-errors`] Detect assignment expressions before Python 3.8 ([#​16383](https://redirect.github.com/astral-sh/ruff/pull/16383))
- \[`syntax-errors`] Named expressions in decorators before Python 3.9 ([#​16386](https://redirect.github.com/astral-sh/ruff/pull/16386))
- \[`syntax-errors`] Parenthesized keyword argument names after Python 3.8 ([#​16482](https://redirect.github.com/astral-sh/ruff/pull/16482))
- \[`syntax-errors`] Positional-only parameters before Python 3.8 ([#​16481](https://redirect.github.com/astral-sh/ruff/pull/16481))
- \[`syntax-errors`] Tuple unpacking in `return` and `yield` before Python 3.8 ([#​16485](https://redirect.github.com/astral-sh/ruff/pull/16485))
- \[`syntax-errors`] Type parameter defaults before Python 3.13 ([#​16447](https://redirect.github.com/astral-sh/ruff/pull/16447))
- \[`syntax-errors`] Type parameter lists before Python 3.12 ([#​16479](https://redirect.github.com/astral-sh/ruff/pull/16479))
- \[`syntax-errors`] `except*` before Python 3.11 ([#​16446](https://redirect.github.com/astral-sh/ruff/pull/16446))
- \[`syntax-errors`] `type` statements before Python 3.12 ([#​16478](https://redirect.github.com/astral-sh/ruff/pull/16478))
##### Bug fixes
- Escape template filenames in glob patterns in configuration ([#​16407](https://redirect.github.com/astral-sh/ruff/pull/16407))
- \[`flake8-simplify`] Exempt unittest context methods for `SIM115` rule ([#​16439](https://redirect.github.com/astral-sh/ruff/pull/16439))
- Formatter: Fix syntax error location in notebooks ([#​16499](https://redirect.github.com/astral-sh/ruff/pull/16499))
- \[`pyupgrade`] Do not offer fix when at least one target is `global`/`nonlocal` (`UP028`) ([#​16451](https://redirect.github.com/astral-sh/ruff/pull/16451))
- \[`flake8-builtins`] Ignore variables matching module attribute names (`A001`) ([#​16454](https://redirect.github.com/astral-sh/ruff/pull/16454))
- \[`pylint`] Convert `code` keyword argument to a positional argument in fix for (`PLR1722`) ([#​16424](https://redirect.github.com/astral-sh/ruff/pull/16424))
##### CLI
- Move rule code from `description` to `check_name` in GitLab output serializer ([#​16437](https://redirect.github.com/astral-sh/ruff/pull/16437))
##### Documentation
- \[`pydocstyle`] Clarify that `D417` only checks docstrings with an arguments section ([#​16494](https://redirect.github.com/astral-sh/ruff/pull/16494))
### [`v0.9.9`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#099)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.8...0.9.9)
##### Preview features
- Fix caching of unsupported-syntax errors ([#​16425](https://redirect.github.com/astral-sh/ruff/pull/16425))
##### Bug fixes
- Only show unsupported-syntax errors in editors when preview mode is enabled ([#​16429](https://redirect.github.com/astral-sh/ruff/pull/16429))
### [`v0.9.8`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#098)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.7...0.9.8)
##### Preview features
- Start detecting version-related syntax errors in the parser ([#​16090](https://redirect.github.com/astral-sh/ruff/pull/16090))
##### Rule changes
- \[`pylint`] Mark fix unsafe (`PLW1507`) ([#​16343](https://redirect.github.com/astral-sh/ruff/pull/16343))
- \[`pylint`] Catch `case np.nan`/`case math.nan` in `match` statements (`PLW0177`) ([#​16378](https://redirect.github.com/astral-sh/ruff/pull/16378))
- \[`ruff`] Add more Pydantic models variants to the list of default copy semantics (`RUF012`) ([#​16291](https://redirect.github.com/astral-sh/ruff/pull/16291))
##### Server
- Avoid indexing the project if `configurationPreference` is `editorOnly` ([#​16381](https://redirect.github.com/astral-sh/ruff/pull/16381))
- Avoid unnecessary info at non-trace server log level ([#​16389](https://redirect.github.com/astral-sh/ruff/pull/16389))
- Expand `ruff.configuration` to allow inline config ([#​16296](https://redirect.github.com/astral-sh/ruff/pull/16296))
- Notify users for invalid client settings ([#​16361](https://redirect.github.com/astral-sh/ruff/pull/16361))
##### Configuration
- Add `per-file-target-version` option ([#​16257](https://redirect.github.com/astral-sh/ruff/pull/16257))
##### Bug fixes
- \[`refurb`] Do not consider docstring(s) (`FURB156`) ([#​16391](https://redirect.github.com/astral-sh/ruff/pull/16391))
- \[`flake8-self`] Ignore attribute accesses on instance-like variables (`SLF001`) ([#​16149](https://redirect.github.com/astral-sh/ruff/pull/16149))
- \[`pylint`] Fix false positives, add missing methods, and support positional-only parameters (`PLE0302`) ([#​16263](https://redirect.github.com/astral-sh/ruff/pull/16263))
- \[`flake8-pyi`] Mark `PYI030` fix unsafe when comments are deleted ([#​16322](https://redirect.github.com/astral-sh/ruff/pull/16322))
##### Documentation
- Fix example for `S611` ([#​16316](https://redirect.github.com/astral-sh/ruff/pull/16316))
- Normalize inconsistent markdown headings in docstrings ([#​16364](https://redirect.github.com/astral-sh/ruff/pull/16364))
- Document MSRV policy ([#​16384](https://redirect.github.com/astral-sh/ruff/pull/16384))
### [`v0.9.7`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#097)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.6...0.9.7)
##### Preview features
- Consider `__new__` methods as special function type for enforcing class method or static method rules ([#​13305](https://redirect.github.com/astral-sh/ruff/pull/13305))
- \[`airflow`] Improve the internal logic to differentiate deprecated symbols (`AIR303`) ([#​16013](https://redirect.github.com/astral-sh/ruff/pull/16013))
- \[`refurb`] Manual timezone monkeypatching (`FURB162`) ([#​16113](https://redirect.github.com/astral-sh/ruff/pull/16113))
- \[`ruff`] Implicit class variable in dataclass (`RUF045`) ([#​14349](https://redirect.github.com/astral-sh/ruff/pull/14349))
- \[`ruff`] Skip singleton starred expressions for `incorrectly-parenthesized-tuple-in-subscript` (`RUF031`) ([#​16083](https://redirect.github.com/astral-sh/ruff/pull/16083))
- \[`refurb`] Check for subclasses includes subscript expressions (`FURB189`) ([#​16155](https://redirect.github.com/astral-sh/ruff/pull/16155))
##### Rule changes
- \[`flake8-debugger`] Also flag `sys.breakpointhook` and `sys.__breakpointhook__` (`T100`) ([#​16191](https://redirect.github.com/astral-sh/ruff/pull/16191))
- \[`pycodestyle`] Exempt `site.addsitedir(...)` calls (`E402`) ([#​16251](https://redirect.github.com/astral-sh/ruff/pull/16251))
##### Formatter
- Fix unstable formatting of trailing end-of-line comments of parenthesized attribute values ([#​16187](https://redirect.github.com/astral-sh/ruff/pull/16187))
##### Server
- Fix handling of requests received after shutdown message ([#​16262](https://redirect.github.com/astral-sh/ruff/pull/16262))
- Ignore `source.organizeImports.ruff` and `source.fixAll.ruff` code actions for a notebook cell ([#​16154](https://redirect.github.com/astral-sh/ruff/pull/16154))
- Include document specific debug info for `ruff.printDebugInformation` ([#​16215](https://redirect.github.com/astral-sh/ruff/pull/16215))
- Update server to return the debug info as string with `ruff.printDebugInformation` ([#​16214](https://redirect.github.com/astral-sh/ruff/pull/16214))
##### CLI
- Warn on invalid `noqa` even when there are no diagnostics ([#​16178](https://redirect.github.com/astral-sh/ruff/pull/16178))
- Better error messages while loading configuration `extend`s ([#​15658](https://redirect.github.com/astral-sh/ruff/pull/15658))
##### Bug fixes
- \[`flake8-comprehensions`] Handle trailing comma in `C403` fix ([#​16110](https://redirect.github.com/astral-sh/ruff/pull/16110))
- \[`flake8-pyi`] Avoid flagging `custom-typevar-for-self` on metaclass methods (`PYI019`) ([#​16141](https://redirect.github.com/astral-sh/ruff/pull/16141))
- \[`pydocstyle`] Handle arguments with the same names as sections (`D417`) ([#​16011](https://redirect.github.com/astral-sh/ruff/pull/16011))
- \[`pylint`] Correct ordering of arguments in fix for `if-stmt-min-max` (`PLR1730`) ([#​16080](https://redirect.github.com/astral-sh/ruff/pull/16080))
- \[`pylint`] Do not offer fix for raw strings (`PLE251`) ([#​16132](https://redirect.github.com/astral-sh/ruff/pull/16132))
- \[`pyupgrade`] Do not upgrade functional `TypedDicts` with private field names to the class-based syntax (`UP013`) ([#​16219](https://redirect.github.com/astral-sh/ruff/pull/16219))
- \[`pyupgrade`] Handle micro version numbers correctly (`UP036`) ([#​16091](https://redirect.github.com/astral-sh/ruff/pull/16091))
- \[`pyupgrade`] Unwrap unary expressions correctly (`UP018`) ([#​15919](https://redirect.github.com/astral-sh/ruff/pull/15919))
- \[`refurb`] Correctly handle lengths of literal strings in `slice-to-remove-prefix-or-suffix` (`FURB188`) ([#​16237](https://redirect.github.com/astral-sh/ruff/pull/16237))
- \[`ruff`] Skip `RUF001` diagnostics when visiting string type definitions ([#​16122](https://redirect.github.com/astral-sh/ruff/pull/16122))
##### Documentation
- Add FAQ entry for `source.*` code actions in Notebook ([#​16212](https://redirect.github.com/astral-sh/ruff/pull/16212))
- Add `SECURITY.md` ([#​16224](https://redirect.github.com/astral-sh/ruff/pull/16224))
### [`v0.9.6`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#096)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.5...0.9.6)
##### Preview features
- \[`airflow`] Add `external_task.{ExternalTaskMarker, ExternalTaskSensor}` for `AIR302` ([#​16014](https://redirect.github.com/astral-sh/ruff/pull/16014))
- \[`flake8-builtins`] Make strict module name comparison optional (`A005`) ([#​15951](https://redirect.github.com/astral-sh/ruff/pull/15951))
- \[`flake8-pyi`] Extend fix to Python <= 3.9 for `redundant-none-literal` (`PYI061`) ([#​16044](https://redirect.github.com/astral-sh/ruff/pull/16044))
- \[`pylint`] Also report when the object isn't a literal (`PLE1310`) ([#​15985](https://redirect.github.com/astral-sh/ruff/pull/15985))
- \[`ruff`] Implement `indented-form-feed` (`RUF054`) ([#​16049](https://redirect.github.com/astral-sh/ruff/pull/16049))
- \[`ruff`] Skip type definitions for `missing-f-string-syntax` (`RUF027`) ([#​16054](https://redirect.github.com/astral-sh/ruff/pull/16054))
##### Rule changes
- \[`flake8-annotations`] Correct syntax for `typing.Union` in suggested return type fixes for `ANN20x` rules ([#​16025](https://redirect.github.com/astral-sh/ruff/pull/16025))
- \[`flake8-builtins`] Match upstream module name comparison (`A005`) ([#​16006](https://redirect.github.com/astral-sh/ruff/pull/16006))
- \[`flake8-comprehensions`] Detect overshadowed `list`/`set`/`dict`, ignore variadics and named expressions (`C417`) ([#​15955](https://redirect.github.com/astral-sh/ruff/pull/15955))
- \[`flake8-pie`] Remove following comma correctly when the unpacked dictionary is empty (`PIE800`) ([#​16008](https://redirect.github.com/astral-sh/ruff/pull/16008))
- \[`flake8-simplify`] Only trigger `SIM401` on known dictionaries ([#​15995](https://redirect.github.com/astral-sh/ruff/pull/15995))
- \[`pylint`] Do not report calls when object type and argument type mismatch, remove custom escape handling logic (`PLE1310`) ([#​15984](https://redirect.github.com/astral-sh/ruff/pull/15984))
- \[`pyupgrade`] Comments within parenthesized value ranges should not affect applicability (`UP040`) ([#​16027](https://redirect.github.com/astral-sh/ruff/pull/16027))
- \[`pyupgrade`] Don't introduce invalid syntax when upgrading old-style type aliases with parenthesized multiline values (`UP040`) ([#​16026](https://redirect.github.com/astral-sh/ruff/pull/16026))
- \[`pyupgrade`] Ensure we do not rename two type parameters to the same name (`UP049`) ([#​16038](https://redirect.github.com/astral-sh/ruff/pull/16038))
- \[`pyupgrade`] \[`ruff`] Don't apply renamings if the new name is shadowed in a scope of one of the references to the binding (`UP049`, `RUF052`) ([#​16032](https://redirect.github.com/astral-sh/ruff/pull/16032))
- \[`ruff`] Update `RUF009` to behave similar to `B008` and ignore attributes with immutable types ([#​16048](https://redirect.github.com/astral-sh/ruff/pull/16048))
##### Server
- Root exclusions in the server to project root ([#​16043](https://redirect.github.com/astral-sh/ruff/pull/16043))
##### Bug fixes
- \[`flake8-datetime`] Ignore `.replace()` calls while looking for `.astimezone` ([#​16050](https://redirect.github.com/astral-sh/ruff/pull/16050))
- \[`flake8-type-checking`] Avoid `TC004` false positive where the runtime definition is provided by `__getattr__` ([#​16052](https://redirect.github.com/astral-sh/ruff/pull/16052))
##### Documentation
- Improve `ruff-lsp` migration document ([#​16072](https://redirect.github.com/astral-sh/ruff/pull/16072))
- Undeprecate `ruff.nativeServer` ([#​16039](https://redirect.github.com/astral-sh/ruff/pull/16039))
### [`v0.9.5`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#095)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.4...0.9.5)
##### Preview features
- Recognize all symbols named `TYPE_CHECKING` for `in_type_checking_block` ([#​15719](https://redirect.github.com/astral-sh/ruff/pull/15719))
- \[`flake8-comprehensions`] Handle builtins at top of file correctly for `unnecessary-dict-comprehension-for-iterable` (`C420`) ([#​15837](https://redirect.github.com/astral-sh/ruff/pull/15837))
- \[`flake8-logging`] `.exception()` and `exc_info=` outside exception handlers (`LOG004`, `LOG014`) ([#​15799](https://redirect.github.com/astral-sh/ruff/pull/15799))
- \[`flake8-pyi`] Fix incorrect behaviour of `custom-typevar-return-type` preview-mode autofix if `typing` was already imported (`PYI019`) ([#​15853](https://redirect.github.com/astral-sh/ruff/pull/15853))
- \[`flake8-pyi`] Fix more complex cases (`PYI019`) ([#​15821](https://redirect.github.com/astral-sh/ruff/pull/15821))
- \[`flake8-pyi`] Make `PYI019` autofixable for `.py` files in preview mode as well as stubs ([#​15889](https://redirect.github.com/astral-sh/ruff/pull/15889))
- \[`flake8-pyi`] Remove type parameter correctly when it is the last (`PYI019`) ([#​15854](https://redirect.github.com/astral-sh/ruff/pull/15854))
- \[`pylint`] Fix missing parens in unsafe fix for `unnecessary-dunder-call` (`PLC2801`) ([#​15762](https://redirect.github.com/astral-sh/ruff/pull/15762))
- \[`pyupgrade`] Better messages and diagnostic range (`UP015`) ([#​15872](https://redirect.github.com/astral-sh/ruff/pull/15872))
- \[`pyupgrade`] Rename private type parameters in PEP 695 generics (`UP049`) ([#​15862](https://redirect.github.com/astral-sh/ruff/pull/15862))
- \[`refurb`] Also report non-name expressions (`FURB169`) ([#​15905](https://redirect.github.com/astral-sh/ruff/pull/15905))
- \[`refurb`] Mark fix as unsafe if there are comments (`FURB171`) ([#​15832](https://redirect.github.com/astral-sh/ruff/pull/15832))
- \[`ruff`] Classes with mixed type variable style (`RUF053`) ([#​15841](https://redirect.github.com/astral-sh/ruff/pull/15841))
- \[`airflow`] `BashOperator` has been moved to `airflow.providers.standard.operators.bash.BashOperator` (`AIR302`) ([#​15922](https://redirect.github.com/astral-sh/ruff/pull/15922))
- \[`flake8-pyi`] Add autofix for unused-private-type-var (`PYI018`) ([#​15999](https://redirect.github.com/astral-sh/ruff/pull/15999))
- \[`flake8-pyi`] Significantly improve accuracy of `PYI019` if preview mode is enabled ([#​15888](https://redirect.github.com/astral-sh/ruff/pull/15888))
##### Rule changes
- Preserve triple quotes and prefixes for strings ([#​15818](https://redirect.github.com/astral-sh/ruff/pull/15818))
- \[`flake8-comprehensions`] Skip when `TypeError` present from too many (kw)args for `C410`,`C411`, and `C418` ([#​15838](https://redirect.github.com/astral-sh/ruff/pull/15838))
- \[`flake8-pyi`] Rename `PYI019` and improve its diagnostic message ([#​15885](https://redirect.github.com/astral-sh/ruff/pull/15885))
- \[`pep8-naming`] Ignore `@override` methods (`N803`) ([#​15954](https://redirect.github.com/astral-sh/ruff/pull/15954))
- \[`pyupgrade`] Reuse replacement logic from `UP046` and `UP047` to preserve more comments (`UP040`) ([#​15840](https://redirect.github.com/astral-sh/ruff/pull/15840))
- \[`ruff`] Analyze deferred annotations before enforcing `mutable-(data)class-default` and `function-call-in-dataclass-default-argument` (`RUF008`,`RUF009`,`RUF012`) ([#​15921](https://redirect.github.com/astral-sh/ruff/pull/15921))
- \[`pycodestyle`] Exempt `sys.path += ...` calls (`E402`) ([#​15980](https://redirect.github.com/astral-sh/ruff/pull/15980))
##### Configuration
- Config error only when `flake8-import-conventions` alias conflicts with `isort.required-imports` bound name ([#​15918](https://redirect.github.com/astral-sh/ruff/pull/15918))
- Workaround Even Better TOML crash related to `allOf` ([#​15992](https://redirect.github.com/astral-sh/ruff/pull/15992))
##### Bug fixes
- \[`flake8-comprehensions`] Unnecessary `list` comprehension (rewrite as a `set` comprehension) (`C403`) - Handle extraneous parentheses around list comprehension ([#​15877](https://redirect.github.com/astral-sh/ruff/pull/15877))
- \[`flake8-comprehensions`] Handle trailing comma in fixes for `unnecessary-generator-list/set` (`C400`,`C401`) ([#​15929](https://redirect.github.com/astral-sh/ruff/pull/15929))
- \[`flake8-pyi`] Fix several correctness issues with `custom-type-var-return-type` (`PYI019`) ([#​15851](https://redirect.github.com/astral-sh/ruff/pull/15851))
- \[`pep8-naming`] Consider any number of leading underscore for `N801` ([#​15988](https://redirect.github.com/astral-sh/ruff/pull/15988))
- \[`pyflakes`] Visit forward annotations in `TypeAliasType` as types (`F401`) ([#​15829](https://redirect.github.com/astral-sh/ruff/pull/15829))
- \[`pylint`] Correct min/max auto-fix and suggestion for (`PL1730`) ([#​15930](https://redirect.github.com/astral-sh/ruff/pull/15930))
- \[`refurb`] Handle unparenthesized tuples correctly (`FURB122`, `FURB142`) ([#​15953](https://redirect.github.com/astral-sh/ruff/pull/15953))
- \[`refurb`] Avoid `None | None` as well as better detection and fix (`FURB168`) ([#​15779](https://redirect.github.com/astral-sh/ruff/pull/15779))
##### Documentation
- Add deprecation warning for `ruff-lsp` related settings ([#​15850](https://redirect.github.com/astral-sh/ruff/pull/15850))
- Docs (`linter.md`): clarify that Python files are always searched for in subdirectories ([#​15882](https://redirect.github.com/astral-sh/ruff/pull/15882))
- Fix a typo in `non_pep695_generic_class.rs` ([#​15946](https://redirect.github.com/astral-sh/ruff/pull/15946))
- Improve Docs: Pylint subcategories' codes ([#​15909](https://redirect.github.com/astral-sh/ruff/pull/15909))
- Remove non-existing `lint.extendIgnore` editor setting ([#​15844](https://redirect.github.com/astral-sh/ruff/pull/15844))
- Update black deviations ([#​15928](https://redirect.github.com/astral-sh/ruff/pull/15928))
- Mention `UP049` in `UP046` and `UP047`, add `See also` section to `UP040` ([#​15956](https://redirect.github.com/astral-sh/ruff/pull/15956))
- Add instance variable examples to `RUF012` ([#​15982](https://redirect.github.com/astral-sh/ruff/pull/15982))
- Explain precedence for `ignore` and `select` config ([#​15883](https://redirect.github.com/astral-sh/ruff/pull/15883))
### [`v0.9.4`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#094)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.3...0.9.4)
##### Preview features
- \[`airflow`] Extend airflow context parameter check for `BaseOperator.execute` (`AIR302`) ([#​15713](https://redirect.github.com/astral-sh/ruff/pull/15713))
- \[`airflow`] Update `AIR302` to check for deprecated context keys ([#​15144](https://redirect.github.com/astral-sh/ruff/pull/15144))
- \[`flake8-bandit`] Permit suspicious imports within stub files (`S4`) ([#​15822](https://redirect.github.com/astral-sh/ruff/pull/15822))
- \[`pylint`] Do not trigger `PLR6201` on empty collections ([#​15732](https://redirect.github.com/astral-sh/ruff/pull/15732))
- \[`refurb`] Do not emit diagnostic when loop variables are used outside loop body (`FURB122`) ([#​15757](https://redirect.github.com/astral-sh/ruff/pull/15757))
- \[`ruff`] Add support for more `re` patterns (`RUF055`) ([#​15764](https://redirect.github.com/astral-sh/ruff/pull/15764))
- \[`ruff`] Check for shadowed `map` before suggesting fix (`RUF058`) ([#​15790](https://redirect.github.com/astral-sh/ruff/pull/15790))
- \[`ruff`] Do not emit diagnostic when all arguments to `zip()` are variadic (`RUF058`) ([#​15744](https://redirect.github.com/astral-sh/ruff/pull/15744))
- \[`ruff`] Parenthesize fix when argument spans multiple lines for `unnecessary-round` (`RUF057`) ([#​15703](https://redirect.github.com/astral-sh/ruff/pull/15703))
##### Rule changes
- Preserve quote style in generated code ([#​15726](https://redirect.github.com/astral-sh/ruff/pull/15726), [#​15778](https://redirect.github.com/astral-sh/ruff/pull/15778), [#​15794](https://redirect.github.com/astral-sh/ruff/pull/15794))
- \[`flake8-bugbear`] Exempt `NewType` calls where the original type is immutable (`B008`) ([#​15765](https://redirect.github.com/astral-sh/ruff/pull/15765))
- \[`pylint`] Honor banned top-level imports by `TID253` in `PLC0415`. ([#​15628](https://redirect.github.com/astral-sh/ruff/pull/15628))
- \[`pyupgrade`] Ignore `is_typeddict` and `TypedDict` for `deprecated-import` (`UP035`) ([#​15800](https://redirect.github.com/astral-sh/ruff/pull/15800))
##### CLI
- Fix formatter warning message for `flake8-quotes` option ([#​15788](https://redirect.github.com/astral-sh/ruff/pull/15788))
- Implement tab autocomplete for `ruff config` ([#​15603](https://redirect.github.com/astral-sh/ruff/pull/15603))
##### Bug fixes
- \[`flake8-comprehensions`] Do not emit `unnecessary-map` diagnostic when lambda has different arity (`C417`) ([#​15802](https://redirect.github.com/astral-sh/ruff/pull/15802))
- \[`flake8-comprehensions`] Parenthesize `sorted` when needed for `unnecessary-call-around-sorted` (`C413`) ([#​15825](https://redirect.github.com/astral-sh/ruff/pull/15825))
- \[`pyupgrade`] Handle end-of-line comments for `quoted-annotation` (`UP037`) ([#​15824](https://redirect.github.com/astral-sh/ruff/pull/15824))
##### Documentation
- Add missing config docstrings ([#​15803](https://redirect.github.com/astral-sh/ruff/pull/15803))
- Add references to `trio.run_process` and `anyio.run_process` ([#​15761](https://redirect.github.com/astral-sh/ruff/pull/15761))
- Use `uv init --lib` in tutorial ([#​15718](https://redirect.github.com/astral-sh/ruff/pull/15718))
### [`v0.9.3`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#093)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.2...0.9.3)
##### Preview features
- \[`airflow`] Argument `fail_stop` in DAG has been renamed as `fail_fast` (`AIR302`) ([#​15633](https://redirect.github.com/astral-sh/ruff/pull/15633))
- \[`airflow`] Extend `AIR303` with more symbols ([#​15611](https://redirect.github.com/astral-sh/ruff/pull/15611))
- \[`flake8-bandit`] Report all references to suspicious functions (`S3`) ([#​15541](https://redirect.github.com/astral-sh/ruff/pull/15541))
- \[`flake8-pytest-style`] Do not emit diagnostics for empty `for` loops (`PT012`, `PT031`) ([#​15542](https://redirect.github.com/astral-sh/ruff/pull/15542))
- \[`flake8-simplify`] Avoid double negations (`SIM103`) ([#​15562](https://redirect.github.com/astral-sh/ruff/pull/15562))
- \[`pyflakes`] Fix infinite loop with unused local import in `__init__.py` (`F401`) ([#​15517](https://redirect.github.com/astral-sh/ruff/pull/15517))
- \[`pylint`] Do not report methods with only one `EM101`-compatible `raise` (`PLR6301`) ([#​15507](https://redirect.github.com/astral-sh/ruff/pull/15507))
- \[`pylint`] Implement `redefined-slots-in-subclass` (`W0244`) ([#​9640](https://redirect.github.com/astral-sh/ruff/pull/9640))
- \[`pyupgrade`] Add rules to use PEP 695 generics in classes and functions (`UP046`, `UP047`) ([#​15565](https://redirect.github.com/astral-sh/ruff/pull/15565), [#​15659](https://redirect.github.com/astral-sh/ruff/pull/15659))
- \[`refurb`] Implement `for-loop-writes` (`FURB122`) ([#​10630](https://redirect.github.com/astral-sh/ruff/pull/10630))
- \[`ruff`] Implement `needless-else` clause (`RUF047`) ([#​15051](https://redirect.github.com/astral-sh/ruff/pull/15051))
- \[`ruff`] Implement `starmap-zip` (`RUF058`) ([#​15483](https://redirect.github.com/astral-sh/ruff/pull/15483))
##### Rule changes
- \[`flake8-bugbear`] Do not raise error if keyword argument is present and target-python version is less or equals than 3.9 (`B903`) ([#​15549](https://redirect.github.com/astral-sh/ruff/pull/15549))
- \[`flake8-comprehensions`] strip parentheses around generators in `unnecessary-generator-set` (`C401`) ([#​15553](https://redirect.github.com/astral-sh/ruff/pull/15553))
- \[`flake8-pytest-style`] Rewrite references to `.exception` (`PT027`) ([#​15680](https://redirect.github.com/astral-sh/ruff/pull/15680))
- \[`flake8-simplify`] Mark fixes as unsafe (`SIM201`, `SIM202`) ([#​15626](https://redirect.github.com/astral-sh/ruff/pull/15626))
- \[`flake8-type-checking`] Fix some safe fixes being labeled unsafe (`TC006`,`TC008`) ([#​15638](https://redirect.github.com/astral-sh/ruff/pull/15638))
- \[`isort`] Omit trailing whitespace in `unsorted-imports` (`I001`) ([#​15518](https://redirect.github.com/astral-sh/ruff/pull/15518))
- \[`pydoclint`] Allow ignoring one line docstrings for `DOC` rules ([#​13302](https://redirect.github.com/astral-sh/ruff/pull/13302))
- \[`pyflakes`] Apply redefinition fixes by source code order (`F811`) ([#​15575](https://redirect.github.com/astral-sh/ruff/pull/15575))
- \[`pyflakes`] Avoid removing too many imports in `redefined-while-unused` (`F811`) ([#​15585](https://redirect.github.com/astral-sh/ruff/pull/15585))
- \[`pyflakes`] Group redefinition fixes by source statement (`F811`) ([#​15574](https://redirect.github.com/astral-sh/ruff/pull/15574))
- \[`pylint`] Include name of base class in message for `redefined-slots-in-subclass` (`W0244`) ([#​15559](https://redirect.github.com/astral-sh/ruff/pull/15559))
- \[`ruff`] Update fix for `RUF055` to use `var == value` ([#​15605](https://redirect.github.com/astral-sh/ruff/pull/15605))
##### Formatter
- Fix bracket spacing for single-element tuples in f-string expressions ([#​15537](https://redirect.github.com/astral-sh/ruff/pull/15537))
- Fix unstable f-string formatting for expressions containing a trailing comma ([#​15545](https://redirect.github.com/astral-sh/ruff/pull/15545))
##### Performance
- Avoid quadratic membership check in import fixes ([#​15576](https://redirect.github.com/astral-sh/ruff/pull/15576))
##### Server
- Allow `unsafe-fixes` settings for code actions ([#​15666](https://redirect.github.com/astral-sh/ruff/pull/15666))
##### Bug fixes
- \[`flake8-bandit`] Add missing single-line/dotall regex flag (`S608`) ([#​15654](https://redirect.github.com/astral-sh/ruff/pull/15654))
- \[`flake8-import-conventions`] Fix infinite loop between `ICN001` and `I002` (`ICN001`) ([#​15480](https://redirect.github.com/astral-sh/ruff/pull/15480))
- \[`flake8-simplify`] Do not emit diagnostics for expressions inside string type annotations (`SIM222`, `SIM223`) ([#​15405](https://redirect.github.com/astral-sh/ruff/pull/15405))
- \[`pyflakes`] Treat arguments passed to the `default=` parameter of `TypeVar` as type expressions (`F821`) ([#​15679](https://redirect.github.com/astral-sh/ruff/pull/15679))
- \[`pyupgrade`] Avoid syntax error when the iterable is a non-parenthesized tuple (`UP028`) ([#​15543](https://redirect.github.com/astral-sh/ruff/pull/15543))
- \[`ruff`] Exempt `NewType` calls where the original type is immutable (`RUF009`) ([#​15588](https://redirect.github.com/astral-sh/ruff/pull/15588))
- Preserve raw string prefix and escapes in all codegen fixes ([#​15694](https://redirect.github.com/astral-sh/ruff/pull/15694))
##### Documentation
- Generate documentation redirects for lowercase rule codes ([#​15564](https://redirect.github.com/astral-sh/ruff/pull/15564))
- `TRY300`: Add some extra notes on not catching exceptions you didn't expect ([#​15036](https://redirect.github.com/astral-sh/ruff/pull/15036))
### [`v0.9.2`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#092)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.1...0.9.2)
##### Preview features
- \[`airflow`] Fix typo "security_managr" to "security_manager" (`AIR303`) ([#​15463](https://redirect.github.com/astral-sh/ruff/pull/15463))
- \[`airflow`] extend and fix AIR302 rules ([#​15525](https://redirect.github.com/astral-sh/ruff/pull/15525))
- \[`fastapi`] Handle parameters with `Depends` correctly (`FAST003`) ([#​15364](https://redirect.github.com/astral-sh/ruff/pull/15364))
- \[`flake8-pytest-style`] Implement pytest.warns diagnostics (`PT029`, `PT030`, `PT031`) ([#​15444](https://redirect.github.com/astral-sh/ruff/pull/15444))
- \[`flake8-pytest-style`] Test function parameters with default arguments (`PT028`) ([#​15449](https://redirect.github.com/astral-sh/ruff/pull/15449))
- \[`flake8-type-checking`] Avoid false positives for `|` in `TC008` ([#​15201](https://redirect.github.com/astral-sh/ruff/pull/15201))
##### Rule changes
- \[`flake8-todos`] Allow VSCode GitHub PR extension style links in `missing-todo-link` (`TD003`) ([#​15519](https://redirect.github.com/astral-sh/ruff/pull/15519))
- \[`pyflakes`] Show syntax error message for `F722` ([#​15523](https://redirect.github.com/astral-sh/ruff/pull/15523))
##### Formatter
- Fix curly bracket spacing around f-string expressions containing curly braces ([#​15471](https://redirect.github.com/astral-sh/ruff/pull/15471))
- Fix joining of f-strings with different quotes when using quote style `Preserve` ([#​15524](https://redirect.github.com/astral-sh/ruff/pull/15524))
##### Server
- Avoid indexing the same workspace multiple times ([#​15495](https://redirect.github.com/astral-sh/ruff/pull/15495))
- Display context for `ruff.configuration` errors ([#​15452](https://redirect.github.com/astral-sh/ruff/pull/15452))
##### Configuration
- Remove `flatten` to improve deserialization error messages ([#​15414](https://redirect.github.com/astral-sh/ruff/pull/15414))
##### Bug fixes
- Parse triple-quoted string annotations as if parenthesized ([#​15387](https://redirect.github.com/astral-sh/ruff/pull/15387))
- \[`fastapi`] Update `Annotated` fixes (`FAST002`) ([#​15462](https://redirect.github.com/astral-sh/ruff/pull/15462))
- \[`flake8-bandit`] Check for `builtins` instead of `builtin` (`S102`, `PTH123`) ([#​15443](https://redirect.github.com/astral-sh/ruff/pull/15443))
- \[`flake8-pathlib`] Fix `--select` for `os-path-dirname` (`PTH120`) ([#​15446](https://redirect.github.com/astral-sh/ruff/pull/15446))
- \[`ruff`] Fix false positive on global keyword (`RUF052`) ([#​15235](https://redirect.github.com/astral-sh/ruff/pull/15235))
### [`v0.9.1`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0910)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.9.0...0.9.1)
##### Preview features
- \[`ruff`] Add new rule `RUF059`: Unused unpacked assignment ([#​16449](https://redirect.github.com/astral-sh/ruff/pull/16449))
- \[`syntax-errors`] Detect assignment expressions before Python 3.8 ([#​16383](https://redirect.github.com/astral-sh/ruff/pull/16383))
- \[`syntax-errors`] Named expressions in decorators before Python 3.9 ([#​16386](https://redirect.github.com/astral-sh/ruff/pull/16386))
- \[`syntax-errors`] Parenthesized keyword argument names after Python 3.8 ([#​16482](https://redirect.github.com/astral-sh/ruff/pull/16482))
- \[`syntax-errors`] Positional-only parameters before Python 3.8 ([#​16481](https://redirect.github.com/astral-sh/ruff/pull/16481))
- \[`syntax-errors`] Tuple unpacking in `return` and `yield` before Python 3.8 ([#​16485](https://redirect.github.com/astral-sh/ruff/pull/16485))
- \[`syntax-errors`] Type parameter defaults before Python 3.13 ([#​16447](https://redirect.github.com/astral-sh/ruff/pull/16447))
- \[`syntax-errors`] Type parameter lists before Python 3.12 ([#​16479](https://redirect.github.com/astral-sh/ruff/pull/16479))
- \[`syntax-errors`] `except*` before Python 3.11 ([#​16446](https://redirect.github.com/astral-sh/ruff/pull/16446))
- \[`syntax-errors`] `type` statements before Python 3.12 ([#​16478](https://redirect.github.com/astral-sh/ruff/pull/16478))
##### Bug fixes
- Escape template filenames in glob patterns in configuration ([#​16407](https://redirect.github.com/astral-sh/ruff/pull/16407))
- \[`flake8-simplify`] Exempt unittest context methods for `SIM115` rule ([#​16439](https://redirect.github.com/astral-sh/ruff/pull/16439))
- Formatter: Fix syntax error location in notebooks ([#​16499](https://redirect.github.com/astral-sh/ruff/pull/16499))
- \[`pyupgrade`] Do not offer fix when at least one target is `global`/`nonlocal` (`UP028`) ([#​16451](https://redirect.github.com/astral-sh/ruff/pull/16451))
- \[`flake8-builtins`] Ignore variables matching module attribute names (`A001`) ([#​16454](https://redirect.github.com/astral-sh/ruff/pull/16454))
- \[`pylint`] Convert `code` keyword argument to a positional argument in fix for (`PLR1722`) ([#​16424](https://redirect.github.com/astral-sh/ruff/pull/16424))
##### CLI
- Move rule code from `description` to `check_name` in GitLab output serializer ([#​16437](https://redirect.github.com/astral-sh/ruff/pull/16437))
##### Documentation
- \[`pydocstyle`] Clarify that `D417` only checks docstrings with an arguments section ([#​16494](https://redirect.github.com/astral-sh/ruff/pull/16494))
### [`v0.9.0`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#090)
[Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.8.6...0.9.0)
Check out the [blog post](https://astral.sh/blog/ruff-v0.9.0) for a migration guide and overview of the changes!
##### Breaking changes
Ruff now formats your code according to the 2025 style guide. As a result, your code might now get formatted differently. See the formatter section for a detailed list of changes.
This release doesn’t remove or remap any existing stable rules.
##### Stabilization
The following rules have been stabilized and are no longer in preview:
- [`stdlib-module-shadowing`](https://docs.astral.sh/ruff/rules/stdlib-module-shadowing/) (`A005`).
This rule has also been renamed: previously, it was called `builtin-module-shadowing`.
- [`builtin-lambda-argument-shadowing`](https://docs.astral.sh/ruff/rules/builtin-lambda-argument-shadowing/) (`A006`)
- [`slice-to-remove-prefix-or-suffix`](https://docs.astral.sh/ruff/rules/slice-to-remove-prefix-or-suffix/) (`FURB188`)
- [`boolean-chained-comparison`](https://docs.astral.sh/ruff/rules/boolean-chained-comparison/) (`PLR1716`)
- [`decimal-from-float-literal`](https://docs.astral.sh/ruff/rules/decimal-from-float-literal/) (`RUF032`)
- [`post-init-default`](https://docs.astral.sh/ruff/rules/post-init-default/) (`RUF033`)
- [`useless-if-else`](https://docs.astral.sh/ruff/rules/useless-if-else/) (`RUF034`)
The following behaviors have been stabilized:
- [`pytest-parametrize-names-wrong-type`](https://docs.astral.sh/ruff/rules/pytest-parametrize-names-wrong-type/) (`PT006`): Detect [`pytest.parametrize`](https://docs.pytest.org/en/7.1.x/how-to/parametrize.html#parametrize) calls outside decorators and calls with keyword arguments.
- [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/) (`E402`): Ignore [`pytest.importorskip`](https://docs.pytest.org/en/7.1.x/reference/reference.html#pytest-importorskip) calls between import statements.
- [`mutable-dataclass-default`](https://docs.astral.sh/ruff/rules/mutable-dataclass-default/) (`RUF008`) and [`function-call-in-dataclass-default-argument`](https://docs.astral.sh/ruff/rules/function-call-in-dataclass-default-argument/) (`RUF009`): Add support for [`attrs`](https://www.attrs.org/en/stable/).
- [`bad-version-info-comparison`](https://docs.astral.sh/ruff/rules/bad-version-info-comparison/) (`PYI006`): Extend the rule to check non-stub files.
The following fixes or improvements to fixes have been stabilized:
- [`redundant-numeric-union`](https://docs.astral.sh/ruff/rules/redundant-numeric-union/) (`PYI041`)
- [`duplicate-union-members`](https://docs.astral.sh/ruff/rules/duplicate-union-member/) (`PYI016`)
##### Formatter
This release introduces the new 2025 stable style ([#​13371](https://redirect.github.com/astral-sh/ruff/issues/13371)), stabilizing the following changes:
- Format expressions in f-string elements ([#​7594](https://redirect.github.com/astral-sh/ruff/issues/7594))
- Alternate quotes for strings inside f-strings ([#​13860](https://redirect.github.com/astral-sh/ruff/pull/13860))
- Preserve the casing of hex codes in f-string debug expressions ([#​14766](https://redirect.github.com/astral-sh/ruff/issues/14766))
- Choose the quote style for each string literal in an implicitly concatenated f-string rather than for the entire string ([#​13539](https://redirect.github.com/astral-sh/ruff/pull/13539))
- Automatically join an implicitly concatenated string into a single string literal if it fits on a single line ([#​9457](https://redirect.github.com/astral-sh/ruff/issues/9457))
- Remove the [`ISC001`](https://docs.astral.sh/ruff/rules/single-line-implicit-string-concatenation/) incompatibility warning ([#​15123](https://redirect.github.com/astral-sh/ruff/pull/15123))
- Prefer parenthesizing the `assert` message over breaking the assertion expression ([#​9457](https://redirect.github.com/astral-sh/ruff/issues/9457))
- Automatically parenthesize over-long `if` guards in `match` `case` clauses ([#​13513](https://redirect.github.com/astral-sh/ruff/pull/13513))
- More consistent formatting for `match` `case` patterns ([#​6933](https://redirect.github.com/astral-sh/ruff/issues/6933))
- Avoid unnecessary parentheses around return type annotations ([#​13381](https://redirect.github.com/astral-sh/ruff/pull/13381))
- Keep the opening parentheses on the same line as the `if` keyword for comprehensions where the condition has a leading comment ([#​12282](https://redirect.github.com/astral-sh/ruff/pull/12282))
- More consistent formatting for `with` statements with a single context manager for Python 3.8 or older ([#​10276](https://redirect.github.com/astral-sh/ruff/pull/10276))
- Correctly calculate the line-width for code blocks in docstrings when using `max-doc-code-line-length = "dynamic"` ([#​13523](https://redirect.github.com/astral-sh/ruff/pull/13523))
##### Preview features
- \[`flake8-bugbear`] Implement `class-as-data-structure` (`B903`) ([#​9601](https://redirect.github.com/astral-sh/ruff/pull/9601))
- \[`flake8-type-checking`] Apply `quoted-type-alias` more eagerly in `TYPE_CHECKING` blocks and ignore it in stubs (`TC008`) ([#​15180](https://redirect.github.com/astral-sh/ruff/pull/15180))
- \[`pylint`] Ignore `eq-without-hash` in stub files (`PLW1641`) ([#​15310](https://redirect.github.com/astral-sh/ruff/pull/15310))
- \[`pyupgrade`] Split `UP007` into two individual rules: `UP007` for `Union` and `UP045` for `Optional` (`UP007`, `UP045`) ([#​15313](https://redirect.github.com/astral-sh/ruff/pull/15313))
- \[`ruff`] New rule that detects classes that are both an enum and a `dataclass` (`RUF049`) ([#​15299](https://redirect.github.com/astral-sh/ruff/pull/15299))
- \[`ruff`] Recode `RUF025` to `RUF037` (`RUF037`) ([#​15258](https://redirect.github.com/astral-sh/ruff/pull/15258))
##### Rule changes
- \[`flake8-builtins`] Ignore [`stdlib-module-shadowing`](https://docs.astral.sh/ruff/rules/stdlib-module-shadowing/) in stub files(`A005`) ([#​15350](https://redirect.github.com/astral-sh/ruff/pull/15350))
- \[`flake8-return`] Add support for functions returning `typing.Never` (`RET503`) ([#​15298](https://redirect.github.com/astral-sh/ruff/pull/15298))
##### Server
- Improve the observability by removing the need for the ["trace" value](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#traceValue) to turn on or off logging. The server logging is solely controlled using the [`logLevel` server setting](https://docs.astral.sh/ruff/editors/settings/#loglevel)
which defaults to `info`. This addresses the issue where users were notified about an error and told to consult the log, but it didn’t contain any messages. ([#​15232](https://redirect.github.com/astral-sh/ruff/pull/15232))
- Ignore diagnostics from other sources for code action requests ([#​15373](https://redirect.github.com/astral-sh/ruff/pull/15373))
##### CLI
- Improve the error message for `--config key=value` when the `key` is for a table and it’s a simple `value`
##### Bug fixes
- \[`eradicate`] Ignore metadata blocks directly followed by normal blocks (`ERA001`) ([#​15330](https://redirect.github.com/astral-sh/ruff/pull/15330))
- \[`flake8-django`] Recognize other magic methods (`DJ012`) ([#​15365](https://redirect.github.com/astral-sh/ruff/pull/15365))
- \[`pycodestyle`] Avoid false positives related to type aliases (`E252`) ([#​15356](https
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "every weekend" in timezone Etc/UTC, 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 was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/canonical/craft-grammar).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDAuMCIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->
Evaluation history
| Date | Model | Scores | Action | Summary |
|---|---|---|---|---|
| qwen/qwen3.6-35b-a3b | — | — | Merged automated dependency update upgrading ruff from ~=0.7.0 to ~=0.11.2. Approved by one reviewer, passed all CI checks, and modified a single configuration file. | |
| qwen3.6-35b-a3b-mtp-q6 | — | — | Merged automated dependency update upgrading ruff from 0.7.0 to 0.11.2. The change passed compatibility checks and integrated the latest linter and formatter improvements into the main branch. |
Update history
No update history recorded yet.
Related issues
| Issue | Project | State | Summary | Similarity |
|---|---|---|---|---|
| #63 build(deps): update dependency ruff to ~=0.7.0 | craft-grammar | merged | Merged automated dependency update upgrading ruff from 0.6.1 to 0.7.0. Approved by one reviewer, passed CI checks, and successfully integrated into the main branch. | |
| #41 build(deps): update to ruff 0.6.1 | craft-grammar | merged | Merged after receiving approval from two reviewers and passing CI checks. The pull request updates the ruff dependency to version 0.6.1 across three files. | |
| #179 build(deps): update ruff to 0.4.4 | craft-store | merged | Merged update to ruff version 0.4.4. Approved by two reviewers and passed CI checks. The change modified three files with a net addition of five lines. | |
| #43 build(deps): update dependency ruff to ~=0.6.1 - autoclosed | craft-grammar | closed | Renovate automatically closed this dependency update for ruff to version 0.6.1 without merging. The pull request was autoclosed, leaving the change unapplied. | |
| #71 build(deps): update dependency ruff to ~=0.9.3 - autoclosed | craft-grammar | closed | The ruff dependency update to version 0.9.3 was autoclosed without merging. It was superseded by a newer update or abandoned due to staleness. | |
| #165 build(deps): update ruff-pre-commit to v0.15.16 (main) | debcraft | merged | Merged automated dependency update for ruff-pre-commit from v0.15.15 to v0.15.16. Approved by two reviewers, passed CI checks, and merged into main via Renovate. | |
| #589 chore(deps): update dependency ruff to v0.1.14 | craft-parts | merged | Merged automated dependency update for ruff from v0.1.6 to v0.1.14. Approved by two reviewers with passing CI checks. Updated a single configuration file to apply the new version constraint. | |
| #1606 build(deps): update ruff-pre-commit to v0.15.15 (main) | craft-parts | merged | Merged automated dependency update for astral-sh/ruff-pre-commit from v0.15.12 to v0.15.15. Approved by two reviewers, passed CI checks, and automatically merged into main by Renovate. | |
| #323 build(deps): update bugfixes (main) | craft-store | merged | Merged automated dependency updates for ruff-pre-commit to v0.13.2 and coverage to v7.10.7. Approved by two reviewers, passed all CI checks, and merged via automerge into the main branch. | |
| #423 chore(deps): update dependency ruff to v0.1.6 | rockcraft | merged | Merged automated dependency update upgrading ruff from v0.1.1 to v0.1.6. Approved by two reviewers, passed CI checks, and applied with a minimal two-line change across two files. |