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
N803for 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:alpineDocker image is now based on Alpine 3.23 (up from 3.21). -
The
ruff:debianandruff:debian-slimDocker 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:
blocking-http-call-httpx-in-async-function(ASYNC212)blocking-path-method-in-async-function(ASYNC240)blocking-input-in-async-function(ASYNC250)map-without-explicit-strict(B912)if-exp-instead-of-or-operator(FURB110)single-item-membership-test(FURB171)missing-maxsplit-arg(PLC0207)unnecessary-lambda(PLW0108)unnecessary-empty-iterable-within-deque-call(RUF037)in-empty-collection(RUF060)legacy-form-pytest-raises(RUF061)non-octal-permissions(RUF064)invalid-rule-code(RUF102)invalid-suppression-comment(RUF103)unmatched-suppression-comment(RUF104)replace-str-enum(UP042)
The following behaviors have been stabilized:
- The
--output-formatflag is now respected when running Ruff in--watchmode, and thefulloutput 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 considerstyping.Optionalwhen searching for duplicate union members.split-static-string(SIM905) now offers an autofix when themaxsplitargument is provided, even without asepargument.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
exceptclauses 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
ascaptures inmatchstatements (#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
-
Apply formatting to Markdown code blocks (#22470, #22990, #22996)
See the documentation for more details.
Bug fixes
- Fix suppression indentation matching (#22903)
Rule changes
- Customize where the
fix_titlesub-diagnostic appears (#23044) - [
FastAPI] Add sub-diagnostic explaining why a fix was unavailable (FAST002) (#22565) - [
flake8-annotations] Don't suggestNoReturnfor functions raisingNotImplementedError(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 addabc.ABCif 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
didOpeninstead of.ipynbfile extension (#22810)
CLI
- Add
--colorCLI option to force colored output (#22806)
Documentation
- Document
-stdin convention in CLI help text (#22817) - [
refurb] Change example tore.searchwith^anchor (FURB167) (#22984) - Fix link to Sphinx code block directives (#23041)
- [
pydocstyle] Clarify which quote styles are allowed (D300) (#22825) - [
flake8-bugbear] Improve docs forno-explicit-stacklevel(B028) (#22538)
Other changes
- Update MSRV to 1.91 (#22874)
Contributors
- @danparizher
- @chirizxc
- @amyreese
- @Jkhall81
- @cwkang1998
- @manzt
- @11happy
- @hugovk
- @caiquejjx
- @ntBre
- @akawd
- @konstin
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 | shInstall 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"