Releases: astral-sh/ruff
Releases · astral-sh/ruff
v0.3.7
Changes
Preview features
- [
flake8-bugbear
] Implementloop-iterator-mutation
(B909
) (#9578) - [
pylint
] Implement rule to prefer augmented assignment (PLR6104
) (#9932)
Bug fixes
- Avoid TOCTOU errors in cache initialization (#10884)
- [
pylint
] Recodenan-comparison
rule toW0177
(#10894) - [
pylint
] Reverse min-max logic inif-stmt-min-max
(#10890)
Contributors
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)