ruff/changelogs/0.5.x.md
Brent Westbrook 9220addf52
Split the changelog into separate files (#18725)
Summary
--

During the release today, I noticed that the changelog is finally too
long to
render at all on GitHub. This PR follows the same splitting procedure as
in
uv (astral-sh/uv#11510, astral-sh/uv#12099): first splitting the file
into one
per minor version, and then reversing the contents of each file to start
with
the breaking release (`changelogs/0.11.x.md` starts with 0.11.0 instead
of
0.11.13 as in the old changelog).

For the second part, I used
[`reverse-changelog.py`](https://github.com/astral-sh/uv/blob/main/scripts/reverse-changelog.py)
from the uv repo, so hopefully everything is correct. I spot-checked
0.7.0 at least.
2025-06-17 13:27:36 -04:00

26 KiB

Changelog 0.5.x

0.5.0

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)

0.5.1

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)

0.5.2

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)

0.5.3

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

  • Publish Wasm API to npm (#12317)

0.5.4

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)

0.5.5

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)

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.

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

0.5.7

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)