github astral-sh/ruff 0.9.0

9 hours ago

Release Notes

Check out the blog post for a migration guide and overview of the changes!

Breaking changes

Ruff now formats your code according to the 2025 style guide. As a result, your code might now get formatted differently. See the formatter section for a detailed list of changes.

This release doesn’t remove or remap any existing stable rules.

Stabilization

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

The following behaviors have been stabilized:

The following fixes or improvements to fixes have been stabilized:

Formatter

This release introduces the new 2025 stable style (#13371), stabilizing the following changes:

  • Format expressions in f-string elements (#7594)
  • Alternate quotes for strings inside f-strings (#13860)
  • Preserve the casing of hex codes in f-string debug expressions (#14766)
  • Choose the quote style for each string literal in an implicitly concatenated f-string rather than for the entire string (#13539)
  • Automatically join an implicitly concatenated string into a single string literal if it fits on a single line (#9457)
  • Remove the ISC001 incompatibility warning (#15123)
  • Prefer parenthesizing the assert message over breaking the assertion expression (#9457)
  • Automatically parenthesize over-long if guards in match case clauses (#13513)
  • More consistent formatting for match case patterns (#6933)
  • Avoid unnecessary parentheses around return type annotations (#13381)
  • Keep the opening parentheses on the same line as the if keyword for comprehensions where the condition has a leading comment (#12282)
  • More consistent formatting for with statements with a single context manager for Python 3.8 or older (#10276)
  • Correctly calculate the line-width for code blocks in docstrings when using max-doc-code-line-length = "dynamic" (#13523)

Preview features

  • [flake8-bugbear] Implement class-as-data-structure (B903) (#9601)
  • [flake8-type-checking] Apply quoted-type-alias more eagerly in TYPE_CHECKING blocks and ignore it in stubs (TC008) (#15180)
  • [pylint] Ignore eq-without-hash in stub files (PLW1641) (#15310)
  • [pyupgrade] Split UP007 into two individual rules: UP007 for Union and UP045 for Optional (UP007, UP045) (#15313)
  • [ruff] New rule that detects classes that are both an enum and a dataclass (RUF049) (#15299)
  • [ruff] Recode RUF025 to RUF037 (RUF037) (#15258)

Rule changes

Server

  • Improve the observability by removing the need for the "trace" value to turn on or off logging. The server logging is solely controlled using the logLevel server setting
    which defaults to info. This addresses the issue where users were notified about an error and told to consult the log, but it didn’t contain any messages. (#15232)
  • Ignore diagnostics from other sources for code action requests (#15373)

CLI

  • Improve the error message for --config key=value when the key is for a table and it’s a simple value

Bug fixes

  • [eradicate] Ignore metadata blocks directly followed by normal blocks (ERA001) (#15330)
  • [flake8-django] Recognize other magic methods (DJ012) (#15365)
  • [pycodestyle] Avoid false positives related to type aliases (E252) (#15356)
  • [pydocstyle] Avoid treating newline-separated sections as sub-sections (D405) (#15311)
  • [pyflakes] Remove call when removing final argument from format (F523) (#15309)
  • [refurb] Mark fix as unsafe when the right-hand side is a string (FURB171) (#15273)
  • [ruff] Treat ) as a regex metacharacter (RUF043, RUF055) (#15318)
  • [ruff] Parenthesize the int-call argument when removing the int call would change semantics (RUF046) (#15277)

Contributors

Install ruff 0.9.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-installer.sh | sh

Install prebuilt binaries via powershell script

powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-installer.ps1 | iex"

Download ruff 0.9.0

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

Don't miss a new ruff release

NewReleases is sending notifications on new releases.