Released on 2026-08-20.
- [
flake8-use-pathlib] Add autofix forPTH116(#26460) - [
refurb] Restrictdelete-full-sliceto lists (FURB131) (#27711) - [
refurb] SkipFURB101andFURB103when theopenargument is a file descriptor (#27643)
- Fix
InvalidInstructionon Windows CPUs that do not supportPOPCNT(#27803) - [
pyflakes] Emit semantic syntax errors in string type definitions asF722(#27835) - [
pylint] Allowos._exitimports inimport-private-name(PLC2701) (#27738)
- [syntax-errors] Align mixed t-string/bytes error message with CPython 3.14 (#27766)
- [
ruff] Addctypes.LittleEndianStructureand related types to existing exception (RUF012) (#27753) - [syntax-errors] Detect duplicate keyword arguments (#17804)
- [syntax-errors] Detect parameters declared
nonlocal(#27628)
- Offer display-only fixes and mark safe fixes preferred (#27807)
- Support pull diagnostics for notebook cells (#27779)
- Fix s390x stacker assembly in release builds (#27776)
- Guarantee minimum stack size when parsing a module, standalone expression, and suites (#25464)
- Reduce configuration deserialization code size (#27924)
- Check packed AST index bounds (#27849)
- @AbhinavMir
- @eduardorittner
- @royb3
- @MichaReiser
- @carljm
- @rosstitmarsh
- @ntBre
- @zaniebot
- @ewdurbin
- @woodruffw
- @Sacrimento
- @lakshayxi
- @WhiteFox0-0
- @baltasarblanco
Released on 2026-08-13.
- [
pylint] Fix false negatives on negative numbers (PLR6104) (#27251) - [
pyupgrade] Add rule to replacewhile 1withwhile True(UP048) (#27190)
- [
flake8-bandit] Also check keyword arguments (S602,S603,S607,S609) (#27687) - [
pylint] Allowcontinueinfinallyon Python 3.8 (#27626) - [
pylint] FixPLE1307false positive with bools (#27651) - [
pylint] Fix false positives and negatives with%bformat character (PLE1300,PLE1307) (#27560) - [
pylint] Improve handling of concatenated strings (PLE1300) (#27659)
- [
numpy] Makenp.chararrayautofix backwards-compatible (NPY201) (#27527)
- Enable PGO for Linux x86-64 Ruff releases (#27570)
- Enable PGO for Linux ARM64 Ruff releases (#27574)
- Enable PGO for Windows x86-64 Ruff releases (#27573)
- Enable PGO for macOS ARM64 Ruff releases (#27572)
- Reduce
Exprsize to 64 bytes (#27591)
- Hyperlink rule codes in
ruff check --statisticsoutput (#27646)
- [
ruff] Also suggestasyncio.TaskGroup(RUF006) (#27461)
- Use mimalloc v3 (#27586)
- @Andrej730
- @alonfaraj
- @romero-deshaw
- @Avasam
- @tjkuson
- @charliermarsh
- @chirizxc
- @saberoueslati
- @MichaReiser
Released on 2026-08-06.
- [
flake8-pyi] Avoid false positives onsingledispatchfunctions (PYI041) (#27335)
- Register formatting capabilities dynamically to exclude TOML files (#27332)
Released on 2026-07-30.
- Add an option to opt out of human-readable names (#27160)
- [
flake8-pytest-style] Make fixes safe by default and unsafe only when comments are present (PT018) (#27201) - [
pyupgrade] Skip fix when a defaultedTypeVarprecedes a non-defaulted one (UP040,UP046,UP047) (#27133) - [
ruff] Fix false positive with unpacked arguments (RUF065) (#26959)
- Bump
gen-lsp-typesto gracefully handle unknown enumeration values in LSP messages (#27230) - [
flake8-bugbear] Markrangeas immutable (B008) (#27247) - [
flake8-comprehensions] NFKC-normalize keyword names inC408fix (#26813) - [
flake8-return] Fix false positive when variable is read infinallyclause (RET504) (#25441) - [
pydocstyle] Skip section detection inside RST directive bodies (D214,D405,D413) (#23635) - [
refurb] Parenthesizeyieldarguments in theFURB192fix (#27192)
- [
flake8-pytest-style] MarkPT022fixes as unsafe (#26440) - [
refurb] Mark fixes that remove unknown separators as unsafe (FURB105) (#27200)
- Cover
pyconMarkdown formatting (#27153) - [
flake8-bandit] DocumentTYPE_CHECKINGexception (S101) (#27004) - [
flake8-import-conventions] Document thatextend-aliasescan override default aliases (#27191) - [
pylint] Add missing fix safety gotchas fornon-augmented-assignment(PLR6104) (#27250)
- Reduce syntax error noise by swallowing dedents like indents (#27170)
- Vendor latest annotate-snippets (#27033)
- @bxff
- @anishgirianish
- @Avasam
- @epage
- @LHMQ878
- @MichaReiser
- @ntBre
- @HarshalPatel1972
- @mjpieters
- @joshuavetos
- @jesco-absolute
- @vidigoat
- @baltasarblanco
- @ribru17
- @oh-summy
- @Jayashanker-Padishala
Released on 2026-07-23.
Check out the blog post for a migration guide and overview of the changes!
-
Ruff now enables a much larger set of rules by default (413, up from 59). See the blog post for more details and the new Default Rules page for a full listing of the enabled rules. Note that this is primarily an expansion, but 18 of the more opinionated pycodestyle (
E) and pyflakes (F) rules have been removed from the default set:E401,E402,E701,E702,E703,E711,E712,E713,E714,E721,E731,E741,E742,E743,F403,F405,F406, andF722. -
Ruff can now format Python code blocks in Markdown files and will do this by default. See the documentation for more details.
-
Ruff now supports
ruff: ignorecomments at the ends of lines, likenoqacomments, or on the line preceding a diagnostic. For example, these both suppress anunused-import(F401) diagnostic:import math # ruff: ignore[F401] # ruff: ignore[F401] import os
-
Fixes are now shown in
checkandformat --checkoutput:❯ ruff format --check . unformatted: File would be reformatted --> try.md:1:1 | 1 | ```python - import math 2 + import math 3 | ``` | 1 file would be reformatted
This example also shows off the Markdown formatting.
-
format --checknow supports the same output formats as the linter, including thegithubandgitlaboutputs for rendering annotations in CI:❯ ruff format --check --output-format github . ::error title=ruff (unformatted),file=try.md,line=2,col=8,endLine=2,endColumn=10::try.md:2:8: unformatted: File would be reformatted
See the CLI help or documentation for the full list of supported formats.
-
The
filename,location,end_location,fix.edits[].location, andfix.edits[].end_locationfields in the JSON output format may now benullrather than defaulting to the empty string and row 1, column 1, respectively.
The following rules have been stabilized and are no longer in preview:
airflow3-incompatible-function-signature(AIR303)missing-copyright-notice(CPY001)unnecessary-from-float(FURB164)sorted-min-max(FURB192)implicit-string-concatenation-in-collection-literal(ISC004)log-exception-outside-except-handler(LOG004)invalid-bool-return-type(PLE0304)too-many-positional-arguments(PLR0917)stop-iteration-return(PLR1708)none-not-at-end-of-union(RUF036)access-annotations-from-class-dict(RUF063)duplicate-entry-in-dunder-all(RUF068)
The following behaviors have been stabilized:
blind-except(BLE001) is now suppressed when the exception is logged vialoggingmethods other thancritical,errorandexception.future-required-type-annotation(FA102) now checks for additional PEP 585-compatible APIs, such as those fromcollections.abc.f-string-in-get-text-func-call(INT001),format-in-get-text-func-call(INT002), andprintf-in-get-text-func-call(INT003) now check for additional common ways of using thegettextmodule, such as assigning it tobuiltins._.suspicious-url-open-usage(S310) now resolves local string literal bindings to avoid more false positives.snmp-insecure-version(S508) andsnmp-weak-cryptography(S509) now support the recommended API from newer versions of PySNMP.typing-text-str-alias(UP019) now recognizestyping_extensions.Textin addition totyping.Text.
- [
pyupgrade] Fix false positive withTypeVardefault before Python 3.13 (UP040) (#26888)
- [
ruff] Fix missing check on unrecognized early bound (RUF016) (#26986)
- Insert a space after the colon in Ruff suppression comments (#27123)
- [
pyupgrade] Speed upunnecessary-future-import(UP010) (#27047)
- [
ruff] Add missing period in "Why is this bad?" section (RUF200) (#26930) - [
flake8-simplify] Clarifyos.environbehavior on Windows (SIM112) (#26972) - [
pydocstyle] Document fix safety (D400) (#26971)
See changelogs/0.9.x
See changelogs/0.8.x
See changelogs/0.7.x
See changelogs/0.6.x
See changelogs/0.5.x
See changelogs/0.4.x
See changelogs/0.3.x
See changelogs/0.2.x
See changelogs/0.1.x