Skip to content

Releases: astral-sh/ruff

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

v0.2.0

01 Feb 23:32
1fadefa
Compare
Choose a tag to compare

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:

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; use full or concise instead

The following settings have moved and the previous name is deprecated:

Remapped rules

The following rules have been remapped to new codes:

Stabilizations

The following rules have been stabilized and are no longer in preview:

Fixes for the following rules have been stabilized and are now available without preview:

Read more

v0.1.15

30 Jan 00:46
a7755d7
Compare
Choose a tag to compare

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 for if-with-same-arms (SIM114) (#9591)
  • [pycodestyle] Add fix for multiple-imports-on-one-line (E401) (#9518)
  • [pylint] Add fix for collapsible-else-if (PLR5501) (#9594)
  • [pylint] Add fix for useless-else-on-loop (PLW0120) (#9590)
  • [pylint] Implement assigning-non-slot (E0237) (#9623)
  • [pylint] Implement potential-index-error (PLE0643) (#9545)
  • [pylint] Implement too-many-nested-blocks (PLR1702) (#9172)
  • [ruff] Add rule to sort __slots__ and __match_args__ (#9564)
  • [ruff] Detect unnecessary dict comprehensions for iterables (RUF025) (#9613)
  • [ruff] Guard against use of default_factory as a keyword argument (RUF026) (#9651)
  • [ruff] Implement mutable-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] Take NoReturn annotation into account when analyzing implicit returns (#9636)
  • [flake8-simplify] Support inverted returns in needless-bool (SIM103) (#9619)
  • [flake8-type-checking] Add Pydantic's BaseConfig to default-copy list (#9650)
  • [flake8-type-checking] Avoid marking InitVar as a typing-only annotation (#9688)
  • [pycodestyle] Allow dtype comparisons in type-comparison (#9676)
  • [pydocstyle] Re-implement last-line-after-section (D413) (#9654)

Documentation

  • [flake8-pytest-style] Add fix safety documentation for duplicate-parameterize-test-cases (#9678)
  • [pylint] Document literal-membership fix safety conditions (#9677)
  • [isort] Fix reference to isort rule code (#9598)

Contributors

v0.1.14

19 Jan 20:22
866bea6
Compare
Choose a tag to compare

Changes

Preview features

  • [flake8-bugbear] Add fix for duplicate-value (B033) (#9510)
  • [flake8-simplify] Implement enumerate-for-loop (SIM113) (#7777)
  • [pygrep_hooks] Add fix for deprecated-log-warn (PGH002) (#9519)
  • [pylint] Implement import-private-name (C2701) (#5920)
  • [refurb] Implement regex-flag-alias with fix (FURB167) (#9516)
  • [ruff] Add rule and fix to sort contents of __all__ (RUF022) (#9474)
  • [tryceratops] Add fix for error-instead-of-exception (TRY400) (#9520)

Rule changes

  • [flake8-pyi] Fix PYI047 false negatives on PEP-695 type aliases (#9566)
  • [flake8-pyi] Fix PYI049 false negatives on call-based TypedDicts (#9567)
  • [pylint] Exclude self and cls 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 more enumerate-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 when reimplemented-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 to blind-except rule (#9580)

Contributors

v0.1.13

12 Jan 15:52
d16c4a2
Compare
Choose a tag to compare

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 in unnecessary-dunder-call (#9485)
  • [pylint] Fix __aenter__ message in unnecessary-dunder-call (#9492)

Contributors

v0.1.12

11 Jan 22:52
55f8f3b
Compare
Choose a tag to compare

Changes

Preview features

  • Formatter: Hug multiline-strings in preview style (#9243)
  • [flake8-bandit] Add ssl-with-no-version (S504) (#9384)
  • [flake8-bandit] Implement ssl-insecure-version (S502) (#9390)
  • [flake8-bandit] Implement ssl-with-bad-defaults (S503) (#9391)
  • [flake8-bandit] Implement suspicious import rules (S4XX) (#8831)
  • [flake8-simplify] Implement zip-dict-keys-and-values (SIM911) (#9460)
  • [pyflakes] Add a fix for redefined-while-unused (F811) (#9419)
  • [pylint] Implement unnecessary-dunder-call (C2801) (#9166)
  • [ruff] Add parenthesize-chained-operators (RUF021) to enforce parentheses in a or b and c (#9440)

Rule changes

  • [flake8-boolean-trap] Allow Boolean positional arguments in setters (#9429)
  • [flake8-builtins] Restrict builtin-attribute-shadowing (A003) to actual shadowed references (#9462)
  • [flake8-pyi] Add fix for generator-return-from-iter-method (PYI058) (#9355)
  • [pyflakes] Don't flag redefined-while-unused (F811) in if branches (#9418)
  • [pyupgrade] Add some additional Python 3.12 typing members to deprecated-import (#9445)
  • [ruff] Add fix for parenthesize-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] Exclude warnings.deprecated and typing_extensions.deprecated arguments (#9423)
  • [flake8-pyi] Fix false negative for unused-private-protocol (PYI046) with unused generic protocols (#9405)
  • [pydocstyle] Disambiguate argument descriptors from section headers (#9427)
  • [pylint] Homogenize PLR0914 message to match other PLR09XX rules (#9399)
  • [ruff] Allow Hashable = None in type annotations (RUF013) (#9442)

Documentation

  • Fix admonition hyperlink colouring (#9385)
  • Add missing preview link (#9386)

Contributors

v0.1.11

02 Jan 23:05
fefc7e8
Compare
Choose a tag to compare

Changes

Preview features

  • [pylint] Implement super-without-brackets (W0245) (#9257)

Bug fixes

  • Check path string properly in python -m ruff invocations (#9367)

Documentation

  • Tweak relative-imports message (#9365)
  • Add fix safety note for yield-in-for-loop (#9364)

Contributors

v0.1.10

02 Jan 18:27
2743387
Compare
Choose a tag to compare

Changes

Preview features

  • Improve dummy_implementations preview style formatting (#9240)
  • Normalise Hex and unicode escape sequences in strings (#9280)
  • Parenthesize long type annotations in annotated assignments (#9210)
  • Parenthesize multi-context managers in with statements (#9222)
  • [flake8-pyi] Implement generator-return-from-iter-method (PYI058) (#9313)
  • [pylint] Implement empty-comment (PLR2044) (#9174)
  • [refurb] Implement bit-count (FURB161) (#9265)
  • [ruff] Add never-union rule to detect redundant typing.NoReturn and typing.Never (#9217)

CLI

  • Add paths to TOML parse errors (#9358)
  • Add row and column numbers to formatter parse errors (#9321)
  • Improve responsiveness when invoked via Python (#9315)
  • Short rule messages should not end with a period (#9345)

Configuration

  • Respect runtime-required decorators on functions (#9317)

Bug fixes

  • Avoid asyncio-dangling-task for nonlocal and global bindings (#9263)
  • Escape trailing placeholders in rule documentation (#9301)
  • Fix continuation detection following multi-line strings (#9332)
  • Fix scoping for generators in named expressions in classes (#9248)
  • Port from obsolete wsl crate to is-wsl (#9356)
  • Remove special pre-visit for module docstrings (#9261)
  • Respect __str__ definitions from super classes (#9338)
  • Respect unused-noqa via per-file-ignores (#9300)
  • Respect attribute chains when resolving builtin call paths (#9309)
  • Treat all typing_extensions members as typing aliases (#9335)
  • Use Display for formatter parse errors (#9316)
  • Wrap subscripted dicts in parens for f-string conversion (#9238)
  • [flake8-annotations] Avoid adding return types to stub methods (#9277)
  • [flake8-annotations] Respect mixed return and raise cases in return-type analysis (#9310)
  • [flake8-bandit] Don't report violations when SafeLoader is imported from yaml.loader (S506) (#9299)
  • [pylint] Avoid panic when comment is preceded by Unicode (#9331)
  • [pylint] Change PLR0917 error message to match other PLR09XX messages (#9308)
  • [refurb] Avoid false positives for math-constant (FURB152) (#9290)

Documentation

  • Expand target name for better rule documentation (#9302)
  • Fix typos found by codespell (#9346)
  • [perflint] Document PERF102 fix un-safety (#9351)
  • [pyupgrade] Document UP007 fix un-safety (#9306)

Contributors