Released on 2025-10-07.
- Update default and latest Python versions for 3.14 (#20725)
- [
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)
- [
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)
- [
flake8-comprehensions] Clarify fix safety documentation (C413) (#20640)
Released on 2025-10-16.
- [formatter] Remove parentheses around multiple exception types on Python 3.14+ (#20768)
- [
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)
- Fix false negatives in
Truthiness::from_exprfor lambdas, generators, and f-strings (#20704) - Fix syntax error false positives for escapes and quotes in f-strings (#20867)
- Fix syntax error false positives on parenthesized context managers (#20846)
- [
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)
- [
airflow] Add warning toairflow.datasets.DatasetEventusage (AIR301) (#20551) - [
flake8-bugbear] MarkB905andB912fixes as unsafe (#20695) - Use
DiagnosticTagfor more rules - changes display in editors (#20758,#20734)
- Update Python compatibility from 3.13 to 3.14 in README.md (#20852)
- Update
lint.flake8-type-checking.quoted-annotationsdocs (#20765) - Update setup instructions for Zed 0.208.0+ (#20902)
- [
flake8-datetimez] Clarify docs for several rules (#20778) - Fix typo in
RUF015description (#20873)
- Reduce binary size (#20863)
- Improved error recovery for unclosed strings (including f- and t-strings) (#20848)
- @ntBre
- @Paillat-dev
- @terror
- @pieterh-oai
- @MichaReiser
- @TaKO8Ki
- @ageorgou
- @danparizher
- @mgaitan
- @augustelalande
- @dylwil3
- @Lee-W
- @injust
- @CarrotManMatt
Released on 2025-10-23.
- [
flake8-gettext] Resolve qualified names and built-in bindings (INT001,INT002,INT003) (#19045)
- Avoid reusing nested, interpolated quotes before Python 3.12 (#20930)
- Catch syntax errors in nested interpolations before Python 3.12 (#20949)
- [
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)
- [
flake8-bugbear] SkipB905andB912for fewer than two iterables and no starred arguments (#20998) - [
ruff] UseDiagnosticTagfor morepyflakesandpandasrules (#20801)
- Improve JSON output from
ruff rule(#20168)
- [syntax-errors] Name is parameter and global (#20426)
- [syntax-errors] Alternative
matchpatterns bind different names (#20682)
Released on 2025-10-30.
- Respect
--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)
- Fix finding keyword range for clause header after statement ending with semicolon (#21067)
- Fix syntax error false positive on nested alternative patterns (#21104)
- [
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)
- Add missing docstring sections to the numpy list (#20931)
- [
airflow] Extendairflow.models..Paramcheck (AIR311) (#21043) - [
airflow] Warn thatairflow....DAG.create_dagrunhas been removed (AIR301) (#21093) - [
refurb] Preserve digit separators inDecimalconstructor (FURB157) (#20588)
- Avoid sending an unnecessary "clear diagnostics" message for clients supporting pull diagnostics (#21105)
- [
flake8-bandit] Fix correct example forS308(#21128)
- Clearer error message when
line-lengthgoes beyond threshold (#21072)
- @danparizher
- @jvacek
- @ntBre
- @augustelalande
- @prakhar1144
- @TaKO8Ki
- @dylwil3
- @fatelei
- @ShaharNaveh
- @Lee-W
Released on 2025-11-06.
- [formatter] Allow newlines after function headers without docstrings (#21110)
- [formatter] Avoid extra parentheses for long
matchpatterns withascaptures (#21176) - [
refurb] Expand fix safety for keyword arguments andDecimals (FURB164) (#21259) - [
refurb] Preserve argument ordering in autofix (FURB103) (#20790)
- [server] Fix missing diagnostics for notebooks (#21156)
- [
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)
- [
airflow] extend deprecated argumentconcurrencyinairflow..DAG(AIR301) (#21220)
- Improve
extenddocs (#21135) - [
flake8-comprehensions] Fix typo inC416documentation (#21184) - Revise Ruff setup instructions for Zed editor (#20935)
- Make
ruff analyze graphwork with jupyter notebooks (#21161)
- @chirizxc
- @Lee-W
- @musicinmybrain
- @MichaReiser
- @tjkuson
- @danparizher
- @renovate
- @ntBre
- @gauthsvenkat
- @LoicRiegel
Released on 2025-11-13.
- [
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)
- Fix syntax error false positive on alternative
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)
- [
refurb] Detect empty f-strings (FURB105) (#21348)
- Add option to provide a reason to
--add-noqa(#21294) - Add upstream linter URL to
ruff linter --output-format=json(#21316) - Add color to
--help(#21337)
- Add a new "Opening a PR" section to the contribution guide (#21298)
- Added the PyScripter IDE to the list of "Who is using Ruff?" (#21402)
- Update PyCharm setup instructions (#21409)
- [
flake8-annotations] Add link toallow-star-arg-anyoption (ANN401) (#21326)
- [
configuration] Improve error message whenline-lengthexceedsu16::MAX(#21329)
- @njhearp
- @11happy
- @hugovk
- @Gankra
- @ntBre
- @pyscripter
- @danparizher
- @MichaReiser
- @henryiii
- @charliecloudberry
Released on 2025-11-21.
- [
flake8-bandit] Support new PySNMP API paths (S508,S509) (#21374)
- Adjust own-line comment placement between branches (#21185)
- Avoid syntax error when formatting attribute expressions with outer parentheses, parenthesized value, and trailing comment on value (#20418)
- Fix panic when formatting comments in unary expressions (#21501)
- Respect
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)
- [
ruff] Avoid false positive onClassVarreassignment (RUF012) (#21478)
- Render hyperlinks for lint errors (#21514)
- Add a
ruff analyzeoption to skip over imports inTYPE_CHECKINGblocks (#21472)
- Limit
eglot-formathook to eglot-managed Python buffers (#21459) - Mention
force-excludein "Configuration > Python file discovery" (#21500)
Released on 2025-11-28.
- [
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)
- [server] Set severity for non-rule diagnostics (#21559)
- [
flake8-implicit-str-concat] Avoid invalid fix in (ISC003) (#21517) - [
parser] Fix panic when parsing IPython escape command expressions (#21480)
- Show partial fixability indicator in statistics output (#21513)
- @mikeleppane
- @senekor
- @ShaharNaveh
- @JumboBear
- @prakhar1144
- @tsvikas
- @danparizher
- @chirizxc
- @AlexWaygood
- @MichaReiser
Released on 2025-12-04.
- [
flake8-bugbear] Catchyieldexpressions within other statements (B901) (#21200) - [
flake8-use-pathlib] Mark fixes unsafe for return type changes (PTH104,PTH105,PTH109,PTH115) (#21440)
- Fix syntax error false positives for
awaitoutside functions (#21763) - [
flake8-simplify] Fix truthiness assumption for non-iterable arguments in tuple/list/set calls (SIM222,SIM223) (#21479)
- Suggest using
--output-fileoption in GitLab integration (#21706)
- [syntax-error] Default type parameter followed by non-default type parameter (#21657)
Released on 2025-12-11.
- [
ruff] NewRUF100diagnostics for unused range suppressions (#21783) - [
pylint] Detect subclasses of builtin exceptions (PLW0133) (#21382)
- Fix comment placement in lambda parameters (#21868)
- Skip over trivia tokens after re-lexing (#21895)
- [
flake8-bandit] Fix false positive when using non-standardCSafeLoaderpath (S506). (#21830) - [
flake8-bugbear] Accept immutable slice default arguments (B008) (#21823)
- [
pydocstyle] SuppressD417for parameters withUnpackannotations (#21816)
- Use
memchrfor computing line indexes (#21838)
- Document
*.pywis included by default in preview (#21885) - Document range suppressions, reorganize suppression docs (#21884)
- Update mkdocs-material to 9.7.0 (Insiders now free) (#21797)
Released on 2025-12-18.
- [formatter] Fluent formatting of method chains (#21369)
- [formatter] Keep lambda parameters on one line and parenthesize the body if it expands (#21385)
- [
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)
- [
pyupgrade] Fix parsing named Unicode escape sequences (UP032) (#21901)
- [
eradicate] Ignoreruff:disableandruff:enablecomments inERA001(#22038) - [
flake8-pytest-style] Allowmatchandcheckkeyword arguments without an expected exception type (PT010) (#21964) - [syntax-errors] Annotated name cannot be global (#20868)
- Add
uvandtyto the Ruff README (#21996) - Document known lambda formatting deviations from Black (#21954)
- Update
setup.md(#22024) - [
flake8-bandit] Fix broken link (S704) (#22039)
- Fix playground Share button showing "Copied!" before clipboard copy completes (#21942)
- @dylwil3
- @charliecloudberry
- @charliermarsh
- @chirizxc
- @ntBre
- @zanieb
- @amyreese
- @hauntsaninja
- @11happy
- @mahiro72
- @MichaReiser
- @phongddo
- @PeterJCLaw
Released on 2026-01-08.
- Consolidate diagnostics for matched disable/enable suppression comments (#22099)
- Report diagnostics for invalid/unmatched range suppression comments (#21908)
- [
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)
- Fix GitHub format for multi-line diagnostics (#22108)
- [
flake8-unused-arguments] Mark**kwargsinTypeVaras used (ARG001) (#22214)
- Add
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)
- Allow Python 3.15 as valid
target-versionvalue in preview (#22419) - Check
required-versionbefore parsing rules (#22410) - Include configured
srcdirectories when resolving graphs (#22451)
- Update
T201suggestion to not use root logger to satisfyLOG015(#22059) - Fix
iterexample in unsafe fixes doc (#22118) - [
flake8_print] better suggestion forbasicConfiginT201docs (#22101) - [
pylint] Restore the fix safety docs forPLW0133(#22211) - Fix Jupyter notebook discovery info for editors (#22447)
- @charliermarsh
- @ntBre
- @cenviity
- @njhearp
- @cbachhuber
- @jelle-openai
- @AlexWaygood
- @ValdonVitija
- @BurntSushi
- @Jkhall81
- @PeterJCLaw
- @harupy
- @amyreese
- @sjyangkevin
- @woodruffw
Released on 2026-01-15.
- [
flake8-blind-except] Allow more logging methods (BLE001) (#22057) - [
ruff] Respectlint.pydocstyle.property-decoratorsinRUF066(#22515)
- Fix configuration path in
--show-settings(#22478) - Respect
fmt: skipfor multiple statements on the same logical line (#22119)
- [
pydocstyle] Update Rust crate imperative to v1.0.7 (D401) (#22519) - [
isort] Insert imports in alphabetical order (I002) (#22493)
- Add llms.txt support for documentation (#22463)
- Use prek in documentation and CI (#22505)
- [
flake8-pytest-style] Addcheckparameter example toPT017docs (#22546) - [
ruff] Make example error out-of-the-box (RUF103) (#22558) - [
ruff] documentRUF100trailing comment fix behavior (#22479)
- wasm: Require explicit logging initialization (#22587)
- @terror
- @harupy
- @Jkhall81
- @dhruvmanila
- @lubaskinc0de
- @zanieb
- @MeGaGiGaGon
- @charliermarsh
- @renovate
- @dylwil3
- @MichaReiser
- @11happy
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.
Released on 2026-01-22.
- Preserve required parentheses in lambda bodies (#22747)
- Combine range suppression code diagnostics (#22613)
- [
airflow] Second positional argument toAsset/Datasetshould not be a dictionary (AIR303) (#22453) - [
ruff] Detect duplicate entries in__all__(RUF068) (#22114)
- [
pyupgrade] Allow shadowing non-builtin bindings (UP029) (#22749) - [
pyupgrade] ApplyUP045to string arguments oftyping.cast(#22320) - [
flake8-pie] Detect duplicated declared class fields inPIE794(#22717)
- [
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) - Many fixes are now marked unsafe if they would remove comments:
- Add
--exit-non-zero-on-formatto formatter exit codes section (#22761) - Update contributing guide for adding a new rule (#22779)
- [
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)