Releases: astral-sh/ruff
v0.3.6
Changes
Preview features
- [
pylint
] Implementbad-staticmethod-argument
(PLW0211
) (#10781) - [
pylint
] Implementif-stmt-min-max
(PLR1730
,PLR1731
) (#10002) - [
pyupgrade
] Replacestr,Enum
multiple inheritance withStrEnum
UP042
(#10713) - [
refurb
] Implementif-expr-instead-of-or-operator
(FURB110
) (#10687) - [
refurb
] Implementint-on-sliced-str
(FURB166
) (#10650) - [
refurb
] Implementwrite-whole-file
(FURB103
) (#10802) - [
refurb
] Supportitemgetter
inreimplemented-operator
(FURB118
) (#10526) - [
flake8_comprehensions
] Addsum
/min
/max
to unnecessary comprehension check (C419
) (#10759)
Rule changes
- [
pydocstyle
] Require capitalizing docstrings where the first sentence is a single word (D403
) (#10776) - [
pycodestyle
] Ignore annotated lambdas in class scopes (E731
) (#10720) - [
flake8-pyi
] Various improvements to PYI034 (#10807) - [
flake8-slots
] Flag subclasses of call-basedtyping.NamedTuple
s as well as subclasses ofcollections.namedtuple()
(SLOT002
) (#10808) - [
pyflakes
] Allow forward references in class bases in stub files (F821
) (#10779) - [
pygrep-hooks
] Improveblanket-noqa
error message (PGH004
) (#10851)
CLI
- Support
FORCE_COLOR
env var (#10839)
Configuration
- Support negated patterns in
[extend-]per-file-ignores
(#10852)
Bug fixes
- [
flake8-import-conventions
] Accept non-aliased (but correct) import inunconventional-import-alias
(ICN001
) (#10729) - [
flake8-quotes
] Add semantic model flag when inside f-string replacement field (#10766) - [
pep8-naming
] Recursively resolveTypeDicts
for N815 violations (#10719) - [
flake8-quotes
] RespectQ00*
ignores inflake8-quotes
rules (#10728) - [
flake8-simplify
] Show negated condition inneedless-bool
diagnostics (SIM103
) (#10854) - [
ruff
] Use within-scope shadowed bindings inasyncio-dangling-task
(RUF006
) (#10793) - [
flake8-pytest-style
] Fix single-tuple conversion inpytest-parametrize-values-wrong-type
(PT007
) (#10862) - [
flake8-return
] Ignore assignments to annotated variables inunnecessary-assign
(RET504
) (#10741) - [
refurb
] Do not allow any keyword arguments forread-whole-file
inrb
mode (FURB101
) (#10803) - [
pylint
] Don't recommend decorating staticmethods with@singledispatch
(PLE1519
,PLE1520
) (#10637) - [
pydocstyle
] Use section name range for all section-related docstring diagnostics (#10740) - Respect
# noqa
directives on__all__
openers (#10798)
Contributors
v0.3.5
Changes
Preview features
- [
pylint
] Implementmodified-iterating-set
(E4703
) (#10473) - [
refurb
] Implementfor-loop-set-mutations
(FURB142
) (#10583) - [
refurb
] Implementunnecessary-from-float
(FURB164
) (#10647) - [
refurb
] Implementverbose-decimal-constructor
(FURB157
) (#10533)
Rule changes
- [
flake8-comprehensions
] Handled special case forC401
which also matchesC416
(#10596) - [
flake8-pyi
] Markunaliased-collections-abc-set-import
fix as "safe" for more cases in stub files (PYI025
) (#10547) - [
numpy
] Addrow_stack
to NumPy 2.0 migration rule (#10646) - [
pycodestyle
] Allow cell magics before an import (E402
) (#10545) - [
pycodestyle
] Avoid blank line rules for the first logical line in cell (#10291)
Configuration
- Respected nested namespace packages (#10541)
- [
flake8-boolean-trap
] Add setting for user defined allowed boolean trap (#10531)
Bug fixes
- Correctly handle references in
__all__
definitions when renaming symbols in autofixes (#10527) - Track ranges of names inside
__all__
definitions (#10525) - [
flake8-bugbear
] Avoid false positive for usage aftercontinue
(B031
) (#10539) - [
flake8-copyright
] Accept commas in default copyright pattern (#9498) - [
flake8-datetimez
] Allow f-strings with%z
forDTZ007
(#10651) - [
flake8-pytest-style
] FixPT014
autofix for last item in list (#10532) - [
flake8-quotes
] IgnoreQ000
,Q001
when string is inside forward ref (#10585) - [
isort
] Always place non-relative imports after relative imports (#10669) - [
isort
] Respect Unicode characters in import sorting (#10529) - [
pyflakes
] Fix F821 false negatives whenfrom __future__ import annotations
is active (attempt 2) (#10524) - [
pyflakes
] Makeunnecessary-lambda
an always-unsafe fix (#10668) - [
pylint
] Fixed false-positive on the rulePLW1641
(eq-without-hash
) (#10566) - [
ruff
] Fix panic in unused# noqa
removal with multi-byte space (RUF100
) (#10682)
Documentation
- Add PR title format to
CONTRIBUTING.md
(#10665) - Fix list markup to include blank lines required (#10591)
- Put
flake8-logging
next to the other flake8 plugins in registry (#10587) - [
flake8-bandit
] Update warning message for ruleS305
to address insecure block cipher mode use (#10602) - [
flake8-bugbear
] Document use of anonymous assignment inuseless-expression
(#10551) - [
flake8-datetimez
] Clarify error messages and docs forDTZ
rules (#10621) - [
pycodestyle
] Use same before vs. after numbers forspace-around-operator
(#10640) - [
ruff
] Changequadratic-list-summation
docs to useiadd
consistently (#10666)
Contributors
v0.3.4
Changes
Preview features
- [
flake8-simplify
] Detect implicitelse
cases inneedless-bool
(SIM103
) (#10414) - [
pylint
] Implementnan-comparison
(PLW0117
) (#10401) - [
pylint
] Implementnonlocal-and-global
(E115
) (#10407) - [
pylint
] Implementsingledispatchmethod-function
(PLE5120
) (#10428) - [
refurb
] Implementlist-reverse-copy
(FURB187
) (#10212)
Rule changes
- [
flake8-pytest-style
] Add automatic fix forpytest-parametrize-values-wrong-type
(PT007
) (#10461) - [
pycodestyle
] Allow SPDX license headers to exceed the line length (E501
) (#10481)
Formatter
- Fix unstable formatting for trailing subscript end-of-line comment (#10492)
Bug fixes
- Avoid code comment detection in PEP 723 script tags (#10464)
- Avoid incorrect tuple transformation in single-element case (
C409
) (#10491) - Bug fix: Prevent fully defined links
name
from being reformatted (#10442) - Consider raw source code for
W605
(#10480) - Docs: Link inline settings when not part of options section (#10499)
- Don't treat annotations as redefinitions in
.pyi
files (#10512) - Fix
E231
bug: Inconsistent catch compared to pycodestyle, such as when dict nested in list (#10469) - Fix pylint upstream categories not showing in docs (#10441)
- Add missing
Options
references to blank line docs (#10498) - 'Revert "F821: Fix false negatives in .py files when
from __future__ import annotations
is active (#10362)"' (#10513) - Apply NFKC normalization to unicode identifiers in the lexer (#10412)
- Avoid failures due to non-deterministic binding ordering (#10478)
- [
flake8-bugbear
] Allow tuples of exceptions (B030
) (#10437) - [
flake8-quotes
] Avoid syntax errors due to invalid quotes (Q000, Q002
) (#10199)
Contributors
v0.3.3
Changes
Preview features
- [
flake8-bandit
]: ImplementS610
rule (#10316) - [
pycodestyle
] Implementblank-line-at-end-of-file
(W391
) (#10243) - [
pycodestyle
] Implementredundant-backslash
(E502
) (#10292) - [
pylint
] - implementredeclared-assigned-name
(W0128
) (#9268)
Rule changes
- [
flake8_comprehensions
] Handled special case forC400
which also matchesC416
(#10419) - [
flake8-bandit
] Implement upstream updates forS311
,S324
andS605
(#10313) - [
pyflakes
] RemoveF401
fix for__init__
imports by default and allow opt-in to unsafe fix (#10365) - [
pylint
] Implementinvalid-bool-return-type
(E304
) (#10377) - [
pylint
] Include builtin warnings in useless-exception-statement (PLW0133
) (#10394)
CLI
- Add message on success to
ruff check
(#8631)
Bug fixes
- [
PIE970
] Allow trailing ellipsis intyping.TYPE_CHECKING
(#10413) - Avoid
TRIO115
if the argument is a variable (#10376) - [
F811
] Avoid removing shadowed imports that point to different symbols (#10387) - Fix
F821
andF822
false positives in.pyi
files (#10341) - Fix
F821
false negatives in.py
files whenfrom __future__ import annotations
is active (#10362) - Fix case where
Indexer
fails to identify continuation preceded by newline #10351 (#10354) - Sort hash maps in
Settings
display (#10370) - Track conditional deletions in the semantic model (#10415)
- [
C413
] Wrap expressions in parentheses when negating (#10346) - [
pycodestyle
] Do not ignore lines before the first logical line in blank lines rules. (#10382) - [
pycodestyle
] Do not triggerE225
andE275
when the next token is a ')' (#10315) - [
pylint
] Avoid false-positive slot non-assignment for__dict__
(PLE0237
) (#10348) - Gate f-string struct size test for Rustc < 1.76 (#10371)
Documentation
- Use
ruff.toml
format in README (#10393) - [
RUF008
] Make it clearer that a mutable default in a dataclass is only valid if it is typed as a ClassVar (#10395) - [
pylint
] Extend docs and test ininvalid-str-return-type
(E307
) (#10400) - Remove
.
fromcheck
andformat
commands (#10217)
Contributors
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-...