Releases: astral-sh/ruff
0.5.0
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.
- Follow the XDG specification to discover user-level configurations on macOS (same as on other Unix platforms)
- Selecting
ALL
now excludes deprecated rules - The released archives now include an extra level of nesting, which can be removed with
--strip-components=1
when untarring. - The release artifact's file name no longer includes the version tag. This enables users to install via
/latest
URLs on GitHub. - The diagnostic ranges for some
flake8-bandit
rules were modified (#10667).
Deprecations
The following rules are now deprecated:
syntax-error
(E999
): Syntax errors are now always shown
Remapped rules
The following rules have been remapped to new rule codes:
blocking-http-call-in-async-function
:ASYNC100
toASYNC210
open-sleep-or-subprocess-in-async-function
:ASYNC101
split intoASYNC220
,ASYNC221
,ASYNC230
, andASYNC251
blocking-os-call-in-async-function
:ASYNC102
has been merged intoASYNC220
andASYNC221
trio-timeout-without-await
:TRIO100
toASYNC100
trio-sync-call
:TRIO105
toASYNC105
trio-async-function-with-timeout
:TRIO109
toASYNC109
trio-unneeded-sleep
:TRIO110
toASYNC110
trio-zero-sleep-call
:TRIO115
toASYNC115
repeated-isinstance-calls
:PLR1701
toSIM101
Stabilization
The following rules have been stabilized and are no longer in preview:
mutable-fromkeys-value
(RUF024
)default-factory-kwarg
(RUF026
)django-extra
(S610
)manual-dict-comprehension
(PERF403
)print-empty-string
(FURB105
)readlines-in-for
(FURB129
)if-expr-min-max
(FURB136
)bit-count
(FURB161
)redundant-log-base
(FURB163
)regex-flag-alias
(FURB167
)isinstance-type-none
(FURB168
)type-none-comparison
(FURB169
)implicit-cwd
(FURB177
)hashlib-digest-hex
(FURB181
)list-reverse-copy
(FURB187
)bad-open-mode
(PLW1501
)empty-comment
(PLR2044
)global-at-module-level
(PLW0604
)misplaced-bare-raise
(PLE0744
)non-ascii-import-name
(PLC2403
)non-ascii-name
(PLC2401
)nonlocal-and-global
(PLE0115
)potential-index-error
(PLE0643
)redeclared-assigned-name
(PLW0128
)redefined-argument-from-local
(PLR1704
)repeated-keyword-argument
(PLE1132
)super-without-brackets
(PLW0245
)unnecessary-list-index-lookup
(PLR1736
)useless-exception-statement
(PLW0133
)useless-with-lock
(PLW2101
)
The following behaviors have been stabilized:
is-literal
(F632
) now warns for identity checks against list, set or dictionary literalsneedless-bool
(SIM103
) now detectsif
expressions with implicitelse
branchesmodule-import-not-at-top-of-file
(E402
) now allowsos.environ
modifications between import statementstype-comparison
(E721
) now allows idioms such astype(x) is int
yoda-condition
(SIM300
) now flags a wider range of expressions
Removals
The following deprecated settings have been removed:
output-format=text
; useoutput-format=concise
oroutput-format=full
tab-size
; useindent-width
The following deprecated CLI options have been removed:
--show-source
; use--output-format=full
--no-show-source
; use--output-format=concise
The following deprecated CLI commands have been removed:
ruff <path>
; useruff check <path>
ruff --clean
; useruff clean
ruff --generate-shell-completion
; useruff generate-shell-completion
Preview features
- [
ruff
] Addassert-with-print-message
rule (#11981)
CLI
- Use rule name rather than message in
--statistics
(#11697) - Use the output format
full
by default (#12010) - Don't log syntax errors to the console (#11902)
Rule changes
- [
ruff
] Fix false positives ifgettext
is imported using an alias (RUF027
) (#12025) - [
numpy
] Updatetrapz
andin1d
deprecation (NPY201
) (#11948) - [
flake8-bandit
] Modify diagnostic ranges for shell-related rules (#10667)
Server
- Closing an untitled, unsaved notebook document no longer throws an error (#11942)
- Support the usage of tildes and environment variables in
logFile
(#11945) - Add option to configure whether to show syntax errors (#12059)
Bug fixes
- [
pycodestyle
] AvoidE203
for f-string debug expression (#12024) - [
pep8-naming
] Match import-name ignores against both name and alias (N812
,N817
) (#12033) - [
pyflakes
] Detect assignments that shadow definitions (F811
) (#11961)
Parser
- Emit a syntax error for an empty type parameter list (#12030)
- Avoid consuming the newline for unterminated strings (#12067)
- Do not include the newline in the unterminated string range (#12017)
- Use the correct range to highlight line continuation errors (#12016)
- Consider 2-character EOL before line continuations (#12035)
- Consider line continuation character for re-lexing (#12008)
Other changes
- Upgrade the Unicode table used for measuring the line-length (#11194)
- Remove the deprecation error message for the nursery selector (#10172)
Contributors
v0.4.10
Changes
Parser
- Implement re-lexing logic for better error recovery (#11845)
Rule changes
- [
flake8-copyright
] UpdateCPY001
to check the first 4096 bytes instead of 1024 (#11927) - [
pycodestyle
] UpdateE999
to show all syntax errors instead of just the first one (#11900)
Server
- Add tracing setup guide to Helix documentation (#11883)
- Add tracing setup guide to Neovim documentation (#11884)
- Defer notebook cell deletion to avoid an error message (#11864)
Security
- Guard against malicious ecosystem comment artifacts (#11879)
Contributors
v0.4.9
Changes
Preview features
- [
pylint
] Implementconsider-dict-items
(C0206
) (#11688) - [
refurb
] Implementrepeated-global
(FURB154
) (#11187)
Rule changes
- [
pycodestyle
] Adapt fix forE203
to work identical toruff format
(#10999)
Formatter
- Fix formatter instability for lines only consisting of zero-width characters (#11748)
Server
- Add supported commands in server capabilities (#11850)
- Use real file path when available in
ruff server
(#11800) - Improve error message when a command is run on an unavailable document (#11823)
- Introduce the
ruff.printDebugInformation
command (#11831) - Tracing system now respects log level and trace level, with options to log to a file (#11747)
CLI
- Handle non-printable characters in diff view (#11687)
Bug fixes
- [
refurb
] Avoid suggesting starmap when arguments are used outside call (FURB140
) (#11830) - [
flake8-bugbear
] Avoid panic inB909
when checking large loop blocks (#11772) - [
refurb
] Fix misbehavior ofoperator.itemgetter
when getter param is a tuple (FURB118
) (#11774)
Contributors
v0.4.8
Changes
Performance
- Linter performance has been improved by around 10% on some microbenchmarks by refactoring the lexer and parser to maintain synchronicity between them (#11457)
Preview features
- [
flake8-bugbear
] Implementreturn-in-generator
(B901
) (#11644) - [
flake8-pyi
] ImplementPYI063
(#11699) - [
pygrep_hooks
] Check blanket ignores via file-level pragmas (PGH004
) (#11540)
Rule changes
- [
pyupgrade
] UpdateUP035
for Python 3.13 and the latest version oftyping_extensions
(#11693) - [
numpy
] UpdateNPY001
rule for NumPy 2.0 (#11735)
Server
- Formatting a document with syntax problems no longer spams a visible error popup (#11745)
CLI
- Add RDJson support for
--output-format
flag (#11682)
Bug fixes
- [
pyupgrade
] Write empty string in lieu of panic when fixingUP032
(#11696) - [
flake8-simplify
] Simplify double negatives inSIM103
(#11684) - Ensure the expression generator adds a newline before
type
statements (#11720) - Respect per-file ignores for blanket and redirected noqa rules (#11728)
Contributors
v0.4.7
Changes
Preview features
- [
flake8-pyi
] ImplementPYI064
(#11325) - [
flake8-pyi
] ImplementPYI066
(#11541) - [
flake8-pyi
] ImplementPYI057
(#11486) - [
pyflakes
] EnableF822
in__init__.py
files by default (#11370)
Formatter
- Fix incorrect placement of trailing stub function comments (#11632)
Server
- Respect file exclusions in
ruff server
(#11590) - Add support for documents not exist on disk (#11588)
- Add Vim and Kate setup guide for
ruff server
(#11615)
Bug fixes
- Avoid removing newlines between docstring headers and rST blocks (#11609)
- Infer indentation with imports when logical indent is absent (#11608)
- Use char index rather than position for indent slice (#11645)
- [
flake8-comprehension
] Strip parentheses around generators inC400
(#11607) - Mark
repeated-isinstance-calls
as unsafe on Python 3.10 and later (#11622)
Contributors
v0.4.6
Changes
Breaking changes
- Use project-relative paths when calculating GitLab fingerprints (#11532)
Preview features
- [
flake8-async
] Sleep with >24 hour interval should usually sleep forever (ASYNC116
) (#11498)
Rule changes
- [
numpy
] Add missing functions to NumPy 2.0 migration rule (#11528) - [
mccabe
] Consider irrefutable pattern similar toif .. else
forC901
(#11565) - Consider
match
-case
statements forC901
,PLR0912
, andPLR0915
(#11521) - Remove empty strings when converting to f-string (
UP032
) (#11524) - [
flake8-bandit
]request-without-timeout
should warn forrequests.request
(#11548) - [
flake8-self
] Ignore sunder accesses inflake8-self
rules (#11546) - [
pyupgrade
] Lint forTypeAliasType
usages (UP040
) (#11530)
Server
- Respect excludes in
ruff server
configuration discovery (#11551) - Use default settings if initialization options is empty or not provided (#11566)
ruff server
correctly treats.pyi
files as stub files (#11535)ruff server
searches for configuration in parent directories (#11537)ruff server
: An empty code action filter no longer returns notebook source actions (#11526)
Bug fixes
- [
flake8-logging-format
] Fix autofix title inlogging-warn
(G010
) (#11514) - [
refurb
] Avoid recommendingoperator.itemgetter
with dependence on lambda arguments (#11574) - [
flake8-simplify
] Avoid recommending context manager in__enter__
implementations (#11575) - Create intermediary directories for
--output-file
(#11550) - Propagate reads on global variables (#11584)
- Treat all
singledispatch
arguments as runtime-required (#11523)
Contributors
v0.4.5
Changes
Ruff's language server is now in Beta
v0.4.5
marks the official Beta release of ruff server
, an integrated language server built into Ruff. ruff server
supports the same feature set as ruff-lsp
, powering linting, formatting, and code fixes in Ruff's editor integrations -- but with superior performance and no installation required. We'd love your feedback!
You can enable ruff server
in the VS Code extension today.
To read more about this exciting milestone, check out our blog post!
Rule changes
- [
flake8-future-annotations
] Rewordfuture-rewritable-type-annotation
(FA100
) message (#11381) - [
isort
] Expanded the set of standard-library modules to include_string
, etc. (#11374) - [
pycodestyle
] Consider soft keywords forE27
rules (#11446) - [
pyflakes
] Recommend adding unused import bindings to__all__
(#11314) - [
pyflakes
] Update documentation and deprecateignore_init_module_imports
(#11436) - [
pyupgrade
] Mark quotes as unnecessary for non-evaluated annotations (#11485)
Formatter
- Avoid multiline quotes warning with
quote-style = preserve
(#11490)
Server
- Support Jupyter Notebook files (#11206)
- Support
noqa
comment code actions (#11276) - Fix automatic configuration reloading (#11492)
- Fix several issues with configuration in Neovim and Helix (#11497)
CLI
- Add
--output-format
as a CLI option forruff config
(#11438)
Bug fixes
- Avoid
PLE0237
for property with setter (#11377) - Avoid
TCH005
forif
stmt withelif
/else
block (#11376) - Avoid flagging
__future__
annotations as required for non-evaluated type annotations (#11414) - Check for ruff executable in 'bin' directory as installed by 'pip install --target'. (#11450)
- Sort edits prior to deduplicating in quotation fix (#11452)
- Treat escaped newline as valid sequence (#11465)
- [
flake8-pie
] Preserve parentheses inunnecessary-dict-kwargs
(#11372) - [
pylint
] Ignore__slots__
with dynamic values (#11488) - [
pylint
] Removetry
body from branch counting (#11487) - [
refurb
] Respect operator precedence inFURB110
(#11464)
Documentation
- Add
--preview
to the README (#11395) - Add Python 3.13 to list of allowed Python versions (#11411)
- Simplify Neovim setup documentation (#11489)
- Update CONTRIBUTING.md to reflect the new parser (#11434)
- Update server documentation with new migration guide (#11499)
- [
pycodestyle
] Clarify motivation forE713
andE714
(#11483) - [
pyflakes
] Update docs to describe WAI behavior (F541) (#11362) - [
pylint
] Clearly indicate what is counted as a branch (#11423)
Contributors
v0.4.4
Changes
Preview features
- [
pycodestyle
] Ignore end-of-line comments when determining blank line rules (#11342) - [
pylint
] Detectpathlib.Path.open
calls inunspecified-encoding
(PLW1514
) (#11288) - [
flake8-pyi
] ImplementPYI059
(generic-not-last-base-class
) (#11233) - [
flake8-pyi
] ImplementPYI062
(duplicate-literal-member
) (#11269)
Rule changes
- [
flake8-boolean-trap
] Allow passing booleans as positional-only arguments in code such asset(True)
(#11287) - [
flake8-bugbear
] Ignore enum classes incached-instance-method
(B019
) (#11312)
Server
- Expand tildes when resolving Ruff server configuration file (#11283)
- Fix
ruff server
hanging after Neovim closes (#11291) - Editor settings are used by default if no file-based configuration exists (#11266)
Bug fixes
- [
pylint
] Considerwith
statements fortoo-many-branches
(PLR0912
) (#11321) - [
flake8-blind-except
,tryceratops
] Respect logged and re-raised expressions in nested statements (BLE001
,TRY201
) (#11301) - Recognise assignments such as
__all__ = builtins.list(["foo", "bar"])
as valid__all__
definitions (#11335)
Contributors
v0.4.3
Changes
Enhancements
- Add support for PEP 696 syntax (#11120)
Preview features
- [
refurb
] Use function range forreimplemented-operator
diagnostics (#11271) - [
refurb
] Ignore methods inreimplemented-operator
(FURB118
) (#11270) - [
refurb
] Implementfstring-number-format
(FURB116
) (#10921) - [
ruff
] Implementredirected-noqa
(RUF101
) (#11052) - [
pyflakes
] Distinguish between first-party and third-party imports for fix suggestions (#11168)
Rule changes
- [
flake8-bugbear
] Ignore non-abstract class attributes when enforcingB024
(#11210) - [
flake8-logging
] Include inline instantiations when detecting loggers (#11154) - [
pylint
] Also emitPLR0206
for properties with variadic parameters (#11200) - [
ruff
] Detect duplicate codes as part ofunused-noqa
(RUF100
) (#10850)
Formatter
- Avoid multiline expression if format specifier is present (#11123)
LSP
- Write
ruff server
setup guide for Helix (#11183) ruff server
no longer hangs after shutdown (#11222)ruff server
reads from a configuration TOML file in the user configuration directory if no local configuration exists (#11225)ruff server
respectsper-file-ignores
configuration (#11224)ruff server
: Support a custom TOML configuration file (#11140)ruff server
: Support setting to prioritize project configuration over editor configuration (#11086)
Bug fixes
- Avoid debug assertion around NFKC renames (#11249)
- [
pyflakes
] Prioritizeredefined-while-unused
overunused-import
(#11173) - [
ruff
] Respectasync
expressions in comprehension bodies (#11219) - [
pygrep_hooks
] Fixblanket-noqa
panic when last line has noqa with no newline (PGH004
) (#11108) - [
perflint
] Ignore list-copy recommendations for asyncfor
loops (#11250) - [
pyflakes
] Improveinvalid-print-syntax
documentation (#11171)
Performance
Windows
- Increase the minimum requirement to Windows 10.
Contributors
v0.4.2
Changes
Rule changes
- [
flake8-pyi
] Allow for overloaded__exit__
and__aexit__
definitions (PYI036
) (#11057) - [
pyupgrade
] Catch usages of"%s" % var
and provide an unsafe fix (UP031
) (#11019) - [
refurb
] Implement new rule that suggests min/max oversorted()
(FURB192
) (#10868)
Server
- Fix an issue with missing diagnostics for Neovim and Helix (#11092)
- Implement hover documentation for
noqa
codes (#11096) - Introduce common Ruff configuration options with new server settings (#11062)
Bug fixes
- Use
macos-12
for building release wheels to enable macOS 11 compatibility (#11146) - [
flake8-blind-expect
] Allow raise from inBLE001
(#11131) - [
flake8-pyi
] Allow simple assignments toNone
in enum class scopes (PYI026
) (#11128) - [
flake8-simplify
] Avoid raisingSIM911
for non-zip
attribute calls (#11126) - [
refurb
] Avoidoperator.itemgetter
suggestion for single-item tuple (#11095) - [
ruff
] Respect per-file-ignores forRUF100
with no other diagnostics (#11058) - [
ruff
] Fix async comprehension false positive (RUF029
) (#11070)
Documentation
- [
flake8-bugbear
] Document explicitly disabling strict zip (B905
) (#11040) - [
flake8-type-checking
] Mentionlint.typing-modules
inTCH001
,TCH002
, andTCH003
(#11144) - [
isort
] Improve documentation around customisort
sections (#11050) - [
pylint
] Fix documentation oversight forinvalid-X-returns
(#11094)
Performance
- Use
matchit
to resolve per-file settings (#11111)