Skip to content

Releases: astral-sh/ruff

v0.3.7

12 Apr 03:55
2e37cf6
Compare
Choose a tag to compare

Changes

Preview features

  • [flake8-bugbear] Implement loop-iterator-mutation (B909) (#9578)
  • [pylint] Implement rule to prefer augmented assignment (PLR6104) (#9932)

Bug fixes

  • Avoid TOCTOU errors in cache initialization (#10884)
  • [pylint] Recode nan-comparison rule to W0177 (#10894)
  • [pylint] Reverse min-max logic in if-stmt-min-max (#10890)

Contributors

v0.3.6

11 Apr 16:29
4e8a846
Compare
Choose a tag to compare

Changes

Preview features

  • [pylint] Implement bad-staticmethod-argument (PLW0211) (#10781)
  • [pylint] Implement if-stmt-min-max (PLR1730, PLR1731) (#10002)
  • [pyupgrade] Replace str,Enum multiple inheritance with StrEnum UP042 (#10713)
  • [refurb] Implement if-expr-instead-of-or-operator (FURB110) (#10687)
  • [refurb] Implement int-on-sliced-str (FURB166) (#10650)
  • [refurb] Implement write-whole-file (FURB103) (#10802)
  • [refurb] Support itemgetter in reimplemented-operator (FURB118) (#10526)
  • [flake8_comprehensions] Add sum/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-based typing.NamedTuples as well as subclasses of collections.namedtuple() (SLOT002) (#10808)
  • [pyflakes] Allow forward references in class bases in stub files (F821) (#10779)
  • [pygrep-hooks] Improve blanket-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 in unconventional-import-alias (ICN001) (#10729)
  • [flake8-quotes] Add semantic model flag when inside f-string replacement field (#10766)
  • [pep8-naming] Recursively resolve TypeDicts for N815 violations (#10719)
  • [flake8-quotes] Respect Q00* ignores in flake8-quotes rules (#10728)
  • [flake8-simplify] Show negated condition in needless-bool diagnostics (SIM103) (#10854)
  • [ruff] Use within-scope shadowed bindings in asyncio-dangling-task (RUF006) (#10793)
  • [flake8-pytest-style] Fix single-tuple conversion in pytest-parametrize-values-wrong-type (PT007) (#10862)
  • [flake8-return] Ignore assignments to annotated variables in unnecessary-assign (RET504) (#10741)
  • [refurb] Do not allow any keyword arguments for read-whole-file in rb 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

01 Apr 17:41
200ebee
Compare
Choose a tag to compare

Changes

Preview features

  • [pylint] Implement modified-iterating-set (E4703) (#10473)
  • [refurb] Implement for-loop-set-mutations (FURB142) (#10583)
  • [refurb] Implement unnecessary-from-float (FURB164) (#10647)
  • [refurb] Implement verbose-decimal-constructor (FURB157) (#10533)

Rule changes

  • [flake8-comprehensions] Handled special case for C401 which also matches C416 (#10596)
  • [flake8-pyi] Mark unaliased-collections-abc-set-import fix as "safe" for more cases in stub files (PYI025) (#10547)
  • [numpy] Add row_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 after continue (B031) (#10539)
  • [flake8-copyright] Accept commas in default copyright pattern (#9498)
  • [flake8-datetimez] Allow f-strings with %z for DTZ007 (#10651)
  • [flake8-pytest-style] Fix PT014 autofix for last item in list (#10532)
  • [flake8-quotes] Ignore Q000, 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 when from __future__ import annotations is active (attempt 2) (#10524)
  • [pyflakes] Make unnecessary-lambda an always-unsafe fix (#10668)
  • [pylint] Fixed false-positive on the rule PLW1641 (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 rule S305 to address insecure block cipher mode use (#10602)
  • [flake8-bugbear] Document use of anonymous assignment in useless-expression (#10551)
  • [flake8-datetimez] Clarify error messages and docs for DTZ rules (#10621)
  • [pycodestyle] Use same before vs. after numbers for space-around-operator (#10640)
  • [ruff] Change quadratic-list-summation docs to use iadd consistently (#10666)

Contributors

v0.3.4

23 Mar 13:29
5062572
Compare
Choose a tag to compare

Changes

Preview features

  • [flake8-simplify] Detect implicit else cases in needless-bool (SIM103) (#10414)
  • [pylint] Implement nan-comparison (PLW0117) (#10401)
  • [pylint] Implement nonlocal-and-global (E115) (#10407)
  • [pylint] Implement singledispatchmethod-function (PLE5120) (#10428)
  • [refurb] Implement list-reverse-copy (FURB187) (#10212)

Rule changes

  • [flake8-pytest-style] Add automatic fix for pytest-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

15 Mar 18:13
608df9a
Compare
Choose a tag to compare

Changes

Preview features

  • [flake8-bandit]: Implement S610 rule (#10316)
  • [pycodestyle] Implement blank-line-at-end-of-file (W391) (#10243)
  • [pycodestyle] Implement redundant-backslash (E502) (#10292)
  • [pylint] - implement redeclared-assigned-name (W0128) (#9268)

Rule changes

  • [flake8_comprehensions] Handled special case for C400 which also matches C416 (#10419)
  • [flake8-bandit] Implement upstream updates for S311, S324 and S605 (#10313)
  • [pyflakes] Remove F401 fix for __init__ imports by default and allow opt-in to unsafe fix (#10365)
  • [pylint] Implement invalid-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 in typing.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 and F822 false positives in .pyi files (#10341)
  • Fix F821 false negatives in .py files when from __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 trigger E225 and E275 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 in invalid-str-return-type (E307) (#10400)
  • Remove . from check and format commands (#10217)

Contributors

v0.3.2

09 Mar 01:24
a892fc7
Compare
Choose a tag to compare

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

06 Mar 22:47
b9264a5
Compare
Choose a tag to compare

Changes

Preview features

  • [pycodestyle] Fix E301 not triggering on decorated methods. (#10117)
  • [pycodestyle] Respect isort settings in blank line rules (E3*) (#10096)
  • [pycodestyle] Make blank lines in typing stub files optional (E3*) (#10098)
  • [pylint] Implement singledispatch-method (E1519) (#10140)
  • [pylint] Implement useless-exception-statement (W0133) (#10176)

Rule changes

  • [flake8-debugger] Check for use of debugpy and ptvsd debug modules (#10177) (#10194)
  • [pyupgrade] Generate diagnostic for all valid f-string conversions regardless of line length (UP032) (#10238)
  • [pep8_naming] Add fixes for N804 and N805 (#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 with future.exception() (RSE102) (#10206)
  • [pylint] Add fix for unary expressions in PLC2801 (#9587)
  • [ruff] Fix RUF028 not allowing # fmt: skip on match cases (#10178)

Contributors

v0.3.0

29 Feb 15:30
b53118e
Compare
Choose a tag to compare

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] Allow os.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 out case statements (ERA001) (#10055)
  • [eradicate] Detect single-line code for try:, 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 Rule dict-iter-missing-items (PLE1141) (#9845)
  • [pylint] Ignore sys.version and sys.platform (PLR1714) (#10054)
  • [pyupgrade] Detect literals with unary operators (UP018) (#10060)
  • [ruff] Expand rule for list(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, and ruff --generate-shell-completion in favor of ruff check <path>, ruff rule, ruff clean, and ruff generate-shell-completion (#10169)
  • Remove the deprecated CLI option --format from ruff rule and ruff 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 in gettext 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 to pycodestyle.max-line-length (#10136)

Contributors

v0.2.2

17 Feb 22:41
235cfb7
Compare
Choose a tag to compare

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] Implement readlines_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] Detect mark_safe usages in decorators (#9887)
  • [ruff] Expand asyncio-dangling-task (RUF006) to include new_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 with async for loops (SIM113) (#9996)
  • [flake8-trio] Respect async with in timeout-without-await (#9859)
  • [perflint] Catch a wider range of mutations in PERF101 (#9955)
  • [pycodestyle] Fix E30X panics on blank lines with trailing white spaces (#9907)
  • [pydocstyle] Allow using parameters 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

05 Feb 22:46
0ccca40
Compare
Choose a tag to compare

Changes

This release includes support for range formatting (i.e., the ability to format specific lines
within a source file).

Preview features

  • [refurb] Implement missing-f-string-syntax (RUF027) (#9728)
  • Format module-level docstrings (#9725)

Formatter

  • Add --range option to ruff format (#9733)
  • Don't trim last empty line in docstrings (#9813)

Bug fixes

  • Skip empty lines when determining base indentation (#9795)
  • Drop __get__ and __set__ from unnecessary-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, and C418 (#9819)
  • Use AhoCorasick to speed up quote match (#9773)
  • Remove CST-based fixers for C405 and C409 (#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 to max-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