Update dependency ruff to v0.15.4 (#23660)
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://redirect.github.com/astral-sh/ruff),
[changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `==0.15.2` → `==0.15.4` |

|

|
---
### Release Notes
<details>
<summary>astral-sh/ruff (ruff)</summary>
###
[`v0.15.4`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0154)
[Compare
Source](https://redirect.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
([#​23588](https://redirect.github.com/astral-sh/ruff/pull/23588))
- \[`pyflakes`] Suppress false positive in `F821` for names used before
`del` in stub files
([#​23550](https://redirect.github.com/astral-sh/ruff/pull/23550))
##### Documentation
- Clarify first-party import detection in Ruff
([#​23591](https://redirect.github.com/astral-sh/ruff/pull/23591))
- Fix incorrect `import-heading` example
([#​23568](https://redirect.github.com/astral-sh/ruff/pull/23568))
##### Contributors
- [@​stakeswky](https://redirect.github.com/stakeswky)
- [@​ntBre](https://redirect.github.com/ntBre)
- [@​thejcannon](https://redirect.github.com/thejcannon)
- [@​GeObts](https://redirect.github.com/GeObts)
###
[`v0.15.3`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0153)
[Compare
Source](https://redirect.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
([#​23572](https://redirect.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
([#​23400](https://redirect.github.com/astral-sh/ruff/pull/23400))
- \[`flake8-bandit`] Allow suspicious imports in `TYPE_CHECKING` blocks
(`S401`-`S415`)
([#​23441](https://redirect.github.com/astral-sh/ruff/pull/23441))
- \[`flake8-bugbear`] Allow `B901` in pytest hook wrappers
([#​21931](https://redirect.github.com/astral-sh/ruff/pull/21931))
- \[`flake8-import-conventions`] Add missing conventions from upstream
(`ICN001`, `ICN002`)
([#​21373](https://redirect.github.com/astral-sh/ruff/pull/21373))
- \[`pydocstyle`] Add rule to enforce docstring section ordering
(`D420`)
([#​23537](https://redirect.github.com/astral-sh/ruff/pull/23537))
- \[`pylint`] Implement `swap-with-temporary-variable` (`PLR1712`)
([#​22205](https://redirect.github.com/astral-sh/ruff/pull/22205))
- \[`ruff`] Add `unnecessary-assign-before-yield` (`RUF070`)
([#​23300](https://redirect.github.com/astral-sh/ruff/pull/23300))
- \[`ruff`] Support file-level noqa in `RUF102`
([#​23535](https://redirect.github.com/astral-sh/ruff/pull/23535))
- \[`ruff`] Suppress diagnostic for invalid f-strings before Python 3.12
(`RUF027`)
([#​23480](https://redirect.github.com/astral-sh/ruff/pull/23480))
- \[`flake8-bandit`] Don't flag `BaseLoader`/`CBaseLoader` as unsafe
(`S506`)
([#​23510](https://redirect.github.com/astral-sh/ruff/pull/23510))
##### Bug fixes
- Avoid infinite loop between `I002` and `PYI025`
([#​23352](https://redirect.github.com/astral-sh/ruff/pull/23352))
- \[`pyflakes`] Fix false positive for `@overload` from
`lint.typing-modules` (`F811`)
([#​23357](https://redirect.github.com/astral-sh/ruff/pull/23357))
- \[`pyupgrade`] Fix false positive for `TypeVar` default before Python
3.12 (`UP046`)
([#​23540](https://redirect.github.com/astral-sh/ruff/pull/23540))
- \[`pyupgrade`] Fix handling of `\N` in raw strings (`UP032`)
([#​22149](https://redirect.github.com/astral-sh/ruff/pull/22149))
##### Rule changes
- Render sub-diagnostics in the GitHub output format
([#​23455](https://redirect.github.com/astral-sh/ruff/pull/23455))
- \[`flake8-bugbear`] Tag certain `B007` diagnostics as unnecessary
([#​23453](https://redirect.github.com/astral-sh/ruff/pull/23453))
- \[`ruff`] Ignore unknown rule codes in `RUF100`
([#​23531](https://redirect.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
([#​23519](https://redirect.github.com/astral-sh/ruff/pull/23519))
- Update isort action comments heading
([#​23515](https://redirect.github.com/astral-sh/ruff/pull/23515))
- \[`pydocstyle`] Fix double comma in description of `D404`
([#​23440](https://redirect.github.com/astral-sh/ruff/pull/23440))
##### Other changes
- Update the Python module (notably `find_ruff_bin`) for parity with uv
([#​23406](https://redirect.github.com/astral-sh/ruff/pull/23406))
##### Contributors
- [@​zanieb](https://redirect.github.com/zanieb)
- [@​o1x3](https://redirect.github.com/o1x3)
- [@​assadyousuf](https://redirect.github.com/assadyousuf)
- [@​kar-ganap](https://redirect.github.com/kar-ganap)
- [@​denyszhak](https://redirect.github.com/denyszhak)
- [@​amyreese](https://redirect.github.com/amyreese)
- [@​carljm](https://redirect.github.com/carljm)
- [@​anishgirianish](https://redirect.github.com/anishgirianish)
- [@​Bnyro](https://redirect.github.com/Bnyro)
- [@​danparizher](https://redirect.github.com/danparizher)
- [@​ntBre](https://redirect.github.com/ntBre)
- [@​gcomneno](https://redirect.github.com/gcomneno)
- [@​jaap3](https://redirect.github.com/jaap3)
- [@​stakeswky](https://redirect.github.com/stakeswky)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
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 was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/astral-sh/ruff).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW50ZXJuYWwiXX0=-->
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>