github astral-sh/ruff 0.15.0

12 hours ago

Release Notes

Released on 2026-02-03.

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

Breaking changes

  • Ruff now formats your code according to the 2026 style guide. See the formatter section below or in the blog post for a detailed list of changes.

  • The linter now supports block suppression comments. For example, to suppress N803 for all parameters in this function:

    # ruff: disable[N803]
    def foo(
        legacyArg1,
        legacyArg2,
        legacyArg3,
        legacyArg4,
    ): ...
    # ruff: enable[N803]

    See the documentation for more details.

  • The ruff:alpine Docker image is now based on Alpine 3.23 (up from 3.21).

  • The ruff:debian and ruff:debian-slim Docker images are now based on Debian 13 "Trixie" instead of Debian 12 "Bookworm."

  • Binaries for the ppc64 (64-bit big-endian PowerPC) architecture are no longer included in our releases. It should still be possible to build Ruff manually for this platform, if needed.

  • Ruff now resolves all extended configuration files before falling back on a default Python version.

Stabilization

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

The following behaviors have been stabilized:

  • The --output-format flag is now respected when running Ruff in --watch mode, and the full output format is now used by default, matching the regular CLI output.
  • builtin-attribute-shadowing (A003) now detects the use of shadowed built-in names in additional contexts like decorators, default arguments, and other attribute definitions.
  • duplicate-union-member (PYI016) now considers typing.Optional when searching for duplicate union members.
  • split-static-string (SIM905) now offers an autofix when the maxsplit argument is provided, even without a sep argument.
  • dict-get-with-none-default (SIM910) now applies to more types of key expressions.
  • super-call-with-parameters (UP008) now has a safe fix when it will not delete comments.
  • unnecessary-default-type-args (UP043) now applies to stub (.pyi) files on Python versions before 3.13.

Formatter

This release introduces the new 2026 style guide, with the following changes:

  • Lambda parameters are now kept on the same line and lambda bodies will be parenthesized to let them break across multiple lines (#21385)
  • Parentheses around tuples of exceptions in except clauses will now be removed on Python 3.14 and later (#20768)
  • A single empty line is now permitted at the beginning of function bodies (#21110)
  • Parentheses are avoided for long as captures in match statements (#21176)
  • Extra spaces between escaped quotes and ending triple quotes can now be omitted (#17216)
  • Blank lines are now enforced before classes with decorators in stub files (#18888)

Preview features

Bug fixes

  • Fix suppression indentation matching (#22903)

Rule changes

  • Customize where the fix_title sub-diagnostic appears (#23044)
  • [FastAPI] Add sub-diagnostic explaining why a fix was unavailable (FAST002) (#22565)
  • [flake8-annotations] Don't suggest NoReturn for functions raising NotImplementedError (ANN201, ANN202, ANN205, ANN206) (#21311)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP017) (#22873)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP020) (#22872)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP033) (#22871)
  • [refurb] Do not add abc.ABC if already present (FURB180) (#22234)
  • [refurb] Make fix unsafe if it deletes comments (FURB110) (#22768)
  • [ruff] Add sub-diagnostics with permissions (RUF064) (#22972)

Server

  • Identify notebooks by LSP didOpen instead of .ipynb file extension (#22810)

CLI

  • Add --color CLI option to force colored output (#22806)

Documentation

  • Document - stdin convention in CLI help text (#22817)
  • [refurb] Change example to re.search with ^ anchor (FURB167) (#22984)
  • Fix link to Sphinx code block directives (#23041)
  • [pydocstyle] Clarify which quote styles are allowed (D300) (#22825)
  • [flake8-bugbear] Improve docs for no-explicit-stacklevel (B028) (#22538)

Other changes

  • Update MSRV to 1.91 (#22874)

Contributors

Install ruff 0.15.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.15.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.15.0/ruff-installer.ps1 | iex"

Download ruff 0.15.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-riscv64gc-unknown-linux-gnu.tar.gz RISCV 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.