changelogs/0.5.x.md
Check out the blog post for a migration guide and overview of the changes!
See also, the "Remapped rules" section which may result in disabled rules.
ALL now excludes deprecated rules--strip-components=1 when untarring./latest URLs on GitHub.flake8-bandit rules were modified (#10667).The following rules are now deprecated:
syntax-error (E999): Syntax errors are now always shownThe following rules have been remapped to new rule codes:
blocking-http-call-in-async-function: ASYNC100 to ASYNC210open-sleep-or-subprocess-in-async-function: ASYNC101 split into ASYNC220, ASYNC221, ASYNC230, and ASYNC251blocking-os-call-in-async-function: ASYNC102 has been merged into ASYNC220 and ASYNC221trio-timeout-without-await: TRIO100 to ASYNC100trio-sync-call: TRIO105 to ASYNC105trio-async-function-with-timeout: TRIO109 to ASYNC109trio-unneeded-sleep: TRIO110 to ASYNC110trio-zero-sleep-call: TRIO115 to ASYNC115repeated-isinstance-calls: PLR1701 to SIM101The following rules have been stabilized and are no longer in preview:
mutable-fromkeys-value (RUF024)default-factory-kwarg (RUF026)django-extra (S610)manual-dict-comprehension (PERF403)print-empty-string (FURB105)readlines-in-for (FURB129)if-expr-min-max (FURB136)bit-count (FURB161)redundant-log-base (FURB163)regex-flag-alias (FURB167)isinstance-type-none (FURB168)type-none-comparison (FURB169)implicit-cwd (FURB177)hashlib-digest-hex (FURB181)list-reverse-copy (FURB187)bad-open-mode (PLW1501)empty-comment (PLR2044)global-at-module-level (PLW0604)misplaced-bare-raise (PLE0744)non-ascii-import-name (PLC2403)non-ascii-name (PLC2401)nonlocal-and-global (PLE0115)potential-index-error (PLE0643)redeclared-assigned-name (PLW0128)redefined-argument-from-local (PLR1704)repeated-keyword-argument (PLE1132)super-without-brackets (PLW0245)unnecessary-list-index-lookup (PLR1736)useless-exception-statement (PLW0133)useless-with-lock (PLW2101)The following behaviors have been stabilized:
is-literal (F632) now warns for identity checks against list, set or dictionary literalsneedless-bool (SIM103) now detects if expressions with implicit else branchesmodule-import-not-at-top-of-file (E402) now allows os.environ modifications between import statementstype-comparison (E721) now allows idioms such as type(x) is intyoda-condition (SIM300) now flags a wider range of expressionsThe following deprecated settings have been removed:
output-format=text; use output-format=concise or output-format=fulltab-size; use indent-widthThe following deprecated CLI options have been removed:
--show-source; use --output-format=full--no-show-source; use --output-format=conciseThe following deprecated CLI commands have been removed:
ruff <path>; use ruff check <path>ruff --clean; use ruff cleanruff --generate-shell-completion; use ruff generate-shell-completionruff] Add assert-with-print-message rule (#11981)--statistics (#11697)full by default (#12010)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)logFile (#11945)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)flake8-bugbear] Implement mutable-contextvar-default (B039) (#12113)pycodestyle] Whitespace after decorator (E204) (#12140)pytest] Reverse PT001 and PT0023 defaults (#12106)flake8-bandit] Detect httpx for S113 (#12174)numpy] Update NPY201 to include exception deprecations (#12065)pylint] Generate autofix for duplicate-bases (PLE0241) (#12105)requires-python inference robust to == (#12091)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)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)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)include and extend-include settings in native server (#12252)D203 (#12238)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)--output-format full default (#12248)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.
pyupgrade] Implement unnecessary-default-type-args (UP043) (#12371)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)--preview flag for server subcommand for the linter and formatter (#12208)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)ruff] Rename RUF007 to zip-instead-of-pairwise (#12399)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)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)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)Ord implementation of cmp_fix (#12471)pydoclint] Fix panic in DOC501 reported in #12428 (#12435)flake8-bugbear] Allow singleton tuples with starred expressions in B013 (#12484)nvim-lspconfig (#12507)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"]
flake8-builtins] Implement import, lambda, and module shadowing (#12546)pydoclint] Add docstring-missing-returns (DOC201) and docstring-extraneous-returns (DOC202) (#12485)flake8-return] Exempt cached properties and other property-like decorators from explicit return rule (RET501) (#12563)$/logTrace for server trace logs in Zed and VS Code (#12564)flake8-implicit-str-concat] Always allow explicit multi-line concatenations when implicit concatenations are banned (#12532)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)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)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)pyproject.toml files (#12727)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)