# ruff changelog > ruff release notes. - Vendor: ruff - Category: Developer Tools - Official site: https://docs.astral.sh/ruff - Tracked by: What's New (https://whatsnew.fyi/product/ruff) - Harvested from: GitHub (astral-sh/ruff) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### 0.16.0 - Date: 2026-07-23 - Version: 0.16.0 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.16.0 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.16.0 - **changed** — Ruff now enables a much larger set of rules by default (413, up from 59) - **removed** — Removed 18 opinionated pycodestyle and pyflakes rules from the default set: E401, E402, E701, E702, E703, E711, E712, E713, E714, E721, E731, E741, E742, E743, F403, F405, F406, and F722 - **added** — Ruff can now format Python code blocks in Markdown files and will do this by default - **added** — Ruff now supports `ruff: ignore` comments at the ends of lines or on the line preceding a diagnostic to suppress diagnostics - **changed** — Fixes are now shown in `check` and `format --check` output - **added** — The `format --check` command now supports the same output formats as the linter, including `github` and `gitlab` outputs for rendering annotations in CI - **changed** — The `filename`, `location`, `end_location`, `fix.edits[].location`, and `fix.edits[].end_location` fields in JSON output format may now be `null` rather than defaulting to empty string and row 1, column 1 - **changed** — Stabilized `airflow3-incompatible-function-signature` (AIR303) rule - **changed** — Stabilized `missing-copyright-notice` (CPY001) rule - **changed** — Stabilized `unnecessary-from-float` (FURB164) rule - **changed** — Stabilized `sorted-min-max` (FURB192) rule - **changed** — Stabilized `implicit-string-concatenation-in-collection-literal` (ISC004) rule - **changed** — Stabilized `log-exception-outside-except-handler` (LOG004) rule - **changed** — Stabilized `invalid-bool-return-type` (PLE0304) rule - **changed** — Stabilized `too-many-positional-arguments` (PLR0917) rule - **changed** — Stabilized `stop-iteration-return` (PLR1708) rule - **changed** — Stabilized `none-not-at-end-of-union` (RUF036) rule - **changed** — Stabilized `access-annotations-from-class-dict` (RUF063) rule - **changed** — Stabilized `duplicate-entry-in-dunder-all` (RUF068) rule - **changed** — The `blind-except` (BLE001) rule is now suppressed when the exception is logged via `logging` methods other than `critical`, `error`, and `exception` - **changed** — The `future-required-type-annotation` (FA102) rule now checks for additional PEP 585-compatible APIs such as those from `collections.abc` - **changed** — The `suspicious-url-open-usage` (S310) rule now resolves local string literal bindings to avoid more false positives - **changed** — The `snmp-insecure-version` (S508) and `snmp-weak-cryptography` (S509) rules now support the recommended API from newer versions of PySNMP - **changed** — The `typing-text-str-alias` (UP019) rule now recognizes `typing_extensions.Text` in addition to `typing.Text` - **fixed** — Fix missing check on unrecognized early bound (RUF016) - **changed** — Insert a space after the colon in Ruff suppression comments ##### Release Notes Released on 2026-07-23. Check out the [blog post](https://astral.sh/blog/ruff-v0.16.0) for a migration guide and overview of the changes! ###### Breaking changes - Ruff now enables a much larger set of rules by default (413, up from 59). See the blog post for more details and the new [Default Rules](https://docs.astral.sh/ruff/default-rules/) page for a full listing of the enabled rules. Note that this is primarily an expansion, but 18 of the more opinionated pycodestyle (`E`) and pyflakes (`F`) rules have been removed from the default set: `E401`, `E402`, `E701`, `E702`, `E703`, `E711`, `E712`, `E713`, `E714`, `E721`, `E731`, `E741`, `E742`, `E743`, `F403`, `F405`, `F406`, and `F722`. - Ruff can now format Python code blocks in Markdown files and will do this by default. See the [documentation](https://docs.astral.sh/ruff/formatter/#markdown-code-formatting) for more details. - Ruff now supports `ruff: ignore` comments at the ends of lines, like `noqa` comments, or on the line preceding a diagnostic. For example, these both suppress an [`unused-import`](https://docs.astral.sh/ruff/rules/unused-import/) (`F401`) diagnostic: ```py import math # ruff: ignore[F401] # ruff: ignore[F401] import os ``` - Fixes are now shown in `check` and `format --check` output: ````console ❯ ruff format --check . unformatted: File would be reformatted --> try.md:1:1 | 1 | ```python - import math 2 + import math 3 | ``` | 1 file would be reformatted ```` This example also shows off the Markdown formatting. - `format --check` now supports the same output formats as the linter, including the `github` and `gitlab` outputs for rendering annotations in CI: ```console ❯ ruff format --check --output-format github . ::error title=ruff (unformatted),file=try.md,line=2,col=8,endLine=2,endColumn=10::try.md:2:8: unformatted: File would be reformatted ``` See the CLI help or [documentation](https://docs.astral.sh/ruff/settings/#output-format) for the full list of supported formats. - The `filename`, `location`, `end_location`, `fix.edits[].location`, and `fix.edits[].end_location` fields in the JSON output format may now be `null` rather than defaulting to the empty string and row 1, column 1, respectively. ###### Stabilization The following rules have been stabilized and are no longer in preview: - [`airflow3-incompatible-function-signature`](https://docs.astral.sh/ruff/rules/airflow3-incompatible-function-signature) (`AIR303`) - [`missing-copyright-notice`](https://docs.astral.sh/ruff/rules/missing-copyright-notice) (`CPY001`) - [`unnecessary-from-float`](https://docs.astral.sh/ruff/rules/unnecessary-from-float) (`FURB164`) - [`sorted-min-max`](https://docs.astral.sh/ruff/rules/sorted-min-max) (`FURB192`) - [`implicit-string-concatenation-in-collection-literal`](https://docs.astral.sh/ruff/rules/implicit-string-concatenation-in-collection-literal) (`ISC004`) - [`log-exception-outside-except-handler`](https://docs.astral.sh/ruff/rules/log-exception-outside-except-handler) (`LOG004`) - [`invalid-bool-return-type`](https://docs.astral.sh/ruff/rules/invalid-bool-return-type) (`PLE0304`) - [`too-many-positional-arguments`](https://docs.astral.sh/ruff/rules/too-many-positional-arguments) (`PLR0917`) - [`stop-iteration-return`](https://docs.astral.sh/ruff/rules/stop-iteration-return) (`PLR1708`) - [`none-not-at-end-of-union`](https://docs.astral.sh/ruff/rules/none-not-at-end-of-union) (`RUF036`) - [`access-annotations-from-class-dict`](https://docs.astral.sh/ruff/rules/access-annotations-from-class-dict) (`RUF063`) - [`duplicate-entry-in-dunder-all`](https://docs.astral.sh/ruff/rules/duplicate-entry-in-dunder-all) (`RUF068`) The following behaviors have been stabilized: - [`blind-except`](https://docs.astral.sh/ruff/rules/blind-except) (`BLE001`) is now supp _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.16.0]_ ### 0.15.22 - Date: 2026-07-16 - Version: 0.15.22 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.22 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.22 - **added** — Add an autofix for E402 in pycodestyle - **added** — Allow subclassing builtins in stub files for FURB189 in refurb - **added** — Add rule to replace noqa comments with ruff:ignore (RUF105) - **added** — Add rule to use human-readable names in ruff:ignore comments (RUF106) - **added** — Add rule to use human-readable names in configuration selectors (RUF201) - **fixed** — Fix false positive in __all__ for PYI053 in flake8-pyi - **changed** — Ignore mutable type updates in redefined-loop-name (PLW2901) in pylint - **changed** — Avoid redundant lexer token bookkeeping - **changed** — Avoid redundant pending-indentation writes - **changed** — Avoid unnecessary identifier lookahead - **changed** — Reuse parser scratch buffers ##### Release Notes Released on 2026-07-16. ###### Preview features - \[`pycodestyle`\] Add an autofix for `E402` ([#22212](https://github.com/astral-sh/ruff/pull/22212)) - \[`refurb`\] Allow subclassing builtins in stub files (`FURB189`) ([#26812](https://github.com/astral-sh/ruff/pull/26812)) - \[`ruff`\] Add rule to replace `noqa` comments with `ruff:ignore` (`RUF105`) ([#26423](https://github.com/astral-sh/ruff/pull/26423)) - \[`ruff`\] Add rule to use human-readable names in `ruff:ignore` comments (`RUF106`) ([#26682](https://github.com/astral-sh/ruff/pull/26682)) - \[`ruff`\] Add rule to use human-readable names in configuration selectors (`RUF201`) ([#26772](https://github.com/astral-sh/ruff/pull/26772)) ###### Bug fixes - \[`flake8-pyi`\] Fix false positive in `__all__` (`PYI053`) ([#26872](https://github.com/astral-sh/ruff/pull/26872)) ###### Rule changes - \[`pylint`\] Ignore mutable type updates in `redefined-loop-name` (`PLW2901`) ([#25733](https://github.com/astral-sh/ruff/pull/25733)) ###### Performance - Avoid redundant lexer token bookkeeping ([#26765](https://github.com/astral-sh/ruff/pull/26765)) - Avoid redundant pending-indentation writes ([#26774](https://github.com/astral-sh/ruff/pull/26774)) - Avoid unnecessary identifier lookahead ([#26525](https://github.com/astral-sh/ruff/pull/26525)) - Reuse parser scratch buffers ([#26798](https://github.com/astral-sh/ruff/pull/26798)) ###### Documentation - Document argfile support ([#26803](https://github.com/astral-sh/ruff/pull/26803)) - \[`flake8-datetimez`\] Clarify naming guidance for `datetime.today` (`DTZ002`) ([#26658](https://github.com/astral-sh/ruff/pull/26658)) - \[`pycodestyle`\] Document `E731` fix safety ([#26847](https://github.com/astral-sh/ruff/pull/26847)) - \[`ruff`\] Clarify intentional async contexts for `unused-async` (`RUF029`) ([#26641](https://github.com/astral-sh/ruff/pull/26641)) ###### Contributors - [@dwego](https://github.com/dwego) - [@MichaReiser](https://github.com/MichaReiser) - [@Joosboy](https://github.com/Joosboy) - [@KaufmanDmitriy](https://github.com/KaufmanDmitriy) - [@PeterJCLaw](https://github.com/PeterJCLaw) - [@ntBre](https://github.com/ntBre) - [@charliermarsh](https://github.com/charliermarsh) ##### Install ruff 0.15.22 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.22 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.22/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [ _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.22]_ ### 0.15.21 - Date: 2026-07-09 - Version: 0.15.21 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.21 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.21 - **added** — Add `--add-ignore` for adding `ruff:ignore` comments - **added** — Lint and fix use of deprecated `abc` decorators (`UP051`) - **changed** — Drop `C409` tuple comprehension preview behavior - **changed** — Avoid whitespace normalization when formatting comments - **changed** — Mark `EXE004` fix as unsafe - **changed** — Mark `PYI061` fixes as unsafe in Python files - **changed** — Skip `overload-with-docstring` in stub files (`D418`) - **changed** — Add `--extend-exclude` to `ruff format` - **fixed** — Refine non-empty f-string detection - **fixed** — Detect syntax errors in individual notebook cells - **fixed** — Fix `ISC003` autofix incorrectly stripping `+` from comments ##### Release Notes Released on 2026-07-09. ###### Preview features - Add `--add-ignore` for adding `ruff:ignore` comments ([#26346](https://github.com/astral-sh/ruff/pull/26346)) - \[`flake8-comprehensions`\] Drop `C409` tuple comprehension preview behavior ([#25707](https://github.com/astral-sh/ruff/pull/25707)) - Avoid whitespace normalization when formatting comments ([#26455](https://github.com/astral-sh/ruff/pull/26455)) - \[`pyupgrade`\] Lint and fix use of deprecated `abc` decorators (`UP051`) ([#26417](https://github.com/astral-sh/ruff/pull/26417)) ###### Bug fixes - Refine non-empty f-string detection ([#26526](https://github.com/astral-sh/ruff/pull/26526)) - Detect syntax errors in individual notebook cells ([#26419](https://github.com/astral-sh/ruff/pull/26419)) - \[`flake8-implicit-str-concat`\] Fix `ISC003` autofix incorrectly stripping `+` from comments ([#26554](https://github.com/astral-sh/ruff/pull/26554)) ###### Rule changes - \[`flake8-executable`\] Mark `EXE004` fix as unsafe ([#26033](https://github.com/astral-sh/ruff/pull/26033)) - \[`flake8-pyi`\] Mark `PYI061` fixes as unsafe in Python files ([#26533](https://github.com/astral-sh/ruff/pull/26533)) - \[`pydocstyle`\] Skip `overload-with-docstring` in stub files (`D418`) ([#26318](https://github.com/astral-sh/ruff/pull/26318)) ###### Performance - Avoid per-token source index visitor calls ([#26506](https://github.com/astral-sh/ruff/pull/26506)) - Cache parenthesized expression boundaries in the formatter ([#26344](https://github.com/astral-sh/ruff/pull/26344)) - Improve performance of rendering edits in preview mode ([#26565](https://github.com/astral-sh/ruff/pull/26565)) - Inline `fits_element` in formatter ([#26429](https://github.com/astral-sh/ruff/pull/26429)) - Inline formatter printing hot paths ([#26504](https://github.com/astral-sh/ruff/pull/26504)) - Lazily create builtin bindings ([#26510](https://github.com/astral-sh/ruff/pull/26510)) - Skip empty trivia scans in the source indexer ([#26507](https://github.com/astral-sh/ruff/pull/26507)) - Use ICF for macOS release builds ([#25780](https://github.com/astral-sh/ruff/pull/25780)) ###### Formatter - Add `--extend-exclude` to `ruff format` ([#26372](https://github.com/astral-sh/ruff/pull/26372)) ###### Documentation - Add "How does Ruff's import sorting compare to isort?" link to README ([#26530](https://github.com/astral-sh/ruff/pull/26530)) - Fix Mozilla Firefox repository link in README ([#26537](https://github.com/astral-sh/ruff/pull/26537)) - \[`flake8-bandit`\] Fix misleading docstring for `mako-templates` (`S702`) ([#26432](https://github.com/astral-sh/ruff/pull/26432)) - \[`ruff`\] Fix non-triggering example for `if-key-in-dict-del` (`RUF051`) ([#26433](https://github.com/astral-sh/ruff/pull/26433)) ###### Contributors - [@EkriirkE](https://github.com/EkriirkE) - [@tingerrr](https://github.com/tingerrr) - [@s-rigaud](https://github.com/s-rigaud) - [@nikolauspschuetz](https://github.com/nikolauspschuetz) - [@Avasam](https://github.com/Avasam) - [@ntBre](https://github.com/ntBre) - [@omar-y-abdi](https://github.com/omar-y-abdi) - [@AlexWaygood](https://github.com/AlexWaygood) - [@sylvestre](https://github.com/sylvestre) - [@shaanmajid](https://github.com/shaanmajid) - [@lerebear](https://github.com/lerebear) - [@baltasarblanco](https://github.com/baltasarblanco) - [@Sanjays2402](https://github.com/Sanjays2402) - [@ZedThree](https://github.com/ZedThree) - [@servusdei2018](https://github.com/servusdei2018) - [@charliermarsh](https://github.com/charliermarsh) - [@jesco-absolute](https://github.com/jesco-absolut) - [@velikodniy](https://github.com/velikodniy) - [@zaniebot](https://github.com/zaniebot) - [@epage](https://github.com/epage) ##### Install ruff 0.15.21 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-installer.sh | sh ``` ###### Install prebuilt binar _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.21]_ ### 0.15.20 - Date: 2026-06-25 - Version: 0.15.20 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.20 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.20 - **added** — Allow human-readable names in rule selectors - **changed** — Emit a warning instead of an error for unknown rule selectors - **changed** — Match noqa shebang handling in ruff:ignore comments - **removed** — Remove pytest-fixture-autouse (RUF076) ##### Release Notes Released on 2026-06-25. ###### Preview features - Allow human-readable names in rule selectors ([#25887](https://github.com/astral-sh/ruff/pull/25887)) - Emit a warning instead of an error for unknown rule selectors ([#26113](https://github.com/astral-sh/ruff/pull/26113)) - Match `noqa` shebang handling in `ruff:ignore` comments ([#26286](https://github.com/astral-sh/ruff/pull/26286)) - \[`ruff`\] Remove `pytest-fixture-autouse` (`RUF076`) ([#26240](https://github.com/astral-sh/ruff/pull/26240), [#26371](https://github.com/astral-sh/ruff/pull/26371)) ###### Documentation - Add versioning sections to custom crate READMEs ([#26317](https://github.com/astral-sh/ruff/pull/26317)) - Update `ruff_python_parser` README for crates.io ([#26315](https://github.com/astral-sh/ruff/pull/26315)) - \[`perflint`\] Clarify that `PERF402` applies to any iterable ([#26242](https://github.com/astral-sh/ruff/pull/26242)) ###### Contributors - [@dhruvmanila](https://github.com/dhruvmanila) - [@MichaReiser](https://github.com/MichaReiser) - [@ntBre](https://github.com/ntBre) - [@trilamsr](https://github.com/trilamsr) ##### Install ruff 0.15.20 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.20 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.20/ruff-powerpc64le-unknown-linux-gnu _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.20]_ ### 0.15.19 - Date: 2026-06-24 - Version: 0.15.19 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.19 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.19 - **added** — Support human-readable names when hovering suppression comments and in code actions - **fixed** — Fall back to default settings when editor-only settings are invalid - **fixed** — Fix panic when inserting text at a notebook cell boundary - **changed** — Update fix suggestions for `__floor__`, `__trunc__`, `__length_hint__`, and `__matmul__` variants (PLC2801) - **changed** — Avoid allocating when parsing single string literals - **changed** — Avoid reallocating singleton call arguments - **changed** — Lazily create source files for lint diagnostics - **changed** — Optimize formatter text width and indentation - **changed** — Reserve capacity for builtin bindings - **changed** — Skip repeated-key checks for singleton dictionaries - **changed** — Use ArrayVec for qualified name segments ##### Release Notes Released on 2026-06-23. ###### Preview features - Support human-readable names when hovering suppression comments and in code actions ([#26114](https://github.com/astral-sh/ruff/pull/26114)) ###### Bug fixes - Fall back to default settings when editor-only settings are invalid ([#26244](https://github.com/astral-sh/ruff/pull/26244)) - Fix panic when inserting text at a notebook cell boundary ([#26111](https://github.com/astral-sh/ruff/pull/26111)) ###### Rule changes - \[`pylint`\] Update fix suggestions for `__floor__`, `__trunc__`, `__length_hint__`, and `__matmul__` variants (`PLC2801`) ([#26239](https://github.com/astral-sh/ruff/pull/26239)) ###### Performance - Avoid allocating when parsing single string literals ([#26200](https://github.com/astral-sh/ruff/pull/26200)) - Avoid reallocating singleton call arguments ([#26223](https://github.com/astral-sh/ruff/pull/26223)) - Lazily create source files for lint diagnostics ([#26226](https://github.com/astral-sh/ruff/pull/26226)) - Optimize formatter text width and indentation ([#26236](https://github.com/astral-sh/ruff/pull/26236)) - Reserve capacity for builtin bindings ([#26229](https://github.com/astral-sh/ruff/pull/26229)) - Skip repeated-key checks for singleton dictionaries ([#26228](https://github.com/astral-sh/ruff/pull/26228)) - Use ArrayVec for qualified name segments ([#26224](https://github.com/astral-sh/ruff/pull/26224)) ###### Documentation - \[`flake8-pyi`\] Note that `PYI051` is an opinionated stylistic rule ([#26179](https://github.com/astral-sh/ruff/pull/26179)) - \[`pyupgrade`\] Clarify `UP029` as a Python 2 compatibility rule ([#26243](https://github.com/astral-sh/ruff/pull/26243)) ###### Other changes - Publish Ruff crates to crates.io ([#26271](https://github.com/astral-sh/ruff/pull/26271)) ###### Contributors - [@MakenRosa](https://github.com/MakenRosa) - [@MichaReiser](https://github.com/MichaReiser) - [@trilamsr](https://github.com/trilamsr) - [@ntBre](https://github.com/ntBre) - [@sanjibani](https://github.com/sanjibani) - [@charliermarsh](https://github.com/charliermarsh) ##### Install ruff 0.15.19 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.19 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86_64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.19/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64- _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.19]_ ### 0.15.18 - Date: 2026-06-18 - Version: 0.15.18 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.18 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.18 - **added** — Handle nested `ruff:ignore` comments - **changed** — Stop displaying severity in output - **changed** — Use human-readable names in CLI output - **changed** — Use human-readable names in LSP and playground diagnostics - **added** — Prevent property docstrings starting with verbs in pydocstyle (D421) - **added** — Extend PYI033 to Python files in flake8-pyi - **fixed** — Detect equivalent numeric mapping keys - **fixed** — Detect mapping keys equivalent to booleans - **fixed** — Detect repeated signed and complex dictionary keys - **changed** — Rename PYI033 to legacy-type-comment in flake8-pyi - **changed** — Render subdiagnostics and secondary annotations as related information in LSP server - **fixed** — Reject `__debug__` lambda parameters in parser - **fixed** — Reject `_` as a match-pattern target in parser - **fixed** — Reject multiple starred names in sequence patterns in parser - **fixed** — Reject parenthesized star imports in parser - **fixed** — Reject starred comprehension targets in parser - **fixed** — Reject unparenthesized generator expressions in class bases in parser - **fixed** — Reject `yield` expressions after commas in parser - **fixed** — Validate function type parameter default order in parser - **added** — Make diagnostic links clickable in playground ##### Release Notes Released on 2026-06-18. ###### Preview features - Handle nested `ruff:ignore` comments ([#25791](https://github.com/astral-sh/ruff/pull/25791)) - Stop displaying severity in output ([#26050](https://github.com/astral-sh/ruff/pull/26050)) - Use human-readable names in CLI output ([#25937](https://github.com/astral-sh/ruff/pull/25937)) - Use human-readable names in LSP and playground diagnostics ([#26058](https://github.com/astral-sh/ruff/pull/26058)) - \[`pydocstyle`\] Prevent property docstrings starting with verbs (`D421`) ([#23775](https://github.com/astral-sh/ruff/pull/23775)) - \[`flake8-pyi`\] Extend `PYI033` to Python files ([#26129](https://github.com/astral-sh/ruff/pull/26129)) ###### Bug fixes - Detect equivalent numeric mapping keys ([#26009](https://github.com/astral-sh/ruff/pull/26009)) - Detect mapping keys equivalent to booleans ([#25982](https://github.com/astral-sh/ruff/pull/25982)) - Detect repeated signed and complex dictionary keys ([#26007](https://github.com/astral-sh/ruff/pull/26007)) ###### Rule changes - \[`flake8-pyi`\] Rename `PYI033` to `legacy-type-comment` ([#26131](https://github.com/astral-sh/ruff/pull/26131)) ###### Performance - Use `ThinVec` for call keywords ([#25999](https://github.com/astral-sh/ruff/pull/25999)) - Inline parser recovery context checks ([#26038](https://github.com/astral-sh/ruff/pull/26038)) - Match parser keywords as bytes ([#26037](https://github.com/astral-sh/ruff/pull/26037)) - Move value parsing out of lexing ([#25360](https://github.com/astral-sh/ruff/pull/25360)) ###### Server - Render subdiagnostics and secondary annotations as related information ([#26011](https://github.com/astral-sh/ruff/pull/26011)) ###### Documentation - Update fix availability for always-fixable rules ([#26091](https://github.com/astral-sh/ruff/pull/26091)) - \[`flake8-tidy-imports`\] Add fix safety section (`TID252`) ([#17491](https://github.com/astral-sh/ruff/pull/17491)) ###### Parser - Reject `__debug__` lambda parameters ([#26022](https://github.com/astral-sh/ruff/pull/26022)) - Reject `_` as a match-pattern target ([#25977](https://github.com/astral-sh/ruff/pull/25977)) - Reject multiple starred names in sequence patterns ([#25976](https://github.com/astral-sh/ruff/pull/25976)) - Reject parenthesized star imports ([#26021](https://github.com/astral-sh/ruff/pull/26021)) - Reject starred comprehension targets ([#26023](https://github.com/astral-sh/ruff/pull/26023)) - Reject unparenthesized generator expressions in class bases ([#25978](https://github.com/astral-sh/ruff/pull/25978)) - Reject `yield` expressions after commas ([#26024](https://github.com/astral-sh/ruff/pull/26024)) - Validate function type parameter default order ([#25981](https://github.com/astral-sh/ruff/pull/25981)) ###### Playground - Make diagnostic links clickable ([#26104](https://github.com/astral-sh/ruff/pull/26104)) - Use diagnostic tags ([#26105](https://github.com/astral-sh/ruff/pull/26105)) ###### Contributors - [@AlexWaygood](https://github.com/AlexWaygood) - [@ntBre](https://github.com/ntBre) - [@gtkacz](https://github.com/gtkacz) - [@MichaReiser](https://github.com/MichaReiser) - [@charliermarsh](https://github.com/charliermarsh) - [@Kalmaegi](https://github.com/Kalmaegi) ##### Install ruff 0.15.18 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.18 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.18/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/git _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.18]_ ### 0.15.17 - Date: 2026-06-11 - Version: 0.15.17 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.17 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.17 - **added** — Allow human-readable names in suppression comments - **fixed** — Fix handling of `ignore` comments within a `disable`/`enable` pair - **added** — Prioritize human-readable names in CLI output - **changed** — Respect diagnostic start and parent ranges and trailing comments in `ruff:ignore` suppressions - **added** — Add `trio.as_safe_channel` to safe decorators for `flake8-async` (ASYNC119) - **added** — Check `pytest_asyncio` fixtures in `flake8-pytest-style` - **added** — Ban `pytest` autouse fixtures with rule RUF076 - **added** — Add `from __future__ import annotations` automatically in `pyupgrade` (UP007, UP045) - **fixed** — Fix diagnostic when `ruff:enable` or `ruff:disable` appears where `ruff:ignore` is expected - **fixed** — Preserve leading empty literals to avoid syntax errors in `pyupgrade` (UP032) - **changed** — Clarify diagnostic message for single parameters in `flake8-pytest-style` (PT007) - **removed** — Drop autofix for `np.in1d` in `numpy` (NPY201) - **changed** — Exempt Python version comparisons in `pylint` (PLR2004) - **changed** — Reserve AST `Vec`s with correct capacity for common cases - **fixed** — Preserve whitespace for Quarto cell option comments in formatter - **added** — Allow rule names in `ruff rule` command ##### Release Notes Released on 2026-06-11. ###### Preview features - Allow human-readable names in suppression comments ([#25614](https://github.com/astral-sh/ruff/pull/25614)) - Fix handling of `ignore` comments within a `disable`/`enable` pair ([#25845](https://github.com/astral-sh/ruff/pull/25845)) - Prioritize human-readable names in CLI output ([#25869](https://github.com/astral-sh/ruff/pull/25869)) - Respect diagnostic start and parent ranges and trailing comments in `ruff:ignore` suppressions ([#25673](https://github.com/astral-sh/ruff/pull/25673)) - \[`flake8-async`\] Add `trio.as_safe_channel` to safe decorators (`ASYNC119`) ([#25775](https://github.com/astral-sh/ruff/pull/25775)) - \[`flake8-pytest-style`\] Also check `pytest_asyncio` fixtures ([#25375](https://github.com/astral-sh/ruff/pull/25375)) - \[`ruff`\] Ban `pytest` autouse fixtures (`RUF076`) ([#25477](https://github.com/astral-sh/ruff/pull/25477)) - \[`pyupgrade`\] Add `from __future__ import annotations` automatically (`UP007`, `UP045`) ([#23259](https://github.com/astral-sh/ruff/pull/23259)) ###### Bug fixes - Fix diagnostic when `ruff:enable` or `ruff:disable` appears where `ruff:ignore` is expected ([#25700](https://github.com/astral-sh/ruff/pull/25700)) - \[`pyupgrade`\] Preserve leading empty literals to avoid syntax errors (`UP032`) ([#25491](https://github.com/astral-sh/ruff/pull/25491)) ###### Rule changes - \[`flake8-pytest-style`\] Clarify diagnostic message for single parameters (`PT007`) ([#25592](https://github.com/astral-sh/ruff/pull/25592)) - \[`numpy`\] Drop autofix for `np.in1d` (`NPY201`) ([#25612](https://github.com/astral-sh/ruff/pull/25612)) - \[`pylint`\] Exempt Python version comparisons (`PLR2004`) ([#25743](https://github.com/astral-sh/ruff/pull/25743)) ###### Performance - Reserve AST `Vec`s with correct capacity for common cases ([#25451](https://github.com/astral-sh/ruff/pull/25451)) ###### Formatter - Preserve whitespace for Quarto cell option comments ([#25641](https://github.com/astral-sh/ruff/pull/25641)) ###### CLI - Allow rule names in `ruff rule` ([#25640](https://github.com/astral-sh/ruff/pull/25640)) ###### Other changes - Fix playground diagnostics scrollbars ([#25642](https://github.com/astral-sh/ruff/pull/25642)) ###### Contributors - [@SuryanshSS1011](https://github.com/SuryanshSS1011) - [@anishgirianish](https://github.com/anishgirianish) - [@romero-deshaw](https://github.com/romero-deshaw) - [@karlhillx](https://github.com/karlhillx) - [@carljm](https://github.com/carljm) - [@ntBre](https://github.com/ntBre) - [@11happy](https://github.com/11happy) - [@Kilo59](https://github.com/Kilo59) - [@oconnor663](https://github.com/oconnor663) - [@LeonidasZhak](https://github.com/LeonidasZhak) - [@DavisVaughan](https://github.com/DavisVaughan) - [@MeGaGiGaGon](https://github.com/MeGaGiGaGon) - [@jonathandung](https://github.com/jonathandung) - [@MichaReiser](https://github.com/MichaReiser) - [@brianmego](https://github.com/brianmego) ##### Install ruff 0.15.17 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.17 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.17/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.17]_ ### 0.15.16 - Date: 2026-06-04 - Version: 0.15.16 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.16 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.16 - **added** — Implement `yield-in-context-manager-in-async-generator` (ASYNC119) for flake8-async - **changed** — Narrow diagnostic range and exclude cases without exception handlers for PLW0717 in pylint - **changed** — Treat `yield` before `break` from a terminal loop as terminal (RUF075) in ruff - **fixed** — Avoid flagging `ruff:ignore` comments as code (ERA001) in eradicate - **fixed** — Fix ERA001/RUF100 conflict when `noqa` is on commented-out code - **fixed** — Avoid removing the `format` call when it would change behavior (F523) in pyflakes - **fixed** — Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (PLE2510, PLE2512, PLE2513, PLE2514, PLE2515) in pylint - **fixed** — Avoid converting `format` calls with more kinds of side effects (UP032) in pyupgrade - **changed** — Avoid fixes for ambiguous `argnames` and `argvalues` combinations (PT006) in flake8-pytest-style - **changed** — Drop excess capacity from statement suites during parsing ##### Release Notes Released on 2026-06-04. ###### Preview features - \[`flake8-async`\] Implement `yield-in-context-manager-in-async-generator` (`ASYNC119`) ([#24644](https://github.com/astral-sh/ruff/pull/24644)) - \[`pylint`\] Narrow diagnostic range and exclude cases without exception handlers (`PLW0717`) ([#25440](https://github.com/astral-sh/ruff/pull/25440)) - \[`ruff`\] Treat `yield` before `break` from a terminal loop as terminal (`RUF075`) ([#25447](https://github.com/astral-sh/ruff/pull/25447)) ###### Bug fixes - \[`eradicate`\] Avoid flagging `ruff:ignore` comments as code (`ERA001`) ([#25537](https://github.com/astral-sh/ruff/pull/25537)) - \[`eradicate`\] Fix `ERA001`/`RUF100` conflict when `noqa` is on commented-out code ([#25414](https://github.com/astral-sh/ruff/pull/25414)) - \[`pyflakes`\] Avoid removing the `format` call when it would change behavior (`F523`) ([#25320](https://github.com/astral-sh/ruff/pull/25320)) - \[`pylint`\] Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (`PLE2510`, `PLE2512`, `PLE2513`, `PLE2514`, `PLE2515`) ([#25544](https://github.com/astral-sh/ruff/pull/25544)) - \[`pyupgrade`\] Avoid converting `format` calls with more kinds of side effects (`UP032`) ([#25484](https://github.com/astral-sh/ruff/pull/25484)) ###### Rule changes - \[`flake8-pytest-style`\] Avoid fixes for ambiguous `argnames` and `argvalues` combinations (`PT006`) ([#24776](https://github.com/astral-sh/ruff/pull/24776)) ###### Performance - Drop excess capacity from statement suites during parsing ([#25368](https://github.com/astral-sh/ruff/pull/25368)) ###### Documentation - \[`pydocstyle`\] Improve discoverability of rules enabled for each convention ([#24973](https://github.com/astral-sh/ruff/pull/24973)) - \[`ruff`\] Restore example code for Python versions before 3.15 (`RUF017`) ([#25439](https://github.com/astral-sh/ruff/pull/25439)) - Fix typo `bin/active` → `bin/activate` in tutorial ([#25473](https://github.com/astral-sh/ruff/pull/25473)) ###### Other changes - Shrink additional parser AST collections ([#25465](https://github.com/astral-sh/ruff/pull/25465)) ###### Contributors - [@Redslayer112](https://github.com/Redslayer112) - [@koriyoshi2041](https://github.com/koriyoshi2041) - [@George-Ogden](https://github.com/George-Ogden) - [@TejasAmle](https://github.com/TejasAmle) - [@anishgirianish](https://github.com/anishgirianish) - [@ntBre](https://github.com/ntBre) - [@MichaReiser](https://github.com/MichaReiser) - [@loganrosen](https://github.com/loganrosen) - [@RafaelJohn9](https://github.com/RafaelJohn9) - [@adityasingh2400](https://github.com/adityasingh2400) ##### Install ruff 0.15.16 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.16 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.16/ruff-aarch64-pc-windows-msvc. _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.16]_ ### 0.15.15 - Date: 2026-05-28 - Version: 0.15.15 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.15 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.15 - **fixed** — Fix Markdown closing fence handling - **added** — Report duplicate imports in typing.TYPE_CHECKING block (F811) - **fixed** — Treat function-scope bare annotations as locals per PEP 526 (F821) - **changed** — Avoid redundant TokenValue drops in the lexer - **changed** — Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens Vec size - **changed** — Use ThinVec in AST to shrink Stmt - **fixed** — Fix formatting of lambdas nested within f-strings - **fixed** — Return code action for codeAction/resolve requests that contain no or no valid URL - **changed** — Expand semantic syntax errors for invalid walruses ##### Release Notes Released on 2026-05-28. ###### Preview features - Fix Markdown closing fence handling ([#25310](https://github.com/astral-sh/ruff/pull/25310)) - \[`pyflakes`\] Report duplicate imports in `typing.TYPE_CHECKING` block (`F811`) ([#22560](https://github.com/astral-sh/ruff/pull/22560)) ###### Bug fixes - \[`pyflakes`\] Treat function-scope bare annotations as locals per PEP 526 (`F821`) ([#21540](https://github.com/astral-sh/ruff/pull/21540)) ###### Performance - Avoid redundant `TokenValue` drops in the lexer ([#25300](https://github.com/astral-sh/ruff/pull/25300)) - Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens `Vec` size ([#25354](https://github.com/astral-sh/ruff/pull/25354)) - Use `ThinVec` in AST to shrink `Stmt` ([#25361](https://github.com/astral-sh/ruff/pull/25361)) ###### Documentation - Fix `line-length` example for `--config` option ([#25389](https://github.com/astral-sh/ruff/pull/25389)) - \[`flake8-comprehensions`\] Document `RecursionError` edge case in `__len__` (`C416`) ([#25286](https://github.com/astral-sh/ruff/pull/25286)) - \[`mccabe`\] Improve example (`C901`) ([#25287](https://github.com/astral-sh/ruff/pull/25287)) - \[`pyupgrade`\] Clarify fix safety docs (`UP007`, `UP045`) ([#25288](https://github.com/astral-sh/ruff/pull/25288)) - \[`refurb`\] Document `FURB192` exception change for empty sequences ([#25317](https://github.com/astral-sh/ruff/pull/25317)) - \[`ruff`\] Document false negative for user-defined types (`RUF013`) ([#25289](https://github.com/astral-sh/ruff/pull/25289)) ###### Formatter - Fix formatting of lambdas nested within f-strings ([#25398](https://github.com/astral-sh/ruff/pull/25398)) ###### Server - Return code action for `codeAction/resolve` requests that contain no or no valid URL ([#25365](https://github.com/astral-sh/ruff/pull/25365)) ###### Other changes - Expand semantic syntax errors for invalid walruses ([#25415](https://github.com/astral-sh/ruff/pull/25415)) ###### Contributors - [@chirizxc](https://github.com/chirizxc) - [@ntBre](https://github.com/ntBre) - [@adityasingh2400](https://github.com/adityasingh2400) - [@charliermarsh](https://github.com/charliermarsh) - [@fallintoplace](https://github.com/fallintoplace) - [@martin-schlossarek](https://github.com/martin-schlossarek) - [@MichaReiser](https://github.com/MichaReiser) - [@Ruchir28](https://github.com/Ruchir28) ##### Install ruff 0.15.15 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.15 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://releases.astral.sh/github/ruff/releases/download/0.15.15/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://releases.astral.sh/github/ruff/release _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.15]_ ### 0.15.14 - Date: 2026-05-21 - Version: 0.15.14 - Original notes: https://github.com/astral-sh/ruff/releases/tag/0.15.14 - Permalink: https://whatsnew.fyi/product/ruff/releases/0.15.14 - **added** — Implement airflow-task-implicit-multiple-outputs (AIR202) rule - **added** — Implement too-many-try-statements (W0717) rule for pylint - **added** — Add incorrect-decorator-order (RUF074) rule - **added** — Add fallible-context-manager (RUF075) rule - **changed** — Mark PTH101 fix as unsafe when first argument is a class attribute annotated as int - **changed** — Skip C417 for lambdas with positional-only parameters - **changed** — Preserve f-string source verbatim in SIM101 fix - **changed** — Treat generic frozenset annotations as immutable - **changed** — Add full PEP 798 support - **changed** — Add a parser recursion limit - **fixed** — Fix lambda formatting in interpolated string expressions - **fixed** — Avoid strict behavior in flake8-type-checking when future-annotations are enabled (TC001, TC002, TC003) - **fixed** — Avoid false positives in else clause for pylint (PLR1733) - **changed** — Avoid unnecessary parser lookahead for operators ##### Release Notes Released on 2026-05-21. ###### Preview features - \[`airflow`\] Implement `airflow-task-implicit-multiple-outputs` (`AIR202`) ([#25152](https://github.com/astral-sh/ruff/pull/25152)) - \[`flake8-use-pathlib`\] Mark `PTH101` fix as unsafe when first argument is a class attribute annotated as `int` ([#25086](https://github.com/astral-sh/ruff/pull/25086)) - \[`pylint`\] Implement `too-many-try-statements` (`W0717`) ([#23970](https://github.com/astral-sh/ruff/pull/23970)) - \[`ruff`\] Add `incorrect-decorator-order` (`RUF074`) ([#23461](https://github.com/astral-sh/ruff/pull/23461)) - \[`ruff`\] Add `fallible-context-manager` (`RUF075`) ([#22844](https://github.com/astral-sh/ruff/pull/22844)) ###### Bug fixes - Fix lambda formatting in interpolated string expressions ([#25144](https://github.com/astral-sh/ruff/pull/25144)) - Treat generic `frozenset` annotations as immutable ([#25251](https://github.com/astral-sh/ruff/pull/25251)) - \[`flake8-type-checking`\] Avoid `strict` behavior when `future-annotations` are enabled (`TC001`, `TC002`, `TC003`) ([#25035](https://github.com/astral-sh/ruff/pull/25035)) - \[`pylint`\] Avoid false positives in `else` clause (`PLR1733`) ([#25177](https://github.com/astral-sh/ruff/pull/25177)) ###### Rule changes - \[`flake8-comprehensions`\] Skip `C417` for lambdas with positional-only parameters ([#25272](https://github.com/astral-sh/ruff/pull/25272)) - \[`flake8-simplify`\] Preserve f-string source verbatim in `SIM101` fix ([#25061](https://github.com/astral-sh/ruff/pull/25061)) ###### Performance - Avoid unnecessary parser lookahead for operators ([#25290](https://github.com/astral-sh/ruff/pull/25290)) ###### Documentation - Update code example setting Neovim LSP log level ([#25284](https://github.com/astral-sh/ruff/pull/25284)) ###### Other changes - Add full PEP 798 support ([#25104](https://github.com/astral-sh/ruff/pull/25104)) - Add a parser recursion limit ([#24810](https://github.com/astral-sh/ruff/pull/24810)) - Update various `ruff_python_stdlib` APIs ([#25273](https://github.com/astral-sh/ruff/pull/25273)) ###### Contributors - [@ocaballeror](https://github.com/ocaballeror) - [@lerebear](https://github.com/lerebear) - [@samuelcolvin](https://github.com/samuelcolvin) - [@baltasarblanco](https://github.com/baltasarblanco) - [@aconal-com](https://github.com/aconal-com) - [@anishgirianish](https://github.com/anishgirianish) - [@JelleZijlstra](https://github.com/JelleZijlstra) - [@AlexWaygood](https://github.com/AlexWaygood) - [@ntBre](https://github.com/ntBre) - [@adityasingh2400](https://github.com/adityasingh2400) - [@charliermarsh](https://github.com/charliermarsh) - [@Dev-iL](https://github.com/Dev-iL) - [@neutrinoceros](https://github.com/neutrinoceros) - [@shivamtiwari3](https://github.com/shivamtiwari3) - [@Dev-X25874](https://github.com/Dev-X25874) ##### Install ruff 0.15.14 ###### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.14/ruff-installer.sh | sh ``` ###### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.14/ruff-installer.ps1 | iex" ``` ##### Download ruff 0.15.14 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.14/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.14/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86_64-apple-darwin.tar.gz](https://releases.astral.sh/github/ruff/releases/download/0.15.14/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://releases.astral.sh/github/ruff/releases/download/0.15.14/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://releases.astral. _[Truncated at 4000 characters — full notes: https://github.com/astral-sh/ruff/releases/tag/0.15.14]_