What’s New

ruff

Developer Tools

ruff release notes.

Latest 0.16.0 · by ruffWebsiteastral-sh/ruff

Changelog

0.16.0

Added
  • Ruff can now format Python code blocks in Markdown files and will do this by default
  • Ruff now supports `ruff: ignore` comments at the ends of lines or on the line preceding a diagnostic to suppress diagnostics
  • The `format --check` command now supports the same output formats as the linter, including `github` and `gitlab` outputs for rendering annotations in CI
Changed
  • Ruff now enables a much larger set of rules by default (413, up from 59)
  • Fixes are now shown in `check` and `format --check` output
  • 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
  • Stabilized `airflow3-incompatible-function-signature` (AIR303) rule
  • Stabilized `missing-copyright-notice` (CPY001) rule
  • Stabilized `unnecessary-from-float` (FURB164) rule
  • Stabilized `sorted-min-max` (FURB192) rule
  • Stabilized `implicit-string-concatenation-in-collection-literal` (ISC004) rule
  • Stabilized `log-exception-outside-except-handler` (LOG004) rule
  • Stabilized `invalid-bool-return-type` (PLE0304) rule
  • Stabilized `too-many-positional-arguments` (PLR0917) rule
  • Stabilized `stop-iteration-return` (PLR1708) rule
  • Stabilized `none-not-at-end-of-union` (RUF036) rule
  • Stabilized `access-annotations-from-class-dict` (RUF063) rule
  • Stabilized `duplicate-entry-in-dunder-all` (RUF068) rule
  • The `blind-except` (BLE001) rule is now suppressed when the exception is logged via `logging` methods other than `critical`, `error`, and `exception`
  • The `future-required-type-annotation` (FA102) rule now checks for additional PEP 585-compatible APIs such as those from `collections.abc`
  • The `suspicious-url-open-usage` (S310) rule now resolves local string literal bindings to avoid more false positives
  • The `snmp-insecure-version` (S508) and `snmp-weak-cryptography` (S509) rules now support the recommended API from newer versions of PySNMP
  • The `typing-text-str-alias` (UP019) rule now recognizes `typing_extensions.Text` in addition to `typing.Text`
  • Insert a space after the colon in Ruff suppression comments
Fixed
  • Fix missing check on unrecognized early bound (RUF016)
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
Release Notes

Released on 2026-07-23.

Check out the blog post 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 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 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 (F401) diagnostic:

    import math  # ruff: ignore[F401]
    
    # ruff: ignore[F401]
    import os
    
  • Fixes are now shown in check and format --check output:

    ❯ 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:

    ❯ 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 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:

The following behaviors have been stabilized:

