chore(deps): update dependency ruff to ^0.7.0 #2

Merged
hads merged 1 commits from renovate/ruff-0.x into main 2024-11-13 15:34:21 +13:00
Owner

This PR contains the following updates:

Package Type Update Change
ruff (source, changelog) dev minor ^0.0.289 -> ^0.7.0

Release Notes

astral-sh/ruff (ruff)

v0.7.3

Compare Source

Preview features
  • Formatter: Disallow single-line implicit concatenated strings (#​13928)
  • [flake8-pyi] Include all Python file types for PYI006 and PYI066 (#​14059)
  • [flake8-simplify] Implement split-of-static-string (SIM905) (#​14008)
  • [refurb] Implement subclass-builtin (FURB189) (#​14105)
  • [ruff] Improve diagnostic messages and docs (RUF031, RUF032, RUF034) (#​14068)
Rule changes
  • Detect items that hash to same value in duplicate sets (B033, PLC0208) (#​14064)
  • [eradicate] Better detection of IntelliJ language injection comments (ERA001) (#​14094)
  • [flake8-pyi] Add autofix for docstring-in-stub (PYI021) (#​14150)
  • [flake8-pyi] Update duplicate-literal-member (PYI062) to alawys provide an autofix (#​14188)
  • [pyflakes] Detect items that hash to same value in duplicate dictionaries (F601) (#​14065)
  • [ruff] Fix false positive for decorators (RUF028) (#​14061)
Bug fixes
  • Avoid parsing joint rule codes as distinct codes in # noqa (#​12809)
  • [eradicate] ignore # language= in commented-out-code rule (ERA001) (#​14069)
  • [flake8-bugbear] - do not run mutable-argument-default on stubs (B006) (#​14058)
  • [flake8-builtins] Skip lambda expressions in builtin-argument-shadowing (A002) (#​14144)
  • [flake8-comprehension] Also remove trailing comma while fixing C409 and C419 (#​14097)
  • [flake8-simplify] Allow open without context manager in return statement (SIM115) (#​14066)
  • [pylint] Respect hash-equivalent literals in iteration-over-set (PLC0208) (#​14063)
  • [pylint] Update known dunder methods for Python 3.13 (PLW3201) (#​14146)
  • [pyupgrade] - ignore kwarg unpacking for UP044 (#​14053)
  • [refurb] Parse more exotic decimal strings in verbose-decimal-constructor (FURB157) (#​14098)
Documentation
  • Add links to missing related options within rule documentations (#​13971)
  • Add rule short code to mkdocs tags to allow searching via rule codes (#​14040)

v0.7.2

Compare Source

Preview features
  • Fix formatting of single with-item with trailing comment (#​14005)
  • [pyupgrade] Add PEP 646 Unpack conversion to * with fix (UP044) (#​13988)
Rule changes
  • Regenerate known_stdlibs.rs with stdlibs 2024.10.25 (#​13963)
  • [flake8-no-pep420] Skip namespace package enforcement for PEP 723 scripts (INP001) (#​13974)
Server
  • Fix server panic when undoing an edit (#​14010)
Bug fixes
  • Fix issues in discovering ruff in pip build environments (#​13881)
  • [flake8-type-checking] Fix false positive for singledispatchmethod (TCH003) (#​13941)
  • [flake8-type-checking] Treat return type of singledispatch as runtime-required (TCH003) (#​13957)
Documentation
  • [flake8-simplify] Include caveats of enabling if-else-block-instead-of-if-exp (SIM108) (#​14019)

v0.7.1

Compare Source

Preview features
  • Fix E221 and E222 to flag missing or extra whitespace around == operator (#​13890)
  • Formatter: Alternate quotes for strings inside f-strings in preview (#​13860)
  • Formatter: Join implicit concatenated strings when they fit on a line (#​13663)
  • [pylint] Restrict iteration-over-set to only work on sets of literals (PLC0208) (#​13731)
Rule changes
  • [flake8-type-checking] Support auto-quoting when annotations contain quotes (#​11811)
Server
  • Avoid indexing the workspace for single-file mode (#​13770)
Bug fixes
  • Make ARG002 compatible with EM101 when raising NotImplementedError (#​13714)
Other changes
  • Introduce more Docker tags for Ruff (similar to uv) (#​13274)

v0.7.0

Compare Source

Check out the blog post for a migration guide and overview of the changes!

Breaking changes
  • The pytest rules PT001 and PT023 now default to omitting the decorator parentheses when there are no arguments
    (#​12838, #​13292).
    This was a change that we attempted to make in Ruff v0.6.0, but only partially made due to an error on our part.
    See the blog post for more details.
  • The useless-try-except rule (in our tryceratops category) has been recoded from TRY302 to
    TRY203 (#​13502). This ensures Ruff's code is consistent with
    the same rule in the tryceratops linter.
  • The lint.allow-unused-imports setting has been removed (#​13677). Use
    lint.pyflakes.allow-unused-imports
    instead.
Formatter preview style
  • Normalize implicit concatenated f-string quotes per part (#​13539)
Preview linter features
  • [refurb] implement hardcoded-string-charset (FURB156) (#​13530)
  • [refurb] Count codepoints not bytes for slice-to-remove-prefix-or-suffix (FURB188) (#​13631)
Rule changes
  • [pylint] Mark PLE1141 fix as unsafe (#​13629)
  • [flake8-async] Consider async generators to be "checkpoints" for cancel-scope-no-checkpoint (ASYNC100) (#​13639)
  • [flake8-bugbear] Do not suggest setting parameter strict= to False in B905 diagnostic message (#​13656)
  • [flake8-todos] Only flag the word "TODO", not words starting with "todo" (TD006) (#​13640)
  • [pycodestyle] Fix whitespace-related false positives and false negatives inside type-parameter lists (E231, E251) (#​13704)
  • [flake8-simplify] Stabilize preview behavior for SIM115 so that the rule can detect files
    being opened from a wider range of standard-library functions (#​12959).
CLI
  • Add explanation of fixable in --statistics command (#​13774)
Bug fixes
  • [pyflakes] Allow ipytest cell magic (F401) (#​13745)
  • [flake8-use-pathlib] Fix PTH123 false positive when open is passed a file descriptor (#​13616)
  • [flake8-bandit] Detect patterns from multi line SQL statements (S608) (#​13574)
  • [flake8-pyi] - Fix dropped expressions in PYI030 autofix (#​13727)

v0.6.9

Compare Source

Preview features
  • Fix codeblock dynamic line length calculation for indented docstring examples (#​13523)
  • [refurb] Mark FURB118 fix as unsafe (#​13613)
Rule changes
  • [pydocstyle] Don't raise D208 when last line is non-empty (#​13372)
  • [pylint] Preserve trivia (i.e. comments) in PLR5501 autofix (#​13573)
Configuration
  • [pyflakes] Add allow-unused-imports setting for unused-import rule (F401) (#​13601)
Bug fixes
  • Support ruff discovery in pip build environments (#​13591)
  • [flake8-bugbear] Avoid short circuiting B017 for multiple context managers (#​13609)
  • [pylint] Do not offer an invalid fix for PLR1716 when the comparisons contain parenthesis (#​13527)
  • [pyupgrade] Fix UP043 to apply to collections.abc.Generator and collections.abc.AsyncGenerator (#​13611)
  • [refurb] Fix handling of slices in tuples for FURB118, e.g., x[:, 1] (#​13518)
Documentation
  • Update GitHub Action link to astral-sh/ruff-action (#​13551)

v0.6.8

Compare Source

Preview features
  • Remove unnecessary parentheses around match case clauses (#​13510)
  • Parenthesize overlong if guards in match..case clauses (#​13513)
  • Detect basic wildcard imports in ruff analyze graph (#​13486)
  • [pylint] Implement boolean-chained-comparison (R1716) (#​13435)
Rule changes
  • [lake8-simplify] Detect SIM910 when using variadic keyword arguments, i.e., **kwargs (#​13503)
  • [pyupgrade] Avoid false negatives with non-reference shadowed bindings of loop variables (UP028) (#​13504)
Bug fixes
  • Detect tuples bound to variadic positional arguments i.e. *args (#​13512)
  • Exit gracefully on broken pipe errors (#​13485)
  • Avoid panic when analyze graph hits broken pipe (#​13484)
Performance
  • Reuse BTreeSets in module resolver (#​13440)
  • Skip traversal for non-compound statements (#​13441)

v0.6.7

Compare Source

Preview features
  • Add Python version support to ruff analyze CLI (#​13426)
  • Add exclude support to ruff analyze (#​13425)
  • Fix parentheses around return type annotations (#​13381)
Rule changes
  • [pycodestyle] Fix: Don't autofix if the first line ends in a question mark? (D400) (#​13399)
Bug fixes
  • Respect lint.exclude in ruff check --add-noqa (#​13427)
Performance
  • Avoid tracking module resolver files in Salsa (#​13437)
  • Use forget for module resolver database (#​13438)

v0.6.6

Compare Source

Preview features
  • [refurb] Skip slice-to-remove-prefix-or-suffix (FURB188) when non-trivial slice steps are present (#​13405)
  • Add a subcommand to generate dependency graphs (#​13402)
Formatter
  • Fix placement of inline parameter comments (#​13379)
Server
  • Fix off-by one error in the LineIndex::offset calculation (#​13407)
Bug fixes
  • [fastapi] Respect FastAPI aliases in route definitions (#​13394)
  • [pydocstyle] Respect word boundaries when detecting function signature in docs (#​13388)
Documentation
  • Add backlinks to rule overview linter (#​13368)
  • Fix documentation for editor vim plugin ALE (#​13348)
  • Fix rendering of FURB188 docs (#​13406)

v0.6.5

Compare Source

Preview features
  • [pydoclint] Ignore DOC201 when function name is "new" (#​13300)
  • [refurb] Implement slice-to-remove-prefix-or-suffix (FURB188) (#​13256)
Rule changes
  • [eradicate] Ignore script-comments with multiple end-tags (ERA001) (#​13283)
  • [pyflakes] Improve error message for UndefinedName when a builtin was added in a newer version than specified in Ruff config (F821) (#​13293)
Server
  • Add support for extensionless Python files for server (#​13326)
  • Fix configuration inheritance for configurations specified in the LSP settings (#​13285)
Bug fixes
  • [ruff] Handle unary operators in decimal-from-float-literal (RUF032) (#​13275)
CLI
  • Only include rules with diagnostics in SARIF metadata (#​13268)
Playground
  • Add "Copy as pyproject.toml/ruff.toml" and "Paste from TOML" (#​13328)
  • Fix errors not shown for restored snippet on page load (#​13262)

v0.6.4

Compare Source

Preview features
  • [flake8-builtins] Use dynamic builtins list based on Python version (#​13172)
  • [pydoclint] Permit yielding None in DOC402 and DOC403 (#​13148)
  • [pylint] Update diagnostic message for PLW3201 (#​13194)
  • [ruff] Implement post-init-default (RUF033) (#​13192)
  • [ruff] Implement useless if-else (RUF034) (#​13218)
Rule changes
  • [flake8-pyi] Respect pep8_naming.classmethod-decorators settings when determining if a method is a classmethod in custom-type-var-return-type (PYI019) (#​13162)
  • [flake8-pyi] Teach various rules that annotations might be stringized (#​12951)
  • [pylint] Avoid no-self-use for attrs-style validators (#​13166)
  • [pylint] Recurse into subscript subexpressions when searching for list/dict lookups (PLR1733, PLR1736) (#​13186)
  • [pyupgrade] Detect aiofiles.open calls in UP015 (#​13173)
  • [pyupgrade] Mark sys.version_info[0] < 3 and similar comparisons as outdated (UP036) (#​13175)
CLI
  • Enrich messages of SARIF results (#​13180)
  • Handle singular case for incompatible rules warning in ruff format output (#​13212)
Bug fixes
  • [pydocstyle] Improve heuristics for detecting Google-style docstrings (#​13142)
  • [refurb] Treat sep arguments with effects as unsafe removals (FURB105) (#​13165)

v0.6.3

Compare Source

Preview features
  • [flake8-simplify] Extend open-file-with-context-handler to work with dbm.sqlite3 (SIM115) (#​13104)
  • [pycodestyle] Disable E741 in stub files (.pyi) (#​13119)
  • [pydoclint] Avoid DOC201 on explicit returns in functions that only return None (#​13064)
Rule changes
  • [flake8-async] Disable check for asyncio before Python 3.11 (ASYNC109) (#​13023)
Bug fixes
  • [FastAPI] Avoid introducing invalid syntax in fix for fast-api-non-annotated-dependency (FAST002) (#​13133)
  • [flake8-implicit-str-concat] Normalize octals before merging concatenated strings in single-line-implicit-string-concatenation (ISC001) (#​13118)
  • [flake8-pytest-style] Improve help message for pytest-incorrect-mark-parentheses-style (PT023) (#​13092)
  • [pylint] Avoid autofix for calls that aren't min or max as starred expression (PLW3301) (#​13089)
  • [ruff] Add datetime.time, datetime.tzinfo, and datetime.timezone as immutable function calls (RUF009) (#​13109)
  • [ruff] Extend comment deletion for RUF100 to include trailing text from noqa directives while preserving any following comments on the same line, if any (#​13105)
  • Fix dark theme on initial page load for the Ruff playground (#​13077)

v0.6.2

Compare Source

Preview features
  • [flake8-simplify] Extend open-file-with-context-handler to work with other standard-library IO modules (SIM115) (#​12959)
  • [ruff] Avoid unused-async for functions with FastAPI route decorator (RUF029) (#​12938)
  • [ruff] Ignore fstring-missing-syntax (RUF027) for fastAPI paths (#​12939)
  • [ruff] Implement check for Decimal called with a float literal (RUF032) (#​12909)
Rule changes
  • [flake8-bugbear] Update diagnostic message when expression is at the end of function (B015) (#​12944)
  • [flake8-pyi] Skip type annotations in string-or-bytes-too-long (PYI053) (#​13002)
  • [flake8-type-checking] Always recognise relative imports as first-party (#​12994)
  • [flake8-unused-arguments] Ignore unused arguments on stub functions (ARG001) (#​12966)
  • [pylint] Ignore augmented assignment for self-cls-assignment (PLW0642) (#​12957)
Server
  • Show full context in error log messages (#​13029)
Bug fixes
  • [pep8-naming] Don't flag from imports following conventional import names (N817) (#​12946)
  • [pylint] - Allow __new__ methods to have cls as their first argument even if decorated with @staticmethod for bad-staticmethod-argument (PLW0211) (#​12958)
Documentation
  • Add hyperfine installation instructions; update hyperfine code samples (#​13034)
  • Expand note to use Ruff with other language server in Kate (#​12806)
  • Update example for PT001 as per the new default behavior (#​13019)
  • [perflint] Improve docs for try-except-in-loop (PERF203) (#​12947)
  • [pydocstyle] Add reference to lint.pydocstyle.ignore-decorators setting to rule docs (#​12996)

v0.6.1

Compare Source

This is a hotfix release to address an issue with ruff-pre-commit. In v0.6,
Ruff changed its behavior to lint and format Jupyter notebooks by default;
however, due to an oversight, these files were still excluded by default if
Ruff was run via pre-commit, leading to inconsistent behavior.
This has now been fixed.

Preview features
  • [fastapi] Implement fast-api-unused-path-parameter (FAST003) (#​12638)
Rule changes
  • [pylint] Rename too-many-positional to too-many-positional-arguments (R0917) (#​12905)
Server
  • Fix crash when applying "fix-all" code-action to notebook cells (#​12929)
Other changes
  • [flake8-naming]: Respect import conventions (N817) (#​12922)

v0.6.0

Compare Source

Check out the blog post for a migration guide and overview of the changes!

Breaking changes

See also, the "Remapped rules" section which may result in disabled rules.

  • Lint and format Jupyter Notebook by default (#​12878).
  • Detect imports in src layouts by default for isort rules (#​12848)
  • The pytest rules PT001 and PT023 now default to omitting the decorator parentheses when there are no arguments (#​12838).
Deprecations

The following rules are now deprecated:

Remapped rules

The following rules have been remapped to new rule codes:

Stabilization

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

The following behaviors have been stabilized:

The following fixes have been stabilized:

Preview features
  • [flake8-simplify] Further simplify to binary in preview for (SIM108) (#​12796)
  • [pyupgrade] Show violations without auto-fix (UP031) (#​11229)
Rule changes
  • [flake8-import-conventions] Add xml.etree.ElementTree to default conventions (#​12455)
  • [flake8-pytest-style] Add a space after comma in CSV output (PT006) (#​12853)
Server
  • Show a message for incorrect settings (#​12781)
Bug fixes
  • [flake8-async] Do not lint yield in context manager (ASYNC100) (#​12896)
  • [flake8-comprehensions] Do not lint async for comprehensions (C419) (#​12895)
  • [flake8-return] Only add return None at end of a function (RET503) (#​11074)
  • [flake8-type-checking] Avoid treating dataclasses.KW_ONLY as typing-only (TCH003) (#​12863)
  • [pep8-naming] Treat type(Protocol) et al as metaclass base (N805) (#​12770)
  • [pydoclint] Don't enforce returns and yields in abstract methods (DOC201, DOC202) (#​12771)
  • [ruff] Skip tuples with slice expressions in (RUF031) (#​12768)
  • [ruff] Ignore unparenthesized tuples in subscripts when the subscript is a type annotation or type alias (RUF031) (#​12762)
  • [ruff] Ignore template strings passed to logging and builtins._() calls (RUF027) (#​12889)
  • [ruff] Do not remove parens for tuples with starred expressions in Python <=3.10 (RUF031) (#​12784)
  • Evaluate default parameter values for a function in that function's enclosing scope (#​12852)
Other changes
  • Respect VS Code cell metadata when detecting the language of Jupyter Notebook cells (#​12864)
  • Respect kernelspec notebook metadata when detecting the preferred language for a Jupyter Notebook (#​12875)

v0.5.7

Compare Source

Preview features
  • [flake8-comprehensions] Account for list and set comprehensions in unnecessary-literal-within-tuple-call (C409) (#​12657)
  • [flake8-pyi] Add autofix for future-annotations-in-stub (PYI044) (#​12676)
  • [flake8-return] Avoid syntax error when auto-fixing RET505 with mixed indentation (space and tabs) (#​12740)
  • [pydoclint] Add docstring-missing-yields (DOC402) and docstring-extraneous-yields (DOC403) (#​12538)
  • [pydoclint] Avoid DOC201 if docstring begins with "Return", "Returns", "Yield", or "Yields" (#​12675)
  • [pydoclint] Deduplicate collected exceptions after traversing function bodies (DOC501) (#​12642)
  • [pydoclint] Ignore DOC errors for stub functions (#​12651)
  • [pydoclint] Teach rules to understand reraised exceptions as being explicitly raised (DOC501, DOC502) (#​12639)
  • [ruff] Implement incorrectly-parenthesized-tuple-in-subscript (RUF031) (#​12480)
  • [ruff] Mark RUF023 fix as unsafe if __slots__ is not a set and the binding is used elsewhere (#​12692)
Rule changes
  • [refurb] Add autofix for implicit-cwd (FURB177) (#​12708)
  • [ruff] Add autofix for zip-instead-of-pairwise (RUF007) (#​12663)
  • [tryceratops] Add BaseException to raise-vanilla-class rule (TRY002) (#​12620)
Server
  • Ignore non-file workspace URL; Ruff will display a warning notification in this case (#​12725)
CLI
  • Fix cache invalidation for nested pyproject.toml files (#​12727)
Bug fixes
  • [flake8-async] Fix false positives with multiple async with items (ASYNC100) (#​12643)
  • [flake8-bandit] Avoid false-positives for list concatenations in SQL construction (S608) (#​12720)
  • [flake8-bugbear] Treat return as equivalent to break (B909) (#​12646)
  • [flake8-comprehensions] Set comprehensions not a violation for sum in unnecessary-comprehension-in-call (C419) (#​12691)
  • [flake8-simplify] Parenthesize conditions based on precedence when merging if arms (SIM114) (#​12737)
  • [pydoclint] Try both 'Raises' section styles when convention is unspecified (DOC501) (#​12649)

v0.5.6

Compare Source

Ruff 0.5.6 automatically enables linting and formatting of notebooks in preview mode.
You can opt-out of this behavior by adding *.ipynb to the extend-exclude setting.

[tool.ruff]
extend-exclude = ["*.ipynb"]
Preview features
  • Enable notebooks by default in preview mode (#​12621)
  • [flake8-builtins] Implement import, lambda, and module shadowing (#​12546)
  • [pydoclint] Add docstring-missing-returns (DOC201) and docstring-extraneous-returns (DOC202) (#​12485)
Rule changes
  • [flake8-return] Exempt cached properties and other property-like decorators from explicit return rule (RET501) (#​12563)
Server
  • Make server panic hook more error resilient (#​12610)
  • Use $/logTrace for server trace logs in Zed and VS Code (#​12564)
  • Keep track of deleted cells for reorder change request (#​12575)
Configuration
  • [flake8-implicit-str-concat] Always allow explicit multi-line concatenations when implicit concatenations are banned (#​12532)
Bug fixes
  • [flake8-async] Avoid flagging asyncio.timeouts as unused when the context manager includes asyncio.TaskGroup (#​12605)
  • [flake8-slots] Avoid recommending __slots__ for classes that inherit from more than namedtuple (#​12531)
  • [isort] Avoid marking required imports as unused (#​12537)
  • [isort] Preserve trailing inline comments on import-from statements (#​12498)
  • [pycodestyle] Add newlines before comments (E305) (#​12606)
  • [pycodestyle] Don't attach comments with mismatched indents (#​12604)
  • [pyflakes] Fix preview-mode bugs in F401 when attempting to autofix unused first-party submodule imports in an __init__.py file (#​12569)
  • [pylint] Respect start index in unnecessary-list-index-lookup (#​12603)
  • [pyupgrade] Avoid recommending no-argument super in slots=True dataclasses (#​12530)
  • [pyupgrade] Use colon rather than dot formatting for integer-only types (#​12534)
  • Fix NFKC normalization bug when removing unused imports (#​12571)
Other changes
  • Consider more stdlib decorators to be property-like (#​12583)
  • Improve handling of metaclasses in various linter rules (#​12579)
  • Improve consistency between linter rules in determining whether a function is property (#​12581)

v0.5.5

Compare Source

Preview features
  • [fastapi] Implement fastapi-redundant-response-model (FAST001) and fastapi-non-annotated-dependency(FAST002) (#​11579)
  • [pydoclint] Implement docstring-missing-exception (DOC501) and docstring-extraneous-exception (DOC502) (#​11471)
Rule changes
  • [numpy] Fix NumPy 2.0 rule for np.alltrue and np.sometrue (#​12473)
  • [numpy] Ignore NPY201 inside except blocks for compatibility with older numpy versions (#​12490)
  • [pep8-naming] Avoid applying ignore-names to self and cls function names (N804, N805) (#​12497)
Formatter
  • Fix incorrect placement of leading function comment with type params (#​12447)
Server
  • Do not bail code action resolution when a quick fix is requested (#​12462)
Bug fixes
  • Fix Ord implementation of cmp_fix (#​12471)
  • Raise syntax error for unparenthesized generator expression in multi-argument call (#​12445)
  • [pydoclint] Fix panic in DOC501 reported in #​12428 (#​12435)
  • [flake8-bugbear] Allow singleton tuples with starred expressions in B013 (#​12484)
Documentation
  • Add Eglot setup guide for Emacs editor (#​12426)
  • Add note about the breaking change in nvim-lspconfig (#​12507)
  • Add note to include notebook files for native server (#​12449)
  • Add setup docs for Zed editor (#​12501)

v0.5.4

Compare Source

Rule changes
  • [ruff] Rename RUF007 to zip-instead-of-pairwise (#​12399)
Bug fixes
  • [flake8-builtins] Avoid shadowing diagnostics for @override methods (#​12415)
  • [flake8-comprehensions] Insert parentheses for multi-argument generators (#​12422)
  • [pydocstyle] Handle escaped docstrings within docstring (D301) (#​12192)
Documentation
  • Fix GitHub link to Neovim setup (#​12410)
  • Fix output-format default in settings reference (#​12409)

v0.5.3

Compare Source

Ruff 0.5.3 marks the stable release of the Ruff language server and introduces revamped
documentation, including setup guides for your editor of
choice
and the language server
itself
.

Preview features
  • Formatter: Insert empty line between suite and alternative branch after function/class definition (#​12294)
  • [pyupgrade] Implement unnecessary-default-type-args (UP043) (#​12371)
Rule changes
  • [flake8-bugbear] Detect enumerate iterations in loop-iterator-mutation (B909) (#​12366)
  • [flake8-bugbear] Remove discard, remove, and pop allowance for loop-iterator-mutation (B909) (#​12365)
  • [pylint] Allow repeated-equality-comparison for mixed operations (PLR1714) (#​12369)
  • [pylint] Ignore self and cls when counting arguments (PLR0913) (#​12367)
  • [pylint] Use UTF-8 as default encoding in unspecified-encoding fix (PLW1514) (#​12370)
Server
  • Build settings index in parallel for the native server (#​12299)
  • Use fallback settings when indexing the project (#​12362)
  • Consider --preview flag for server subcommand for the linter and formatter (#​12208)
Bug fixes
  • [flake8-comprehensions] Allow additional arguments for sum and max comprehensions (C419) (#​12364)
  • [pylint] Avoid dropping extra boolean operations in repeated-equality-comparison (PLR1714) (#​12368)
  • [pylint] Consider expression before statement when determining binding kind (PLR1704) (#​12346)
Documentation
  • Add docs for Ruff language server (#​12344)
  • Migrate to standalone docs repo (#​12341)
  • Update versioning policy for editor integration (#​12375)
Other changes

v0.5.2

Compare Source

Preview features
  • Use space separator before parenthesized expressions in comprehensions with leading comments (#​12282)
  • [flake8-async] Update ASYNC100 to include anyio and asyncio (#​12221)
  • [flake8-async] Update ASYNC109 to include anyio and asyncio (#​12236)
  • [flake8-async] Update ASYNC110 to include anyio and asyncio (#​12261)
  • [flake8-async] Update ASYNC115 to include anyio and asyncio (#​12262)
  • [flake8-async] Update ASYNC116 to include anyio and asyncio (#​12266)
Rule changes
  • [flake8-return] Exempt properties from explicit return rule (RET501) (#​12243)
  • [numpy] Add np.NAN-to-np.nan diagnostic (#​12292)
  • [refurb] Make list-reverse-copy an unsafe fix (#​12303)
Server
  • Consider include and extend-include settings in native server (#​12252)
  • Include nested configurations in settings reloading (#​12253)
CLI
  • Omit code frames for fixes with empty ranges (#​12304)
  • Warn about formatter incompatibility for D203 (#​12238)
Bug fixes
  • Make cache-write failures non-fatal on Windows (#​12302)
  • Treat not operations as boolean tests (#​12301)
  • [flake8-bandit] Avoid S310 violations for HTTP-safe f-strings (#​12305)
  • [flake8-bandit] Support explicit string concatenations in S310 HTTP detection (#​12315)
  • [flake8-bandit] fix S113 false positive for httpx without timeout argument (#​12213)
  • [pycodestyle] Remove "non-obvious" allowance for E721 (#​12300)
  • [pyflakes] Consider with blocks as single-item branches for redefinition analysis (#​12311)
  • [refurb] Restrict forwarding for newline argument in open() calls to Python versions >= 3.10 (#​12244)
Documentation
  • Update help and documentation to reflect --output-format full default (#​12248)
Performance
  • Use more threads when discovering Python files (#​12258)

v0.5.1

Compare Source

Preview features
  • [flake8-bugbear] Implement mutable-contextvar-default (B039) (#​12113)
  • [pycodestyle] Whitespace after decorator (E204) (#​12140)
  • [pytest] Reverse PT001 and PT0023 defaults (#​12106)
Rule changes
  • Enable token-based rules on source with syntax errors (#​11950)
  • [flake8-bandit] Detect httpx for S113 (#​12174)
  • [numpy] Update NPY201 to include exception deprecations (#​12065)
  • [pylint] Generate autofix for duplicate-bases (PLE0241) (#​12105)
Server
  • Avoid syntax error notification for source code actions (#​12148)
  • Consider the content of the new cells during notebook sync (#​12203)
  • Fix replacement edit range computation (#​12171)
Bug fixes
  • Disable auto-fix when source has syntax errors (#​12134)
  • Fix cache key collisions for paths with separators (#​12159)
  • Make requires-python inference robust to == (#​12091)
  • Use char-wise width instead of str-width (#​12135)
  • [pycodestyle] Avoid E275 if keyword followed by comma (#​12136)
  • [pycodestyle] Avoid E275 if keyword is followed by a semicolon (#​12095)
  • [pylint] Skip dummy variables for PLR1704 (#​12190)
Performance
  • Remove allocation in parse_identifier (#​12103)
  • Use CompactString for Identifier AST node (#​12101)

v0.5.0

Compare Source

Check out the blog post for a migration guide and overview of the changes!

Breaking changes

See also, the "Remapped rules" section which may result in disabled rules.

  • Follow the XDG specification to discover user-level configurations on macOS (same as on other Unix platforms)
  • Selecting ALL now excludes deprecated rules
  • The released archives now include an extra level of nesting, which can be removed with --strip-components=1 when untarring.
  • The release artifact's file name no longer includes the version tag. This enables users to install via /latest URLs on GitHub.
  • The diagnostic ranges for some flake8-bandit rules were modified (#​10667).
Deprecations

The following rules are now deprecated:

Remapped rules

The following rules have been remapped to new rule codes:

Stabilization

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

The following behaviors have been stabilized:

Removals

The following deprecated settings have been removed:

  • output-format=text; use output-format=concise or output-format=full
  • tab-size; use indent-width

The following deprecated CLI options have been removed:

  • --show-source; use --output-format=full
  • --no-show-source; use --output-format=concise

The following deprecated CLI commands have been removed:

  • ruff <path>; use ruff check <path>
  • ruff --clean; use ruff clean
  • ruff --generate-shell-completion; use ruff generate-shell-completion
Preview features
  • [ruff] Add assert-with-print-message rule (#​11981)
CLI
  • Use rule name rather than message in --statistics (#​11697)
  • Use the output format full by default (#​12010)
  • Don't log syntax errors to the console (#​11902)
Rule changes
  • [ruff] Fix false positives if gettext is imported using an alias (RUF027) (#​12025)
  • [numpy] Update trapz and in1d deprecation (NPY201) (#​11948)
  • [flake8-bandit] Modify diagnostic ranges for shell-related rules (#​10667)
Server
  • Closing an untitled, unsaved notebook document no longer throws an error (#​11942)
  • Support the usage of tildes and environment variables in logFile (#​11945)
  • Add option to configure whether to show syntax errors (#​12059)
Bug fixes
  • [pycodestyle] Avoid E203 for f-string debug expression (#​12024)
  • [pep8-naming] Match import-name ignores against both name and alias (N812, N817) (#​12033)
  • [pyflakes] Detect assignments that shadow definitions (F811) (#​11961)
Parser
  • Emit a syntax error for an empty type parameter list (#​12030)
  • Avoid consuming the newline for unterminated strings (#​12067)
  • Do not include the newline in the unterminated string range (#​12017)
  • Use the correct range to highlight line continuation errors (#​12016)
  • Consider 2-character EOL before line continuations (#​12035)
  • Consider line continuation character for re-lexing (#​12008)
Other changes
  • Upgrade the Unicode table used for measuring the line-length (#​11194)
  • Remove the deprecation error message for the nursery selector (#​10172)

v0.4.10

Compare Source

Parser
  • Implement re-lexing logic for better error recovery (#​11845)
Rule changes
  • [flake8-copyright] Update CPY001 to check the first 4096 bytes instead of 1024 (#​11927)
  • [pycodestyle] Update E999 to show all syntax errors instead of just the first one (#​11900)
Server
  • Add tracing setup guide to Helix documentation (#​11883)
  • Add tracing setup guide to Neovim documentation (#​11884)
  • Defer notebook cell deletion to avoid an error message (#​11864)
Security
  • Guard against malicious ecosystem comment artifacts (#​11879)

v0.4.9

Compare Source

Preview features
  • [pylint] Implement consider-dict-items (C0206) (#​11688)
  • [refurb] Implement repeated-global (FURB154) (#​11187)
Rule changes
  • [pycodestyle] Adapt fix for E203 to work identical to ruff format (#​10999)
Formatter
  • Fix formatter instability for lines only consisting of zero-width characters (#​11748)
Server
  • Add supported commands in server capabilities (#​11850)
  • Use real file path when available in ruff server (#​11800)
  • Improve error message when a command is run on an unavailable document (#​11823)
  • Introduce the ruff.printDebugInformation command (#​11831)
  • Tracing system now respects log level and trace level, with options to log to a file (#​11747)
CLI
  • Handle non-printable characters in diff view (#​11687)
Bug fixes
  • [refurb] Avoid suggesting starmap when arguments are used outside call (FURB140) (#​11830)
  • [flake8-bugbear] Avoid panic in B909 when checking large loop blocks (#​11772)
  • [refurb] Fix misbehavior of operator.itemgetter when getter param is a tuple (FURB118) (#​11774)

v0.4.8

Compare Source

Performance
  • Linter performance has been improved by around 10% on some microbenchmarks by refactoring the lexer and parser to maintain synchronicity between them (#​11457)
Preview features
  • [flake8-bugbear] Implement return-in-generator (B901) (#​11644)
  • [flake8-pyi] Implement PYI063 (#​11699)
  • [pygrep_hooks] Check blanket ignores via file-level pragmas (PGH004) (#​11540)
Rule changes
  • [pyupgrade] Update UP035 for Python 3.13 and the latest version of typing_extensions (#​11693)
  • [numpy] Update NPY001 rule for NumPy 2.0 (#​11735)
Server
  • Formatting a document with syntax problems no longer spams a visible error popup (#​11745)
CLI
  • Add RDJson support for --output-format flag (#​11682)
Bug fixes
  • [pyupgrade] Write empty string in lieu of panic when fixing UP032 (#​11696)
  • [flake8-simplify] Simplify double negatives in SIM103 (#​11684)
  • Ensure the expression generator adds a newline before type statements (#​11720)
  • Respect per-file ignores for blanket and redirected noqa rules (#​11728)

v0.4.7

Compare Source

Preview features
  • [flake8-pyi] Implement PYI064 (#​11325)
  • [flake8-pyi] Implement PYI066 (#​11541)
  • [flake8-pyi] Implement PYI057 (#​11486)
  • [pyflakes] Enable F822 in __init__.py files by default (#​11370)
Formatter
  • Fix incorrect placement of trailing stub function comments (#​11632)
Server
  • Respect file exclusions in ruff server (#​11590)
  • Add support for documents not exist on disk (#​11588)
  • Add Vim and Kate setup guide for ruff server (#​11615)
Bug fixes
  • Avoid removing newlines between docstring headers and rST blocks (#​11609)
  • Infer indentation with imports when logical indent is absent (#​11608)
  • Use char index rather than position for indent slice (#​11645)
  • [flake8-comprehension] Strip parentheses around generators in C400 (#​11607)
  • Mark repeated-isinstance-calls as unsafe on Python 3.10 and later (#​11622)

v0.4.6

Compare Source

Breaking changes
  • Use project-relative paths when calculating GitLab fingerprints (#​11532)
  • Bump minimum supported Windows version to Windows 10 (#​11613)
Preview features
  • [flake8-async] Sleep with >24 hour interval should usually sleep forever (ASYNC116) (#​11498)
Rule changes
  • [numpy] Add missing functions to NumPy 2.0 migration rule (#​11528)
  • [mccabe] Consider irrefutable pattern similar to if .. else for C901 (#​11565)
  • Consider match-case statements for C901, PLR0912, and PLR0915 (#​11521)
  • Remove empty strings when converting to f-string (UP032) (#​11524)
  • [flake8-bandit] request-without-timeout should warn for requests.request (#​11548)
  • [flake8-self] Ignore sunder accesses in flake8-self rules (#​11546)
  • [pyupgrade] Lint for TypeAliasType usages (UP040) (#​11530)
Server
  • Respect excludes in ruff server configuration discovery (#​11551)
  • Use default settings if initialization options is empty or not provided (#​11566)
  • ruff server correctly treats .pyi files as stub files (#​11535)
  • ruff server searches for configuration in parent directories (#​11537)
  • ruff server: An empty code action filter no longer returns notebook source actions (#​11526)
Bug fixes
  • [flake8-logging-format] Fix autofix title in logging-warn (G010) (#​11514)
  • [refurb] Avoid recommending operator.itemgetter with dependence on lambda arguments (#​11574)
  • [flake8-simplify] Avoid recommending context manager in __enter__ implementations (#​11575)
  • Create intermediary directories for --output-file (#​11550)
  • Propagate reads on global variables (#​11584)
  • Treat all singledispatch arguments as runtime-required (#​11523)

v0.4.5

Compare Source

Ruff's language server is now in Beta

v0.4.5 marks the official Beta release of ruff server, an integrated language server built into Ruff.
ruff server supports the same feature set as ruff-lsp, powering linting, formatting, and
code fixes in Ruff's editor integrations -- but with superior performance and
no installation required. We'd love your feedback!

You can enable ruff server in the VS Code extension today.

To read more about this exciting milestone, check out our blog post!

Rule changes
  • [flake8-future-annotations] Reword future-rewritable-type-annotation (FA100) message (#​11381)
  • [isort] Expanded the set of standard-library modules to include _string, etc. (#​11374)
  • [pycodestyle] Consider soft keywords for E27 rules (#​11446)
  • [pyflakes] Recommend adding unused import bindings to __all__ (#​11314)
  • [pyflakes] Update documentation and deprecate ignore_init_module_imports (#​11436)
  • [pyupgrade] Mark quotes as unnecessary for non-evaluated annotations (#​11485)
Formatter
  • Avoid multiline quotes warning with quote-style = preserve (#​11490)
Server
  • Support Jupyter Notebook files (#​11206)
  • Support noqa comment code actions (#​11276)
  • Fix automatic configuration reloading (#​11492)
  • Fix several issues with configuration in Neovim and Helix (#​11497)
CLI
  • Add --output-format as a CLI option for ruff config (#​11438)
Bug fixes
  • Avoid PLE0237 for property with setter (#​11377)
  • Avoid TCH005 for if stmt with elif/else block (#​11376)
  • Avoid flagging __future__ annotations as required for non-evaluated type annotations (#​11414)
  • Check for ruff executable in 'bin' directory as installed by 'pip install --target'. (#​11450)
  • Sort edits prior to deduplicating in quotation fix (#​11452)
  • Treat escaped newline as valid sequence (#​11465)
  • [flake8-pie] Preserve parentheses in unnecessary-dict-kwargs (#​11372)
  • [pylint] Ignore __slots__ with dynamic values (#​11488)
  • [pylint] Remove try body from branch counting (#​11487)
  • [refurb] Respect operator precedence in FURB110 (#​11464)
Documentation
  • Add --preview to the README (#​11395)
  • Add Python 3.13 to list of allowed Python versions (#​11411)
  • Simplify Neovim setup documentation (#​11489)
  • Update CONTRIBUTING.md to reflect the new parser (#​11434)
  • Update server documentation with new migration guide (#​11499)
  • [pycodestyle] Clarify motivation for E713 and E714 (#​11483)
  • [pyflakes] Update docs to describe WAI behavior (F541) (#​11362)
  • [pylint] Clearly indicate what is counted as a branch (#​11423)

v0.4.4

Compare Source

Preview features
  • [pycodestyle] Ignore end-of-line comments when determining blank line rules (#​11342)
  • [pylint] Detect pathlib.Path.open calls in unspecified-encoding (PLW1514) (#​11288)
  • [flake8-pyi] Implement PYI059 (generic-not-last-base-class) (#​11233)
  • [flake8-pyi] Implement PYI062 (duplicate-literal-member) (#​11269)
Rule changes
  • [flake8-boolean-trap] Allow passing booleans as positional-only arguments in code such as set(True) (#​11287)
  • [flake8-bugbear] Ignore enum classes in cached-instance-method (B019) (#​11312)
Server
  • Expand tildes when resolving Ruff server configuration file (#​11283)
  • Fix ruff server hanging after Neovim closes (#​11291)
  • Editor settings are used by default if no file-based configuration exists (#​11266)
Bug fixes
  • [pylint] Consider with statements for too-many-branches (PLR0912) (#​11321)
  • [flake8-blind-except, tryceratops] Respect logged and re-raised expressions in nested statements (BLE001, TRY201) (#​11301)
  • Recognise assignments such as __all__ = builtins.list(["foo", "bar"]) as valid __all__ definitions (#​11335)

v0.4.3

Compare Source

Enhancements
Preview features
  • [refurb] Use function range for reimplemented-operator diagnostics (#​11271)
  • [refurb] Ignore methods in reimplemented-operator (FURB118) (#​11270)
  • [refurb] Implement fstring-number-format (FURB116) (#​10921)
  • [ruff] Implement redirected-noqa (RUF101) (#​11052)
  • [pyflakes] Distinguish between first-party and third-party imports for fix suggestions (#​11168)
Rule changes
  • [flake8-bugbear] Ignore non-abstract class attributes when enforcing B024 (#​11210)
  • [flake8-logging] Include inline instantiations when detecting loggers (#​11154)
  • [pylint] Also emit PLR0206 for properties with variadic parameters (#​11200)
  • [ruff] Detect duplicate codes as part of unused-noqa (RUF100) (#​10850)
Formatter
  • Avoid multiline expression if format specifier is present (#​11123)
LSP
  • Write ruff server setup guide for Helix (#​11183)
  • ruff server no longer hangs after shutdown (#​11222)
  • ruff server reads from a configuration TOML file in the user configuration directory if no local configuration exists (#​11225)
  • ruff server respects per-file-ignores configuration (#​11224)
  • ruff server: Support a custom TOML configuration file (#​11140)
  • ruff server: Support setting to prioritize project configuration over editor configuration (#​11086)
Bug fixes
  • Avoid debug assertion around NFKC renames (#​11249)
  • [pyflakes] Prioritize redefined-while-unused over unused-import (#​11173)
  • [ruff] Respect async expressions in comprehension bodies (#​11219)
  • [pygrep_hooks] Fix blanket-noqa panic when last line has noqa with no newline (PGH004) (#​11108)
  • [perflint] Ignore list-copy recommendations for async for loops (#​11250)
  • [pyflakes] Improve invalid-print-syntax documentation (#​11171)
Performance
  • Avoid allocations for isort module names (#​11251)
  • Build a separate ARM wheel for macOS (#​11149)
Windows
  • Increase the minimum requirement to Windows 10.

v0.4.2

Compare Source

Rule changes
  • [flake8-pyi] Allow for overloaded __exit__ and __aexit__ definitions (PYI036) (#​11057)
  • [pyupgrade] Catch usages of "%s" % var and provide an unsafe fix (UP031) (#​11019)
  • [refurb] Implement new rule that suggests min/max over sorted() (FURB192) (#​10868)
Server
  • Fix an issue with missing diagnostics for Neovim and Helix (#​11092)
  • Implement hover documentation for noqa codes (#​11096)
  • Introduce common Ruff configuration options with new server settings (#​11062)
Bug fixes
  • Use macos-12 for building release wheels to enable macOS 11 compatibility (#​11146)
  • [flake8-blind-expect] Allow raise from in BLE001 (#​11131)
  • [flake8-pyi] Allow simple assignments to None in enum class scopes (PYI026) (#​11128)
  • [flake8-simplify] Avoid raising SIM911 for non-zip attribute calls (#​11126)
  • [refurb] Avoid operator.itemgetter suggestion for single-item tuple (#​11095)
  • [ruff] Respect per-file-ignores for RUF100 with no other diagnostics (#​11058)
  • [ruff] Fix async comprehension false positive (RUF029) (#​11070)
Documentation
  • [flake8-bugbear] Document explicitly disabling strict zip (B905) (#​11040)
  • [flake8-type-checking] Mention lint.typing-modules in TCH001, TCH002, and TCH003 (#​11144)
  • [isort] Improve documentation around custom isort sections (#​11050)
  • [pylint] Fix documentation oversight for invalid-X-returns (#​11094)
Performance
  • Use matchit to resolve per-file settings (#​11111)

v0.4.1

Compare Source

Parser
  • Implement re-lexing logic for better error recovery (#​11845)
Rule changes
  • [flake8-copyright] Update CPY001 to check the first 4096 bytes instead of 1024 (#​11927)
  • [pycodestyle] Update E999 to show all syntax errors instead of just the first one (#​11900)
Server
  • Add tracing setup guide to Helix documentation (#​11883)
  • Add tracing setup guide to Neovim documentation (#​11884)
  • Defer notebook cell deletion to avoid an error message (#​11864)
Security
  • Guard against malicious ecosystem comment artifacts (#​11879)

v0.4.0

Compare Source

A new, hand-written parser

Ruff's new parser is >2x faster, which translates to a 20-40% speedup for all linting and formatting invocations.
There's a lot to say about this exciting change, so check out the blog post for more details!

See #​10036 for implementation details.

A new language server in Rust

With this release, we also want to highlight our new language server. ruff server is a Rust-powered language
server that comes built-in with Ruff. It can be used with any editor that supports the Language Server Protocol (LSP).
It uses a multi-threaded, lock-free architecture inspired by rust-analyzer and it will open the door for a lot
of exciting features. It’s also faster than our previous Python-based language server
-- but you probably guessed that already.

ruff server is only in alpha, but it has a lot of features that you can try out today:

  • Lints Python files automatically and shows quick-fixes when available
  • Formats Python files, with support for range formatting
  • Comes with commands for quickly performing actions: ruff.applyAutofix, ruff.applyFormat, and ruff.applyOrganizeImports
  • Supports source.fixAll and source.organizeImports source actions
  • Automatically reloads your project configuration when you change it

To setup ruff server with your editor, refer to the README.md.

Preview features
  • [pycodestyle] Do not trigger E3 rules on defs following a function/method with a dummy body (#​10704)
  • [pylint] Implement invalid-bytes-returned (E0308) (#​10959)
  • [pylint] Implement invalid-length-returned (E0303) (#​10963)
  • [pylint] Implement self-cls-assignment (W0642) (#​9267)
  • [pylint] Omit stubs from invalid-bool and invalid-str-return-type (#​11008)
  • [ruff] New rule unused-async (RUF029) to detect unneeded async keywords on functions (#​9966)
Rule changes
  • [flake8-bandit] Allow urllib.request.urlopen calls with static Request argument (S310) (#​10964)
  • [flake8-bugbear] Treat raise NotImplemented-only bodies as stub functions (B006) (#​10990)
  • [flake8-slots] Respect same-file Enum subclasses (SLOT000) (#​11006)
  • [pylint] Support inverted comparisons (PLR1730) (#​10920)
Linter
  • Improve handling of builtin symbols in linter rules (#​10919)
  • Improve display of rules in --show-settings (#​11003)
  • Improve inference capabilities of the BuiltinTypeChecker (#​10976)
  • Resolve classes and functions relative to script name (#​10965)
  • Improve performance of RuleTable::any_enabled (#​10971)
Server

This section is devoted to updates for our new language server, written in Rust.

  • Enable ruff-specific source actions (#​10916)
  • Refreshes diagnostics for open files when file configuration is changed (#​10988)
  • Important errors are now shown as popups (#​10951)
  • Introduce settings for directly configuring the linter and formatter (#​10984)
  • Resolve configuration for each document individually (#​10950)
  • Write a setup guide for Neovim (#​10987)
Configuration
  • Add RUFF_OUTPUT_FILE environment variable support (#​10992)
Bug fixes
  • Avoid non-augmented-assignment for reversed, non-commutative operators (PLR6104) (#​10909)
  • Limit commutative non-augmented-assignments to primitive data types (PLR6104) (#​10912)
  • Respect per-file-ignores for RUF100 on blanket # noqa (#​10908)
  • Consider if expression for parenthesized with items parsing (#​11010)
  • Consider binary expr for parenthesized with items parsing (#​11012)
  • Reset FOR_TARGET context for all kinds of parentheses (#​11009)

v0.3.7

Compare Source

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)

v0.3.6

Compare Source

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
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)

v0.3.5

Compare Source

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)

v0.3.4

Compare Source

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)

v0.3.3

Compare Source

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)

v0.3.2

Compare Source

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)

v0.3.1

Compare Source

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)

v0.3.0

Compare Source

This release introduces the new Ruff formatter 2024.2 style and adds a new lint rule to
detect invalid formatter suppression comments.

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)

v0.2.2

Compare Source

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.
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)
Performance
  • Use memchr for string lexing (#​9888)
  • Use memchr for tab-indentation detection (#​9853)
  • Reduce Result<Tok, LexicalError> size by using Box<str> instead of String (#​9885)
  • Reduce size of Expr from 80 to 64 bytes (#​9900)
  • Improve trailing comma rule performance (#​9867)
  • Remove unnecessary string cloning from the parser (#​9884)

v0.2.1

Compare Source

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)

v0.2.0

Compare Source

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:

Fixes for the following rules have been promoted from unsafe to safe:

The following behaviors have been stabilized:

Preview features
  • [refurb] Implement metaclass_abcmeta (FURB180) (#​9658)
  • Implement blank_line_after_nested_stub_class preview style (#​9155)
  • The preview rule and-or-ternary (PLR1706) was removed
Bug fixes
  • [flake8-async] Take pathlib.Path into account when analyzing async functions (#​9703)
  • [flake8-return] - fix indentation syntax error (RET505) (#​9705)
  • Detect multi-statement lines in else removal (#​9748)
  • RUF022, RUF023: never add two trailing commas to the end of a sequence (#​9698)
  • RUF023: Don't sort __match_args__, only __slots__ (#​9724)
  • [flake8-simplify] - Fix syntax error in autofix (SIM114) (#​9704)
  • [pylint] Show verbatim constant in magic-value-comparison (PLR2004) (#​9694)
  • Removing trailing whitespace inside multiline strings is unsafe (#​9744)
  • Support IfExp with dual string arms in invalid-envvar-default (#​9734)
  • [pylint] Add __mro_entries__ to known dunder methods (PLW3201) (#​9706)
Documentation
  • Removed rules are now retained in the documentation (#​9691)
  • Deprecated rules are now indicated in the documentation (#​9689)

v0.1.15

Compare Source

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)

v0.1.14

Compare Source

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)

v0.1.13

Compare Source

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)

v0.1.12

Compare Source

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)

v0.1.11

Compare Source

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)

v0.1.10

Compare Source

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)

v0.1.9

Compare Source

Breaking changes
  • Add site-packages to default exclusions (#​9188)
Preview features
  • Fix: Avoid parenthesizing subscript targets and values (#​9209)
  • [pylint] Implement too-many-locals (PLR0914) (#​9163)
  • Implement reimplemented_operator (FURB118) (#​9171)
  • Add a rule to detect string members in runtime-evaluated unions (#​9143)
  • Implement no_blank_line_before_class_docstring preview style (#​9154)
Rule changes
  • CONSTANT_CASE variables are improperly flagged for yoda violation (SIM300) (#​9164)
  • [flake8-pyi] Cover ParamSpecs and TypeVarTuples (PYI018) (#​9198)
  • [flake8-bugbear] Add fix for zip-without-explicit-strict (B905) (#​9176)
  • Add fix to automatically remove print and pprint statements (T201, T203) (#​9208)
  • Prefer Never to NoReturn in auto-typing in Python >= 3.11 (ANN201) (#​9213)
Formatter
  • can_omit_optional_parentheses: Exit early for unparenthesized expressions (#​9125)
  • Fix dynamic mode with doctests so that it doesn't exceed configured line width (#​9129)
  • Fix can_omit_optional_parentheses for expressions with a right most fstring (#​9124)
  • Add target_version to formatter options (#​9220)
CLI
  • Update ruff format --check to display message for already formatted files (#​9153)
Bug fixes
  • Reverse order of arguments for operator.contains (#​9192)
  • Iterate over lambdas in deferred type annotations (#​9175)
  • Fix panic in D208 with multibyte indent (#​9147)
  • Add support for NoReturn in auto-return-typing (#​9206)
  • Allow removal of typing from exempt-modules (#​9214)
  • Avoid mutable-class-default violations for Pydantic subclasses (#​9187)
  • Fix dropped union expressions for piped non-types in PYI055 autofix (#​9161)
  • Enable annotation quoting for multi-line expressions (#​9142)
  • Deduplicate edits when quoting annotations (#​9140)
  • Prevent invalid utf8 indexing in cell magic detection (#​9146)
  • Avoid nested quotations in auto-quoting fix (#​9168)
  • Add base-class inheritance detection to flake8-django rules (#​9151)
  • Avoid asyncio-dangling-task violations on shadowed bindings (#​9215)
Documentation
  • Fix blog post URL in changelog (#​9119)
  • Add error suppression hint for multi-line strings (#​9205)
  • Fix typo in SemanticModel.parent_expression docstring (#​9167)
  • Document link between import sorting and formatter (#​9117)

v0.1.8

Compare Source

This release includes opt-in support for formatting Python snippets within
docstrings via the docstring-code-format setting.
Check out the blog post for more details!

Preview features
  • Add "preserve" quote-style to mimic Black's skip-string-normalization (#​8822)
  • Implement prefer_splitting_right_hand_side_of_assignments preview style (#​8943)
  • [pycodestyle] Add fix for unexpected-spaces-around-keyword-parameter-equals (#​9072)
  • [pycodestyle] Add fix for comment-related whitespace rules (#​9075)
  • [pycodestyle] Allow sys.path modifications between imports (#​9047)
  • [refurb] Implement hashlib-digest-hex (FURB181) (#​9077)
Rule changes
  • Allow flake8-type-checking rules to automatically quote runtime-evaluated references (#​6001)
  • Allow transparent cell magics in Jupyter Notebooks (#​8911)
  • [flake8-annotations] Avoid ANN2xx fixes for abstract methods with empty bodies (#​9034)
  • [flake8-self] Ignore underscore references in type annotations (#​9036)
  • [pep8-naming] Allow class names when apps.get_model is a non-string (#​9065)
  • [pycodestyle] Allow matplotlib.use calls to intersperse imports (#​9094)
  • [pyflakes] Support fixing unused assignments in tuples by renaming variables (F841) (#​9107)
  • [pylint] Add fix for subprocess-run-without-check (PLW1510) (#​6708)
Formatter
  • Add docstring-code-format knob to enable docstring snippet formatting (#​8854)
  • Use double quotes for all docstrings, including single-quoted docstrings (#​9020)
  • Implement "dynamic" line width mode for docstring code formatting (#​9098)
  • Support reformatting Markdown code blocks (#​9030)
  • add support for formatting reStructuredText code snippets (#​9003)
  • Avoid trailing comma for single-argument with positional separator (#​9076)
  • Fix handling of trailing target comment (#​9051)
CLI
  • Hide unsafe fix suggestions when explicitly disabled (#​9095)
  • Add SARIF support to --output-format (#​9078)
Bug fixes
  • Apply unnecessary index rule prior to enumerate rewrite (#​9012)
  • [flake8-err-msg] Allow EM fixes even if msg variable is defined (#​9059)
  • [flake8-pie] Prevent keyword arguments duplication (#​8450)
  • [flake8-pie] Respect trailing comma in unnecessary-dict-kwargs (PIE804) (#​9015)
  • [flake8-raise] Avoid removing parentheses on ctypes.WinError (#​9027)
  • [isort] Avoid invalid combination of force-sort-within-types and lines-between-types (#​9041)
  • [isort] Ensure that from-style imports are always ordered first in __future__ (#​9039)
  • [pycodestyle] Allow tab indentation before keyword (#​9099)
  • [pylint] Ignore @overrides and @overloads for too-many-positional (#​9000)
  • [pyupgrade] Enable printf-string-formatting fix with comments on right-hand side (#​9037)
  • [refurb] Make math-constant (FURB152) rule more targeted (#​9054)
  • [refurb] Support floating-point base in redundant-log-base (FURB163) (#​9100)
  • [ruff] Detect unused-asyncio-dangling-task (RUF006) on unused assignments (#​9060)

v0.1.7

Compare Source

Preview features
  • Implement multiline dictionary and list hugging for preview style (#​8293)
  • Implement the fix_power_op_line_length preview style (#​8947)
  • Use Python version to determine typing rewrite safety (#​8919)
  • [flake8-annotations] Enable auto-return-type involving Optional and Union annotations (#​8885)
  • [flake8-bandit] Implement django-raw-sql (S611) (#​8651)
  • [flake8-bandit] Implement tarfile-unsafe-members (S202) (#​8829)
  • [flake8-pyi] Implement fix for unnecessary-literal-union (PYI030) (#​7934)
  • [flake8-simplify] Extend dict-get-with-none-default (SIM910) to non-literals (#​8762)
  • [pylint] - add unnecessary-list-index-lookup (PLR1736) + autofix (#​7999)
  • [pylint] - implement R0202 and R0203 with autofixes (#​8335)
  • [pylint] Implement repeated-keyword (PLe1132) (#​8706)
  • [pylint] Implement too-many-positional (PLR0917) (#​8995)
  • [pylint] Implement unnecessary-dict-index-lookup (PLR1733) (#​8036)
  • [refurb] Implement redundant-log-base (FURB163) (#​8842)
Rule changes
  • [flake8-boolean-trap] Allow booleans in @override methods (#​8882)
  • [flake8-bugbear] Avoid B015,B018 for last expression in a cell (#​8815)
  • [flake8-pie] Allow ellipses for enum values in stub files (#​8825)
  • [flake8-pyi] Check PEP 695 type aliases for snake-case-type-alias and t-suffixed-type-alias (#​8966)
  • [flake8-pyi] Check for kwarg and vararg NoReturn type annotations (#​8948)
  • [flake8-simplify] Omit select context managers from SIM117 (#​8801)
  • [pep8-naming] Allow Django model loads in non-lowercase-variable-in-function (N806) (#​8917)
  • [pycodestyle] Avoid E703 for last expression in a cell (#​8821)
  • [pycodestyle] Update E402 to work at cell level for notebooks (#​8872)
  • [pydocstyle] Avoid D100 for Jupyter Notebooks (#​8816)
  • [pylint] Implement fix for unspecified-encoding (PLW1514) (#​8928)
Formatter
  • Avoid unstable formatting in ellipsis-only body with trailing comment (#​8984)
  • Inline trailing comments for type alias similar to assignments (#​8941)
  • Insert trailing comma when function breaks with single argument (#​8921)
CLI
  • Update ruff check and ruff format to default to the current directory (#​8791)
  • Stop at the first resolved parent configuration (#​8864)
Configuration
  • [pylint] Default max-positional-args to max-args (#​8998)
  • [pylint] Add allow-dunder-method-names setting for bad-dunder-method-name (PLW3201) (#​8812)
  • [isort] Add support for from-first setting (#​8663)
  • [isort] Add support for length-sort settings (#​8841)
Bug fixes
  • Add support for @functools.singledispatch (#​8934)
  • Avoid off-by-one error in stripping noqa following multi-byte char (#​8979)
  • Avoid off-by-one error in with-item named expressions (#​8915)
  • Avoid syntax error via invalid ur string prefix (#​8971)
  • Avoid underflow in get_model matching (#​8965)
  • Avoid unnecessary index diagnostics when value is modified (#​8970)
  • Convert over-indentation rule to use number of characters (#​8983)
  • Detect implicit returns in auto-return-types (#​8952)
  • Fix start >= end error in over-indentation (#​8982)
  • Ignore @overload and @override methods for too-many-arguments checks (#​8954)
  • Lexer start of line is false only for Mode::Expression (#​8880)
  • Mark pydantic_settings.BaseSettings as having default copy semantics (#​8793)
  • Respect dictionary unpacking in NamedTuple assignments (#​8810)
  • Respect local subclasses in flake8-type-checking (#​8768)
  • Support type alias statements in simple statement positions (#​8916)
  • [flake8-annotations] Avoid filtering out un-representable types in return annotation (#​8881)
  • [flake8-pie] Retain extra ellipses in protocols and abstract methods (#​8769)
  • [flake8-pyi] Respect local enum subclasses in simple-defaults (PYI052) (#​8767)
  • [flake8-trio] Use correct range for TRIO115 fix (#​8933)
  • [flake8-trio] Use full arguments range for zero-sleep-call (#​8936)
  • [isort] fix: mark __main__ as first-party import (#​8805)
  • [pep8-naming] Avoid N806 errors for type alias statements (#​8785)
  • [perflint] Avoid PERF101 if there's an append in loop body (#​8809)
  • [pycodestyle] Allow space-before-colon after end-of-slice (#​8838)
  • [pydocstyle] Avoid non-character breaks in over-indentation (D208) (#​8866)
  • [pydocstyle] Ignore underlines when determining docstring logical lines (#​8929)
  • [pylint] Extend self-assigning-variable to multi-target assignments (#​8839)
  • [tryceratops] Avoid repeated triggers in nested tryceratops diagnostics (#​8772)
Documentation
  • Add advice for fixing RUF008 when mutability is not desired (#​8853)
  • Added the command to run ruff using pkgx to the installation.md (#​8955)
  • Document fix safety for flake8-comprehensions and some pyupgrade rules (#​8918)
  • Fix doc formatting for zero-sleep-call (#​8937)
  • Remove duplicate imports from os-stat documentation (#​8930)
  • Replace generated reference to MkDocs (#​8806)
  • Update Arch Linux package URL in installation.md (#​8802)
  • [flake8-pyi] Fix error in t-suffixed-type-alias (PYI043) example (#​8963)
  • [flake8-pyi] Improve motivation for custom-type-var-return-type (PYI019) (#​8766)

v0.1.6

Compare Source

Preview features
  • [flake8-boolean-trap] Extend boolean-type-hint-positional-argument (FBT001) to include booleans in unions (#​7501)
  • [flake8-pie] Extend reimplemented-list-builtin (PIE807) to dict reimplementations (#​8608)
  • [flake8-pie] Extend unnecessary-pass (PIE790) to include ellipses (...) (#​8641)
  • [flake8-pie] Implement fix for unnecessary-spread (PIE800) (#​8668)
  • [flake8-quotes] Implement unnecessary-escaped-quote (Q004) (#​8630)
  • [pycodestyle] Implement fix for multiple-spaces-after-keyword (E271) and multiple-spaces-before-keyword (E272) (#​8622)
  • [pycodestyle] Implement fix for multiple-spaces-after-operator (E222) and multiple-spaces-before-operator (E221) (#​8623)
  • [pyflakes] Extend is-literal (F632) to include comparisons against mutable initializers (#​8607)
  • [pylint] Implement redefined-argument-from-local (PLR1704) (#​8159)
  • [pylint] Implement fix for unnecessary-lambda (PLW0108) (#​8621)
  • [refurb] Implement if-expr-min-max (FURB136) (#​8664)
  • [refurb] Implement math-constant (FURB152) (#​8727)
Rule changes
  • [flake8-annotations] Add autotyping-like return type inference for annotation rules (#​8643)
  • [flake8-future-annotations] Implement fix for future-required-type-annotation (FA102) (#​8711)
  • [flake8-implicit-namespace-package] Avoid missing namespace violations in scripts with shebangs (#​8710)
  • [pydocstyle] Update over-indentation (D208) to preserve indentation offsets when fixing overindented lines (#​8699)
  • [pyupgrade] Refine timeout-error-alias (UP041) to remove false positives (#​8587)
Formatter
  • Fix instability in await formatting with fluent style (#​8676)
  • Compare formatted and unformatted ASTs during formatter tests (#​8624)
  • Preserve trailing semicolon for Notebooks (#​8590)
CLI
  • Improve debug printing for resolving origin of config settings (#​8729)
  • Write unchanged, excluded files to stdout when read via stdin (#​8596)
Configuration
  • [isort] Support disabling sections with no-sections = true (#​8657)
  • [pep8-naming] Support local and dynamic class- and static-method decorators (#​8592)
  • [pydocstyle] Allow overriding pydocstyle convention rules (#​8586)
Bug fixes
  • Avoid syntax error via importing trio.lowlevel (#​8730)
  • Omit unrolled augmented assignments in PIE794 (#​8634)
  • Slice source code instead of generating it for EM fixes (#​7746)
  • Allow whitespace around colon in slices for whitespace-before-punctuation (E203) (#​8654)
  • Use function range for no-self-use (#​8637)
  • F-strings doesn't contain bytes literal for PLW0129 (#​8675)
  • Improve detection of TYPE_CHECKING blocks imported from typing_extensions or _typeshed (#​8429)
  • Treat display as a builtin in IPython (#​8707)
  • Avoid FURB113 autofix if comments are present (#​8494)
  • Consider the new f-string tokens for flake8-commas (#​8582)
  • Remove erroneous bad-dunder-name reference (#​8742)
  • Avoid recommending Self usages in metaclasses (#​8639)
  • Detect runtime-evaluated base classes defined in the current file (#​8572)
  • Avoid inserting trailing commas within f-strings (#​8574)
  • Remove incorrect deprecation label for stdout and stderr (#​8743)
  • Fix unnecessary parentheses in UP007 fix (#​8610)
  • Remove repeated and erroneous scoped settings headers in docs (#​8670)
  • Trim trailing empty strings when converting to f-strings (#​8712)
  • Fix ordering for force-sort-within-sections (#​8665)
  • Run unicode prefix rule over tokens (#​8709)
  • Update UP032 to unescape curly braces in literal parts of converted strings (#​8697)
  • List all ipython builtins (#​8719)
Documentation
  • Document conventions in the FAQ (#​8638)
  • Redirect from rule codes to rule pages in docs (#​8636)
  • Fix permalink to convention setting (#​8575)

v0.1.5

Compare Source

Preview features
  • [flake8-bandit] Implement mako-templates (S702) (#​8533)
  • [flake8-trio] Implement TRIO105 (#​8490)
  • [flake8-trio] Implement TRIO109 (#​8534)
  • [flake8-trio] Implement TRIO110 (#​8537)
  • [flake8-trio] Implement TRIO115 (#​8486)
  • [refurb] Implement type-none-comparison (FURB169) (#​8487)
  • Flag all comparisons against builtin types in E721 (#​8491)
  • Make SIM118 fix as safe when the expression is a known dictionary (#​8525)
Formatter
  • Fix multiline lambda expression statement formatting (#​8466)
CLI
  • Add hidden --extension to override inference of source type from file extension (#​8373)
Configuration
  • Account for selector specificity when merging extend_unsafe_fixes and override extend_safe_fixes (#​8444)
  • Add support for disabling cache with RUFF_NO_CACHE environment variable (#​8538)
Bug fixes
  • [E721] Flag comparisons to memoryview (#​8485)
  • Allow collapsed-ellipsis bodies in other statements (#​8499)
  • Avoid D301 autofix for u prefixed strings (#​8495)
  • Only flag flake8-trio rules when trio import is present (#​8550)
  • Reject more syntactically invalid Python programs (#​8524)
  • Avoid raising TRIO115 violations for trio.sleep(...) calls with non-number values (#​8532)
  • Fix F841 false negative on assignment to multiple variables (#​8489)
Documentation
  • Fix link to isort known-first-party (#​8562)
  • Add notes on fix safety to a few rules (#​8500)
  • Add missing toml config tabs (#​8512)
  • Add instructions for configuration of Emacs (#​8488)
  • Improve detail link contrast in dark mode (#​8548)
  • Fix typo in example (#​8506)
  • Added tabs for configuration files in the documentation (#​8480)
  • Recommend project.requires-python over target-version (#​8513)
  • Add singleton escape hatch to B008 documentation (#​8501)
  • Fix tab configuration docs (#​8502)

v0.1.4

Compare Source

Preview features
  • [flake8-trio] Implement timeout-without-await (TRIO001) (#​8439)
  • [numpy] Implement NumPy 2.0 migration rule (NPY200) (#​7702)
  • [pylint] Implement bad-open-mode (W1501) (#​8294)
  • [pylint] Implement import-outside-toplevel (C0415) rule (#​5180)
  • [pylint] Implement useless-with-lock (W2101) (#​8321)
  • [pyupgrade] Implement timeout-error-alias (UP041) (#​8476)
  • [refurb] Implement isinstance-type-none (FURB168) (#​8308)
  • Detect confusable Unicode-to-Unicode units in RUF001, RUF002, and RUF003 (#​4430)
  • Add newline after module docstrings in preview style (#​8283)
Formatter
  • Add a note on line-too-long to the formatter docs (#​8314)
  • Preserve trailing statement semicolons when using fmt: skip (#​8273)
  • Preserve trailing semicolons when using fmt: off (#​8275)
  • Avoid duplicating linter-formatter compatibility warnings (#​8292)
  • Avoid inserting a newline after function docstrings (#​8375)
  • Insert newline between docstring and following own line comment (#​8216)
  • Split tuples in return positions by comma first (#​8280)
  • Avoid treating byte strings as docstrings (#​8350)
  • Add --line-length option to format command (#​8363)
  • Avoid parenthesizing unsplittable because of comments (#​8431)
CLI
  • Add --output-format to ruff rule and ruff linter (#​8203)
Bug fixes
  • Respect --force-exclude in lint.exclude and format.exclude (#​8393)
  • Respect --extend-per-file-ignores on the CLI (#​8329)
  • Extend bad-dunder-method-name to permit __index__ (#​8300)
  • Fix panic with 8 in octal escape (#​8356)
  • Avoid raising D300 when both triple quote styles are present (#​8462)
  • Consider unterminated f-strings in FStringRanges (#​8154)
  • Avoid including literal shell=True for truthy, non-True diagnostics (#​8359)
  • Avoid triggering single-element test for starred expressions (#​8433)
  • Detect and ignore Jupyter automagics (#​8398)
  • Fix invalid E231 error with f-strings (#​8369)
  • Avoid triggering NamedTuple rewrite with starred annotation (#​8434)
  • Avoid un-setting bracket flag in logical lines (#​8380)
  • Place 'r' prefix before 'f' for raw format strings (#​8464)
  • Remove trailing periods from NumPy 2.0 code actions (#​8475)
  • Fix bug where PLE1307 was raised when formatting %c with characters (#​8407)
  • Remove unicode flag from comparable (#​8440)
  • Improve B015 message (#​8295)
  • Use fixedOverflowWidgets for playground popover (#​8458)
  • Mark byte_bounds as a non-backwards-compatible NumPy 2.0 change (#​8474)
Internals
  • Add a dedicated cache directory per Ruff version (#​8333)
  • Allow selective caching for --fix and --diff (#​8316)
  • Improve performance of comment parsing (#​8193)
  • Improve performance of string parsing (#​8227)
  • Use a dedicated sort key for isort import sorting (#​7963)

v0.1.3

Compare Source

This release includes a variety of improvements to the Ruff formatter, removing several known and
unintentional deviations from Black.

Formatter
  • Avoid space around pow for None, True and False (#​8189)
  • Avoid sorting all paths in the format command (#​8181)
  • Insert necessary blank line between class and leading comments (#​8224)
  • Avoid introducing new parentheses in annotated assignments (#​8233)
  • Refine the warnings about incompatible linter options (#​8196)
  • Add test and basic implementation for formatter preview mode (#​8044)
  • Refine warning about incompatible isort settings (#​8192)
  • Only omit optional parentheses for starting or ending with parentheses (#​8238)
  • Use source type to determine parser mode for formatting (#​8205)
  • Don't warn about magic trailing comma when isort.force-single-line is true (#​8244)
  • Use SourceKind::diff for formatter (#​8240)
  • Fix fmt:off with trailing child comment (#​8234)
  • Formatter parentheses support for IpyEscapeCommand (#​8207)
Linter
  • [pylint] Add buffer methods to bad-dunder-method-name (PLW3201) exclusions (#​8190)
  • Match rule prefixes from external codes setting in unused-noqa (#​8177)
  • Use line-length setting for isort in lieu of pycodestyle.max-line-length (#​8235)
  • Update fix for unnecessary-paren-on-raise-exception to unsafe for unknown types (#​8231)
  • Correct quick fix message for W605 (#​8255)
Documentation
  • Fix typo in max-doc-length documentation (#​8201)
  • Improve documentation around linter-formatter conflicts (#​8257)
  • Fix link to error suppression documentation in unused-noqa (#​8172)
  • Add external option to unused-noqa documentation (#​8171)
  • Add title attribute to icons (#​8060)
  • Clarify unsafe case in RSE102 (#​8256)
  • Fix skipping formatting examples (#​8210)
  • docs: fix name of magic-trailing-comma option in README (#​8200)
  • Add note about scope of rule changing in versioning policy (#​8169)
  • Document: Fix default lint rules (#​8218)
  • Fix a wrong setting in configuration.md (#​8186)
  • Fix misspelled TOML headers in the tutorial (#​8209)

v0.1.2

Compare Source

This release includes the Beta version of the Ruff formatter — an extremely fast, Black-compatible Python formatter.
Try it today with ruff format! Check out the blog post and read the docs.

Preview features
  • [pylint] Implement non-ascii-module-import (C2403) (#​8056)
  • [pylint] implement non-ascii-name (C2401) (#​8038)
  • [pylint] Implement unnecessary-lambda (W0108) (#​7953)
  • [refurb] Implement read-whole-file (FURB101) (#​7682)
  • Add fix for E223, E224, and E242 (#​8143)
  • Add fix for E225, E226, E227, and E228 (#​8136)
  • Add fix for E252 (#​8142)
  • Add fix for E261 (#​8114)
  • Add fix for E273 and E274 (#​8144)
  • Add fix for E275 (#​8133)
  • Update SIM401 to catch ternary operations (#​7415)
  • Update E721 to allow is and is not for direct type comparisons (#​7905)
Rule changes
  • Add backports.strenum to deprecated-imports (#​8113)
  • Update SIM112 to ignore https_proxy, http_proxy, and no_proxy (#​8140)
  • Update fix for literal-membership (PLR6201) to be unsafe (#​8097)
  • Update fix for mutable-argument-defaults (B006) to be unsafe (#​8108)
Formatter
  • Change line-ending default to auto (#​8057)
  • Respect parenthesized generators in has_own_parentheses (#​8100)
  • Add caching to formatter (#​8089)
  • Remove --line-length option from format command (#​8131)
  • Add formatter to line-length documentation (#​8150)
  • Warn about incompatible formatter options (#​8088)
  • Fix range of unparenthesized tuple subject in match statement (#​8101)
  • Remove experimental formatter warning (#​8148)
  • Don't move type param opening parenthesis comment (#​8163)
  • Update versions in format benchmark script (#​8110)
  • Avoid loading files for cached format results (#​8134)
CLI
  • Show the ruff format command in help menus (#​8167)
  • Add ruff version command with long version display (#​8034)
Configuration
  • New pycodestyle.max-line-length option (#​8039)
Bug fixes
  • Detect sys.version_info slices in outdated-version-block (#​8112)
  • Avoid if-else simplification for TYPE_CHECKING blocks (#​8072)
  • Avoid false-positive print separator diagnostic with starred argument (#​8079)
Documentation
  • Fix message for too-many-arguments lint (#​8092)
  • Fix extend-unsafe-fixes and extend-safe-fixes example (#​8139)
  • Add links to flake8-import-conventions options (#​8115)
  • Rework the documentation to incorporate the Ruff formatter (#​7732)
  • Fix Options JSON schema description (#​8081)
  • Fix typo (pytext -> pytest) (#​8117)
  • Improve magic-value-comparison example in docs (#​8111)

v0.1.1

Compare Source

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)

v0.1.0

Compare Source

This is the first release which uses the CHANGELOG file. See GitHub Releases for prior changelog entries.

Read Ruff's new versioning policy.

Breaking changes
  • Unsafe fixes are no longer displayed or applied without opt-in (#​7769)
  • Drop formatting specific rules from the default set (#​7900)
  • The deprecated format setting has been removed (#​7984)
    • The format setting cannot be used to configure the output format, use output-format instead
    • The RUFF_FORMAT environment variable is ignored, use RUFF_OUTPUT_FORMAT instead
    • The --format option has been removed from ruff check, use --output-format instead
Rule changes
  • Extend reimplemented-starmap (FURB140) to catch calls with a single and starred argument (#​7768)
  • Improve cases covered by RUF015 (#​7848)
  • Update SIM15 to allow open followed by close (#​7916)
  • Respect msgspec.Struct default-copy semantics in RUF012 (#​7786)
  • Add sqlalchemy methods to `flake8-boolean-trap`` exclusion list (#​7874)
  • Add fix for PLR1714 (#​7910)
  • Add fix for PIE804 (#​7884)
  • Add fix for PLC0208 (#​7887)
  • Add fix for PYI055 (#​7886)
  • Update non-pep695-type-alias to require --unsafe-fixes outside of stub files (#​7836)
  • Improve fix message for UP018 (#​7913)
  • Update PLW3201 to support Enum sunder names (#​7987)
Preview features
  • Only show warnings for empty preview selectors when enabling rules (#​7842)
  • Add unnecessary-key-check to simplify key in dct and dct[key] to dct.get(key) (#​7895)
  • Add assignment-in-assert to prevent walrus expressions in assert statements (#​7856)
  • [refurb] Add single-item-membership-test (FURB171) (#​7815)
  • [pylint] Add and-or-ternary (R1706) (#​7811)

New rules are added in preview.

Configuration
  • Add unsafe-fixes setting (#​7769)
  • Add extend-safe-fixes and extend-unsafe-fixes for promoting and demoting fixes (#​7841)
CLI
  • Added --unsafe-fixes option for opt-in to display and apply unsafe fixes (#​7769)
  • Fix use of deprecated --format option in warning (#​7837)
  • Show changed files when running under --check (#​7788)
  • Write summary messages to stderr when fixing via stdin instead of omitting them (#​7838)
  • Update fix summary message in check --diff to include unsafe fix hints (#​7790)
  • Add notebook cell field to JSON output format (#​7664)
  • Rename applicability levels to Safe, Unsafe, and Display (#​7843)
Bug fixes
  • Fix bug where f-strings were allowed in match pattern literal (#​7857)
  • Fix SIM110 with a yield in the condition (#​7801)
  • Preserve trailing comments in C414 fixes (#​7775)
  • Check sequence type before triggering unnecessary-enumerate len suggestion (#​7781)
  • Use correct start location for class/function clause header (#​7802)
  • Fix incorrect fixes for SIM101 (#​7798)
  • Format comment before parameter default correctly (#​7870)
  • Fix E251 false positive inside f-strings (#​7894)
  • Allow bindings to be created and referenced within annotations (#​7885)
  • Show per-cell diffs when analyzing notebooks over stdin (#​7789)
  • Avoid curly brace escape in f-string format spec (#​7780)
  • Fix lexing single-quoted f-string with multi-line format spec (#​7787)
  • Consider nursery rules to be in-preview for ruff rule (#​7812)
  • Report precise location for invalid conversion flag (#​7809)
  • Visit pattern match guard as a boolean test (#​7911)
  • Respect --unfixable in ISC rules (#​7917)
  • Fix edge case with PIE804 (#​7922)
  • Show custom message in PTH118 for Path.joinpath with starred arguments (#​7852)
  • Fix false negative in outdated-version-block when using greater than comparisons (#​7920)
  • Avoid converting f-strings within Django gettext calls (#​7898)
  • Fix false positive in PLR6301 (#​7933)
  • Treat type aliases as typing-only expressions e.g. resolves false positive in TCH004 (#​7968)
  • Resolve cache-dir relative to project root (#​7962)
  • Respect subscripted base classes in type-checking rules e.g. resolves false positive in TCH003 (#​7954)
  • Fix JSON schema limit for line-length (#​7883)
  • Fix commented-out coalesce keyword (#​7876)
Documentation
  • Document reimplemented-starmap performance effects (#​7846)
  • Default to following the system dark/light mode (#​7888)
  • Add documentation for fixes (#​7901)
  • Fix typo in docs of PLR6301 (#​7831)
  • Update UP038 docs to note that it results in slower code (#​7872)
  • crlf -> cr-lf (#​7766)
  • Add an example of an unsafe fix (#​7924)
  • Fix documented examples for unnecessary-subscript-reversal (#​7774)
  • Correct error in tuple example in ruff formatter docs (#​7822)
  • Add versioning policy to documentation (#​7923)
  • Fix invalid code in FURB177 example (#​7832)
Formatter
  • Less scary ruff format message (#​7867)
  • Remove spaces from import statements (#​7859)
  • Formatter quoting for f-strings with triple quotes (#​7826)
  • Update ruff_python_formatter generate.py comment (#​7850)
  • Document one-call chaining deviation (#​7767)
  • Allow f-string modifications in line-shrinking cases (#​7818)
  • Add trailing comment deviation to README (#​7827)
  • Add trailing zero between dot and exponential (#​7956)
  • Force parentheses for power operations in unary expressions (#​7955)
Playground
  • Fix playground Quick Fix action (#​7824)

v0.0.292

Compare Source

What's Changed

Highlights

This release includes full support for Python 3.12 (out now!), including the new type parameter (PEP 695) and f-string syntaxes (PEP 701).

PEP 701 lifts many of the restrictions on f-strings that existed in the past, allowing for arbitrarily nested f-strings, consistent quote style within f-strings, and more, all of which are now supported by Ruff (thanks to @​dhruvmanila in https://github.com/astral-sh/ruff/pull/7376).

Breaking Changes
  • In the formatter, format.quote-style no longer affects triple-quoted strings, to align with common conventions as well as the guidance from PEP 8 and PEP 257 (see: https://github.com/astral-sh/ruff/pull/7680).
  • line-too-long (E501) now ignores trailing pragma comments (like # type: ignore and # noqa) when computing line length (see: https://github.com/astral-sh/ruff/pull/7692). This is similar to flake8-bugbear's methodology for detecting overlong lines, and ensures that adding pragmas like # noqa does not introduce further lint errors.
Rules
Settings
Bug Fixes
Other Changes

New Contributors

Full Changelog: https://github.com/astral-sh/ruff/compare/v0.0.291...v0.0.292

v0.0.291

Compare Source

What's Changed

Deprecations

The format command-line argument and configuration option has been renamed to output-format. While Ruff will continue to respect format when passed as a command-line argument or configuration option, this backwards-compatible support will be dropped in a future release. See: https://github.com/astral-sh/ruff/pull/7514.

Rules
Settings
Bug Fixes

New Contributors

Full Changelog: https://github.com/astral-sh/ruff/compare/v0.0.290...v0.0.291

v0.0.290

Compare Source

What's Changed

Rules
Settings
Bug Fixes
Preview

What's this section?

New Contributors

Full Changelog: https://github.com/astral-sh/ruff/compare/v0.0.289...v0.0.290


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [ruff](https://docs.astral.sh/ruff) ([source](https://github.com/astral-sh/ruff), [changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | dev | minor | `^0.0.289` -> `^0.7.0` | --- ### Release Notes <details> <summary>astral-sh/ruff (ruff)</summary> ### [`v0.7.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#073) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.2...0.7.3) ##### Preview features - Formatter: Disallow single-line implicit concatenated strings ([#&#8203;13928](https://github.com/astral-sh/ruff/pull/13928)) - \[`flake8-pyi`] Include all Python file types for `PYI006` and `PYI066` ([#&#8203;14059](https://github.com/astral-sh/ruff/pull/14059)) - \[`flake8-simplify`] Implement `split-of-static-string` (`SIM905`) ([#&#8203;14008](https://github.com/astral-sh/ruff/pull/14008)) - \[`refurb`] Implement `subclass-builtin` (`FURB189`) ([#&#8203;14105](https://github.com/astral-sh/ruff/pull/14105)) - \[`ruff`] Improve diagnostic messages and docs (`RUF031`, `RUF032`, `RUF034`) ([#&#8203;14068](https://github.com/astral-sh/ruff/pull/14068)) ##### Rule changes - Detect items that hash to same value in duplicate sets (`B033`, `PLC0208`) ([#&#8203;14064](https://github.com/astral-sh/ruff/pull/14064)) - \[`eradicate`] Better detection of IntelliJ language injection comments (`ERA001`) ([#&#8203;14094](https://github.com/astral-sh/ruff/pull/14094)) - \[`flake8-pyi`] Add autofix for `docstring-in-stub` (`PYI021`) ([#&#8203;14150](https://github.com/astral-sh/ruff/pull/14150)) - \[`flake8-pyi`] Update `duplicate-literal-member` (`PYI062`) to alawys provide an autofix ([#&#8203;14188](https://github.com/astral-sh/ruff/pull/14188)) - \[`pyflakes`] Detect items that hash to same value in duplicate dictionaries (`F601`) ([#&#8203;14065](https://github.com/astral-sh/ruff/pull/14065)) - \[`ruff`] Fix false positive for decorators (`RUF028`) ([#&#8203;14061](https://github.com/astral-sh/ruff/pull/14061)) ##### Bug fixes - Avoid parsing joint rule codes as distinct codes in `# noqa` ([#&#8203;12809](https://github.com/astral-sh/ruff/pull/12809)) - \[`eradicate`] ignore `# language=` in commented-out-code rule (ERA001) ([#&#8203;14069](https://github.com/astral-sh/ruff/pull/14069)) - \[`flake8-bugbear`] - do not run `mutable-argument-default` on stubs (`B006`) ([#&#8203;14058](https://github.com/astral-sh/ruff/pull/14058)) - \[`flake8-builtins`] Skip lambda expressions in `builtin-argument-shadowing (A002)` ([#&#8203;14144](https://github.com/astral-sh/ruff/pull/14144)) - \[`flake8-comprehension`] Also remove trailing comma while fixing `C409` and `C419` ([#&#8203;14097](https://github.com/astral-sh/ruff/pull/14097)) - \[`flake8-simplify`] Allow `open` without context manager in `return` statement (`SIM115`) ([#&#8203;14066](https://github.com/astral-sh/ruff/pull/14066)) - \[`pylint`] Respect hash-equivalent literals in `iteration-over-set` (`PLC0208`) ([#&#8203;14063](https://github.com/astral-sh/ruff/pull/14063)) - \[`pylint`] Update known dunder methods for Python 3.13 (`PLW3201`) ([#&#8203;14146](https://github.com/astral-sh/ruff/pull/14146)) - \[`pyupgrade`] - ignore kwarg unpacking for `UP044` ([#&#8203;14053](https://github.com/astral-sh/ruff/pull/14053)) - \[`refurb`] Parse more exotic decimal strings in `verbose-decimal-constructor` (`FURB157`) ([#&#8203;14098](https://github.com/astral-sh/ruff/pull/14098)) ##### Documentation - Add links to missing related options within rule documentations ([#&#8203;13971](https://github.com/astral-sh/ruff/pull/13971)) - Add rule short code to mkdocs tags to allow searching via rule codes ([#&#8203;14040](https://github.com/astral-sh/ruff/pull/14040)) ### [`v0.7.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#072) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.1...0.7.2) ##### Preview features - Fix formatting of single with-item with trailing comment ([#&#8203;14005](https://github.com/astral-sh/ruff/pull/14005)) - \[`pyupgrade`] Add PEP 646 `Unpack` conversion to `*` with fix (`UP044`) ([#&#8203;13988](https://github.com/astral-sh/ruff/pull/13988)) ##### Rule changes - Regenerate `known_stdlibs.rs` with stdlibs 2024.10.25 ([#&#8203;13963](https://github.com/astral-sh/ruff/pull/13963)) - \[`flake8-no-pep420`] Skip namespace package enforcement for PEP 723 scripts (`INP001`) ([#&#8203;13974](https://github.com/astral-sh/ruff/pull/13974)) ##### Server - Fix server panic when undoing an edit ([#&#8203;14010](https://github.com/astral-sh/ruff/pull/14010)) ##### Bug fixes - Fix issues in discovering ruff in pip build environments ([#&#8203;13881](https://github.com/astral-sh/ruff/pull/13881)) - \[`flake8-type-checking`] Fix false positive for `singledispatchmethod` (`TCH003`) ([#&#8203;13941](https://github.com/astral-sh/ruff/pull/13941)) - \[`flake8-type-checking`] Treat return type of `singledispatch` as runtime-required (`TCH003`) ([#&#8203;13957](https://github.com/astral-sh/ruff/pull/13957)) ##### Documentation - \[`flake8-simplify`] Include caveats of enabling `if-else-block-instead-of-if-exp` (`SIM108`) ([#&#8203;14019](https://github.com/astral-sh/ruff/pull/14019)) ### [`v0.7.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#071) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.0...0.7.1) ##### Preview features - Fix `E221` and `E222` to flag missing or extra whitespace around `==` operator ([#&#8203;13890](https://github.com/astral-sh/ruff/pull/13890)) - Formatter: Alternate quotes for strings inside f-strings in preview ([#&#8203;13860](https://github.com/astral-sh/ruff/pull/13860)) - Formatter: Join implicit concatenated strings when they fit on a line ([#&#8203;13663](https://github.com/astral-sh/ruff/pull/13663)) - \[`pylint`] Restrict `iteration-over-set` to only work on sets of literals (`PLC0208`) ([#&#8203;13731](https://github.com/astral-sh/ruff/pull/13731)) ##### Rule changes - \[`flake8-type-checking`] Support auto-quoting when annotations contain quotes ([#&#8203;11811](https://github.com/astral-sh/ruff/pull/11811)) ##### Server - Avoid indexing the workspace for single-file mode ([#&#8203;13770](https://github.com/astral-sh/ruff/pull/13770)) ##### Bug fixes - Make `ARG002` compatible with `EM101` when raising `NotImplementedError` ([#&#8203;13714](https://github.com/astral-sh/ruff/pull/13714)) ##### Other changes - Introduce more Docker tags for Ruff (similar to uv) ([#&#8203;13274](https://github.com/astral-sh/ruff/pull/13274)) ### [`v0.7.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#070) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.9...0.7.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.7.0) for a migration guide and overview of the changes! ##### Breaking changes - The pytest rules `PT001` and `PT023` now default to omitting the decorator parentheses when there are no arguments ([#&#8203;12838](https://github.com/astral-sh/ruff/pull/12838), [#&#8203;13292](https://github.com/astral-sh/ruff/pull/13292)). This was a change that we attempted to make in Ruff v0.6.0, but only partially made due to an error on our part. See the [blog post](https://astral.sh/blog/ruff-v0.7.0) for more details. - The `useless-try-except` rule (in our `tryceratops` category) has been recoded from `TRY302` to `TRY203` ([#&#8203;13502](https://github.com/astral-sh/ruff/pull/13502)). This ensures Ruff's code is consistent with the same rule in the [`tryceratops`](https://github.com/guilatrova/tryceratops) linter. - The `lint.allow-unused-imports` setting has been removed ([#&#8203;13677](https://github.com/astral-sh/ruff/pull/13677)). Use [`lint.pyflakes.allow-unused-imports`](https://docs.astral.sh/ruff/settings/#lint_pyflakes_allowed-unused-imports) instead. ##### Formatter preview style - Normalize implicit concatenated f-string quotes per part ([#&#8203;13539](https://github.com/astral-sh/ruff/pull/13539)) ##### Preview linter features - \[`refurb`] implement `hardcoded-string-charset` (FURB156) ([#&#8203;13530](https://github.com/astral-sh/ruff/pull/13530)) - \[`refurb`] Count codepoints not bytes for `slice-to-remove-prefix-or-suffix (FURB188)` ([#&#8203;13631](https://github.com/astral-sh/ruff/pull/13631)) ##### Rule changes - \[`pylint`] Mark `PLE1141` fix as unsafe ([#&#8203;13629](https://github.com/astral-sh/ruff/pull/13629)) - \[`flake8-async`] Consider async generators to be "checkpoints" for `cancel-scope-no-checkpoint` (`ASYNC100`) ([#&#8203;13639](https://github.com/astral-sh/ruff/pull/13639)) - \[`flake8-bugbear`] Do not suggest setting parameter `strict=` to `False` in `B905` diagnostic message ([#&#8203;13656](https://github.com/astral-sh/ruff/pull/13656)) - \[`flake8-todos`] Only flag the word "TODO", not words starting with "todo" (`TD006`) ([#&#8203;13640](https://github.com/astral-sh/ruff/pull/13640)) - \[`pycodestyle`] Fix whitespace-related false positives and false negatives inside type-parameter lists (`E231`, `E251`) ([#&#8203;13704](https://github.com/astral-sh/ruff/pull/13704)) - \[`flake8-simplify`] Stabilize preview behavior for `SIM115` so that the rule can detect files being opened from a wider range of standard-library functions ([#&#8203;12959](https://github.com/astral-sh/ruff/pull/12959)). ##### CLI - Add explanation of fixable in `--statistics` command ([#&#8203;13774](https://github.com/astral-sh/ruff/pull/13774)) ##### Bug fixes - \[`pyflakes`] Allow `ipytest` cell magic (`F401`) ([#&#8203;13745](https://github.com/astral-sh/ruff/pull/13745)) - \[`flake8-use-pathlib`] Fix `PTH123` false positive when `open` is passed a file descriptor ([#&#8203;13616](https://github.com/astral-sh/ruff/pull/13616)) - \[`flake8-bandit`] Detect patterns from multi line SQL statements (`S608`) ([#&#8203;13574](https://github.com/astral-sh/ruff/pull/13574)) - \[`flake8-pyi`] - Fix dropped expressions in `PYI030` autofix ([#&#8203;13727](https://github.com/astral-sh/ruff/pull/13727)) ### [`v0.6.9`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#069) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.8...0.6.9) ##### Preview features - Fix codeblock dynamic line length calculation for indented docstring examples ([#&#8203;13523](https://github.com/astral-sh/ruff/pull/13523)) - \[`refurb`] Mark `FURB118` fix as unsafe ([#&#8203;13613](https://github.com/astral-sh/ruff/pull/13613)) ##### Rule changes - \[`pydocstyle`] Don't raise `D208` when last line is non-empty ([#&#8203;13372](https://github.com/astral-sh/ruff/pull/13372)) - \[`pylint`] Preserve trivia (i.e. comments) in `PLR5501` autofix ([#&#8203;13573](https://github.com/astral-sh/ruff/pull/13573)) ##### Configuration - \[`pyflakes`] Add `allow-unused-imports` setting for `unused-import` rule (`F401`) ([#&#8203;13601](https://github.com/astral-sh/ruff/pull/13601)) ##### Bug fixes - Support ruff discovery in pip build environments ([#&#8203;13591](https://github.com/astral-sh/ruff/pull/13591)) - \[`flake8-bugbear`] Avoid short circuiting `B017` for multiple context managers ([#&#8203;13609](https://github.com/astral-sh/ruff/pull/13609)) - \[`pylint`] Do not offer an invalid fix for `PLR1716` when the comparisons contain parenthesis ([#&#8203;13527](https://github.com/astral-sh/ruff/pull/13527)) - \[`pyupgrade`] Fix `UP043` to apply to `collections.abc.Generator` and `collections.abc.AsyncGenerator` ([#&#8203;13611](https://github.com/astral-sh/ruff/pull/13611)) - \[`refurb`] Fix handling of slices in tuples for `FURB118`, e.g., `x[:, 1]` ([#&#8203;13518](https://github.com/astral-sh/ruff/pull/13518)) ##### Documentation - Update GitHub Action link to `astral-sh/ruff-action` ([#&#8203;13551](https://github.com/astral-sh/ruff/pull/13551)) ### [`v0.6.8`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#068) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.7...0.6.8) ##### Preview features - Remove unnecessary parentheses around `match case` clauses ([#&#8203;13510](https://github.com/astral-sh/ruff/pull/13510)) - Parenthesize overlong `if` guards in `match..case` clauses ([#&#8203;13513](https://github.com/astral-sh/ruff/pull/13513)) - Detect basic wildcard imports in `ruff analyze graph` ([#&#8203;13486](https://github.com/astral-sh/ruff/pull/13486)) - \[`pylint`] Implement `boolean-chained-comparison` (`R1716`) ([#&#8203;13435](https://github.com/astral-sh/ruff/pull/13435)) ##### Rule changes - \[`lake8-simplify`] Detect `SIM910` when using variadic keyword arguments, i.e., `**kwargs` ([#&#8203;13503](https://github.com/astral-sh/ruff/pull/13503)) - \[`pyupgrade`] Avoid false negatives with non-reference shadowed bindings of loop variables (`UP028`) ([#&#8203;13504](https://github.com/astral-sh/ruff/pull/13504)) ##### Bug fixes - Detect tuples bound to variadic positional arguments i.e. `*args` ([#&#8203;13512](https://github.com/astral-sh/ruff/pull/13512)) - Exit gracefully on broken pipe errors ([#&#8203;13485](https://github.com/astral-sh/ruff/pull/13485)) - Avoid panic when analyze graph hits broken pipe ([#&#8203;13484](https://github.com/astral-sh/ruff/pull/13484)) ##### Performance - Reuse `BTreeSets` in module resolver ([#&#8203;13440](https://github.com/astral-sh/ruff/pull/13440)) - Skip traversal for non-compound statements ([#&#8203;13441](https://github.com/astral-sh/ruff/pull/13441)) ### [`v0.6.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#067) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.6...0.6.7) ##### Preview features - Add Python version support to ruff analyze CLI ([#&#8203;13426](https://github.com/astral-sh/ruff/pull/13426)) - Add `exclude` support to `ruff analyze` ([#&#8203;13425](https://github.com/astral-sh/ruff/pull/13425)) - Fix parentheses around return type annotations ([#&#8203;13381](https://github.com/astral-sh/ruff/pull/13381)) ##### Rule changes - \[`pycodestyle`] Fix: Don't autofix if the first line ends in a question mark? (D400) ([#&#8203;13399](https://github.com/astral-sh/ruff/pull/13399)) ##### Bug fixes - Respect `lint.exclude` in ruff check `--add-noqa` ([#&#8203;13427](https://github.com/astral-sh/ruff/pull/13427)) ##### Performance - Avoid tracking module resolver files in Salsa ([#&#8203;13437](https://github.com/astral-sh/ruff/pull/13437)) - Use `forget` for module resolver database ([#&#8203;13438](https://github.com/astral-sh/ruff/pull/13438)) ### [`v0.6.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#066) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.5...0.6.6) ##### Preview features - \[`refurb`] Skip `slice-to-remove-prefix-or-suffix` (`FURB188`) when non-trivial slice steps are present ([#&#8203;13405](https://github.com/astral-sh/ruff/pull/13405)) - Add a subcommand to generate dependency graphs ([#&#8203;13402](https://github.com/astral-sh/ruff/pull/13402)) ##### Formatter - Fix placement of inline parameter comments ([#&#8203;13379](https://github.com/astral-sh/ruff/pull/13379)) ##### Server - Fix off-by one error in the `LineIndex::offset` calculation ([#&#8203;13407](https://github.com/astral-sh/ruff/pull/13407)) ##### Bug fixes - \[`fastapi`] Respect FastAPI aliases in route definitions ([#&#8203;13394](https://github.com/astral-sh/ruff/pull/13394)) - \[`pydocstyle`] Respect word boundaries when detecting function signature in docs ([#&#8203;13388](https://github.com/astral-sh/ruff/pull/13388)) ##### Documentation - Add backlinks to rule overview linter ([#&#8203;13368](https://github.com/astral-sh/ruff/pull/13368)) - Fix documentation for editor vim plugin ALE ([#&#8203;13348](https://github.com/astral-sh/ruff/pull/13348)) - Fix rendering of `FURB188` docs ([#&#8203;13406](https://github.com/astral-sh/ruff/pull/13406)) ### [`v0.6.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#065) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.4...0.6.5) ##### Preview features - \[`pydoclint`] Ignore `DOC201` when function name is "**new**" ([#&#8203;13300](https://github.com/astral-sh/ruff/pull/13300)) - \[`refurb`] Implement `slice-to-remove-prefix-or-suffix` (`FURB188`) ([#&#8203;13256](https://github.com/astral-sh/ruff/pull/13256)) ##### Rule changes - \[`eradicate`] Ignore script-comments with multiple end-tags (`ERA001`) ([#&#8203;13283](https://github.com/astral-sh/ruff/pull/13283)) - \[`pyflakes`] Improve error message for `UndefinedName` when a builtin was added in a newer version than specified in Ruff config (`F821`) ([#&#8203;13293](https://github.com/astral-sh/ruff/pull/13293)) ##### Server - Add support for extensionless Python files for server ([#&#8203;13326](https://github.com/astral-sh/ruff/pull/13326)) - Fix configuration inheritance for configurations specified in the LSP settings ([#&#8203;13285](https://github.com/astral-sh/ruff/pull/13285)) ##### Bug fixes - \[`ruff`] Handle unary operators in `decimal-from-float-literal` (`RUF032`) ([#&#8203;13275](https://github.com/astral-sh/ruff/pull/13275)) ##### CLI - Only include rules with diagnostics in SARIF metadata ([#&#8203;13268](https://github.com/astral-sh/ruff/pull/13268)) ##### Playground - Add "Copy as pyproject.toml/ruff.toml" and "Paste from TOML" ([#&#8203;13328](https://github.com/astral-sh/ruff/pull/13328)) - Fix errors not shown for restored snippet on page load ([#&#8203;13262](https://github.com/astral-sh/ruff/pull/13262)) ### [`v0.6.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#064) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.3...0.6.4) ##### Preview features - \[`flake8-builtins`] Use dynamic builtins list based on Python version ([#&#8203;13172](https://github.com/astral-sh/ruff/pull/13172)) - \[`pydoclint`] Permit yielding `None` in `DOC402` and `DOC403` ([#&#8203;13148](https://github.com/astral-sh/ruff/pull/13148)) - \[`pylint`] Update diagnostic message for `PLW3201` ([#&#8203;13194](https://github.com/astral-sh/ruff/pull/13194)) - \[`ruff`] Implement `post-init-default` (`RUF033`) ([#&#8203;13192](https://github.com/astral-sh/ruff/pull/13192)) - \[`ruff`] Implement useless if-else (`RUF034`) ([#&#8203;13218](https://github.com/astral-sh/ruff/pull/13218)) ##### Rule changes - \[`flake8-pyi`] Respect `pep8_naming.classmethod-decorators` settings when determining if a method is a classmethod in `custom-type-var-return-type` (`PYI019`) ([#&#8203;13162](https://github.com/astral-sh/ruff/pull/13162)) - \[`flake8-pyi`] Teach various rules that annotations might be stringized ([#&#8203;12951](https://github.com/astral-sh/ruff/pull/12951)) - \[`pylint`] Avoid `no-self-use` for `attrs`-style validators ([#&#8203;13166](https://github.com/astral-sh/ruff/pull/13166)) - \[`pylint`] Recurse into subscript subexpressions when searching for list/dict lookups (`PLR1733`, `PLR1736`) ([#&#8203;13186](https://github.com/astral-sh/ruff/pull/13186)) - \[`pyupgrade`] Detect `aiofiles.open` calls in `UP015` ([#&#8203;13173](https://github.com/astral-sh/ruff/pull/13173)) - \[`pyupgrade`] Mark `sys.version_info[0] < 3` and similar comparisons as outdated (`UP036`) ([#&#8203;13175](https://github.com/astral-sh/ruff/pull/13175)) ##### CLI - Enrich messages of SARIF results ([#&#8203;13180](https://github.com/astral-sh/ruff/pull/13180)) - Handle singular case for incompatible rules warning in `ruff format` output ([#&#8203;13212](https://github.com/astral-sh/ruff/pull/13212)) ##### Bug fixes - \[`pydocstyle`] Improve heuristics for detecting Google-style docstrings ([#&#8203;13142](https://github.com/astral-sh/ruff/pull/13142)) - \[`refurb`] Treat `sep` arguments with effects as unsafe removals (`FURB105`) ([#&#8203;13165](https://github.com/astral-sh/ruff/pull/13165)) ### [`v0.6.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#063) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.2...0.6.3) ##### Preview features - \[`flake8-simplify`] Extend `open-file-with-context-handler` to work with `dbm.sqlite3` (`SIM115`) ([#&#8203;13104](https://github.com/astral-sh/ruff/pull/13104)) - \[`pycodestyle`] Disable `E741` in stub files (`.pyi`) ([#&#8203;13119](https://github.com/astral-sh/ruff/pull/13119)) - \[`pydoclint`] Avoid `DOC201` on explicit returns in functions that only return `None` ([#&#8203;13064](https://github.com/astral-sh/ruff/pull/13064)) ##### Rule changes - \[`flake8-async`] Disable check for `asyncio` before Python 3.11 (`ASYNC109`) ([#&#8203;13023](https://github.com/astral-sh/ruff/pull/13023)) ##### Bug fixes - \[`FastAPI`] Avoid introducing invalid syntax in fix for `fast-api-non-annotated-dependency` (`FAST002`) ([#&#8203;13133](https://github.com/astral-sh/ruff/pull/13133)) - \[`flake8-implicit-str-concat`] Normalize octals before merging concatenated strings in `single-line-implicit-string-concatenation` (`ISC001`) ([#&#8203;13118](https://github.com/astral-sh/ruff/pull/13118)) - \[`flake8-pytest-style`] Improve help message for `pytest-incorrect-mark-parentheses-style` (`PT023`) ([#&#8203;13092](https://github.com/astral-sh/ruff/pull/13092)) - \[`pylint`] Avoid autofix for calls that aren't `min` or `max` as starred expression (`PLW3301`) ([#&#8203;13089](https://github.com/astral-sh/ruff/pull/13089)) - \[`ruff`] Add `datetime.time`, `datetime.tzinfo`, and `datetime.timezone` as immutable function calls (`RUF009`) ([#&#8203;13109](https://github.com/astral-sh/ruff/pull/13109)) - \[`ruff`] Extend comment deletion for `RUF100` to include trailing text from `noqa` directives while preserving any following comments on the same line, if any ([#&#8203;13105](https://github.com/astral-sh/ruff/pull/13105)) - Fix dark theme on initial page load for the Ruff playground ([#&#8203;13077](https://github.com/astral-sh/ruff/pull/13077)) ### [`v0.6.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#062) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.1...0.6.2) ##### Preview features - \[`flake8-simplify`] Extend `open-file-with-context-handler` to work with other standard-library IO modules (`SIM115`) ([#&#8203;12959](https://github.com/astral-sh/ruff/pull/12959)) - \[`ruff`] Avoid `unused-async` for functions with FastAPI route decorator (`RUF029`) ([#&#8203;12938](https://github.com/astral-sh/ruff/pull/12938)) - \[`ruff`] Ignore `fstring-missing-syntax` (`RUF027`) for `fastAPI` paths ([#&#8203;12939](https://github.com/astral-sh/ruff/pull/12939)) - \[`ruff`] Implement check for Decimal called with a float literal (RUF032) ([#&#8203;12909](https://github.com/astral-sh/ruff/pull/12909)) ##### Rule changes - \[`flake8-bugbear`] Update diagnostic message when expression is at the end of function (`B015`) ([#&#8203;12944](https://github.com/astral-sh/ruff/pull/12944)) - \[`flake8-pyi`] Skip type annotations in `string-or-bytes-too-long` (`PYI053`) ([#&#8203;13002](https://github.com/astral-sh/ruff/pull/13002)) - \[`flake8-type-checking`] Always recognise relative imports as first-party ([#&#8203;12994](https://github.com/astral-sh/ruff/pull/12994)) - \[`flake8-unused-arguments`] Ignore unused arguments on stub functions (`ARG001`) ([#&#8203;12966](https://github.com/astral-sh/ruff/pull/12966)) - \[`pylint`] Ignore augmented assignment for `self-cls-assignment` (`PLW0642`) ([#&#8203;12957](https://github.com/astral-sh/ruff/pull/12957)) ##### Server - Show full context in error log messages ([#&#8203;13029](https://github.com/astral-sh/ruff/pull/13029)) ##### Bug fixes - \[`pep8-naming`] Don't flag `from` imports following conventional import names (`N817`) ([#&#8203;12946](https://github.com/astral-sh/ruff/pull/12946)) - \[`pylint`] - Allow `__new__` methods to have `cls` as their first argument even if decorated with `@staticmethod` for `bad-staticmethod-argument` (`PLW0211`) ([#&#8203;12958](https://github.com/astral-sh/ruff/pull/12958)) ##### Documentation - Add `hyperfine` installation instructions; update `hyperfine` code samples ([#&#8203;13034](https://github.com/astral-sh/ruff/pull/13034)) - Expand note to use Ruff with other language server in Kate ([#&#8203;12806](https://github.com/astral-sh/ruff/pull/12806)) - Update example for `PT001` as per the new default behavior ([#&#8203;13019](https://github.com/astral-sh/ruff/pull/13019)) - \[`perflint`] Improve docs for `try-except-in-loop` (`PERF203`) ([#&#8203;12947](https://github.com/astral-sh/ruff/pull/12947)) - \[`pydocstyle`] Add reference to `lint.pydocstyle.ignore-decorators` setting to rule docs ([#&#8203;12996](https://github.com/astral-sh/ruff/pull/12996)) ### [`v0.6.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#061) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.0...0.6.1) This is a hotfix release to address an issue with `ruff-pre-commit`. In v0.6, Ruff changed its behavior to lint and format Jupyter notebooks by default; however, due to an oversight, these files were still excluded by default if Ruff was run via pre-commit, leading to inconsistent behavior. This has [now been fixed](https://github.com/astral-sh/ruff-pre-commit/pull/96). ##### Preview features - \[`fastapi`] Implement `fast-api-unused-path-parameter` (`FAST003`) ([#&#8203;12638](https://github.com/astral-sh/ruff/pull/12638)) ##### Rule changes - \[`pylint`] Rename `too-many-positional` to `too-many-positional-arguments` (`R0917`) ([#&#8203;12905](https://github.com/astral-sh/ruff/pull/12905)) ##### Server - Fix crash when applying "fix-all" code-action to notebook cells ([#&#8203;12929](https://github.com/astral-sh/ruff/pull/12929)) ##### Other changes - \[`flake8-naming`]: Respect import conventions (`N817`) ([#&#8203;12922](https://github.com/astral-sh/ruff/pull/12922)) ### [`v0.6.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#060) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.7...0.6.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.6.0) for a migration guide and overview of the changes! ##### Breaking changes See also, the "Remapped rules" section which may result in disabled rules. - Lint and format Jupyter Notebook by default ([#&#8203;12878](https://github.com/astral-sh/ruff/pull/12878)). - Detect imports in `src` layouts by default for `isort` rules ([#&#8203;12848](https://github.com/astral-sh/ruff/pull/12848)) - The pytest rules `PT001` and `PT023` now default to omitting the decorator parentheses when there are no arguments ([#&#8203;12838](https://github.com/astral-sh/ruff/pull/12838)). ##### Deprecations The following rules are now deprecated: - [`pytest-missing-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-missing-fixture-name-underscore/) (`PT004`) - [`pytest-incorrect-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-incorrect-fixture-name-underscore/) (`PT005`) - [`unpacked-list-comprehension`](https://docs.astral.sh/ruff/rules/unpacked-list-comprehension/) (`UP027`) ##### Remapped rules The following rules have been remapped to new rule codes: - [`unnecessary-dict-comprehension-for-iterable`](https://docs.astral.sh/ruff/rules/unnecessary-dict-comprehension-for-iterable/): `RUF025` to `C420` ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`singledispatch-method`](https://docs.astral.sh/ruff/rules/singledispatch-method/) (`PLE1519`) - [`singledispatchmethod-function`](https://docs.astral.sh/ruff/rules/singledispatchmethod-function/) (`PLE1520`) - [`bad-staticmethod-argument`](https://docs.astral.sh/ruff/rules/bad-staticmethod-argument/) (`PLW0211`) - [`if-stmt-min-max`](https://docs.astral.sh/ruff/rules/if-stmt-min-max/) (`PLR1730`) - [`invalid-bytes-return-type`](https://docs.astral.sh/ruff/rules/invalid-bytes-return-type/) (`PLE0308`) - [`invalid-hash-return-type`](https://docs.astral.sh/ruff/rules/invalid-hash-return-type/) (`PLE0309`) - [`invalid-index-return-type`](https://docs.astral.sh/ruff/rules/invalid-index-return-type/) (`PLE0305`) - [`invalid-length-return-type`](https://docs.astral.sh/ruff/rules/invalid-length-return-type/) (`PLEE303`) - [`self-or-cls-assignment`](https://docs.astral.sh/ruff/rules/self-or-cls-assignment/) (`PLW0642`) - [`byte-string-usage`](https://docs.astral.sh/ruff/rules/byte-string-usage/) (`PYI057`) - [`duplicate-literal-member`](https://docs.astral.sh/ruff/rules/duplicate-literal-member/) (`PYI062`) - [`redirected-noqa`](https://docs.astral.sh/ruff/rules/redirected-noqa/) (`RUF101`) The following behaviors have been stabilized: - [`cancel-scope-no-checkpoint`](https://docs.astral.sh/ruff/rules/cancel-scope-no-checkpoint/) (`ASYNC100`): Support `asyncio` and `anyio` context mangers. - [`async-function-with-timeout`](https://docs.astral.sh/ruff/rules/async-function-with-timeout/) (`ASYNC109`): Support `asyncio` and `anyio` context mangers. - [`async-busy-wait`](https://docs.astral.sh/ruff/rules/async-busy-wait/) (`ASYNC110`): Support `asyncio` and `anyio` context mangers. - [`async-zero-sleep`](https://docs.astral.sh/ruff/rules/async-zero-sleep/) (`ASYNC115`): Support `anyio` context mangers. - [`long-sleep-not-forever`](https://docs.astral.sh/ruff/rules/long-sleep-not-forever/) (`ASYNC116`): Support `anyio` context mangers. The following fixes have been stabilized: - [`superfluous-else-return`](https://docs.astral.sh/ruff/rules/superfluous-else-return/) (`RET505`) - [`superfluous-else-raise`](https://docs.astral.sh/ruff/rules/superfluous-else-raise/) (`RET506`) - [`superfluous-else-continue`](https://docs.astral.sh/ruff/rules/superfluous-else-continue/) (`RET507`) - [`superfluous-else-break`](https://docs.astral.sh/ruff/rules/superfluous-else-break/) (`RET508`) ##### Preview features - \[`flake8-simplify`] Further simplify to binary in preview for (`SIM108`) ([#&#8203;12796](https://github.com/astral-sh/ruff/pull/12796)) - \[`pyupgrade`] Show violations without auto-fix (`UP031`) ([#&#8203;11229](https://github.com/astral-sh/ruff/pull/11229)) ##### Rule changes - \[`flake8-import-conventions`] Add `xml.etree.ElementTree` to default conventions ([#&#8203;12455](https://github.com/astral-sh/ruff/pull/12455)) - \[`flake8-pytest-style`] Add a space after comma in CSV output (`PT006`) ([#&#8203;12853](https://github.com/astral-sh/ruff/pull/12853)) ##### Server - Show a message for incorrect settings ([#&#8203;12781](https://github.com/astral-sh/ruff/pull/12781)) ##### Bug fixes - \[`flake8-async`] Do not lint yield in context manager (`ASYNC100`) ([#&#8203;12896](https://github.com/astral-sh/ruff/pull/12896)) - \[`flake8-comprehensions`] Do not lint `async for` comprehensions (`C419`) ([#&#8203;12895](https://github.com/astral-sh/ruff/pull/12895)) - \[`flake8-return`] Only add return `None` at end of a function (`RET503`) ([#&#8203;11074](https://github.com/astral-sh/ruff/pull/11074)) - \[`flake8-type-checking`] Avoid treating `dataclasses.KW_ONLY` as typing-only (`TCH003`) ([#&#8203;12863](https://github.com/astral-sh/ruff/pull/12863)) - \[`pep8-naming`] Treat `type(Protocol)` et al as metaclass base (`N805`) ([#&#8203;12770](https://github.com/astral-sh/ruff/pull/12770)) - \[`pydoclint`] Don't enforce returns and yields in abstract methods (`DOC201`, `DOC202`) ([#&#8203;12771](https://github.com/astral-sh/ruff/pull/12771)) - \[`ruff`] Skip tuples with slice expressions in (`RUF031`) ([#&#8203;12768](https://github.com/astral-sh/ruff/pull/12768)) - \[`ruff`] Ignore unparenthesized tuples in subscripts when the subscript is a type annotation or type alias (`RUF031`) ([#&#8203;12762](https://github.com/astral-sh/ruff/pull/12762)) - \[`ruff`] Ignore template strings passed to logging and `builtins._()` calls (`RUF027`) ([#&#8203;12889](https://github.com/astral-sh/ruff/pull/12889)) - \[`ruff`] Do not remove parens for tuples with starred expressions in Python <=3.10 (`RUF031`) ([#&#8203;12784](https://github.com/astral-sh/ruff/pull/12784)) - Evaluate default parameter values for a function in that function's enclosing scope ([#&#8203;12852](https://github.com/astral-sh/ruff/pull/12852)) ##### Other changes - Respect VS Code cell metadata when detecting the language of Jupyter Notebook cells ([#&#8203;12864](https://github.com/astral-sh/ruff/pull/12864)) - Respect `kernelspec` notebook metadata when detecting the preferred language for a Jupyter Notebook ([#&#8203;12875](https://github.com/astral-sh/ruff/pull/12875)) ### [`v0.5.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#057) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.6...0.5.7) ##### Preview features - \[`flake8-comprehensions`] Account for list and set comprehensions in `unnecessary-literal-within-tuple-call` (`C409`) ([#&#8203;12657](https://github.com/astral-sh/ruff/pull/12657)) - \[`flake8-pyi`] Add autofix for `future-annotations-in-stub` (`PYI044`) ([#&#8203;12676](https://github.com/astral-sh/ruff/pull/12676)) - \[`flake8-return`] Avoid syntax error when auto-fixing `RET505` with mixed indentation (space and tabs) ([#&#8203;12740](https://github.com/astral-sh/ruff/pull/12740)) - \[`pydoclint`] Add `docstring-missing-yields` (`DOC402`) and `docstring-extraneous-yields` (`DOC403`) ([#&#8203;12538](https://github.com/astral-sh/ruff/pull/12538)) - \[`pydoclint`] Avoid `DOC201` if docstring begins with "Return", "Returns", "Yield", or "Yields" ([#&#8203;12675](https://github.com/astral-sh/ruff/pull/12675)) - \[`pydoclint`] Deduplicate collected exceptions after traversing function bodies (`DOC501`) ([#&#8203;12642](https://github.com/astral-sh/ruff/pull/12642)) - \[`pydoclint`] Ignore `DOC` errors for stub functions ([#&#8203;12651](https://github.com/astral-sh/ruff/pull/12651)) - \[`pydoclint`] Teach rules to understand reraised exceptions as being explicitly raised (`DOC501`, `DOC502`) ([#&#8203;12639](https://github.com/astral-sh/ruff/pull/12639)) - \[`ruff`] Implement `incorrectly-parenthesized-tuple-in-subscript` (`RUF031`) ([#&#8203;12480](https://github.com/astral-sh/ruff/pull/12480)) - \[`ruff`] Mark `RUF023` fix as unsafe if `__slots__` is not a set and the binding is used elsewhere ([#&#8203;12692](https://github.com/astral-sh/ruff/pull/12692)) ##### Rule changes - \[`refurb`] Add autofix for `implicit-cwd` (`FURB177`) ([#&#8203;12708](https://github.com/astral-sh/ruff/pull/12708)) - \[`ruff`] Add autofix for `zip-instead-of-pairwise` (`RUF007`) ([#&#8203;12663](https://github.com/astral-sh/ruff/pull/12663)) - \[`tryceratops`] Add `BaseException` to `raise-vanilla-class` rule (`TRY002`) ([#&#8203;12620](https://github.com/astral-sh/ruff/pull/12620)) ##### Server - Ignore non-file workspace URL; Ruff will display a warning notification in this case ([#&#8203;12725](https://github.com/astral-sh/ruff/pull/12725)) ##### CLI - Fix cache invalidation for nested `pyproject.toml` files ([#&#8203;12727](https://github.com/astral-sh/ruff/pull/12727)) ##### Bug fixes - \[`flake8-async`] Fix false positives with multiple `async with` items (`ASYNC100`) ([#&#8203;12643](https://github.com/astral-sh/ruff/pull/12643)) - \[`flake8-bandit`] Avoid false-positives for list concatenations in SQL construction (`S608`) ([#&#8203;12720](https://github.com/astral-sh/ruff/pull/12720)) - \[`flake8-bugbear`] Treat `return` as equivalent to `break` (`B909`) ([#&#8203;12646](https://github.com/astral-sh/ruff/pull/12646)) - \[`flake8-comprehensions`] Set comprehensions not a violation for `sum` in `unnecessary-comprehension-in-call` (`C419`) ([#&#8203;12691](https://github.com/astral-sh/ruff/pull/12691)) - \[`flake8-simplify`] Parenthesize conditions based on precedence when merging if arms (`SIM114`) ([#&#8203;12737](https://github.com/astral-sh/ruff/pull/12737)) - \[`pydoclint`] Try both 'Raises' section styles when convention is unspecified (`DOC501`) ([#&#8203;12649](https://github.com/astral-sh/ruff/pull/12649)) ### [`v0.5.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#056) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.5...0.5.6) Ruff 0.5.6 automatically enables linting and formatting of notebooks in *preview mode*. You can opt-out of this behavior by adding `*.ipynb` to the `extend-exclude` setting. ```toml [tool.ruff] extend-exclude = ["*.ipynb"] ``` ##### Preview features - Enable notebooks by default in preview mode ([#&#8203;12621](https://github.com/astral-sh/ruff/pull/12621)) - \[`flake8-builtins`] Implement import, lambda, and module shadowing ([#&#8203;12546](https://github.com/astral-sh/ruff/pull/12546)) - \[`pydoclint`] Add `docstring-missing-returns` (`DOC201`) and `docstring-extraneous-returns` (`DOC202`) ([#&#8203;12485](https://github.com/astral-sh/ruff/pull/12485)) ##### Rule changes - \[`flake8-return`] Exempt cached properties and other property-like decorators from explicit return rule (`RET501`) ([#&#8203;12563](https://github.com/astral-sh/ruff/pull/12563)) ##### Server - Make server panic hook more error resilient ([#&#8203;12610](https://github.com/astral-sh/ruff/pull/12610)) - Use `$/logTrace` for server trace logs in Zed and VS Code ([#&#8203;12564](https://github.com/astral-sh/ruff/pull/12564)) - Keep track of deleted cells for reorder change request ([#&#8203;12575](https://github.com/astral-sh/ruff/pull/12575)) ##### Configuration - \[`flake8-implicit-str-concat`] Always allow explicit multi-line concatenations when implicit concatenations are banned ([#&#8203;12532](https://github.com/astral-sh/ruff/pull/12532)) ##### Bug fixes - \[`flake8-async`] Avoid flagging `asyncio.timeout`s as unused when the context manager includes `asyncio.TaskGroup` ([#&#8203;12605](https://github.com/astral-sh/ruff/pull/12605)) - \[`flake8-slots`] Avoid recommending `__slots__` for classes that inherit from more than `namedtuple` ([#&#8203;12531](https://github.com/astral-sh/ruff/pull/12531)) - \[`isort`] Avoid marking required imports as unused ([#&#8203;12537](https://github.com/astral-sh/ruff/pull/12537)) - \[`isort`] Preserve trailing inline comments on import-from statements ([#&#8203;12498](https://github.com/astral-sh/ruff/pull/12498)) - \[`pycodestyle`] Add newlines before comments (`E305`) ([#&#8203;12606](https://github.com/astral-sh/ruff/pull/12606)) - \[`pycodestyle`] Don't attach comments with mismatched indents ([#&#8203;12604](https://github.com/astral-sh/ruff/pull/12604)) - \[`pyflakes`] Fix preview-mode bugs in `F401` when attempting to autofix unused first-party submodule imports in an `__init__.py` file ([#&#8203;12569](https://github.com/astral-sh/ruff/pull/12569)) - \[`pylint`] Respect start index in `unnecessary-list-index-lookup` ([#&#8203;12603](https://github.com/astral-sh/ruff/pull/12603)) - \[`pyupgrade`] Avoid recommending no-argument super in `slots=True` dataclasses ([#&#8203;12530](https://github.com/astral-sh/ruff/pull/12530)) - \[`pyupgrade`] Use colon rather than dot formatting for integer-only types ([#&#8203;12534](https://github.com/astral-sh/ruff/pull/12534)) - Fix NFKC normalization bug when removing unused imports ([#&#8203;12571](https://github.com/astral-sh/ruff/pull/12571)) ##### Other changes - Consider more stdlib decorators to be property-like ([#&#8203;12583](https://github.com/astral-sh/ruff/pull/12583)) - Improve handling of metaclasses in various linter rules ([#&#8203;12579](https://github.com/astral-sh/ruff/pull/12579)) - Improve consistency between linter rules in determining whether a function is property ([#&#8203;12581](https://github.com/astral-sh/ruff/pull/12581)) ### [`v0.5.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#055) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.4...0.5.5) ##### Preview features - \[`fastapi`] Implement `fastapi-redundant-response-model` (`FAST001`) and `fastapi-non-annotated-dependency`(`FAST002`) ([#&#8203;11579](https://github.com/astral-sh/ruff/pull/11579)) - \[`pydoclint`] Implement `docstring-missing-exception` (`DOC501`) and `docstring-extraneous-exception` (`DOC502`) ([#&#8203;11471](https://github.com/astral-sh/ruff/pull/11471)) ##### Rule changes - \[`numpy`] Fix NumPy 2.0 rule for `np.alltrue` and `np.sometrue` ([#&#8203;12473](https://github.com/astral-sh/ruff/pull/12473)) - \[`numpy`] Ignore `NPY201` inside `except` blocks for compatibility with older numpy versions ([#&#8203;12490](https://github.com/astral-sh/ruff/pull/12490)) - \[`pep8-naming`] Avoid applying `ignore-names` to `self` and `cls` function names (`N804`, `N805`) ([#&#8203;12497](https://github.com/astral-sh/ruff/pull/12497)) ##### Formatter - Fix incorrect placement of leading function comment with type params ([#&#8203;12447](https://github.com/astral-sh/ruff/pull/12447)) ##### Server - Do not bail code action resolution when a quick fix is requested ([#&#8203;12462](https://github.com/astral-sh/ruff/pull/12462)) ##### Bug fixes - Fix `Ord` implementation of `cmp_fix` ([#&#8203;12471](https://github.com/astral-sh/ruff/pull/12471)) - Raise syntax error for unparenthesized generator expression in multi-argument call ([#&#8203;12445](https://github.com/astral-sh/ruff/pull/12445)) - \[`pydoclint`] Fix panic in `DOC501` reported in [#&#8203;12428](https://github.com/astral-sh/ruff/pull/12428) ([#&#8203;12435](https://github.com/astral-sh/ruff/pull/12435)) - \[`flake8-bugbear`] Allow singleton tuples with starred expressions in `B013` ([#&#8203;12484](https://github.com/astral-sh/ruff/pull/12484)) ##### Documentation - Add Eglot setup guide for Emacs editor ([#&#8203;12426](https://github.com/astral-sh/ruff/pull/12426)) - Add note about the breaking change in `nvim-lspconfig` ([#&#8203;12507](https://github.com/astral-sh/ruff/pull/12507)) - Add note to include notebook files for native server ([#&#8203;12449](https://github.com/astral-sh/ruff/pull/12449)) - Add setup docs for Zed editor ([#&#8203;12501](https://github.com/astral-sh/ruff/pull/12501)) ### [`v0.5.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#054) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.3...0.5.4) ##### Rule changes - \[`ruff`] Rename `RUF007` to `zip-instead-of-pairwise` ([#&#8203;12399](https://github.com/astral-sh/ruff/pull/12399)) ##### Bug fixes - \[`flake8-builtins`] Avoid shadowing diagnostics for `@override` methods ([#&#8203;12415](https://github.com/astral-sh/ruff/pull/12415)) - \[`flake8-comprehensions`] Insert parentheses for multi-argument generators ([#&#8203;12422](https://github.com/astral-sh/ruff/pull/12422)) - \[`pydocstyle`] Handle escaped docstrings within docstring (`D301`) ([#&#8203;12192](https://github.com/astral-sh/ruff/pull/12192)) ##### Documentation - Fix GitHub link to Neovim setup ([#&#8203;12410](https://github.com/astral-sh/ruff/pull/12410)) - Fix `output-format` default in settings reference ([#&#8203;12409](https://github.com/astral-sh/ruff/pull/12409)) ### [`v0.5.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#053) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.2...0.5.3) **Ruff 0.5.3 marks the stable release of the Ruff language server and introduces revamped [documentation](https://docs.astral.sh/ruff/editors), including [setup guides for your editor of choice](https://docs.astral.sh/ruff/editors/setup) and [the language server itself](https://docs.astral.sh/ruff/editors/settings)**. ##### Preview features - Formatter: Insert empty line between suite and alternative branch after function/class definition ([#&#8203;12294](https://github.com/astral-sh/ruff/pull/12294)) - \[`pyupgrade`] Implement `unnecessary-default-type-args` (`UP043`) ([#&#8203;12371](https://github.com/astral-sh/ruff/pull/12371)) ##### Rule changes - \[`flake8-bugbear`] Detect enumerate iterations in `loop-iterator-mutation` (`B909`) ([#&#8203;12366](https://github.com/astral-sh/ruff/pull/12366)) - \[`flake8-bugbear`] Remove `discard`, `remove`, and `pop` allowance for `loop-iterator-mutation` (`B909`) ([#&#8203;12365](https://github.com/astral-sh/ruff/pull/12365)) - \[`pylint`] Allow `repeated-equality-comparison` for mixed operations (`PLR1714`) ([#&#8203;12369](https://github.com/astral-sh/ruff/pull/12369)) - \[`pylint`] Ignore `self` and `cls` when counting arguments (`PLR0913`) ([#&#8203;12367](https://github.com/astral-sh/ruff/pull/12367)) - \[`pylint`] Use UTF-8 as default encoding in `unspecified-encoding` fix (`PLW1514`) ([#&#8203;12370](https://github.com/astral-sh/ruff/pull/12370)) ##### Server - Build settings index in parallel for the native server ([#&#8203;12299](https://github.com/astral-sh/ruff/pull/12299)) - Use fallback settings when indexing the project ([#&#8203;12362](https://github.com/astral-sh/ruff/pull/12362)) - Consider `--preview` flag for `server` subcommand for the linter and formatter ([#&#8203;12208](https://github.com/astral-sh/ruff/pull/12208)) ##### Bug fixes - \[`flake8-comprehensions`] Allow additional arguments for `sum` and `max` comprehensions (`C419`) ([#&#8203;12364](https://github.com/astral-sh/ruff/pull/12364)) - \[`pylint`] Avoid dropping extra boolean operations in `repeated-equality-comparison` (`PLR1714`) ([#&#8203;12368](https://github.com/astral-sh/ruff/pull/12368)) - \[`pylint`] Consider expression before statement when determining binding kind (`PLR1704`) ([#&#8203;12346](https://github.com/astral-sh/ruff/pull/12346)) ##### Documentation - Add docs for Ruff language server ([#&#8203;12344](https://github.com/astral-sh/ruff/pull/12344)) - Migrate to standalone docs repo ([#&#8203;12341](https://github.com/astral-sh/ruff/pull/12341)) - Update versioning policy for editor integration ([#&#8203;12375](https://github.com/astral-sh/ruff/pull/12375)) ##### Other changes - Publish Wasm API to npm ([#&#8203;12317](https://github.com/astral-sh/ruff/pull/12317)) ### [`v0.5.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#052) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.1...0.5.2) ##### Preview features - Use `space` separator before parenthesized expressions in comprehensions with leading comments ([#&#8203;12282](https://github.com/astral-sh/ruff/pull/12282)) - \[`flake8-async`] Update `ASYNC100` to include `anyio` and `asyncio` ([#&#8203;12221](https://github.com/astral-sh/ruff/pull/12221)) - \[`flake8-async`] Update `ASYNC109` to include `anyio` and `asyncio` ([#&#8203;12236](https://github.com/astral-sh/ruff/pull/12236)) - \[`flake8-async`] Update `ASYNC110` to include `anyio` and `asyncio` ([#&#8203;12261](https://github.com/astral-sh/ruff/pull/12261)) - \[`flake8-async`] Update `ASYNC115` to include `anyio` and `asyncio` ([#&#8203;12262](https://github.com/astral-sh/ruff/pull/12262)) - \[`flake8-async`] Update `ASYNC116` to include `anyio` and `asyncio` ([#&#8203;12266](https://github.com/astral-sh/ruff/pull/12266)) ##### Rule changes - \[`flake8-return`] Exempt properties from explicit return rule (`RET501`) ([#&#8203;12243](https://github.com/astral-sh/ruff/pull/12243)) - \[`numpy`] Add `np.NAN`-to-`np.nan` diagnostic ([#&#8203;12292](https://github.com/astral-sh/ruff/pull/12292)) - \[`refurb`] Make `list-reverse-copy` an unsafe fix ([#&#8203;12303](https://github.com/astral-sh/ruff/pull/12303)) ##### Server - Consider `include` and `extend-include` settings in native server ([#&#8203;12252](https://github.com/astral-sh/ruff/pull/12252)) - Include nested configurations in settings reloading ([#&#8203;12253](https://github.com/astral-sh/ruff/pull/12253)) ##### CLI - Omit code frames for fixes with empty ranges ([#&#8203;12304](https://github.com/astral-sh/ruff/pull/12304)) - Warn about formatter incompatibility for `D203` ([#&#8203;12238](https://github.com/astral-sh/ruff/pull/12238)) ##### Bug fixes - Make cache-write failures non-fatal on Windows ([#&#8203;12302](https://github.com/astral-sh/ruff/pull/12302)) - Treat `not` operations as boolean tests ([#&#8203;12301](https://github.com/astral-sh/ruff/pull/12301)) - \[`flake8-bandit`] Avoid `S310` violations for HTTP-safe f-strings ([#&#8203;12305](https://github.com/astral-sh/ruff/pull/12305)) - \[`flake8-bandit`] Support explicit string concatenations in S310 HTTP detection ([#&#8203;12315](https://github.com/astral-sh/ruff/pull/12315)) - \[`flake8-bandit`] fix S113 false positive for httpx without `timeout` argument ([#&#8203;12213](https://github.com/astral-sh/ruff/pull/12213)) - \[`pycodestyle`] Remove "non-obvious" allowance for E721 ([#&#8203;12300](https://github.com/astral-sh/ruff/pull/12300)) - \[`pyflakes`] Consider `with` blocks as single-item branches for redefinition analysis ([#&#8203;12311](https://github.com/astral-sh/ruff/pull/12311)) - \[`refurb`] Restrict forwarding for `newline` argument in `open()` calls to Python versions >= 3.10 ([#&#8203;12244](https://github.com/astral-sh/ruff/pull/12244)) ##### Documentation - Update help and documentation to reflect `--output-format full` default ([#&#8203;12248](https://github.com/astral-sh/ruff/pull/12248)) ##### Performance - Use more threads when discovering Python files ([#&#8203;12258](https://github.com/astral-sh/ruff/pull/12258)) ### [`v0.5.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#051) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.0...0.5.1) ##### Preview features - \[`flake8-bugbear`] Implement mutable-contextvar-default (B039) ([#&#8203;12113](https://github.com/astral-sh/ruff/pull/12113)) - \[`pycodestyle`] Whitespace after decorator (`E204`) ([#&#8203;12140](https://github.com/astral-sh/ruff/pull/12140)) - \[`pytest`] Reverse `PT001` and `PT0023` defaults ([#&#8203;12106](https://github.com/astral-sh/ruff/pull/12106)) ##### Rule changes - Enable token-based rules on source with syntax errors ([#&#8203;11950](https://github.com/astral-sh/ruff/pull/11950)) - \[`flake8-bandit`] Detect `httpx` for `S113` ([#&#8203;12174](https://github.com/astral-sh/ruff/pull/12174)) - \[`numpy`] Update `NPY201` to include exception deprecations ([#&#8203;12065](https://github.com/astral-sh/ruff/pull/12065)) - \[`pylint`] Generate autofix for `duplicate-bases` (`PLE0241`) ([#&#8203;12105](https://github.com/astral-sh/ruff/pull/12105)) ##### Server - Avoid syntax error notification for source code actions ([#&#8203;12148](https://github.com/astral-sh/ruff/pull/12148)) - Consider the content of the new cells during notebook sync ([#&#8203;12203](https://github.com/astral-sh/ruff/pull/12203)) - Fix replacement edit range computation ([#&#8203;12171](https://github.com/astral-sh/ruff/pull/12171)) ##### Bug fixes - Disable auto-fix when source has syntax errors ([#&#8203;12134](https://github.com/astral-sh/ruff/pull/12134)) - Fix cache key collisions for paths with separators ([#&#8203;12159](https://github.com/astral-sh/ruff/pull/12159)) - Make `requires-python` inference robust to `==` ([#&#8203;12091](https://github.com/astral-sh/ruff/pull/12091)) - Use char-wise width instead of `str`-width ([#&#8203;12135](https://github.com/astral-sh/ruff/pull/12135)) - \[`pycodestyle`] Avoid `E275` if keyword followed by comma ([#&#8203;12136](https://github.com/astral-sh/ruff/pull/12136)) - \[`pycodestyle`] Avoid `E275` if keyword is followed by a semicolon ([#&#8203;12095](https://github.com/astral-sh/ruff/pull/12095)) - \[`pylint`] Skip [dummy variables](https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx) for `PLR1704` ([#&#8203;12190](https://github.com/astral-sh/ruff/pull/12190)) ##### Performance - Remove allocation in `parse_identifier` ([#&#8203;12103](https://github.com/astral-sh/ruff/pull/12103)) - Use `CompactString` for `Identifier` AST node ([#&#8203;12101](https://github.com/astral-sh/ruff/pull/12101)) ### [`v0.5.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#050) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.10...0.5.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.5.0) for a migration guide and overview of the changes! ##### Breaking changes See also, the "Remapped rules" section which may result in disabled rules. - Follow the XDG specification to discover user-level configurations on macOS (same as on other Unix platforms) - Selecting `ALL` now excludes deprecated rules - The released archives now include an extra level of nesting, which can be removed with `--strip-components=1` when untarring. - The release artifact's file name no longer includes the version tag. This enables users to install via `/latest` URLs on GitHub. - The diagnostic ranges for some `flake8-bandit` rules were modified ([#&#8203;10667](https://github.com/astral-sh/ruff/pull/10667)). ##### Deprecations The following rules are now deprecated: - [`syntax-error`](https://docs.astral.sh/ruff/rules/syntax-error/) (`E999`): Syntax errors are now always shown ##### Remapped rules The following rules have been remapped to new rule codes: - [`blocking-http-call-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-http-call-in-async-function/): `ASYNC100` to `ASYNC210` - [`open-sleep-or-subprocess-in-async-function`](https://docs.astral.sh/ruff/rules/open-sleep-or-subprocess-in-async-function/): `ASYNC101` split into `ASYNC220`, `ASYNC221`, `ASYNC230`, and `ASYNC251` - [`blocking-os-call-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-os-call-in-async-function/): `ASYNC102` has been merged into `ASYNC220` and `ASYNC221` - [`trio-timeout-without-await`](https://docs.astral.sh/ruff/rules/trio-timeout-without-await/): `TRIO100` to `ASYNC100` - [`trio-sync-call`](https://docs.astral.sh/ruff/rules/trio-sync-call/): `TRIO105` to `ASYNC105` - [`trio-async-function-with-timeout`](https://docs.astral.sh/ruff/rules/trio-async-function-with-timeout/): `TRIO109` to `ASYNC109` - [`trio-unneeded-sleep`](https://docs.astral.sh/ruff/rules/trio-unneeded-sleep/): `TRIO110` to `ASYNC110` - [`trio-zero-sleep-call`](https://docs.astral.sh/ruff/rules/trio-zero-sleep-call/): `TRIO115` to `ASYNC115` - [`repeated-isinstance-calls`](https://docs.astral.sh/ruff/rules/repeated-isinstance-calls/): `PLR1701` to `SIM101` ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`mutable-fromkeys-value`](https://docs.astral.sh/ruff/rules/mutable-fromkeys-value/) (`RUF024`) - [`default-factory-kwarg`](https://docs.astral.sh/ruff/rules/default-factory-kwarg/) (`RUF026`) - [`django-extra`](https://docs.astral.sh/ruff/rules/django-extra/) (`S610`) - [`manual-dict-comprehension`](https://docs.astral.sh/ruff/rules/manual-dict-comprehension/) (`PERF403`) - [`print-empty-string`](https://docs.astral.sh/ruff/rules/print-empty-string/) (`FURB105`) - [`readlines-in-for`](https://docs.astral.sh/ruff/rules/readlines-in-for/) (`FURB129`) - [`if-expr-min-max`](https://docs.astral.sh/ruff/rules/if-expr-min-max/) (`FURB136`) - [`bit-count`](https://docs.astral.sh/ruff/rules/bit-count/) (`FURB161`) - [`redundant-log-base`](https://docs.astral.sh/ruff/rules/redundant-log-base/) (`FURB163`) - [`regex-flag-alias`](https://docs.astral.sh/ruff/rules/regex-flag-alias/) (`FURB167`) - [`isinstance-type-none`](https://docs.astral.sh/ruff/rules/isinstance-type-none/) (`FURB168`) - [`type-none-comparison`](https://docs.astral.sh/ruff/rules/type-none-comparison/) (`FURB169`) - [`implicit-cwd`](https://docs.astral.sh/ruff/rules/implicit-cwd/) (`FURB177`) - [`hashlib-digest-hex`](https://docs.astral.sh/ruff/rules/hashlib-digest-hex/) (`FURB181`) - [`list-reverse-copy`](https://docs.astral.sh/ruff/rules/list-reverse-copy/) (`FURB187`) - [`bad-open-mode`](https://docs.astral.sh/ruff/rules/bad-open-mode/) (`PLW1501`) - [`empty-comment`](https://docs.astral.sh/ruff/rules/empty-comment/) (`PLR2044`) - [`global-at-module-level`](https://docs.astral.sh/ruff/rules/global-at-module-level/) (`PLW0604`) - [`misplaced-bare-raise`](https://docs.astral.sh/ruff/rules/misplaced-bare-raise/) (`PLE0744`) - [`non-ascii-import-name`](https://docs.astral.sh/ruff/rules/non-ascii-import-name/) (`PLC2403`) - [`non-ascii-name`](https://docs.astral.sh/ruff/rules/non-ascii-name/) (`PLC2401`) - [`nonlocal-and-global`](https://docs.astral.sh/ruff/rules/nonlocal-and-global/) (`PLE0115`) - [`potential-index-error`](https://docs.astral.sh/ruff/rules/potential-index-error/) (`PLE0643`) - [`redeclared-assigned-name`](https://docs.astral.sh/ruff/rules/redeclared-assigned-name/) (`PLW0128`) - [`redefined-argument-from-local`](https://docs.astral.sh/ruff/rules/redefined-argument-from-local/) (`PLR1704`) - [`repeated-keyword-argument`](https://docs.astral.sh/ruff/rules/repeated-keyword-argument/) (`PLE1132`) - [`super-without-brackets`](https://docs.astral.sh/ruff/rules/super-without-brackets/) (`PLW0245`) - [`unnecessary-list-index-lookup`](https://docs.astral.sh/ruff/rules/unnecessary-list-index-lookup/) (`PLR1736`) - [`useless-exception-statement`](https://docs.astral.sh/ruff/rules/useless-exception-statement/) (`PLW0133`) - [`useless-with-lock`](https://docs.astral.sh/ruff/rules/useless-with-lock/) (`PLW2101`) The following behaviors have been stabilized: - [`is-literal`](https://docs.astral.sh/ruff/rules/is-literal/) (`F632`) now warns for identity checks against list, set or dictionary literals - [`needless-bool`](https://docs.astral.sh/ruff/rules/needless-bool/) (`SIM103`) now detects `if` expressions with implicit `else` branches - [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/) (`E402`) now allows `os.environ` modifications between import statements - [`type-comparison`](https://docs.astral.sh/ruff/rules/type-comparison/) (`E721`) now allows idioms such as `type(x) is int` - [`yoda-condition`](https://docs.astral.sh/ruff/rules/yoda-conditions/) (`SIM300`) now flags a wider range of expressions ##### Removals The following deprecated settings have been removed: - `output-format=text`; use `output-format=concise` or `output-format=full` - `tab-size`; use `indent-width` The following deprecated CLI options have been removed: - `--show-source`; use `--output-format=full` - `--no-show-source`; use `--output-format=concise` The following deprecated CLI commands have been removed: - `ruff <path>`; use `ruff check <path>` - `ruff --clean`; use `ruff clean` - `ruff --generate-shell-completion`; use `ruff generate-shell-completion` ##### Preview features - \[`ruff`] Add `assert-with-print-message` rule ([#&#8203;11981](https://github.com/astral-sh/ruff/pull/11981)) ##### CLI - Use rule name rather than message in `--statistics` ([#&#8203;11697](https://github.com/astral-sh/ruff/pull/11697)) - Use the output format `full` by default ([#&#8203;12010](https://github.com/astral-sh/ruff/pull/12010)) - Don't log syntax errors to the console ([#&#8203;11902](https://github.com/astral-sh/ruff/pull/11902)) ##### Rule changes - \[`ruff`] Fix false positives if `gettext` is imported using an alias (`RUF027`) ([#&#8203;12025](https://github.com/astral-sh/ruff/pull/12025)) - \[`numpy`] Update `trapz` and `in1d` deprecation (`NPY201`) ([#&#8203;11948](https://github.com/astral-sh/ruff/pull/11948)) - \[`flake8-bandit`] Modify diagnostic ranges for shell-related rules ([#&#8203;10667](https://github.com/astral-sh/ruff/pull/10667)) ##### Server - Closing an untitled, unsaved notebook document no longer throws an error ([#&#8203;11942](https://github.com/astral-sh/ruff/pull/11942)) - Support the usage of tildes and environment variables in `logFile` ([#&#8203;11945](https://github.com/astral-sh/ruff/pull/11945)) - Add option to configure whether to show syntax errors ([#&#8203;12059](https://github.com/astral-sh/ruff/pull/12059)) ##### Bug fixes - \[`pycodestyle`] Avoid `E203` for f-string debug expression ([#&#8203;12024](https://github.com/astral-sh/ruff/pull/12024)) - \[`pep8-naming`] Match import-name ignores against both name and alias (`N812`, `N817`) ([#&#8203;12033](https://github.com/astral-sh/ruff/pull/12033)) - \[`pyflakes`] Detect assignments that shadow definitions (`F811`) ([#&#8203;11961](https://github.com/astral-sh/ruff/pull/11961)) ##### Parser - Emit a syntax error for an empty type parameter list ([#&#8203;12030](https://github.com/astral-sh/ruff/pull/12030)) - Avoid consuming the newline for unterminated strings ([#&#8203;12067](https://github.com/astral-sh/ruff/pull/12067)) - Do not include the newline in the unterminated string range ([#&#8203;12017](https://github.com/astral-sh/ruff/pull/12017)) - Use the correct range to highlight line continuation errors ([#&#8203;12016](https://github.com/astral-sh/ruff/pull/12016)) - Consider 2-character EOL before line continuations ([#&#8203;12035](https://github.com/astral-sh/ruff/pull/12035)) - Consider line continuation character for re-lexing ([#&#8203;12008](https://github.com/astral-sh/ruff/pull/12008)) ##### Other changes - Upgrade the Unicode table used for measuring the line-length ([#&#8203;11194](https://github.com/astral-sh/ruff/pull/11194)) - Remove the deprecation error message for the nursery selector ([#&#8203;10172](https://github.com/astral-sh/ruff/pull/10172)) ### [`v0.4.10`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0410) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.9...v0.4.10) ##### Parser - Implement re-lexing logic for better error recovery ([#&#8203;11845](https://github.com/astral-sh/ruff/pull/11845)) ##### Rule changes - \[`flake8-copyright`] Update `CPY001` to check the first 4096 bytes instead of 1024 ([#&#8203;11927](https://github.com/astral-sh/ruff/pull/11927)) - \[`pycodestyle`] Update `E999` to show all syntax errors instead of just the first one ([#&#8203;11900](https://github.com/astral-sh/ruff/pull/11900)) ##### Server - Add tracing setup guide to Helix documentation ([#&#8203;11883](https://github.com/astral-sh/ruff/pull/11883)) - Add tracing setup guide to Neovim documentation ([#&#8203;11884](https://github.com/astral-sh/ruff/pull/11884)) - Defer notebook cell deletion to avoid an error message ([#&#8203;11864](https://github.com/astral-sh/ruff/pull/11864)) ##### Security - Guard against malicious ecosystem comment artifacts ([#&#8203;11879](https://github.com/astral-sh/ruff/pull/11879)) ### [`v0.4.9`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#049) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.8...v0.4.9) ##### Preview features - \[`pylint`] Implement `consider-dict-items` (`C0206`) ([#&#8203;11688](https://github.com/astral-sh/ruff/pull/11688)) - \[`refurb`] Implement `repeated-global` (`FURB154`) ([#&#8203;11187](https://github.com/astral-sh/ruff/pull/11187)) ##### Rule changes - \[`pycodestyle`] Adapt fix for `E203` to work identical to `ruff format` ([#&#8203;10999](https://github.com/astral-sh/ruff/pull/10999)) ##### Formatter - Fix formatter instability for lines only consisting of zero-width characters ([#&#8203;11748](https://github.com/astral-sh/ruff/pull/11748)) ##### Server - Add supported commands in server capabilities ([#&#8203;11850](https://github.com/astral-sh/ruff/pull/11850)) - Use real file path when available in `ruff server` ([#&#8203;11800](https://github.com/astral-sh/ruff/pull/11800)) - Improve error message when a command is run on an unavailable document ([#&#8203;11823](https://github.com/astral-sh/ruff/pull/11823)) - Introduce the `ruff.printDebugInformation` command ([#&#8203;11831](https://github.com/astral-sh/ruff/pull/11831)) - Tracing system now respects log level and trace level, with options to log to a file ([#&#8203;11747](https://github.com/astral-sh/ruff/pull/11747)) ##### CLI - Handle non-printable characters in diff view ([#&#8203;11687](https://github.com/astral-sh/ruff/pull/11687)) ##### Bug fixes - \[`refurb`] Avoid suggesting starmap when arguments are used outside call (`FURB140`) ([#&#8203;11830](https://github.com/astral-sh/ruff/pull/11830)) - \[`flake8-bugbear`] Avoid panic in `B909` when checking large loop blocks ([#&#8203;11772](https://github.com/astral-sh/ruff/pull/11772)) - \[`refurb`] Fix misbehavior of `operator.itemgetter` when getter param is a tuple (`FURB118`) ([#&#8203;11774](https://github.com/astral-sh/ruff/pull/11774)) ### [`v0.4.8`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#048) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.7...v0.4.8) ##### Performance - Linter performance has been improved by around 10% on some microbenchmarks by refactoring the lexer and parser to maintain synchronicity between them ([#&#8203;11457](https://github.com/astral-sh/ruff/pull/11457)) ##### Preview features - \[`flake8-bugbear`] Implement `return-in-generator` (`B901`) ([#&#8203;11644](https://github.com/astral-sh/ruff/pull/11644)) - \[`flake8-pyi`] Implement `PYI063` ([#&#8203;11699](https://github.com/astral-sh/ruff/pull/11699)) - \[`pygrep_hooks`] Check blanket ignores via file-level pragmas (`PGH004`) ([#&#8203;11540](https://github.com/astral-sh/ruff/pull/11540)) ##### Rule changes - \[`pyupgrade`] Update `UP035` for Python 3.13 and the latest version of `typing_extensions` ([#&#8203;11693](https://github.com/astral-sh/ruff/pull/11693)) - \[`numpy`] Update `NPY001` rule for NumPy 2.0 ([#&#8203;11735](https://github.com/astral-sh/ruff/pull/11735)) ##### Server - Formatting a document with syntax problems no longer spams a visible error popup ([#&#8203;11745](https://github.com/astral-sh/ruff/pull/11745)) ##### CLI - Add RDJson support for `--output-format` flag ([#&#8203;11682](https://github.com/astral-sh/ruff/pull/11682)) ##### Bug fixes - \[`pyupgrade`] Write empty string in lieu of panic when fixing `UP032` ([#&#8203;11696](https://github.com/astral-sh/ruff/pull/11696)) - \[`flake8-simplify`] Simplify double negatives in `SIM103` ([#&#8203;11684](https://github.com/astral-sh/ruff/pull/11684)) - Ensure the expression generator adds a newline before `type` statements ([#&#8203;11720](https://github.com/astral-sh/ruff/pull/11720)) - Respect per-file ignores for blanket and redirected noqa rules ([#&#8203;11728](https://github.com/astral-sh/ruff/pull/11728)) ### [`v0.4.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#047) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.6...v0.4.7) ##### Preview features - \[`flake8-pyi`] Implement `PYI064` ([#&#8203;11325](https://github.com/astral-sh/ruff/pull/11325)) - \[`flake8-pyi`] Implement `PYI066` ([#&#8203;11541](https://github.com/astral-sh/ruff/pull/11541)) - \[`flake8-pyi`] Implement `PYI057` ([#&#8203;11486](https://github.com/astral-sh/ruff/pull/11486)) - \[`pyflakes`] Enable `F822` in `__init__.py` files by default ([#&#8203;11370](https://github.com/astral-sh/ruff/pull/11370)) ##### Formatter - Fix incorrect placement of trailing stub function comments ([#&#8203;11632](https://github.com/astral-sh/ruff/pull/11632)) ##### Server - Respect file exclusions in `ruff server` ([#&#8203;11590](https://github.com/astral-sh/ruff/pull/11590)) - Add support for documents not exist on disk ([#&#8203;11588](https://github.com/astral-sh/ruff/pull/11588)) - Add Vim and Kate setup guide for `ruff server` ([#&#8203;11615](https://github.com/astral-sh/ruff/pull/11615)) ##### Bug fixes - Avoid removing newlines between docstring headers and rST blocks ([#&#8203;11609](https://github.com/astral-sh/ruff/pull/11609)) - Infer indentation with imports when logical indent is absent ([#&#8203;11608](https://github.com/astral-sh/ruff/pull/11608)) - Use char index rather than position for indent slice ([#&#8203;11645](https://github.com/astral-sh/ruff/pull/11645)) - \[`flake8-comprehension`] Strip parentheses around generators in `C400` ([#&#8203;11607](https://github.com/astral-sh/ruff/pull/11607)) - Mark `repeated-isinstance-calls` as unsafe on Python 3.10 and later ([#&#8203;11622](https://github.com/astral-sh/ruff/pull/11622)) ### [`v0.4.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#046) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.5...v0.4.6) ##### Breaking changes - Use project-relative paths when calculating GitLab fingerprints ([#&#8203;11532](https://github.com/astral-sh/ruff/pull/11532)) - Bump minimum supported Windows version to Windows 10 ([#&#8203;11613](https://github.com/astral-sh/ruff/pull/11613)) ##### Preview features - \[`flake8-async`] Sleep with >24 hour interval should usually sleep forever (`ASYNC116`) ([#&#8203;11498](https://github.com/astral-sh/ruff/pull/11498)) ##### Rule changes - \[`numpy`] Add missing functions to NumPy 2.0 migration rule ([#&#8203;11528](https://github.com/astral-sh/ruff/pull/11528)) - \[`mccabe`] Consider irrefutable pattern similar to `if .. else` for `C901` ([#&#8203;11565](https://github.com/astral-sh/ruff/pull/11565)) - Consider `match`-`case` statements for `C901`, `PLR0912`, and `PLR0915` ([#&#8203;11521](https://github.com/astral-sh/ruff/pull/11521)) - Remove empty strings when converting to f-string (`UP032`) ([#&#8203;11524](https://github.com/astral-sh/ruff/pull/11524)) - \[`flake8-bandit`] `request-without-timeout` should warn for `requests.request` ([#&#8203;11548](https://github.com/astral-sh/ruff/pull/11548)) - \[`flake8-self`] Ignore sunder accesses in `flake8-self` rules ([#&#8203;11546](https://github.com/astral-sh/ruff/pull/11546)) - \[`pyupgrade`] Lint for `TypeAliasType` usages (`UP040`) ([#&#8203;11530](https://github.com/astral-sh/ruff/pull/11530)) ##### Server - Respect excludes in `ruff server` configuration discovery ([#&#8203;11551](https://github.com/astral-sh/ruff/pull/11551)) - Use default settings if initialization options is empty or not provided ([#&#8203;11566](https://github.com/astral-sh/ruff/pull/11566)) - `ruff server` correctly treats `.pyi` files as stub files ([#&#8203;11535](https://github.com/astral-sh/ruff/pull/11535)) - `ruff server` searches for configuration in parent directories ([#&#8203;11537](https://github.com/astral-sh/ruff/pull/11537)) - `ruff server`: An empty code action filter no longer returns notebook source actions ([#&#8203;11526](https://github.com/astral-sh/ruff/pull/11526)) ##### Bug fixes - \[`flake8-logging-format`] Fix autofix title in `logging-warn` (`G010`) ([#&#8203;11514](https://github.com/astral-sh/ruff/pull/11514)) - \[`refurb`] Avoid recommending `operator.itemgetter` with dependence on lambda arguments ([#&#8203;11574](https://github.com/astral-sh/ruff/pull/11574)) - \[`flake8-simplify`] Avoid recommending context manager in `__enter__` implementations ([#&#8203;11575](https://github.com/astral-sh/ruff/pull/11575)) - Create intermediary directories for `--output-file` ([#&#8203;11550](https://github.com/astral-sh/ruff/pull/11550)) - Propagate reads on global variables ([#&#8203;11584](https://github.com/astral-sh/ruff/pull/11584)) - Treat all `singledispatch` arguments as runtime-required ([#&#8203;11523](https://github.com/astral-sh/ruff/pull/11523)) ### [`v0.4.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#045) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.4...v0.4.5) ##### Ruff's language server is now in Beta `v0.4.5` marks the official Beta release of `ruff server`, an integrated language server built into Ruff. `ruff server` supports the same feature set as `ruff-lsp`, powering linting, formatting, and code fixes in Ruff's editor integrations -- but with superior performance and no installation required. We'd love your feedback! You can enable `ruff server` in the [VS Code extension](https://github.com/astral-sh/ruff-vscode?tab=readme-ov-file#enabling-the-rust-based-language-server) today. To read more about this exciting milestone, check out our [blog post](https://astral.sh/blog/ruff-v0.4.5)! ##### Rule changes - \[`flake8-future-annotations`] Reword `future-rewritable-type-annotation` (`FA100`) message ([#&#8203;11381](https://github.com/astral-sh/ruff/pull/11381)) - \[`isort`] Expanded the set of standard-library modules to include `_string`, etc. ([#&#8203;11374](https://github.com/astral-sh/ruff/pull/11374)) - \[`pycodestyle`] Consider soft keywords for `E27` rules ([#&#8203;11446](https://github.com/astral-sh/ruff/pull/11446)) - \[`pyflakes`] Recommend adding unused import bindings to `__all__` ([#&#8203;11314](https://github.com/astral-sh/ruff/pull/11314)) - \[`pyflakes`] Update documentation and deprecate `ignore_init_module_imports` ([#&#8203;11436](https://github.com/astral-sh/ruff/pull/11436)) - \[`pyupgrade`] Mark quotes as unnecessary for non-evaluated annotations ([#&#8203;11485](https://github.com/astral-sh/ruff/pull/11485)) ##### Formatter - Avoid multiline quotes warning with `quote-style = preserve` ([#&#8203;11490](https://github.com/astral-sh/ruff/pull/11490)) ##### Server - Support Jupyter Notebook files ([#&#8203;11206](https://github.com/astral-sh/ruff/pull/11206)) - Support `noqa` comment code actions ([#&#8203;11276](https://github.com/astral-sh/ruff/pull/11276)) - Fix automatic configuration reloading ([#&#8203;11492](https://github.com/astral-sh/ruff/pull/11492)) - Fix several issues with configuration in Neovim and Helix ([#&#8203;11497](https://github.com/astral-sh/ruff/pull/11497)) ##### CLI - Add `--output-format` as a CLI option for `ruff config` ([#&#8203;11438](https://github.com/astral-sh/ruff/pull/11438)) ##### Bug fixes - Avoid `PLE0237` for property with setter ([#&#8203;11377](https://github.com/astral-sh/ruff/pull/11377)) - Avoid `TCH005` for `if` stmt with `elif`/`else` block ([#&#8203;11376](https://github.com/astral-sh/ruff/pull/11376)) - Avoid flagging `__future__` annotations as required for non-evaluated type annotations ([#&#8203;11414](https://github.com/astral-sh/ruff/pull/11414)) - Check for ruff executable in 'bin' directory as installed by 'pip install --target'. ([#&#8203;11450](https://github.com/astral-sh/ruff/pull/11450)) - Sort edits prior to deduplicating in quotation fix ([#&#8203;11452](https://github.com/astral-sh/ruff/pull/11452)) - Treat escaped newline as valid sequence ([#&#8203;11465](https://github.com/astral-sh/ruff/pull/11465)) - \[`flake8-pie`] Preserve parentheses in `unnecessary-dict-kwargs` ([#&#8203;11372](https://github.com/astral-sh/ruff/pull/11372)) - \[`pylint`] Ignore `__slots__` with dynamic values ([#&#8203;11488](https://github.com/astral-sh/ruff/pull/11488)) - \[`pylint`] Remove `try` body from branch counting ([#&#8203;11487](https://github.com/astral-sh/ruff/pull/11487)) - \[`refurb`] Respect operator precedence in `FURB110` ([#&#8203;11464](https://github.com/astral-sh/ruff/pull/11464)) ##### Documentation - Add `--preview` to the README ([#&#8203;11395](https://github.com/astral-sh/ruff/pull/11395)) - Add Python 3.13 to list of allowed Python versions ([#&#8203;11411](https://github.com/astral-sh/ruff/pull/11411)) - Simplify Neovim setup documentation ([#&#8203;11489](https://github.com/astral-sh/ruff/pull/11489)) - Update CONTRIBUTING.md to reflect the new parser ([#&#8203;11434](https://github.com/astral-sh/ruff/pull/11434)) - Update server documentation with new migration guide ([#&#8203;11499](https://github.com/astral-sh/ruff/pull/11499)) - \[`pycodestyle`] Clarify motivation for `E713` and `E714` ([#&#8203;11483](https://github.com/astral-sh/ruff/pull/11483)) - \[`pyflakes`] Update docs to describe WAI behavior (F541) ([#&#8203;11362](https://github.com/astral-sh/ruff/pull/11362)) - \[`pylint`] Clearly indicate what is counted as a branch ([#&#8203;11423](https://github.com/astral-sh/ruff/pull/11423)) ### [`v0.4.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#044) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.3...v0.4.4) ##### Preview features - \[`pycodestyle`] Ignore end-of-line comments when determining blank line rules ([#&#8203;11342](https://github.com/astral-sh/ruff/pull/11342)) - \[`pylint`] Detect `pathlib.Path.open` calls in `unspecified-encoding` (`PLW1514`) ([#&#8203;11288](https://github.com/astral-sh/ruff/pull/11288)) - \[`flake8-pyi`] Implement `PYI059` (`generic-not-last-base-class`) ([#&#8203;11233](https://github.com/astral-sh/ruff/pull/11233)) - \[`flake8-pyi`] Implement `PYI062` (`duplicate-literal-member`) ([#&#8203;11269](https://github.com/astral-sh/ruff/pull/11269)) ##### Rule changes - \[`flake8-boolean-trap`] Allow passing booleans as positional-only arguments in code such as `set(True)` ([#&#8203;11287](https://github.com/astral-sh/ruff/pull/11287)) - \[`flake8-bugbear`] Ignore enum classes in `cached-instance-method` (`B019`) ([#&#8203;11312](https://github.com/astral-sh/ruff/pull/11312)) ##### Server - Expand tildes when resolving Ruff server configuration file ([#&#8203;11283](https://github.com/astral-sh/ruff/pull/11283)) - Fix `ruff server` hanging after Neovim closes ([#&#8203;11291](https://github.com/astral-sh/ruff/pull/11291)) - Editor settings are used by default if no file-based configuration exists ([#&#8203;11266](https://github.com/astral-sh/ruff/pull/11266)) ##### Bug fixes - \[`pylint`] Consider `with` statements for `too-many-branches` (`PLR0912`) ([#&#8203;11321](https://github.com/astral-sh/ruff/pull/11321)) - \[`flake8-blind-except`, `tryceratops`] Respect logged and re-raised expressions in nested statements (`BLE001`, `TRY201`) ([#&#8203;11301](https://github.com/astral-sh/ruff/pull/11301)) - Recognise assignments such as `__all__ = builtins.list(["foo", "bar"])` as valid `__all__` definitions ([#&#8203;11335](https://github.com/astral-sh/ruff/pull/11335)) ### [`v0.4.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#043) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.2...v0.4.3) ##### Enhancements - Add support for PEP 696 syntax ([#&#8203;11120](https://github.com/astral-sh/ruff/pull/11120)) ##### Preview features - \[`refurb`] Use function range for `reimplemented-operator` diagnostics ([#&#8203;11271](https://github.com/astral-sh/ruff/pull/11271)) - \[`refurb`] Ignore methods in `reimplemented-operator` (`FURB118`) ([#&#8203;11270](https://github.com/astral-sh/ruff/pull/11270)) - \[`refurb`] Implement `fstring-number-format` (`FURB116`) ([#&#8203;10921](https://github.com/astral-sh/ruff/pull/10921)) - \[`ruff`] Implement `redirected-noqa` (`RUF101`) ([#&#8203;11052](https://github.com/astral-sh/ruff/pull/11052)) - \[`pyflakes`] Distinguish between first-party and third-party imports for fix suggestions ([#&#8203;11168](https://github.com/astral-sh/ruff/pull/11168)) ##### Rule changes - \[`flake8-bugbear`] Ignore non-abstract class attributes when enforcing `B024` ([#&#8203;11210](https://github.com/astral-sh/ruff/pull/11210)) - \[`flake8-logging`] Include inline instantiations when detecting loggers ([#&#8203;11154](https://github.com/astral-sh/ruff/pull/11154)) - \[`pylint`] Also emit `PLR0206` for properties with variadic parameters ([#&#8203;11200](https://github.com/astral-sh/ruff/pull/11200)) - \[`ruff`] Detect duplicate codes as part of `unused-noqa` (`RUF100`) ([#&#8203;10850](https://github.com/astral-sh/ruff/pull/10850)) ##### Formatter - Avoid multiline expression if format specifier is present ([#&#8203;11123](https://github.com/astral-sh/ruff/pull/11123)) ##### LSP - Write `ruff server` setup guide for Helix ([#&#8203;11183](https://github.com/astral-sh/ruff/pull/11183)) - `ruff server` no longer hangs after shutdown ([#&#8203;11222](https://github.com/astral-sh/ruff/pull/11222)) - `ruff server` reads from a configuration TOML file in the user configuration directory if no local configuration exists ([#&#8203;11225](https://github.com/astral-sh/ruff/pull/11225)) - `ruff server` respects `per-file-ignores` configuration ([#&#8203;11224](https://github.com/astral-sh/ruff/pull/11224)) - `ruff server`: Support a custom TOML configuration file ([#&#8203;11140](https://github.com/astral-sh/ruff/pull/11140)) - `ruff server`: Support setting to prioritize project configuration over editor configuration ([#&#8203;11086](https://github.com/astral-sh/ruff/pull/11086)) ##### Bug fixes - Avoid debug assertion around NFKC renames ([#&#8203;11249](https://github.com/astral-sh/ruff/pull/11249)) - \[`pyflakes`] Prioritize `redefined-while-unused` over `unused-import` ([#&#8203;11173](https://github.com/astral-sh/ruff/pull/11173)) - \[`ruff`] Respect `async` expressions in comprehension bodies ([#&#8203;11219](https://github.com/astral-sh/ruff/pull/11219)) - \[`pygrep_hooks`] Fix `blanket-noqa` panic when last line has noqa with no newline (`PGH004`) ([#&#8203;11108](https://github.com/astral-sh/ruff/pull/11108)) - \[`perflint`] Ignore list-copy recommendations for async `for` loops ([#&#8203;11250](https://github.com/astral-sh/ruff/pull/11250)) - \[`pyflakes`] Improve `invalid-print-syntax` documentation ([#&#8203;11171](https://github.com/astral-sh/ruff/pull/11171)) ##### Performance - Avoid allocations for isort module names ([#&#8203;11251](https://github.com/astral-sh/ruff/pull/11251)) - Build a separate ARM wheel for macOS ([#&#8203;11149](https://github.com/astral-sh/ruff/pull/11149)) ##### Windows - Increase the minimum requirement to Windows 10. ### [`v0.4.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#042) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.1...v0.4.2) ##### Rule changes - \[`flake8-pyi`] Allow for overloaded `__exit__` and `__aexit__` definitions (`PYI036`) ([#&#8203;11057](https://github.com/astral-sh/ruff/pull/11057)) - \[`pyupgrade`] Catch usages of `"%s" % var` and provide an unsafe fix (`UP031`) ([#&#8203;11019](https://github.com/astral-sh/ruff/pull/11019)) - \[`refurb`] Implement new rule that suggests min/max over `sorted()` (`FURB192`) ([#&#8203;10868](https://github.com/astral-sh/ruff/pull/10868)) ##### Server - Fix an issue with missing diagnostics for Neovim and Helix ([#&#8203;11092](https://github.com/astral-sh/ruff/pull/11092)) - Implement hover documentation for `noqa` codes ([#&#8203;11096](https://github.com/astral-sh/ruff/pull/11096)) - Introduce common Ruff configuration options with new server settings ([#&#8203;11062](https://github.com/astral-sh/ruff/pull/11062)) ##### Bug fixes - Use `macos-12` for building release wheels to enable macOS 11 compatibility ([#&#8203;11146](https://github.com/astral-sh/ruff/pull/11146)) - \[`flake8-blind-expect`] Allow raise from in `BLE001` ([#&#8203;11131](https://github.com/astral-sh/ruff/pull/11131)) - \[`flake8-pyi`] Allow simple assignments to `None` in enum class scopes (`PYI026`) ([#&#8203;11128](https://github.com/astral-sh/ruff/pull/11128)) - \[`flake8-simplify`] Avoid raising `SIM911` for non-`zip` attribute calls ([#&#8203;11126](https://github.com/astral-sh/ruff/pull/11126)) - \[`refurb`] Avoid `operator.itemgetter` suggestion for single-item tuple ([#&#8203;11095](https://github.com/astral-sh/ruff/pull/11095)) - \[`ruff`] Respect per-file-ignores for `RUF100` with no other diagnostics ([#&#8203;11058](https://github.com/astral-sh/ruff/pull/11058)) - \[`ruff`] Fix async comprehension false positive (`RUF029`) ([#&#8203;11070](https://github.com/astral-sh/ruff/pull/11070)) ##### Documentation - \[`flake8-bugbear`] Document explicitly disabling strict zip (`B905`) ([#&#8203;11040](https://github.com/astral-sh/ruff/pull/11040)) - \[`flake8-type-checking`] Mention `lint.typing-modules` in `TCH001`, `TCH002`, and `TCH003` ([#&#8203;11144](https://github.com/astral-sh/ruff/pull/11144)) - \[`isort`] Improve documentation around custom `isort` sections ([#&#8203;11050](https://github.com/astral-sh/ruff/pull/11050)) - \[`pylint`] Fix documentation oversight for `invalid-X-returns` ([#&#8203;11094](https://github.com/astral-sh/ruff/pull/11094)) ##### Performance - Use `matchit` to resolve per-file settings ([#&#8203;11111](https://github.com/astral-sh/ruff/pull/11111)) ### [`v0.4.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0410) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.0...v0.4.1) ##### Parser - Implement re-lexing logic for better error recovery ([#&#8203;11845](https://github.com/astral-sh/ruff/pull/11845)) ##### Rule changes - \[`flake8-copyright`] Update `CPY001` to check the first 4096 bytes instead of 1024 ([#&#8203;11927](https://github.com/astral-sh/ruff/pull/11927)) - \[`pycodestyle`] Update `E999` to show all syntax errors instead of just the first one ([#&#8203;11900](https://github.com/astral-sh/ruff/pull/11900)) ##### Server - Add tracing setup guide to Helix documentation ([#&#8203;11883](https://github.com/astral-sh/ruff/pull/11883)) - Add tracing setup guide to Neovim documentation ([#&#8203;11884](https://github.com/astral-sh/ruff/pull/11884)) - Defer notebook cell deletion to avoid an error message ([#&#8203;11864](https://github.com/astral-sh/ruff/pull/11864)) ##### Security - Guard against malicious ecosystem comment artifacts ([#&#8203;11879](https://github.com/astral-sh/ruff/pull/11879)) ### [`v0.4.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#040) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.7...v0.4.0) ##### A new, hand-written parser Ruff's new parser is **>2x faster**, which translates to a **20-40% speedup** for all linting and formatting invocations. There's a lot to say about this exciting change, so check out the [blog post](https://astral.sh/blog/ruff-v0.4.0) for more details! See [#&#8203;10036](https://github.com/astral-sh/ruff/pull/10036) for implementation details. ##### A new language server in Rust With this release, we also want to highlight our new language server. `ruff server` is a Rust-powered language server that comes built-in with Ruff. It can be used with any editor that supports the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP). It uses a multi-threaded, lock-free architecture inspired by `rust-analyzer` and it will open the door for a lot of exciting features. It’s also faster than our previous [Python-based language server](https://github.com/astral-sh/ruff-lsp) \-- but you probably guessed that already. `ruff server` is only in alpha, but it has a lot of features that you can try out today: - Lints Python files automatically and shows quick-fixes when available - Formats Python files, with support for range formatting - Comes with commands for quickly performing actions: `ruff.applyAutofix`, `ruff.applyFormat`, and `ruff.applyOrganizeImports` - Supports `source.fixAll` and `source.organizeImports` source actions - Automatically reloads your project configuration when you change it To setup `ruff server` with your editor, refer to the [README.md](https://github.com/astral-sh/ruff/blob/main/crates/ruff_server/README.md). ##### Preview features - \[`pycodestyle`] Do not trigger `E3` rules on `def`s following a function/method with a dummy body ([#&#8203;10704](https://github.com/astral-sh/ruff/pull/10704)) - \[`pylint`] Implement `invalid-bytes-returned` (`E0308`) ([#&#8203;10959](https://github.com/astral-sh/ruff/pull/10959)) - \[`pylint`] Implement `invalid-length-returned` (`E0303`) ([#&#8203;10963](https://github.com/astral-sh/ruff/pull/10963)) - \[`pylint`] Implement `self-cls-assignment` (`W0642`) ([#&#8203;9267](https://github.com/astral-sh/ruff/pull/9267)) - \[`pylint`] Omit stubs from `invalid-bool` and `invalid-str-return-type` ([#&#8203;11008](https://github.com/astral-sh/ruff/pull/11008)) - \[`ruff`] New rule `unused-async` (`RUF029`) to detect unneeded `async` keywords on functions ([#&#8203;9966](https://github.com/astral-sh/ruff/pull/9966)) ##### Rule changes - \[`flake8-bandit`] Allow `urllib.request.urlopen` calls with static `Request` argument (`S310`) ([#&#8203;10964](https://github.com/astral-sh/ruff/pull/10964)) - \[`flake8-bugbear`] Treat `raise NotImplemented`-only bodies as stub functions (`B006`) ([#&#8203;10990](https://github.com/astral-sh/ruff/pull/10990)) - \[`flake8-slots`] Respect same-file `Enum` subclasses (`SLOT000`) ([#&#8203;11006](https://github.com/astral-sh/ruff/pull/11006)) - \[`pylint`] Support inverted comparisons (`PLR1730`) ([#&#8203;10920](https://github.com/astral-sh/ruff/pull/10920)) ##### Linter - Improve handling of builtin symbols in linter rules ([#&#8203;10919](https://github.com/astral-sh/ruff/pull/10919)) - Improve display of rules in `--show-settings` ([#&#8203;11003](https://github.com/astral-sh/ruff/pull/11003)) - Improve inference capabilities of the `BuiltinTypeChecker` ([#&#8203;10976](https://github.com/astral-sh/ruff/pull/10976)) - Resolve classes and functions relative to script name ([#&#8203;10965](https://github.com/astral-sh/ruff/pull/10965)) - Improve performance of `RuleTable::any_enabled` ([#&#8203;10971](https://github.com/astral-sh/ruff/pull/10971)) ##### Server *This section is devoted to updates for our new language server, written in Rust.* - Enable ruff-specific source actions ([#&#8203;10916](https://github.com/astral-sh/ruff/pull/10916)) - Refreshes diagnostics for open files when file configuration is changed ([#&#8203;10988](https://github.com/astral-sh/ruff/pull/10988)) - Important errors are now shown as popups ([#&#8203;10951](https://github.com/astral-sh/ruff/pull/10951)) - Introduce settings for directly configuring the linter and formatter ([#&#8203;10984](https://github.com/astral-sh/ruff/pull/10984)) - Resolve configuration for each document individually ([#&#8203;10950](https://github.com/astral-sh/ruff/pull/10950)) - Write a setup guide for Neovim ([#&#8203;10987](https://github.com/astral-sh/ruff/pull/10987)) ##### Configuration - Add `RUFF_OUTPUT_FILE` environment variable support ([#&#8203;10992](https://github.com/astral-sh/ruff/pull/10992)) ##### Bug fixes - Avoid `non-augmented-assignment` for reversed, non-commutative operators (`PLR6104`) ([#&#8203;10909](https://github.com/astral-sh/ruff/pull/10909)) - Limit commutative non-augmented-assignments to primitive data types (`PLR6104`) ([#&#8203;10912](https://github.com/astral-sh/ruff/pull/10912)) - Respect `per-file-ignores` for `RUF100` on blanket `# noqa` ([#&#8203;10908](https://github.com/astral-sh/ruff/pull/10908)) - Consider `if` expression for parenthesized with items parsing ([#&#8203;11010](https://github.com/astral-sh/ruff/pull/11010)) - Consider binary expr for parenthesized with items parsing ([#&#8203;11012](https://github.com/astral-sh/ruff/pull/11012)) - Reset `FOR_TARGET` context for all kinds of parentheses ([#&#8203;11009](https://github.com/astral-sh/ruff/pull/11009)) ### [`v0.3.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#037) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.6...v0.3.7) ##### Preview features - \[`flake8-bugbear`] Implement `loop-iterator-mutation` (`B909`) ([#&#8203;9578](https://github.com/astral-sh/ruff/pull/9578)) - \[`pylint`] Implement rule to prefer augmented assignment (`PLR6104`) ([#&#8203;9932](https://github.com/astral-sh/ruff/pull/9932)) ##### Bug fixes - Avoid TOCTOU errors in cache initialization ([#&#8203;10884](https://github.com/astral-sh/ruff/pull/10884)) - \[`pylint`] Recode `nan-comparison` rule to `W0177` ([#&#8203;10894](https://github.com/astral-sh/ruff/pull/10894)) - \[`pylint`] Reverse min-max logic in `if-stmt-min-max` ([#&#8203;10890](https://github.com/astral-sh/ruff/pull/10890)) ### [`v0.3.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#036) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.5...v0.3.6) ##### Preview features - \[`pylint`] Implement `bad-staticmethod-argument` (`PLW0211`) ([#&#8203;10781](https://github.com/astral-sh/ruff/pull/10781)) - \[`pylint`] Implement `if-stmt-min-max` (`PLR1730`, `PLR1731`) ([#&#8203;10002](https://github.com/astral-sh/ruff/pull/10002)) - \[`pyupgrade`] Replace `str,Enum` multiple inheritance with `StrEnum` `UP042` ([#&#8203;10713](https://github.com/astral-sh/ruff/pull/10713)) - \[`refurb`] Implement `if-expr-instead-of-or-operator` (`FURB110`) ([#&#8203;10687](https://github.com/astral-sh/ruff/pull/10687)) - \[`refurb`] Implement `int-on-sliced-str` (`FURB166`) ([#&#8203;10650](https://github.com/astral-sh/ruff/pull/10650)) - \[`refurb`] Implement `write-whole-file` (`FURB103`) ([#&#8203;10802](https://github.com/astral-sh/ruff/pull/10802)) - \[`refurb`] Support `itemgetter` in `reimplemented-operator` (`FURB118`) ([#&#8203;10526](https://github.com/astral-sh/ruff/pull/10526)) - \[`flake8_comprehensions`] Add `sum`/`min`/`max` to unnecessary comprehension check (`C419`) ([#&#8203;10759](https://github.com/astral-sh/ruff/pull/10759)) ##### Rule changes - \[`pydocstyle`] Require capitalizing docstrings where the first sentence is a single word (`D403`) ([#&#8203;10776](https://github.com/astral-sh/ruff/pull/10776)) - \[`pycodestyle`] Ignore annotated lambdas in class scopes (`E731`) ([#&#8203;10720](https://github.com/astral-sh/ruff/pull/10720)) - \[`flake8-pyi`] Various improvements to PYI034 ([#&#8203;10807](https://github.com/astral-sh/ruff/pull/10807)) - \[`flake8-slots`] Flag subclasses of call-based `typing.NamedTuple`s as well as subclasses of `collections.namedtuple()` (`SLOT002`) ([#&#8203;10808](https://github.com/astral-sh/ruff/pull/10808)) - \[`pyflakes`] Allow forward references in class bases in stub files (`F821`) ([#&#8203;10779](https://github.com/astral-sh/ruff/pull/10779)) - \[`pygrep-hooks`] Improve `blanket-noqa` error message (`PGH004`) ([#&#8203;10851](https://github.com/astral-sh/ruff/pull/10851)) ##### CLI - Support `FORCE_COLOR` env var ([#&#8203;10839](https://github.com/astral-sh/ruff/pull/10839)) ##### Configuration - Support negated patterns in `[extend-]per-file-ignores` ([#&#8203;10852](https://github.com/astral-sh/ruff/pull/10852)) ##### Bug fixes - \[`flake8-import-conventions`] Accept non-aliased (but correct) import in `unconventional-import-alias` (`ICN001`) ([#&#8203;10729](https://github.com/astral-sh/ruff/pull/10729)) - \[`flake8-quotes`] Add semantic model flag when inside f-string replacement field ([#&#8203;10766](https://github.com/astral-sh/ruff/pull/10766)) - \[`pep8-naming`] Recursively resolve `TypeDicts` for N815 violations ([#&#8203;10719](https://github.com/astral-sh/ruff/pull/10719)) - \[`flake8-quotes`] Respect `Q00*` ignores in `flake8-quotes` rules ([#&#8203;10728](https://github.com/astral-sh/ruff/pull/10728)) - \[`flake8-simplify`] Show negated condition in `needless-bool` diagnostics (`SIM103`) ([#&#8203;10854](https://github.com/astral-sh/ruff/pull/10854)) - \[`ruff`] Use within-scope shadowed bindings in `asyncio-dangling-task` (`RUF006`) ([#&#8203;10793](https://github.com/astral-sh/ruff/pull/10793)) - \[`flake8-pytest-style`] Fix single-tuple conversion in `pytest-parametrize-values-wrong-type` (`PT007`) ([#&#8203;10862](https://github.com/astral-sh/ruff/pull/10862)) - \[`flake8-return`] Ignore assignments to annotated variables in `unnecessary-assign` (`RET504`) ([#&#8203;10741](https://github.com/astral-sh/ruff/pull/10741)) - \[`refurb`] Do not allow any keyword arguments for `read-whole-file` in `rb` mode (`FURB101`) ([#&#8203;10803](https://github.com/astral-sh/ruff/pull/10803)) - \[`pylint`] Don't recommend decorating staticmethods with `@singledispatch` (`PLE1519`, `PLE1520`) ([#&#8203;10637](https://github.com/astral-sh/ruff/pull/10637)) - \[`pydocstyle`] Use section name range for all section-related docstring diagnostics ([#&#8203;10740](https://github.com/astral-sh/ruff/pull/10740)) - Respect `# noqa` directives on `__all__` openers ([#&#8203;10798](https://github.com/astral-sh/ruff/pull/10798)) ### [`v0.3.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#035) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.4...v0.3.5) ##### Preview features - \[`pylint`] Implement `modified-iterating-set` (`E4703`) ([#&#8203;10473](https://github.com/astral-sh/ruff/pull/10473)) - \[`refurb`] Implement `for-loop-set-mutations` (`FURB142`) ([#&#8203;10583](https://github.com/astral-sh/ruff/pull/10583)) - \[`refurb`] Implement `unnecessary-from-float` (`FURB164`) ([#&#8203;10647](https://github.com/astral-sh/ruff/pull/10647)) - \[`refurb`] Implement `verbose-decimal-constructor` (`FURB157`) ([#&#8203;10533](https://github.com/astral-sh/ruff/pull/10533)) ##### Rule changes - \[`flake8-comprehensions`] Handled special case for `C401` which also matches `C416` ([#&#8203;10596](https://github.com/astral-sh/ruff/pull/10596)) - \[`flake8-pyi`] Mark `unaliased-collections-abc-set-import` fix as "safe" for more cases in stub files (`PYI025`) ([#&#8203;10547](https://github.com/astral-sh/ruff/pull/10547)) - \[`numpy`] Add `row_stack` to NumPy 2.0 migration rule ([#&#8203;10646](https://github.com/astral-sh/ruff/pull/10646)) - \[`pycodestyle`] Allow cell magics before an import (`E402`) ([#&#8203;10545](https://github.com/astral-sh/ruff/pull/10545)) - \[`pycodestyle`] Avoid blank line rules for the first logical line in cell ([#&#8203;10291](https://github.com/astral-sh/ruff/pull/10291)) ##### Configuration - Respected nested namespace packages ([#&#8203;10541](https://github.com/astral-sh/ruff/pull/10541)) - \[`flake8-boolean-trap`] Add setting for user defined allowed boolean trap ([#&#8203;10531](https://github.com/astral-sh/ruff/pull/10531)) ##### Bug fixes - Correctly handle references in `__all__` definitions when renaming symbols in autofixes ([#&#8203;10527](https://github.com/astral-sh/ruff/pull/10527)) - Track ranges of names inside `__all__` definitions ([#&#8203;10525](https://github.com/astral-sh/ruff/pull/10525)) - \[`flake8-bugbear`] Avoid false positive for usage after `continue` (`B031`) ([#&#8203;10539](https://github.com/astral-sh/ruff/pull/10539)) - \[`flake8-copyright`] Accept commas in default copyright pattern ([#&#8203;9498](https://github.com/astral-sh/ruff/pull/9498)) - \[`flake8-datetimez`] Allow f-strings with `%z` for `DTZ007` ([#&#8203;10651](https://github.com/astral-sh/ruff/pull/10651)) - \[`flake8-pytest-style`] Fix `PT014` autofix for last item in list ([#&#8203;10532](https://github.com/astral-sh/ruff/pull/10532)) - \[`flake8-quotes`] Ignore `Q000`, `Q001` when string is inside forward ref ([#&#8203;10585](https://github.com/astral-sh/ruff/pull/10585)) - \[`isort`] Always place non-relative imports after relative imports ([#&#8203;10669](https://github.com/astral-sh/ruff/pull/10669)) - \[`isort`] Respect Unicode characters in import sorting ([#&#8203;10529](https://github.com/astral-sh/ruff/pull/10529)) - \[`pyflakes`] Fix F821 false negatives when `from __future__ import annotations` is active (attempt 2) ([#&#8203;10524](https://github.com/astral-sh/ruff/pull/10524)) - \[`pyflakes`] Make `unnecessary-lambda` an always-unsafe fix ([#&#8203;10668](https://github.com/astral-sh/ruff/pull/10668)) - \[`pylint`] Fixed false-positive on the rule `PLW1641` (`eq-without-hash`) ([#&#8203;10566](https://github.com/astral-sh/ruff/pull/10566)) - \[`ruff`] Fix panic in unused `# noqa` removal with multi-byte space (`RUF100`) ([#&#8203;10682](https://github.com/astral-sh/ruff/pull/10682)) ##### Documentation - Add PR title format to `CONTRIBUTING.md` ([#&#8203;10665](https://github.com/astral-sh/ruff/pull/10665)) - Fix list markup to include blank lines required ([#&#8203;10591](https://github.com/astral-sh/ruff/pull/10591)) - Put `flake8-logging` next to the other flake8 plugins in registry ([#&#8203;10587](https://github.com/astral-sh/ruff/pull/10587)) - \[`flake8-bandit`] Update warning message for rule `S305` to address insecure block cipher mode use ([#&#8203;10602](https://github.com/astral-sh/ruff/pull/10602)) - \[`flake8-bugbear`] Document use of anonymous assignment in `useless-expression` ([#&#8203;10551](https://github.com/astral-sh/ruff/pull/10551)) - \[`flake8-datetimez`] Clarify error messages and docs for `DTZ` rules ([#&#8203;10621](https://github.com/astral-sh/ruff/pull/10621)) - \[`pycodestyle`] Use same before vs. after numbers for `space-around-operator` ([#&#8203;10640](https://github.com/astral-sh/ruff/pull/10640)) - \[`ruff`] Change `quadratic-list-summation` docs to use `iadd` consistently ([#&#8203;10666](https://github.com/astral-sh/ruff/pull/10666)) ### [`v0.3.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#034) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.3...v0.3.4) ##### Preview features - \[`flake8-simplify`] Detect implicit `else` cases in `needless-bool` (`SIM103`) ([#&#8203;10414](https://github.com/astral-sh/ruff/pull/10414)) - \[`pylint`] Implement `nan-comparison` (`PLW0117`) ([#&#8203;10401](https://github.com/astral-sh/ruff/pull/10401)) - \[`pylint`] Implement `nonlocal-and-global` (`E115`) ([#&#8203;10407](https://github.com/astral-sh/ruff/pull/10407)) - \[`pylint`] Implement `singledispatchmethod-function` (`PLE5120`) ([#&#8203;10428](https://github.com/astral-sh/ruff/pull/10428)) - \[`refurb`] Implement `list-reverse-copy` (`FURB187`) ([#&#8203;10212](https://github.com/astral-sh/ruff/pull/10212)) ##### Rule changes - \[`flake8-pytest-style`] Add automatic fix for `pytest-parametrize-values-wrong-type` (`PT007`) ([#&#8203;10461](https://github.com/astral-sh/ruff/pull/10461)) - \[`pycodestyle`] Allow SPDX license headers to exceed the line length (`E501`) ([#&#8203;10481](https://github.com/astral-sh/ruff/pull/10481)) ##### Formatter - Fix unstable formatting for trailing subscript end-of-line comment ([#&#8203;10492](https://github.com/astral-sh/ruff/pull/10492)) ##### Bug fixes - Avoid code comment detection in PEP 723 script tags ([#&#8203;10464](https://github.com/astral-sh/ruff/pull/10464)) - Avoid incorrect tuple transformation in single-element case (`C409`) ([#&#8203;10491](https://github.com/astral-sh/ruff/pull/10491)) - Bug fix: Prevent fully defined links [`name`](link) from being reformatted ([#&#8203;10442](https://github.com/astral-sh/ruff/pull/10442)) - Consider raw source code for `W605` ([#&#8203;10480](https://github.com/astral-sh/ruff/pull/10480)) - Docs: Link inline settings when not part of options section ([#&#8203;10499](https://github.com/astral-sh/ruff/pull/10499)) - Don't treat annotations as redefinitions in `.pyi` files ([#&#8203;10512](https://github.com/astral-sh/ruff/pull/10512)) - Fix `E231` bug: Inconsistent catch compared to pycodestyle, such as when dict nested in list ([#&#8203;10469](https://github.com/astral-sh/ruff/pull/10469)) - Fix pylint upstream categories not showing in docs ([#&#8203;10441](https://github.com/astral-sh/ruff/pull/10441)) - Add missing `Options` references to blank line docs ([#&#8203;10498](https://github.com/astral-sh/ruff/pull/10498)) - 'Revert "F821: Fix false negatives in .py files when `from __future__ import annotations` is active ([#&#8203;10362](https://github.com/astral-sh/ruff/issues/10362))"' ([#&#8203;10513](https://github.com/astral-sh/ruff/pull/10513)) - Apply NFKC normalization to unicode identifiers in the lexer ([#&#8203;10412](https://github.com/astral-sh/ruff/pull/10412)) - Avoid failures due to non-deterministic binding ordering ([#&#8203;10478](https://github.com/astral-sh/ruff/pull/10478)) - \[`flake8-bugbear`] Allow tuples of exceptions (`B030`) ([#&#8203;10437](https://github.com/astral-sh/ruff/pull/10437)) - \[`flake8-quotes`] Avoid syntax errors due to invalid quotes (`Q000, Q002`) ([#&#8203;10199](https://github.com/astral-sh/ruff/pull/10199)) ### [`v0.3.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#033) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.2...v0.3.3) ##### Preview features - \[`flake8-bandit`]: Implement `S610` rule ([#&#8203;10316](https://github.com/astral-sh/ruff/pull/10316)) - \[`pycodestyle`] Implement `blank-line-at-end-of-file` (`W391`) ([#&#8203;10243](https://github.com/astral-sh/ruff/pull/10243)) - \[`pycodestyle`] Implement `redundant-backslash` (`E502`) ([#&#8203;10292](https://github.com/astral-sh/ruff/pull/10292)) - \[`pylint`] - implement `redeclared-assigned-name` (`W0128`) ([#&#8203;9268](https://github.com/astral-sh/ruff/pull/9268)) ##### Rule changes - \[`flake8_comprehensions`] Handled special case for `C400` which also matches `C416` ([#&#8203;10419](https://github.com/astral-sh/ruff/pull/10419)) - \[`flake8-bandit`] Implement upstream updates for `S311`, `S324` and `S605` ([#&#8203;10313](https://github.com/astral-sh/ruff/pull/10313)) - \[`pyflakes`] Remove `F401` fix for `__init__` imports by default and allow opt-in to unsafe fix ([#&#8203;10365](https://github.com/astral-sh/ruff/pull/10365)) - \[`pylint`] Implement `invalid-bool-return-type` (`E304`) ([#&#8203;10377](https://github.com/astral-sh/ruff/pull/10377)) - \[`pylint`] Include builtin warnings in useless-exception-statement (`PLW0133`) ([#&#8203;10394](https://github.com/astral-sh/ruff/pull/10394)) ##### CLI - Add message on success to `ruff check` ([#&#8203;8631](https://github.com/astral-sh/ruff/pull/8631)) ##### Bug fixes - \[`PIE970`] Allow trailing ellipsis in `typing.TYPE_CHECKING` ([#&#8203;10413](https://github.com/astral-sh/ruff/pull/10413)) - Avoid `TRIO115` if the argument is a variable ([#&#8203;10376](https://github.com/astral-sh/ruff/pull/10376)) - \[`F811`] Avoid removing shadowed imports that point to different symbols ([#&#8203;10387](https://github.com/astral-sh/ruff/pull/10387)) - Fix `F821` and `F822` false positives in `.pyi` files ([#&#8203;10341](https://github.com/astral-sh/ruff/pull/10341)) - Fix `F821` false negatives in `.py` files when `from __future__ import annotations` is active ([#&#8203;10362](https://github.com/astral-sh/ruff/pull/10362)) - Fix case where `Indexer` fails to identify continuation preceded by newline [#&#8203;10351](https://github.com/astral-sh/ruff/issues/10351) ([#&#8203;10354](https://github.com/astral-sh/ruff/pull/10354)) - Sort hash maps in `Settings` display ([#&#8203;10370](https://github.com/astral-sh/ruff/pull/10370)) - Track conditional deletions in the semantic model ([#&#8203;10415](https://github.com/astral-sh/ruff/pull/10415)) - \[`C413`] Wrap expressions in parentheses when negating ([#&#8203;10346](https://github.com/astral-sh/ruff/pull/10346)) - \[`pycodestyle`] Do not ignore lines before the first logical line in blank lines rules. ([#&#8203;10382](https://github.com/astral-sh/ruff/pull/10382)) - \[`pycodestyle`] Do not trigger `E225` and `E275` when the next token is a ')' ([#&#8203;10315](https://github.com/astral-sh/ruff/pull/10315)) - \[`pylint`] Avoid false-positive slot non-assignment for `__dict__` (`PLE0237`) ([#&#8203;10348](https://github.com/astral-sh/ruff/pull/10348)) - Gate f-string struct size test for Rustc < 1.76 ([#&#8203;10371](https://github.com/astral-sh/ruff/pull/10371)) ##### Documentation - Use `ruff.toml` format in README ([#&#8203;10393](https://github.com/astral-sh/ruff/pull/10393)) - \[`RUF008`] Make it clearer that a mutable default in a dataclass is only valid if it is typed as a ClassVar ([#&#8203;10395](https://github.com/astral-sh/ruff/pull/10395)) - \[`pylint`] Extend docs and test in `invalid-str-return-type` (`E307`) ([#&#8203;10400](https://github.com/astral-sh/ruff/pull/10400)) - Remove `.` from `check` and `format` commands ([#&#8203;10217](https://github.com/astral-sh/ruff/pull/10217)) ### [`v0.3.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#032) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.1...v0.3.2) ##### Preview features - Improve single-`with` item formatting for Python 3.8 or older ([#&#8203;10276](https://github.com/astral-sh/ruff/pull/10276)) ##### Rule changes - \[`pyupgrade`] Allow fixes for f-string rule regardless of line length (`UP032`) ([#&#8203;10263](https://github.com/astral-sh/ruff/pull/10263)) - \[`pycodestyle`] Include actual conditions in E712 diagnostics ([#&#8203;10254](https://github.com/astral-sh/ruff/pull/10254)) ##### Bug fixes - Fix trailing kwargs end of line comment after slash ([#&#8203;10297](https://github.com/astral-sh/ruff/pull/10297)) - Fix unstable `with` items formatting ([#&#8203;10274](https://github.com/astral-sh/ruff/pull/10274)) - Avoid repeating function calls in f-string conversions ([#&#8203;10265](https://github.com/astral-sh/ruff/pull/10265)) - Fix E203 false positive for slices in format strings ([#&#8203;10280](https://github.com/astral-sh/ruff/pull/10280)) - Fix incorrect `Parameter` range for `*args` and `**kwargs` ([#&#8203;10283](https://github.com/astral-sh/ruff/pull/10283)) - Treat `typing.Annotated` subscripts as type definitions ([#&#8203;10285](https://github.com/astral-sh/ruff/pull/10285)) ### [`v0.3.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#031) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.0...v0.3.1) ##### Preview features - \[`pycodestyle`] Fix E301 not triggering on decorated methods. ([#&#8203;10117](https://github.com/astral-sh/ruff/pull/10117)) - \[`pycodestyle`] Respect `isort` settings in blank line rules (`E3*`) ([#&#8203;10096](https://github.com/astral-sh/ruff/pull/10096)) - \[`pycodestyle`] Make blank lines in typing stub files optional (`E3*`) ([#&#8203;10098](https://github.com/astral-sh/ruff/pull/10098)) - \[`pylint`] Implement `singledispatch-method` (`E1519`) ([#&#8203;10140](https://github.com/astral-sh/ruff/pull/10140)) - \[`pylint`] Implement `useless-exception-statement` (`W0133`) ([#&#8203;10176](https://github.com/astral-sh/ruff/pull/10176)) ##### Rule changes - \[`flake8-debugger`] Check for use of `debugpy` and `ptvsd` debug modules ([#&#8203;10177](https://github.com/astral-sh/ruff/issues/10177)) ([#&#8203;10194](https://github.com/astral-sh/ruff/pull/10194)) - \[`pyupgrade`] Generate diagnostic for all valid f-string conversions regardless of line length (`UP032`) ([#&#8203;10238](https://github.com/astral-sh/ruff/pull/10238)) - \[`pep8_naming`] Add fixes for `N804` and `N805` ([#&#8203;10215](https://github.com/astral-sh/ruff/pull/10215)) ##### CLI - Colorize the output of `ruff format --diff` ([#&#8203;10110](https://github.com/astral-sh/ruff/pull/10110)) - Make `--config` and `--isolated` global flags ([#&#8203;10150](https://github.com/astral-sh/ruff/pull/10150)) - Correctly expand tildes and environment variables in paths passed to `--config` ([#&#8203;10219](https://github.com/astral-sh/ruff/pull/10219)) ##### Configuration - Accept a PEP 440 version specifier for `required-version` ([#&#8203;10216](https://github.com/astral-sh/ruff/pull/10216)) - Implement isort's `default-section` setting ([#&#8203;10149](https://github.com/astral-sh/ruff/pull/10149)) ##### Bug fixes - Remove trailing space from `CapWords` message ([#&#8203;10220](https://github.com/astral-sh/ruff/pull/10220)) - Respect external codes in file-level exemptions ([#&#8203;10203](https://github.com/astral-sh/ruff/pull/10203)) - \[`flake8-raise`] Avoid false-positives for parens-on-raise with `future.exception()` (`RSE102`) ([#&#8203;10206](https://github.com/astral-sh/ruff/pull/10206)) - \[`pylint`] Add fix for unary expressions in `PLC2801` ([#&#8203;9587](https://github.com/astral-sh/ruff/pull/9587)) - \[`ruff`] Fix RUF028 not allowing `# fmt: skip` on match cases ([#&#8203;10178](https://github.com/astral-sh/ruff/pull/10178)) ### [`v0.3.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#030) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.2.2...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. ##### Preview features - \[`flake8-bandit`] Remove suspicious-lxml-import (`S410`) ([#&#8203;10154](https://github.com/astral-sh/ruff/pull/10154)) - \[`pycodestyle`] Allow `os.environ` modifications between imports (`E402`) ([#&#8203;10066](https://github.com/astral-sh/ruff/pull/10066)) - \[`pycodestyle`] Don't warn about a single whitespace character before a comma in a tuple (`E203`) ([#&#8203;10094](https://github.com/astral-sh/ruff/pull/10094)) ##### Rule changes - \[`eradicate`] Detect commented out `case` statements (`ERA001`) ([#&#8203;10055](https://github.com/astral-sh/ruff/pull/10055)) - \[`eradicate`] Detect single-line code for `try:`, `except:`, etc. (`ERA001`) ([#&#8203;10057](https://github.com/astral-sh/ruff/pull/10057)) - \[`flake8-boolean-trap`] Allow boolean positionals in `__post_init__` ([#&#8203;10027](https://github.com/astral-sh/ruff/pull/10027)) - \[`flake8-copyright`] Allow © in copyright notices ([#&#8203;10065](https://github.com/astral-sh/ruff/pull/10065)) - \[`isort`]: Use one blank line after imports in typing stub files ([#&#8203;9971](https://github.com/astral-sh/ruff/pull/9971)) - \[`pylint`] New Rule `dict-iter-missing-items` (`PLE1141`) ([#&#8203;9845](https://github.com/astral-sh/ruff/pull/9845)) - \[`pylint`] Ignore `sys.version` and `sys.platform` (`PLR1714`) ([#&#8203;10054](https://github.com/astral-sh/ruff/pull/10054)) - \[`pyupgrade`] Detect literals with unary operators (`UP018`) ([#&#8203;10060](https://github.com/astral-sh/ruff/pull/10060)) - \[`ruff`] Expand rule for `list(iterable).pop(0)` idiom (`RUF015`) ([#&#8203;10148](https://github.com/astral-sh/ruff/pull/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 ([#&#8203;8943](https://github.com/astral-sh/ruff/pull/8943)) - Remove blank lines before class docstrings ([#&#8203;9154](https://github.com/astral-sh/ruff/pull/9154)) - Wrap multiple context managers in `with` parentheses when targeting Python 3.9 or newer ([#&#8203;9222](https://github.com/astral-sh/ruff/pull/9222)) - Add a blank line after nested classes with a dummy body (`...`) in typing stub files ([#&#8203;9155](https://github.com/astral-sh/ruff/pull/9155)) - Reduce vertical spacing for classes and functions with a dummy (`...`) body ([#&#8203;7440](https://github.com/astral-sh/ruff/issues/7440), [#&#8203;9240](https://github.com/astral-sh/ruff/pull/9240)) - Add a blank line after the module docstring ([#&#8203;8283](https://github.com/astral-sh/ruff/pull/8283)) - Parenthesize long type hints in assignments ([#&#8203;9210](https://github.com/astral-sh/ruff/pull/9210)) - Preserve indent for single multiline-string call-expressions ([#&#8203;9673](https://github.com/astral-sh/ruff/pull/9637)) - Normalize hex escape and unicode escape sequences ([#&#8203;9280](https://github.com/astral-sh/ruff/pull/9280)) - Format module docstrings ([#&#8203;9725](https://github.com/astral-sh/ruff/pull/9725)) ##### CLI - Explicitly disallow `extend` as part of a `--config` flag ([#&#8203;10135](https://github.com/astral-sh/ruff/pull/10135)) - Remove `build` from the default exclusion list ([#&#8203;10093](https://github.com/astral-sh/ruff/pull/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` ([#&#8203;10169](https://github.com/astral-sh/ruff/pull/10169)) - Remove the deprecated CLI option `--format` from `ruff rule` and `ruff linter` ([#&#8203;10170](https://github.com/astral-sh/ruff/pull/10170)) ##### Bug fixes - \[`flake8-bugbear`] Avoid adding default initializers to stubs (`B006`) ([#&#8203;10152](https://github.com/astral-sh/ruff/pull/10152)) - \[`flake8-type-checking`] Respect runtime-required decorators for function signatures ([#&#8203;10091](https://github.com/astral-sh/ruff/pull/10091)) - \[`pycodestyle`] Mark fixes overlapping with a multiline string as unsafe (`W293`) ([#&#8203;10049](https://github.com/astral-sh/ruff/pull/10049)) - \[`pydocstyle`] Trim whitespace when removing blank lines after section (`D413`) ([#&#8203;10162](https://github.com/astral-sh/ruff/pull/10162)) - \[`pylint`] Delete entire statement, including semicolons (`PLR0203`) ([#&#8203;10074](https://github.com/astral-sh/ruff/pull/10074)) - \[`ruff`] Avoid f-string false positives in `gettext` calls (`RUF027`) ([#&#8203;10118](https://github.com/astral-sh/ruff/pull/10118)) - Fix `ruff` crashing on PowerPC systems because of too small page size ([#&#8203;10080](https://github.com/astral-sh/ruff/pull/10080)) ##### Performance - Add cold attribute to less likely printer queue branches in the formatter ([#&#8203;10121](https://github.com/astral-sh/ruff/pull/10121)) - Skip unnecessary string normalization in the formatter ([#&#8203;10116](https://github.com/astral-sh/ruff/pull/10116)) ##### Documentation - Remove "Beta" Label from formatter documentation ([#&#8203;10144](https://github.com/astral-sh/ruff/pull/10144)) - `line-length` option: fix link to `pycodestyle.max-line-length` ([#&#8203;10136](https://github.com/astral-sh/ruff/pull/10136)) ### [`v0.2.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#022) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.2.1...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. ##### Preview features - Implement minimal f-string formatting ([#&#8203;9642](https://github.com/astral-sh/ruff/pull/9642)) - \[`pycodestyle`] Add blank line(s) rules (`E301`, `E302`, `E303`, `E304`, `E305`, `E306`) ([#&#8203;9266](https://github.com/astral-sh/ruff/pull/9266)) - \[`refurb`] Implement `readlines_in_for` (`FURB129`) ([#&#8203;9880](https://github.com/astral-sh/ruff/pull/9880)) ##### Rule changes - \[`ruff`] Ensure closing parentheses for multiline sequences are always on their own line (`RUF022`, `RUF023`) ([#&#8203;9793](https://github.com/astral-sh/ruff/pull/9793)) - \[`numpy`] Add missing deprecation violations (`NPY002`) ([#&#8203;9862](https://github.com/astral-sh/ruff/pull/9862)) - \[`flake8-bandit`] Detect `mark_safe` usages in decorators ([#&#8203;9887](https://github.com/astral-sh/ruff/pull/9887)) - \[`ruff`] Expand `asyncio-dangling-task` (`RUF006`) to include `new_event_loop` ([#&#8203;9976](https://github.com/astral-sh/ruff/pull/9976)) - \[`flake8-pyi`] Ignore 'unused' private type dicts in class scopes ([#&#8203;9952](https://github.com/astral-sh/ruff/pull/9952)) ##### Formatter - Docstring formatting: Preserve tab indentation when using `indent-style=tabs` ([#&#8203;9915](https://github.com/astral-sh/ruff/pull/9915)) - Disable top-level docstring formatting for notebooks ([#&#8203;9957](https://github.com/astral-sh/ruff/pull/9957)) - Stabilize quote-style's `preserve` mode ([#&#8203;9922](https://github.com/astral-sh/ruff/pull/9922)) ##### CLI - Allow arbitrary configuration options to be overridden via the CLI ([#&#8203;9599](https://github.com/astral-sh/ruff/pull/9599)) ##### Bug fixes - Make `show-settings` filters directory-agnostic ([#&#8203;9866](https://github.com/astral-sh/ruff/pull/9866)) - Respect duplicates when rewriting type aliases ([#&#8203;9905](https://github.com/astral-sh/ruff/pull/9905)) - Respect tuple assignments in typing analyzer ([#&#8203;9969](https://github.com/astral-sh/ruff/pull/9969)) - Use atomic write when persisting cache ([#&#8203;9981](https://github.com/astral-sh/ruff/pull/9981)) - Use non-parenthesized range for `DebugText` ([#&#8203;9953](https://github.com/astral-sh/ruff/pull/9953)) - \[`flake8-simplify`] Avoid false positive with `async` for loops (`SIM113`) ([#&#8203;9996](https://github.com/astral-sh/ruff/pull/9996)) - \[`flake8-trio`] Respect `async with` in `timeout-without-await` ([#&#8203;9859](https://github.com/astral-sh/ruff/pull/9859)) - \[`perflint`] Catch a wider range of mutations in `PERF101` ([#&#8203;9955](https://github.com/astral-sh/ruff/pull/9955)) - \[`pycodestyle`] Fix `E30X` panics on blank lines with trailing white spaces ([#&#8203;9907](https://github.com/astral-sh/ruff/pull/9907)) - \[`pydocstyle`] Allow using `parameters` as a subsection header (`D405`) ([#&#8203;9894](https://github.com/astral-sh/ruff/pull/9894)) - \[`pydocstyle`] Fix blank-line docstring rules for module-level docstrings ([#&#8203;9878](https://github.com/astral-sh/ruff/pull/9878)) - \[`pylint`] Accept 0.0 and 1.0 as common magic values (`PLR2004`) ([#&#8203;9964](https://github.com/astral-sh/ruff/pull/9964)) - \[`pylint`] Avoid suggesting set rewrites for non-hashable types ([#&#8203;9956](https://github.com/astral-sh/ruff/pull/9956)) - \[`ruff`] Avoid false negatives with string literals inside of method calls (`RUF027`) ([#&#8203;9865](https://github.com/astral-sh/ruff/pull/9865)) - \[`ruff`] Fix panic on with f-string detection (`RUF027`) ([#&#8203;9990](https://github.com/astral-sh/ruff/pull/9990)) - \[`ruff`] Ignore builtins when detecting missing f-strings ([#&#8203;9849](https://github.com/astral-sh/ruff/pull/9849)) ##### Performance - Use `memchr` for string lexing ([#&#8203;9888](https://github.com/astral-sh/ruff/pull/9888)) - Use `memchr` for tab-indentation detection ([#&#8203;9853](https://github.com/astral-sh/ruff/pull/9853)) - Reduce `Result<Tok, LexicalError>` size by using `Box<str>` instead of `String` ([#&#8203;9885](https://github.com/astral-sh/ruff/pull/9885)) - Reduce size of `Expr` from 80 to 64 bytes ([#&#8203;9900](https://github.com/astral-sh/ruff/pull/9900)) - Improve trailing comma rule performance ([#&#8203;9867](https://github.com/astral-sh/ruff/pull/9867)) - Remove unnecessary string cloning from the parser ([#&#8203;9884](https://github.com/astral-sh/ruff/pull/9884)) ### [`v0.2.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#021) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.2.0...v0.2.1) 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`) ([#&#8203;9728](https://github.com/astral-sh/ruff/pull/9728)) - Format module-level docstrings ([#&#8203;9725](https://github.com/astral-sh/ruff/pull/9725)) ##### Formatter - Add `--range` option to `ruff format` ([#&#8203;9733](https://github.com/astral-sh/ruff/pull/9733)) - Don't trim last empty line in docstrings ([#&#8203;9813](https://github.com/astral-sh/ruff/pull/9813)) ##### Bug fixes - Skip empty lines when determining base indentation ([#&#8203;9795](https://github.com/astral-sh/ruff/pull/9795)) - Drop `__get__` and `__set__` from `unnecessary-dunder-call` ([#&#8203;9791](https://github.com/astral-sh/ruff/pull/9791)) - Respect generic `Protocol` in ellipsis removal ([#&#8203;9841](https://github.com/astral-sh/ruff/pull/9841)) - Revert "Use publicly available Apple Silicon runners ([#&#8203;9726](https://github.com/astral-sh/ruff/issues/9726))" ([#&#8203;9834](https://github.com/astral-sh/ruff/pull/9834)) ##### Performance - Skip LibCST parsing for standard dedent adjustments ([#&#8203;9769](https://github.com/astral-sh/ruff/pull/9769)) - Remove CST-based fixer for `C408` ([#&#8203;9822](https://github.com/astral-sh/ruff/pull/9822)) - Add our own ignored-names abstractions ([#&#8203;9802](https://github.com/astral-sh/ruff/pull/9802)) - Remove CST-based fixers for `C400`, `C401`, `C410`, and `C418` ([#&#8203;9819](https://github.com/astral-sh/ruff/pull/9819)) - Use `AhoCorasick` to speed up quote match ([#&#8203;9773](https://github.com/astral-sh/ruff/pull/9773)) - Remove CST-based fixers for `C405` and `C409` ([#&#8203;9821](https://github.com/astral-sh/ruff/pull/9821)) - Add fast-path for comment detection ([#&#8203;9808](https://github.com/astral-sh/ruff/pull/9808)) - Invert order of checks in `zero-sleep-call` ([#&#8203;9766](https://github.com/astral-sh/ruff/pull/9766)) - Short-circuit typing matches based on imports ([#&#8203;9800](https://github.com/astral-sh/ruff/pull/9800)) - Run dunder method rule on methods directly ([#&#8203;9815](https://github.com/astral-sh/ruff/pull/9815)) - Track top-level module imports in the semantic model ([#&#8203;9775](https://github.com/astral-sh/ruff/pull/9775)) - Slight speed-up for lowercase and uppercase identifier checks ([#&#8203;9798](https://github.com/astral-sh/ruff/pull/9798)) - Remove LibCST-based fixer for `C403` ([#&#8203;9818](https://github.com/astral-sh/ruff/pull/9818)) ##### Documentation - Update `max-pos-args` example to `max-positional-args` ([#&#8203;9797](https://github.com/astral-sh/ruff/pull/9797)) - Fixed example code in `weak_cryptographic_key.rs` ([#&#8203;9774](https://github.com/astral-sh/ruff/pull/9774)) - Fix references to deprecated `ANN` rules in changelog ([#&#8203;9771](https://github.com/astral-sh/ruff/pull/9771)) - Fix default for `max-positional-args` ([#&#8203;9838](https://github.com/astral-sh/ruff/pull/9838)) ### [`v0.2.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#020) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.15...v0.2.0) ##### 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`](https://docs.astral.sh/ruff/rules/missing-type-self/) (`ANN101`) - [`missing-type-cls`](https://docs.astral.sh/ruff/rules/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`; use `full` or `concise` instead The following settings have moved and the previous name is deprecated: - `ruff.allowed-confusables` → [`ruff.lint.allowed-confusables`](https://docs.astral.sh//ruff/settings/#lint_allowed-confusables) - `ruff.dummy-variable-rgx` → [`ruff.lint.dummy-variable-rgx`](https://docs.astral.sh//ruff/settings/#lint_dummy-variable-rgx) - `ruff.explicit-preview-rules` → [`ruff.lint.explicit-preview-rules`](https://docs.astral.sh//ruff/settings/#lint_explicit-preview-rules) - `ruff.extend-fixable` → [`ruff.lint.extend-fixable`](https://docs.astral.sh//ruff/settings/#lint_extend-fixable) - `ruff.extend-ignore` → [`ruff.lint.extend-ignore`](https://docs.astral.sh//ruff/settings/#lint_extend-ignore) - `ruff.extend-per-file-ignores` → [`ruff.lint.extend-per-file-ignores`](https://docs.astral.sh//ruff/settings/#lint_extend-per-file-ignores) - `ruff.extend-safe-fixes` → [`ruff.lint.extend-safe-fixes`](https://docs.astral.sh//ruff/settings/#lint_extend-safe-fixes) - `ruff.extend-select` → [`ruff.lint.extend-select`](https://docs.astral.sh//ruff/settings/#lint_extend-select) - `ruff.extend-unfixable` → [`ruff.lint.extend-unfixable`](https://docs.astral.sh//ruff/settings/#lint_extend-unfixable) - `ruff.extend-unsafe-fixes` → [`ruff.lint.extend-unsafe-fixes`](https://docs.astral.sh//ruff/settings/#lint_extend-unsafe-fixes) - `ruff.external` → [`ruff.lint.external`](https://docs.astral.sh//ruff/settings/#lint_external) - `ruff.fixable` → [`ruff.lint.fixable`](https://docs.astral.sh//ruff/settings/#lint_fixable) - `ruff.flake8-annotations` → [`ruff.lint.flake8-annotations`](https://docs.astral.sh//ruff/settings/#lint_flake8-annotations) - `ruff.flake8-bandit` → [`ruff.lint.flake8-bandit`](https://docs.astral.sh//ruff/settings/#lint_flake8-bandit) - `ruff.flake8-bugbear` → [`ruff.lint.flake8-bugbear`](https://docs.astral.sh//ruff/settings/#lint_flake8-bugbear) - `ruff.flake8-builtins` → [`ruff.lint.flake8-builtins`](https://docs.astral.sh//ruff/settings/#lint_flake8-builtins) - `ruff.flake8-comprehensions` → [`ruff.lint.flake8-comprehensions`](https://docs.astral.sh//ruff/settings/#lint_flake8-comprehensions) - `ruff.flake8-copyright` → [`ruff.lint.flake8-copyright`](https://docs.astral.sh//ruff/settings/#lint_flake8-copyright) - `ruff.flake8-errmsg` → [`ruff.lint.flake8-errmsg`](https://docs.astral.sh//ruff/settings/#lint_flake8-errmsg) - `ruff.flake8-gettext` → [`ruff.lint.flake8-gettext`](https://docs.astral.sh//ruff/settings/#lint_flake8-gettext) - `ruff.flake8-implicit-str-concat` → [`ruff.lint.flake8-implicit-str-concat`](https://docs.astral.sh//ruff/settings/#lint_flake8-implicit-str-concat) - `ruff.flake8-import-conventions` → [`ruff.lint.flake8-import-conventions`](https://docs.astral.sh//ruff/settings/#lint_flake8-import-conventions) - `ruff.flake8-pytest-style` → [`ruff.lint.flake8-pytest-style`](https://docs.astral.sh//ruff/settings/#lint_flake8-pytest-style) - `ruff.flake8-quotes` → [`ruff.lint.flake8-quotes`](https://docs.astral.sh//ruff/settings/#lint_flake8-quotes) - `ruff.flake8-self` → [`ruff.lint.flake8-self`](https://docs.astral.sh//ruff/settings/#lint_flake8-self) - `ruff.flake8-tidy-imports` → [`ruff.lint.flake8-tidy-imports`](https://docs.astral.sh//ruff/settings/#lint_flake8-tidy-imports) - `ruff.flake8-type-checking` → [`ruff.lint.flake8-type-checking`](https://docs.astral.sh//ruff/settings/#lint_flake8-type-checking) - `ruff.flake8-unused-arguments` → [`ruff.lint.flake8-unused-arguments`](https://docs.astral.sh//ruff/settings/#lint_flake8-unused-arguments) - `ruff.ignore` → [`ruff.lint.ignore`](https://docs.astral.sh//ruff/settings/#lint_ignore) - `ruff.ignore-init-module-imports` → [`ruff.lint.ignore-init-module-imports`](https://docs.astral.sh//ruff/settings/#lint_ignore-init-module-imports) - `ruff.isort` → [`ruff.lint.isort`](https://docs.astral.sh//ruff/settings/#lint_isort) - `ruff.logger-objects` → [`ruff.lint.logger-objects`](https://docs.astral.sh//ruff/settings/#lint_logger-objects) - `ruff.mccabe` → [`ruff.lint.mccabe`](https://docs.astral.sh//ruff/settings/#lint_mccabe) - `ruff.pep8-naming` → [`ruff.lint.pep8-naming`](https://docs.astral.sh//ruff/settings/#lint_pep8-naming) - `ruff.per-file-ignores` → [`ruff.lint.per-file-ignores`](https://docs.astral.sh//ruff/settings/#lint_per-file-ignores) - `ruff.pycodestyle` → [`ruff.lint.pycodestyle`](https://docs.astral.sh//ruff/settings/#lint_pycodestyle) - `ruff.pydocstyle` → [`ruff.lint.pydocstyle`](https://docs.astral.sh//ruff/settings/#lint_pydocstyle) - `ruff.pyflakes` → [`ruff.lint.pyflakes`](https://docs.astral.sh//ruff/settings/#lint_pyflakes) - `ruff.pylint` → [`ruff.lint.pylint`](https://docs.astral.sh//ruff/settings/#lint_pylint) - `ruff.pyupgrade` → [`ruff.lint.pyupgrade`](https://docs.astral.sh//ruff/settings/#lint_pyupgrade) - `ruff.select` → [`ruff.lint.select`](https://docs.astral.sh//ruff/settings/#lint_select) - `ruff.task-tags` → [`ruff.lint.task-tags`](https://docs.astral.sh//ruff/settings/#lint_task-tags) - `ruff.typing-modules` → [`ruff.lint.typing-modules`](https://docs.astral.sh//ruff/settings/#lint_typing-modules) - `ruff.unfixable` → [`ruff.lint.unfixable`](https://docs.astral.sh//ruff/settings/#lint_unfixable) ##### Remapped rules The following rules have been remapped to new codes: - [`raise-without-from-inside-except`](https://docs.astral.sh/ruff/rules/raise-without-from-inside-except/): `TRY200` to `B904` - [`suspicious-eval-usage`](https://docs.astral.sh/ruff/rules/suspicious-eval-usage/): `PGH001` to `S307` - [`logging-warn`](https://docs.astral.sh/ruff/rules/logging-warn/): `PGH002` to `G010` - [`static-key-dict-comprehension`](https://docs.astral.sh/ruff/rules/static-key-dict-comprehension): `RUF011` to `B035` - [`runtime-string-union`](https://docs.astral.sh/ruff/rules/runtime-string-union): `TCH006` to `TCH010` ##### Stabilizations The following rules have been stabilized and are no longer in preview: - [`trio-timeout-without-await`](https://docs.astral.sh/ruff/rules/trio-timeout-without-await) (`TRIO100`) - [`trio-sync-call`](https://docs.astral.sh/ruff/rules/trio-sync-call) (`TRIO105`) - [`trio-async-function-with-timeout`](https://docs.astral.sh/ruff/rules/trio-async-function-with-timeout) (`TRIO109`) - [`trio-unneeded-sleep`](https://docs.astral.sh/ruff/rules/trio-unneeded-sleep) (`TRIO110`) - [`trio-zero-sleep-call`](https://docs.astral.sh/ruff/rules/trio-zero-sleep-call) (`TRIO115`) - [`unnecessary-escaped-quote`](https://docs.astral.sh/ruff/rules/unnecessary-escaped-quote) (`Q004`) - [`enumerate-for-loop`](https://docs.astral.sh/ruff/rules/enumerate-for-loop) (`SIM113`) - [`zip-dict-keys-and-values`](https://docs.astral.sh/ruff/rules/zip-dict-keys-and-values) (`SIM911`) - [`timeout-error-alias`](https://docs.astral.sh/ruff/rules/timeout-error-alias) (`UP041`) - [`flask-debug-true`](https://docs.astral.sh/ruff/rules/flask-debug-true) (`S201`) - [`tarfile-unsafe-members`](https://docs.astral.sh/ruff/rules/tarfile-unsafe-members) (`S202`) - [`ssl-insecure-version`](https://docs.astral.sh/ruff/rules/ssl-insecure-version) (`S502`) - [`ssl-with-bad-defaults`](https://docs.astral.sh/ruff/rules/ssl-with-bad-defaults) (`S503`) - [`ssl-with-no-version`](https://docs.astral.sh/ruff/rules/ssl-with-no-version) (`S504`) - [`weak-cryptographic-key`](https://docs.astral.sh/ruff/rules/weak-cryptographic-key) (`S505`) - [`ssh-no-host-key-verification`](https://docs.astral.sh/ruff/rules/ssh-no-host-key-verification) (`S507`) - [`django-raw-sql`](https://docs.astral.sh/ruff/rules/django-raw-sql) (`S611`) - [`mako-templates`](https://docs.astral.sh/ruff/rules/mako-templates) (`S702`) - [`generator-return-from-iter-method`](https://docs.astral.sh/ruff/rules/generator-return-from-iter-method) (`PYI058`) - [`runtime-string-union`](https://docs.astral.sh/ruff/rules/runtime-string-union) (`TCH006`) - [`numpy2-deprecation`](https://docs.astral.sh/ruff/rules/numpy2-deprecation) (`NPY201`) - [`quadratic-list-summation`](https://docs.astral.sh/ruff/rules/quadratic-list-summation) (`RUF017`) - [`assignment-in-assert`](https://docs.astral.sh/ruff/rules/assignment-in-assert) (`RUF018`) - [`unnecessary-key-check`](https://docs.astral.sh/ruff/rules/unnecessary-key-check) (`RUF019`) - [`never-union`](https://docs.astral.sh/ruff/rules/never-union) (`RUF020`) - [`direct-logger-instantiation`](https://docs.astral.sh/ruff/rules/direct-logger-instantiation) (`LOG001`) - [`invalid-get-logger-argument`](https://docs.astral.sh/ruff/rules/invalid-get-logger-argument) (`LOG002`) - [`exception-without-exc-info`](https://docs.astral.sh/ruff/rules/exception-without-exc-info) (`LOG007`) - [`undocumented-warn`](https://docs.astral.sh/ruff/rules/undocumented-warn) (`LOG009`) Fixes for the following rules have been stabilized and are now available without preview: - [`triple-single-quotes`](https://docs.astral.sh/ruff/rules/triple-single-quotes) (`D300`) - [`non-pep604-annotation`](https://docs.astral.sh/ruff/rules/non-pep604-annotation) (`UP007`) - [`dict-get-with-none-default`](https://docs.astral.sh/ruff/rules/dict-get-with-none-default) (`SIM910`) - [`in-dict-keys`](https://docs.astral.sh/ruff/rules/in-dict-keys) (`SIM118`) - [`collapsible-else-if`](https://docs.astral.sh/ruff/rules/collapsible-else-if) (`PLR5501`) - [`if-with-same-arms`](https://docs.astral.sh/ruff/rules/if-with-same-arms) (`SIM114`) - [`useless-else-on-loop`](https://docs.astral.sh/ruff/rules/useless-else-on-loop) (`PLW0120`) - [`unnecessary-literal-union`](https://docs.astral.sh/ruff/rules/unnecessary-literal-union) (`PYI030`) - [`unnecessary-spread`](https://docs.astral.sh/ruff/rules/unnecessary-spread) (`PIE800`) - [`error-instead-of-exception`](https://docs.astral.sh/ruff/rules/error-instead-of-exception) (`TRY400`) - [`redefined-while-unused`](https://docs.astral.sh/ruff/rules/redefined-while-unused) (`F811`) - [`duplicate-value`](https://docs.astral.sh/ruff/rules/duplicate-value) (`B033`) - [`multiple-imports-on-one-line`](https://docs.astral.sh/ruff/rules/multiple-imports-on-one-line) (`E401`) - [`non-pep585-annotation`](https://docs.astral.sh/ruff/rules/non-pep585-annotation) (`UP006`) Fixes for the following rules have been promoted from unsafe to safe: - [`unaliased-collections-abc-set-import`](https://docs.astral.sh/ruff/rules/unaliased-collections-abc-set-import) (`PYI025`) The following behaviors have been stabilized: - [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/) (`E402`) allows `sys.path` modifications between imports - [`reimplemented-container-builtin`](https://docs.astral.sh/ruff/rules/reimplemented-container-builtin/) (`PIE807`) includes lambdas that can be replaced with `dict` - [`unnecessary-placeholder`](https://docs.astral.sh/ruff/rules/unnecessary-placeholder/) (`PIE790`) applies to unnecessary ellipses (`...`) - [`if-else-block-instead-of-dict-get`](https://docs.astral.sh/ruff/rules/if-else-block-instead-of-dict-get/) (`SIM401`) applies to `if-else` expressions ##### Preview features - \[`refurb`] Implement `metaclass_abcmeta` (`FURB180`) ([#&#8203;9658](https://github.com/astral-sh/ruff/pull/9658)) - Implement `blank_line_after_nested_stub_class` preview style ([#&#8203;9155](https://github.com/astral-sh/ruff/pull/9155)) - The preview rule [`and-or-ternary`](https://docs.astral.sh/ruff/rules/and-or-ternary) (`PLR1706`) was removed ##### Bug fixes - \[`flake8-async`] Take `pathlib.Path` into account when analyzing async functions ([#&#8203;9703](https://github.com/astral-sh/ruff/pull/9703)) - \[`flake8-return`] - fix indentation syntax error (`RET505`) ([#&#8203;9705](https://github.com/astral-sh/ruff/pull/9705)) - Detect multi-statement lines in else removal ([#&#8203;9748](https://github.com/astral-sh/ruff/pull/9748)) - `RUF022`, `RUF023`: never add two trailing commas to the end of a sequence ([#&#8203;9698](https://github.com/astral-sh/ruff/pull/9698)) - `RUF023`: Don't sort `__match_args__`, only `__slots__` ([#&#8203;9724](https://github.com/astral-sh/ruff/pull/9724)) - \[`flake8-simplify`] - Fix syntax error in autofix (`SIM114`) ([#&#8203;9704](https://github.com/astral-sh/ruff/pull/9704)) - \[`pylint`] Show verbatim constant in `magic-value-comparison` (`PLR2004`) ([#&#8203;9694](https://github.com/astral-sh/ruff/pull/9694)) - Removing trailing whitespace inside multiline strings is unsafe ([#&#8203;9744](https://github.com/astral-sh/ruff/pull/9744)) - Support `IfExp` with dual string arms in `invalid-envvar-default` ([#&#8203;9734](https://github.com/astral-sh/ruff/pull/9734)) - \[`pylint`] Add `__mro_entries__` to known dunder methods (`PLW3201`) ([#&#8203;9706](https://github.com/astral-sh/ruff/pull/9706)) ##### Documentation - Removed rules are now retained in the documentation ([#&#8203;9691](https://github.com/astral-sh/ruff/pull/9691)) - Deprecated rules are now indicated in the documentation ([#&#8203;9689](https://github.com/astral-sh/ruff/pull/9689)) ### [`v0.1.15`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0115) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.14...v0.1.15) ##### Preview features - Error when `NURSERY` selector is used with `--preview` ([#&#8203;9682](https://github.com/astral-sh/ruff/pull/9682)) - Preserve indentation around multiline strings in formatter ([#&#8203;9637](https://github.com/astral-sh/ruff/pull/9637)) - \[`flake8-return`] Add fixes for all rules (`RET505`, `RET506`, `RET507`, `RET508`) ([#&#8203;9595](https://github.com/astral-sh/ruff/pull/9595)) - \[`flake8-simplify`] Add fix for `if-with-same-arms` (`SIM114`) ([#&#8203;9591](https://github.com/astral-sh/ruff/pull/9591)) - \[`pycodestyle`] Add fix for `multiple-imports-on-one-line` (`E401`) ([#&#8203;9518](https://github.com/astral-sh/ruff/pull/9518)) - \[`pylint`] Add fix for `collapsible-else-if` (`PLR5501`) ([#&#8203;9594](https://github.com/astral-sh/ruff/pull/9594)) - \[`pylint`] Add fix for `useless-else-on-loop` (`PLW0120`) ([#&#8203;9590](https://github.com/astral-sh/ruff/pull/9590)) - \[`pylint`] Implement `assigning-non-slot` (`E0237`) ([#&#8203;9623](https://github.com/astral-sh/ruff/pull/9623)) - \[`pylint`] Implement `potential-index-error` (`PLE0643`) ([#&#8203;9545](https://github.com/astral-sh/ruff/pull/9545)) - \[`pylint`] Implement `too-many-nested-blocks` (`PLR1702`) ([#&#8203;9172](https://github.com/astral-sh/ruff/pull/9172)) - \[`ruff`] Add rule to sort `__slots__` and `__match_args__` ([#&#8203;9564](https://github.com/astral-sh/ruff/pull/9564)) - \[`ruff`] Detect unnecessary `dict` comprehensions for iterables (`RUF025`) ([#&#8203;9613](https://github.com/astral-sh/ruff/pull/9613)) - \[`ruff`] Guard against use of `default_factory` as a keyword argument (`RUF026`) ([#&#8203;9651](https://github.com/astral-sh/ruff/pull/9651)) - \[`ruff`] Implement `mutable-fromkeys-value` (`RUF024`) ([#&#8203;9597](https://github.com/astral-sh/ruff/pull/9597)) ##### CLI - Enable auto-wrapping of `--help` output ([#&#8203;9633](https://github.com/astral-sh/ruff/pull/9633)) ##### Bug fixes - Avoid rendering display-only rules as fixable ([#&#8203;9649](https://github.com/astral-sh/ruff/pull/9649)) - Detect automagic-like assignments in notebooks ([#&#8203;9653](https://github.com/astral-sh/ruff/pull/9653)) - Generate custom JSON schema for dynamic setting ([#&#8203;9632](https://github.com/astral-sh/ruff/pull/9632)) - \[`flake8-no-pep420`] Include global `--config` when determining namespace packages ([#&#8203;9603](https://github.com/astral-sh/ruff/pull/9603)) - \[`flake8-pie`] Omit bound tuples passed to `.startswith` or `.endswith` ([#&#8203;9661](https://github.com/astral-sh/ruff/pull/9661)) - \[`flake8-return`] Avoid panic when fixing inlined else blocks ([#&#8203;9657](https://github.com/astral-sh/ruff/pull/9657)) - \[`flake8-return`] Consider exception suppression in unnecessary assignment ([#&#8203;9673](https://github.com/astral-sh/ruff/pull/9673)) - \[`flake8-return`] Take `NoReturn` annotation into account when analyzing implicit returns ([#&#8203;9636](https://github.com/astral-sh/ruff/pull/9636)) - \[`flake8-simplify`] Support inverted returns in `needless-bool` (`SIM103`) ([#&#8203;9619](https://github.com/astral-sh/ruff/pull/9619)) - \[`flake8-type-checking`] Add Pydantic's `BaseConfig` to default-copy list ([#&#8203;9650](https://github.com/astral-sh/ruff/pull/9650)) - \[`flake8-type-checking`] Avoid marking `InitVar` as a typing-only annotation ([#&#8203;9688](https://github.com/astral-sh/ruff/pull/9688)) - \[`pycodestyle`] Allow `dtype` comparisons in `type-comparison` ([#&#8203;9676](https://github.com/astral-sh/ruff/pull/9676)) - \[`pydocstyle`] Re-implement `last-line-after-section` (`D413`) ([#&#8203;9654](https://github.com/astral-sh/ruff/pull/9654)) ##### Documentation - \[`flake8-pytest-style`] Add fix safety documentation for `duplicate-parameterize-test-cases` ([#&#8203;9678](https://github.com/astral-sh/ruff/pull/9678)) - \[`pylint`] Document `literal-membership` fix safety conditions ([#&#8203;9677](https://github.com/astral-sh/ruff/pull/9677)) - \[`isort`] Fix reference to `isort` rule code ([#&#8203;9598](https://github.com/astral-sh/ruff/pull/9598)) ### [`v0.1.14`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0114) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.13...v0.1.14) ##### Preview features - \[`flake8-bugbear`] Add fix for `duplicate-value` (`B033`) ([#&#8203;9510](https://github.com/astral-sh/ruff/pull/9510)) - \[`flake8-simplify`] Implement `enumerate-for-loop` (`SIM113`) ([#&#8203;7777](https://github.com/astral-sh/ruff/pull/7777)) - \[`pygrep_hooks`] Add fix for `deprecated-log-warn` (`PGH002`) ([#&#8203;9519](https://github.com/astral-sh/ruff/pull/9519)) - \[`pylint`] Implement `import-private-name` (`C2701`) ([#&#8203;5920](https://github.com/astral-sh/ruff/pull/5920)) - \[`refurb`] Implement `regex-flag-alias` with fix (`FURB167`) ([#&#8203;9516](https://github.com/astral-sh/ruff/pull/9516)) - \[`ruff`] Add rule and fix to sort contents of `__all__` (`RUF022`) ([#&#8203;9474](https://github.com/astral-sh/ruff/pull/9474)) - \[`tryceratops`] Add fix for `error-instead-of-exception` (`TRY400`) ([#&#8203;9520](https://github.com/astral-sh/ruff/pull/9520)) ##### Rule changes - \[`flake8-pyi`] Fix `PYI047` false negatives on PEP-695 type aliases ([#&#8203;9566](https://github.com/astral-sh/ruff/pull/9566)) - \[`flake8-pyi`] Fix `PYI049` false negatives on call-based `TypedDict`s ([#&#8203;9567](https://github.com/astral-sh/ruff/pull/9567)) - \[`pylint`] Exclude `self` and `cls` when counting method arguments (`PLR0917`) ([#&#8203;9563](https://github.com/astral-sh/ruff/pull/9563)) ##### CLI - `--show-settings` displays active settings in a far more readable format ([#&#8203;9464](https://github.com/astral-sh/ruff/pull/9464)) - Add `--extension` support to the formatter ([#&#8203;9483](https://github.com/astral-sh/ruff/pull/9483)) ##### Configuration - Ignore preview status for fixable and unfixable selectors ([#&#8203;9538](https://github.com/astral-sh/ruff/pull/9538)) - \[`pycodestyle`] Use the configured tab size when expanding indents ([#&#8203;9506](https://github.com/astral-sh/ruff/pull/9506)) ##### Bug fixes - Recursively visit deferred AST nodes ([#&#8203;9541](https://github.com/astral-sh/ruff/pull/9541)) - Visit deferred lambdas before type definitions ([#&#8203;9540](https://github.com/astral-sh/ruff/pull/9540)) - \[`flake8-simplify`] Avoid some more `enumerate-for-loop` false positives (`SIM113`) ([#&#8203;9515](https://github.com/astral-sh/ruff/pull/9515)) - \[`pandas-vet`] Limit inplace diagnostics to methods that accept inplace ([#&#8203;9495](https://github.com/astral-sh/ruff/pull/9495)) - \[`pylint`] Add the `__prepare__` method to the list of recognized dunder method ([#&#8203;9529](https://github.com/astral-sh/ruff/pull/9529)) - \[`pylint`] Ignore unnecessary dunder calls within dunder definitions ([#&#8203;9496](https://github.com/astral-sh/ruff/pull/9496)) - \[`refurb`] Avoid bailing when `reimplemented-operator` is called on function (`FURB118`) ([#&#8203;9556](https://github.com/astral-sh/ruff/pull/9556)) - \[`ruff`] Avoid treating named expressions as static keys (`RUF011`) ([#&#8203;9494](https://github.com/astral-sh/ruff/pull/9494)) ##### Documentation - Add instructions on using `noqa` with isort rules ([#&#8203;9555](https://github.com/astral-sh/ruff/pull/9555)) - Documentation update for URL giving 'page not found' ([#&#8203;9565](https://github.com/astral-sh/ruff/pull/9565)) - Fix admonition in dark mode ([#&#8203;9502](https://github.com/astral-sh/ruff/pull/9502)) - Update contributing docs to use `cargo bench -p ruff_benchmark` ([#&#8203;9535](https://github.com/astral-sh/ruff/pull/9535)) - Update emacs integration section to include `emacs-ruff-format` ([#&#8203;9403](https://github.com/astral-sh/ruff/pull/9403)) - \[`flake8-blind-except`] Document exceptions to `blind-except` rule ([#&#8203;9580](https://github.com/astral-sh/ruff/pull/9580)) ### [`v0.1.13`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0113) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.12...v0.1.13) ##### Bug fixes - Include base pyproject when initializing cache settings ([#&#8203;9480](https://github.com/astral-sh/ruff/pull/9480)) - \[`flake8-simplify`] Account for possibly-empty f-string values in truthiness logic ([#&#8203;9484](https://github.com/astral-sh/ruff/pull/9484)) - \[`pylint`] Add the missing period in `unnecessary-dunder-call` ([#&#8203;9485](https://github.com/astral-sh/ruff/pull/9485)) - \[`pylint`] Fix `__aenter__` message in `unnecessary-dunder-call` ([#&#8203;9492](https://github.com/astral-sh/ruff/pull/9492)) ### [`v0.1.12`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0112) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.11...v0.1.12) ##### Preview features - Formatter: Hug multiline-strings in preview style ([#&#8203;9243](https://github.com/astral-sh/ruff/pull/9243)) - \[`flake8-bandit`] Add `ssl-with-no-version` (`S504`) ([#&#8203;9384](https://github.com/astral-sh/ruff/pull/9384)) - \[`flake8-bandit`] Implement `ssl-insecure-version` (`S502`) ([#&#8203;9390](https://github.com/astral-sh/ruff/pull/9390)) - \[`flake8-bandit`] Implement `ssl-with-bad-defaults` (`S503`) ([#&#8203;9391](https://github.com/astral-sh/ruff/pull/9391)) - \[`flake8-bandit`] Implement suspicious import rules (`S4XX`) ([#&#8203;8831](https://github.com/astral-sh/ruff/pull/8831)) - \[`flake8-simplify`] Implement `zip-dict-keys-and-values` (`SIM911`) ([#&#8203;9460](https://github.com/astral-sh/ruff/pull/9460)) - \[`pyflakes`] Add a fix for `redefined-while-unused` (`F811`) ([#&#8203;9419](https://github.com/astral-sh/ruff/pull/9419)) - \[`pylint`] Implement `unnecessary-dunder-call` (`C2801`) ([#&#8203;9166](https://github.com/astral-sh/ruff/pull/9166)) - \[`ruff`] Add `parenthesize-chained-operators` (`RUF021`) to enforce parentheses in `a or b and c` ([#&#8203;9440](https://github.com/astral-sh/ruff/pull/9440)) ##### Rule changes - \[`flake8-boolean-trap`] Allow Boolean positional arguments in setters ([#&#8203;9429](https://github.com/astral-sh/ruff/pull/9429)) - \[`flake8-builtins`] Restrict `builtin-attribute-shadowing` (`A003`) to actual shadowed references ([#&#8203;9462](https://github.com/astral-sh/ruff/pull/9462)) - \[`flake8-pyi`] Add fix for `generator-return-from-iter-method` (`PYI058`) ([#&#8203;9355](https://github.com/astral-sh/ruff/pull/9355)) - \[`pyflakes`] Don't flag `redefined-while-unused` (`F811`) in `if` branches ([#&#8203;9418](https://github.com/astral-sh/ruff/pull/9418)) - \[`pyupgrade`] Add some additional Python 3.12 typing members to `deprecated-import` ([#&#8203;9445](https://github.com/astral-sh/ruff/pull/9445)) - \[`ruff`] Add fix for `parenthesize-chained-operators` (`RUF021`) ([#&#8203;9449](https://github.com/astral-sh/ruff/pull/9449)) - \[`ruff`] Include subscripts and attributes in static key rule (`RUF011`) ([#&#8203;9416](https://github.com/astral-sh/ruff/pull/9416)) - \[`ruff`] Support variable keys in static dictionary key rule (`RUF011`) ([#&#8203;9411](https://github.com/astral-sh/ruff/pull/9411)) ##### Formatter - Generate deterministic IDs when formatting notebooks ([#&#8203;9359](https://github.com/astral-sh/ruff/pull/9359)) - Allow `# fmt: skip` with interspersed same-line comments ([#&#8203;9395](https://github.com/astral-sh/ruff/pull/9395)) - Parenthesize breaking named expressions in match guards ([#&#8203;9396](https://github.com/astral-sh/ruff/pull/9396)) ##### Bug fixes - Add cell indexes to all diagnostics ([#&#8203;9387](https://github.com/astral-sh/ruff/pull/9387)) - Avoid infinite loop in constant vs. `None` comparisons ([#&#8203;9376](https://github.com/astral-sh/ruff/pull/9376)) - Handle raises with implicit alternate branches ([#&#8203;9377](https://github.com/astral-sh/ruff/pull/9377)) - Ignore trailing quotes for unclosed l-brace errors ([#&#8203;9388](https://github.com/astral-sh/ruff/pull/9388)) - Respect multi-segment submodule imports when resolving qualified names ([#&#8203;9382](https://github.com/astral-sh/ruff/pull/9382)) - Use `DisplayParseError` for stdin parser errors ([#&#8203;9409](https://github.com/astral-sh/ruff/pull/9409)) - Use `comment_ranges` for isort directive extraction ([#&#8203;9414](https://github.com/astral-sh/ruff/pull/9414)) - Use transformed source code for diagnostic locations ([#&#8203;9408](https://github.com/astral-sh/ruff/pull/9408)) - \[`flake8-pyi`] Exclude `warnings.deprecated` and `typing_extensions.deprecated` arguments ([#&#8203;9423](https://github.com/astral-sh/ruff/pull/9423)) - \[`flake8-pyi`] Fix false negative for `unused-private-protocol` (`PYI046`) with unused generic protocols ([#&#8203;9405](https://github.com/astral-sh/ruff/pull/9405)) - \[`pydocstyle`] Disambiguate argument descriptors from section headers ([#&#8203;9427](https://github.com/astral-sh/ruff/pull/9427)) - \[`pylint`] Homogenize `PLR0914` message to match other `PLR09XX` rules ([#&#8203;9399](https://github.com/astral-sh/ruff/pull/9399)) - \[`ruff`] Allow `Hashable = None` in type annotations (`RUF013`) ([#&#8203;9442](https://github.com/astral-sh/ruff/pull/9442)) ##### Documentation - Fix admonition hyperlink colouring ([#&#8203;9385](https://github.com/astral-sh/ruff/pull/9385)) - Add missing preview link ([#&#8203;9386](https://github.com/astral-sh/ruff/pull/9386)) ### [`v0.1.11`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0111) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.10...v0.1.11) ##### Preview features - \[`pylint`] Implement `super-without-brackets` (`W0245`) ([#&#8203;9257](https://github.com/astral-sh/ruff/pull/9257)) ##### Bug fixes - Check path string properly in `python -m ruff` invocations ([#&#8203;9367](https://github.com/astral-sh/ruff/pull/9367)) ##### Documentation - Tweak `relative-imports` message ([#&#8203;9365](https://github.com/astral-sh/ruff/pull/9365)) - Add fix safety note for `yield-in-for-loop` ([#&#8203;9364](https://github.com/astral-sh/ruff/pull/9364)) ### [`v0.1.10`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0110) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.9...v0.1.10) ##### Preview features - Improve `dummy_implementations` preview style formatting ([#&#8203;9240](https://github.com/astral-sh/ruff/pull/9240)) - Normalise Hex and unicode escape sequences in strings ([#&#8203;9280](https://github.com/astral-sh/ruff/pull/9280)) - Parenthesize long type annotations in annotated assignments ([#&#8203;9210](https://github.com/astral-sh/ruff/pull/9210)) - Parenthesize multi-context managers in `with` statements ([#&#8203;9222](https://github.com/astral-sh/ruff/pull/9222)) - \[`flake8-pyi`] Implement `generator-return-from-iter-method` (`PYI058`) ([#&#8203;9313](https://github.com/astral-sh/ruff/pull/9313)) - \[`pylint`] Implement `empty-comment` (`PLR2044`) ([#&#8203;9174](https://github.com/astral-sh/ruff/pull/9174)) - \[`refurb`] Implement `bit-count` (`FURB161`) ([#&#8203;9265](https://github.com/astral-sh/ruff/pull/9265)) - \[`ruff`] Add `never-union` rule to detect redundant `typing.NoReturn` and `typing.Never` ([#&#8203;9217](https://github.com/astral-sh/ruff/pull/9217)) ##### CLI - Add paths to TOML parse errors ([#&#8203;9358](https://github.com/astral-sh/ruff/pull/9358)) - Add row and column numbers to formatter parse errors ([#&#8203;9321](https://github.com/astral-sh/ruff/pull/9321)) - Improve responsiveness when invoked via Python ([#&#8203;9315](https://github.com/astral-sh/ruff/pull/9315)) - Short rule messages should not end with a period ([#&#8203;9345](https://github.com/astral-sh/ruff/pull/9345)) ##### Configuration - Respect runtime-required decorators on functions ([#&#8203;9317](https://github.com/astral-sh/ruff/pull/9317)) ##### Bug fixes - Avoid `asyncio-dangling-task` for nonlocal and global bindings ([#&#8203;9263](https://github.com/astral-sh/ruff/pull/9263)) - Escape trailing placeholders in rule documentation ([#&#8203;9301](https://github.com/astral-sh/ruff/pull/9301)) - Fix continuation detection following multi-line strings ([#&#8203;9332](https://github.com/astral-sh/ruff/pull/9332)) - Fix scoping for generators in named expressions in classes ([#&#8203;9248](https://github.com/astral-sh/ruff/pull/9248)) - Port from obsolete wsl crate to is-wsl ([#&#8203;9356](https://github.com/astral-sh/ruff/pull/9356)) - Remove special pre-visit for module docstrings ([#&#8203;9261](https://github.com/astral-sh/ruff/pull/9261)) - Respect `__str__` definitions from super classes ([#&#8203;9338](https://github.com/astral-sh/ruff/pull/9338)) - Respect `unused-noqa` via `per-file-ignores` ([#&#8203;9300](https://github.com/astral-sh/ruff/pull/9300)) - Respect attribute chains when resolving builtin call paths ([#&#8203;9309](https://github.com/astral-sh/ruff/pull/9309)) - Treat all `typing_extensions` members as typing aliases ([#&#8203;9335](https://github.com/astral-sh/ruff/pull/9335)) - Use `Display` for formatter parse errors ([#&#8203;9316](https://github.com/astral-sh/ruff/pull/9316)) - Wrap subscripted dicts in parens for f-string conversion ([#&#8203;9238](https://github.com/astral-sh/ruff/pull/9238)) - \[`flake8-annotations`] Avoid adding return types to stub methods ([#&#8203;9277](https://github.com/astral-sh/ruff/pull/9277)) - \[`flake8-annotations`] Respect mixed `return` and `raise` cases in return-type analysis ([#&#8203;9310](https://github.com/astral-sh/ruff/pull/9310)) - \[`flake8-bandit`] Don't report violations when `SafeLoader` is imported from `yaml.loader` (`S506`) ([#&#8203;9299](https://github.com/astral-sh/ruff/pull/9299)) - \[`pylint`] Avoid panic when comment is preceded by Unicode ([#&#8203;9331](https://github.com/astral-sh/ruff/pull/9331)) - \[`pylint`] Change `PLR0917` error message to match other `PLR09XX` messages ([#&#8203;9308](https://github.com/astral-sh/ruff/pull/9308)) - \[`refurb`] Avoid false positives for `math-constant` (`FURB152`) ([#&#8203;9290](https://github.com/astral-sh/ruff/pull/9290)) ##### Documentation - Expand target name for better rule documentation ([#&#8203;9302](https://github.com/astral-sh/ruff/pull/9302)) - Fix typos found by codespell ([#&#8203;9346](https://github.com/astral-sh/ruff/pull/9346)) - \[`perflint`] Document `PERF102` fix un-safety ([#&#8203;9351](https://github.com/astral-sh/ruff/pull/9351)) - \[`pyupgrade`] Document `UP007` fix un-safety ([#&#8203;9306](https://github.com/astral-sh/ruff/pull/9306)) ### [`v0.1.9`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#019) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.8...v0.1.9) ##### Breaking changes - Add site-packages to default exclusions ([#&#8203;9188](https://github.com/astral-sh/ruff/pull/9188)) ##### Preview features - Fix: Avoid parenthesizing subscript targets and values ([#&#8203;9209](https://github.com/astral-sh/ruff/pull/9209)) - \[`pylint`] Implement `too-many-locals` (`PLR0914`) ([#&#8203;9163](https://github.com/astral-sh/ruff/pull/9163)) - Implement `reimplemented_operator` (FURB118) ([#&#8203;9171](https://github.com/astral-sh/ruff/pull/9171)) - Add a rule to detect string members in runtime-evaluated unions ([#&#8203;9143](https://github.com/astral-sh/ruff/pull/9143)) - Implement `no_blank_line_before_class_docstring` preview style ([#&#8203;9154](https://github.com/astral-sh/ruff/pull/9154)) ##### Rule changes - `CONSTANT_CASE` variables are improperly flagged for yoda violation (`SIM300`) ([#&#8203;9164](https://github.com/astral-sh/ruff/pull/9164)) - \[`flake8-pyi`] Cover ParamSpecs and TypeVarTuples (`PYI018`) ([#&#8203;9198](https://github.com/astral-sh/ruff/pull/9198)) - \[`flake8-bugbear`] Add fix for `zip-without-explicit-strict` (`B905`) ([#&#8203;9176](https://github.com/astral-sh/ruff/pull/9176)) - Add fix to automatically remove `print` and `pprint` statements (`T201`, `T203`) ([#&#8203;9208](https://github.com/astral-sh/ruff/pull/9208)) - Prefer `Never` to `NoReturn` in auto-typing in Python >= 3.11 (`ANN201`) ([#&#8203;9213](https://github.com/astral-sh/ruff/pull/9213)) ##### Formatter - `can_omit_optional_parentheses`: Exit early for unparenthesized expressions ([#&#8203;9125](https://github.com/astral-sh/ruff/pull/9125)) - Fix `dynamic` mode with doctests so that it doesn't exceed configured line width ([#&#8203;9129](https://github.com/astral-sh/ruff/pull/9129)) - Fix `can_omit_optional_parentheses` for expressions with a right most fstring ([#&#8203;9124](https://github.com/astral-sh/ruff/pull/9124)) - Add `target_version` to formatter options ([#&#8203;9220](https://github.com/astral-sh/ruff/pull/9220)) ##### CLI - Update `ruff format --check` to display message for already formatted files ([#&#8203;9153](https://github.com/astral-sh/ruff/pull/9153)) ##### Bug fixes - Reverse order of arguments for `operator.contains` ([#&#8203;9192](https://github.com/astral-sh/ruff/pull/9192)) - Iterate over lambdas in deferred type annotations ([#&#8203;9175](https://github.com/astral-sh/ruff/pull/9175)) - Fix panic in `D208` with multibyte indent ([#&#8203;9147](https://github.com/astral-sh/ruff/pull/9147)) - Add support for `NoReturn` in auto-return-typing ([#&#8203;9206](https://github.com/astral-sh/ruff/pull/9206)) - Allow removal of `typing` from `exempt-modules` ([#&#8203;9214](https://github.com/astral-sh/ruff/pull/9214)) - Avoid `mutable-class-default` violations for Pydantic subclasses ([#&#8203;9187](https://github.com/astral-sh/ruff/pull/9187)) - Fix dropped union expressions for piped non-types in `PYI055` autofix ([#&#8203;9161](https://github.com/astral-sh/ruff/pull/9161)) - Enable annotation quoting for multi-line expressions ([#&#8203;9142](https://github.com/astral-sh/ruff/pull/9142)) - Deduplicate edits when quoting annotations ([#&#8203;9140](https://github.com/astral-sh/ruff/pull/9140)) - Prevent invalid utf8 indexing in cell magic detection ([#&#8203;9146](https://github.com/astral-sh/ruff/pull/9146)) - Avoid nested quotations in auto-quoting fix ([#&#8203;9168](https://github.com/astral-sh/ruff/pull/9168)) - Add base-class inheritance detection to flake8-django rules ([#&#8203;9151](https://github.com/astral-sh/ruff/pull/9151)) - Avoid `asyncio-dangling-task` violations on shadowed bindings ([#&#8203;9215](https://github.com/astral-sh/ruff/pull/9215)) ##### Documentation - Fix blog post URL in changelog ([#&#8203;9119](https://github.com/astral-sh/ruff/pull/9119)) - Add error suppression hint for multi-line strings ([#&#8203;9205](https://github.com/astral-sh/ruff/pull/9205)) - Fix typo in SemanticModel.parent_expression docstring ([#&#8203;9167](https://github.com/astral-sh/ruff/pull/9167)) - Document link between import sorting and formatter ([#&#8203;9117](https://github.com/astral-sh/ruff/pull/9117)) ### [`v0.1.8`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#018) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.7...v0.1.8) This release includes opt-in support for formatting Python snippets within docstrings via the `docstring-code-format` setting. [Check out the blog post](https://astral.sh/blog/ruff-v0.1.8) for more details! ##### Preview features - Add `"preserve"` quote-style to mimic Black's skip-string-normalization ([#&#8203;8822](https://github.com/astral-sh/ruff/pull/8822)) - Implement `prefer_splitting_right_hand_side_of_assignments` preview style ([#&#8203;8943](https://github.com/astral-sh/ruff/pull/8943)) - \[`pycodestyle`] Add fix for `unexpected-spaces-around-keyword-parameter-equals` ([#&#8203;9072](https://github.com/astral-sh/ruff/pull/9072)) - \[`pycodestyle`] Add fix for comment-related whitespace rules ([#&#8203;9075](https://github.com/astral-sh/ruff/pull/9075)) - \[`pycodestyle`] Allow `sys.path` modifications between imports ([#&#8203;9047](https://github.com/astral-sh/ruff/pull/9047)) - \[`refurb`] Implement `hashlib-digest-hex` (`FURB181`) ([#&#8203;9077](https://github.com/astral-sh/ruff/pull/9077)) ##### Rule changes - Allow `flake8-type-checking` rules to automatically quote runtime-evaluated references ([#&#8203;6001](https://github.com/astral-sh/ruff/pull/6001)) - Allow transparent cell magics in Jupyter Notebooks ([#&#8203;8911](https://github.com/astral-sh/ruff/pull/8911)) - \[`flake8-annotations`] Avoid `ANN2xx` fixes for abstract methods with empty bodies ([#&#8203;9034](https://github.com/astral-sh/ruff/pull/9034)) - \[`flake8-self`] Ignore underscore references in type annotations ([#&#8203;9036](https://github.com/astral-sh/ruff/pull/9036)) - \[`pep8-naming`] Allow class names when `apps.get_model` is a non-string ([#&#8203;9065](https://github.com/astral-sh/ruff/pull/9065)) - \[`pycodestyle`] Allow `matplotlib.use` calls to intersperse imports ([#&#8203;9094](https://github.com/astral-sh/ruff/pull/9094)) - \[`pyflakes`] Support fixing unused assignments in tuples by renaming variables (`F841`) ([#&#8203;9107](https://github.com/astral-sh/ruff/pull/9107)) - \[`pylint`] Add fix for `subprocess-run-without-check` (`PLW1510`) ([#&#8203;6708](https://github.com/astral-sh/ruff/pull/6708)) ##### Formatter - Add `docstring-code-format` knob to enable docstring snippet formatting ([#&#8203;8854](https://github.com/astral-sh/ruff/pull/8854)) - Use double quotes for all docstrings, including single-quoted docstrings ([#&#8203;9020](https://github.com/astral-sh/ruff/pull/9020)) - Implement "dynamic" line width mode for docstring code formatting ([#&#8203;9098](https://github.com/astral-sh/ruff/pull/9098)) - Support reformatting Markdown code blocks ([#&#8203;9030](https://github.com/astral-sh/ruff/pull/9030)) - add support for formatting reStructuredText code snippets ([#&#8203;9003](https://github.com/astral-sh/ruff/pull/9003)) - Avoid trailing comma for single-argument with positional separator ([#&#8203;9076](https://github.com/astral-sh/ruff/pull/9076)) - Fix handling of trailing target comment ([#&#8203;9051](https://github.com/astral-sh/ruff/pull/9051)) ##### CLI - Hide unsafe fix suggestions when explicitly disabled ([#&#8203;9095](https://github.com/astral-sh/ruff/pull/9095)) - Add SARIF support to `--output-format` ([#&#8203;9078](https://github.com/astral-sh/ruff/pull/9078)) ##### Bug fixes - Apply unnecessary index rule prior to enumerate rewrite ([#&#8203;9012](https://github.com/astral-sh/ruff/pull/9012)) - \[`flake8-err-msg`] Allow `EM` fixes even if `msg` variable is defined ([#&#8203;9059](https://github.com/astral-sh/ruff/pull/9059)) - \[`flake8-pie`] Prevent keyword arguments duplication ([#&#8203;8450](https://github.com/astral-sh/ruff/pull/8450)) - \[`flake8-pie`] Respect trailing comma in `unnecessary-dict-kwargs` (`PIE804`) ([#&#8203;9015](https://github.com/astral-sh/ruff/pull/9015)) - \[`flake8-raise`] Avoid removing parentheses on ctypes.WinError ([#&#8203;9027](https://github.com/astral-sh/ruff/pull/9027)) - \[`isort`] Avoid invalid combination of `force-sort-within-types` and `lines-between-types` ([#&#8203;9041](https://github.com/astral-sh/ruff/pull/9041)) - \[`isort`] Ensure that from-style imports are always ordered first in `__future__` ([#&#8203;9039](https://github.com/astral-sh/ruff/pull/9039)) - \[`pycodestyle`] Allow tab indentation before keyword ([#&#8203;9099](https://github.com/astral-sh/ruff/pull/9099)) - \[`pylint`] Ignore `@overrides` and `@overloads` for `too-many-positional` ([#&#8203;9000](https://github.com/astral-sh/ruff/pull/9000)) - \[`pyupgrade`] Enable `printf-string-formatting` fix with comments on right-hand side ([#&#8203;9037](https://github.com/astral-sh/ruff/pull/9037)) - \[`refurb`] Make `math-constant` (`FURB152`) rule more targeted ([#&#8203;9054](https://github.com/astral-sh/ruff/pull/9054)) - \[`refurb`] Support floating-point base in `redundant-log-base` (`FURB163`) ([#&#8203;9100](https://github.com/astral-sh/ruff/pull/9100)) - \[`ruff`] Detect `unused-asyncio-dangling-task` (`RUF006`) on unused assignments ([#&#8203;9060](https://github.com/astral-sh/ruff/pull/9060)) ### [`v0.1.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#017) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.6...v0.1.7) ##### Preview features - Implement multiline dictionary and list hugging for preview style ([#&#8203;8293](https://github.com/astral-sh/ruff/pull/8293)) - Implement the `fix_power_op_line_length` preview style ([#&#8203;8947](https://github.com/astral-sh/ruff/pull/8947)) - Use Python version to determine typing rewrite safety ([#&#8203;8919](https://github.com/astral-sh/ruff/pull/8919)) - \[`flake8-annotations`] Enable auto-return-type involving `Optional` and `Union` annotations ([#&#8203;8885](https://github.com/astral-sh/ruff/pull/8885)) - \[`flake8-bandit`] Implement `django-raw-sql` (`S611`) ([#&#8203;8651](https://github.com/astral-sh/ruff/pull/8651)) - \[`flake8-bandit`] Implement `tarfile-unsafe-members` (`S202`) ([#&#8203;8829](https://github.com/astral-sh/ruff/pull/8829)) - \[`flake8-pyi`] Implement fix for `unnecessary-literal-union` (`PYI030`) ([#&#8203;7934](https://github.com/astral-sh/ruff/pull/7934)) - \[`flake8-simplify`] Extend `dict-get-with-none-default` (`SIM910`) to non-literals ([#&#8203;8762](https://github.com/astral-sh/ruff/pull/8762)) - \[`pylint`] - add `unnecessary-list-index-lookup` (`PLR1736`) + autofix ([#&#8203;7999](https://github.com/astral-sh/ruff/pull/7999)) - \[`pylint`] - implement R0202 and R0203 with autofixes ([#&#8203;8335](https://github.com/astral-sh/ruff/pull/8335)) - \[`pylint`] Implement `repeated-keyword` (`PLe1132`) ([#&#8203;8706](https://github.com/astral-sh/ruff/pull/8706)) - \[`pylint`] Implement `too-many-positional` (`PLR0917`) ([#&#8203;8995](https://github.com/astral-sh/ruff/pull/8995)) - \[`pylint`] Implement `unnecessary-dict-index-lookup` (`PLR1733`) ([#&#8203;8036](https://github.com/astral-sh/ruff/pull/8036)) - \[`refurb`] Implement `redundant-log-base` (`FURB163`) ([#&#8203;8842](https://github.com/astral-sh/ruff/pull/8842)) ##### Rule changes - \[`flake8-boolean-trap`] Allow booleans in `@override` methods ([#&#8203;8882](https://github.com/astral-sh/ruff/pull/8882)) - \[`flake8-bugbear`] Avoid `B015`,`B018` for last expression in a cell ([#&#8203;8815](https://github.com/astral-sh/ruff/pull/8815)) - \[`flake8-pie`] Allow ellipses for enum values in stub files ([#&#8203;8825](https://github.com/astral-sh/ruff/pull/8825)) - \[`flake8-pyi`] Check PEP 695 type aliases for `snake-case-type-alias` and `t-suffixed-type-alias` ([#&#8203;8966](https://github.com/astral-sh/ruff/pull/8966)) - \[`flake8-pyi`] Check for kwarg and vararg `NoReturn` type annotations ([#&#8203;8948](https://github.com/astral-sh/ruff/pull/8948)) - \[`flake8-simplify`] Omit select context managers from `SIM117` ([#&#8203;8801](https://github.com/astral-sh/ruff/pull/8801)) - \[`pep8-naming`] Allow Django model loads in `non-lowercase-variable-in-function` (`N806`) ([#&#8203;8917](https://github.com/astral-sh/ruff/pull/8917)) - \[`pycodestyle`] Avoid `E703` for last expression in a cell ([#&#8203;8821](https://github.com/astral-sh/ruff/pull/8821)) - \[`pycodestyle`] Update `E402` to work at cell level for notebooks ([#&#8203;8872](https://github.com/astral-sh/ruff/pull/8872)) - \[`pydocstyle`] Avoid `D100` for Jupyter Notebooks ([#&#8203;8816](https://github.com/astral-sh/ruff/pull/8816)) - \[`pylint`] Implement fix for `unspecified-encoding` (`PLW1514`) ([#&#8203;8928](https://github.com/astral-sh/ruff/pull/8928)) ##### Formatter - Avoid unstable formatting in ellipsis-only body with trailing comment ([#&#8203;8984](https://github.com/astral-sh/ruff/pull/8984)) - Inline trailing comments for type alias similar to assignments ([#&#8203;8941](https://github.com/astral-sh/ruff/pull/8941)) - Insert trailing comma when function breaks with single argument ([#&#8203;8921](https://github.com/astral-sh/ruff/pull/8921)) ##### CLI - Update `ruff check` and `ruff format` to default to the current directory ([#&#8203;8791](https://github.com/astral-sh/ruff/pull/8791)) - Stop at the first resolved parent configuration ([#&#8203;8864](https://github.com/astral-sh/ruff/pull/8864)) ##### Configuration - \[`pylint`] Default `max-positional-args` to `max-args` ([#&#8203;8998](https://github.com/astral-sh/ruff/pull/8998)) - \[`pylint`] Add `allow-dunder-method-names` setting for `bad-dunder-method-name` (`PLW3201`) ([#&#8203;8812](https://github.com/astral-sh/ruff/pull/8812)) - \[`isort`] Add support for `from-first` setting ([#&#8203;8663](https://github.com/astral-sh/ruff/pull/8663)) - \[`isort`] Add support for `length-sort` settings ([#&#8203;8841](https://github.com/astral-sh/ruff/pull/8841)) ##### Bug fixes - Add support for `@functools.singledispatch` ([#&#8203;8934](https://github.com/astral-sh/ruff/pull/8934)) - Avoid off-by-one error in stripping noqa following multi-byte char ([#&#8203;8979](https://github.com/astral-sh/ruff/pull/8979)) - Avoid off-by-one error in with-item named expressions ([#&#8203;8915](https://github.com/astral-sh/ruff/pull/8915)) - Avoid syntax error via invalid ur string prefix ([#&#8203;8971](https://github.com/astral-sh/ruff/pull/8971)) - Avoid underflow in `get_model` matching ([#&#8203;8965](https://github.com/astral-sh/ruff/pull/8965)) - Avoid unnecessary index diagnostics when value is modified ([#&#8203;8970](https://github.com/astral-sh/ruff/pull/8970)) - Convert over-indentation rule to use number of characters ([#&#8203;8983](https://github.com/astral-sh/ruff/pull/8983)) - Detect implicit returns in auto-return-types ([#&#8203;8952](https://github.com/astral-sh/ruff/pull/8952)) - Fix start >= end error in over-indentation ([#&#8203;8982](https://github.com/astral-sh/ruff/pull/8982)) - Ignore `@overload` and `@override` methods for too-many-arguments checks ([#&#8203;8954](https://github.com/astral-sh/ruff/pull/8954)) - Lexer start of line is false only for `Mode::Expression` ([#&#8203;8880](https://github.com/astral-sh/ruff/pull/8880)) - Mark `pydantic_settings.BaseSettings` as having default copy semantics ([#&#8203;8793](https://github.com/astral-sh/ruff/pull/8793)) - Respect dictionary unpacking in `NamedTuple` assignments ([#&#8203;8810](https://github.com/astral-sh/ruff/pull/8810)) - Respect local subclasses in `flake8-type-checking` ([#&#8203;8768](https://github.com/astral-sh/ruff/pull/8768)) - Support type alias statements in simple statement positions ([#&#8203;8916](https://github.com/astral-sh/ruff/pull/8916)) - \[`flake8-annotations`] Avoid filtering out un-representable types in return annotation ([#&#8203;8881](https://github.com/astral-sh/ruff/pull/8881)) - \[`flake8-pie`] Retain extra ellipses in protocols and abstract methods ([#&#8203;8769](https://github.com/astral-sh/ruff/pull/8769)) - \[`flake8-pyi`] Respect local enum subclasses in `simple-defaults` (`PYI052`) ([#&#8203;8767](https://github.com/astral-sh/ruff/pull/8767)) - \[`flake8-trio`] Use correct range for `TRIO115` fix ([#&#8203;8933](https://github.com/astral-sh/ruff/pull/8933)) - \[`flake8-trio`] Use full arguments range for zero-sleep-call ([#&#8203;8936](https://github.com/astral-sh/ruff/pull/8936)) - \[`isort`] fix: mark `__main__` as first-party import ([#&#8203;8805](https://github.com/astral-sh/ruff/pull/8805)) - \[`pep8-naming`] Avoid `N806` errors for type alias statements ([#&#8203;8785](https://github.com/astral-sh/ruff/pull/8785)) - \[`perflint`] Avoid `PERF101` if there's an append in loop body ([#&#8203;8809](https://github.com/astral-sh/ruff/pull/8809)) - \[`pycodestyle`] Allow space-before-colon after end-of-slice ([#&#8203;8838](https://github.com/astral-sh/ruff/pull/8838)) - \[`pydocstyle`] Avoid non-character breaks in `over-indentation` (`D208`) ([#&#8203;8866](https://github.com/astral-sh/ruff/pull/8866)) - \[`pydocstyle`] Ignore underlines when determining docstring logical lines ([#&#8203;8929](https://github.com/astral-sh/ruff/pull/8929)) - \[`pylint`] Extend `self-assigning-variable` to multi-target assignments ([#&#8203;8839](https://github.com/astral-sh/ruff/pull/8839)) - \[`tryceratops`] Avoid repeated triggers in nested `tryceratops` diagnostics ([#&#8203;8772](https://github.com/astral-sh/ruff/pull/8772)) ##### Documentation - Add advice for fixing RUF008 when mutability is not desired ([#&#8203;8853](https://github.com/astral-sh/ruff/pull/8853)) - Added the command to run ruff using pkgx to the installation.md ([#&#8203;8955](https://github.com/astral-sh/ruff/pull/8955)) - Document fix safety for flake8-comprehensions and some pyupgrade rules ([#&#8203;8918](https://github.com/astral-sh/ruff/pull/8918)) - Fix doc formatting for zero-sleep-call ([#&#8203;8937](https://github.com/astral-sh/ruff/pull/8937)) - Remove duplicate imports from os-stat documentation ([#&#8203;8930](https://github.com/astral-sh/ruff/pull/8930)) - Replace generated reference to MkDocs ([#&#8203;8806](https://github.com/astral-sh/ruff/pull/8806)) - Update Arch Linux package URL in installation.md ([#&#8203;8802](https://github.com/astral-sh/ruff/pull/8802)) - \[`flake8-pyi`] Fix error in `t-suffixed-type-alias` (`PYI043`) example ([#&#8203;8963](https://github.com/astral-sh/ruff/pull/8963)) - \[`flake8-pyi`] Improve motivation for `custom-type-var-return-type` (`PYI019`) ([#&#8203;8766](https://github.com/astral-sh/ruff/pull/8766)) ### [`v0.1.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#016) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.5...v0.1.6) ##### Preview features - \[`flake8-boolean-trap`] Extend `boolean-type-hint-positional-argument` (`FBT001`) to include booleans in unions ([#&#8203;7501](https://github.com/astral-sh/ruff/pull/7501)) - \[`flake8-pie`] Extend `reimplemented-list-builtin` (`PIE807`) to `dict` reimplementations ([#&#8203;8608](https://github.com/astral-sh/ruff/pull/8608)) - \[`flake8-pie`] Extend `unnecessary-pass` (`PIE790`) to include ellipses (`...`) ([#&#8203;8641](https://github.com/astral-sh/ruff/pull/8641)) - \[`flake8-pie`] Implement fix for `unnecessary-spread` (`PIE800`) ([#&#8203;8668](https://github.com/astral-sh/ruff/pull/8668)) - \[`flake8-quotes`] Implement `unnecessary-escaped-quote` (`Q004`) ([#&#8203;8630](https://github.com/astral-sh/ruff/pull/8630)) - \[`pycodestyle`] Implement fix for `multiple-spaces-after-keyword` (`E271`) and `multiple-spaces-before-keyword` (`E272`) ([#&#8203;8622](https://github.com/astral-sh/ruff/pull/8622)) - \[`pycodestyle`] Implement fix for `multiple-spaces-after-operator` (`E222`) and `multiple-spaces-before-operator` (`E221`) ([#&#8203;8623](https://github.com/astral-sh/ruff/pull/8623)) - \[`pyflakes`] Extend `is-literal` (`F632`) to include comparisons against mutable initializers ([#&#8203;8607](https://github.com/astral-sh/ruff/pull/8607)) - \[`pylint`] Implement `redefined-argument-from-local` (`PLR1704`) ([#&#8203;8159](https://github.com/astral-sh/ruff/pull/8159)) - \[`pylint`] Implement fix for `unnecessary-lambda` (`PLW0108`) ([#&#8203;8621](https://github.com/astral-sh/ruff/pull/8621)) - \[`refurb`] Implement `if-expr-min-max` (`FURB136`) ([#&#8203;8664](https://github.com/astral-sh/ruff/pull/8664)) - \[`refurb`] Implement `math-constant` (`FURB152`) ([#&#8203;8727](https://github.com/astral-sh/ruff/pull/8727)) ##### Rule changes - \[`flake8-annotations`] Add autotyping-like return type inference for annotation rules ([#&#8203;8643](https://github.com/astral-sh/ruff/pull/8643)) - \[`flake8-future-annotations`] Implement fix for `future-required-type-annotation` (`FA102`) ([#&#8203;8711](https://github.com/astral-sh/ruff/pull/8711)) - \[`flake8-implicit-namespace-package`] Avoid missing namespace violations in scripts with shebangs ([#&#8203;8710](https://github.com/astral-sh/ruff/pull/8710)) - \[`pydocstyle`] Update `over-indentation` (`D208`) to preserve indentation offsets when fixing overindented lines ([#&#8203;8699](https://github.com/astral-sh/ruff/pull/8699)) - \[`pyupgrade`] Refine `timeout-error-alias` (`UP041`) to remove false positives ([#&#8203;8587](https://github.com/astral-sh/ruff/pull/8587)) ##### Formatter - Fix instability in `await` formatting with fluent style ([#&#8203;8676](https://github.com/astral-sh/ruff/pull/8676)) - Compare formatted and unformatted ASTs during formatter tests ([#&#8203;8624](https://github.com/astral-sh/ruff/pull/8624)) - Preserve trailing semicolon for Notebooks ([#&#8203;8590](https://github.com/astral-sh/ruff/pull/8590)) ##### CLI - Improve debug printing for resolving origin of config settings ([#&#8203;8729](https://github.com/astral-sh/ruff/pull/8729)) - Write unchanged, excluded files to stdout when read via stdin ([#&#8203;8596](https://github.com/astral-sh/ruff/pull/8596)) ##### Configuration - \[`isort`] Support disabling sections with `no-sections = true` ([#&#8203;8657](https://github.com/astral-sh/ruff/pull/8657)) - \[`pep8-naming`] Support local and dynamic class- and static-method decorators ([#&#8203;8592](https://github.com/astral-sh/ruff/pull/8592)) - \[`pydocstyle`] Allow overriding pydocstyle convention rules ([#&#8203;8586](https://github.com/astral-sh/ruff/pull/8586)) ##### Bug fixes - Avoid syntax error via importing `trio.lowlevel` ([#&#8203;8730](https://github.com/astral-sh/ruff/pull/8730)) - Omit unrolled augmented assignments in `PIE794` ([#&#8203;8634](https://github.com/astral-sh/ruff/pull/8634)) - Slice source code instead of generating it for `EM` fixes ([#&#8203;7746](https://github.com/astral-sh/ruff/pull/7746)) - Allow whitespace around colon in slices for `whitespace-before-punctuation` (`E203`) ([#&#8203;8654](https://github.com/astral-sh/ruff/pull/8654)) - Use function range for `no-self-use` ([#&#8203;8637](https://github.com/astral-sh/ruff/pull/8637)) - F-strings doesn't contain bytes literal for `PLW0129` ([#&#8203;8675](https://github.com/astral-sh/ruff/pull/8675)) - Improve detection of `TYPE_CHECKING` blocks imported from `typing_extensions` or `_typeshed` ([#&#8203;8429](https://github.com/astral-sh/ruff/pull/8429)) - Treat display as a builtin in IPython ([#&#8203;8707](https://github.com/astral-sh/ruff/pull/8707)) - Avoid `FURB113` autofix if comments are present ([#&#8203;8494](https://github.com/astral-sh/ruff/pull/8494)) - Consider the new f-string tokens for `flake8-commas` ([#&#8203;8582](https://github.com/astral-sh/ruff/pull/8582)) - Remove erroneous bad-dunder-name reference ([#&#8203;8742](https://github.com/astral-sh/ruff/pull/8742)) - Avoid recommending Self usages in metaclasses ([#&#8203;8639](https://github.com/astral-sh/ruff/pull/8639)) - Detect runtime-evaluated base classes defined in the current file ([#&#8203;8572](https://github.com/astral-sh/ruff/pull/8572)) - Avoid inserting trailing commas within f-strings ([#&#8203;8574](https://github.com/astral-sh/ruff/pull/8574)) - Remove incorrect deprecation label for stdout and stderr ([#&#8203;8743](https://github.com/astral-sh/ruff/pull/8743)) - Fix unnecessary parentheses in UP007 fix ([#&#8203;8610](https://github.com/astral-sh/ruff/pull/8610)) - Remove repeated and erroneous scoped settings headers in docs ([#&#8203;8670](https://github.com/astral-sh/ruff/pull/8670)) - Trim trailing empty strings when converting to f-strings ([#&#8203;8712](https://github.com/astral-sh/ruff/pull/8712)) - Fix ordering for `force-sort-within-sections` ([#&#8203;8665](https://github.com/astral-sh/ruff/pull/8665)) - Run unicode prefix rule over tokens ([#&#8203;8709](https://github.com/astral-sh/ruff/pull/8709)) - Update UP032 to unescape curly braces in literal parts of converted strings ([#&#8203;8697](https://github.com/astral-sh/ruff/pull/8697)) - List all ipython builtins ([#&#8203;8719](https://github.com/astral-sh/ruff/pull/8719)) ##### Documentation - Document conventions in the FAQ ([#&#8203;8638](https://github.com/astral-sh/ruff/pull/8638)) - Redirect from rule codes to rule pages in docs ([#&#8203;8636](https://github.com/astral-sh/ruff/pull/8636)) - Fix permalink to convention setting ([#&#8203;8575](https://github.com/astral-sh/ruff/pull/8575)) ### [`v0.1.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#015) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.4...v0.1.5) ##### Preview features - \[`flake8-bandit`] Implement `mako-templates` (`S702`) ([#&#8203;8533](https://github.com/astral-sh/ruff/pull/8533)) - \[`flake8-trio`] Implement `TRIO105` ([#&#8203;8490](https://github.com/astral-sh/ruff/pull/8490)) - \[`flake8-trio`] Implement `TRIO109` ([#&#8203;8534](https://github.com/astral-sh/ruff/pull/8534)) - \[`flake8-trio`] Implement `TRIO110` ([#&#8203;8537](https://github.com/astral-sh/ruff/pull/8537)) - \[`flake8-trio`] Implement `TRIO115` ([#&#8203;8486](https://github.com/astral-sh/ruff/pull/8486)) - \[`refurb`] Implement `type-none-comparison` (`FURB169`) ([#&#8203;8487](https://github.com/astral-sh/ruff/pull/8487)) - Flag all comparisons against builtin types in `E721` ([#&#8203;8491](https://github.com/astral-sh/ruff/pull/8491)) - Make `SIM118` fix as safe when the expression is a known dictionary ([#&#8203;8525](https://github.com/astral-sh/ruff/pull/8525)) ##### Formatter - Fix multiline lambda expression statement formatting ([#&#8203;8466](https://github.com/astral-sh/ruff/pull/8466)) ##### CLI - Add hidden `--extension` to override inference of source type from file extension ([#&#8203;8373](https://github.com/astral-sh/ruff/pull/8373)) ##### Configuration - Account for selector specificity when merging `extend_unsafe_fixes` and `override extend_safe_fixes` ([#&#8203;8444](https://github.com/astral-sh/ruff/pull/8444)) - Add support for disabling cache with `RUFF_NO_CACHE` environment variable ([#&#8203;8538](https://github.com/astral-sh/ruff/pull/8538)) ##### Bug fixes - \[`E721`] Flag comparisons to `memoryview` ([#&#8203;8485](https://github.com/astral-sh/ruff/pull/8485)) - Allow collapsed-ellipsis bodies in other statements ([#&#8203;8499](https://github.com/astral-sh/ruff/pull/8499)) - Avoid `D301` autofix for `u` prefixed strings ([#&#8203;8495](https://github.com/astral-sh/ruff/pull/8495)) - Only flag `flake8-trio` rules when `trio` import is present ([#&#8203;8550](https://github.com/astral-sh/ruff/pull/8550)) - Reject more syntactically invalid Python programs ([#&#8203;8524](https://github.com/astral-sh/ruff/pull/8524)) - Avoid raising `TRIO115` violations for `trio.sleep(...)` calls with non-number values ([#&#8203;8532](https://github.com/astral-sh/ruff/pull/8532)) - Fix `F841` false negative on assignment to multiple variables ([#&#8203;8489](https://github.com/astral-sh/ruff/pull/8489)) ##### Documentation - Fix link to isort `known-first-party` ([#&#8203;8562](https://github.com/astral-sh/ruff/pull/8562)) - Add notes on fix safety to a few rules ([#&#8203;8500](https://github.com/astral-sh/ruff/pull/8500)) - Add missing toml config tabs ([#&#8203;8512](https://github.com/astral-sh/ruff/pull/8512)) - Add instructions for configuration of Emacs ([#&#8203;8488](https://github.com/astral-sh/ruff/pull/8488)) - Improve detail link contrast in dark mode ([#&#8203;8548](https://github.com/astral-sh/ruff/pull/8548)) - Fix typo in example ([#&#8203;8506](https://github.com/astral-sh/ruff/pull/8506)) - Added tabs for configuration files in the documentation ([#&#8203;8480](https://github.com/astral-sh/ruff/pull/8480)) - Recommend `project.requires-python` over `target-version` ([#&#8203;8513](https://github.com/astral-sh/ruff/pull/8513)) - Add singleton escape hatch to `B008` documentation ([#&#8203;8501](https://github.com/astral-sh/ruff/pull/8501)) - Fix tab configuration docs ([#&#8203;8502](https://github.com/astral-sh/ruff/pull/8502)) ### [`v0.1.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#014) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.3...v0.1.4) ##### Preview features - \[`flake8-trio`] Implement `timeout-without-await` (`TRIO001`) ([#&#8203;8439](https://github.com/astral-sh/ruff/pull/8439)) - \[`numpy`] Implement NumPy 2.0 migration rule (`NPY200`) ([#&#8203;7702](https://github.com/astral-sh/ruff/pull/7702)) - \[`pylint`] Implement `bad-open-mode` (`W1501`) ([#&#8203;8294](https://github.com/astral-sh/ruff/pull/8294)) - \[`pylint`] Implement `import-outside-toplevel` (`C0415`) rule ([#&#8203;5180](https://github.com/astral-sh/ruff/pull/5180)) - \[`pylint`] Implement `useless-with-lock` (`W2101`) ([#&#8203;8321](https://github.com/astral-sh/ruff/pull/8321)) - \[`pyupgrade`] Implement `timeout-error-alias` (`UP041`) ([#&#8203;8476](https://github.com/astral-sh/ruff/pull/8476)) - \[`refurb`] Implement `isinstance-type-none` (`FURB168`) ([#&#8203;8308](https://github.com/astral-sh/ruff/pull/8308)) - Detect confusable Unicode-to-Unicode units in `RUF001`, `RUF002`, and `RUF003` ([#&#8203;4430](https://github.com/astral-sh/ruff/pull/4430)) - Add newline after module docstrings in preview style ([#&#8203;8283](https://github.com/astral-sh/ruff/pull/8283)) ##### Formatter - Add a note on line-too-long to the formatter docs ([#&#8203;8314](https://github.com/astral-sh/ruff/pull/8314)) - Preserve trailing statement semicolons when using `fmt: skip` ([#&#8203;8273](https://github.com/astral-sh/ruff/pull/8273)) - Preserve trailing semicolons when using `fmt: off` ([#&#8203;8275](https://github.com/astral-sh/ruff/pull/8275)) - Avoid duplicating linter-formatter compatibility warnings ([#&#8203;8292](https://github.com/astral-sh/ruff/pull/8292)) - Avoid inserting a newline after function docstrings ([#&#8203;8375](https://github.com/astral-sh/ruff/pull/8375)) - Insert newline between docstring and following own line comment ([#&#8203;8216](https://github.com/astral-sh/ruff/pull/8216)) - Split tuples in return positions by comma first ([#&#8203;8280](https://github.com/astral-sh/ruff/pull/8280)) - Avoid treating byte strings as docstrings ([#&#8203;8350](https://github.com/astral-sh/ruff/pull/8350)) - Add `--line-length` option to `format` command ([#&#8203;8363](https://github.com/astral-sh/ruff/pull/8363)) - Avoid parenthesizing unsplittable because of comments ([#&#8203;8431](https://github.com/astral-sh/ruff/pull/8431)) ##### CLI - Add `--output-format` to `ruff rule` and `ruff linter` ([#&#8203;8203](https://github.com/astral-sh/ruff/pull/8203)) ##### Bug fixes - Respect `--force-exclude` in `lint.exclude` and `format.exclude` ([#&#8203;8393](https://github.com/astral-sh/ruff/pull/8393)) - Respect `--extend-per-file-ignores` on the CLI ([#&#8203;8329](https://github.com/astral-sh/ruff/pull/8329)) - Extend `bad-dunder-method-name` to permit `__index__` ([#&#8203;8300](https://github.com/astral-sh/ruff/pull/8300)) - Fix panic with 8 in octal escape ([#&#8203;8356](https://github.com/astral-sh/ruff/pull/8356)) - Avoid raising `D300` when both triple quote styles are present ([#&#8203;8462](https://github.com/astral-sh/ruff/pull/8462)) - Consider unterminated f-strings in `FStringRanges` ([#&#8203;8154](https://github.com/astral-sh/ruff/pull/8154)) - Avoid including literal `shell=True` for truthy, non-`True` diagnostics ([#&#8203;8359](https://github.com/astral-sh/ruff/pull/8359)) - Avoid triggering single-element test for starred expressions ([#&#8203;8433](https://github.com/astral-sh/ruff/pull/8433)) - Detect and ignore Jupyter automagics ([#&#8203;8398](https://github.com/astral-sh/ruff/pull/8398)) - Fix invalid E231 error with f-strings ([#&#8203;8369](https://github.com/astral-sh/ruff/pull/8369)) - Avoid triggering `NamedTuple` rewrite with starred annotation ([#&#8203;8434](https://github.com/astral-sh/ruff/pull/8434)) - Avoid un-setting bracket flag in logical lines ([#&#8203;8380](https://github.com/astral-sh/ruff/pull/8380)) - Place 'r' prefix before 'f' for raw format strings ([#&#8203;8464](https://github.com/astral-sh/ruff/pull/8464)) - Remove trailing periods from NumPy 2.0 code actions ([#&#8203;8475](https://github.com/astral-sh/ruff/pull/8475)) - Fix bug where `PLE1307` was raised when formatting `%c` with characters ([#&#8203;8407](https://github.com/astral-sh/ruff/pull/8407)) - Remove unicode flag from comparable ([#&#8203;8440](https://github.com/astral-sh/ruff/pull/8440)) - Improve B015 message ([#&#8203;8295](https://github.com/astral-sh/ruff/pull/8295)) - Use `fixedOverflowWidgets` for playground popover ([#&#8203;8458](https://github.com/astral-sh/ruff/pull/8458)) - Mark `byte_bounds` as a non-backwards-compatible NumPy 2.0 change ([#&#8203;8474](https://github.com/astral-sh/ruff/pull/8474)) ##### Internals - Add a dedicated cache directory per Ruff version ([#&#8203;8333](https://github.com/astral-sh/ruff/pull/8333)) - Allow selective caching for `--fix` and `--diff` ([#&#8203;8316](https://github.com/astral-sh/ruff/pull/8316)) - Improve performance of comment parsing ([#&#8203;8193](https://github.com/astral-sh/ruff/pull/8193)) - Improve performance of string parsing ([#&#8203;8227](https://github.com/astral-sh/ruff/pull/8227)) - Use a dedicated sort key for isort import sorting ([#&#8203;7963](https://github.com/astral-sh/ruff/pull/7963)) ### [`v0.1.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#013) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.2...v0.1.3) This release includes a variety of improvements to the Ruff formatter, removing several known and unintentional deviations from Black. ##### Formatter - Avoid space around pow for `None`, `True` and `False` ([#&#8203;8189](https://github.com/astral-sh/ruff/pull/8189)) - Avoid sorting all paths in the format command ([#&#8203;8181](https://github.com/astral-sh/ruff/pull/8181)) - Insert necessary blank line between class and leading comments ([#&#8203;8224](https://github.com/astral-sh/ruff/pull/8224)) - Avoid introducing new parentheses in annotated assignments ([#&#8203;8233](https://github.com/astral-sh/ruff/pull/8233)) - Refine the warnings about incompatible linter options ([#&#8203;8196](https://github.com/astral-sh/ruff/pull/8196)) - Add test and basic implementation for formatter preview mode ([#&#8203;8044](https://github.com/astral-sh/ruff/pull/8044)) - Refine warning about incompatible `isort` settings ([#&#8203;8192](https://github.com/astral-sh/ruff/pull/8192)) - Only omit optional parentheses for starting or ending with parentheses ([#&#8203;8238](https://github.com/astral-sh/ruff/pull/8238)) - Use source type to determine parser mode for formatting ([#&#8203;8205](https://github.com/astral-sh/ruff/pull/8205)) - Don't warn about magic trailing comma when `isort.force-single-line` is true ([#&#8203;8244](https://github.com/astral-sh/ruff/pull/8244)) - Use `SourceKind::diff` for formatter ([#&#8203;8240](https://github.com/astral-sh/ruff/pull/8240)) - Fix `fmt:off` with trailing child comment ([#&#8203;8234](https://github.com/astral-sh/ruff/pull/8234)) - Formatter parentheses support for `IpyEscapeCommand` ([#&#8203;8207](https://github.com/astral-sh/ruff/pull/8207)) ##### Linter - \[`pylint`] Add buffer methods to `bad-dunder-method-name` (`PLW3201`) exclusions ([#&#8203;8190](https://github.com/astral-sh/ruff/pull/8190)) - Match rule prefixes from `external` codes setting in `unused-noqa` ([#&#8203;8177](https://github.com/astral-sh/ruff/pull/8177)) - Use `line-length` setting for isort in lieu of `pycodestyle.max-line-length` ([#&#8203;8235](https://github.com/astral-sh/ruff/pull/8235)) - Update fix for `unnecessary-paren-on-raise-exception` to unsafe for unknown types ([#&#8203;8231](https://github.com/astral-sh/ruff/pull/8231)) - Correct quick fix message for `W605` ([#&#8203;8255](https://github.com/astral-sh/ruff/pull/8255)) ##### Documentation - Fix typo in max-doc-length documentation ([#&#8203;8201](https://github.com/astral-sh/ruff/pull/8201)) - Improve documentation around linter-formatter conflicts ([#&#8203;8257](https://github.com/astral-sh/ruff/pull/8257)) - Fix link to error suppression documentation in `unused-noqa` ([#&#8203;8172](https://github.com/astral-sh/ruff/pull/8172)) - Add `external` option to `unused-noqa` documentation ([#&#8203;8171](https://github.com/astral-sh/ruff/pull/8171)) - Add title attribute to icons ([#&#8203;8060](https://github.com/astral-sh/ruff/pull/8060)) - Clarify unsafe case in RSE102 ([#&#8203;8256](https://github.com/astral-sh/ruff/pull/8256)) - Fix skipping formatting examples ([#&#8203;8210](https://github.com/astral-sh/ruff/pull/8210)) - docs: fix name of `magic-trailing-comma` option in README ([#&#8203;8200](https://github.com/astral-sh/ruff/pull/8200)) - Add note about scope of rule changing in versioning policy ([#&#8203;8169](https://github.com/astral-sh/ruff/pull/8169)) - Document: Fix default lint rules ([#&#8203;8218](https://github.com/astral-sh/ruff/pull/8218)) - Fix a wrong setting in configuration.md ([#&#8203;8186](https://github.com/astral-sh/ruff/pull/8186)) - Fix misspelled TOML headers in the tutorial ([#&#8203;8209](https://github.com/astral-sh/ruff/pull/8209)) ### [`v0.1.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#012) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.1...v0.1.2) This release includes the Beta version of the Ruff formatter — an extremely fast, Black-compatible Python formatter. Try it today with `ruff format`! [Check out the blog post](https://astral.sh/blog/the-ruff-formatter) and [read the docs](https://docs.astral.sh/ruff/formatter/). ##### Preview features - \[`pylint`] Implement `non-ascii-module-import` (`C2403`) ([#&#8203;8056](https://github.com/astral-sh/ruff/pull/8056)) - \[`pylint`] implement `non-ascii-name` (`C2401`) ([#&#8203;8038](https://github.com/astral-sh/ruff/pull/8038)) - \[`pylint`] Implement unnecessary-lambda (W0108) ([#&#8203;7953](https://github.com/astral-sh/ruff/pull/7953)) - \[`refurb`] Implement `read-whole-file` (`FURB101`) ([#&#8203;7682](https://github.com/astral-sh/ruff/pull/7682)) - Add fix for `E223`, `E224`, and `E242` ([#&#8203;8143](https://github.com/astral-sh/ruff/pull/8143)) - Add fix for `E225`, `E226`, `E227`, and `E228` ([#&#8203;8136](https://github.com/astral-sh/ruff/pull/8136)) - Add fix for `E252` ([#&#8203;8142](https://github.com/astral-sh/ruff/pull/8142)) - Add fix for `E261` ([#&#8203;8114](https://github.com/astral-sh/ruff/pull/8114)) - Add fix for `E273` and `E274` ([#&#8203;8144](https://github.com/astral-sh/ruff/pull/8144)) - Add fix for `E275` ([#&#8203;8133](https://github.com/astral-sh/ruff/pull/8133)) - Update `SIM401` to catch ternary operations ([#&#8203;7415](https://github.com/astral-sh/ruff/pull/7415)) - Update `E721` to allow `is` and `is` not for direct type comparisons ([#&#8203;7905](https://github.com/astral-sh/ruff/pull/7905)) ##### Rule changes - Add `backports.strenum` to `deprecated-imports` ([#&#8203;8113](https://github.com/astral-sh/ruff/pull/8113)) - Update `SIM112` to ignore `https_proxy`, `http_proxy`, and `no_proxy` ([#&#8203;8140](https://github.com/astral-sh/ruff/pull/8140)) - Update fix for `literal-membership` (`PLR6201`) to be unsafe ([#&#8203;8097](https://github.com/astral-sh/ruff/pull/8097)) - Update fix for `mutable-argument-defaults` (`B006`) to be unsafe ([#&#8203;8108](https://github.com/astral-sh/ruff/pull/8108)) ##### Formatter - Change `line-ending` default to `auto` ([#&#8203;8057](https://github.com/astral-sh/ruff/pull/8057)) - Respect parenthesized generators in `has_own_parentheses` ([#&#8203;8100](https://github.com/astral-sh/ruff/pull/8100)) - Add caching to formatter ([#&#8203;8089](https://github.com/astral-sh/ruff/pull/8089)) - Remove `--line-length` option from `format` command ([#&#8203;8131](https://github.com/astral-sh/ruff/pull/8131)) - Add formatter to `line-length` documentation ([#&#8203;8150](https://github.com/astral-sh/ruff/pull/8150)) - Warn about incompatible formatter options ([#&#8203;8088](https://github.com/astral-sh/ruff/pull/8088)) - Fix range of unparenthesized tuple subject in match statement ([#&#8203;8101](https://github.com/astral-sh/ruff/pull/8101)) - Remove experimental formatter warning ([#&#8203;8148](https://github.com/astral-sh/ruff/pull/8148)) - Don't move type param opening parenthesis comment ([#&#8203;8163](https://github.com/astral-sh/ruff/pull/8163)) - Update versions in format benchmark script ([#&#8203;8110](https://github.com/astral-sh/ruff/pull/8110)) - Avoid loading files for cached format results ([#&#8203;8134](https://github.com/astral-sh/ruff/pull/8134)) ##### CLI - Show the `ruff format` command in help menus ([#&#8203;8167](https://github.com/astral-sh/ruff/pull/8167)) - Add `ruff version` command with long version display ([#&#8203;8034](https://github.com/astral-sh/ruff/pull/8034)) ##### Configuration - New `pycodestyle.max-line-length` option ([#&#8203;8039](https://github.com/astral-sh/ruff/pull/8039)) ##### Bug fixes - Detect `sys.version_info` slices in `outdated-version-block` ([#&#8203;8112](https://github.com/astral-sh/ruff/pull/8112)) - Avoid if-else simplification for `TYPE_CHECKING` blocks ([#&#8203;8072](https://github.com/astral-sh/ruff/pull/8072)) - Avoid false-positive print separator diagnostic with starred argument ([#&#8203;8079](https://github.com/astral-sh/ruff/pull/8079)) ##### Documentation - Fix message for `too-many-arguments` lint ([#&#8203;8092](https://github.com/astral-sh/ruff/pull/8092)) - Fix `extend-unsafe-fixes` and `extend-safe-fixes` example ([#&#8203;8139](https://github.com/astral-sh/ruff/pull/8139)) - Add links to `flake8-import-conventions` options ([#&#8203;8115](https://github.com/astral-sh/ruff/pull/8115)) - Rework the documentation to incorporate the Ruff formatter ([#&#8203;7732](https://github.com/astral-sh/ruff/pull/7732)) - Fix `Options` JSON schema description ([#&#8203;8081](https://github.com/astral-sh/ruff/pull/8081)) - Fix typo (`pytext` -> `pytest`) ([#&#8203;8117](https://github.com/astral-sh/ruff/pull/8117)) - Improve `magic-value-comparison` example in docs ([#&#8203;8111](https://github.com/astral-sh/ruff/pull/8111)) ### [`v0.1.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0115) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.0...v0.1.1) ##### Preview features - Error when `NURSERY` selector is used with `--preview` ([#&#8203;9682](https://github.com/astral-sh/ruff/pull/9682)) - Preserve indentation around multiline strings in formatter ([#&#8203;9637](https://github.com/astral-sh/ruff/pull/9637)) - \[`flake8-return`] Add fixes for all rules (`RET505`, `RET506`, `RET507`, `RET508`) ([#&#8203;9595](https://github.com/astral-sh/ruff/pull/9595)) - \[`flake8-simplify`] Add fix for `if-with-same-arms` (`SIM114`) ([#&#8203;9591](https://github.com/astral-sh/ruff/pull/9591)) - \[`pycodestyle`] Add fix for `multiple-imports-on-one-line` (`E401`) ([#&#8203;9518](https://github.com/astral-sh/ruff/pull/9518)) - \[`pylint`] Add fix for `collapsible-else-if` (`PLR5501`) ([#&#8203;9594](https://github.com/astral-sh/ruff/pull/9594)) - \[`pylint`] Add fix for `useless-else-on-loop` (`PLW0120`) ([#&#8203;9590](https://github.com/astral-sh/ruff/pull/9590)) - \[`pylint`] Implement `assigning-non-slot` (`E0237`) ([#&#8203;9623](https://github.com/astral-sh/ruff/pull/9623)) - \[`pylint`] Implement `potential-index-error` (`PLE0643`) ([#&#8203;9545](https://github.com/astral-sh/ruff/pull/9545)) - \[`pylint`] Implement `too-many-nested-blocks` (`PLR1702`) ([#&#8203;9172](https://github.com/astral-sh/ruff/pull/9172)) - \[`ruff`] Add rule to sort `__slots__` and `__match_args__` ([#&#8203;9564](https://github.com/astral-sh/ruff/pull/9564)) - \[`ruff`] Detect unnecessary `dict` comprehensions for iterables (`RUF025`) ([#&#8203;9613](https://github.com/astral-sh/ruff/pull/9613)) - \[`ruff`] Guard against use of `default_factory` as a keyword argument (`RUF026`) ([#&#8203;9651](https://github.com/astral-sh/ruff/pull/9651)) - \[`ruff`] Implement `mutable-fromkeys-value` (`RUF024`) ([#&#8203;9597](https://github.com/astral-sh/ruff/pull/9597)) ##### CLI - Enable auto-wrapping of `--help` output ([#&#8203;9633](https://github.com/astral-sh/ruff/pull/9633)) ##### Bug fixes - Avoid rendering display-only rules as fixable ([#&#8203;9649](https://github.com/astral-sh/ruff/pull/9649)) - Detect automagic-like assignments in notebooks ([#&#8203;9653](https://github.com/astral-sh/ruff/pull/9653)) - Generate custom JSON schema for dynamic setting ([#&#8203;9632](https://github.com/astral-sh/ruff/pull/9632)) - \[`flake8-no-pep420`] Include global `--config` when determining namespace packages ([#&#8203;9603](https://github.com/astral-sh/ruff/pull/9603)) - \[`flake8-pie`] Omit bound tuples passed to `.startswith` or `.endswith` ([#&#8203;9661](https://github.com/astral-sh/ruff/pull/9661)) - \[`flake8-return`] Avoid panic when fixing inlined else blocks ([#&#8203;9657](https://github.com/astral-sh/ruff/pull/9657)) - \[`flake8-return`] Consider exception suppression in unnecessary assignment ([#&#8203;9673](https://github.com/astral-sh/ruff/pull/9673)) - \[`flake8-return`] Take `NoReturn` annotation into account when analyzing implicit returns ([#&#8203;9636](https://github.com/astral-sh/ruff/pull/9636)) - \[`flake8-simplify`] Support inverted returns in `needless-bool` (`SIM103`) ([#&#8203;9619](https://github.com/astral-sh/ruff/pull/9619)) - \[`flake8-type-checking`] Add Pydantic's `BaseConfig` to default-copy list ([#&#8203;9650](https://github.com/astral-sh/ruff/pull/9650)) - \[`flake8-type-checking`] Avoid marking `InitVar` as a typing-only annotation ([#&#8203;9688](https://github.com/astral-sh/ruff/pull/9688)) - \[`pycodestyle`] Allow `dtype` comparisons in `type-comparison` ([#&#8203;9676](https://github.com/astral-sh/ruff/pull/9676)) - \[`pydocstyle`] Re-implement `last-line-after-section` (`D413`) ([#&#8203;9654](https://github.com/astral-sh/ruff/pull/9654)) ##### Documentation - \[`flake8-pytest-style`] Add fix safety documentation for `duplicate-parameterize-test-cases` ([#&#8203;9678](https://github.com/astral-sh/ruff/pull/9678)) - \[`pylint`] Document `literal-membership` fix safety conditions ([#&#8203;9677](https://github.com/astral-sh/ruff/pull/9677)) - \[`isort`] Fix reference to `isort` rule code ([#&#8203;9598](https://github.com/astral-sh/ruff/pull/9598)) ### [`v0.1.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#010) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.0.292...v0.1.0) This is the first release which uses the `CHANGELOG` file. See [GitHub Releases](https://github.com/astral-sh/ruff/releases) for prior changelog entries. Read Ruff's new [versioning policy](https://docs.astral.sh/ruff/versioning/). ##### Breaking changes - Unsafe fixes are no longer displayed or applied without opt-in ([#&#8203;7769](https://github.com/astral-sh/ruff/pull/7769)) - Drop formatting specific rules from the default set ([#&#8203;7900](https://github.com/astral-sh/ruff/pull/7900)) - The deprecated `format` setting has been removed ([#&#8203;7984](https://github.com/astral-sh/ruff/pull/7984)) - The `format` setting cannot be used to configure the output format, use `output-format` instead - The `RUFF_FORMAT` environment variable is ignored, use `RUFF_OUTPUT_FORMAT` instead - The `--format` option has been removed from `ruff check`, use `--output-format` instead ##### Rule changes - Extend `reimplemented-starmap` (`FURB140`) to catch calls with a single and starred argument ([#&#8203;7768](https://github.com/astral-sh/ruff/pull/7768)) - Improve cases covered by `RUF015` ([#&#8203;7848](https://github.com/astral-sh/ruff/pull/7848)) - Update `SIM15` to allow `open` followed by `close` ([#&#8203;7916](https://github.com/astral-sh/ruff/pull/7916)) - Respect `msgspec.Struct` default-copy semantics in `RUF012` ([#&#8203;7786](https://github.com/astral-sh/ruff/pull/7786)) - Add `sqlalchemy` methods to \`flake8-boolean-trap\`\` exclusion list ([#&#8203;7874](https://github.com/astral-sh/ruff/pull/7874)) - Add fix for `PLR1714` ([#&#8203;7910](https://github.com/astral-sh/ruff/pull/7910)) - Add fix for `PIE804` ([#&#8203;7884](https://github.com/astral-sh/ruff/pull/7884)) - Add fix for `PLC0208` ([#&#8203;7887](https://github.com/astral-sh/ruff/pull/7887)) - Add fix for `PYI055` ([#&#8203;7886](https://github.com/astral-sh/ruff/pull/7886)) - Update `non-pep695-type-alias` to require `--unsafe-fixes` outside of stub files ([#&#8203;7836](https://github.com/astral-sh/ruff/pull/7836)) - Improve fix message for `UP018` ([#&#8203;7913](https://github.com/astral-sh/ruff/pull/7913)) - Update `PLW3201` to support `Enum` [sunder names](https://docs.python.org/3/library/enum.html#supported-sunder-names) ([#&#8203;7987](https://github.com/astral-sh/ruff/pull/7987)) ##### Preview features - Only show warnings for empty preview selectors when enabling rules ([#&#8203;7842](https://github.com/astral-sh/ruff/pull/7842)) - Add `unnecessary-key-check` to simplify `key in dct and dct[key]` to `dct.get(key)` ([#&#8203;7895](https://github.com/astral-sh/ruff/pull/7895)) - Add `assignment-in-assert` to prevent walrus expressions in assert statements ([#&#8203;7856](https://github.com/astral-sh/ruff/pull/7856)) - \[`refurb`] Add `single-item-membership-test` (`FURB171`) ([#&#8203;7815](https://github.com/astral-sh/ruff/pull/7815)) - \[`pylint`] Add `and-or-ternary` (`R1706`) ([#&#8203;7811](https://github.com/astral-sh/ruff/pull/7811)) *New rules are added in [preview](https://docs.astral.sh/ruff/preview/).* ##### Configuration - Add `unsafe-fixes` setting ([#&#8203;7769](https://github.com/astral-sh/ruff/pull/7769)) - Add `extend-safe-fixes` and `extend-unsafe-fixes` for promoting and demoting fixes ([#&#8203;7841](https://github.com/astral-sh/ruff/pull/7841)) ##### CLI - Added `--unsafe-fixes` option for opt-in to display and apply unsafe fixes ([#&#8203;7769](https://github.com/astral-sh/ruff/pull/7769)) - Fix use of deprecated `--format` option in warning ([#&#8203;7837](https://github.com/astral-sh/ruff/pull/7837)) - Show changed files when running under `--check` ([#&#8203;7788](https://github.com/astral-sh/ruff/pull/7788)) - Write summary messages to stderr when fixing via stdin instead of omitting them ([#&#8203;7838](https://github.com/astral-sh/ruff/pull/7838)) - Update fix summary message in `check --diff` to include unsafe fix hints ([#&#8203;7790](https://github.com/astral-sh/ruff/pull/7790)) - Add notebook `cell` field to JSON output format ([#&#8203;7664](https://github.com/astral-sh/ruff/pull/7664)) - Rename applicability levels to `Safe`, `Unsafe`, and `Display` ([#&#8203;7843](https://github.com/astral-sh/ruff/pull/7843)) ##### Bug fixes - Fix bug where f-strings were allowed in match pattern literal ([#&#8203;7857](https://github.com/astral-sh/ruff/pull/7857)) - Fix `SIM110` with a yield in the condition ([#&#8203;7801](https://github.com/astral-sh/ruff/pull/7801)) - Preserve trailing comments in `C414` fixes ([#&#8203;7775](https://github.com/astral-sh/ruff/pull/7775)) - Check sequence type before triggering `unnecessary-enumerate` `len` suggestion ([#&#8203;7781](https://github.com/astral-sh/ruff/pull/7781)) - Use correct start location for class/function clause header ([#&#8203;7802](https://github.com/astral-sh/ruff/pull/7802)) - Fix incorrect fixes for `SIM101` ([#&#8203;7798](https://github.com/astral-sh/ruff/pull/7798)) - Format comment before parameter default correctly ([#&#8203;7870](https://github.com/astral-sh/ruff/pull/7870)) - Fix `E251` false positive inside f-strings ([#&#8203;7894](https://github.com/astral-sh/ruff/pull/7894)) - Allow bindings to be created and referenced within annotations ([#&#8203;7885](https://github.com/astral-sh/ruff/pull/7885)) - Show per-cell diffs when analyzing notebooks over `stdin` ([#&#8203;7789](https://github.com/astral-sh/ruff/pull/7789)) - Avoid curly brace escape in f-string format spec ([#&#8203;7780](https://github.com/astral-sh/ruff/pull/7780)) - Fix lexing single-quoted f-string with multi-line format spec ([#&#8203;7787](https://github.com/astral-sh/ruff/pull/7787)) - Consider nursery rules to be in-preview for `ruff rule` ([#&#8203;7812](https://github.com/astral-sh/ruff/pull/7812)) - Report precise location for invalid conversion flag ([#&#8203;7809](https://github.com/astral-sh/ruff/pull/7809)) - Visit pattern match guard as a boolean test ([#&#8203;7911](https://github.com/astral-sh/ruff/pull/7911)) - Respect `--unfixable` in `ISC` rules ([#&#8203;7917](https://github.com/astral-sh/ruff/pull/7917)) - Fix edge case with `PIE804` ([#&#8203;7922](https://github.com/astral-sh/ruff/pull/7922)) - Show custom message in `PTH118` for `Path.joinpath` with starred arguments ([#&#8203;7852](https://github.com/astral-sh/ruff/pull/7852)) - Fix false negative in `outdated-version-block` when using greater than comparisons ([#&#8203;7920](https://github.com/astral-sh/ruff/pull/7920)) - Avoid converting f-strings within Django `gettext` calls ([#&#8203;7898](https://github.com/astral-sh/ruff/pull/7898)) - Fix false positive in `PLR6301` ([#&#8203;7933](https://github.com/astral-sh/ruff/pull/7933)) - Treat type aliases as typing-only expressions e.g. resolves false positive in `TCH004` ([#&#8203;7968](https://github.com/astral-sh/ruff/pull/7968)) - Resolve `cache-dir` relative to project root ([#&#8203;7962](https://github.com/astral-sh/ruff/pull/7962)) - Respect subscripted base classes in type-checking rules e.g. resolves false positive in `TCH003` ([#&#8203;7954](https://github.com/astral-sh/ruff/pull/7954)) - Fix JSON schema limit for `line-length` ([#&#8203;7883](https://github.com/astral-sh/ruff/pull/7883)) - Fix commented-out `coalesce` keyword ([#&#8203;7876](https://github.com/astral-sh/ruff/pull/7876)) ##### Documentation - Document `reimplemented-starmap` performance effects ([#&#8203;7846](https://github.com/astral-sh/ruff/pull/7846)) - Default to following the system dark/light mode ([#&#8203;7888](https://github.com/astral-sh/ruff/pull/7888)) - Add documentation for fixes ([#&#8203;7901](https://github.com/astral-sh/ruff/pull/7901)) - Fix typo in docs of `PLR6301` ([#&#8203;7831](https://github.com/astral-sh/ruff/pull/7831)) - Update `UP038` docs to note that it results in slower code ([#&#8203;7872](https://github.com/astral-sh/ruff/pull/7872)) - crlf -> cr-lf ([#&#8203;7766](https://github.com/astral-sh/ruff/pull/7766)) - Add an example of an unsafe fix ([#&#8203;7924](https://github.com/astral-sh/ruff/pull/7924)) - Fix documented examples for `unnecessary-subscript-reversal` ([#&#8203;7774](https://github.com/astral-sh/ruff/pull/7774)) - Correct error in tuple example in ruff formatter docs ([#&#8203;7822](https://github.com/astral-sh/ruff/pull/7822)) - Add versioning policy to documentation ([#&#8203;7923](https://github.com/astral-sh/ruff/pull/7923)) - Fix invalid code in `FURB177` example ([#&#8203;7832](https://github.com/astral-sh/ruff/pull/7832)) ##### Formatter - Less scary `ruff format` message ([#&#8203;7867](https://github.com/astral-sh/ruff/pull/7867)) - Remove spaces from import statements ([#&#8203;7859](https://github.com/astral-sh/ruff/pull/7859)) - Formatter quoting for f-strings with triple quotes ([#&#8203;7826](https://github.com/astral-sh/ruff/pull/7826)) - Update `ruff_python_formatter` generate.py comment ([#&#8203;7850](https://github.com/astral-sh/ruff/pull/7850)) - Document one-call chaining deviation ([#&#8203;7767](https://github.com/astral-sh/ruff/pull/7767)) - Allow f-string modifications in line-shrinking cases ([#&#8203;7818](https://github.com/astral-sh/ruff/pull/7818)) - Add trailing comment deviation to README ([#&#8203;7827](https://github.com/astral-sh/ruff/pull/7827)) - Add trailing zero between dot and exponential ([#&#8203;7956](https://github.com/astral-sh/ruff/pull/7956)) - Force parentheses for power operations in unary expressions ([#&#8203;7955](https://github.com/astral-sh/ruff/pull/7955)) ##### Playground - Fix playground `Quick Fix` action ([#&#8203;7824](https://github.com/astral-sh/ruff/pull/7824)) ### [`v0.0.292`](https://github.com/astral-sh/ruff/releases/tag/v0.0.292) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.0.291...v0.0.292) <!-- Release notes generated using configuration in .github/release.yml at v0.0.292 --> #### What's Changed ##### Highlights **This release includes full support for Python 3.12 ([out now!](https://www.python.org/downloads/release/python-3120/)), including the new type parameter ([PEP 695](https://peps.python.org/pep-0695/)) and f-string syntaxes ([PEP 701](https://peps.python.org/pep-0701/)).** PEP 701 lifts many of the restrictions on f-strings that existed in the past, allowing for arbitrarily nested f-strings, consistent quote style within f-strings, and more, all of which are now supported by Ruff (thanks to [@&#8203;dhruvmanila](https://github.com/dhruvmanila) in https://github.com/astral-sh/ruff/pull/7376). ##### Breaking Changes - In the formatter, `format.quote-style` no longer affects triple-quoted strings, to align with common conventions as well as the guidance from PEP 8 and PEP 257 (see: https://github.com/astral-sh/ruff/pull/7680). - `line-too-long` (`E501`) now ignores trailing pragma comments (like `# type: ignore` and `# noqa`) when computing line length (see: https://github.com/astral-sh/ruff/pull/7692). This is similar to flake8-bugbear's methodology for detecting overlong lines, and ensures that adding pragmas like `# noqa` does not introduce further lint errors. ##### Rules - \[`refurb`] Implement `print-empty-string` (`FURB105`) by [@&#8203;tjkuson](https://github.com/tjkuson) in https://github.com/astral-sh/ruff/pull/7617 - \[`flake8-bandit`] Implement `weak-cryptographic-key` (`S505`) by [@&#8203;mkniewallner](https://github.com/mkniewallner) in https://github.com/astral-sh/ruff/pull/7703 - \[`refurb`] Implement `implicit-cwd` (`FURB177`) by [@&#8203;danparizher](https://github.com/danparizher) in https://github.com/astral-sh/ruff/pull/7704 - `unnecessary-pass` (`PIE790`) now flags all unnecessary `pass` statements; previously, the rule only flagged `pass` statements that followed a docstring in a two-statement body (see: https://github.com/astral-sh/ruff/pull/7697). ##### Settings - Add `lint` section to Ruff configuration by [@&#8203;MichaReiser](https://github.com/MichaReiser) in https://github.com/astral-sh/ruff/pull/7549 - Add `explicit-preview-rules` to toggle explicit selection of preview rules by [@&#8203;zanieb](https://github.com/zanieb) in https://github.com/astral-sh/ruff/pull/7390 - Decrease PEP 593 error to a debug warning by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7745 - Write full Jupyter notebook to `stdout` by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7748 - Extend `unnecessary-pass` (`PIE790`) to trigger on all unnecessary `pass` statements by [@&#8203;tjkuson](https://github.com/tjkuson) in https://github.com/astral-sh/ruff/pull/7697 ##### Bug Fixes - Ignore blank lines between comments when counting newlines-after-imports by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7607 - Avoid reordering mixed-indent-level comments after branches by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7609 - Avoid flagging B009 and B010 on starred expressions by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7621 - Use deletion for D215 full-line removals by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7625 - Avoid searching for bracketed comments in unparenthesized generators by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7627 - Update return type for `PT022` autofix by [@&#8203;dhruvmanila](https://github.com/dhruvmanila) in https://github.com/astral-sh/ruff/pull/7613 - Flag FURB105 with starred kwargs by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7630 - Don't suggest replacing `builtin.open()` with `Path.open()` if the latter doesn't support all options by [@&#8203;konstin](https://github.com/konstin) in https://github.com/astral-sh/ruff/pull/7637 - Use 1-based cell indices consistently for Notebooks by [@&#8203;dhruvmanila](https://github.com/dhruvmanila) in https://github.com/astral-sh/ruff/pull/7662 - Add `Expr::Name` checks to rules which use `is_logger_candidate` by [@&#8203;qdegraaf](https://github.com/qdegraaf) in https://github.com/astral-sh/ruff/pull/7521 - Ensure that B006 autofixes are inserted after imports by [@&#8203;Hoxbro](https://github.com/Hoxbro) in https://github.com/astral-sh/ruff/pull/7629 - Allow named expressions in `__all__` assignments by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7673 - Include radix base prefix in large number representation by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7700 - Parenthesize multi-line attributes in B009 by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7701 - Insert necessary padding in B014 fixes by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7699 - fix(rules): improve S507 detection by [@&#8203;mkniewallner](https://github.com/mkniewallner) in https://github.com/astral-sh/ruff/pull/7661 - Ignore TODO tags in `commented-out-code` by [@&#8203;tjkuson](https://github.com/tjkuson) in https://github.com/astral-sh/ruff/pull/7523 - Track fix isolation in `unnecessary-pass` by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7715 - Use fixed source code for parser context by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7717 - Preserve parentheses in `quadratic-list-summation` by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7719 - Compute `NotebookIndex` for `Diagnostics` on stdin by [@&#8203;dhruvmanila](https://github.com/dhruvmanila) in https://github.com/astral-sh/ruff/pull/7663 - Perform insertions before replacements by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7739 - Skip all bracketed expressions when locating comparison ops by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7740 - Fix PLE251 rules with f-string escaping by [@&#8203;konstin](https://github.com/konstin) in https://github.com/astral-sh/ruff/pull/7741 - Skip BOM when inserting start-of-file imports by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7622 - Emit `LexError` for dedent to incorrect level by [@&#8203;MichaReiser](https://github.com/MichaReiser) in https://github.com/astral-sh/ruff/pull/7638 - Expand `DeprecatedLogWarn` to check for `Expr::Atrribute` calls by [@&#8203;qdegraaf](https://github.com/qdegraaf) in https://github.com/astral-sh/ruff/pull/7677 ##### Other Changes - Add support for PEP 701 by [@&#8203;dhruvmanila](https://github.com/dhruvmanila) in https://github.com/astral-sh/ruff/pull/7376 - Improve performance of `commented-out-code` (~50-80%) by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7706 #### New Contributors - [@&#8203;bluthej](https://github.com/bluthej) made their first contribution in https://github.com/astral-sh/ruff/pull/7665 - [@&#8203;Hoxbro](https://github.com/Hoxbro) made their first contribution in https://github.com/astral-sh/ruff/pull/7629 - [@&#8203;danparizher](https://github.com/danparizher) made their first contribution in https://github.com/astral-sh/ruff/pull/7704 - [@&#8203;aspizu](https://github.com/aspizu) made their first contribution in https://github.com/astral-sh/ruff/pull/7750 **Full Changelog**: https://github.com/astral-sh/ruff/compare/v0.0.291...v0.0.292 ### [`v0.0.291`](https://github.com/astral-sh/ruff/releases/tag/v0.0.291) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.0.290...v0.0.291) <!-- Release notes generated using configuration in .github/release.yml at v0.0.291 --> #### What's Changed ##### Deprecations **The `format` command-line argument and configuration option has been renamed to `output-format`.** While Ruff will continue to respect `format` when passed as a command-line argument or configuration option, this backwards-compatible support will be dropped in a future release. See: https://github.com/astral-sh/ruff/pull/7514. ##### Rules - \[`flake8-bandit`] Implement `S201`: `flask-debug-true` by [@&#8203;mkniewallner](https://github.com/mkniewallner) in https://github.com/astral-sh/ruff/pull/7503 - \[`flake8-bandit`] Implement `S507`: `ssh_no_host_key_verification` by [@&#8203;mkniewallner](https://github.com/mkniewallner) in https://github.com/astral-sh/ruff/pull/7528 - \[`flake8-logging`] Implement `LOG002`: `invalid-get-logger-argument` by [@&#8203;dhruvmanila](https://github.com/dhruvmanila) in https://github.com/astral-sh/ruff/pull/7399 - \[`flake8-logging`] Implement `LOG007`: `exception-without-exc-info` by [@&#8203;qdegraaf](https://github.com/qdegraaf) in https://github.com/astral-sh/ruff/pull/7410 - \[`refurb`] Implement `FURB140`: `reimplemented-starmap` by [@&#8203;SavchenkoValeriy](https://github.com/SavchenkoValeriy) in https://github.com/astral-sh/ruff/pull/7253 - \[`refurb`] Implement `FURB148`: `unnecessary-enumerate` by [@&#8203;tjkuson](https://github.com/tjkuson) in https://github.com/astral-sh/ruff/pull/7454 - \[`ruff`] Detect `asyncio.get_running_loop` calls in RUF006 by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7562 ##### Settings - Show `--no-X` variants in CLI help by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7504 - Rename `format` option to `output-format` by [@&#8203;MichaReiser](https://github.com/MichaReiser) in https://github.com/astral-sh/ruff/pull/7514 - Enable tab completion for `ruff rule` by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7560 ##### Bug Fixes - Add padding to prevent some autofix errors by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7461 - Remove parentheses when rewriting assert calls to statements by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7464 - Avoid flagging starred elements in C402 by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7466 - Extend `bad-dunder-method-name` to permit `attrs` dunders by [@&#8203;tjkuson](https://github.com/tjkuson) in https://github.com/astral-sh/ruff/pull/7472 - Avoid N802 violations for [@&#8203;overload](https://github.com/overload) methods by [@&#8203;JonathanPlasse](https://github.com/JonathanPlasse) in https://github.com/astral-sh/ruff/pull/7498 - Avoid flagging starred expressions in UP007 by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7505 - Ensure that LOG007 only triggers on `.exception()` calls by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7524 - Use strict sorted and union for NoQA mapping insertion by [@&#8203;dhruvmanila](https://github.com/dhruvmanila) in https://github.com/astral-sh/ruff/pull/7531 - Avoid inserting imports directly after continuation by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7553 - Add padding in `PERF102` fixes by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7554 - Avoid invalid fix for parenthesized values in F601 by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7559 - Treat `os.error` as an `OSError` alias by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7582 - Extend `bad-dunder-method-name` to permit `__html__` by [@&#8203;jaap3](https://github.com/jaap3) in https://github.com/astral-sh/ruff/pull/7492 - Fix stylist indentation with a formfeed by [@&#8203;konstin](https://github.com/konstin) in https://github.com/astral-sh/ruff/pull/7489 #### New Contributors - [@&#8203;MicaelJarniac](https://github.com/MicaelJarniac) made their first contribution in https://github.com/astral-sh/ruff/pull/5498 - [@&#8203;maheshsaripalli9](https://github.com/maheshsaripalli9) made their first contribution in https://github.com/astral-sh/ruff/pull/7552 - [@&#8203;T-256](https://github.com/T-256) made their first contribution in https://github.com/astral-sh/ruff/pull/7585 **Full Changelog**: https://github.com/astral-sh/ruff/compare/v0.0.290...v0.0.291 ### [`v0.0.290`](https://github.com/astral-sh/ruff/releases/tag/v0.0.290) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.0.289...v0.0.290) <!-- Release notes generated using configuration in .github/release.yml at v0.0.290 --> #### What's Changed ##### Rules - Update `deprecated-import` lists based on recent `typing-extensions` release by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7356 - Add support for bounds, constraints, and explicit variance on generic type variables to `UP040` by [@&#8203;nathanwhit](https://github.com/nathanwhit) in https://github.com/astral-sh/ruff/pull/6749 ##### Settings - Show rule codes in shell tab completion by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7375 ##### Bug Fixes - Parenthesize single-generator arguments when adding reverse keyword by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7365 - Invert reverse argument regardless of whether it's a boolean by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7372 - Extend `C416` to catch tuple unpacking by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7363 - Allow `NURSERY` rule selctor in JSON Schema by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7374 - Avoid flagging single-quoted docstrings with continuations for multi-line rules by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7392 - Treat whitespace-only line as blank for `D411` by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7351 ##### Preview [*What's this section?*](https://beta.ruff.rs/docs/preview/) - \[`flake8-logging`] New rule `undocumented-warn` (`LOG009`) by [@&#8203;qdegraaf](https://github.com/qdegraaf) in https://github.com/astral-sh/ruff/pull/7249 - \[`flake8-logging`] New rule `direct-logger-instantiation` (`LOG001`) by [@&#8203;charliermarsh](https://github.com/charliermarsh) in https://github.com/astral-sh/ruff/pull/7397 - \[`flake8-logging`] New plugin `flake8_logging` (`LOG`) by [@&#8203;qdegraaf](https://github.com/qdegraaf) in https://github.com/astral-sh/ruff/pull/7249 - \[`perflint`] Add `manual-dict-comprehsion` (`PERF403`) by [@&#8203;qdegraaf](https://github.com/qdegraaf) in https://github.com/astral-sh/ruff/pull/6132 - \[`pylint`] New rule `too-many-public-methods` (`PLR0904`) by [@&#8203;jelly](https://github.com/jelly) in https://github.com/astral-sh/ruff/pull/6179 - \[`refurb`] New rule `no-slice-copy` (`FURB145`) by [@&#8203;tjkuson](https://github.com/tjkuson) in https://github.com/astral-sh/ruff/pull/7007 - Add warnings for nursery and preview rule selection by [@&#8203;zanieb](https://github.com/zanieb) in https://github.com/astral-sh/ruff/pull/7210 - Remove the `PREVIEW` rule selector by [@&#8203;zanieb](https://github.com/zanieb) in https://github.com/astral-sh/ruff/pull/7389 - [`pre-commit` support](https://github.com/astral-sh/ruff-pre-commit#using-ruffs-formatter-unstable) for the [alpha formatter](https://github.com/astral-sh/ruff/discussions/7310) by [@&#8203;zanieb](https://github.com/zanieb) in https://github.com/astral-sh/ruff-pre-commit/pull/50 #### New Contributors - [@&#8203;nathanwhit](https://github.com/nathanwhit) made their first contribution in https://github.com/astral-sh/ruff/pull/6749 **Full Changelog**: https://github.com/astral-sh/ruff/compare/v0.0.289...v0.0.290 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC45Mi4xIiwidXBkYXRlZEluVmVyIjoiMzguOTIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
hads added 1 commit 2024-11-12 18:03:19 +13:00
chore(deps): update dependency ruff to ^0.7.0
All checks were successful
Build and Publish Docker Image / build (pull_request) Successful in 50s
c9549ca390
hads merged commit 59726dd97c into main 2024-11-13 15:34:21 +13:00
hads deleted branch renovate/ruff-0.x 2024-11-13 15:34:21 +13:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: hads/hinpdof#2
No description provided.