Repository navigation
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.fixAllandsource.organizeImportssource 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 triggerE3rules ondefs 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-boolandinvalid-str-return-type(#11008) - [
ruff] New ruleunused-async(RUF029) to detect unneededasynckeywords on functions (#9966)
Rule changes
- [
flake8-bandit] Allowurllib.request.urlopencalls with staticRequestargument (S310) (#10964) - [
flake8-bugbear] Treatraise NotImplemented-only bodies as stub functions (B006) (#10990) - [
flake8-slots] Respect same-fileEnumsubclasses (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_FILEenvironment variable support (#10992)
Bug fixes
- Avoid
non-augmented-assignmentfor reversed, non-commutative operators (PLR6104) (#10909) - Limit commutative non-augmented-assignments to primitive data types (
PLR6104) (#10912) - Respect
per-file-ignoresforRUF100on blanket# noqa(#10908) - Consider
ifexpression for parenthesized with items parsing (#11010) - Consider binary expr for parenthesized with items parsing (#11012)
- Reset
FOR_TARGETcontext for all kinds of parentheses (#11009)