Update dependency ruff to ~=0.15.12 #6

Merged
cswimr merged 1 commit from renovate/ruff-0.x into main 2026-04-28 10:03:19 -04:00
Member

This PR contains the following updates:

Package Change Age Confidence
ruff (source, changelog) ~=0.14.4~=0.15.12 age confidence

Release Notes

astral-sh/ruff (ruff)

v0.15.12

Compare Source

Released on 2026-04-24.

Preview features
  • Implement #ruff:file-ignore file-level suppressions (#​23599)
  • Implement #ruff:ignore logical-line suppressions (#​23404)
  • Revert preview changes to displayed diagnostic severity in LSP (#​24789)
  • [airflow] Implement task-branch-as-short-circuit (AIR004) (#​23579)
  • [flake8-bugbear] Fix break/continue handling in loop-iterator-mutation (B909) (#​24440)
  • [pylint] Fix PLC2701 for type parameter scopes (#​24576)
Rule changes
  • [pandas-vet] Suggest .array as well in PD011 (#​24805)
CLI
  • Respect default Unix permissions for cache files (#​24794)
Documentation
  • [pylint] Fix PLR0124 description not to claim self-comparison always returns the same value (#​24749)
  • [pyupgrade] Expand docs on reusable TypeVars and scoping (UP046) (#​24153)
  • Improve rules table accessibility (#​24711)
Contributors

v0.15.11

Compare Source

Released on 2026-04-16.

Preview features
  • [ruff] Ignore RUF029 when function is decorated with asynccontextmanager (#​24642)
  • [airflow] Implement airflow-xcom-pull-in-template-string (AIR201) (#​23583)
  • [flake8-bandit] Fix S103 false positives and negatives in mask analysis (#​24424)
Bug fixes
  • [flake8-async] Omit overridden methods for ASYNC109 (#​24648)
Documentation
  • [flake8-async] Add override mention to ASYNC109 docs (#​24666)
  • Update Neovim config examples to use vim.lsp.config (#​24577)
Contributors

v0.15.10

Compare Source

Released on 2026-04-09.

Preview features
  • [flake8-logging] Allow closures in except handlers (LOG004) (#​24464)
  • [flake8-self] Make SLF diagnostics robust to non-self-named variables (#​24281)
  • [flake8-simplify] Make the fix for collapsible-if safe in preview (SIM102) (#​24371)
Bug fixes
  • Avoid emitting multi-line f-string elements before Python 3.12 (#​24377)
  • Avoid syntax error from E502 fixes in f-strings and t-strings (#​24410)
  • Strip form feeds from indent passed to dedent_to (#​24381)
  • [pyupgrade] Fix panic caused by handling of octals (UP012) (#​24390)
  • Reject multi-line f-string elements before Python 3.12 (#​24355)
Rule changes
  • [ruff] Treat f-string interpolation as potential side effect (RUF019) (#​24426)
Server
  • Add support for custom file extensions (#​24463)
Documentation
  • Document adding fixes in CONTRIBUTING.md (#​24393)
  • Fix JSON typo in settings example (#​24517)
Contributors

v0.15.9

Compare Source

Released on 2026-04-02.

Preview features
  • [pyflakes] Flag annotated variable redeclarations as F811 in preview mode (#​24244)
  • [ruff] Allow dunder-named assignments in non-strict mode for RUF067 (#​24089)
Bug fixes
  • [flake8-errmsg] Avoid shadowing existing msg in fix for EM101 (#​24363)
  • [flake8-simplify] Ignore pre-initialization references in SIM113 (#​24235)
  • [pycodestyle] Fix W391 fixes for consecutive empty notebook cells (#​24236)
  • [pyupgrade] Fix UP008 nested class matching (#​24273)
  • [pyupgrade] Ignore strings with string-only escapes (UP012) (#​16058)
  • [ruff] RUF072: skip formfeeds on dedent (#​24308)
  • [ruff] Avoid re-using symbol in RUF024 fix (#​24316)
  • [ruff] Parenthesize expression in RUF050 fix (#​24234)
  • Disallow starred expressions as values of starred expressions (#​24280)
Rule changes
  • [flake8-simplify] Suppress SIM105 for except* before Python 3.12 (#​23869)
  • [pyflakes] Extend F507 to flag %-format strings with zero placeholders (#​24215)
  • [pyupgrade] UP018 should detect more unnecessarily wrapped literals (UP018) (#​24093)
  • [pyupgrade] Fix UP008 callable scope handling to support lambdas (#​24274)
  • [ruff] RUF010: Mark fix as unsafe when it deletes a comment (#​24270)
Formatter
  • Add nested-string-quote-style formatting option (#​24312)
Documentation
  • [flake8-bugbear] Clarify RUF071 fix safety for non-path string comparisons (#​24149)
  • [flake8-type-checking] Clarify import cycle wording for TC001/TC002/TC003 (#​24322)
Other changes
  • Avoid rendering fix lines with trailing whitespace after | (#​24343)
Contributors

v0.15.8

Compare Source

Released on 2026-03-26.

Preview features
  • [ruff] New rule unnecessary-if (RUF050) (#​24114)
  • [ruff] New rule useless-finally (RUF072) (#​24165)
  • [ruff] New rule f-string-percent-format (RUF073): warn when using % operator on an f-string (#​24162)
  • [pyflakes] Recognize frozendict as a builtin for Python 3.15+ (#​24100)
Bug fixes
  • [flake8-async] Use fully-qualified anyio.lowlevel import in autofix (ASYNC115) (#​24166)
  • [flake8-bandit] Check tuple arguments for partial paths in S607 (#​24080)
  • [pyflakes] Skip undefined-name (F821) for conditionally deleted variables (#​24088)
  • E501/W505/formatter: Exclude nested pragma comments from line width calculation (#​24071)
  • Fix %foo? parsing in IPython assignment expressions (#​24152)
  • analyze graph: resolve string imports that reference attributes, not just modules (#​24058)
Rule changes
  • [eradicate] ignore ty: ignore comments in ERA001 (#​24192)
  • [flake8-bandit] Treat sys.executable as trusted input in S603 (#​24106)
  • [flake8-self] Recognize Self annotation and self assignment in SLF001 (#​24144)
  • [pyflakes] F507: Fix false negative for non-tuple RHS in %-formatting (#​24142)
  • [refurb] Parenthesize generator arguments in FURB142 fixer (#​24200)
Performance
Server
  • Warn when Markdown files are skipped due to preview being disabled (#​24150)
Documentation
  • Clarify extend-ignore and extend-select settings documentation (#​24064)
  • Mention AI policy in PR template (#​24198)
Other changes
  • Use trusted publishing for NPM packages (#​24171)
Contributors

v0.15.7

Compare Source

Released on 2026-03-19.

Preview features
  • Display output severity in preview (#​23845)
  • Don't show noqa hover for non-Python documents (#​24040)
Rule changes
  • [pycodestyle] Recognize pyrefly: as a pragma comment (E501) (#​24019)
Server
  • Don't return code actions for non-Python documents (#​23905)
Documentation
  • Add company AI policy to contributing guide (#​24021)
  • Document editor features for Markdown code formatting (#​23924)
  • [pylint] Improve phrasing (PLC0208) (#​24033)
Other changes
  • Use PEP 639 license information (#​19661)
Contributors

v0.15.6

Compare Source

Released on 2026-03-12.

Preview features
  • Add support for lazy import parsing (#​23755)
  • Add support for star-unpacking of comprehensions (PEP 798) (#​23788)
  • Reject semantic syntax errors for lazy imports (#​23757)
  • Drop a few rules from the preview default set (#​23879)
  • [airflow] Flag Variable.get() calls outside of task execution context (AIR003) (#​23584)
  • [airflow] Flag runtime-varying values in DAG/task constructor arguments (AIR304) (#​23631)
  • [flake8-bugbear] Implement delattr-with-constant (B043) (#​23737)
  • [flake8-tidy-imports] Add TID254 to enforce lazy imports (#​23777)
  • [flake8-tidy-imports] Allow users to ban lazy imports with TID254 (#​23847)
  • [isort] Retain lazy keyword when sorting imports (#​23762)
  • [pyupgrade] Add from __future__ import annotations automatically (UP006) (#​23260)
  • [refurb] Support newline parameter in FURB101 for Python 3.13+ (#​23754)
  • [ruff] Add os-path-commonprefix (RUF071) (#​23814)
  • [ruff] Add unsafe fix for os-path-commonprefix (RUF071) (#​23852)
  • [ruff] Limit RUF036 to typing contexts; make it unsafe for non-typing-only (#​23765)
  • [ruff] Use starred unpacking for RUF017 in Python 3.15+ (#​23789)
Bug fixes
  • Fix --add-noqa creating unwanted leading whitespace (#​23773)
  • Fix --add-noqa breaking shebangs (#​23577)
  • [formatter] Fix lambda body formatting for multiline calls and subscripts (#​23866)
  • [formatter] Preserve required annotation parentheses in annotated assignments (#​23865)
  • [formatter] Preserve type-expression parentheses in the formatter (#​23867)
  • [flake8-annotations] Fix stack overflow in ANN401 on quoted annotations with escape sequences (#​23912)
  • [pep8-naming] Check naming conventions in match pattern bindings (N806, N815, N816) (#​23899)
  • [perflint] Fix comment duplication in fixes (PERF401, PERF403) (#​23729)
  • [pyupgrade] Properly trigger super change in nested class (UP008) (#​22677)
  • [ruff] Avoid syntax errors in RUF036 fixes (#​23764)
Rule changes
  • [flake8-bandit] Flag S501 with requests.request (#​23873)
  • [flake8-executable] Fix WSL detection in non-Docker containers (#​22879)
  • [flake8-print] Ignore pprint calls with stream= (#​23787)
Documentation
  • Update docs for Markdown code block formatting (#​23871)
  • [flake8-bugbear] Fix misleading description for B904 (#​23731)
Contributors

v0.15.5

Compare Source

Released on 2026-03-05.

Preview features
  • Discover Markdown files by default in preview mode (#​23434)
  • [perflint] Extend PERF102 to comprehensions and generators (#​23473)
  • [refurb] Fix FURB101 and FURB103 false positives when I/O variable is used later (#​23542)
  • [ruff] Add fix for none-not-at-end-of-union (RUF036) (#​22829)
  • [ruff] Fix false positive for re.split with empty string pattern (RUF055) (#​23634)
Bug fixes
  • [fastapi] Handle callable class dependencies with __call__ method (FAST003) (#​23553)
  • [pydocstyle] Fix numpy section ordering (D420) (#​23685)
  • [pyflakes] Fix false positive for names shadowing re-exports (F811) (#​23356)
  • [pyupgrade] Avoid inserting redundant None elements in UP045 (#​23459)
Documentation
  • Document extension mapping for Markdown code formatting (#​23574)
  • Update default Python version examples (#​23605)
Other changes
  • Publish releases to Astral mirror (#​23616)
Contributors

v0.15.4

Compare Source

Released on 2026-02-26.

This is a follow-up release to 0.15.3 that resolves a panic when the new rule PLR1712 was enabled with any rule that analyzes definitions, such as many of the ANN or D rules.

Bug fixes
  • Fix panic on access to definitions after analyzing definitions (#​23588)
  • [pyflakes] Suppress false positive in F821 for names used before del in stub files (#​23550)
Documentation
  • Clarify first-party import detection in Ruff (#​23591)
  • Fix incorrect import-heading example (#​23568)
Contributors

v0.15.3

Compare Source

Released on 2026-02-26.

Preview features
  • Drop explicit support for .qmd file extension (#​23572)

    This can now be enabled instead by setting the extension option:

    # ruff.toml
    extension = { qmd = "markdown" }
    
    # pyproject.toml
    [tool.ruff]
    extension = { qmd = "markdown" }
    
  • Include configured extensions in file discovery (#​23400)

  • [flake8-bandit] Allow suspicious imports in TYPE_CHECKING blocks (S401-S415) (#​23441)

  • [flake8-bugbear] Allow B901 in pytest hook wrappers (#​21931)

  • [flake8-import-conventions] Add missing conventions from upstream (ICN001, ICN002) (#​21373)

  • [pydocstyle] Add rule to enforce docstring section ordering (D420) (#​23537)

  • [pylint] Implement swap-with-temporary-variable (PLR1712) (#​22205)

  • [ruff] Add unnecessary-assign-before-yield (RUF070) (#​23300)

  • [ruff] Support file-level noqa in RUF102 (#​23535)

  • [ruff] Suppress diagnostic for invalid f-strings before Python 3.12 (RUF027) (#​23480)

  • [flake8-bandit] Don't flag BaseLoader/CBaseLoader as unsafe (S506) (#​23510)

Bug fixes
  • Avoid infinite loop between I002 and PYI025 (#​23352)
  • [pyflakes] Fix false positive for @overload from lint.typing-modules (F811) (#​23357)
  • [pyupgrade] Fix false positive for TypeVar default before Python 3.12 (UP046) (#​23540)
  • [pyupgrade] Fix handling of \N in raw strings (UP032) (#​22149)
Rule changes
  • Render sub-diagnostics in the GitHub output format (#​23455)

  • [flake8-bugbear] Tag certain B007 diagnostics as unnecessary (#​23453)

  • [ruff] Ignore unknown rule codes in RUF100 (#​23531)

    These are now flagged by RUF102 instead.

Documentation
  • Fix missing settings links for several linters (#​23519)
  • Update isort action comments heading (#​23515)
  • [pydocstyle] Fix double comma in description of D404 (#​23440)
Other changes
  • Update the Python module (notably find_ruff_bin) for parity with uv (#​23406)
Contributors

v0.15.2

Compare Source

Released on 2026-02-19.

Preview features
Bug fixes
  • [flake8-async] Fix in_async_context logic (#​23426)
  • [ruff] Fix for RUF102 should delete entire comment (#​23380)
  • [ruff] Suppress diagnostic for strings with backslashes in interpolations before Python 3.12 (RUF027) (#​21069)
  • [flake8-bugbear] Fix B023 false positive for immediately-invoked lambdas (#​23294)
  • [parser] Fix false syntax error for match-like annotated assignments (#​23297)
  • [parser] Fix indentation tracking after line continuations (#​23417)
Rule changes
  • [flake8-executable] Allow global flags in uv shebangs (EXE003) (#​22582)
  • [pyupgrade] Fix handling of typing.{io,re} (UP035) (#​23131)
  • [ruff] Detect PLC0207 on chained str.split() calls (#​23275)
CLI
  • Remove invalid inline noqa warning (#​23270)
Configuration
  • Add extension mapping to configuration file options (#​23384)
Documentation
  • Add Q004 to the list of conflicting rules (#​23340)
  • [ruff] Expand lint.external docs and add sub-diagnostic (RUF100, RUF102) (#​23268)
Contributors

v0.15.1

Compare Source

Released on 2026-04-24.

Preview features
  • Implement #ruff:file-ignore file-level suppressions (#​23599)
  • Implement #ruff:ignore logical-line suppressions (#​23404)
  • Revert preview changes to displayed diagnostic severity in LSP (#​24789)
  • [airflow] Implement task-branch-as-short-circuit (AIR004) (#​23579)
  • [flake8-bugbear] Fix break/continue handling in loop-iterator-mutation (B909) (#​24440)
  • [pylint] Fix PLC2701 for type parameter scopes (#​24576)
Rule changes
  • [pandas-vet] Suggest .array as well in PD011 (#​24805)
CLI
  • Respect default Unix permissions for cache files (#​24794)
Documentation
  • [pylint] Fix PLR0124 description not to claim self-comparison always returns the same value (#​24749)
  • [pyupgrade] Expand docs on reusable TypeVars and scoping (UP046) (#​24153)
  • Improve rules table accessibility (#​24711)
Contributors

v0.15.0

Compare Source

Released on 2026-02-03.

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

Breaking changes
  • Ruff now formats your code according to the 2026 style guide. See the formatter section below or in the blog post for a detailed list of changes.

  • The linter now supports block suppression comments. For example, to suppress N803 for all parameters in this function:

    # ruff: disable[N803]
    def foo(
        legacyArg1,
        legacyArg2,
        legacyArg3,
        legacyArg4,
    ): ...
    # ruff: enable[N803]
    

    See the documentation for more details.

  • The ruff:alpine Docker image is now based on Alpine 3.23 (up from 3.21).

  • The ruff:debian and ruff:debian-slim Docker images are now based on Debian 13 "Trixie" instead of Debian 12 "Bookworm."

  • Binaries for the ppc64 (64-bit big-endian PowerPC) architecture are no longer included in our releases. It should still be possible to build Ruff manually for this platform, if needed.

  • Ruff now resolves all extended configuration files before falling back on a default Python version.

Stabilization

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

The following behaviors have been stabilized:

  • The --output-format flag is now respected when running Ruff in --watch mode, and the full output format is now used by default, matching the regular CLI output.
  • builtin-attribute-shadowing (A003) now detects the use of shadowed built-in names in additional contexts like decorators, default arguments, and other attribute definitions.
  • duplicate-union-member (PYI016) now considers typing.Optional when searching for duplicate union members.
  • split-static-string (SIM905) now offers an autofix when the maxsplit argument is provided, even without a sep argument.
  • dict-get-with-none-default (SIM910) now applies to more types of key expressions.
  • super-call-with-parameters (UP008) now has a safe fix when it will not delete comments.
  • unnecessary-default-type-args (UP043) now applies to stub (.pyi) files on Python versions before 3.13.
Formatter

This release introduces the new 2026 style guide, with the following changes:

  • Lambda parameters are now kept on the same line and lambda bodies will be parenthesized to let
    them break across multiple lines (#​21385)
  • Parentheses around tuples of exceptions in except clauses will now be removed on Python 3.14 and
    later (#​20768)
  • A single empty line is now permitted at the beginning of function bodies (#​21110)
  • Parentheses are avoided for long as captures in match statements (#​21176)
  • Extra spaces between escaped quotes and ending triple quotes can now be omitted (#​17216)
  • Blank lines are now enforced before classes with decorators in stub files (#​18888)
Preview features
Bug fixes
  • Fix suppression indentation matching (#​22903)
Rule changes
  • Customize where the fix_title sub-diagnostic appears (#​23044)
  • [FastAPI] Add sub-diagnostic explaining why a fix was unavailable (FAST002) (#​22565)
  • [flake8-annotations] Don't suggest NoReturn for functions raising NotImplementedError (ANN201, ANN202, ANN205, ANN206) (#​21311)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP017) (#​22873)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP020) (#​22872)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP033) (#​22871)
  • [refurb] Do not add abc.ABC if already present (FURB180) (#​22234)
  • [refurb] Make fix unsafe if it deletes comments (FURB110) (#​22768)
  • [ruff] Add sub-diagnostics with permissions (RUF064) (#​22972)
Server
  • Identify notebooks by LSP didOpen instead of .ipynb file extension (#​22810)
CLI
  • Add --color CLI option to force colored output (#​22806)
Documentation
  • Document - stdin convention in CLI help text (#​22817)
  • [refurb] Change example to re.search with ^ anchor (FURB167) (#​22984)
  • Fix link to Sphinx code block directives (#​23041)
  • [pydocstyle] Clarify which quote styles are allowed (D300) (#​22825)
  • [flake8-bugbear] Improve docs for no-explicit-stacklevel (B028) (#​22538)
Other changes
Contributors

Configuration

📅 Schedule: (UTC)

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

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

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

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


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

This PR has been generated by Mend Renovate.

This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [ruff](https://docs.astral.sh/ruff) ([source](https://github.com/astral-sh/ruff), [changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | `~=0.14.4` → `~=0.15.12` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.15.12?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.14.14/0.15.12?slim=true) | --- ### Release Notes <details> <summary>astral-sh/ruff (ruff)</summary> ### [`v0.15.12`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#01512) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.11...0.15.12) Released on 2026-04-24. ##### Preview features - Implement `#ruff:file-ignore` file-level suppressions ([#&#8203;23599](https://github.com/astral-sh/ruff/pull/23599)) - Implement `#ruff:ignore` logical-line suppressions ([#&#8203;23404](https://github.com/astral-sh/ruff/pull/23404)) - Revert preview changes to displayed diagnostic severity in LSP ([#&#8203;24789](https://github.com/astral-sh/ruff/pull/24789)) - \[`airflow`] Implement `task-branch-as-short-circuit` (`AIR004`) ([#&#8203;23579](https://github.com/astral-sh/ruff/pull/23579)) - \[`flake8-bugbear`] Fix `break`/`continue` handling in `loop-iterator-mutation` (`B909`) ([#&#8203;24440](https://github.com/astral-sh/ruff/pull/24440)) - \[`pylint`] Fix `PLC2701` for type parameter scopes ([#&#8203;24576](https://github.com/astral-sh/ruff/pull/24576)) ##### Rule changes - \[`pandas-vet`] Suggest `.array` as well in `PD011` ([#&#8203;24805](https://github.com/astral-sh/ruff/pull/24805)) ##### CLI - Respect default Unix permissions for cache files ([#&#8203;24794](https://github.com/astral-sh/ruff/pull/24794)) ##### Documentation - \[`pylint`] Fix `PLR0124` description not to claim self-comparison always returns the same value ([#&#8203;24749](https://github.com/astral-sh/ruff/pull/24749)) - \[`pyupgrade`] Expand docs on reusable `TypeVar`s and scoping (`UP046`) ([#&#8203;24153](https://github.com/astral-sh/ruff/pull/24153)) - Improve rules table accessibility ([#&#8203;24711](https://github.com/astral-sh/ruff/pull/24711)) ##### Contributors - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;woodruffw](https://github.com/woodruffw) - [@&#8203;avasis-ai](https://github.com/avasis-ai) - [@&#8203;Dev-iL](https://github.com/Dev-iL) - [@&#8203;denyszhak](https://github.com/denyszhak) - [@&#8203;ShipItAndPray](https://github.com/ShipItAndPray) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;augustelalande](https://github.com/augustelalande) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;majiayu000](https://github.com/majiayu000) ### [`v0.15.11`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#01511) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.10...0.15.11) Released on 2026-04-16. ##### Preview features - \[`ruff`] Ignore `RUF029` when function is decorated with `asynccontextmanager` ([#&#8203;24642](https://github.com/astral-sh/ruff/pull/24642)) - \[`airflow`] Implement `airflow-xcom-pull-in-template-string` (`AIR201`) ([#&#8203;23583](https://github.com/astral-sh/ruff/pull/23583)) - \[`flake8-bandit`] Fix `S103` false positives and negatives in mask analysis ([#&#8203;24424](https://github.com/astral-sh/ruff/pull/24424)) ##### Bug fixes - \[`flake8-async`] Omit overridden methods for `ASYNC109` ([#&#8203;24648](https://github.com/astral-sh/ruff/pull/24648)) ##### Documentation - \[`flake8-async`] Add override mention to `ASYNC109` docs ([#&#8203;24666](https://github.com/astral-sh/ruff/pull/24666)) - Update Neovim config examples to use `vim.lsp.config` ([#&#8203;24577](https://github.com/astral-sh/ruff/pull/24577)) ##### Contributors - [@&#8203;augustelalande](https://github.com/augustelalande) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;benberryallwood](https://github.com/benberryallwood) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;Dev-iL](https://github.com/Dev-iL) ### [`v0.15.10`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#01510) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.9...0.15.10) Released on 2026-04-09. ##### Preview features - \[`flake8-logging`] Allow closures in except handlers (`LOG004`) ([#&#8203;24464](https://github.com/astral-sh/ruff/pull/24464)) - \[`flake8-self`] Make `SLF` diagnostics robust to non-self-named variables ([#&#8203;24281](https://github.com/astral-sh/ruff/pull/24281)) - \[`flake8-simplify`] Make the fix for `collapsible-if` safe in `preview` (`SIM102`) ([#&#8203;24371](https://github.com/astral-sh/ruff/pull/24371)) ##### Bug fixes - Avoid emitting multi-line f-string elements before Python 3.12 ([#&#8203;24377](https://github.com/astral-sh/ruff/pull/24377)) - Avoid syntax error from `E502` fixes in f-strings and t-strings ([#&#8203;24410](https://github.com/astral-sh/ruff/pull/24410)) - Strip form feeds from indent passed to `dedent_to` ([#&#8203;24381](https://github.com/astral-sh/ruff/pull/24381)) - \[`pyupgrade`] Fix panic caused by handling of octals (`UP012`) ([#&#8203;24390](https://github.com/astral-sh/ruff/pull/24390)) - Reject multi-line f-string elements before Python 3.12 ([#&#8203;24355](https://github.com/astral-sh/ruff/pull/24355)) ##### Rule changes - \[`ruff`] Treat f-string interpolation as potential side effect (`RUF019`) ([#&#8203;24426](https://github.com/astral-sh/ruff/pull/24426)) ##### Server - Add support for custom file extensions ([#&#8203;24463](https://github.com/astral-sh/ruff/pull/24463)) ##### Documentation - Document adding fixes in CONTRIBUTING.md ([#&#8203;24393](https://github.com/astral-sh/ruff/pull/24393)) - Fix JSON typo in settings example ([#&#8203;24517](https://github.com/astral-sh/ruff/pull/24517)) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;silverstein](https://github.com/silverstein) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;shizukushq](https://github.com/shizukushq) - [@&#8203;zanieb](https://github.com/zanieb) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) ### [`v0.15.9`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0159) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.8...0.15.9) Released on 2026-04-02. ##### Preview features - \[`pyflakes`] Flag annotated variable redeclarations as `F811` in preview mode ([#&#8203;24244](https://github.com/astral-sh/ruff/pull/24244)) - \[`ruff`] Allow dunder-named assignments in non-strict mode for `RUF067` ([#&#8203;24089](https://github.com/astral-sh/ruff/pull/24089)) ##### Bug fixes - \[`flake8-errmsg`] Avoid shadowing existing `msg` in fix for `EM101` ([#&#8203;24363](https://github.com/astral-sh/ruff/pull/24363)) - \[`flake8-simplify`] Ignore pre-initialization references in `SIM113` ([#&#8203;24235](https://github.com/astral-sh/ruff/pull/24235)) - \[`pycodestyle`] Fix `W391` fixes for consecutive empty notebook cells ([#&#8203;24236](https://github.com/astral-sh/ruff/pull/24236)) - \[`pyupgrade`] Fix `UP008` nested class matching ([#&#8203;24273](https://github.com/astral-sh/ruff/pull/24273)) - \[`pyupgrade`] Ignore strings with string-only escapes (`UP012`) ([#&#8203;16058](https://github.com/astral-sh/ruff/pull/16058)) - \[`ruff`] `RUF072`: skip formfeeds on dedent ([#&#8203;24308](https://github.com/astral-sh/ruff/pull/24308)) - \[`ruff`] Avoid re-using symbol in `RUF024` fix ([#&#8203;24316](https://github.com/astral-sh/ruff/pull/24316)) - \[`ruff`] Parenthesize expression in `RUF050` fix ([#&#8203;24234](https://github.com/astral-sh/ruff/pull/24234)) - Disallow starred expressions as values of starred expressions ([#&#8203;24280](https://github.com/astral-sh/ruff/pull/24280)) ##### Rule changes - \[`flake8-simplify`] Suppress `SIM105` for `except*` before Python 3.12 ([#&#8203;23869](https://github.com/astral-sh/ruff/pull/23869)) - \[`pyflakes`] Extend `F507` to flag `%`-format strings with zero placeholders ([#&#8203;24215](https://github.com/astral-sh/ruff/pull/24215)) - \[`pyupgrade`] `UP018` should detect more unnecessarily wrapped literals (UP018) ([#&#8203;24093](https://github.com/astral-sh/ruff/pull/24093)) - \[`pyupgrade`] Fix `UP008` callable scope handling to support lambdas ([#&#8203;24274](https://github.com/astral-sh/ruff/pull/24274)) - \[`ruff`] `RUF010`: Mark fix as unsafe when it deletes a comment ([#&#8203;24270](https://github.com/astral-sh/ruff/pull/24270)) ##### Formatter - Add `nested-string-quote-style` formatting option ([#&#8203;24312](https://github.com/astral-sh/ruff/pull/24312)) ##### Documentation - \[`flake8-bugbear`] Clarify RUF071 fix safety for non-path string comparisons ([#&#8203;24149](https://github.com/astral-sh/ruff/pull/24149)) - \[`flake8-type-checking`] Clarify import cycle wording for `TC001`/`TC002`/`TC003` ([#&#8203;24322](https://github.com/astral-sh/ruff/pull/24322)) ##### Other changes - Avoid rendering fix lines with trailing whitespace after `|` ([#&#8203;24343](https://github.com/astral-sh/ruff/pull/24343)) ##### Contributors - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;tranhoangtu-it](https://github.com/tranhoangtu-it) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;zsol](https://github.com/zsol) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;bitloi](https://github.com/bitloi) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;chinar-amrutkar](https://github.com/chinar-amrutkar) - [@&#8203;second-ed](https://github.com/second-ed) - [@&#8203;getehen](https://github.com/getehen) - [@&#8203;Redovo1](https://github.com/Redovo1) - [@&#8203;matthewlloyd](https://github.com/matthewlloyd) - [@&#8203;zanieb](https://github.com/zanieb) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;RenzoMXD](https://github.com/RenzoMXD) ### [`v0.15.8`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0158) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.7...0.15.8) Released on 2026-03-26. ##### Preview features - \[`ruff`] New rule `unnecessary-if` (`RUF050`) ([#&#8203;24114](https://github.com/astral-sh/ruff/pull/24114)) - \[`ruff`] New rule `useless-finally` (`RUF072`) ([#&#8203;24165](https://github.com/astral-sh/ruff/pull/24165)) - \[`ruff`] New rule `f-string-percent-format` (`RUF073`): warn when using `%` operator on an f-string ([#&#8203;24162](https://github.com/astral-sh/ruff/pull/24162)) - \[`pyflakes`] Recognize `frozendict` as a builtin for Python 3.15+ ([#&#8203;24100](https://github.com/astral-sh/ruff/pull/24100)) ##### Bug fixes - \[`flake8-async`] Use fully-qualified `anyio.lowlevel` import in autofix (`ASYNC115`) ([#&#8203;24166](https://github.com/astral-sh/ruff/pull/24166)) - \[`flake8-bandit`] Check tuple arguments for partial paths in `S607` ([#&#8203;24080](https://github.com/astral-sh/ruff/pull/24080)) - \[`pyflakes`] Skip `undefined-name` (`F821`) for conditionally deleted variables ([#&#8203;24088](https://github.com/astral-sh/ruff/pull/24088)) - `E501`/`W505`/formatter: Exclude nested pragma comments from line width calculation ([#&#8203;24071](https://github.com/astral-sh/ruff/pull/24071)) - Fix `%foo?` parsing in IPython assignment expressions ([#&#8203;24152](https://github.com/astral-sh/ruff/pull/24152)) - `analyze graph`: resolve string imports that reference attributes, not just modules ([#&#8203;24058](https://github.com/astral-sh/ruff/pull/24058)) ##### Rule changes - \[`eradicate`] ignore `ty: ignore` comments in `ERA001` ([#&#8203;24192](https://github.com/astral-sh/ruff/pull/24192)) - \[`flake8-bandit`] Treat `sys.executable` as trusted input in `S603` ([#&#8203;24106](https://github.com/astral-sh/ruff/pull/24106)) - \[`flake8-self`] Recognize `Self` annotation and `self` assignment in `SLF001` ([#&#8203;24144](https://github.com/astral-sh/ruff/pull/24144)) - \[`pyflakes`] `F507`: Fix false negative for non-tuple RHS in `%`-formatting ([#&#8203;24142](https://github.com/astral-sh/ruff/pull/24142)) - \[`refurb`] Parenthesize generator arguments in `FURB142` fixer ([#&#8203;24200](https://github.com/astral-sh/ruff/pull/24200)) ##### Performance - Speed up diagnostic rendering ([#&#8203;24146](https://github.com/astral-sh/ruff/pull/24146)) ##### Server - Warn when Markdown files are skipped due to preview being disabled ([#&#8203;24150](https://github.com/astral-sh/ruff/pull/24150)) ##### Documentation - Clarify `extend-ignore` and `extend-select` settings documentation ([#&#8203;24064](https://github.com/astral-sh/ruff/pull/24064)) - Mention AI policy in PR template ([#&#8203;24198](https://github.com/astral-sh/ruff/pull/24198)) ##### Other changes - Use trusted publishing for NPM packages ([#&#8203;24171](https://github.com/astral-sh/ruff/pull/24171)) ##### Contributors - [@&#8203;bitloi](https://github.com/bitloi) - [@&#8203;Sim-hu](https://github.com/Sim-hu) - [@&#8203;mvanhorn](https://github.com/mvanhorn) - [@&#8203;chinar-amrutkar](https://github.com/chinar-amrutkar) - [@&#8203;markjm](https://github.com/markjm) - [@&#8203;RenzoMXD](https://github.com/RenzoMXD) - [@&#8203;vivekkhimani](https://github.com/vivekkhimani) - [@&#8203;seroperson](https://github.com/seroperson) - [@&#8203;moktamd](https://github.com/moktamd) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;zanieb](https://github.com/zanieb) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;MichaReiser](https://github.com/MichaReiser) ### [`v0.15.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0157) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.6...0.15.7) Released on 2026-03-19. ##### Preview features - Display output severity in preview ([#&#8203;23845](https://github.com/astral-sh/ruff/pull/23845)) - Don't show `noqa` hover for non-Python documents ([#&#8203;24040](https://github.com/astral-sh/ruff/pull/24040)) ##### Rule changes - \[`pycodestyle`] Recognize `pyrefly:` as a pragma comment (`E501`) ([#&#8203;24019](https://github.com/astral-sh/ruff/pull/24019)) ##### Server - Don't return code actions for non-Python documents ([#&#8203;23905](https://github.com/astral-sh/ruff/pull/23905)) ##### Documentation - Add company AI policy to contributing guide ([#&#8203;24021](https://github.com/astral-sh/ruff/pull/24021)) - Document editor features for Markdown code formatting ([#&#8203;23924](https://github.com/astral-sh/ruff/pull/23924)) - \[`pylint`] Improve phrasing (`PLC0208`) ([#&#8203;24033](https://github.com/astral-sh/ruff/pull/24033)) ##### Other changes - Use PEP 639 license information ([#&#8203;19661](https://github.com/astral-sh/ruff/pull/19661)) ##### Contributors - [@&#8203;tmimmanuel](https://github.com/tmimmanuel) - [@&#8203;DimitriPapadopoulos](https://github.com/DimitriPapadopoulos) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;statxc](https://github.com/statxc) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;hunterhogan](https://github.com/hunterhogan) - [@&#8203;renovate](https://github.com/renovate) ### [`v0.15.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0156) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.5...0.15.6) Released on 2026-03-12. ##### Preview features - Add support for `lazy` import parsing ([#&#8203;23755](https://github.com/astral-sh/ruff/pull/23755)) - Add support for star-unpacking of comprehensions (PEP 798) ([#&#8203;23788](https://github.com/astral-sh/ruff/pull/23788)) - Reject semantic syntax errors for lazy imports ([#&#8203;23757](https://github.com/astral-sh/ruff/pull/23757)) - Drop a few rules from the preview default set ([#&#8203;23879](https://github.com/astral-sh/ruff/pull/23879)) - \[`airflow`] Flag `Variable.get()` calls outside of task execution context (`AIR003`) ([#&#8203;23584](https://github.com/astral-sh/ruff/pull/23584)) - \[`airflow`] Flag runtime-varying values in DAG/task constructor arguments (`AIR304`) ([#&#8203;23631](https://github.com/astral-sh/ruff/pull/23631)) - \[`flake8-bugbear`] Implement `delattr-with-constant` (`B043`) ([#&#8203;23737](https://github.com/astral-sh/ruff/pull/23737)) - \[`flake8-tidy-imports`] Add `TID254` to enforce lazy imports ([#&#8203;23777](https://github.com/astral-sh/ruff/pull/23777)) - \[`flake8-tidy-imports`] Allow users to ban lazy imports with `TID254` ([#&#8203;23847](https://github.com/astral-sh/ruff/pull/23847)) - \[`isort`] Retain `lazy` keyword when sorting imports ([#&#8203;23762](https://github.com/astral-sh/ruff/pull/23762)) - \[`pyupgrade`] Add `from __future__ import annotations` automatically (`UP006`) ([#&#8203;23260](https://github.com/astral-sh/ruff/pull/23260)) - \[`refurb`] Support `newline` parameter in `FURB101` for Python 3.13+ ([#&#8203;23754](https://github.com/astral-sh/ruff/pull/23754)) - \[`ruff`] Add `os-path-commonprefix` (`RUF071`) ([#&#8203;23814](https://github.com/astral-sh/ruff/pull/23814)) - \[`ruff`] Add unsafe fix for os-path-commonprefix (`RUF071`) ([#&#8203;23852](https://github.com/astral-sh/ruff/pull/23852)) - \[`ruff`] Limit `RUF036` to typing contexts; make it unsafe for non-typing-only ([#&#8203;23765](https://github.com/astral-sh/ruff/pull/23765)) - \[`ruff`] Use starred unpacking for `RUF017` in Python 3.15+ ([#&#8203;23789](https://github.com/astral-sh/ruff/pull/23789)) ##### Bug fixes - Fix `--add-noqa` creating unwanted leading whitespace ([#&#8203;23773](https://github.com/astral-sh/ruff/pull/23773)) - Fix `--add-noqa` breaking shebangs ([#&#8203;23577](https://github.com/astral-sh/ruff/pull/23577)) - \[formatter] Fix lambda body formatting for multiline calls and subscripts ([#&#8203;23866](https://github.com/astral-sh/ruff/pull/23866)) - \[formatter] Preserve required annotation parentheses in annotated assignments ([#&#8203;23865](https://github.com/astral-sh/ruff/pull/23865)) - \[formatter] Preserve type-expression parentheses in the formatter ([#&#8203;23867](https://github.com/astral-sh/ruff/pull/23867)) - \[`flake8-annotations`] Fix stack overflow in `ANN401` on quoted annotations with escape sequences ([#&#8203;23912](https://github.com/astral-sh/ruff/pull/23912)) - \[`pep8-naming`] Check naming conventions in `match` pattern bindings (`N806`, `N815`, `N816`) ([#&#8203;23899](https://github.com/astral-sh/ruff/pull/23899)) - \[`perflint`] Fix comment duplication in fixes (`PERF401`, `PERF403`) ([#&#8203;23729](https://github.com/astral-sh/ruff/pull/23729)) - \[`pyupgrade`] Properly trigger `super` change in nested class (`UP008`) ([#&#8203;22677](https://github.com/astral-sh/ruff/pull/22677)) - \[`ruff`] Avoid syntax errors in `RUF036` fixes ([#&#8203;23764](https://github.com/astral-sh/ruff/pull/23764)) ##### Rule changes - \[`flake8-bandit`] Flag `S501` with `requests.request` ([#&#8203;23873](https://github.com/astral-sh/ruff/pull/23873)) - \[`flake8-executable`] Fix WSL detection in non-Docker containers ([#&#8203;22879](https://github.com/astral-sh/ruff/pull/22879)) - \[`flake8-print`] Ignore `pprint` calls with `stream=` ([#&#8203;23787](https://github.com/astral-sh/ruff/pull/23787)) ##### Documentation - Update docs for Markdown code block formatting ([#&#8203;23871](https://github.com/astral-sh/ruff/pull/23871)) - \[`flake8-bugbear`] Fix misleading description for `B904` ([#&#8203;23731](https://github.com/astral-sh/ruff/pull/23731)) ##### Contributors - [@&#8203;zsol](https://github.com/zsol) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;Bortlesboat](https://github.com/Bortlesboat) - [@&#8203;sososonia-cyber](https://github.com/sososonia-cyber) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;leandrobbraga](https://github.com/leandrobbraga) - [@&#8203;11happy](https://github.com/11happy) - [@&#8203;Acelogic](https://github.com/Acelogic) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;xvchris](https://github.com/xvchris) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;getehen](https://github.com/getehen) - [@&#8203;Dev-iL](https://github.com/Dev-iL) ### [`v0.15.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0155) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.4...0.15.5) Released on 2026-03-05. ##### Preview features - Discover Markdown files by default in preview mode ([#&#8203;23434](https://github.com/astral-sh/ruff/pull/23434)) - \[`perflint`] Extend `PERF102` to comprehensions and generators ([#&#8203;23473](https://github.com/astral-sh/ruff/pull/23473)) - \[`refurb`] Fix `FURB101` and `FURB103` false positives when I/O variable is used later ([#&#8203;23542](https://github.com/astral-sh/ruff/pull/23542)) - \[`ruff`] Add fix for `none-not-at-end-of-union` (`RUF036`) ([#&#8203;22829](https://github.com/astral-sh/ruff/pull/22829)) - \[`ruff`] Fix false positive for `re.split` with empty string pattern (`RUF055`) ([#&#8203;23634](https://github.com/astral-sh/ruff/pull/23634)) ##### Bug fixes - \[`fastapi`] Handle callable class dependencies with `__call__` method (`FAST003`) ([#&#8203;23553](https://github.com/astral-sh/ruff/pull/23553)) - \[`pydocstyle`] Fix numpy section ordering (`D420`) ([#&#8203;23685](https://github.com/astral-sh/ruff/pull/23685)) - \[`pyflakes`] Fix false positive for names shadowing re-exports (`F811`) ([#&#8203;23356](https://github.com/astral-sh/ruff/pull/23356)) - \[`pyupgrade`] Avoid inserting redundant `None` elements in `UP045` ([#&#8203;23459](https://github.com/astral-sh/ruff/pull/23459)) ##### Documentation - Document extension mapping for Markdown code formatting ([#&#8203;23574](https://github.com/astral-sh/ruff/pull/23574)) - Update default Python version examples ([#&#8203;23605](https://github.com/astral-sh/ruff/pull/23605)) ##### Other changes - Publish releases to Astral mirror ([#&#8203;23616](https://github.com/astral-sh/ruff/pull/23616)) ##### Contributors - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;stakeswky](https://github.com/stakeswky) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;bxff](https://github.com/bxff) - [@&#8203;zsol](https://github.com/zsol) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;kar-ganap](https://github.com/kar-ganap) ### [`v0.15.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0154) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.3...0.15.4) Released on 2026-02-26. This is a follow-up release to 0.15.3 that resolves a panic when the new rule `PLR1712` was enabled with any rule that analyzes definitions, such as many of the `ANN` or `D` rules. ##### Bug fixes - Fix panic on access to definitions after analyzing definitions ([#&#8203;23588](https://github.com/astral-sh/ruff/pull/23588)) - \[`pyflakes`] Suppress false positive in `F821` for names used before `del` in stub files ([#&#8203;23550](https://github.com/astral-sh/ruff/pull/23550)) ##### Documentation - Clarify first-party import detection in Ruff ([#&#8203;23591](https://github.com/astral-sh/ruff/pull/23591)) - Fix incorrect `import-heading` example ([#&#8203;23568](https://github.com/astral-sh/ruff/pull/23568)) ##### Contributors - [@&#8203;stakeswky](https://github.com/stakeswky) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;thejcannon](https://github.com/thejcannon) - [@&#8203;GeObts](https://github.com/GeObts) ### [`v0.15.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0153) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.2...0.15.3) Released on 2026-02-26. ##### Preview features - Drop explicit support for `.qmd` file extension ([#&#8203;23572](https://github.com/astral-sh/ruff/pull/23572)) This can now be enabled instead by setting the [`extension`](https://docs.astral.sh/ruff/settings/#extension) option: ```toml # ruff.toml extension = { qmd = "markdown" } # pyproject.toml [tool.ruff] extension = { qmd = "markdown" } ``` - Include configured extensions in file discovery ([#&#8203;23400](https://github.com/astral-sh/ruff/pull/23400)) - \[`flake8-bandit`] Allow suspicious imports in `TYPE_CHECKING` blocks (`S401`-`S415`) ([#&#8203;23441](https://github.com/astral-sh/ruff/pull/23441)) - \[`flake8-bugbear`] Allow `B901` in pytest hook wrappers ([#&#8203;21931](https://github.com/astral-sh/ruff/pull/21931)) - \[`flake8-import-conventions`] Add missing conventions from upstream (`ICN001`, `ICN002`) ([#&#8203;21373](https://github.com/astral-sh/ruff/pull/21373)) - \[`pydocstyle`] Add rule to enforce docstring section ordering (`D420`) ([#&#8203;23537](https://github.com/astral-sh/ruff/pull/23537)) - \[`pylint`] Implement `swap-with-temporary-variable` (`PLR1712`) ([#&#8203;22205](https://github.com/astral-sh/ruff/pull/22205)) - \[`ruff`] Add `unnecessary-assign-before-yield` (`RUF070`) ([#&#8203;23300](https://github.com/astral-sh/ruff/pull/23300)) - \[`ruff`] Support file-level noqa in `RUF102` ([#&#8203;23535](https://github.com/astral-sh/ruff/pull/23535)) - \[`ruff`] Suppress diagnostic for invalid f-strings before Python 3.12 (`RUF027`) ([#&#8203;23480](https://github.com/astral-sh/ruff/pull/23480)) - \[`flake8-bandit`] Don't flag `BaseLoader`/`CBaseLoader` as unsafe (`S506`) ([#&#8203;23510](https://github.com/astral-sh/ruff/pull/23510)) ##### Bug fixes - Avoid infinite loop between `I002` and `PYI025` ([#&#8203;23352](https://github.com/astral-sh/ruff/pull/23352)) - \[`pyflakes`] Fix false positive for `@overload` from `lint.typing-modules` (`F811`) ([#&#8203;23357](https://github.com/astral-sh/ruff/pull/23357)) - \[`pyupgrade`] Fix false positive for `TypeVar` default before Python 3.12 (`UP046`) ([#&#8203;23540](https://github.com/astral-sh/ruff/pull/23540)) - \[`pyupgrade`] Fix handling of `\N` in raw strings (`UP032`) ([#&#8203;22149](https://github.com/astral-sh/ruff/pull/22149)) ##### Rule changes - Render sub-diagnostics in the GitHub output format ([#&#8203;23455](https://github.com/astral-sh/ruff/pull/23455)) - \[`flake8-bugbear`] Tag certain `B007` diagnostics as unnecessary ([#&#8203;23453](https://github.com/astral-sh/ruff/pull/23453)) - \[`ruff`] Ignore unknown rule codes in `RUF100` ([#&#8203;23531](https://github.com/astral-sh/ruff/pull/23531)) These are now flagged by [`RUF102`](https://docs.astral.sh/ruff/rules/invalid-rule-code/) instead. ##### Documentation - Fix missing settings links for several linters ([#&#8203;23519](https://github.com/astral-sh/ruff/pull/23519)) - Update isort action comments heading ([#&#8203;23515](https://github.com/astral-sh/ruff/pull/23515)) - \[`pydocstyle`] Fix double comma in description of `D404` ([#&#8203;23440](https://github.com/astral-sh/ruff/pull/23440)) ##### Other changes - Update the Python module (notably `find_ruff_bin`) for parity with uv ([#&#8203;23406](https://github.com/astral-sh/ruff/pull/23406)) ##### Contributors - [@&#8203;zanieb](https://github.com/zanieb) - [@&#8203;o1x3](https://github.com/o1x3) - [@&#8203;assadyousuf](https://github.com/assadyousuf) - [@&#8203;kar-ganap](https://github.com/kar-ganap) - [@&#8203;denyszhak](https://github.com/denyszhak) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;Bnyro](https://github.com/Bnyro) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;gcomneno](https://github.com/gcomneno) - [@&#8203;jaap3](https://github.com/jaap3) - [@&#8203;stakeswky](https://github.com/stakeswky) ### [`v0.15.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0152) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.1...0.15.2) Released on 2026-02-19. ##### Preview features - Expand the default rule set ([#&#8203;23385](https://github.com/astral-sh/ruff/pull/23385)) In preview, Ruff now enables a significantly expanded default rule set of 412 rules, up from the stable default set of 59 rules. The new rules are mostly a superset of the stable defaults, with the exception of these rules, which are removed from the preview defaults: - [`multiple-imports-on-one-line`](https://docs.astral.sh/ruff/rules/multiple-imports-on-one-line) (`E401`) - [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file) (`E402`) - [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file) (`E701`) - [`multiple-statements-on-one-line-semicolon`](https://docs.astral.sh/ruff/rules/multiple-statements-on-one-line-semicolon) (`E702`) - [`useless-semicolon`](https://docs.astral.sh/ruff/rules/useless-semicolon) (`E703`) - [`none-comparison`](https://docs.astral.sh/ruff/rules/none-comparison) (`E711`) - [`true-false-comparison`](https://docs.astral.sh/ruff/rules/true-false-comparison) (`E712`) - [`not-in-test`](https://docs.astral.sh/ruff/rules/not-in-test) (`E713`) - [`not-is-test`](https://docs.astral.sh/ruff/rules/not-is-test) (`E714`) - [`type-comparison`](https://docs.astral.sh/ruff/rules/type-comparison) (`E721`) - [`lambda-assignment`](https://docs.astral.sh/ruff/rules/lambda-assignment) (`E731`) - [`ambiguous-variable-name`](https://docs.astral.sh/ruff/rules/ambiguous-variable-name) (`E741`) - [`ambiguous-class-name`](https://docs.astral.sh/ruff/rules/ambiguous-class-name) (`E742`) - [`ambiguous-function-name`](https://docs.astral.sh/ruff/rules/ambiguous-function-name) (`E743`) - [`undefined-local-with-import-star`](https://docs.astral.sh/ruff/rules/undefined-local-with-import-star) (`F403`) - [`undefined-local-with-import-star-usage`](https://docs.astral.sh/ruff/rules/undefined-local-with-import-star-usage) (`F405`) - [`undefined-local-with-nested-import-star-usage`](https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage) (`F406`) - [`forward-annotation-syntax-error`](https://docs.astral.sh/ruff/rules/forward-annotation-syntax-error) (`F722`) If you use preview and prefer the old defaults, you can restore them with configuration like: ```toml # ruff.toml [lint] select = ["E4", "E7", "E9", "F"] # pyproject.toml [tool.ruff.lint] select = ["E4", "E7", "E9", "F"] ``` If you do give them a try, feel free to share your feedback in the [GitHub discussion](https://github.com/astral-sh/ruff/discussions/23203)! - \[`flake8-pyi`] Also check string annotations (`PYI041`) ([#&#8203;19023](https://github.com/astral-sh/ruff/pull/19023)) ##### Bug fixes - \[`flake8-async`] Fix `in_async_context` logic ([#&#8203;23426](https://github.com/astral-sh/ruff/pull/23426)) - \[`ruff`] Fix for `RUF102` should delete entire comment ([#&#8203;23380](https://github.com/astral-sh/ruff/pull/23380)) - \[`ruff`] Suppress diagnostic for strings with backslashes in interpolations before Python 3.12 (`RUF027`) ([#&#8203;21069](https://github.com/astral-sh/ruff/pull/21069)) - \[`flake8-bugbear`] Fix `B023` false positive for immediately-invoked lambdas ([#&#8203;23294](https://github.com/astral-sh/ruff/pull/23294)) - \[parser] Fix false syntax error for match-like annotated assignments ([#&#8203;23297](https://github.com/astral-sh/ruff/pull/23297)) - \[parser] Fix indentation tracking after line continuations ([#&#8203;23417](https://github.com/astral-sh/ruff/pull/23417)) ##### Rule changes - \[`flake8-executable`] Allow global flags in uv shebangs (`EXE003`) ([#&#8203;22582](https://github.com/astral-sh/ruff/pull/22582)) - \[`pyupgrade`] Fix handling of `typing.{io,re}` (`UP035`) ([#&#8203;23131](https://github.com/astral-sh/ruff/pull/23131)) - \[`ruff`] Detect `PLC0207` on chained `str.split()` calls ([#&#8203;23275](https://github.com/astral-sh/ruff/pull/23275)) ##### CLI - Remove invalid inline `noqa` warning ([#&#8203;23270](https://github.com/astral-sh/ruff/pull/23270)) ##### Configuration - Add extension mapping to configuration file options ([#&#8203;23384](https://github.com/astral-sh/ruff/pull/23384)) ##### Documentation - Add `Q004` to the list of conflicting rules ([#&#8203;23340](https://github.com/astral-sh/ruff/pull/23340)) - \[`ruff`] Expand `lint.external` docs and add sub-diagnostic (`RUF100`, `RUF102`) ([#&#8203;23268](https://github.com/astral-sh/ruff/pull/23268)) ##### Contributors - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;Jkhall81](https://github.com/Jkhall81) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;harupy](https://github.com/harupy) - [@&#8203;ngnpope](https://github.com/ngnpope) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;kar-ganap](https://github.com/kar-ganap) - [@&#8203;robsdedude](https://github.com/robsdedude) - [@&#8203;shaanmajid](https://github.com/shaanmajid) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;toslunar](https://github.com/toslunar) ### [`v0.15.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#01512) [Compare Source](https://github.com/astral-sh/ruff/compare/0.15.0...0.15.1) Released on 2026-04-24. ##### Preview features - Implement `#ruff:file-ignore` file-level suppressions ([#&#8203;23599](https://github.com/astral-sh/ruff/pull/23599)) - Implement `#ruff:ignore` logical-line suppressions ([#&#8203;23404](https://github.com/astral-sh/ruff/pull/23404)) - Revert preview changes to displayed diagnostic severity in LSP ([#&#8203;24789](https://github.com/astral-sh/ruff/pull/24789)) - \[`airflow`] Implement `task-branch-as-short-circuit` (`AIR004`) ([#&#8203;23579](https://github.com/astral-sh/ruff/pull/23579)) - \[`flake8-bugbear`] Fix `break`/`continue` handling in `loop-iterator-mutation` (`B909`) ([#&#8203;24440](https://github.com/astral-sh/ruff/pull/24440)) - \[`pylint`] Fix `PLC2701` for type parameter scopes ([#&#8203;24576](https://github.com/astral-sh/ruff/pull/24576)) ##### Rule changes - \[`pandas-vet`] Suggest `.array` as well in `PD011` ([#&#8203;24805](https://github.com/astral-sh/ruff/pull/24805)) ##### CLI - Respect default Unix permissions for cache files ([#&#8203;24794](https://github.com/astral-sh/ruff/pull/24794)) ##### Documentation - \[`pylint`] Fix `PLR0124` description not to claim self-comparison always returns the same value ([#&#8203;24749](https://github.com/astral-sh/ruff/pull/24749)) - \[`pyupgrade`] Expand docs on reusable `TypeVar`s and scoping (`UP046`) ([#&#8203;24153](https://github.com/astral-sh/ruff/pull/24153)) - Improve rules table accessibility ([#&#8203;24711](https://github.com/astral-sh/ruff/pull/24711)) ##### Contributors - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;woodruffw](https://github.com/woodruffw) - [@&#8203;avasis-ai](https://github.com/avasis-ai) - [@&#8203;Dev-iL](https://github.com/Dev-iL) - [@&#8203;denyszhak](https://github.com/denyszhak) - [@&#8203;ShipItAndPray](https://github.com/ShipItAndPray) - [@&#8203;anishgirianish](https://github.com/anishgirianish) - [@&#8203;augustelalande](https://github.com/augustelalande) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;majiayu000](https://github.com/majiayu000) ### [`v0.15.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0150) [Compare Source](https://github.com/astral-sh/ruff/compare/0.14.14...0.15.0) Released on 2026-02-03. Check out the [blog post](https://astral.sh/blog/ruff-v0.15.0) for a migration guide and overview of the changes! ##### Breaking changes - Ruff now formats your code according to the 2026 style guide. See the formatter section below or in the blog post for a detailed list of changes. - The linter now supports block suppression comments. For example, to suppress `N803` for all parameters in this function: ```python # ruff: disable[N803] def foo( legacyArg1, legacyArg2, legacyArg3, legacyArg4, ): ... # ruff: enable[N803] ``` See the [documentation](https://docs.astral.sh/ruff/linter/#block-level) for more details. - The `ruff:alpine` Docker image is now based on Alpine 3.23 (up from 3.21). - The `ruff:debian` and `ruff:debian-slim` Docker images are now based on Debian 13 "Trixie" instead of Debian 12 "Bookworm." - Binaries for the `ppc64` (64-bit big-endian PowerPC) architecture are no longer included in our releases. It should still be possible to build Ruff manually for this platform, if needed. - Ruff now resolves all `extend`ed configuration files before falling back on a default Python version. ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`blocking-http-call-httpx-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-http-call-httpx-in-async-function) (`ASYNC212`) - [`blocking-path-method-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-path-method-in-async-function) (`ASYNC240`) - [`blocking-input-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-input-in-async-function) (`ASYNC250`) - [`map-without-explicit-strict`](https://docs.astral.sh/ruff/rules/map-without-explicit-strict) (`B912`) - [`if-exp-instead-of-or-operator`](https://docs.astral.sh/ruff/rules/if-exp-instead-of-or-operator) (`FURB110`) - [`single-item-membership-test`](https://docs.astral.sh/ruff/rules/single-item-membership-test) (`FURB171`) - [`missing-maxsplit-arg`](https://docs.astral.sh/ruff/rules/missing-maxsplit-arg) (`PLC0207`) - [`unnecessary-lambda`](https://docs.astral.sh/ruff/rules/unnecessary-lambda) (`PLW0108`) - [`unnecessary-empty-iterable-within-deque-call`](https://docs.astral.sh/ruff/rules/unnecessary-empty-iterable-within-deque-call) (`RUF037`) - [`in-empty-collection`](https://docs.astral.sh/ruff/rules/in-empty-collection) (`RUF060`) - [`legacy-form-pytest-raises`](https://docs.astral.sh/ruff/rules/legacy-form-pytest-raises) (`RUF061`) - [`non-octal-permissions`](https://docs.astral.sh/ruff/rules/non-octal-permissions) (`RUF064`) - [`invalid-rule-code`](https://docs.astral.sh/ruff/rules/invalid-rule-code) (`RUF102`) - [`invalid-suppression-comment`](https://docs.astral.sh/ruff/rules/invalid-suppression-comment) (`RUF103`) - [`unmatched-suppression-comment`](https://docs.astral.sh/ruff/rules/unmatched-suppression-comment) (`RUF104`) - [`replace-str-enum`](https://docs.astral.sh/ruff/rules/replace-str-enum) (`UP042`) The following behaviors have been stabilized: - The `--output-format` flag is now respected when running Ruff in `--watch` mode, and the `full` output format is now used by default, matching the regular CLI output. - [`builtin-attribute-shadowing`](https://docs.astral.sh/ruff/rules/builtin-attribute-shadowing/) (`A003`) now detects the use of shadowed built-in names in additional contexts like decorators, default arguments, and other attribute definitions. - [`duplicate-union-member`](https://docs.astral.sh/ruff/rules/duplicate-union-member/) (`PYI016`) now considers `typing.Optional` when searching for duplicate union members. - [`split-static-string`](https://docs.astral.sh/ruff/rules/split-static-string/) (`SIM905`) now offers an autofix when the `maxsplit` argument is provided, even without a `sep` argument. - [`dict-get-with-none-default`](https://docs.astral.sh/ruff/rules/dict-get-with-none-default/) (`SIM910`) now applies to more types of key expressions. - [`super-call-with-parameters`](https://docs.astral.sh/ruff/rules/super-call-with-parameters/) (`UP008`) now has a safe fix when it will not delete comments. - [`unnecessary-default-type-args`](https://docs.astral.sh/ruff/rules/unnecessary-default-type-args/) (`UP043`) now applies to stub (`.pyi`) files on Python versions before 3.13. ##### Formatter This release introduces the new 2026 style guide, with the following changes: - Lambda parameters are now kept on the same line and lambda bodies will be parenthesized to let them break across multiple lines ([#&#8203;21385](https://github.com/astral-sh/ruff/pull/21385)) - Parentheses around tuples of exceptions in `except` clauses will now be removed on Python 3.14 and later ([#&#8203;20768](https://github.com/astral-sh/ruff/pull/20768)) - A single empty line is now permitted at the beginning of function bodies ([#&#8203;21110](https://github.com/astral-sh/ruff/pull/21110)) - Parentheses are avoided for long `as` captures in `match` statements ([#&#8203;21176](https://github.com/astral-sh/ruff/pull/21176)) - Extra spaces between escaped quotes and ending triple quotes can now be omitted ([#&#8203;17216](https://github.com/astral-sh/ruff/pull/17216)) - Blank lines are now enforced before classes with decorators in stub files ([#&#8203;18888](https://github.com/astral-sh/ruff/pull/18888)) ##### Preview features - Apply formatting to Markdown code blocks ([#&#8203;22470](https://github.com/astral-sh/ruff/pull/22470), [#&#8203;22990](https://github.com/astral-sh/ruff/pull/22990), [#&#8203;22996](https://github.com/astral-sh/ruff/pull/22996)) See the [documentation](https://docs.astral.sh/ruff/formatter/#markdown-code-formatting) for more details. ##### Bug fixes - Fix suppression indentation matching ([#&#8203;22903](https://github.com/astral-sh/ruff/pull/22903)) ##### Rule changes - Customize where the `fix_title` sub-diagnostic appears ([#&#8203;23044](https://github.com/astral-sh/ruff/pull/23044)) - \[`FastAPI`] Add sub-diagnostic explaining why a fix was unavailable (`FAST002`) ([#&#8203;22565](https://github.com/astral-sh/ruff/pull/22565)) - \[`flake8-annotations`] Don't suggest `NoReturn` for functions raising `NotImplementedError` (`ANN201`, `ANN202`, `ANN205`, `ANN206`) ([#&#8203;21311](https://github.com/astral-sh/ruff/pull/21311)) - \[`pyupgrade`] Make fix unsafe if it deletes comments (`UP017`) ([#&#8203;22873](https://github.com/astral-sh/ruff/pull/22873)) - \[`pyupgrade`] Make fix unsafe if it deletes comments (`UP020`) ([#&#8203;22872](https://github.com/astral-sh/ruff/pull/22872)) - \[`pyupgrade`] Make fix unsafe if it deletes comments (`UP033`) ([#&#8203;22871](https://github.com/astral-sh/ruff/pull/22871)) - \[`refurb`] Do not add `abc.ABC` if already present (`FURB180`) ([#&#8203;22234](https://github.com/astral-sh/ruff/pull/22234)) - \[`refurb`] Make fix unsafe if it deletes comments (`FURB110`) ([#&#8203;22768](https://github.com/astral-sh/ruff/pull/22768)) - \[`ruff`] Add sub-diagnostics with permissions (`RUF064`) ([#&#8203;22972](https://github.com/astral-sh/ruff/pull/22972)) ##### Server - Identify notebooks by LSP `didOpen` instead of `.ipynb` file extension ([#&#8203;22810](https://github.com/astral-sh/ruff/pull/22810)) ##### CLI - Add `--color` CLI option to force colored output ([#&#8203;22806](https://github.com/astral-sh/ruff/pull/22806)) ##### Documentation - Document `-` stdin convention in CLI help text ([#&#8203;22817](https://github.com/astral-sh/ruff/pull/22817)) - \[`refurb`] Change example to `re.search` with `^` anchor (`FURB167`) ([#&#8203;22984](https://github.com/astral-sh/ruff/pull/22984)) - Fix link to Sphinx code block directives ([#&#8203;23041](https://github.com/astral-sh/ruff/pull/23041)) - \[`pydocstyle`] Clarify which quote styles are allowed (`D300`) ([#&#8203;22825](https://github.com/astral-sh/ruff/pull/22825)) - \[`flake8-bugbear`] Improve docs for `no-explicit-stacklevel` (`B028`) ([#&#8203;22538](https://github.com/astral-sh/ruff/pull/22538)) ##### Other changes - Update MSRV to 1.91 ([#&#8203;22874](https://github.com/astral-sh/ruff/pull/22874)) ##### Contributors - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;Jkhall81](https://github.com/Jkhall81) - [@&#8203;cwkang1998](https://github.com/cwkang1998) - [@&#8203;manzt](https://github.com/manzt) - [@&#8203;11happy](https://github.com/11happy) - [@&#8203;hugovk](https://github.com/hugovk) - [@&#8203;caiquejjx](https://github.com/caiquejjx) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;akawd](https://github.com/akawd) - [@&#8203;konstin](https://github.com/konstin) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **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 [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMzkuOCIsInVwZGF0ZWRJblZlciI6IjQzLjEzOS44IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Update dependency ruff to ~=0.15.12
All checks were successful
Actions / Build (pull_request) Successful in 31s
Actions / Lint (pull_request) Successful in 37s
d73d22e825
cswimr merged commit 1b2957f44d into main 2026-04-28 10:03:19 -04:00
cswimr deleted branch renovate/ruff-0.x 2026-04-28 10:03:19 -04:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
GalacticFactory/GalacticFactoryUtils!6
No description provided.