Preview features
  • [pyupgrade] Fix false positive with TypeVar default before Python 3.13 (UP040) (#26888)
Bug fixes
  • [ruff] Fix missing check on unrecognized early bound (RUF016) (#26986)
Rule changes
  • Insert a space after the colon in Ruff suppression comments (#27123)
Performance
  • [pyupgrade] Speed up unnecessary-future-import (UP010) (#27047)
Documentation
  • [ruff] Add missing period in "Why is this bad?" section (RUF200) (#26930)
  • [flake8-simplify] Clarify os.environ behavior on Windows (SIM112) (#26972)
  • [pydocstyle] Document fix safety (D400) (#26971)
Contributors
Install ruff 0.16.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.0/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.16.0/ruff-installer.ps1 | iex"
Download ruff 0.16.0
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.22

Added
  • Add an autofix for E402 in pycodestyle
  • Allow subclassing builtins in stub files for FURB189 in refurb
  • Add rule to replace noqa comments with ruff:ignore (RUF105)
  • Add rule to use human-readable names in ruff:ignore comments (RUF106)
  • Add rule to use human-readable names in configuration selectors (RUF201)
Changed
  • Ignore mutable type updates in redefined-loop-name (PLW2901) in pylint
  • Avoid redundant lexer token bookkeeping
  • Avoid redundant pending-indentation writes
  • Avoid unnecessary identifier lookahead
  • Reuse parser scratch buffers
Fixed
  • Fix false positive in __all__ for PYI053 in flake8-pyi
Release Notes

Released on 2026-07-16.

Preview features
  • [pycodestyle] Add an autofix for E402 (#22212)
  • [refurb] Allow subclassing builtins in stub files (FURB189) (#26812)
  • [ruff] Add rule to replace noqa comments with ruff:ignore (RUF105) (#26423)
  • [ruff] Add rule to use human-readable names in ruff:ignore comments (RUF106) (#26682)
  • [ruff] Add rule to use human-readable names in configuration selectors (RUF201) (#26772)
Bug fixes
  • [flake8-pyi] Fix false positive in __all__ (PYI053) (#26872)
Rule changes
  • [pylint] Ignore mutable type updates in redefined-loop-name (PLW2901) (#25733)
Performance
  • Avoid redundant lexer token bookkeeping (#26765)
  • Avoid redundant pending-indentation writes (#26774)
  • Avoid unnecessary identifier lookahead (#26525)
  • Reuse parser scratch buffers (#26798)
Documentation
  • Document argfile support (#26803)
  • [flake8-datetimez] Clarify naming guidance for datetime.today (DTZ002) (#26658)
  • [pycodestyle] Document E731 fix safety (#26847)
  • [ruff] Clarify intentional async contexts for unused-async (RUF029) (#26641)
Contributors
Install ruff 0.15.22
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.21

Added
  • Add `--add-ignore` for adding `ruff:ignore` comments
  • Lint and fix use of deprecated `abc` decorators (`UP051`)
Changed
  • Drop `C409` tuple comprehension preview behavior
  • Avoid whitespace normalization when formatting comments
  • Mark `EXE004` fix as unsafe
  • Mark `PYI061` fixes as unsafe in Python files
  • Skip `overload-with-docstring` in stub files (`D418`)
  • Add `--extend-exclude` to `ruff format`
Fixed
  • Refine non-empty f-string detection
  • Detect syntax errors in individual notebook cells
  • 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)
  • [flake8-comprehensions] Drop C409 tuple comprehension preview behavior (#25707)
  • Avoid whitespace normalization when formatting comments (#26455)
  • [pyupgrade] Lint and fix use of deprecated abc decorators (UP051) (#26417)
Bug fixes
  • Refine non-empty f-string detection (#26526)
  • Detect syntax errors in individual notebook cells (#26419)
  • [flake8-implicit-str-concat] Fix ISC003 autofix incorrectly stripping + from comments (#26554)
Rule changes
  • [flake8-executable] Mark EXE004 fix as unsafe (#26033)
  • [flake8-pyi] Mark PYI061 fixes as unsafe in Python files (#26533)
  • [pydocstyle] Skip overload-with-docstring in stub files (D418) (#26318)
Performance
  • Avoid per-token source index visitor calls (#26506)
  • Cache parenthesized expression boundaries in the formatter (#26344)
  • Improve performance of rendering edits in preview mode (#26565)
  • Inline fits_element in formatter (#26429)
  • Inline formatter printing hot paths (#26504)
  • Lazily create builtin bindings (#26510)
  • Skip empty trivia scans in the source indexer (#26507)
  • Use ICF for macOS release builds (#25780)
Formatter
  • Add --extend-exclude to ruff format (#26372)
Documentation
  • Add "How does Ruff's import sorting compare to isort?" link to README (#26530)
  • Fix Mozilla Firefox repository link in README (#26537)
  • [flake8-bandit] Fix misleading docstring for mako-templates (S702) (#26432)
  • [ruff] Fix non-triggering example for if-key-in-dict-del (RUF051) (#26433)
Contributors
Install ruff 0.15.21
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.21/ruff-installer.ps1 | iex"
Download ruff 0.15.21
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.20

Added
  • Allow human-readable names in rule selectors
Changed
  • Emit a warning instead of an error for unknown rule selectors
  • 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)
  • Emit a warning instead of an error for unknown rule selectors (#26113)
  • Match noqa shebang handling in ruff:ignore comments (#26286)
  • [ruff] Remove pytest-fixture-autouse (RUF076) (#26240, #26371)
Documentation
  • Add versioning sections to custom crate READMEs (#26317)
  • Update ruff_python_parser README for crates.io (#26315)
  • [perflint] Clarify that PERF402 applies to any iterable (#26242)
Contributors
Install ruff 0.15.20
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.19

Added
  • Support human-readable names when hovering suppression comments and in code actions
Changed
  • Update fix suggestions for `__floor__`, `__trunc__`, `__length_hint__`, and `__matmul__` variants (PLC2801)
  • Avoid allocating when parsing single string literals
  • Avoid reallocating singleton call arguments
  • Lazily create source files for lint diagnostics
  • Optimize formatter text width and indentation
  • Reserve capacity for builtin bindings
  • Skip repeated-key checks for singleton dictionaries
  • Use ArrayVec for qualified name segments
Fixed
  • Fall back to default settings when editor-only settings are invalid
  • Fix panic when inserting text at a notebook cell boundary
Release Notes

Released on 2026-06-23.

Preview features
  • Support human-readable names when hovering suppression comments and in code actions (#26114)
Bug fixes
  • Fall back to default settings when editor-only settings are invalid (#26244)
  • Fix panic when inserting text at a notebook cell boundary (#26111)
Rule changes
  • [pylint] Update fix suggestions for __floor__, __trunc__, __length_hint__, and __matmul__ variants (PLC2801) (#26239)
Performance
  • Avoid allocating when parsing single string literals (#26200)
  • Avoid reallocating singleton call arguments (#26223)
  • Lazily create source files for lint diagnostics (#26226)
  • Optimize formatter text width and indentation (#26236)
  • Reserve capacity for builtin bindings (#26229)
  • Skip repeated-key checks for singleton dictionaries (#26228)
  • Use ArrayVec for qualified name segments (#26224)
Documentation
  • [flake8-pyi] Note that PYI051 is an opinionated stylistic rule (#26179)
  • [pyupgrade] Clarify UP029 as a Python 2 compatibility rule (#26243)
Other changes
  • Publish Ruff crates to crates.io (#26271)
Contributors
Install ruff 0.15.19
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.18

Added
  • Handle nested `ruff:ignore` comments
  • Prevent property docstrings starting with verbs in pydocstyle (D421)
  • Extend PYI033 to Python files in flake8-pyi
  • Make diagnostic links clickable in playground
Changed
  • Stop displaying severity in output
  • Use human-readable names in CLI output
  • Use human-readable names in LSP and playground diagnostics
  • Rename PYI033 to legacy-type-comment in flake8-pyi
  • Render subdiagnostics and secondary annotations as related information in LSP server
Fixed
  • Detect equivalent numeric mapping keys
  • Detect mapping keys equivalent to booleans
  • Detect repeated signed and complex dictionary keys
  • Reject `__debug__` lambda parameters in parser
  • Reject `_` as a match-pattern target in parser
  • Reject multiple starred names in sequence patterns in parser
  • Reject parenthesized star imports in parser
  • Reject starred comprehension targets in parser
  • Reject unparenthesized generator expressions in class bases in parser
  • Reject `yield` expressions after commas in parser
  • Validate function type parameter default order in parser
Release Notes

Released on 2026-06-18.

Preview features
  • Handle nested ruff:ignore comments (#25791)
  • Stop displaying severity in output (#26050)
  • Use human-readable names in CLI output (#25937)
  • Use human-readable names in LSP and playground diagnostics (#26058)
  • [pydocstyle] Prevent property docstrings starting with verbs (D421) (#23775)
  • [flake8-pyi] Extend PYI033 to Python files (#26129)
Bug fixes
  • Detect equivalent numeric mapping keys (#26009)
  • Detect mapping keys equivalent to booleans (#25982)
  • Detect repeated signed and complex dictionary keys (#26007)
Rule changes
  • [flake8-pyi] Rename PYI033 to legacy-type-comment (#26131)
Performance
  • Use ThinVec for call keywords (#25999)
  • Inline parser recovery context checks (#26038)
  • Match parser keywords as bytes (#26037)
  • Move value parsing out of lexing (#25360)
Server
  • Render subdiagnostics and secondary annotations as related information (#26011)
Documentation
  • Update fix availability for always-fixable rules (#26091)
  • [flake8-tidy-imports] Add fix safety section (TID252) (#17491)
Parser
  • Reject __debug__ lambda parameters (#26022)
  • Reject _ as a match-pattern target (#25977)
  • Reject multiple starred names in sequence patterns (#25976)
  • Reject parenthesized star imports (#26021)
  • Reject starred comprehension targets (#26023)
  • Reject unparenthesized generator expressions in class bases (#25978)
  • Reject yield expressions after commas (#26024)
  • Validate function type parameter default order (#25981)
Playground
  • Make diagnostic links clickable (#26104)
  • Use diagnostic tags (#26105)
Contributors
Install ruff 0.15.18
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.17

Added
  • Allow human-readable names in suppression comments
  • Prioritize human-readable names in CLI output
  • Add `trio.as_safe_channel` to safe decorators for `flake8-async` (ASYNC119)
  • Check `pytest_asyncio` fixtures in `flake8-pytest-style`
  • Ban `pytest` autouse fixtures with rule RUF076
  • Add `from __future__ import annotations` automatically in `pyupgrade` (UP007, UP045)
  • Allow rule names in `ruff rule` command
Changed
  • Respect diagnostic start and parent ranges and trailing comments in `ruff:ignore` suppressions
  • Clarify diagnostic message for single parameters in `flake8-pytest-style` (PT007)
  • Exempt Python version comparisons in `pylint` (PLR2004)
  • Reserve AST `Vec`s with correct capacity for common cases
Fixed
  • Fix handling of `ignore` comments within a `disable`/`enable` pair
  • Fix diagnostic when `ruff:enable` or `ruff:disable` appears where `ruff:ignore` is expected
  • Preserve leading empty literals to avoid syntax errors in `pyupgrade` (UP032)
  • Preserve whitespace for Quarto cell option comments in formatter
Removed
  • Drop autofix for `np.in1d` in `numpy` (NPY201)
Release Notes

Released on 2026-06-11.

Preview features
  • Allow human-readable names in suppression comments (#25614)
  • Fix handling of ignore comments within a disable/enable pair (#25845)
  • Prioritize human-readable names in CLI output (#25869)
  • Respect diagnostic start and parent ranges and trailing comments in ruff:ignore suppressions (#25673)
  • [flake8-async] Add trio.as_safe_channel to safe decorators (ASYNC119) (#25775)
  • [flake8-pytest-style] Also check pytest_asyncio fixtures (#25375)
  • [ruff] Ban pytest autouse fixtures (RUF076) (#25477)
  • [pyupgrade] Add from __future__ import annotations automatically (UP007, UP045) (#23259)
Bug fixes
  • Fix diagnostic when ruff:enable or ruff:disable appears where ruff:ignore is expected (#25700)
  • [pyupgrade] Preserve leading empty literals to avoid syntax errors (UP032) (#25491)
Rule changes
  • [flake8-pytest-style] Clarify diagnostic message for single parameters (PT007) (#25592)
  • [numpy] Drop autofix for np.in1d (NPY201) (#25612)
  • [pylint] Exempt Python version comparisons (PLR2004) (#25743)
Performance
  • Reserve AST Vecs with correct capacity for common cases (#25451)
Formatter
  • Preserve whitespace for Quarto cell option comments (#25641)
CLI
  • Allow rule names in ruff rule (#25640)
Other changes
  • Fix playground diagnostics scrollbars (#25642)
Contributors
Install ruff 0.15.17
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

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
  • Treat `yield` before `break` from a terminal loop as terminal (RUF075) in ruff
  • Avoid fixes for ambiguous `argnames` and `argvalues` combinations (PT006) in flake8-pytest-style
  • Drop excess capacity from statement suites during parsing
Fixed
  • Avoid flagging `ruff:ignore` comments as code (ERA001) in eradicate
  • Fix ERA001/RUF100 conflict when `noqa` is on commented-out code
  • Avoid removing the `format` call when it would change behavior (F523) in pyflakes
  • Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (PLE2510, PLE2512, PLE2513, PLE2514, PLE2515) in pylint
  • Avoid converting `format` calls with more kinds of side effects (UP032) in pyupgrade
Release Notes

Released on 2026-06-04.

Preview features
  • [flake8-async] Implement yield-in-context-manager-in-async-generator (ASYNC119) (#24644)
  • [pylint] Narrow diagnostic range and exclude cases without exception handlers (PLW0717) (#25440)
  • [ruff] Treat yield before break from a terminal loop as terminal (RUF075) (#25447)
Bug fixes
  • [eradicate] Avoid flagging ruff:ignore comments as code (ERA001) (#25537)
  • [eradicate] Fix ERA001/RUF100 conflict when noqa is on commented-out code (#25414)
  • [pyflakes] Avoid removing the format call when it would change behavior (F523) (#25320)
  • [pylint] Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (PLE2510, PLE2512, PLE2513, PLE2514, PLE2515) (#25544)
  • [pyupgrade] Avoid converting format calls with more kinds of side effects (UP032) (#25484)
Rule changes
  • [flake8-pytest-style] Avoid fixes for ambiguous argnames and argvalues combinations (PT006) (#24776)
Performance
  • Drop excess capacity from statement suites during parsing (#25368)
Documentation
  • [pydocstyle] Improve discoverability of rules enabled for each convention (#24973)
  • [ruff] Restore example code for Python versions before 3.15 (RUF017) (#25439)
  • Fix typo bin/activebin/activate in tutorial (#25473)
Other changes
  • Shrink additional parser AST collections (#25465)
Contributors
Install ruff 0.15.16
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.15

Added
  • Report duplicate imports in typing.TYPE_CHECKING block (F811)
Changed
  • Avoid redundant TokenValue drops in the lexer
  • Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens Vec size
  • Use ThinVec in AST to shrink Stmt
  • Expand semantic syntax errors for invalid walruses
Fixed
  • Fix Markdown closing fence handling
  • Treat function-scope bare annotations as locals per PEP 526 (F821)
  • Fix formatting of lambdas nested within f-strings
  • Return code action for codeAction/resolve requests that contain no or no valid URL
Release Notes

Released on 2026-05-28.

Preview features
  • Fix Markdown closing fence handling (#25310)
  • [pyflakes] Report duplicate imports in typing.TYPE_CHECKING block (F811) (#22560)
Bug fixes
  • [pyflakes] Treat function-scope bare annotations as locals per PEP 526 (F821) (#21540)
Performance
  • Avoid redundant TokenValue drops in the lexer (#25300)
  • Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens Vec size (#25354)
  • Use ThinVec in AST to shrink Stmt (#25361)
Documentation
  • Fix line-length example for --config option (#25389)
  • [flake8-comprehensions] Document RecursionError edge case in __len__ (C416) (#25286)
  • [mccabe] Improve example (C901) (#25287)
  • [pyupgrade] Clarify fix safety docs (UP007, UP045) (#25288)
  • [refurb] Document FURB192 exception change for empty sequences (#25317)
  • [ruff] Document false negative for user-defined types (RUF013) (#25289)
Formatter
  • Fix formatting of lambdas nested within f-strings (#25398)
Server
  • Return code action for codeAction/resolve requests that contain no or no valid URL (#25365)
Other changes
  • Expand semantic syntax errors for invalid walruses (#25415)
Contributors
Install ruff 0.15.15
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

0.15.14

Added
  • Implement airflow-task-implicit-multiple-outputs (AIR202) rule
  • Implement too-many-try-statements (W0717) rule for pylint
  • Add incorrect-decorator-order (RUF074) rule
  • Add fallible-context-manager (RUF075) rule
Changed
  • Mark PTH101 fix as unsafe when first argument is a class attribute annotated as int
  • Skip C417 for lambdas with positional-only parameters
  • Preserve f-string source verbatim in SIM101 fix
  • Treat generic frozenset annotations as immutable
  • Add full PEP 798 support
  • Add a parser recursion limit
  • Avoid unnecessary parser lookahead for operators
Fixed
  • Fix lambda formatting in interpolated string expressions
  • Avoid strict behavior in flake8-type-checking when future-annotations are enabled (TC001, TC002, TC003)
  • Avoid false positives in else clause for pylint (PLR1733)
Release Notes

Released on 2026-05-21.

Preview features
  • [airflow] Implement airflow-task-implicit-multiple-outputs (AIR202) (#25152)
  • [flake8-use-pathlib] Mark PTH101 fix as unsafe when first argument is a class attribute annotated as int (#25086)
  • [pylint] Implement too-many-try-statements (W0717) (#23970)
  • [ruff] Add incorrect-decorator-order (RUF074) (#23461)
  • [ruff] Add fallible-context-manager (RUF075) (#22844)
Bug fixes
  • Fix lambda formatting in interpolated string expressions (#25144)
  • Treat generic frozenset annotations as immutable (#25251)
  • [flake8-type-checking] Avoid strict behavior when future-annotations are enabled (TC001, TC002, TC003) (#25035)
  • [pylint] Avoid false positives in else clause (PLR1733) (#25177)
Rule changes
  • [flake8-comprehensions] Skip C417 for lambdas with positional-only parameters (#25272)
  • [flake8-simplify] Preserve f-string source verbatim in SIM101 fix (#25061)
Performance
  • Avoid unnecessary parser lookahead for operators (#25290)
Documentation
  • Update code example setting Neovim LSP log level (#25284)
Other changes
  • Add full PEP 798 support (#25104)
  • Add a parser recursion limit (#24810)
  • Update various ruff_python_stdlib APIs (#25273)
Contributors
Install ruff 0.15.14
Install prebuilt binaries via shell script
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
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
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>