Skip to content

Releases: astral-sh/ruff

0.5.0

27 Jun 15:42
244b923
Compare
Choose a tag to compare

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:

Remapped rules

The following rules have been remapped to new rule codes:

Stabilization

The following rules have been stabilized and are no longer in preview:

The following behaviors have been stabilized:

Removals

The following deprecated settings have been removed:

  • output-format=text; use output-format=concise or output-format=full
  • tab-size; use indent-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>; use ruff check <path>
  • ruff --clean; use ruff clean
  • ruff --generate-shell-completion; use ruff generate-shell-completion

Preview features

  • [ruff] Add assert-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 if gettext is imported using an alias (RUF027) (#12025)
  • [numpy] Update trapz and in1d 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] Avoid E203 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

Read more

v0.4.10

20 Jun 17:46
b54922f
Compare
Choose a tag to compare

Changes

Parser

  • Implement re-lexing logic for better error recovery (#11845)

Rule changes

  • [flake8-copyright] Update CPY001 to check the first 4096 bytes instead of 1024 (#11927)
  • [pycodestyle] Update E999 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

14 Jun 15:21
4f49e91
Compare
Choose a tag to compare

Changes

Preview features

  • [pylint] Implement consider-dict-items (C0206) (#11688)
  • [refurb] Implement repeated-global (FURB154) (#11187)

Rule changes

  • [pycodestyle] Adapt fix for E203 to work identical to ruff 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 in B909 when checking large loop blocks (#11772)
  • [refurb] Fix misbehavior of operator.itemgetter when getter param is a tuple (FURB118) (#11774)

Contributors

v0.4.8

05 Jun 15:36
a8cf709
Compare
Choose a tag to compare

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] Implement return-in-generator (B901) (#11644)
  • [flake8-pyi] Implement PYI063 (#11699)
  • [pygrep_hooks] Check blanket ignores via file-level pragmas (PGH004) (#11540)

Rule changes

  • [pyupgrade] Update UP035 for Python 3.13 and the latest version of typing_extensions (#11693)
  • [numpy] Update NPY001 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 fixing UP032 (#11696)
  • [flake8-simplify] Simplify double negatives in SIM103 (#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

31 May 21:25
1ad5f9c
Compare
Choose a tag to compare

Changes

Preview features

  • [flake8-pyi] Implement PYI064 (#11325)
  • [flake8-pyi] Implement PYI066 (#11541)
  • [flake8-pyi] Implement PYI057 (#11486)
  • [pyflakes] Enable F822 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 in C400 (#11607)
  • Mark repeated-isinstance-calls as unsafe on Python 3.10 and later (#11622)

Contributors

v0.4.6

29 May 02:06
49a5a9c
Compare
Choose a tag to compare

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 to if .. else for C901 (#11565)
  • Consider match-case statements for C901, PLR0912, and PLR0915 (#11521)
  • Remove empty strings when converting to f-string (UP032) (#11524)
  • [flake8-bandit] request-without-timeout should warn for requests.request (#11548)
  • [flake8-self] Ignore sunder accesses in flake8-self rules (#11546)
  • [pyupgrade] Lint for TypeAliasType 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 in logging-warn (G010) (#11514)
  • [refurb] Avoid recommending operator.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

23 May 02:14
550aa87
Compare
Choose a tag to compare

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] Reword future-rewritable-type-annotation (FA100) message (#11381)
  • [isort] Expanded the set of standard-library modules to include _string, etc. (#11374)
  • [pycodestyle] Consider soft keywords for E27 rules (#11446)
  • [pyflakes] Recommend adding unused import bindings to __all__ (#11314)
  • [pyflakes] Update documentation and deprecate ignore_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 for ruff config (#11438)

Bug fixes

  • Avoid PLE0237 for property with setter (#11377)
  • Avoid TCH005 for if stmt with elif/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 in unnecessary-dict-kwargs (#11372)
  • [pylint] Ignore __slots__ with dynamic values (#11488)
  • [pylint] Remove try body from branch counting (#11487)
  • [refurb] Respect operator precedence in FURB110 (#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 for E713 and E714 (#11483)
  • [pyflakes] Update docs to describe WAI behavior (F541) (#11362)
  • [pylint] Clearly indicate what is counted as a branch (#11423)

Contributors

v0.4.4

09 May 17:24
3e8878a
Compare
Choose a tag to compare

Changes

Preview features

  • [pycodestyle] Ignore end-of-line comments when determining blank line rules (#11342)
  • [pylint] Detect pathlib.Path.open calls in unspecified-encoding (PLW1514) (#11288)
  • [flake8-pyi] Implement PYI059 (generic-not-last-base-class) (#11233)
  • [flake8-pyi] Implement PYI062 (duplicate-literal-member) (#11269)

Rule changes

  • [flake8-boolean-trap] Allow passing booleans as positional-only arguments in code such as set(True) (#11287)
  • [flake8-bugbear] Ignore enum classes in cached-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] Consider with statements for too-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

03 May 23:14
1e91a09
Compare
Choose a tag to compare

Changes

Enhancements

  • Add support for PEP 696 syntax (#11120)

Preview features

  • [refurb] Use function range for reimplemented-operator diagnostics (#11271)
  • [refurb] Ignore methods in reimplemented-operator (FURB118) (#11270)
  • [refurb] Implement fstring-number-format (FURB116) (#10921)
  • [ruff] Implement redirected-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 enforcing B024 (#11210)
  • [flake8-logging] Include inline instantiations when detecting loggers (#11154)
  • [pylint] Also emit PLR0206 for properties with variadic parameters (#11200)
  • [ruff] Detect duplicate codes as part of unused-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 respects per-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] Prioritize redefined-while-unused over unused-import (#11173)
  • [ruff] Respect async expressions in comprehension bodies (#11219)
  • [pygrep_hooks] Fix blanket-noqa panic when last line has noqa with no newline (PGH004) (#11108)
  • [perflint] Ignore list-copy recommendations for async for loops (#11250)
  • [pyflakes] Improve invalid-print-syntax documentation (#11171)

Performance

  • Avoid allocations for isort module names (#11251)
  • Build a separate ARM wheel for macOS (#11149)

Windows

  • Increase the minimum requirement to Windows 10.

Contributors

v0.4.2

25 Apr 17:55
77c93fd
Compare
Choose a tag to compare

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 over sorted() (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 in BLE001 (#11131)
  • [flake8-pyi] Allow simple assignments to None in enum class scopes (PYI026) (#11128)
  • [flake8-simplify] Avoid raising SIM911 for non-zip attribute calls (#11126)
  • [refurb] Avoid operator.itemgetter suggestion for single-item tuple (#11095)
  • [ruff] Respect per-file-ignores for RUF100 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] Mention lint.typing-modules in TCH001, TCH002, and TCH003 (#11144)
  • [isort] Improve documentation around custom isort sections (#11050)
  • [pylint] Fix documentation oversight for invalid-X-returns (#11094)

Performance

  • Use matchit to resolve per-file settings (#11111)

Contributors