changelogs/0.10.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.
Changes to how the Python version is inferred when a target-version is not specified (#16319)
Because of a mistake in the release process, the requires-python inference changes are not included in this release and instead shipped as part of 0.11.0.
You can find a description of this change in the 0.11.0 section.
Updated TYPE_CHECKING behavior (#16669)
Previously, Ruff only recognized typechecking blocks that tested the typing.TYPE_CHECKING symbol. Now, Ruff recognizes any local variable named TYPE_CHECKING. This release also removes support for the legacy if 0: and if False: typechecking checks. Use a local TYPE_CHECKING variable instead.
More robust noqa parsing (#16483)
The syntax for both file-level and in-line suppression comments has been unified and made more robust to certain errors. In most cases, this will result in more suppression comments being read by Ruff, but there are a few instances where previously read comments will now log an error to the user instead. Please refer to the documentation on Error suppression for the full specification.
Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment (#14005)
This change fixes a bug in the formatter where it introduced unnecessary parentheses around with statements with a single context manager and a trailing comment. This change may result in a change in formatting for some users.
Bump alpine default tag to 3.21 for derived Docker images (#16456)
Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Now the ruff:alpine image will use 3.21 instead of 3.20 and ruff:alpine3.20 will no longer be updated.
The following rules have been deprecated:
non-pep604-isinstance (UP038)suspicious-xmle-tree-usage (S320)The following rules have been remapped to new rule codes:
unsafe-markup-use]: RUF035 to S704The following rules have been stabilized and are no longer in preview:
batched-without-explicit-strict (B911)unnecessary-dict-comprehension-for-iterable (C420)datetime-min-max (DTZ901)fast-api-unused-path-parameter (FAST003)root-logger-call (LOG015)len-test (PLC1802)shallow-copy-environ (PLW1507)os-listdir (PTH208)invalid-pathlib-with-suffix (PTH210)invalid-assert-message-literal-argument (RUF040)unnecessary-nested-literal (RUF041)unnecessary-cast-to-int (RUF046)map-int-version-parsing (RUF048)if-key-in-dict-del (RUF051)unsafe-markup-use (S704). This rule has also been renamed from RUF035.split-static-string (SIM905)runtime-cast-value (TC006)unquoted-type-alias (TC007)non-pep646-unpack (UP044)The following behaviors have been stabilized:
bad-staticmethod-argument (PLW0211) invalid-first-argument-name-for-class-method (N804): __new__ methods are now no longer flagged by invalid-first-argument-name-for-class-method (N804) but instead by bad-staticmethod-argument (PLW0211)bad-str-strip-call (PLE1310): The rule now applies to objects which are known to have type str or bytes.custom-type-var-for-self (PYI019): More accurate detection of custom TypeVars replaceable by Self. The range of the diagnostic is now the full function header rather than just the return annotation.invalid-argument-name (N803): Ignore argument names of functions decorated with typing.overrideinvalid-envvar-default (PLW1508): Detect default value arguments to os.environ.get with invalid type.pytest-raises-with-multiple-statements (PT012) pytest-warns-with-multiple-statements (PT031): Allow for statements with an empty body in pytest.raises and pytest.warns with statements.redundant-open-modes (UP015): The diagnostic range is now the range of the redundant mode argument where it previously was the range of the entire open call. You may have to replace your noqa comments when suppressing UP015.stdlib-module-shadowing (A005): Changes the default value of lint.flake8-builtins.strict-checking from true to false.type-none-comparison (FURB169): Now also recognizes type(expr) is type(None) comparisons where expr isn't a name expression.The following fixes or improvements to fixes have been stabilized:
repeated-equality-comparison (PLR1714) (#16685)needless-bool (SIM103) (#16684)unused-private-type-var (PYI018) (#16682)ruff.printDebugInformation (#16617)flake8-builtins] Deprecate the builtins- prefixed options in favor of the unprefixed options (e.g. builtins-allowed-modules is now deprecated in favor of allowed-modules) (#16092)last_tag/commits_since_last_tag for version command (#16686)