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)