Releases: astral-sh/ruff
Release list
0.16.2
Release Notes
Released on 2026-08-06.
Bug fixes
- [
flake8-pyi] Avoid false positives onsingledispatchfunctions (PYI041) (#27335)
Server
- Register formatting capabilities dynamically to exclude TOML files (#27332)
Contributors
Install ruff 0.16.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-installer.ps1 | iex"Download ruff 0.16.2
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/ruffYou 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.16.1
Release Notes
Released on 2026-07-30.
Preview features
- Add an option to opt out of human-readable names (#27160)
- [
flake8-pytest-style] Make fixes safe by default and unsafe only when comments are present (PT018) (#27201) - [
pyupgrade] Skip fix when a defaultedTypeVarprecedes a non-defaulted one (UP040,UP046,UP047) (#27133) - [
ruff] Fix false positive with unpacked arguments (RUF065) (#26959)
Bug fixes
- Bump
gen-lsp-typesto gracefully handle unknown enumeration values in LSP messages (#27230) - [
flake8-bugbear] Markrangeas immutable (B008) (#27247) - [
flake8-comprehensions] NFKC-normalize keyword names inC408fix (#26813) - [
flake8-return] Fix false positive when variable is read infinallyclause (RET504) (#25441) - [
pydocstyle] Skip section detection inside RST directive bodies (D214,D405,D413) (#23635) - [
refurb] Parenthesizeyieldarguments in theFURB192fix (#27192)
Rule changes
- [
flake8-pytest-style] MarkPT022fixes as unsafe (#26440) - [
refurb] Mark fixes that remove unknown separators as unsafe (FURB105) (#27200)
Server
Documentation
- Cover
pyconMarkdown formatting (#27153) - [
flake8-bandit] DocumentTYPE_CHECKINGexception (S101) (#27004) - [
flake8-import-conventions] Document thatextend-aliasescan override default aliases (#27191) - [
pylint] Add missing fix safety gotchas fornon-augmented-assignment(PLR6104) (#27250)
Other changes
- Reduce syntax error noise by swallowing dedents like indents (#27170)
- Vendor latest annotate-snippets (#27033)
Contributors
- @bxff
- @anishgirianish
- @Avasam
- @epage
- @LHMQ878
- @MichaReiser
- @ntBre
- @HarshalPatel1972
- @mjpieters
- @joshuavetos
- @jesco-absolute
- @vidigoat
- @baltasarblanco
- @ribru17
- @oh-summy
- @Jayashanker-Padishala
Install ruff 0.16.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.1/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.16.1/ruff-installer.ps1 | iex"Download ruff 0.16.1
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/ruffYou 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.16.0
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, andF722. -
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: ignorecomments at the ends of lines, likenoqacomments, or on the line preceding a diagnostic. For example, these both suppress anunused-import(F401) diagnostic:import math # ruff: ignore[F401] # ruff: ignore[F401] import os
-
Fixes are now shown in
checkandformat --checkoutput:❯ 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 --checknow supports the same output formats as the linter, including thegithubandgitlaboutputs 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, andfix.edits[].end_locationfields in the JSON output format may now benullrather 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(AIR303)missing-copyright-notice(CPY001)unnecessary-from-float(FURB164)sorted-min-max(FURB192)implicit-string-concatenation-in-collection-literal(ISC004)log-exception-outside-except-handler(LOG004)invalid-bool-return-type(PLE0304)too-many-positional-arguments(PLR0917)stop-iteration-return(PLR1708)none-not-at-end-of-union(RUF036)access-annotations-from-class-dict(RUF063)duplicate-entry-in-dunder-all(RUF068)
The following behaviors have been stabilized:
blind-except(BLE001) is now suppressed when the exception is logged vialoggingmethods other thancritical,errorandexception.future-required-type-annotation(FA102) now checks for additional PEP 585-compatible APIs, such as those fromcollections.abc.f-string-in-get-text-func-call(INT001),format-in-get-text-func-call(INT002), andprintf-in-get-text-func-call(INT003) now check for additional common ways of using thegettextmodule, such as assigning it tobuiltins._.suspicious-url-open-usage(S310) now resolves local string literal bindings to avoid more false positives.snmp-insecure-version(S508) andsnmp-weak-cryptography(S509) now support the recommended API from newer versions of PySNMP.typing-text-str-alias(UP019) now recognizestyping_extensions.Textin addition totyping.Text.
Preview features
- [
pyupgrade] Fix false positive withTypeVardefault 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 upunnecessary-future-import(UP010) (#27047)
Documentation
- [
ruff] Add missing period in "Why is this bad?" section (RUF200) (#26930) - [
flake8-simplify] Clarifyos.environbehavior 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 | shInstall 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
| File | Platform | Checksum |
|---|---|---|
| ruff-aarch64-apple-darwin.tar.gz | Apple Silicon macOS | checksum |
| ruff-x86_64-apple-darwin.tar.gz | Intel macOS | checksum |
| ruff-aarch64-pc-windows-msvc.zip | ARM64 Windows | checksum |
| ruff-i686-pc-windows-msvc.zip | x86 Windows | checksum |
| ruff-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| ruff-aarch64-unknown-linux-gnu.tar.gz | ARM64 Linux | checksum |
| ruff-i686-unknown-linux-gnu.tar.gz | x86 Linux | checksum |
| ruff-powerpc64-unknown-linux-gnu.tar.gz | PPC64 Linux | checksum |
| ruff-powerpc64le-unknown-linux-gnu.tar.gz | PPC64LE Linux | checksum |
| ruff-riscv64gc-unknown-linux-gnu.tar.gz | RISCV Linux | checksum |
| [ruff-s390x-unknow... |
0.15.22
Release Notes
Released on 2026-07-16.
Preview features
- [
pycodestyle] Add an autofix forE402(#22212) - [
refurb] Allow subclassing builtins in stub files (FURB189) (#26812) - [
ruff] Add rule to replacenoqacomments withruff:ignore(RUF105) (#26423) - [
ruff] Add rule to use human-readable names inruff:ignorecomments (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 inredefined-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 fordatetime.today(DTZ002) (#26658) - [
pycodestyle] DocumentE731fix safety (#26847) - [
ruff] Clarify intentional async contexts forunused-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 | shInstall 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
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/ruffYou 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
Release Notes
Released on 2026-07-09.
Preview features
- Add
--add-ignorefor addingruff:ignorecomments (#26346) - [
flake8-comprehensions] DropC409tuple comprehension preview behavior (#25707) - Avoid whitespace normalization when formatting comments (#26455)
- [
pyupgrade] Lint and fix use of deprecatedabcdecorators (UP051) (#26417)
Bug fixes
- Refine non-empty f-string detection (#26526)
- Detect syntax errors in individual notebook cells (#26419)
- [
flake8-implicit-str-concat] FixISC003autofix incorrectly stripping+from comments (#26554)
Rule changes
- [
flake8-executable] MarkEXE004fix as unsafe (#26033) - [
flake8-pyi] MarkPYI061fixes as unsafe in Python files (#26533) - [
pydocstyle] Skipoverload-with-docstringin 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_elementin 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-excludetoruff 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 formako-templates(S702) (#26432) - [
ruff] Fix non-triggering example forif-key-in-dict-del(RUF051) (#26433)
Contributors
- @EkriirkE
- @tingerrr
- @s-rigaud
- @nikolauspschuetz
- @Avasam
- @ntBre
- @omar-y-abdi
- @AlexWaygood
- @sylvestre
- @shaanmajid
- @lerebear
- @baltasarblanco
- @Sanjays2402
- @ZedThree
- @servusdei2018
- @charliermarsh
- @jesco-absolute
- @velikodniy
- @zaniebot
- @epage
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 | shInstall 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
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/ruffYou 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
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
noqashebang handling inruff:ignorecomments (#26286) - [
ruff] Removepytest-fixture-autouse(RUF076) (#26240, #26371)
Documentation
- Add versioning sections to custom crate READMEs (#26317)
- Update
ruff_python_parserREADME for crates.io (#26315) - [
perflint] Clarify thatPERF402applies 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 | shInstall 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
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/ruffYou 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
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 thatPYI051is an opinionated stylistic rule (#26179) - [
pyupgrade] ClarifyUP029as 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 | shInstall 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
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/ruffYou 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
Release Notes
Released on 2026-06-18.
Preview features
- Handle nested
ruff:ignorecomments (#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] ExtendPYI033to 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] RenamePYI033tolegacy-type-comment(#26131)
Performance
- Use
ThinVecfor 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
yieldexpressions after commas (#26024) - Validate function type parameter default order (#25981)
Playground
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 | shInstall 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
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/ruffYou 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
Release Notes
Released on 2026-06-11.
Preview features
- Allow human-readable names in suppression comments (#25614)
- Fix handling of
ignorecomments within adisable/enablepair (#25845) - Prioritize human-readable names in CLI output (#25869)
- Respect diagnostic start and parent ranges and trailing comments in
ruff:ignoresuppressions (#25673) - [
flake8-async] Addtrio.as_safe_channelto safe decorators (ASYNC119) (#25775) - [
flake8-pytest-style] Also checkpytest_asynciofixtures (#25375) - [
ruff] Banpytestautouse fixtures (RUF076) (#25477) - [
pyupgrade] Addfrom __future__ import annotationsautomatically (UP007,UP045) (#23259)
Bug fixes
- Fix diagnostic when
ruff:enableorruff:disableappears whereruff:ignoreis 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 fornp.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
- @SuryanshSS1011
- @anishgirianish
- @romero-deshaw
- @karlhillx
- @carljm
- @ntBre
- @11happy
- @Kilo59
- @oconnor663
- @LeonidasZhak
- @DavisVaughan
- @MeGaGiGaGon
- @jonathandung
- @MichaReiser
- @brianmego
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 | shInstall 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
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/ruffYou 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
Release Notes
Released on 2026-06-04.
Preview features
- [
flake8-async] Implementyield-in-context-manager-in-async-generator(ASYNC119) (#24644) - [
pylint] Narrow diagnostic range and exclude cases without exception handlers (PLW0717) (#25440) - [
ruff] Treatyieldbeforebreakfrom a terminal loop as terminal (RUF075) (#25447)
Bug fixes
- [
eradicate] Avoid flaggingruff:ignorecomments as code (ERA001) (#25537) - [
eradicate] FixERA001/RUF100conflict whennoqais on commented-out code (#25414) - [
pyflakes] Avoid removing theformatcall 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 convertingformatcalls with more kinds of side effects (UP032) (#25484)
Rule changes
- [
flake8-pytest-style] Avoid fixes for ambiguousargnamesandargvaluescombinations (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/active→bin/activatein tutorial (#25473)
Other changes
- Shrink additional parser AST collections (#25465)
Contributors
- @Redslayer112
- @koriyoshi2041
- @George-Ogden
- @TejasAmle
- @anishgirianish
- @ntBre
- @MichaReiser
- @loganrosen
- @RafaelJohn9
- @adityasingh2400
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 | shInstall 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
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/ruffYou 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>