chore(deps): update dependency ruff to ^0.15.0 #2
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "renovate/ruff-0.x"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
^0.8.5→^0.15.0Release Notes
astral-sh/ruff (ruff)
v0.15.17Compare Source
Released on 2026-06-11.
Preview features
ignorecomments within adisable/enablepair (#25845)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
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
Vecs with correct capacity for common cases (#25451)Formatter
CLI
ruff rule(#25640)Other changes
Contributors
v0.15.16Compare Source
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
Documentation
pydocstyle] Improve discoverability of rules enabled for each convention (#24973)ruff] Restore example code for Python versions before 3.15 (RUF017) (#25439)bin/active→bin/activatein tutorial (#25473)Other changes
Contributors
v0.15.15Compare Source
Released on 2026-05-28.
Preview features
pyflakes] Report duplicate imports intyping.TYPE_CHECKINGblock (F811) (#22560)Bug fixes
pyflakes] Treat function-scope bare annotations as locals per PEP 526 (F821) (#21540)Performance
TokenValuedrops in the lexer (#25300)Vecsize (#25354)ThinVecin AST to shrinkStmt(#25361)Documentation
line-lengthexample for--configoption (#25389)flake8-comprehensions] DocumentRecursionErroredge case in__len__(C416) (#25286)mccabe] Improve example (C901) (#25287)pyupgrade] Clarify fix safety docs (UP007,UP045) (#25288)refurb] DocumentFURB192exception change for empty sequences (#25317)ruff] Document false negative for user-defined types (RUF013) (#25289)Formatter
Server
codeAction/resolverequests that contain no or no valid URL (#25365)Other changes
Contributors
v0.15.14Compare Source
Released on 2026-05-21.
Preview features
airflow] Implementairflow-task-implicit-multiple-outputs(AIR202) (#25152)flake8-use-pathlib] MarkPTH101fix as unsafe when first argument is a class attribute annotated asint(#25086)pylint] Implementtoo-many-try-statements(W0717) (#23970)ruff] Addincorrect-decorator-order(RUF074) (#23461)ruff] Addfallible-context-manager(RUF075) (#22844)Bug fixes
frozensetannotations as immutable (#25251)flake8-type-checking] Avoidstrictbehavior whenfuture-annotationsare enabled (TC001,TC002,TC003) (#25035)pylint] Avoid false positives inelseclause (PLR1733) (#25177)Rule changes
flake8-comprehensions] SkipC417for lambdas with positional-only parameters (#25272)flake8-simplify] Preserve f-string source verbatim inSIM101fix (#25061)Performance
Documentation
Other changes
ruff_python_stdlibAPIs (#25273)Contributors
v0.15.13Compare Source
Released on 2026-05-14.
Preview features
pylint] Standardize diagnostic message (PLR0914,PLR0917) (#24996)Bug fixes
F811false positive for class methods (#24933)eradicate] Fix false positive for lines with leading whitespace (ERA001) (#25122)flake8-pyi] Fix false positive for f-string debug specifier (PYI016) (#24098)Rule changes
PYI034for in-place operations to enclosing class (#24511)global(#24902)Performance
isort] Avoid constructingglob::Patterns for literal known modules (#25123)CLI
--confighelp text (#25013)Configuration
line-lengthsetting (#24962)Documentation
D203to rules that conflict with the formatter (#25044)COM819and formatter interaction (#25045)NotImplementedis a value, not an exception (F901) (#25054)Other changes
Contributors
v0.15.12Compare Source
Released on 2026-04-24.
Preview features
#ruff:file-ignorefile-level suppressions (#23599)#ruff:ignorelogical-line suppressions (#23404)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
Documentation
pylint] FixPLR0124description not to claim self-comparison always returns the same value (#24749)pyupgrade] Expand docs on reusableTypeVars and scoping (UP046) (#24153)Contributors
v0.15.11Compare Source
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)vim.lsp.config(#24577)Contributors
v0.15.10Compare Source
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
E502fixes in f-strings and t-strings (#24410)dedent_to(#24381)pyupgrade] Fix panic caused by handling of octals (UP012) (#24390)Rule changes
ruff] Treat f-string interpolation as potential side effect (RUF019) (#24426)Server
Documentation
Contributors
v0.15.9Compare Source
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)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
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
|(#24343)Contributors
v0.15.8Compare Source
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)%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
Server
Documentation
extend-ignoreandextend-selectsettings documentation (#24064)Other changes
Contributors
v0.15.7Compare Source
Released on 2026-03-19.
Preview features
noqahover for non-Python documents (#24040)Rule changes
pycodestyle] Recognizepyrefly:as a pragma comment (E501) (#24019)Server
Documentation
pylint] Improve phrasing (PLC0208) (#24033)Other changes
Contributors
v0.15.6Compare Source
Released on 2026-03-12.
Preview features
lazyimport parsing (#23755)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
--add-noqacreating unwanted leading whitespace (#23773)--add-noqabreaking shebangs (#23577)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
flake8-bugbear] Fix misleading description forB904(#23731)Contributors
v0.15.5Compare Source
Released on 2026-03-05.
Preview features
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
Other changes
Contributors
v0.15.4Compare Source
Released on 2026-02-26.
This is a follow-up release to 0.15.3 that resolves a panic when the new rule
PLR1712was enabled with any rule that analyzes definitions, such as many of theANNorDrules.Bug fixes
pyflakes] Suppress false positive inF821for names used beforedelin stub files (#23550)Documentation
import-headingexample (#23568)Contributors
v0.15.3Compare Source
Released on 2026-02-26.
Preview features
Drop explicit support for
.qmdfile extension (#23572)This can now be enabled instead by setting the
extensionoption: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
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
pydocstyle] Fix double comma in description ofD404(#23440)Other changes
find_ruff_bin) for parity with uv (#23406)Contributors
v0.15.2Compare Source
Released on 2026-02-19.
Preview features
Expand the default rule set (#23385)
In preview, Ruff now enables a significantly expanded default rule set of 412
rules, up from the stable default set of 59 rules. The new rules are mostly a
superset of the stable defaults, with the exception of these rules, which are
removed from the preview defaults:
multiple-imports-on-one-line(E401)module-import-not-at-top-of-file(E402)module-import-not-at-top-of-file(E701)multiple-statements-on-one-line-semicolon(E702)useless-semicolon(E703)none-comparison(E711)true-false-comparison(E712)not-in-test(E713)not-is-test(E714)type-comparison(E721)lambda-assignment(E731)ambiguous-variable-name(E741)ambiguous-class-name(E742)ambiguous-function-name(E743)undefined-local-with-import-star(F403)undefined-local-with-import-star-usage(F405)undefined-local-with-nested-import-star-usage(F406)forward-annotation-syntax-error(F722)If you use preview and prefer the old defaults, you can restore them with
configuration like:
If you do give them a try, feel free to share your feedback in the GitHub
discussion!
[
flake8-pyi] Also check string annotations (PYI041) (#19023)Bug fixes
flake8-async] Fixin_async_contextlogic (#23426)ruff] Fix forRUF102should delete entire comment (#23380)ruff] Suppress diagnostic for strings with backslashes in interpolations before Python 3.12 (RUF027) (#21069)flake8-bugbear] FixB023false positive for immediately-invoked lambdas (#23294)Rule changes
flake8-executable] Allow global flags in uv shebangs (EXE003) (#22582)pyupgrade] Fix handling oftyping.{io,re}(UP035) (#23131)ruff] DetectPLC0207on chainedstr.split()calls (#23275)CLI
noqawarning (#23270)Configuration
Documentation
Q004to the list of conflicting rules (#23340)ruff] Expandlint.externaldocs and add sub-diagnostic (RUF100,RUF102) (#23268)Contributors
v0.15.1Compare Source
Released on 2026-06-18.
Preview features
ruff:ignorecomments (#25791)pydocstyle] Prevent property docstrings starting with verbs (D421) (#23775)flake8-pyi] ExtendPYI033to Python files (#26129)Bug fixes
Rule changes
flake8-pyi] RenamePYI033tolegacy-type-comment(#26131)Performance
ThinVecfor call keywords (#25999)Server
Documentation
flake8-tidy-imports] Add fix safety section (TID252) (#17491)Parser
__debug__lambda parameters (#26022)_as a match-pattern target (#25977)yieldexpressions after commas (#26024)Playground
Contributors
v0.15.0Compare Source
Released on 2026-02-03.
Check out the blog post for a migration
guide and overview of the changes!
Breaking changes
Ruff now formats your code according to the 2026 style guide. See the formatter section below or in the blog post for a detailed list of changes.
The linter now supports block suppression comments. For example, to suppress
N803for all parameters in this function:See the documentation for more details.
The
ruff:alpineDocker image is now based on Alpine 3.23 (up from 3.21).The
ruff:debianandruff:debian-slimDocker images are now based on Debian 13 "Trixie" instead of Debian 12 "Bookworm."Binaries for the
ppc64(64-bit big-endian PowerPC) architecture are no longer included in our releases. It should still be possible to build Ruff manually for this platform, if needed.Ruff now resolves all
extended configuration files before falling back on a default Python version.Stabilization
The following rules have been stabilized and are no longer in preview:
blocking-http-call-httpx-in-async-function(
ASYNC212)blocking-path-method-in-async-function(
ASYNC240)blocking-input-in-async-function(
ASYNC250)map-without-explicit-strict(
B912)if-exp-instead-of-or-operator(
FURB110)single-item-membership-test(
FURB171)missing-maxsplit-arg(PLC0207)unnecessary-lambda(PLW0108)unnecessary-empty-iterable-within-deque-call(
RUF037)in-empty-collection(RUF060)legacy-form-pytest-raises(
RUF061)non-octal-permissions(RUF064)invalid-rule-code(RUF102)invalid-suppression-comment(
RUF103)unmatched-suppression-comment(
RUF104)replace-str-enum(UP042)The following behaviors have been stabilized:
--output-formatflag is now respected when running Ruff in--watchmode, and thefulloutput format is now used by default, matching the regular CLI output.builtin-attribute-shadowing(A003) now detects the use of shadowed built-in names in additional contexts like decorators, default arguments, and other attribute definitions.duplicate-union-member(PYI016) now considerstyping.Optionalwhen searching for duplicate union members.split-static-string(SIM905) now offers an autofix when themaxsplitargument is provided, even without asepargument.dict-get-with-none-default(SIM910) now applies to more types of key expressions.super-call-with-parameters(UP008) now has a safe fix when it will not delete comments.unnecessary-default-type-args(UP043) now applies to stub (.pyi) files on Python versions before 3.13.Formatter
This release introduces the new 2026 style guide, with the following changes:
them break across multiple lines (#21385)
exceptclauses will now be removed on Python 3.14 andlater (#20768)
ascaptures inmatchstatements (#21176)Preview features
Apply formatting to Markdown code blocks (#22470, #22990, #22996)
See the documentation for more details.
Bug fixes
Rule changes
fix_titlesub-diagnostic appears (#23044)FastAPI] Add sub-diagnostic explaining why a fix was unavailable (FAST002) (#22565)flake8-annotations] Don't suggestNoReturnfor functions raisingNotImplementedError(ANN201,ANN202,ANN205,ANN206) (#21311)pyupgrade] Make fix unsafe if it deletes comments (UP017) (#22873)pyupgrade] Make fix unsafe if it deletes comments (UP020) (#22872)pyupgrade] Make fix unsafe if it deletes comments (UP033) (#22871)refurb] Do not addabc.ABCif already present (FURB180) (#22234)refurb] Make fix unsafe if it deletes comments (FURB110) (#22768)ruff] Add sub-diagnostics with permissions (RUF064) (#22972)Server
didOpeninstead of.ipynbfile extension (#22810)CLI
--colorCLI option to force colored output (#22806)Documentation
-stdin convention in CLI help text (#22817)refurb] Change example tore.searchwith^anchor (FURB167) (#22984)pydocstyle] Clarify which quote styles are allowed (D300) (#22825)flake8-bugbear] Improve docs forno-explicit-stacklevel(B028) (#22538)Other changes
Contributors
v0.14.14Compare Source
Release Notes
Released on 2026-01-22.
Preview features
airflow] Second positional argument toAsset/Datasetshould not be a dictionary (AIR303) (#22453)ruff] Detect duplicate entries in__all__(RUF068) (#22114)Bug fixes
pyupgrade] Allow shadowing non-builtin bindings (UP029) (#22749)pyupgrade] ApplyUP045to string arguments oftyping.cast(#22320)flake8-pie] Detect duplicated declared class fields inPIE794(#22717)Rule changes
flake8-pyi] Fix inconsistent handling of forward references for__new__,__enter__,__aenter__inPYI034(#22798)flake8-pytest-style] Supportcheckparameter inPT011(#22725)ruff] Add exception forctypes.Structure._fields_(RUF012) (#22559)flake8-bugbear]B009,B010,B013,B014,B033flake8-simplify]SIM910,SIM911pyupgrade]UP007,UP039,UP041,UP045refurb]FURB105,FURB116,FURB136,FURB140,FURB145,FURB154,FURB157,FURB164,FURB181,FURB188ruff]RUF019,RUF020Documentation
--exit-non-zero-on-formatto formatter exit codes section (#22761)FastAPI] Document fix safety forFAST001(#22655)flake8-async] Tweak explanation to focus on latency/efficiency tradeoff (ASYNC110) (#22715)pandas-vet] Make example error out-of-the-box (PD002) (#22561)refurb] Make the example work out of box (FURB101) (#22770)refurb] Make the example work out of box (FURB103) (#22769)Contributors
Install ruff 0.14.14
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.14
v0.14.13Release Notes
Released on 2026-01-15.
This is a follow-up release to 0.14.12. Because of an issue publishing the WASM packages, there is no GitHub release or Git tag for 0.14.12, although the package was published to PyPI. The contents of the 0.14.13 release are identical to 0.14.12.
0.14.12
Preview features
flake8-blind-except] Allow more logging methods (BLE001) (#22057)ruff] Respectlint.pydocstyle.property-decoratorsinRUF066(#22515)Bug fixes
--show-settings(#22478)fmt: skipfor multiple statements on the same logical line (#22119)Rule changes
pydocstyle] Update Rust crate imperative to v1.0.7 (D401) (#22519)isort] Insert imports in alphabetical order (I002) (#22493)Documentation
flake8-pytest-style] Addcheckparameter example toPT017docs (#22546)ruff] Make example error out-of-the-box (RUF103) (#22558)ruff] documentRUF100trailing comment fix behavior (#22479)Other changes
Contributors
Install ruff 0.14.13
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.13
v0.14.11Compare Source
Release Notes
Released on 2026-01-08.
Preview features
airflow] Passing positional argument intoairflow.lineage.hook.HookLineageCollector.create_assetis not allowed (AIR303) (#22046)refurb] MarkFURB192fix as always unsafe (#22210)ruff] Addnon-empty-init-module(RUF067) (#22143)Bug fixes
flake8-unused-arguments] Mark**kwargsinTypeVaras used (ARG001) (#22214)Rule changes
help:subdiagnostics for several Ruff rules that can sometimes appear to disagree withty(#22331)pylint] DemotePLW1510fix to display-only (#22318)pylint] Ignore identical members (PLR1714) (#22220)pylint] Improve diagnostic range forPLC0206(#22312)ruff] Improve fix title forRUF102invalid rule code (#22100)flake8-simplify]: Avoid unnecessary builtins import forSIM105(#22358)Configuration
target-versionvalue in preview (#22419)required-versionbefore parsing rules (#22410)srcdirectories when resolving graphs (#22451)Documentation
T201suggestion to not use root logger to satisfyLOG015(#22059)iterexample in unsafe fixes doc (#22118)flake8_print] better suggestion forbasicConfiginT201docs (#22101)pylint] Restore the fix safety docs forPLW0133(#22211)Contributors
Install ruff 0.14.11
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.11
v0.14.10Compare Source
Release Notes
Released on 2025-12-18.
Preview features
flake8-implicit-str-concat] New rule to prevent implicit string concatenation in collections (ISC004) (#21972)flake8-use-pathlib] Make fixes unsafe when types change in compound statements (PTH104,PTH105,PTH109,PTH115) (#22009)refurb] Extend support forPath.open(FURB101,FURB103) (#21080)Bug fixes
pyupgrade] Fix parsing named Unicode escape sequences (UP032) (#21901)Rule changes
eradicate] Ignoreruff:disableandruff:enablecomments inERA001(#22038)flake8-pytest-style] Allowmatchandcheckkeyword arguments without an expected exception type (PT010) (#21964)Documentation
uvandtyto the Ruff README (#21996)setup.md(#22024)flake8-bandit] Fix broken link (S704) (#22039)Other changes
Contributors
Install ruff 0.14.10
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.10
v0.14.9Compare Source
Release Notes
Released on 2025-12-11.
Preview features
ruff] NewRUF100diagnostics for unused range suppressions (#21783)pylint] Detect subclasses of builtin exceptions (PLW0133) (#21382)Bug fixes
flake8-bandit] Fix false positive when using non-standardCSafeLoaderpath (S506). (#21830)flake8-bugbear] Accept immutable slice default arguments (B008) (#21823)Rule changes
pydocstyle] SuppressD417for parameters withUnpackannotations (#21816)Performance
memchrfor computing line indexes (#21838)Documentation
*.pywis included by default in preview (#21885)Contributors
Install ruff 0.14.9
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.9
v0.14.8Compare Source
Release Notes
Released on 2025-12-04.
Preview features
flake8-bugbear] Catchyieldexpressions within other statements (B901) (#21200)flake8-use-pathlib] Mark fixes unsafe for return type changes (PTH104,PTH105,PTH109,PTH115) (#21440)Bug fixes
awaitoutside functions (#21763)flake8-simplify] Fix truthiness assumption for non-iterable arguments in tuple/list/set calls (SIM222,SIM223) (#21479)Documentation
--output-fileoption in GitLab integration (#21706)Other changes
Contributors
Install ruff 0.14.8
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.8
v0.14.7Compare Source
Release Notes
Released on 2025-11-28.
Preview features
flake8-bandit] Handle string literal bindings in suspicious-url-open-usage (S310) (#21469)pylint] FixPLR1708false positives on nested functions (#21177)pylint] Fix suppression for empty dict without tuple key annotation (PLE1141) (#21290)ruff] Add ruleRUF066to detect unnecessary class properties (#21535)ruff] Catch more dummy variable uses (RUF052) (#19799)Bug fixes
flake8-implicit-str-concat] Avoid invalid fix in (ISC003) (#21517)parser] Fix panic when parsing IPython escape command expressions (#21480)CLI
Contributors
Install ruff 0.14.7
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.7
v0.14.6Compare Source
Release Notes
Released on 2025-11-21.
Preview features
flake8-bandit] Support new PySNMP API paths (S508,S509) (#21374)Bug fixes
fmt: skipfor compound statements on a single line (#20633)refurb] FixFURB103autofix (#21454)ruff] Fix false positive for complex conversion specifiers inlogging-eager-conversion(RUF065) (#21464)Rule changes
ruff] Avoid false positive onClassVarreassignment (RUF012) (#21478)CLI
ruff analyzeoption to skip over imports inTYPE_CHECKINGblocks (#21472)Documentation
eglot-formathook to eglot-managed Python buffers (#21459)force-excludein "Configuration > Python file discovery" (#21500)Contributors
Install ruff 0.14.6
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.6
v0.14.5Compare Source
Release Notes
Released on 2025-11-13.
Preview features
flake8-simplify] ApplySIM113when index variable is of typeint(#21395)pydoclint] Fix false positive when Sphinx directives follow a "Raises" section (DOC502) (#20535)pydoclint] Support NumPy-style comma-separated parameters (DOC102) (#20972)refurb] Auto-fix annotated assignments (FURB101) (#21278)ruff] Ignorestr()when not used for simple conversion (RUF065) (#21330)Bug fixes
matchpatterns (#21362)flake8-simplify] Fix false positive for iterable initializers with generator arguments (SIM222) (#21187)pyupgrade] Fix false positive on relative imports from local.builtinsmodule (UP029) (#21309)pyupgrade] Consistently set the deprecated tag (UP035) (#21396)Rule changes
refurb] Detect empty f-strings (FURB105) (#21348)CLI
--add-noqa(#21294)ruff linter --output-format=json(#21316)--help(#21337)Documentation
flake8-annotations] Add link toallow-star-arg-anyoption (ANN401) (#21326)Other changes
configuration] Improve error message whenline-lengthexceedsu16::MAX(#21329)Contributors
Install ruff 0.14.5
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.5
v0.14.4Compare Source
Release Notes
Released on 2025-11-06.
Preview features
matchpatterns withascaptures (#21176)refurb] Expand fix safety for keyword arguments andDecimals (FURB164) (#21259)refurb] Preserve argument ordering in autofix (FURB103) (#20790)Bug fixes
flake8-bugbear] Ignore non-NFKC attribute names inB009andB010(#21131)refurb] Fix false negative for underscores before sign inDecimalconstructor (FURB157) (#21190)ruff] Fix false positives on starred arguments (RUF057) (#21256)Rule changes
airflow] extend deprecated argumentconcurrencyinairflow..DAG(AIR301) (#21220)Documentation
extenddocs (#21135)flake8-comprehensions] Fix typo inC416documentation (#21184)Other changes
ruff analyze graphwork with jupyter notebooks (#21161)Contributors
Install ruff 0.14.4
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.4
v0.14.3Compare Source
Release Notes
Released on 2025-10-30.
Preview features
--output-formatwith--watch(#21097)pydoclint] Fix false positive on explicit exception re-raising (DOC501,DOC502) (#21011)pyflakes] Revert to stable behavior if imports for module lie in alternate branches forF401(#20878)pylint] Implementstop-iteration-return(PLR1708) (#20733)ruff] Add support for additional eager conversion patterns (RUF065) (#20657)Bug fixes
ISC001] Fix panic when string literals are unclosed (#21034)flake8-django] ApplyDJ001to annotated fields (#20907)flake8-pyi] FixPYI034to not trigger on metaclasses (PYI034) (#20881)flake8-type-checking] FixTC003false positive withfuture-annotations(#21125)pyflakes] Fix false positive for__class__in lambda expressions within class definitions (F821) (#20564)pyupgrade] Fix false positive forTypeVarwith default on Python <3.13 (UP046,UP047) (#21045)Rule changes
airflow] Extendairflow.models..Paramcheck (AIR311) (#21043)airflow] Warn thatairflow....DAG.create_dagrunhas been removed (AIR301) (#21093)refurb] Preserve digit separators inDecimalconstructor (FURB157) (#20588)Server
Documentation
flake8-bandit] Fix correct example forS308(#21128)Other changes
line-lengthgoes beyond threshold (#21072)Contributors
Install ruff 0.14.3
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.3
v0.14.2Compare Source
Release Notes
Released on 2025-10-23.
Preview features
flake8-gettext] Resolve qualified names and built-in bindings (INT001,INT002,INT003) (#19045)Bug fixes
fastapi] Handle ellipsis defaults inFAST002autofix (#20810)flake8-simplify] SkipSIM911when unknown arguments are present (#20697)pyupgrade] Always parenthesize assignment expressions in fix forf-string(UP032) (#21003)pyupgrade] FixUP032conversion for decimal ints with underscores (#21022)fastapi] Skip autofix for keyword and__debug__path params (FAST003) (#20960)Rule changes
flake8-bugbear] SkipB905andB912for fewer than two iterables and no starred arguments (#20998)ruff] UseDiagnosticTagfor morepyflakesandpandasrules (#20801)CLI
ruff rule(#20168)Documentation
Other changes
matchpatterns bind different names (#20682)Contributors
Install ruff 0.14.2
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.2
v0.14.1Compare Source
Release Notes
Released on 2025-10-16.
Preview features
flake8-bugbear] Omit annotation in preview fix forB006(#20877)flake8-logging-format] Avoid dropping implicitly concatenated pieces in theG004fix (#20793)pydoclint] Implementdocstring-extraneous-parameter(DOC102) (#20376)pyupgrade] ExtendUP019to detecttyping_extensions.Text(UP019) (#20825)pyupgrade] Fix false negative forTypeVarwith default argument innon-pep695-generic-class(UP046) (#20660)Bug fixes
Truthiness::from_exprfor lambdas, generators, and f-strings (#20704)fastapi] Fix false positives for path parameters that FastAPI doesn't recognize (FAST003) (#20687)flake8-pyi] Fix operator precedence by adding parentheses when needed (PYI061) (#20508)ruff] Suppress diagnostic for f-string interpolations with debug text (RUF010) (#20525)Rule changes
airflow] Add warning toairflow.datasets.DatasetEventusage (AIR301) (#20551)flake8-bugbear] MarkB905andB912fixes as unsafe (#20695)DiagnosticTagfor more rules - changes display in editors (#20758,#20734)Documentation
lint.flake8-type-checking.quoted-annotationsdocs (#20765)flake8-datetimez] Clarify docs for several rules (#20778)RUF015description (#20873)Other changes
Contributors
Install ruff 0.14.1
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.1
v0.14.0Compare Source
Release Notes
Released on 2025-10-07.
Breaking changes
Preview features
flake8-bugbear] Include certain guaranteed-mutable expressions: tuples, generators, and assignment expressions (B006) (#20024)refurb] Add fixes forFURB101andFURB103(#20520)ruff] ExtendFA102with listed PEP 585-compatible APIs (#20659)Bug fixes
flake8-annotations] Fix return type annotations to handle shadowed builtin symbols (ANN201,ANN202,ANN204,ANN205,ANN206) (#20612)flynt] Fix f-string quoting for mixed quote joiners (FLY002) (#20662)isort] Fix inserting required imports before future imports (I002) (#20676)ruff] Handle argfile expansion errors gracefully (#20691)ruff] SkipRUF051ifelse/elifblock is present (#20705)ruff] Improve handling of intermixed comments inside from-imports (#20561)Documentation
flake8-comprehensions] Clarify fix safety documentation (C413) (#20640)Contributors
Install ruff 0.14.0
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.14.0
v0.13.3Compare Source
Release Notes
Released on 2025-10-02.
Preview features
ruff format --checkand add support for different output formats (#20443)pyflakes] Handle some common submodule import situations forunused-import(F401) (#20200)ruff] Do not flag%r+repr()combinations (RUF065) (#20600)Bug fixes
cli] Add conflict between--add-noqaand--diffoptions (#20642)pylint] Exempt required imports fromPLR0402(#20381)pylint] Fix missingmax-nested-blocksin settings display (#20574)pyupgrade] Prevent infinite loop withI002andUP026(#20634)Rule changes
flake8-simplify] Improve help message clarity (SIM105) (#20548)Documentation
isort] Clarify dependency betweenorder-by-typeandcase-sensitivesettings (#20559)pylint] Clarify fix safety to include left-hand hashability (PLR6201) (#20518)Other changes
playground] Fix quick fixes for empty ranges in playground (#20599)Contributors
Install ruff 0.13.3
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.13.3
v0.13.2Compare Source
Release Notes
Released on 2025-09-25.
Preview features
flake8-async] Implementblocking-path-method(ASYNC240) (#20264)flake8-bugbear] Implementmap-without-explicit-strict(B912) (#20429)flake8-bultins] Detect class-scope builtin shadowing in decorators, default args, and attribute initializers (A003) (#20178)ruff] Implementlogging-eager-conversion(RUF065) (#19942).pywfiles by default when linting and formatting (#20458)Bug fixes
flake8-comprehensions] Preserve trailing commas for single-element lists (C409) (#19571)flake8-pyi] Avoid syntax error from conflict withPIE790(PYI021) (#20010)flake8-simplify] Correct fix for positivemaxsplitwithout separator (SIM905) (#20056)pyupgrade] FixUP008not to apply when__class__is a local variable (#20497)ruff] FixB004to skip invalidhasattr/getattrcalls (#20486)ruff] Replace-nanwithnanwhen using the value to construct aDecimal(FURB164) (#20391)Documentation
ruff-wasm-web(#20539)flake8-bandit] Clarify the supported hashing functions (S324) (#20534)Other changes
playground] Allow hover quick fixes to appear for overlapping diagnostics (#20527)playground] Fix non‑BMP code point handling in quick fixes and markers (#20526)Contributors
Install ruff 0.13.2
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.13.2
v0.13.1Compare Source
Release Notes
Released on 2025-09-18.
Preview features
flake8-simplify] Detect unnecessaryNonedefault for additional key expression types (SIM910) (#20343)flake8-use-pathlib] Add fix forPTH123(#20169)flake8-use-pathlib] FixPTH101,PTH104,PTH105,PTH121fixes (#20143)flake8-use-pathlib] MakePTH111fix unsafe because it can change behavior (#20215)pycodestyle] FixE301to only trigger for functions immediately within a class (#19768)refurb] Marksingle-item-membership-testfix as always unsafe (FURB171) (#20279)Bug fixes
flake8-bandit] Fix truthiness: dict-only**displays not truthy forshell(S602,S604,S609) (#20177)flake8-simplify] Fix diagnostic to show correct method name forstr.rsplitcalls (SIM905) (#20459)flynt] Use triple quotes for joined raw strings with newlines (FLY002) (#20197)pyupgrade] Fix false positive when class name is shadowed by local variable (UP008) (#20427)pyupgrade] Prevent infinite loop withI002andUP026(#20327)ruff] Recognize t-strings, generators, and lambdas ininvalid-index-type(RUF016) (#20213)Rule changes
RUF102] Respect rule redirects in invalid rule code detection (#20245)flake8-bugbear] Mark the fix forunreliable-callable-checkas always unsafe (B004) (#20318)ruff] Allow dataclass attribute value instantiation from nested frozen dataclass (RUF009) (#20352)CLI
output-format=sarif(#20300)Documentation
ruff] Addanalyze.string-imports-min-dotsto settings (#20375)Other changes
Contributors
Install ruff 0.13.1
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.13.1
v0.13.0Compare Source
Release Notes
Check out the blog post for a migration guide and overview of the changes!
Breaking changes
Several rules can now add
from __future__ import annotationsautomaticallyTC001,TC002,TC003,RUF013, andUP037now addfrom __future__ import annotationsas part of their fixes when thelint.future-annotationssetting is enabled. This allows the rules to move more imports intoTYPE_CHECKINGblocks (TC001,TC002, andTC003), use PEP 604 union syntax on Python versions before 3.10 (RUF013), and unquote more annotations (UP037).Full module paths are now used to verify first-party modules
Ruff now checks that the full path to a module exists on disk before categorizing it as a first-party import. This change makes first-party import detection more accurate, helping to avoid false positives on local directories with the same name as a third-party dependency, for example. See the FAQ section on import categorization for more details.
Deprecated rules must now be selected by exact rule code
Ruff will no longer activate deprecated rules selected by their group name or prefix. As noted below, the two remaining deprecated rules were also removed in this release, so this won't affect any current rules, but it will still affect any deprecations in the future.
The deprecated macOS configuration directory fallback has been removed
Ruff will no longer look for a user-level configuration file at
~/Library/Application Support/ruff/ruff.tomlon macOS. This feature was deprecated in v0.5 in favor of using the XDG specification (usually resolving to~/.config/ruff/ruff.toml), like on Linux. The fallback and accompanying deprecation warning have now been removed.Removed Rules
The following rules have been removed:
pandas-df-variable-name(PD901)non-pep604-isinstance(UP038)Stabilization
The following rules have been stabilized and are no longer in preview:
airflow-dag-no-schedule-argument(AIR002)airflow3-removal(AIR301)airflow3-moved-to-provider(AIR302)airflow3-suggested-update(AIR311)airflow3-suggested-to-move-to-provider(AIR312)long-sleep-not-forever(ASYNC116)f-string-number-format(FURB116)os-symlink(PTH211)generic-not-last-base-class(PYI059)redundant-none-literal(PYI061)pytest-raises-ambiguous-pattern(RUF043)unused-unpacked-variable(RUF059)useless-class-metaclass-type(UP050)The following behaviors have been stabilized:
assert-raises-exception(B017) now checks for direct calls tounittest.TestCase.assert_raisesandpytest.raisesinstead of only the context manager forms.missing-trailing-comma(COM812) andprohibited-trailing-comma(COM819) now check for trailing commas in PEP 695 type parameter lists.raw-string-in-exception(EM101) now also checks for byte strings in exception messages.invalid-mock-access(PGH005) now checks forAsyncMockmethods likenot_awaitedin addition to the synchronous variants.useless-import-alias(PLC0414) no longer applies to__init__.pyfiles, where it conflicted with one of the suggested fixes forunused-import(F401).bidirectional-unicode(PLE2502) now also checks for U+061C (Arabic Letter Mark).multiple-with-statements(SIM117) is now marked as always safe.Preview features
pyupgrade] EnableUP043in stub files (#20027)Bug fixes
pyupgrade] ApplyUP008only when the__class__cell exists (#19424)ruff] Fix empty f-string detection inin-empty-collection(RUF060) (#20249)Server
Documentation
pep8-naming] Fix formatting of__all__(N816) (#20301)Contributors
Install ruff 0.13.0
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.13.0
v0.12.12Compare Source
Release Notes
Preview features
airflow] ConvertDatasetOrTimeSchedule(datasets=...)toAssetOrTimeSchedule(assets=...)(AIR311) (#20202)airflow] Improve theAIR002error message (#20173)airflow] Moveairflow.operators.postgres_operator.MappingfromAIR302toAIR301(#20172)flake8-async] Implementblocking-inputrule (ASYNC250) (#20122)flake8-use-pathlib] MakePTH119andPTH120fixes unsafe because they can change behavior (#20118)pylint] Add U+061C toPLE2502(#20106)ruff] Fix false negative for empty f-strings indequecalls (RUF037) (#20109)Bug fixes
fastapi] Fix false positive for paths with spaces around parameters (FAST003) (#20077)flake8-comprehensions] SkipC417when lambda containsyield/yield from(#20201)perflint] Handle tuples in dictionary comprehensions (PERF403) (#19934)Rule changes
pycodestyle] Preserve return type annotation forParamSpec(E731) (#20108)Documentation
Contributors
Install ruff 0.12.12
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.12
v0.12.11Compare Source
Release Notes
Preview features
airflow] ExtendAIR311andAIR312rules (#20082)airflow] Replace wrong pathairflow.io.storagewithairflow.io.store(AIR311) (#20081)flake8-async] Implementblocking-http-call-httpx-in-async-function(ASYNC212) (#20091)flake8-logging-format] Add auto-fix for f-string logging calls (G004) (#19303)flake8-use-pathlib] Add autofix forPTH211(#20009)flake8-use-pathlib] MakePTH100fix unsafe because it can change behavior (#20100)Bug fixes
pyflakes,pylint] Fix false positives caused by__class__cell handling (F841,PLE0117) (#20048)pyflakes] Fixallowed-unused-importsmatching for top-level modules (F401) (#20115)ruff] Fix false positive for t-strings indefault-factory-kwarg(RUF026) (#20032)ruff] Preserve relative whitespace in multi-line expressions (RUF033) (#19647)Rule changes
ruff] Handle empty t-strings inunnecessary-empty-iterable-within-deque-call(RUF037) (#20045)Documentation
D413links in docstrings convention FAQ (#20089)flake8-use-pathlib] Update links to the table showing the correspondence betweenosandpathlib(#20103)Contributors
Install ruff 0.12.11
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.11
v0.12.10Compare Source
Release Notes
Preview features
flake8-simplify] Implement fix formaxsplitwithout separator (SIM905) (#19851)flake8-use-pathlib] Add fixes forPTH102andPTH103(#19514)Bug fixes
isort] Handle multiple continuation lines after module docstring (I002) (#19818)pyupgrade] Avoid reporting__future__features as unnecessary when they are used (UP010) (#19769)pyupgrade] Handle nestedOptionals (UP045) (#19770)Rule changes
pycodestyle] MakeE731fix unsafe instead of display-only for class assignments (#19700)pyflakes] Add secondary annotation showing previous definition (F811) (#19900)Documentation
flake8-annotations] Remove unused import in example (ANN401) (#20000)Contributors
Install ruff 0.12.10
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.10
v0.12.9Compare Source
Release Notes
Preview features
airflow] Add check forairflow.secrets.cache.SecretCache(AIR301) (#17707)ruff] Offer a safe fix for multi-digit zeros (RUF064) (#19847)Bug fixes
flake8-blind-except] FixBLE001false-positive onraise ... from None(#19755)flake8-comprehensions] Fix false positive forC420with attribute, subscript, or slice assignment targets (#19513)flake8-simplify] Fix handling of U+001C..U+001F whitespace (SIM905) (#19849)Rule changes
pylint] Use lowercase hex characters to match the formatter (PLE2513) (#19808)Documentation
lint.future-annotationslink (#19876)Other changes
Build
riscv64binaries for release (#19819)Add rule code to error description in GitLab output (#19896)
Improve rendering of the
fulloutput format (#19415)Below is an example diff for
F401:For now, the primary difference is the movement of the filename, line number, and column information to a second line in the header. This new representation will allow us to make further additions to Ruff's diagnostics, such as adding sub-diagnostics and multiple annotations to the same snippet.
Contributors
Install ruff 0.12.9
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.9
v0.12.8Compare Source
Release Notes
Preview features
flake8-use-pathlib] ExpandPTH201to check allPurePathsubclasses (#19440)Bug fixes
flake8-blind-except] ChangeBLE001to correctly parse exception tuples (#19747)flake8-errmsg] Excludetyping.castfromEM101(#19656)flake8-simplify] Fix raw string handling inSIM905for embedded quotes (#19591)flake8-import-conventions] Avoid false positives for NFKC-normalized__debug__import aliases inICN001(#19411)isort] Fix syntax error after docstring ending with backslash (I002) (#19505)pylint] MarkPLC0207fixes as unsafe when*argsunpacking is present (#19679)pyupgrade] Prevent infinite loop withI002(UP010,UP035) (#19413)ruff] Parenthesize generator expressions in f-strings (RUF010) (#19434)Rule changes
eradicate] Don't flagpyreflypragmas as unused code (ERA001) (#19731)Documentation
RUF036(#19706)typingdocumentation (#19648)refurb] Make more examples error out-of-the-box (#19695,#19673,#19672)Other changes
ruffid (#19654)Contributors
Install ruff 0.12.8
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.8
v0.12.7Release Notes
This is a follow-up release to 0.12.6. Because of an issue in the package metadata, 0.12.6 failed to publish fully to PyPI and has been yanked. Similarly, there is no GitHub release or Git tag for 0.12.6. The contents of the 0.12.7 release are identical to 0.12.6, except for the updated metadata.
0.12.6 Release Notes
Preview features
flake8-commas] Add support for trailing comma checks in type parameter lists (COM812,COM819) (#19390)pylint] Implement auto-fix formissing-maxsplit-arg(PLC0207) (#19387)ruff] Offer fixes forRUF039in more cases (#19065)Bug fixes
.pyifiles in ruff analyze graph (#19611)flake8-pyi] Preserve inline comment in ellipsis removal (PYI013) (#19399)perflint] Ignore rule if target isglobalornonlocal(PERF401) (#19539)pyupgrade] FixUP030to avoid modifying double curly braces in format strings (#19378)refurb] Ignore decorated functions forFURB118(#19339)refurb] Markintandboolcases forDecimal.from_floatas safe fixes (FURB164) (#19468)ruff] FixRUF033for named default expressions (#19115)Rule changes
flake8-blind-except] ChangeBLE001to permitlogging.critical(..., exc_info=True)(#19520)Performance
Contributors
Install ruff 0.12.7
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.7
v0.12.5Compare Source
Release Notes
Preview features
flake8-use-pathlib] Add autofix forPTH101,PTH104,PTH105,PTH121(#19404)ruff] Support byte strings (RUF055) (#18926)Bug fixes
unreachablepanic in parser (#19183)flake8-pyi] Skip fix if allUnionmembers areNone(PYI016) (#19416)perflint] Parenthesize generator expressions (PERF401) (#19325)pylint] Handle empty comments after line continuation (PLR2044) (#19405)Rule changes
pep8-naming] FixN802false positives forCGIHTTPRequestHandlerandSimpleHTTPRequestHandler(#19432)Contributors
Install ruff 0.12.5
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.5
v0.12.4Compare Source
Release Notes
Preview features
flake8-type-checking,pyupgrade,ruff] Addfrom __future__ import annotationswhen it would allow new fixes (TC001,TC002,TC003,UP037,RUF013) (#19100)flake8-use-pathlib] Add autofix forPTH109(#19245)pylint] Detect indirectpathlib.Pathusages forunspecified-encoding(PLW1514) (#19304)Bug fixes
flake8-bugbear] FixB017false negatives for keyword exception arguments (#19217)flake8-use-pathlib] Fix false negative on directPath()instantiation (PTH210) (#19388)flake8-django] FixDJ008false positive for abstract models with type-annotatedabstractfield (#19221)isort] FixI002import insertion after docstring with multiple string statements (#19222)isort] Treat form feed as valid whitespace before a semicolon (#19343)pydoclint] FixSyntaxErrorfrom fixes with line continuations (D201,D202) (#19246)refurb]FURB164fix should validate arguments and should usually be marked unsafe (#19136)Rule changes
flake8-use-pathlib] Skip single dots forinvalid-pathlib-with-suffix(PTH210) on versions >= 3.14 (#19331)pep8_naming] Avoid false positives on standard library functions with uppercase names (N802) (#18907)pycodestyle] Handle brace escapes for t-strings in logical lines (#19358)pylint] Extend invalid string character rules to include t-strings (#19355)ruff] Allowstrictkwarg when checking forstarmap-zip(RUF058) in Python 3.14+ (#19333)Documentation
flake8-type-checking] MakeTC010docs example more realistic (#19356)Contributors
Install ruff 0.12.4
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.4
v0.12.3Compare Source
Release Notes
Preview features
flake8-bugbear] Support non-context-manager calls inB017(#19063)flake8-use-pathlib] Add autofixes forPTH100,PTH106,PTH107,PTH108,PTH110,PTH111,PTH112,PTH113,PTH114,PTH115,PTH117,PTH119,PTH120(#19213)flake8-use-pathlib] Add autofixes forPTH203,PTH204,PTH205(#18922)Bug fixes
flake8-return] Fix false-positive for variables used inside nested functions inRET504(#18433)flake8-type-checking] Fix syntax error introduced by fix (TC008) (#19150)pyupgrade] Keyword arguments insupershould suppress theUP008fix (#19131)Documentation
flake8-pyi] Make example error out-of-the-box (PYI007,PYI008) (#19103)flake8-simplify] Make example error out-of-the-box (SIM116) (#19111)flake8-type-checking] Make example error out-of-the-box (TC001) (#19151)flake8-use-pathlib] Make example error out-of-the-box (PTH210) (#19189)pycodestyle] Make example error out-of-the-box (E272) (#19191)pycodestyle] Make example not raise unnecessarySyntaxError(E114) (#19190)pydoclint] Make example error out-of-the-box (DOC501) (#19218)pylint,pyupgrade] Fix syntax errors in examples (PLW1501,UP028) (#19127)pylint] Updatemissing-maxsplit-argdocs and error to suggest proper usage (PLC0207) (#18949)flake8-bandit] Make example error out-of-the-box (S412) (#19241)Contributors
Install ruff 0.12.3
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.3
v0.12.2Compare Source
Release Notes
Preview features
flake8-pyi] ExpandOptional[A]toA | None(PYI016) (#18572)pyupgrade] MarkUP008fix safe if no comments are in range (#18683)Bug fixes
flake8-comprehensions] FixC420to prepend whitespace when needed (#18616)perflint] FixPERF403panic on attribute or subscription loop variable (#19042)pydocstyle] FixD413infinite loop for parenthesized docstring (#18930)pylint] FixPLW0108autofix introducing a syntax error when the lambda's body contains an assignment expression (#18678)refurb] Fix false positive on empty tuples (FURB168) (#19058)ruff] Allow morefieldcalls fromattrs(RUF009) (#19021)ruff] Fix syntax error introduced for an empty string followed by a u-prefixed string (UP025) (#18899)Rule changes
flake8-executable] Allowuvxin shebang line (EXE003) (#18967)pandas] Avoid flaggingPD002ifpandasis not imported (#18963)pyupgrade] Avoid PEP-604 unions withtyping.NamedTuple(UP007,UP045) (#18682)Documentation
import-outside-top-level (PLC0415)andlint.flake8-tidy-imports.banned-module-level-imports(#18733)format.skip-magic-trailing-commaexample (#19095)airflow] MakeAIR302example error out-of-the-box (#18988)airflow] MakeAIR312example error out-of-the-box (#18989)flake8-annotations] MakeANN401example error out-of-the-box (#18974)flake8-async] MakeASYNC100example error out-of-the-box (#18993)flake8-async] MakeASYNC105example error out-of-the-box (#19002)flake8-async] MakeASYNC110example error out-of-the-box (#18975)flake8-async] MakeASYNC210example error out-of-the-box (#18977)flake8-async] MakeASYNC220,ASYNC221, andASYNC222examples error out-of-the-box (#18978)flake8-async] MakeASYNC251example error out-of-the-box (#18990)flake8-bandit] MakeS201example error out-of-the-box (#19017)flake8-bandit] MakeS604andS609examples error out-of-the-box (#19049)flake8-bugbear] MakeB028example error out-of-the-box (#19054)flake8-bugbear] MakeB911example error out-of-the-box (#19051)flake8-datetimez] MakeDTZ011example error out-of-the-box (#19055)flake8-datetimez] MakeDTZ901example error out-of-the-box (#19056)flake8-pyi] MakePYI032example error out-of-the-box (#19061)flake8-pyi] Make example error out-of-the-box (PYI014,PYI015) (#19097)flake8-pyi] Make example error out-of-the-box (PYI042) (#19101)flake8-pyi] Make example error out-of-the-box (PYI059) (#19080)flake8-pyi] Make example error out-of-the-box (PYI062) (#19079)flake8-pytest-style] Make example error out-of-the-box (PT023) (#19104)flake8-pytest-style] Make example error out-of-the-box (PT030) (#19105)flake8-quotes] Make example error out-of-the-box (Q003) (#19106)flake8-simplify] Make example error out-of-the-box (SIM110) (#19113)flake8-simplify] Make example error out-of-the-box (SIM113) (#19109)flake8-simplify] Make example error out-of-the-box (SIM401) (#19110)pyflakes] Fix backslash in docs (F621) (#19098)pylint] FixPLC0415example (#18970)Contributors
Install ruff 0.12.2
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.2
v0.12.1Compare Source
Release Notes
Preview features
flake8-errmsg] ExtendEM101to support byte strings (#18867)flake8-use-pathlib] Add autofix forPTH202(#18763)pygrep-hooks] AddAsyncMockmethods toinvalid-mock-access(PGH005) (#18547)pylint] Ignore__init__.pyfiles in (PLC0414) (#18400)ruff] TriggerRUF037for empty string and byte strings (#18862).pyifiles (#18888)Bug fixes
remove_argument(#18805)flake8-logging] Avoid false positive forexc_info=Trueoutsidelogger.exception(LOG014) (#18737)flake8-pytest-style] Enforcepytestimport for decorators (#18779)flake8-pytest-style] Mark autofix forPT001andPT023as unsafe if there's comments in the decorator (#18792)flake8-pytest-style]PT001/PT023fix makes syntax error on parenthesized decorator (#18782)flake8-raise] Make fix unsafe if it deletes comments (RSE102) (#18788)flake8-simplify] FixSIM911autofix creating a syntax error (#18793)flake8-simplify] Fix false negatives for shadowed bindings (SIM910,SIM911) (#18794)flake8-simplify] Preserve original behavior forexcept ()and bareexcept(SIM105) (#18213)flake8-pyi] FixPYI041's fix causingTypeErrorwithNone | None | ...(#18637)perflint] FixPERF101autofix creating a syntax error and mark autofix as unsafe if there are comments in thelistcall expr (#18803)perflint] Fix false negative inPERF401(#18866)pylint] Avoid flattening nestedmin/maxwhen outer call has single argument (PLW3301) (#16885)pylint] FixPLC2801autofix creating a syntax error (#18857)pylint] MarkPLE0241autofix as unsafe if there's comments in the base classes (#18832)pylint] SuppressPLE2510/PLE2512/PLE2513/PLE2514/PLE2515autofix if the text contains an odd number of backslashes (#18856)refurb] Detect more exotic float literals inFURB164(#18925)refurb] FixFURB163autofix creating a syntax error foryieldexpressions (#18756)refurb] MarkFURB129autofix as unsafe if there's comments in thereadlinescall (#18858)ruff] Fix false positives and negatives inRUF010(#18690)analyze.directionvariant names (#18892)Rule changes
flake8-return] MarkRET501fix unsafe if comments are inside (#18780)flake8-async] Fix detection for large integer sleep durations inASYNC116rule (#18767)flake8-async] Mark autofix forASYNC115as unsafe if the call expression contains comments (#18753)flake8-bugbear] Mark autofix forB004as unsafe if thehasattrcall expr contains comments (#18755)flake8-comprehension] Mark autofix forC420as unsafe if there's comments inside the dict comprehension (#18768)flake8-comprehensions] Handle template strings for comprehension fixes (#18710)flake8-future-annotations] Add autofix (FA100) (#18903)pyflakes] MarkF504/F522/F523autofix as unsafe if there's a call with side effect (#18839)pylint] Allow fix with comments and document performance implications (PLW3301) (#18936)pylint] Detect more exoticNaNliterals inPLW0177(#18630)pylint] FixPLC1802autofix creating a syntax error and mark autofix as unsafe if there's comments in thelencall (#18836)pyupgrade] Extend version detection to includesys.version_info.major(UP036) (#18633)ruff] Add lint ruleRUF064for callingchmodwith non-octal integers (#18541)ruff] Addedcls.__dict__.get('__annotations__')check (RUF063) (#18233)ruff] Frozendataclassdefault should be valid (RUF009) (#18735)Server
Documentation
perflint] Small docs improvement toPERF401(#18786)pyupgrade]: Usesuper(), not__super__in error messages (UP008) (#18743)flake8-pie] Small docs fix toPIE794(#18829)flake8-pyi] Correctcollections-named-tupleexample to use PascalCase assignment (#16884)flake8-pie] Add note on type checking benefits tounnecessary-dict-kwargs(PIE804) (#18666)pycodestyle] Clarify PEP 8 relationship towhitespace-around-operatorrules (#18870)Other changes
flake8-logging] Add fix safety section toLOG002(#18840)pyupgrade] Add fix safety section toUP010(#18838)Contributors
Install ruff 0.12.1
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.1
v0.12.0Compare Source
Release Notes
Check out the blog post for a migration guide and overview of the changes!
Breaking changes
Detection of more syntax errors
Ruff now detects version-related syntax errors, such as the use of the
matchstatement on Python versions before 3.10, and syntax errors emitted by
CPython's compiler, such as irrefutable
matchpatterns before the finalcasearm.New default Python version handling for syntax errors
Ruff will default to the latest supported Python version (3.13) when
checking for the version-related syntax errors mentioned above to prevent
false positives in projects without a Python version configured. The default
in all other cases, like applying lint rules, is unchanged and remains at the
minimum supported Python version (3.9).
Updated f-string formatting
Ruff now formats multi-line f-strings with format specifiers to avoid adding a
line break after the format specifier. This addresses a change to the Python
grammar in version 3.13.4 that made such a line break a syntax error.
rust-toolchain.tomlis no longer included in source distributionsThe
rust-toolchain.tomlis used to specify a higher Rust version than Ruff'sminimum supported Rust version (MSRV) for development and building release
artifacts. However, when present in source distributions, it would also cause
downstream package maintainers to pull in the same Rust toolchain, even if
their available toolchain was MSRV-compatible.
Removed Rules
The following rules have been removed:
suspicious-xmle-tree-usage(S320)Deprecated Rules
The following rules have been deprecated:
pandas-df-variable-nameStabilization
The following rules have been stabilized and are no longer in preview:
for-loop-writes(FURB122)check-and-remove-from-set(FURB132)verbose-decimal-constructor(FURB157)fromisoformat-replace-z(FURB162)int-on-sliced-str(FURB166)exc-info-outside-except-handler(LOG014)import-outside-top-level(PLC0415)unnecessary-dict-index-lookup(PLR1733)nan-comparison(PLW0177)eq-without-hash(PLW1641)pytest-parameter-with-default-argument(PT028)pytest-warns-too-broad(PT030)pytest-warns-with-multiple-statements(PT031)invalid-formatter-suppression-comment(RUF028)dataclass-enum(RUF049)class-with-mixed-type-vars(RUF053)unnecessary-round(RUF057)starmap-zip(RUF058)non-pep604-annotation-optional(UP045)non-pep695-generic-class(UP046)non-pep695-generic-function(UP047)private-type-parameter(UP049)The following behaviors have been stabilized:
collection-literal-concatenation(RUF005) now recognizes slices, inaddition to list literals and variables.
readlines-in-for(FURB129) is now marked as always safe.if-else-block-instead-of-if-exp(SIM108) will now further simplifyexpressions to use
orinstead of anifexpression, where possible.unused-noqa(RUF100) now checks for file-levelnoqacomments as wellas inline comments.
subprocess-without-shell-equals-true(S603) now accepts literal strings,as well as lists and tuples of literal strings, as trusted input.
boolean-type-hint-positional-argument(FBT001) now applies to types thatinclude
bool, likebool | intortyping.Optional[bool], in addition toplain
boolannotations.non-pep604-annotation-union(UP007) has now been split into two rules.UP007now applies only totyping.Union, whilenon-pep604-annotation-optional(UP045) checks for use oftyping.Optional.UP045has also been stabilized in this release, but youmay need to update existing
include,ignore, ornoqasettings toaccommodate this change.
Preview features
ruff] Check for non-context-manager use ofpytest.raises,pytest.warns, andpytest.deprecated_call(RUF061) (#17368)Bug fixes
readlines(#18542)\rand\r\nhandling in t- and f-string debug texts (#18673)}when f-string expression has a format specifier (#18704)flake8-pyi] Avoid syntax error in the case of starred and keyword arguments (PYI059) (#18611)flake8-return] FixRET504autofix generating a syntax error (#18428)pep8-naming] Suppress fix forN804andN805if the recommended name is already used (#18472)pycodestyle] Avoid causing a syntax error in expressions spanning multiple lines (E731) (#18479)pyupgrade] SuppressUP008ifsuperis shadowed (#18688)refurb] Parenthesize lambda and ternary expressions (FURB122,FURB142) (#18592)ruff] Handle extra arguments todeque(RUF037) (#18614)ruff] Preserve parentheses arounddequein fix forunnecessary-empty-iterable-within-deque-call(RUF037) (#18598)ruff] Validate arguments before offering a fix (RUF056) (#18631)ruff] Skip fix forRUF059if dummy name is already bound (#18509)pylint] FixPLW0128to check assignment targets in square brackets and after asterisks (#18665)Rule changes
returnstatements (B909) (#18408)ty:comments as pragma comments (#18532)flake8-pyi] Applycustom-typevar-for-selfto string annotations (PYI019) (#18311)pyupgrade] Don't offer a fix forOptional[None](UP007,UP045)(#18545)pyupgrade] Fixsuper(__class__, self)detection (UP008) (#18478)refurb] Make the fix forFURB163unsafe forlog2,log10,*args, and deleted comments (#18645)Server
Documentation
*from glob pattern example forper-file-target-version(#18709)pylint] De-emphasize__hash__ = Parent.__hash__(PLW1641) (#18613)refurb] Add a note about float literal handling (FURB157) (#18615)Contributors
Install ruff 0.12.0
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.12.0
v0.11.13Compare Source
Release Notes
Preview features
airflow] Add unsafe fix for module moved cases (AIR301,AIR311,AIR312,AIR302) (#18367,#18366,#18363,#18093)refurb] Add coverage ofsetandfrozensetcalls (FURB171) (#18035)refurb] MarkFURB180fix unsafe when class has bases (#18149)Bug fixes
perflint] Fix missing parentheses for lambda and ternary conditions (PERF401,PERF403) (#18412)pyupgrade] ApplyUP035only on py313+ forget_type_hints()(#18476)pyupgrade] Make fix unsafe if it deletes comments (UP004,UP050) (#18393, #18390)Rule changes
fastapi] Avoid false positive for class dependencies (FAST003) (#18271)Documentation
Other changes
Contributors
Install ruff 0.11.13
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.13
v0.11.12Compare Source
Release Notes
Preview features
airflow] Revise fix titles (AIR3) (#18215)pylint] Implementmissing-maxsplit-arg(PLC0207) (#17454)pyupgrade] New ruleUP050(useless-class-metaclass-type) (#18334)flake8-use-pathlib] Replaceos.symlinkwithPath.symlink_to(PTH211) (#18337)Bug fixes
flake8-bugbear] Ignore__debug__attribute inB010(#18357)flake8-async] Fixanyio.sleepargument name (ASYNC115,ASYNC116) (#18262)refurb] FixFURB129autofix generating invalid syntax (#18235)Rule changes
flake8-implicit-str-concat] Add autofix forISC003(#18256)pycodestyle] Improve the diagnostic message forE712(#18328)flake8-2020] Fix diagnostic message for!=comparisons (YTT201) (#18293)pyupgrade] Make fix unsafe if it deletes comments (UP010) (#18291)Documentation
flake8-bugbear] Add fix safety section (B006) (#17652)Contributors
Install ruff 0.11.12
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.12
v0.11.11Compare Source
Release Notes
Preview features
airflow] Add autofixes forAIR302andAIR312(#17942)airflow] Move rules fromAIR312toAIR302(#17940)airflow] UpdateAIR301andAIR311with the latest Airflow implementations (#17985)flake8-simplify] Enable fix in preview mode (SIM117) (#18208)Bug fixes
[]and_(#18147)pylint] FixPLW1514not recognizing theencodingpositional argument ofcodecs.open(#18109)CLI
Documentation
flake8-print] Improve print/pprint docs forT201andT203(#18130)flake8-simplify] Add fix safety section (SIM110,SIM210) (#18114,#18100)pylint] Fix docs example that produced different output (PLW0603) (#18216)Contributors
Install ruff 0.11.11
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.11
v0.11.10Compare Source
Release Notes
Preview features
ruff] Implement a recursive check forRUF060(#17976)airflow] Enable autofixes forAIR301andAIR311(#17941)airflow] Apply try catch guard to allAIR3rules (#17887)airflow] ExtendAIR311rules (#17913)Bug fixes
flake8-bugbear] IgnoreB028ifskip_file_prefixesis present (#18047)flake8-pie] Mark autofix forPIE804as unsafe if the dictionary contains comments (#18046)flake8-simplify] Correct behavior forstr.split/rsplitwithmaxsplit=0(SIM905) (#18075)flake8-simplify] FixSIM905autofix forrsplitcreating a reversed list literal (#18045)flake8-use-pathlib] Suppress diagnostics for allos.*functions that have thedir_fdparameter (PTH) (#17968)refurb] Mark autofix as safe only for number literals (FURB116) (#17692)Rule changes
flake8-bandit] SkipS608for expressionless f-strings (#17999)flake8-pytest-style] Don't recommendusefixturesforparametrizevalues (PT019) (#17650)pyupgrade] Addresource.erroras deprecated alias ofOSError(UP024) (#17933)CLI
Documentation
flake8-simplify] Add fix safety section (SIM103) (#18086)flake8-simplify] Add fix safety section (SIM112) (#18099)pylint] Add fix safety section (PLC0414) (#17802)pylint] Add fix safety section (PLE4703) (#17824)pylint] Add fix safety section (PLW1514) (#17932)pylint] Add fix safety section (PLW3301) (#17878)ruff] Add fix safety section (RUF007) (#17755)ruff] Add fix safety section (RUF033) (#17760)Contributors
Install ruff 0.11.10
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.10
v0.11.9Compare Source
Release Notes
Preview features
airflow] FixSQLTableCheckOperatortypo (AIR302) (#17946)airflow] Removeairflow.utils.dag_parsing_context.get_parsing_context(AIR301) (#17852)airflow] Skip attribute check in try catch block (AIR301) (#17790)flake8-bandit] Mark tuples of string literals as trusted input inS603(#17801)isort] Check full module path against project root(s) when categorizing first-party imports (#16565)ruff] Add new rulein-empty-collection(RUF060) (#16480)Bug fixes
combinecall forlint.typing-extensionssetting (#17823)flake8-async] Fix module name inASYNC110,ASYNC115, andASYNC116fixes (#17774)pyupgrade] Add spaces between tokens as necessary to avoid syntax errors inUP018autofix (#17648)refurb] Fix false positive for float and complex numbers inFURB116(#17661)Documentation
PLC2801,PLR1722, andRUF013(#17825, #17826, #17759)check-typed-exceptionfromS110andS112(#17786)Other changes
ruff analyze graph(#17743)Contributors
Install ruff 0.11.9
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.9
v0.11.8Compare Source
Release Notes
Preview features
airflow] Apply auto fixes to cases where the names have changed in Airflow 3 (AIR302,AIR311) (#17553, #17570, #17571)airflow] ExtendAIR301rule (#17598)airflow] Update existingAIR302rules with better suggestions (#17542)refurb] Mark fix as safe forreadlines-in-for(FURB129) (#17644)nonlocaldeclaration at module level (#17559)x = *y(#17624)Bug fixes
flake8-pyi] EnsureLiteral[None,] | Literal[None,]is not autofixed toNone | None(PYI061) (#17659)flake8-use-pathlib] Avoid suggestingPath.iterdir()foros.listdirwith file descriptor (PTH208) (#17715)flake8-use-pathlib] FixPTH104false positive whenrenameis passed a file descriptor (#17712)flake8-use-pathlib] FixPTH116false positive whenstatis passed a file descriptor (#17709)flake8-use-pathlib] FixPTH123false positive whenopenis passed a file descriptor from a function call (#17705)pycodestyle] Fix duplicated diagnostic inE712(#17651)pylint] Detectglobaldeclarations in module scope (PLE0118) (#17411)async-comprehension-in-sync-comprehensionmore specific (#17460)Configuration
typing_extensionsimports (#17611)Documentation
lint.pydocstyle.ignore-var-parametersoption (#17740)ASYNC116,FLY002,D200,RUF005,RUF017,RUF027,RUF028,RUF057) (#17497, #17496, #17502, #17484, #17480, #17485, #17722, #17483)Other changes
Contributors
Install ruff 0.11.8
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.8
v0.11.7Compare Source
Release Notes
Preview features
airflow] Apply auto fixes to cases where the names have changed in Airflow 3 (AIR301) (#17355)perflint] Implement fix formanual-dict-comprehension(PERF403) (#16719)Bug fixes
airflow] Fix typos in provider package names (AIR302,AIR312) (#17574)flake8-type-checking] Visit keyword arguments in checks involvingtyping.cast/typing.NewTypearguments (#17538)pyupgrade] Preserve parenthesis when fixing native literals containing newlines (UP018) (#17220)refurb] Mark theFURB161fix unsafe except for integers and booleans (#17240)Rule changes
perflint] Allow list function calls to be replaced with a comprehension (PERF401) (#17519)pycodestyle] Auto-fix redundant boolean comparison (E712) (#17090)pylint] make fix unsafe if delete comments (PLR1730) (#17459)Documentation
Contributors
Install ruff 0.11.7
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.7
v0.11.6Compare Source
Release Notes
Preview features
airflow] ExtractAIR311fromAIR301rules (AIR301,AIR311) (#17310, #17422)Bug fixes
\is at end of file (#17409)Contributors
Install ruff 0.11.6
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.6
v0.11.5Compare Source
Release Notes
Preview features
airflow] Add missingAIR302attribute check (#17115)airflow] Expand module path check to individual symbols (AIR302) (#17278)airflow] ExtractAIR312fromAIR302rules (AIR302,AIR312) (#17152)airflow] Update oudatedAIR301,AIR302rules (#17123)await(#17282)Bug fixes
flake8-pie] Avoid false positive for multiple assignment withauto()(PIE796) (#17274)Rule changes
ruff] FixRUF100to detect unused file-levelnoqadirectives with specific codes (#17042) (#17061)flake8-pytest-style] Avoid false positive for legacy form ofpytest.raises(PT011) (#17231)Documentation
Contributors
Install ruff 0.11.5
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.5
v0.11.4Compare Source
Release Notes
Preview features
ruff] Implementinvalid-rule-codeasRUF102(#17138)matchmapping patterns (#17129)matchclass patterns (#17186)Bug fixes
matchpatterns (#17184)typing.Annotatedsubscripts (#17201)Contributors
Install ruff 0.11.4
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.4
v0.11.3Compare Source
Release Notes
Preview features
airflow] Add more autofixes forAIR302(#16876, #16977, #16976, #16965)airflow] MoveAIR301toAIR002(#16978)airflow] MoveAIR302toAIR301andAIR303toAIR302(#17151)flake8-bandit] Markstrandlist[str]literals as trusted input (S603) (#17136)ruff] Support slices inRUF005(#17078)casepattern before final case (#16905)casepattern (#16957)return,yield, andfor(#17134)__debug__(#16984)Bug fixes
panic!when running Ruff from a deleted directory (#16903) (#17054)CLI
pyproject.tomlcorrectly when it is passed via stdin (#16971)Configuration
flake8-import-conventions] Add importnumpy.typing as nptto defaultflake8-import-conventions.aliases(#17133)Documentation
refurb] Document whyUserDict,UserList, andUserStringare preferred overdict,list, andstr(FURB189) (#16927)Contributors
Install ruff 0.11.3
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.3
v0.11.2Compare Source
Release Notes
Preview features
Contributors
Install ruff 0.11.2
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.2
v0.11.1Compare Source
Release Notes
Preview features
airflow] Addchain,chain_linearandcross_downstreamforAIR302(#16647)Bug fixes
FixAllaction in presence of version-specific syntax errors (#16848)flake8-bandit] Allow raw strings insuspicious-mark-safe-usage(S308) #16702 (#16770)refurb] Avoid panickingunwrapinverbose-decimal-constructor(FURB157) (#16777)refurb] Fix starred expressions fix (FURB161) (#16550)--statisticsreporting for unsafe fixes (#16756)Rule changes
flake8-executables] Allowuv runin shebang line forshebang-missing-python(EXE003) (#16849,#16855)CLI
--exit-non-zero-on-format(#16009)Documentation
__init__.py(#16818)flake8-gettext] Swapformat-andprintf-in-get-text-func-callexamples (INT002,INT003) (#16769)Contributors
Install ruff 0.11.1
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.1
v0.11.0Compare Source
Release Notes
This is a follow-up to release 0.10.0. The
requires-pythoninference changes were unintentionally omitted from 0.10.0, and have been included here. This release also includes stabilization of the preview behavior forPGH004.Breaking changes
Changes to how the Python version is inferred when a
target-versionis not specified (#16319)In previous versions of Ruff, you could specify your Python version with:
target-versionoption in aruff.tomlfile or the[tool.ruff]section of a pyproject.toml file.project.requires-pythonfield in apyproject.tomlfile with a[tool.ruff]section.These options worked well in most cases, and are still recommended for fine control of the Python version. However, because of the way Ruff discovers config files,
pyproject.tomlfiles without a[tool.ruff]section would be ignored, including therequires-pythonsetting. Ruff would then use the default Python version (3.9 as of this writing) instead, which is surprising when you've attempted to request another version.In v0.10, config discovery has been updated to address this issue:
ruff.tomlfile without atarget-version, it will checkfor a
pyproject.tomlfile in the same directory and respect itsrequires-pythonversion, even if it does not contain a[tool.ruff]section.
requires-pythonfield of the closestpyproject.tomlin a parent directory will take precedence.ruff.tomlorpyproject.tomlwith a[tool.ruff]section) in the directory of the file being checked, Ruff willsearch for the closest
pyproject.tomlin the parent directories and use itsrequires-pythonsetting.Stabilization
The following behaviors have been stabilized:
blanket-noqa(PGH004): Also detect blanked file-level noqa comments (and not just line level comments).Preview features
forstatement iterator clause before Python 3.9 (#16558)Install ruff 0.11.0
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.11.0
v0.10.0Compare Source
Release Notes
Check out the blog post for a migration guide and overview of the changes!
Breaking changes
See also, the "Remapped rules" section which may result in disabled rules.
Changes to how the Python version is inferred when a
target-versionis not specified (#16319)While this change was intended to be released in 0.10.0, it was unintentionally omitted. It was subsequently released in 0.11.0 — see the changelog there for details.
Updated
TYPE_CHECKINGbehavior (#16669)Previously, Ruff only recognized typechecking blocks that tested the
typing.TYPE_CHECKINGsymbol. Now, Ruff recognizes any local variable namedTYPE_CHECKING. This release also removes support for the legacyif 0:andif False:typechecking checks. Use a localTYPE_CHECKINGvariable instead.More robust noqa parsing (#16483)
The syntax for both file-level and in-line suppression comments has been unified and made more robust to certain errors. In most cases, this will result in more suppression comments being read by Ruff, but there are a few instances where previously read comments will now log an error to the user instead. Please refer to the documentation on Error suppression for the full specification.
Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment (#14005)
This change fixes a bug in the formatter where it introduced unnecessary parentheses around with statements with a single context manager and a trailing comment. This change may result in a change in formatting for some users.
Bump alpine default tag to 3.21 for derived Docker images (#16456)
Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Now the ruff:alpine image will use 3.21 instead of 3.20 and ruff:alpine3.20 will no longer be updated.
Deprecated Rules
The following rules have been deprecated:
non-pep604-isinstance(UP038)suspicious-xmle-tree-usage(S320)Remapped rules
The following rules have been remapped to new rule codes:
unsafe-markup-use]:RUF035toS704Stabilization
The following rules have been stabilized and are no longer in preview:
batched-without-explicit-strict(B911)unnecessary-dict-comprehension-for-iterable(C420)datetime-min-max(DTZ901)fast-api-unused-path-parameter(FAST003)root-logger-call(LOG015)len-test(PLC1802)shallow-copy-environ(PLW1507)os-listdir(PTH208)invalid-pathlib-with-suffix(PTH210)invalid-assert-message-literal-argument(RUF040)unnecessary-nested-literal(RUF041)unnecessary-cast-to-int(RUF046)map-int-version-parsing(RUF048)if-key-in-dict-del(RUF051)unsafe-markup-use(S704). This rule has also been renamed fromRUF035.split-static-string(SIM905)runtime-cast-value(TC006)unquoted-type-alias(TC007)non-pep646-unpack(UP044)The following behaviors have been stabilized:
bad-staticmethod-argument(PLW0211)invalid-first-argument-name-for-class-method(N804):__new__methods are now no longer flagged byinvalid-first-argument-name-for-class-method(N804) but instead bybad-staticmethod-argument(PLW0211)bad-str-strip-call(PLE1310): The rule now applies to objects which are known to have typestrorbytes.custom-type-var-for-self(PYI019): More accurate detection of customTypeVarsreplaceable bySelf. The range of the diagnostic is now the full function header rather than just the return annotation.invalid-argument-name(N803): Ignore argument names of functions decorated withtyping.overrideinvalid-envvar-default(PLW1508): Detect default value arguments toos.environ.getwith invalid type.pytest-raises-with-multiple-statements(PT012)pytest-warns-with-multiple-statements(PT031): Allowforstatements with an empty body inpytest.raisesandpytest.warnswithstatements.redundant-open-modes(UP015): The diagnostic range is now the range of the redundant mode argument where it previously was the range of the entire open call. You may have to replace yournoqacomments when suppressingUP015.stdlib-module-shadowing(A005): Changes the default value oflint.flake8-builtins.strict-checkingfromtruetofalse.type-none-comparison(FURB169): Now also recognizestype(expr) is type(None)comparisons whereexprisn't a name expression.The following fixes or improvements to fixes have been stabilized:
repeated-equality-comparison(PLR1714) (#16685)needless-bool(SIM103) (#16684)unused-private-type-var(PYI018) (#16682)Server
ruff.printDebugInformation(#16617)Configuration
flake8-builtins] Deprecate thebuiltins-prefixed options in favor of the unprefixed options (e.g.builtins-allowed-modulesis now deprecated in favor ofallowed-modules) (#16092)Bug fixes
CLI
ruff] Fixlast_tag/commits_since_last_tagforversioncommand (#16686)Contributors
Install ruff 0.10.0
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.10.0
v0.9.10Compare Source
Release Notes
Preview features
ruff] Add new ruleRUF059: Unused unpacked assignment (#16449)syntax-errors] Detect assignment expressions before Python 3.8 (#16383)syntax-errors] Named expressions in decorators before Python 3.9 (#16386)syntax-errors] Parenthesized keyword argument names after Python 3.8 (#16482)syntax-errors] Positional-only parameters before Python 3.8 (#16481)syntax-errors] Tuple unpacking inreturnandyieldbefore Python 3.8 (#16485)syntax-errors] Type parameter defaults before Python 3.13 (#16447)syntax-errors] Type parameter lists before Python 3.12 (#16479)syntax-errors]except*before Python 3.11 (#16446)syntax-errors]typestatements before Python 3.12 (#16478)Bug fixes
flake8-simplify] Exempt unittest context methods forSIM115rule (#16439)pyupgrade] Do not offer fix when at least one target isglobal/nonlocal(UP028) (#16451)flake8-builtins] Ignore variables matching module attribute names (A001) (#16454)pylint] Convertcodekeyword argument to a positional argument in fix for (PLR1722) (#16424)CLI
descriptiontocheck_namein GitLab output serializer (#16437)Documentation
pydocstyle] Clarify thatD417only checks docstrings with an arguments section (#16494)Contributors
Install ruff 0.9.10
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.10
v0.9.9Compare Source
Release Notes
Preview features
Bug fixes
Contributors
Install ruff 0.9.9
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.9
v0.9.8Compare Source
Release Notes
Preview features
Rule changes
pylint] Mark fix unsafe (PLW1507) (#16343)pylint] Catchcase np.nan/case math.naninmatchstatements (PLW0177) (#16378)ruff] Add more Pydantic models variants to the list of default copy semantics (RUF012) (#16291)Server
configurationPreferenceiseditorOnly(#16381)ruff.configurationto allow inline config (#16296)Configuration
per-file-target-versionoption (#16257)Bug fixes
refurb] Do not consider docstring(s) (FURB156) (#16391)flake8-self] Ignore attribute accesses on instance-like variables (SLF001) (#16149)pylint] Fix false positives, add missing methods, and support positional-only parameters (PLE0302) (#16263)flake8-pyi] MarkPYI030fix unsafe when comments are deleted (#16322)Documentation
S611(#16316)Contributors
Install ruff 0.9.8
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.8
v0.9.7Compare Source
Release Notes
Preview features
__new__methods as special function type for enforcing class method or static method rules (#13305)airflow] Improve the internal logic to differentiate deprecated symbols (AIR303) (#16013)refurb] Manual timezone monkeypatching (FURB162) (#16113)ruff] Implicit class variable in dataclass (RUF045) (#14349)ruff] Skip singleton starred expressions forincorrectly-parenthesized-tuple-in-subscript(RUF031) (#16083)refurb] Check for subclasses includes subscript expressions (FURB189) (#16155)Rule changes
flake8-debugger] Also flagsys.breakpointhookandsys.__breakpointhook__(T100) (#16191)pycodestyle] Exemptsite.addsitedir(...)calls (E402) (#16251)Formatter
Server
source.organizeImports.ruffandsource.fixAll.ruffcode actions for a notebook cell (#16154)ruff.printDebugInformation(#16215)ruff.printDebugInformation(#16214)CLI
noqaeven when there are no diagnostics (#16178)extends (#15658)Bug fixes
flake8-comprehensions] Handle trailing comma inC403fix (#16110)flake8-pyi] Avoid flaggingcustom-typevar-for-selfon metaclass methods (PYI019) (#16141)pydocstyle] Handle arguments with the same names as sections (D417) (#16011)pylint] Correct ordering of arguments in fix forif-stmt-min-max(PLR1730) (#16080)pylint] Do not offer fix for raw strings (PLE251) (#16132)pyupgrade] Do not upgrade functionalTypedDictswith private field names to the class-based syntax (UP013) (#16219)pyupgrade] Handle micro version numbers correctly (UP036) (#16091)pyupgrade] Unwrap unary expressions correctly (UP018) (#15919)refurb] Correctly handle lengths of literal strings inslice-to-remove-prefix-or-suffix(FURB188) (#16237)ruff] SkipRUF001diagnostics when visiting string type definitions (#16122)Documentation
source.*code actions in Notebook (#16212)SECURITY.md(#16224)Contributors
Install ruff 0.9.7
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.7
v0.9.6Compare Source
Release Notes
Preview features
airflow] Addexternal_task.{ExternalTaskMarker, ExternalTaskSensor}forAIR302(#16014)flake8-builtins] Make strict module name comparison optional (A005) (#15951)flake8-pyi] Extend fix to Python <= 3.9 forredundant-none-literal(PYI061) (#16044)pylint] Also report when the object isn't a literal (PLE1310) (#15985)ruff] Implementindented-form-feed(RUF054) (#16049)ruff] Skip type definitions formissing-f-string-syntax(RUF027) (#16054)Rule changes
flake8-annotations] Correct syntax fortyping.Unionin suggested return type fixes forANN20xrules (#16025)flake8-builtins] Match upstream module name comparison (A005) (#16006)flake8-comprehensions] Detect overshadowedlist/set/dict, ignore variadics and named expressions (C417) (#15955)flake8-pie] Remove following comma correctly when the unpacked dictionary is empty (PIE800) (#16008)flake8-simplify] Only triggerSIM401on known dictionaries (#15995)pylint] Do not report calls when object type and argument type mismatch, remove custom escape handling logic (PLE1310) (#15984)pyupgrade] Comments within parenthesized value ranges should not affect applicability (UP040) (#16027)pyupgrade] Don't introduce invalid syntax when upgrading old-style type aliases with parenthesized multiline values (UP040) (#16026)pyupgrade] Ensure we do not rename two type parameters to the same name (UP049) (#16038)pyupgrade] [ruff] Don't apply renamings if the new name is shadowed in a scope of one of the references to the binding (UP049,RUF052) (#16032)ruff] UpdateRUF009to behave similar toB008and ignore attributes with immutable types (#16048)Server
Bug fixes
flake8-datetime] Ignore.replace()calls while looking for.astimezone(#16050)flake8-type-checking] AvoidTC004false positive where the runtime definition is provided by__getattr__(#16052)Documentation
ruff-lspmigration document (#16072)ruff.nativeServer(#16039)Contributors
Install ruff 0.9.6
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.6
v0.9.5Compare Source
Release Notes
Preview features
TYPE_CHECKINGforin_type_checking_block(#15719)flake8-comprehensions] Handle builtins at top of file correctly forunnecessary-dict-comprehension-for-iterable(C420) (#15837)flake8-logging].exception()andexc_info=outside exception handlers (LOG004,LOG014) (#15799)flake8-pyi] Fix incorrect behaviour ofcustom-typevar-return-typepreview-mode autofix iftypingwas already imported (PYI019) (#15853)flake8-pyi] Fix more complex cases (PYI019) (#15821)flake8-pyi] MakePYI019autofixable for.pyfiles in preview mode as well as stubs (#15889)flake8-pyi] Remove type parameter correctly when it is the last (PYI019) (#15854)pylint] Fix missing parens in unsafe fix forunnecessary-dunder-call(PLC2801) (#15762)pyupgrade] Better messages and diagnostic range (UP015) (#15872)pyupgrade] Rename private type parameters in PEP 695 generics (UP049) (#15862)refurb] Also report non-name expressions (FURB169) (#15905)refurb] Mark fix as unsafe if there are comments (FURB171) (#15832)ruff] Classes with mixed type variable style (RUF053) (#15841)airflow]BashOperatorhas been moved toairflow.providers.standard.operators.bash.BashOperator(AIR302) (#15922)flake8-pyi] Add autofix for unused-private-type-var (PYI018) (#15999)flake8-pyi] Significantly improve accuracy ofPYI019if preview mode is enabled (#15888)Rule changes
flake8-comprehensions] Skip whenTypeErrorpresent from too many (kw)args forC410,C411, andC418(#15838)flake8-pyi] RenamePYI019and improve its diagnostic message (#15885)pep8-naming] Ignore@overridemethods (N803) (#15954)pyupgrade] Reuse replacement logic fromUP046andUP047to preserve more comments (UP040) (#15840)ruff] Analyze deferred annotations before enforcingmutable-(data)class-defaultandfunction-call-in-dataclass-default-argument(RUF008,RUF009,RUF012) (#15921)pycodestyle] Exemptsys.path += ...calls (E402) (#15980)Configuration
flake8-import-conventionsalias conflicts withisort.required-importsbound name (#15918)allOf(#15992)Bug fixes
flake8-comprehensions] Unnecessarylistcomprehension (rewrite as asetcomprehension) (C403) - Handle extraneous parentheses around list comprehension (#15877)flake8-comprehensions] Handle trailing comma in fixes forunnecessary-generator-list/set(C400,C401) (#15929)flake8-pyi] Fix several correctness issues withcustom-type-var-return-type(PYI019) (#15851)pep8-naming] Consider any number of leading underscore forN801(#15988)pyflakes] Visit forward annotations inTypeAliasTypeas types (F401) (#15829)pylint] Correct min/max auto-fix and suggestion for (PL1730) (#15930)refurb] Handle unparenthesized tuples correctly (FURB122,FURB142) (#15953)refurb] AvoidNone | Noneas well as better detection and fix (FURB168) (#15779)Documentation
ruff-lsprelated settings (#15850)linter.md): clarify that Python files are always searched for in subdirectories (#15882)non_pep695_generic_class.rs(#15946)lint.extendIgnoreeditor setting (#15844)UP049inUP046andUP047, addSee alsosection toUP040(#15956)RUF012(#15982)ignoreandselectconfig (#15883)Contributors
Install ruff 0.9.5
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.5
v0.9.4Compare Source
Release Notes
Preview features
airflow] Extend airflow context parameter check forBaseOperator.execute(AIR302) (#15713)airflow] UpdateAIR302to check for deprecated context keys (#15144)flake8-bandit] Permit suspicious imports within stub files (S4) (#15822)pylint] Do not triggerPLR6201on empty collections (#15732)refurb] Do not emit diagnostic when loop variables are used outside loop body (FURB122) (#15757)ruff] Add support for morerepatterns (RUF055) (#15764)ruff] Check for shadowedmapbefore suggesting fix (RUF058) (#15790)ruff] Do not emit diagnostic when all arguments tozip()are variadic (RUF058) (#15744)ruff] Parenthesize fix when argument spans multiple lines forunnecessary-round(RUF057) (#15703)Rule changes
flake8-bugbear] ExemptNewTypecalls where the original type is immutable (B008) (#15765)pylint] Honor banned top-level imports byTID253inPLC0415. (#15628)pyupgrade] Ignoreis_typeddictandTypedDictfordeprecated-import(UP035) (#15800)CLI
flake8-quotesoption (#15788)ruff config(#15603)Bug fixes
flake8-comprehensions] Do not emitunnecessary-mapdiagnostic when lambda has different arity (C417) (#15802)flake8-comprehensions] Parenthesizesortedwhen needed forunnecessary-call-around-sorted(C413) (#15825)pyupgrade] Handle end-of-line comments forquoted-annotation(UP037) (#15824)Documentation
trio.run_processandanyio.run_process(#15761)uv init --libin tutorial (#15718)Contributors
Install ruff 0.9.4
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.4
v0.9.3Compare Source
Release Notes
Preview features
airflow] Argumentfail_stopin DAG has been renamed asfail_fast(AIR302) (#15633)airflow] ExtendAIR303with more symbols (#15611)flake8-bandit] Report all references to suspicious functions (S3) (#15541)flake8-pytest-style] Do not emit diagnostics for emptyforloops (PT012,PT031) (#15542)flake8-simplify] Avoid double negations (SIM103) (#15562)pyflakes] Fix infinite loop with unused local import in__init__.py(F401) (#15517)pylint] Do not report methods with only oneEM101-compatibleraise(PLR6301) (#15507)pylint] Implementredefined-slots-in-subclass(W0244) (#9640)pyupgrade] Add rules to use PEP 695 generics in classes and functions (UP046,UP047) (#15565, #15659)refurb] Implementfor-loop-writes(FURB122) (#10630)ruff] Implementneedless-elseclause (RUF047) (#15051)ruff] Implementstarmap-zip(RUF058) (#15483)Rule changes
flake8-bugbear] Do not raise error if keyword argument is present and target-python version is less or equals than 3.9 (B903) (#15549)flake8-comprehensions] strip parentheses around generators inunnecessary-generator-set(C401) (#15553)flake8-pytest-style] Rewrite references to.exception(PT027) (#15680)flake8-simplify] Mark fixes as unsafe (SIM201,SIM202) (#15626)flake8-type-checking] Fix some safe fixes being labeled unsafe (TC006,TC008) (#15638)isort] Omit trailing whitespace inunsorted-imports(I001) (#15518)pydoclint] Allow ignoring one line docstrings forDOCrules (#13302)pyflakes] Apply redefinition fixes by source code order (F811) (#15575)pyflakes] Avoid removing too many imports inredefined-while-unused(F811) (#15585)pyflakes] Group redefinition fixes by source statement (F811) (#15574)pylint] Include name of base class in message forredefined-slots-in-subclass(W0244) (#15559)ruff] Update fix forRUF055to usevar == value(#15605)Formatter
Performance
Server
unsafe-fixessettings for code actions (#15666)Bug fixes
flake8-bandit] Add missing single-line/dotall regex flag (S608) (#15654)flake8-import-conventions] Fix infinite loop betweenICN001andI002(ICN001) (#15480)flake8-simplify] Do not emit diagnostics for expressions inside string type annotations (SIM222,SIM223) (#15405)pyflakes] Treat arguments passed to thedefault=parameter ofTypeVaras type expressions (F821) (#15679)pyupgrade] Avoid syntax error when the iterable is a non-parenthesized tuple (UP028) (#15543)ruff] ExemptNewTypecalls where the original type is immutable (RUF009) (#15588)Documentation
TRY300: Add some extra notes on not catching exceptions you didn't expect (#15036)Contributors
Install ruff 0.9.3
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.3
v0.9.2Compare Source
Release Notes
Preview features
airflow] Fix typo "security_managr" to "security_manager" (AIR303) (#15463)airflow] extend and fix AIR302 rules (#15525)fastapi] Handle parameters withDependscorrectly (FAST003) (#15364)flake8-pytest-style] Implement pytest.warns diagnostics (PT029,PT030,PT031) (#15444)flake8-pytest-style] Test function parameters with default arguments (PT028) (#15449)flake8-type-checking] Avoid false positives for|inTC008(#15201)Rule changes
flake8-todos] Allow VSCode GitHub PR extension style links inmissing-todo-link(TD003) (#15519)pyflakes] Show syntax error message forF722(#15523)Formatter
Preserve(#15524)Server
ruff.configurationerrors (#15452)Configuration
flattento improve deserialization error messages (#15414)Bug fixes
fastapi] UpdateAnnotatedfixes (FAST002) (#15462)flake8-bandit] Check forbuiltinsinstead ofbuiltin(S102,PTH123) (#15443)flake8-pathlib] Fix--selectforos-path-dirname(PTH120) (#15446)ruff] Fix false positive on global keyword (RUF052) (#15235)Contributors
Install ruff 0.9.2
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.2
v0.9.1Compare Source
Release Notes
Preview features
pycodestyle] Runtoo-many-newlines-at-end-of-fileon each cell in notebooks (W391) (#15308)ruff] Omit diagnostic for shadowed private function parameters inused-dummy-variable(RUF052) (#15376)Rule changes
flake8-bugbear] Improveassert-raises-exceptionmessage (B017) (#15389)Formatter
Server
Bug fixes
flake8-pie] Correctly remove wrapping parentheses (PIE800) (#15394)pyupgrade] Handle comments and multiline expressions correctly (UP037) (#15337)Contributors
Install ruff 0.9.1
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.1
v0.9.0Compare Source
Release Notes
Check out the blog post for a migration guide and overview of the changes!
Breaking changes
Ruff now formats your code according to the 2025 style guide. As a result, your code might now get formatted differently. See the formatter section for a detailed list of changes.
This release doesn’t remove or remap any existing stable rules.
Stabilization
The following rules have been stabilized and are no longer in preview:
stdlib-module-shadowing(A005).This rule has also been renamed: previously, it was called
builtin-module-shadowing.builtin-lambda-argument-shadowing(A006)slice-to-remove-prefix-or-suffix(FURB188)boolean-chained-comparison(PLR1716)decimal-from-float-literal(RUF032)post-init-default(RUF033)useless-if-else(RUF034)The following behaviors have been stabilized:
pytest-parametrize-names-wrong-type(PT006): Detectpytest.parametrizecalls outside decorators and calls with keyword arguments.module-import-not-at-top-of-file(E402): Ignorepytest.importorskipcalls between import statements.mutable-dataclass-default(RUF008) andfunction-call-in-dataclass-default-argument(RUF009): Add support forattrs.bad-version-info-comparison(PYI006): Extend the rule to check non-stub files.The following fixes or improvements to fixes have been stabilized:
redundant-numeric-union(PYI041)duplicate-union-members(PYI016)Formatter
This release introduces the new 2025 stable style (#13371), stabilizing the following changes:
ISC001incompatibility warning (#15123)assertmessage over breaking the assertion expression (#9457)ifguards inmatchcaseclauses (#13513)matchcasepatterns (#6933)ifkeyword for comprehensions where the condition has a leading comment (#12282)withstatements with a single context manager for Python 3.8 or older (#10276)max-doc-code-line-length = "dynamic"(#13523)Preview features
flake8-bugbear] Implementclass-as-data-structure(B903) (#9601)flake8-type-checking] Applyquoted-type-aliasmore eagerly inTYPE_CHECKINGblocks and ignore it in stubs (TC008) (#15180)pylint] Ignoreeq-without-hashin stub files (PLW1641) (#15310)pyupgrade] SplitUP007into two individual rules:UP007forUnionandUP045forOptional(UP007,UP045) (#15313)ruff] New rule that detects classes that are both an enum and adataclass(RUF049) (#15299)ruff] RecodeRUF025toRUF037(RUF037) (#15258)Rule changes
flake8-builtins] Ignorestdlib-module-shadowingin stub files(A005) (#15350)flake8-return] Add support for functions returningtyping.Never(RET503) (#15298)Server
logLevelserver settingwhich defaults to
info. This addresses the issue where users were notified about an error and told to consult the log, but it didn’t contain any messages. (#15232)CLI
--config key=valuewhen thekeyis for a table and it’s a simplevalueBug fixes
eradicate] Ignore metadata blocks directly followed by normal blocks (ERA001) (#15330)flake8-django] Recognize other magic methods (DJ012) (#15365)pycodestyle] Avoid false positives related to type aliases (E252) (#15356)pydocstyle] Avoid treating newline-separated sections as sub-sections (D405) (#15311)pyflakes] Remove call when removing final argument fromformat(F523) (#15309)refurb] Mark fix as unsafe when the right-hand side is a string (FURB171) (#15273)ruff] Treat)as a regex metacharacter (RUF043,RUF055) (#15318)ruff] Parenthesize theint-call argument when removing theintcall would change semantics (RUF046) (#15277)Contributors
Install ruff 0.9.0
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Download ruff 0.9.0
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate.
⚠️ Artifact update problem
Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.
♻ Renovate will retry this branch, including artifacts, only when one of the following happens:
The artifact failure details are included below:
File name: pyproject.toml
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.