Releases: astral-sh/ruff
0.15.12
Release Notes
Released on 2026-04-24.
Preview features
- Implement
#ruff:file-ignorefile-level suppressions (#23599) - Implement
#ruff:ignorelogical-line suppressions (#23404) - Revert preview changes to displayed diagnostic severity in LSP (#24789)
- [
airflow] Implementtask-branch-as-short-circuit(AIR004) (#23579) - [
flake8-bugbear] Fixbreak/continuehandling inloop-iterator-mutation(B909) (#24440) - [
pylint] FixPLC2701for type parameter scopes (#24576)
Rule changes
- [
pandas-vet] Suggest.arrayas well inPD011(#24805)
CLI
- Respect default Unix permissions for cache files (#24794)
Documentation
- [
pylint] FixPLR0124description not to claim self-comparison always returns the same value (#24749) - [
pyupgrade] Expand docs on reusableTypeVars and scoping (UP046) (#24153) - Improve rules table accessibility (#24711)
Contributors
- @dylwil3
- @AlexWaygood
- @woodruffw
- @avasis-ai
- @Dev-iL
- @denyszhak
- @ShipItAndPray
- @anishgirianish
- @augustelalande
- @amyreese
- @majiayu000
Install ruff 0.15.12
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.12/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.12/ruff-installer.ps1 | iex"Download ruff 0.15.12
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.11
Release Notes
Released on 2026-04-16.
Preview features
- [
ruff] IgnoreRUF029when function is decorated withasynccontextmanager(#24642) - [
airflow] Implementairflow-xcom-pull-in-template-string(AIR201) (#23583) - [
flake8-bandit] FixS103false positives and negatives in mask analysis (#24424)
Bug fixes
- [
flake8-async] Omit overridden methods forASYNC109(#24648)
Documentation
- [
flake8-async] Add override mention toASYNC109docs (#24666) - Update Neovim config examples to use
vim.lsp.config(#24577)
Contributors
Install ruff 0.15.11
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.11/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.11/ruff-installer.ps1 | iex"Download ruff 0.15.11
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.10
Release Notes
Released on 2026-04-09.
Preview features
- [
flake8-logging] Allow closures in except handlers (LOG004) (#24464) - [
flake8-self] MakeSLFdiagnostics robust to non-self-named variables (#24281) - [
flake8-simplify] Make the fix forcollapsible-ifsafe inpreview(SIM102) (#24371)
Bug fixes
- Avoid emitting multi-line f-string elements before Python 3.12 (#24377)
- Avoid syntax error from
E502fixes in f-strings and t-strings (#24410) - Strip form feeds from indent passed to
dedent_to(#24381) - [
pyupgrade] Fix panic caused by handling of octals (UP012) (#24390) - Reject multi-line f-string elements before Python 3.12 (#24355)
Rule changes
- [
ruff] Treat f-string interpolation as potential side effect (RUF019) (#24426)
Server
- Add support for custom file extensions (#24463)
Documentation
Contributors
Install ruff 0.15.10
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.10/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.10/ruff-installer.ps1 | iex"Download ruff 0.15.10
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.9
Release Notes
Released on 2026-04-02.
Preview features
- [
pyflakes] Flag annotated variable redeclarations asF811in preview mode (#24244) - [
ruff] Allow dunder-named assignments in non-strict mode forRUF067(#24089)
Bug fixes
- [
flake8-errmsg] Avoid shadowing existingmsgin fix forEM101(#24363) - [
flake8-simplify] Ignore pre-initialization references inSIM113(#24235) - [
pycodestyle] FixW391fixes for consecutive empty notebook cells (#24236) - [
pyupgrade] FixUP008nested class matching (#24273) - [
pyupgrade] Ignore strings with string-only escapes (UP012) (#16058) - [
ruff]RUF072: skip formfeeds on dedent (#24308) - [
ruff] Avoid re-using symbol inRUF024fix (#24316) - [
ruff] Parenthesize expression inRUF050fix (#24234) - Disallow starred expressions as values of starred expressions (#24280)
Rule changes
- [
flake8-simplify] SuppressSIM105forexcept*before Python 3.12 (#23869) - [
pyflakes] ExtendF507to flag%-format strings with zero placeholders (#24215) - [
pyupgrade]UP018should detect more unnecessarily wrapped literals (UP018) (#24093) - [
pyupgrade] FixUP008callable scope handling to support lambdas (#24274) - [
ruff]RUF010: Mark fix as unsafe when it deletes a comment (#24270)
Formatter
- Add
nested-string-quote-styleformatting option (#24312)
Documentation
- [
flake8-bugbear] Clarify RUF071 fix safety for non-path string comparisons (#24149) - [
flake8-type-checking] Clarify import cycle wording forTC001/TC002/TC003(#24322)
Other changes
- Avoid rendering fix lines with trailing whitespace after
|(#24343)
Contributors
- @charliermarsh
- @MichaReiser
- @tranhoangtu-it
- @dylwil3
- @zsol
- @renovate
- @bitloi
- @danparizher
- @chinar-amrutkar
- @second-ed
- @getehen
- @Redovo1
- @matthewlloyd
- @zanieb
- @InSyncWithFoo
- @RenzoMXD
Install ruff 0.15.9
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.9/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.9/ruff-installer.ps1 | iex"Download ruff 0.15.9
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.8
Release Notes
Released on 2026-03-26.
Preview features
- [
ruff] New ruleunnecessary-if(RUF050) (#24114) - [
ruff] New ruleuseless-finally(RUF072) (#24165) - [
ruff] New rulef-string-percent-format(RUF073): warn when using%operator on an f-string (#24162) - [
pyflakes] Recognizefrozendictas a builtin for Python 3.15+ (#24100)
Bug fixes
- [
flake8-async] Use fully-qualifiedanyio.lowlevelimport in autofix (ASYNC115) (#24166) - [
flake8-bandit] Check tuple arguments for partial paths inS607(#24080) - [
pyflakes] Skipundefined-name(F821) for conditionally deleted variables (#24088) E501/W505/formatter: Exclude nested pragma comments from line width calculation (#24071)- Fix
%foo?parsing in IPython assignment expressions (#24152) analyze graph: resolve string imports that reference attributes, not just modules (#24058)
Rule changes
- [
eradicate] ignorety: ignorecomments inERA001(#24192) - [
flake8-bandit] Treatsys.executableas trusted input inS603(#24106) - [
flake8-self] RecognizeSelfannotation andselfassignment inSLF001(#24144) - [
pyflakes]F507: Fix false negative for non-tuple RHS in%-formatting (#24142) - [
refurb] Parenthesize generator arguments inFURB142fixer (#24200)
Performance
- Speed up diagnostic rendering (#24146)
Server
- Warn when Markdown files are skipped due to preview being disabled (#24150)
Documentation
- Clarify
extend-ignoreandextend-selectsettings documentation (#24064) - Mention AI policy in PR template (#24198)
Other changes
- Use trusted publishing for NPM packages (#24171)
Contributors
- @bitloi
- @Sim-hu
- @mvanhorn
- @chinar-amrutkar
- @markjm
- @RenzoMXD
- @vivekkhimani
- @seroperson
- @moktamd
- @charliermarsh
- @ntBre
- @zanieb
- @dylwil3
- @MichaReiser
Install ruff 0.15.8
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.8/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.8/ruff-installer.ps1 | iex"Download ruff 0.15.8
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.7
Release Notes
Released on 2026-03-19.
Preview features
Rule changes
- [
pycodestyle] Recognizepyrefly:as a pragma comment (E501) (#24019)
Server
- Don't return code actions for non-Python documents (#23905)
Documentation
- Add company AI policy to contributing guide (#24021)
- Document editor features for Markdown code formatting (#23924)
- [
pylint] Improve phrasing (PLC0208) (#24033)
Other changes
- Use PEP 639 license information (#19661)
Contributors
Install ruff 0.15.7
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.7/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.7/ruff-installer.ps1 | iex"Download ruff 0.15.7
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.6
Release Notes
Released on 2026-03-12.
Preview features
- Add support for
lazyimport parsing (#23755) - Add support for star-unpacking of comprehensions (PEP 798) (#23788)
- Reject semantic syntax errors for lazy imports (#23757)
- Drop a few rules from the preview default set (#23879)
- [
airflow] FlagVariable.get()calls outside of task execution context (AIR003) (#23584) - [
airflow] Flag runtime-varying values in DAG/task constructor arguments (AIR304) (#23631) - [
flake8-bugbear] Implementdelattr-with-constant(B043) (#23737) - [
flake8-tidy-imports] AddTID254to enforce lazy imports (#23777) - [
flake8-tidy-imports] Allow users to ban lazy imports withTID254(#23847) - [
isort] Retainlazykeyword when sorting imports (#23762) - [
pyupgrade] Addfrom __future__ import annotationsautomatically (UP006) (#23260) - [
refurb] Supportnewlineparameter inFURB101for Python 3.13+ (#23754) - [
ruff] Addos-path-commonprefix(RUF071) (#23814) - [
ruff] Add unsafe fix for os-path-commonprefix (RUF071) (#23852) - [
ruff] LimitRUF036to typing contexts; make it unsafe for non-typing-only (#23765) - [
ruff] Use starred unpacking forRUF017in Python 3.15+ (#23789)
Bug fixes
- Fix
--add-noqacreating unwanted leading whitespace (#23773) - Fix
--add-noqabreaking shebangs (#23577) - [formatter] Fix lambda body formatting for multiline calls and subscripts (#23866)
- [formatter] Preserve required annotation parentheses in annotated assignments (#23865)
- [formatter] Preserve type-expression parentheses in the formatter (#23867)
- [
flake8-annotations] Fix stack overflow inANN401on quoted annotations with escape sequences (#23912) - [
pep8-naming] Check naming conventions inmatchpattern bindings (N806,N815,N816) (#23899) - [
perflint] Fix comment duplication in fixes (PERF401,PERF403) (#23729) - [
pyupgrade] Properly triggersuperchange in nested class (UP008) (#22677) - [
ruff] Avoid syntax errors inRUF036fixes (#23764)
Rule changes
- [
flake8-bandit] FlagS501withrequests.request(#23873) - [
flake8-executable] Fix WSL detection in non-Docker containers (#22879) - [
flake8-print] Ignorepprintcalls withstream=(#23787)
Documentation
- Update docs for Markdown code block formatting (#23871)
- [
flake8-bugbear] Fix misleading description forB904(#23731)
Contributors
- @zsol
- @carljm
- @ntBre
- @Bortlesboat
- @sososonia-cyber
- @chirizxc
- @leandrobbraga
- @11happy
- @Acelogic
- @anishgirianish
- @amyreese
- @xvchris
- @charliermarsh
- @getehen
- @Dev-iL
Install ruff 0.15.6
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.6/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.15.6/ruff-installer.ps1 | iex"Download ruff 0.15.6
0.15.5
Release Notes
Released on 2026-03-05.
Preview features
- Discover Markdown files by default in preview mode (#23434)
- [
perflint] ExtendPERF102to comprehensions and generators (#23473) - [
refurb] FixFURB101andFURB103false positives when I/O variable is used later (#23542) - [
ruff] Add fix fornone-not-at-end-of-union(RUF036) (#22829) - [
ruff] Fix false positive forre.splitwith empty string pattern (RUF055) (#23634)
Bug fixes
- [
fastapi] Handle callable class dependencies with__call__method (FAST003) (#23553) - [
pydocstyle] Fix numpy section ordering (D420) (#23685) - [
pyflakes] Fix false positive for names shadowing re-exports (F811) (#23356) - [
pyupgrade] Avoid inserting redundantNoneelements inUP045(#23459)
Documentation
- Document extension mapping for Markdown code formatting (#23574)
- Update default Python version examples (#23605)
Other changes
- Publish releases to Astral mirror (#23616)
Contributors
Install ruff 0.15.5
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.15.5/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.15.5/ruff-installer.ps1 | iex"Download ruff 0.15.5
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.4
Release Notes
Released on 2026-02-26.
This is a follow-up release to 0.15.3 that resolves a panic when the new rule PLR1712 was enabled with any rule that analyzes definitions, such as many of the ANN or D rules.
Bug fixes
- Fix panic on access to definitions after analyzing definitions (#23588)
- [
pyflakes] Suppress false positive inF821for names used beforedelin stub files (#23550)
Documentation
Contributors
Install ruff 0.15.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.15.4/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.15.4/ruff-installer.ps1 | iex"Download ruff 0.15.4
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.3
Release Notes
Released on 2026-02-26.
Preview features
-
Drop explicit support for
.qmdfile extension (#23572)This can now be enabled instead by setting the
extensionoption:# ruff.toml extension = { qmd = "markdown" } # pyproject.toml [tool.ruff] extension = { qmd = "markdown" }
-
Include configured extensions in file discovery (#23400)
-
[
flake8-bandit] Allow suspicious imports inTYPE_CHECKINGblocks (S401-S415) (#23441) -
[
flake8-bugbear] AllowB901in pytest hook wrappers (#21931) -
[
flake8-import-conventions] Add missing conventions from upstream (ICN001,ICN002) (#21373) -
[
pydocstyle] Add rule to enforce docstring section ordering (D420) (#23537) -
[
pylint] Implementswap-with-temporary-variable(PLR1712) (#22205) -
[
ruff] Addunnecessary-assign-before-yield(RUF070) (#23300) -
[
ruff] Support file-level noqa inRUF102(#23535) -
[
ruff] Suppress diagnostic for invalid f-strings before Python 3.12 (RUF027) (#23480) -
[
flake8-bandit] Don't flagBaseLoader/CBaseLoaderas unsafe (S506) (#23510)
Bug fixes
- Avoid infinite loop between
I002andPYI025(#23352) - [
pyflakes] Fix false positive for@overloadfromlint.typing-modules(F811) (#23357) - [
pyupgrade] Fix false positive forTypeVardefault before Python 3.12 (UP046) (#23540) - [
pyupgrade] Fix handling of\Nin raw strings (UP032) (#22149)
Rule changes
-
Render sub-diagnostics in the GitHub output format (#23455)
-
[
flake8-bugbear] Tag certainB007diagnostics as unnecessary (#23453) -
[
ruff] Ignore unknown rule codes inRUF100(#23531)These are now flagged by
RUF102instead.
Documentation
- Fix missing settings links for several linters (#23519)
- Update isort action comments heading (#23515)
- [
pydocstyle] Fix double comma in description ofD404(#23440)
Other changes
- Update the Python module (notably
find_ruff_bin) for parity with uv (#23406)
Contributors
- @zanieb
- @o1x3
- @assadyousuf
- @kar-ganap
- @denyszhak
- @amyreese
- @carljm
- @anishgirianish
- @Bnyro
- @danparizher
- @ntBre
- @gcomneno
- @jaap3
- @stakeswky
Install ruff 0.15.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.15.3/ruff-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.15.3/ruff-installer.ps1 | iex"Download ruff 0.15.3
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>