This release includes a variety of improvements to the Ruff formatter, removing several known and unintentional deviations from Black.
- Avoid space around pow for
None
,True
andFalse
(#8189) - Avoid sorting all paths in the format command (#8181)
- Insert necessary blank line between class and leading comments (#8224)
- Avoid introducing new parentheses in annotated assignments (#8233)
- Refine the warnings about incompatible linter options (#8196)
- Add test and basic implementation for formatter preview mode (#8044)
- Refine warning about incompatible
isort
settings (#8192) - Only omit optional parentheses for starting or ending with parentheses (#8238)
- Use source type to determine parser mode for formatting (#8205)
- Don't warn about magic trailing comma when
isort.force-single-line
is true (#8244) - Use
SourceKind::diff
for formatter (#8240) - Fix
fmt:off
with trailing child comment (#8234) - Formatter parentheses support for
IpyEscapeCommand
(#8207)
- [
pylint
] Add buffer methods tobad-dunder-method-name
(PLW3201
) exclusions (#8190) - Match rule prefixes from
external
codes setting inunused-noqa
(#8177) - Use
line-length
setting for isort in lieu ofpycodestyle.max-line-length
(#8235) - Update fix for
unnecessary-paren-on-raise-exception
to unsafe for unknown types (#8231) - Correct quick fix message for
W605
(#8255)
- Fix typo in max-doc-length documentation (#8201)
- Improve documentation around linter-formatter conflicts (#8257)
- Fix link to error suppression documentation in
unused-noqa
(#8172) - Add
external
option tounused-noqa
documentation (#8171) - Add title attribute to icons (#8060)
- Clarify unsafe case in RSE102 (#8256)
- Fix skipping formatting examples (#8210)
- docs: fix name of
magic-trailing-comma
option in README (#8200) - Add note about scope of rule changing in versioning policy (#8169)
- Document: Fix default lint rules (#8218)
- Fix a wrong setting in configuration.md (#8186)
- Fix misspelled TOML headers in the tutorial (#8209)
This release includes the Beta version of the Ruff formatter — an extremely fast, Black-compatible Python formatter.
Try it today with ruff format
! Check out the blog post and read the docs.
- [
pylint
] Implementnon-ascii-module-import
(C2403
) (#8056) - [
pylint
] implementnon-ascii-name
(C2401
) (#8038) - [
pylint
] Implement unnecessary-lambda (W0108) (#7953) - [
refurb
] Implementread-whole-file
(FURB101
) (#7682) - Add fix for
E223
,E224
, andE242
(#8143) - Add fix for
E225
,E226
,E227
, andE228
(#8136) - Add fix for
E252
(#8142) - Add fix for
E261
(#8114) - Add fix for
E273
andE274
(#8144) - Add fix for
E275
(#8133) - Update
SIM401
to catch ternary operations (#7415) - Update
E721
to allowis
andis
not for direct type comparisons (#7905)
- Add
backports.strenum
todeprecated-imports
(#8113) - Update
SIM112
to ignorehttps_proxy
,http_proxy
, andno_proxy
(#8140) - Update fix for
literal-membership
(PLR6201
) to be unsafe (#8097) - Update fix for
mutable-argument-defaults
(B006
) to be unsafe (#8108)
- Change
line-ending
default toauto
(#8057) - Respect parenthesized generators in
has_own_parentheses
(#8100) - Add caching to formatter (#8089)
- Remove
--line-length
option fromformat
command (#8131) - Add formatter to
line-length
documentation (#8150) - Warn about incompatible formatter options (#8088)
- Fix range of unparenthesized tuple subject in match statement (#8101)
- Remove experimental formatter warning (#8148)
- Don't move type param opening parenthesis comment (#8163)
- Update versions in format benchmark script (#8110)
- Avoid loading files for cached format results (#8134)
- Show the
ruff format
command in help menus (#8167) - Add
ruff version
command with long version display (#8034)
- New
pycodestyle.max-line-length
option (#8039)
- Detect
sys.version_info
slices inoutdated-version-block
(#8112) - Avoid if-else simplification for
TYPE_CHECKING
blocks (#8072) - Avoid false-positive print separator diagnostic with starred argument (#8079)
- Fix message for
too-many-arguments
lint (#8092) - Fix
extend-unsafe-fixes
andextend-safe-fixes
example (#8139) - Add links to
flake8-import-conventions
options (#8115) - Rework the documentation to incorporate the Ruff formatter (#7732)
- Fix
Options
JSON schema description (#8081) - Fix typo (
pytext
->pytest
) (#8117) - Improve
magic-value-comparison
example in docs (#8111)
- Add unsafe fix for
escape-sequence-in-docstring
(D301
) (#7970)
- Respect
#(deprecated)
attribute in configuration options (#8035) - Add
[format|lint].exclude
options (#8000) - Respect
tab-size
setting in formatter (#8006) - Add
lint.preview
(#8002)
- [
pylint
] Implementliteral-membership
(PLR6201
) (#7973) - [
pylint
] Implementtoo-many-boolean-expressions
(PLR0916
) (#7975) - [
pylint
] Implementmisplaced-bare-raise
(E0704
) (#7961) - [
pylint
] Implementglobal-at-module-level
(W0604
) (#8058) - [
pylint
] Implementunspecified-encoding
(PLW1514
) (#7939) - Add fix for
triple-single-quotes
(D300
) (#7967)
- New code style badge for
ruff format
(#7878) - Fix comments outside expression parentheses (#7873)
- Add
--target-version
toruff format
(#8055) - Skip over parentheses when detecting
in
keyword (#8054) - Add
--diff
option toruff format
(#7937) - Insert newline after nested function or class statements (#7946)
- Use
pass
over ellipsis in non-function/class contexts (#8049)
- Lazily evaluate all PEP 695 type alias values (#8033)
- Avoid failed assertion when showing fixes from stdin (#8029)
- Avoid flagging HTTP and HTTPS literals in urllib-open (#8046)
- Avoid flagging
bad-dunder-method-name
for_
(#8015) - Remove Python 2-only methods from
URLOpen
audit (#8047) - Use set bracket replacement for
iteration-over-set
to preserve whitespace and comments (#8001)
- Update tutorial to match revised Ruff defaults (#8066)
- Update rule
B005
docs (#8028) - Update GitHub actions example in docs to use
--output-format
(#8014) - Document
lint.preview
andformat.preview
(#8032) - Clarify that new rules should be added to
RuleGroup::Preview
. (#7989)
This is the first release which uses the CHANGELOG
file. See GitHub Releases for prior changelog entries.
Read Ruff's new versioning policy.
- Unsafe fixes are no longer displayed or applied without opt-in (#7769)
- Drop formatting specific rules from the default set (#7900)
- The deprecated
format
setting has been removed (#7984)- The
format
setting cannot be used to configure the output format, useoutput-format
instead - The
RUFF_FORMAT
environment variable is ignored, useRUFF_OUTPUT_FORMAT
instead - The
--format
option has been removed fromruff check
, use--output-format
instead
- The
- Extend
reimplemented-starmap
(FURB140
) to catch calls with a single and starred argument (#7768) - Improve cases covered by
RUF015
(#7848) - Update
SIM15
to allowopen
followed byclose
(#7916) - Respect
msgspec.Struct
default-copy semantics inRUF012
(#7786) - Add
sqlalchemy
methods to `flake8-boolean-trap`` exclusion list (#7874) - Add fix for
PLR1714
(#7910) - Add fix for
PIE804
(#7884) - Add fix for
PLC0208
(#7887) - Add fix for
PYI055
(#7886) - Update
non-pep695-type-alias
to require--unsafe-fixes
outside of stub files (#7836) - Improve fix message for
UP018
(#7913) - Update
PLW3201
to supportEnum
sunder names (#7987)
- Only show warnings for empty preview selectors when enabling rules (#7842)
- Add
unnecessary-key-check
to simplifykey in dct and dct[key]
todct.get(key)
(#7895) - Add
assignment-in-assert
to prevent walrus expressions in assert statements (#7856) - [
refurb
] Addsingle-item-membership-test
(FURB171
) (#7815) - [
pylint
] Addand-or-ternary
(R1706
) (#7811)
New rules are added in preview.
- Add
unsafe-fixes
setting (#7769) - Add
extend-safe-fixes
andextend-unsafe-fixes
for promoting and demoting fixes (#7841)
- Added
--unsafe-fixes
option for opt-in to display and apply unsafe fixes (#7769) - Fix use of deprecated
--format
option in warning (#7837) - Show changed files when running under
--check
(#7788) - Write summary messages to stderr when fixing via stdin instead of omitting them (#7838)
- Update fix summary message in
check --diff
to include unsafe fix hints (#7790) - Add notebook
cell
field to JSON output format (#7664) - Rename applicability levels to
Safe
,Unsafe
, andDisplay
(#7843)
- Fix bug where f-strings were allowed in match pattern literal (#7857)
- Fix
SIM110
with a yield in the condition (#7801) - Preserve trailing comments in
C414
fixes (#7775) - Check sequence type before triggering
unnecessary-enumerate
len
suggestion (#7781) - Use correct start location for class/function clause header (#7802)
- Fix incorrect fixes for
SIM101
(#7798) - Format comment before parameter default correctly (#7870)
- Fix
E251
false positive inside f-strings (#7894) - Allow bindings to be created and referenced within annotations (#7885)
- Show per-cell diffs when analyzing notebooks over
stdin
(#7789) - Avoid curly brace escape in f-string format spec (#7780)
- Fix lexing single-quoted f-string with multi-line format spec (#7787)
- Consider nursery rules to be in-preview for
ruff rule
(#7812) - Report precise location for invalid conversion flag (#7809)
- Visit pattern match guard as a boolean test (#7911)
- Respect
--unfixable
inISC
rules (#7917) - Fix edge case with
PIE804
(#7922) - Show custom message in
PTH118
forPath.joinpath
with starred arguments (#7852) - Fix false negative in
outdated-version-block
when using greater than comparisons (#7920) - Avoid converting f-strings within Django
gettext
calls (#7898) - Fix false positive in
PLR6301
(#7933) - Treat type aliases as typing-only expressions e.g. resolves false positive in
TCH004
(#7968) - Resolve
cache-dir
relative to project root (#7962) - Respect subscripted base classes in type-checking rules e.g. resolves false positive in
TCH003
(#7954) - Fix JSON schema limit for
line-length
(#7883) - Fix commented-out
coalesce
keyword (#7876)
- Document
reimplemented-starmap
performance effects (#7846) - Default to following the system dark/light mode (#7888)
- Add documentation for fixes (#7901)
- Fix typo in docs of
PLR6301
(#7831) - Update
UP038
docs to note that it results in slower code (#7872) - crlf -> cr-lf (#7766)
- Add an example of an unsafe fix (#7924)
- Fix documented examples for
unnecessary-subscript-reversal
(#7774) - Correct error in tuple example in ruff formatter docs (#7822)
- Add versioning policy to documentation (#7923)
- Fix invalid code in
FURB177
example (#7832)
- Less scary
ruff format
message (#7867) - Remove spaces from import statements (#7859)
- Formatter quoting for f-strings with triple quotes (#7826)
- Update
ruff_python_formatter
generate.py comment (#7850) - Document one-call chaining deviation (#7767)
- Allow f-string modifications in line-shrinking cases (#7818)
- Add trailing comment deviation to README (#7827)
- Add trailing zero between dot and exponential (#7956)
- Force parentheses for power operations in unary expressions (#7955)
- Fix playground
Quick Fix
action (#7824)