Releases: astral-sh/ruff
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)
Contributors
v0.4.1
Changes
Preview features
- [
pylint
] Implementinvalid-hash-returned
(PLE0309
) (#10961) - [
pylint
] Implementinvalid-index-returned
(PLE0305
) (#10962)
Bug fixes
- [
pylint
] AllowNoReturn
-like functions for__str__
,__len__
, etc. (PLE0307
) (#11017) - Parser: Use empty range when there's "gap" in token source (#11032)
- [
ruff
] Ignore stub functions inunused-async
(RUF029
) (#11026) - Parser: Expect indented case block instead of match stmt (#11033)
Contributors
v0.4.0
Changes
A new, hand-written parser
Ruff's new parser is >2x faster, which translates to a 20-40% speedup for all linting and formatting invocations. There's a lot to say about this exciting change, so check out the blog post for more details!
See #10036 for implementation details.
A new language server in Rust
With this release, we also want to highlight our new language server. ruff server
is a Rust-powered language server that comes built-in with Ruff. It can be used with any editor that supports the Language Server Protocol (LSP). It uses a multi-threaded, lock-free architecture inspired by rust-analyzer
and it will open the door for a lot of exciting features. It’s also faster than our previous Python-based language server -- but you probably guessed that already.
ruff server
is only in alpha, but it has a lot of features that you can try out today:
- Lints Python files automatically and shows quick-fixes when available
- Formats Python files, with support for range formatting
- Comes with commands for quickly performing actions:
ruff.applyAutofix
,ruff.applyFormat
, andruff.applyOrganizeImports
- Supports
source.fixAll
andsource.organizeImports
source actions - Automatically reloads your project configuration when you change it
To setup ruff server
with your editor, refer to the README.md.
Preview features
- [
pycodestyle
] Do not triggerE3
rules ondef
s following a function/method with a dummy body (#10704) - [
pylint
] Implementinvalid-bytes-returned
(E0308
) (#10959) - [
pylint
] Implementinvalid-length-returned
(E0303
) (#10963) - [
pylint
] Implementself-cls-assignment
(W0642
) (#9267) - [
pylint
] Omit stubs frominvalid-bool
andinvalid-str-return-type
(#11008) - [
ruff
] New ruleunused-async
(RUF029
) to detect unneededasync
keywords on functions (#9966)
Rule changes
- [
flake8-bandit
] Allowurllib.request.urlopen
calls with staticRequest
argument (S310
) (#10964) - [
flake8-bugbear
] Treatraise NotImplemented
-only bodies as stub functions (B006
) (#10990) - [
flake8-slots
] Respect same-fileEnum
subclasses (SLOT000
) (#11006) - [
pylint
] Support inverted comparisons (PLR1730
) (#10920)
Linter
- Improve handling of builtin symbols in linter rules (#10919)
- Improve display of rules in
--show-settings
(#11003) - Improve inference capabilities of the
BuiltinTypeChecker
(#10976) - Resolve classes and functions relative to script name (#10965)
- Improve performance of
RuleTable::any_enabled
(#10971)
Server
This section is devoted to updates for our new language server, written in Rust.
- Enable ruff-specific source actions (#10916)
- Refreshes diagnostics for open files when file configuration is changed (#10988)
- Important errors are now shown as popups (#10951)
- Introduce settings for directly configuring the linter and formatter (#10984)
- Resolve configuration for each document individually (#10950)
- Write a setup guide for Neovim (#10987)
Configuration
- Add
RUFF_OUTPUT_FILE
environment variable support (#10992)
Bug fixes
- Avoid
non-augmented-assignment
for reversed, non-commutative operators (PLR6104
) (#10909) - Limit commutative non-augmented-assignments to primitive data types (
PLR6104
) (#10912) - Respect
per-file-ignores
forRUF100
on blanket# noqa
(#10908) - Consider
if
expression for parenthesized with items parsing (#11010) - Consider binary expr for parenthesized with items parsing (#11012)
- Reset
FOR_TARGET
context for all kinds of parentheses (#11009)