Releases: astral-sh/ruff
v0.3.2
Changes
Preview features
- Improve single-
with
item formatting for Python 3.8 or older (#10276)
Rule changes
- [
pyupgrade
] Allow fixes for f-string rule regardless of line length (UP032
) (#10263) - [
pycodestyle
] Include actual conditions in E712 diagnostics (#10254)
Bug fixes
- Fix trailing kwargs end of line comment after slash (#10297)
- Fix unstable
with
items formatting (#10274) - Avoid repeating function calls in f-string conversions (#10265)
- Fix E203 false positive for slices in format strings (#10280)
- Fix incorrect
Parameter
range for*args
and**kwargs
(#10283) - Treat
typing.Annotated
subscripts as type definitions (#10285)
Contributors
v0.3.1
Changes
Preview features
- [
pycodestyle
] Fix E301 not triggering on decorated methods. (#10117) - [
pycodestyle
] Respectisort
settings in blank line rules (E3*
) (#10096) - [
pycodestyle
] Make blank lines in typing stub files optional (E3*
) (#10098) - [
pylint
] Implementsingledispatch-method
(E1519
) (#10140) - [
pylint
] Implementuseless-exception-statement
(W0133
) (#10176)
Rule changes
- [
flake8-debugger
] Check for use ofdebugpy
andptvsd
debug modules (#10177) (#10194) - [
pyupgrade
] Generate diagnostic for all valid f-string conversions regardless of line length (UP032
) (#10238) - [
pep8_naming
] Add fixes forN804
andN805
(#10215)
CLI
- Colorize the output of
ruff format --diff
(#10110) - Make
--config
and--isolated
global flags (#10150) - Correctly expand tildes and environment variables in paths passed to
--config
(#10219)
Configuration
- Accept a PEP 440 version specifier for
required-version
(#10216) - Implement isort's
default-section
setting (#10149)
Bug fixes
- Remove trailing space from
CapWords
message (#10220) - Respect external codes in file-level exemptions (#10203)
- [
flake8-raise
] Avoid false-positives for parens-on-raise withfuture.exception()
(RSE102
) (#10206) - [
pylint
] Add fix for unary expressions inPLC2801
(#9587) - [
ruff
] Fix RUF028 not allowing# fmt: skip
on match cases (#10178)
Contributors
v0.3.0
This release introduces the new Ruff formatter 2024.2 style and adds a new lint rule to
detect invalid formatter suppression comments.
Changes
Preview features
- [
flake8-bandit
] Remove suspicious-lxml-import (S410
) (#10154) - [
pycodestyle
] Allowos.environ
modifications between imports (E402
) (#10066) - [
pycodestyle
] Don't warn about a single whitespace character before a comma in a tuple (E203
) (#10094)
Rule changes
- [
eradicate
] Detect commented outcase
statements (ERA001
) (#10055) - [
eradicate
] Detect single-line code fortry:
,except:
, etc. (ERA001
) (#10057) - [
flake8-boolean-trap
] Allow boolean positionals in__post_init__
(#10027) - [
flake8-copyright
] Allow © in copyright notices (#10065) - [
isort
]: Use one blank line after imports in typing stub files (#9971) - [
pylint
] New Ruledict-iter-missing-items
(PLE1141
) (#9845) - [
pylint
] Ignoresys.version
andsys.platform
(PLR1714
) (#10054) - [
pyupgrade
] Detect literals with unary operators (UP018
) (#10060) - [
ruff
] Expand rule forlist(iterable).pop(0)
idiom (RUF015
) (#10148)
Formatter
This release introduces the Ruff 2024.2 style, stabilizing the following changes:
- Prefer splitting the assignment's value over the target or type annotation (#8943)
- Remove blank lines before class docstrings (#9154)
- Wrap multiple context managers in
with
parentheses when targeting Python 3.9 or newer (#9222) - Add a blank line after nested classes with a dummy body (
...
) in typing stub files (#9155) - Reduce vertical spacing for classes and functions with a dummy (
...
) body (#7440, #9240) - Add a blank line after the module docstring (#8283)
- Parenthesize long type hints in assignments (#9210)
- Preserve indent for single multiline-string call-expressions (#9673)
- Normalize hex escape and unicode escape sequences (#9280)
- Format module docstrings (#9725)
CLI
- Explicitly disallow
extend
as part of a--config
flag (#10135) - Remove
build
from the default exclusion list (#10093) - Deprecate
ruff <path>
,ruff --explain
,ruff --clean
, andruff --generate-shell-completion
in favor ofruff check <path>
,ruff rule
,ruff clean
, andruff generate-shell-completion
(#10169) - Remove the deprecated CLI option
--format
fromruff rule
andruff linter
(#10170)
Bug fixes
- [
flake8-bugbear
] Avoid adding default initializers to stubs (B006
) (#10152) - [
flake8-type-checking
] Respect runtime-required decorators for function signatures (#10091) - [
pycodestyle
] Mark fixes overlapping with a multiline string as unsafe (W293
) (#10049) - [
pydocstyle
] Trim whitespace when removing blank lines after section (D413
) (#10162) - [
pylint
] Delete entire statement, including semicolons (PLR0203
) (#10074) - [
ruff
] Avoid f-string false positives ingettext
calls (RUF027
) (#10118) - Fix
ruff
crashing on PowerPC systems because of too small page size (#10080)
Performance
- Add cold attribute to less likely printer queue branches in the formatter (#10121)
- Skip unnecessary string normalization in the formatter (#10116)
Documentation
- Remove "Beta" Label from formatter documentation (#10144)
line-length
option: fix link topycodestyle.max-line-length
(#10136)
Contributors
v0.2.2
Highlights include:
- Initial support formatting f-strings (in
--preview
). - Support for overriding arbitrary configuration options via the CLI through an expanded
--config
argument (e.g.,--config "lint.isort.combine-as-imports=false"
). - Significant performance improvements in Ruff's lexer, parser, and lint rules.
Changes
Preview features
- Implement minimal f-string formatting (#9642)
- [
pycodestyle
] Add blank line(s) rules (E301
,E302
,E303
,E304
,E305
,E306
) (#9266) - [
refurb
] Implementreadlines_in_for
(FURB129
) (#9880)
Rule changes
- [
ruff
] Ensure closing parentheses for multiline sequences are always on their own line (RUF022
,RUF023
) (#9793) - [
numpy
] Add missing deprecation violations (NPY002
) (#9862) - [
flake8-bandit
] Detectmark_safe
usages in decorators (#9887) - [
ruff
] Expandasyncio-dangling-task
(RUF006
) to includenew_event_loop
(#9976) - [
flake8-pyi
] Ignore 'unused' private type dicts in class scopes (#9952)
Formatter
- Docstring formatting: Preserve tab indentation when using
indent-style=tabs
(#9915) - Disable top-level docstring formatting for notebooks (#9957)
- Stabilize quote-style's
preserve
mode (#9922)
CLI
- Allow arbitrary configuration options to be overridden via the CLI (#9599)
Bug fixes
- Make
show-settings
filters directory-agnostic (#9866) - Respect duplicates when rewriting type aliases (#9905)
- Respect tuple assignments in typing analyzer (#9969)
- Use atomic write when persisting cache (#9981)
- Use non-parenthesized range for
DebugText
(#9953) - [
flake8-simplify
] Avoid false positive withasync
for loops (SIM113
) (#9996) - [
flake8-trio
] Respectasync with
intimeout-without-await
(#9859) - [
perflint
] Catch a wider range of mutations inPERF101
(#9955) - [
pycodestyle
] FixE30X
panics on blank lines with trailing white spaces (#9907) - [
pydocstyle
] Allow usingparameters
as a subsection header (D405
) (#9894) - [
pydocstyle
] Fix blank-line docstring rules for module-level docstrings (#9878) - [
pylint
] Accept 0.0 and 1.0 as common magic values (PLR2004
) (#9964) - [
pylint
] Avoid suggesting set rewrites for non-hashable types (#9956) - [
ruff
] Avoid false negatives with string literals inside of method calls (RUF027
) (#9865) - [
ruff
] Fix panic on with f-string detection (RUF027
) (#9990) - [
ruff
] Ignore builtins when detecting missing f-strings (#9849)
Contributors
v0.2.1
Changes
This release includes support for range formatting (i.e., the ability to format specific lines
within a source file).
Preview features
Formatter
Bug fixes
- Skip empty lines when determining base indentation (#9795)
- Drop
__get__
and__set__
fromunnecessary-dunder-call
(#9791) - Respect generic
Protocol
in ellipsis removal (#9841) - Revert "Use publicly available Apple Silicon runners (#9726)" (#9834)
Performance
- Skip LibCST parsing for standard dedent adjustments (#9769)
- Remove CST-based fixer for
C408
(#9822) - Add our own ignored-names abstractions (#9802)
- Remove CST-based fixers for
C400
,C401
,C410
, andC418
(#9819) - Use
AhoCorasick
to speed up quote match (#9773) - Remove CST-based fixers for
C405
andC409
(#9821) - Add fast-path for comment detection (#9808)
- Invert order of checks in
zero-sleep-call
(#9766) - Short-circuit typing matches based on imports (#9800)
- Run dunder method rule on methods directly (#9815)
- Track top-level module imports in the semantic model (#9775)
- Slight speed-up for lowercase and uppercase identifier checks (#9798)
- Remove LibCST-based fixer for
C403
(#9818)
Documentation
- Update
max-pos-args
example tomax-positional-args
(#9797) - Fixed example code in
weak_cryptographic_key.rs
(#9774) - Fix references to deprecated
ANN
rules in changelog (#9771) - Fix default for
max-positional-args
(#9838)
Contributors
v0.2.0
Check out the blog post for a migration guide and overview of the changes!
Changes
Breaking changes
- The
NURSERY
selector cannot be used anymore - Legacy selection of nursery rules by exact codes is no longer allowed without preview enabled
See also, the "Remapped rules" section which may result in disabled rules.
Deprecations
The following rules are now deprecated:
missing-type-self
(ANN101
)missing-type-cls
(ANN102
)
The following command line options are now deprecated:
--show-source
; use--output-format full
instead--no-show-source
; use--output-format concise
instead--output-format text
; usefull
orconcise
instead
The following settings have moved and the previous name is deprecated:
ruff.allowed-confusables
→ruff.lint.allowed-confusables
ruff.dummy-variable-rgx
→ruff.lint.dummy-variable-rgx
ruff.explicit-preview-rules
→ruff.lint.explicit-preview-rules
ruff.extend-fixable
→ruff.lint.extend-fixable
ruff.extend-ignore
→ruff.lint.extend-ignore
ruff.extend-per-file-ignores
→ruff.lint.extend-per-file-ignores
ruff.extend-safe-fixes
→ruff.lint.extend-safe-fixes
ruff.extend-select
→ruff.lint.extend-select
ruff.extend-unfixable
→ruff.lint.extend-unfixable
ruff.extend-unsafe-fixes
→ruff.lint.extend-unsafe-fixes
ruff.external
→ruff.lint.external
ruff.fixable
→ruff.lint.fixable
ruff.flake8-annotations
→ruff.lint.flake8-annotations
ruff.flake8-bandit
→ruff.lint.flake8-bandit
ruff.flake8-bugbear
→ruff.lint.flake8-bugbear
ruff.flake8-builtins
→ruff.lint.flake8-builtins
ruff.flake8-comprehensions
→ruff.lint.flake8-comprehensions
ruff.flake8-copyright
→ruff.lint.flake8-copyright
ruff.flake8-errmsg
→ruff.lint.flake8-errmsg
ruff.flake8-gettext
→ruff.lint.flake8-gettext
ruff.flake8-implicit-str-concat
→ruff.lint.flake8-implicit-str-concat
ruff.flake8-import-conventions
→ruff.lint.flake8-import-conventions
ruff.flake8-pytest-style
→ruff.lint.flake8-pytest-style
ruff.flake8-quotes
→ruff.lint.flake8-quotes
ruff.flake8-self
→ruff.lint.flake8-self
ruff.flake8-tidy-imports
→ruff.lint.flake8-tidy-imports
ruff.flake8-type-checking
→ruff.lint.flake8-type-checking
ruff.flake8-unused-arguments
→ruff.lint.flake8-unused-arguments
ruff.ignore
→ruff.lint.ignore
ruff.ignore-init-module-imports
→ruff.lint.ignore-init-module-imports
ruff.isort
→ruff.lint.isort
ruff.logger-objects
→ruff.lint.logger-objects
ruff.mccabe
→ruff.lint.mccabe
ruff.pep8-naming
→ruff.lint.pep8-naming
ruff.per-file-ignores
→ruff.lint.per-file-ignores
ruff.pycodestyle
→ruff.lint.pycodestyle
ruff.pydocstyle
→ruff.lint.pydocstyle
ruff.pyflakes
→ruff.lint.pyflakes
ruff.pylint
→ruff.lint.pylint
ruff.pyupgrade
→ruff.lint.pyupgrade
ruff.select
→ruff.lint.select
ruff.task-tags
→ruff.lint.task-tags
ruff.typing-modules
→ruff.lint.typing-modules
ruff.unfixable
→ruff.lint.unfixable
Remapped rules
The following rules have been remapped to new codes:
raise-without-from-inside-except
:TRY200
toB904
suspicious-eval-usage
:PGH001
toS307
logging-warn
:PGH002
toG010
static-key-dict-comprehension
:RUF011
toB035
runtime-string-union
:TCH006
toTCH010
Stabilizations
The following rules have been stabilized and are no longer in preview:
trio-timeout-without-await
(TRIO100
)trio-sync-call
(TRIO105
)trio-async-function-with-timeout
(TRIO109
)trio-unneeded-sleep
(TRIO110
)trio-zero-sleep-call
(TRIO115
)unnecessary-escaped-quote
(Q004
)enumerate-for-loop
(SIM113
)zip-dict-keys-and-values
(SIM911
)timeout-error-alias
(UP041
)flask-debug-true
(S201
)tarfile-unsafe-members
(S202
)ssl-insecure-version
(S502
)ssl-with-bad-defaults
(S503
)ssl-with-no-version
(S504
)weak-cryptographic-key
(S505
)ssh-no-host-key-verification
(S507
)django-raw-sql
(S611
)mako-templates
(S702
)generator-return-from-iter-method
(PYI058
)runtime-string-union
(TCH006
)numpy2-deprecation
(NPY201
)quadratic-list-summation
(RUF017
)assignment-in-assert
(RUF018
)unnecessary-key-check
(RUF019
)never-union
(RUF020
)direct-logger-instantiation
(LOG001
)invalid-get-logger-argument
(LOG002
)exception-without-exc-info
(LOG007
)undocumented-warn
(LOG009
)
Fixes for the following rules have been stabilized and are now available without preview:
triple-single-quotes
(D300
)non-pep604-annotation
(UP007
)- [
dict-get-with-none-default
](https://docs.astral.sh/ruff/rules/dict-get-...
v0.1.15
Changes
Preview features
- Error when
NURSERY
selector is used with--preview
(#9682) - Preserve indentation around multiline strings in formatter (#9637)
- [
flake8-return
] Add fixes for all rules (RET505
,RET506
,RET507
,RET508
) (#9595) - [
flake8-simplify
] Add fix forif-with-same-arms
(SIM114
) (#9591) - [
pycodestyle
] Add fix formultiple-imports-on-one-line
(E401
) (#9518) - [
pylint
] Add fix forcollapsible-else-if
(PLR5501
) (#9594) - [
pylint
] Add fix foruseless-else-on-loop
(PLW0120
) (#9590) - [
pylint
] Implementassigning-non-slot
(E0237
) (#9623) - [
pylint
] Implementpotential-index-error
(PLE0643
) (#9545) - [
pylint
] Implementtoo-many-nested-blocks
(PLR1702
) (#9172) - [
ruff
] Add rule to sort__slots__
and__match_args__
(#9564) - [
ruff
] Detect unnecessarydict
comprehensions for iterables (RUF025
) (#9613) - [
ruff
] Guard against use ofdefault_factory
as a keyword argument (RUF026
) (#9651) - [
ruff
] Implementmutable-fromkeys-value
(RUF024
) (#9597)
CLI
- Enable auto-wrapping of
--help
output (#9633)
Bug fixes
- Avoid rendering display-only rules as fixable (#9649)
- Detect automagic-like assignments in notebooks (#9653)
- Generate custom JSON schema for dynamic setting (#9632)
- [
flake8-no-pep420
] Include global--config
when determining namespace packages (#9603) - [
flake8-pie
] Omit bound tuples passed to.startswith
or.endswith
(#9661) - [
flake8-return
] Avoid panic when fixing inlined else blocks (#9657) - [
flake8-return
] Consider exception suppression in unnecessary assignment (#9673) - [
flake8-return
] TakeNoReturn
annotation into account when analyzing implicit returns (#9636) - [
flake8-simplify
] Support inverted returns inneedless-bool
(SIM103
) (#9619) - [
flake8-type-checking
] Add Pydantic'sBaseConfig
to default-copy list (#9650) - [
flake8-type-checking
] Avoid markingInitVar
as a typing-only annotation (#9688) - [
pycodestyle
] Allowdtype
comparisons intype-comparison
(#9676) - [
pydocstyle
] Re-implementlast-line-after-section
(D413
) (#9654)
Documentation
- [
flake8-pytest-style
] Add fix safety documentation forduplicate-parameterize-test-cases
(#9678) - [
pylint
] Documentliteral-membership
fix safety conditions (#9677) - [
isort
] Fix reference toisort
rule code (#9598)
Contributors
v0.1.14
Changes
Preview features
- [
flake8-bugbear
] Add fix forduplicate-value
(B033
) (#9510) - [
flake8-simplify
] Implementenumerate-for-loop
(SIM113
) (#7777) - [
pygrep_hooks
] Add fix fordeprecated-log-warn
(PGH002
) (#9519) - [
pylint
] Implementimport-private-name
(C2701
) (#5920) - [
refurb
] Implementregex-flag-alias
with fix (FURB167
) (#9516) - [
ruff
] Add rule and fix to sort contents of__all__
(RUF022
) (#9474) - [
tryceratops
] Add fix forerror-instead-of-exception
(TRY400
) (#9520)
Rule changes
- [
flake8-pyi
] FixPYI047
false negatives on PEP-695 type aliases (#9566) - [
flake8-pyi
] FixPYI049
false negatives on call-basedTypedDict
s (#9567) - [
pylint
] Excludeself
andcls
when counting method arguments (PLR0917
) (#9563)
CLI
--show-settings
displays active settings in a far more readable format (#9464)- Add
--extension
support to the formatter (#9483)
Configuration
- Ignore preview status for fixable and unfixable selectors (#9538)
- [
pycodestyle
] Use the configured tab size when expanding indents (#9506)
Bug fixes
- Recursively visit deferred AST nodes (#9541)
- Visit deferred lambdas before type definitions (#9540)
- [
flake8-simplify
] Avoid some moreenumerate-for-loop
false positives (SIM113
) (#9515) - [
pandas-vet
] Limit inplace diagnostics to methods that accept inplace (#9495) - [
pylint
] Add the__prepare__
method to the list of recognized dunder method (#9529) - [
pylint
] Ignore unnecessary dunder calls within dunder definitions (#9496) - [
refurb
] Avoid bailing whenreimplemented-operator
is called on function (FURB118
) (#9556) - [
ruff
] Avoid treating named expressions as static keys (RUF011
) (#9494)
Documentation
- Add instructions on using
noqa
with isort rules (#9555) - Documentation update for URL giving 'page not found' (#9565)
- Fix admonition in dark mode (#9502)
- Update contributing docs to use
cargo bench -p ruff_benchmark
(#9535) - Update emacs integration section to include
emacs-ruff-format
(#9403) - [
flake8-blind-except
] Document exceptions toblind-except
rule (#9580)
Contributors
v0.1.13
Changes
Bug fixes
- Include base pyproject when initializing cache settings (#9480)
- [
flake8-simplify
] Account for possibly-empty f-string values in truthiness logic (#9484) - [
pylint
] Add the missing period inunnecessary-dunder-call
(#9485) - [
pylint
] Fix__aenter__
message inunnecessary-dunder-call
(#9492)
Contributors
v0.1.12
Changes
Preview features
- Formatter: Hug multiline-strings in preview style (#9243)
- [
flake8-bandit
] Addssl-with-no-version
(S504
) (#9384) - [
flake8-bandit
] Implementssl-insecure-version
(S502
) (#9390) - [
flake8-bandit
] Implementssl-with-bad-defaults
(S503
) (#9391) - [
flake8-bandit
] Implement suspicious import rules (S4XX
) (#8831) - [
flake8-simplify
] Implementzip-dict-keys-and-values
(SIM911
) (#9460) - [
pyflakes
] Add a fix forredefined-while-unused
(F811
) (#9419) - [
pylint
] Implementunnecessary-dunder-call
(C2801
) (#9166) - [
ruff
] Addparenthesize-chained-operators
(RUF021
) to enforce parentheses ina or b and c
(#9440)
Rule changes
- [
flake8-boolean-trap
] Allow Boolean positional arguments in setters (#9429) - [
flake8-builtins
] Restrictbuiltin-attribute-shadowing
(A003
) to actual shadowed references (#9462) - [
flake8-pyi
] Add fix forgenerator-return-from-iter-method
(PYI058
) (#9355) - [
pyflakes
] Don't flagredefined-while-unused
(F811
) inif
branches (#9418) - [
pyupgrade
] Add some additional Python 3.12 typing members todeprecated-import
(#9445) - [
ruff
] Add fix forparenthesize-chained-operators
(RUF021
) (#9449) - [
ruff
] Include subscripts and attributes in static key rule (RUF011
) (#9416) - [
ruff
] Support variable keys in static dictionary key rule (RUF011
) (#9411)
Formatter
- Generate deterministic IDs when formatting notebooks (#9359)
- Allow
# fmt: skip
with interspersed same-line comments (#9395) - Parenthesize breaking named expressions in match guards (#9396)
Bug fixes
- Add cell indexes to all diagnostics (#9387)
- Avoid infinite loop in constant vs.
None
comparisons (#9376) - Handle raises with implicit alternate branches (#9377)
- Ignore trailing quotes for unclosed l-brace errors (#9388)
- Respect multi-segment submodule imports when resolving qualified names (#9382)
- Use
DisplayParseError
for stdin parser errors (#9409) - Use
comment_ranges
for isort directive extraction (#9414) - Use transformed source code for diagnostic locations (#9408)
- [
flake8-pyi
] Excludewarnings.deprecated
andtyping_extensions.deprecated
arguments (#9423) - [
flake8-pyi
] Fix false negative forunused-private-protocol
(PYI046
) with unused generic protocols (#9405) - [
pydocstyle
] Disambiguate argument descriptors from section headers (#9427) - [
pylint
] HomogenizePLR0914
message to match otherPLR09XX
rules (#9399) - [
ruff
] AllowHashable = None
in type annotations (RUF013
) (#9442)