# What changed in ruff

> 274 changes in ruff 0.15 to 0.17 from its official release notes, upgrade guides and advisories: 23 breaking, 1 deprecations, 6 security, 24 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/pypi/ruff/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## ruff 0.17

### Breaking changes

- flake8-builtins expands its checks in class scopes. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The conda-forge build no longer depends on Python, so python -m ruff and import ruff no longer work; use ruff directly from PATH. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- Support for the legacy Python language server has been removed. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- When neither target-version nor requires-python configures a Python version, Ruff now defaults to Python 3.11 instead of Python 3.10. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The formatter and I001, E501, and W505 consistently ignore trailing pragma comments when computing line length; existing imports may be reformatted. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)

### Security

- macOS and Windows release executables and Ruff wheels are code-signed; macOS executables are also notarized, enabling publisher and binary-integrity verification. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)

### Deprecations

- ruff.nativeServer is deprecated and ignored because the Ruff VS Code extension now always uses the native language server. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)

### New APIs and options

- flake8-type-checking adds the notion of runtime-ambiguous references. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)

### Behavior and default changes

- The pycodestyle rules no longer treat None, True, or False as keywords. (0.17.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.1)
- More collections and weakref containers are treated as mutable. (0.17.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.1)
- The preview flake8-bugbear rule now reports the method name and a more precise range. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- These flake8-datetimez rules are no longer enabled by default. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The default full output format now shows unsafe fixes and suggestions requiring manual review regardless of unsafe-fixes; applying unsafe fixes still requires explicit opt-in. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- flake8-type-checking no longer flags annotations in function scopes. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The refurb fix is marked unsafe and the rule moves to suspicious. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- datetime as dt is now recognized as a conventional alias by flake8-import-conventions. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- JUnit output uses a skipped attribute instead of disabled on testsuite elements and adds a skipped attribute to the root testsuites element. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The TID255 rule is stabilized and no longer in preview. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The TID254 rule is stabilized and no longer in preview. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The default regex now recognizes underscore-prefixed Unicode names, such as _次, as dummy variables. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The RUF071 rule is stabilized and no longer in preview. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The preview Ruff rule allows docstrings in strict mode. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of Python 3.14. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- Ruff uses Unicode 17 data for identifier normalization and named character escapes. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)

### Tooling

- The conda-forge build now supports linux-riscv64, win-arm64, and linux-ppc64le platforms. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- pyupgrade now suggests typing.TypeForm on Python 3.15. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)

### Fixes and other changes

- Fixes dedent behavior when there are multiple leading comments. (0.17.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.1)
- The rules no longer suggest invalid comprehensions. (0.17.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.1)
- Fixes false positives on quoted annotations. (0.17.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.1)
- The rule now detects legacy positional-only parameters in __new__ methods. (0.17.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.1)
- The fix is marked unsafe when it creates a docstring. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- The useless-return fix now preserves trailing comments. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- Avoids a false positive when pytest.raises is used in a with statement. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- flake8-self allows private access on object.__new__(cls) instances. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)
- flake8-tidy-imports skips lazy-import-mismatch in stubs. (0.17.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.17.0)

## ruff 0.16

### Breaking changes

- DTZ901 rejects `tzinfo=None` for datetime bounds. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Syntax errors now detect duplicate keyword arguments. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Semantic syntax errors in string type definitions are now emitted as F722. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Ruff enables 413 rules by default, up from 59, while removing 18 more opinionated E and F rules from the default set. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Checks additional PEP 585-compatible APIs, such as those from collections.abc. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The filename, location, end_location, and fix edit location fields may now be null instead of default values. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)

### Security

- The server avoids running `uv format` in untrusted workspaces. (0.16.10) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.10)
- Embeds archive checksums in the shell installer. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Checks keyword arguments as well as other arguments. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Checks keyword arguments as well as other arguments. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Checks keyword arguments as well as other arguments. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)

### New APIs and options

- Adds a pyupgrade rule for context manager iterator annotations. (0.16.10) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.10)
- Adds `extend-banned-api` configuration for `flake8-tidy-imports`. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Ruff recognizes the `parent_mode` argument for `RUF064` and `PTH103`. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Adds a preview rule for default values on method receivers. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Category selectors are introduced for selecting rules. (0.16.5) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.5)
- Adds a rule to replace `while 1` with `while True`. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- An option lets developers opt out of human-readable names. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Ruff can format Python code blocks in Markdown files and does so by default. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Supports the same output formats as the linter, including github and gitlab for CI annotations. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Suppression comments can appear at the end of a line or on the line preceding a diagnostic, like noqa comments. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)

### Performance

- Reduces memory used by diagnostics. (0.16.10) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.10)
- Speeds up inherited configuration resolution. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Ruff releases now enable PGO for Linux x86-64, Linux ARM64, Windows x86-64, and macOS ARM64. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- The unnecessary-future-import rule is faster. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)

### Behavior and default changes

- Ruff supports `__lazy_modules__`, including conditional assignments. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- On Python 3.15 and later, Ruff prefers lazy imports over `TYPE_CHECKING` imports. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- On Python 3.15 and later, Ruff prefers lazy imports over `TYPE_CHECKING` imports. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- On Python 3.15 and later, Ruff prefers lazy imports over `TYPE_CHECKING` imports. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Fixes are now always marked unsafe. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Pragma comments are excluded from line length calculation for I001. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- The rule moves to the restriction category, changing how it is categorized for configuration and rule selection. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- The preview default rules and categories are updated. (0.16.5) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.5)
- Rules can now be defined without codes. (0.16.5) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.5)
- The server can offer display-only fixes and marks safe fixes as preferred. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- The delete-full-slice rule is now restricted to lists. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- The existing exception now includes ctypes.LittleEndianStructure and related types. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Registers formatting capabilities dynamically to exclude TOML files. (0.16.2) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.2)
- Fixes that remove unknown separators are now marked unsafe. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Fixes are safe by default and unsafe only when comments are present. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Fixes for this rule are now marked unsafe. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- The airflow3-incompatible-function-signature rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- blind-except is suppressed when the exception is logged through logging methods other than critical, error, and exception. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The missing-copyright-notice rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The unnecessary-from-float rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The sorted-min-max rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Recognizes additional common gettext usage patterns, such as assigning gettext to builtins._. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Recognizes additional common gettext usage patterns, such as assigning gettext to builtins._. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Recognizes additional common gettext usage patterns, such as assigning gettext to builtins._. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The implicit-string-concatenation-in-collection-literal rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The log-exception-outside-except-handler rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The invalid-bool-return-type rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The too-many-positional-arguments rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The stop-iteration-return rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The none-not-at-end-of-union rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The access-annotations-from-class-dict rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- The duplicate-entry-in-dunder-all rule is stabilized and no longer in preview. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Check output now shows fixes. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Ruff suppression comments now insert a space after the colon. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Recognizes typing_extensions.Text in addition to typing.Text. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)

### Tooling

- Warnings now include the rule name and code. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- RUF039 and RUF055 now recognize `re.prefixmatch`. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Adds an autofix for PT020, allowing Ruff to automatically fix violations. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- The flake8-use-pathlib rule now offers an autofix. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Pull diagnostics are now supported for notebook cells. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Rule codes in the statistics output are now hyperlinked. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- The LSP now lints TOML files. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)

### Fixes and other changes

- Avoids false positives for calls with keyword arguments. (0.16.9) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.9)
- Avoids false positives for calls with keyword arguments. (0.16.9) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.9)
- Avoids false positives for calls with keyword arguments. (0.16.9) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.9)
- Updates LibCST-based fixes for Python 3.15. (0.16.9) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.9)
- Mentions stubs in the diagnostic message. (0.16.9) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.9)
- Avoids false positives for overloaded division. (0.16.9) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.9)
- Allows lazy imports to be used in deferred annotations. (0.16.9) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.9)
- Ruff now visits functional TypedDict keyword arguments correctly. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Ruff recognizes PEP-728 keywords on `TypedDict` classes. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Detects `\Z` in `pytest.raises()` match patterns. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- The automatic fix preserves operand order. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Detects nested `async with` under a synchronous parent. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Ruff skips conversions when `TypeVarTuple` or `ParamSpec` have bounds or constraints. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Ruff recognizes quoted types in `typing.TypeForm`. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Stops recommending deprecated `ByteString` aliases. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Multiline fixes preserve required parentheses. (0.16.8) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.8)
- Stops defining `__cached__` for Python 3.15. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Corrects the diagnostic for the conflict between D211 and D203. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Allows alternate nested quotes inside format spec interpolations. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Gates the PLW0133 check for `ImportCycleError` on Python 3.15. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Marks a fix unsafe when it would create a docstring. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Recognizes `slice` and `frozendict` generics. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Skips fixes for multi-member imports. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- Stops recommending the removed `typing.no_type_check_decorator`. (0.16.7) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.7)
- ASYNC230 now recognizes `builtins.open`. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Fixes a panic on match subjects. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Unary plus is allowed in match patterns on Python 3.15. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- PLW1514 now recognizes `builtins.open`. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Avoids emitting duplicate PT017 diagnostics. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Adds a display-only fix for `os.listdir`. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Ruff-specific suppressions no longer produce a `lint.external` hint. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Prevents a fix loop between TID254 and TID255. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Unary expressions are validated when parsing. (0.16.6) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.6)
- Detects blocking generic HTTP requests. (0.16.5) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.5)
- Allows timezone-safe strptime chains. (0.16.5) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.5)
- Respects side effects in lambda defaults. (0.16.5) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.5)
- The rule is skipped when the open argument is a file descriptor. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- The rule is skipped when the open argument is a file descriptor. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Fixes InvalidInstruction errors on Windows CPUs that do not support POPCNT. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- The error message for mixed t-string and bytes syntax is aligned with CPython 3.14. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Syntax errors now detect parameters declared nonlocal. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- The import-private-name rule now allows imports of os._exit. (0.16.4) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.4)
- Allows `continue` in `finally` on Python 3.8. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Makes the `np.chararray` autofix backwards-compatible. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Fixes false positives and negatives involving the `%b` format character. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Improves handling of concatenated strings. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Fixes a false positive with bools. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Fixes false positives and negatives involving the `%b` format character. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Fixes false negatives on negative numbers. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Checks keyword arguments as well as other arguments. (0.16.3) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.3)
- Avoids false positives on singledispatch functions. (0.16.2) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.2)
- Marks `range` as immutable. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- The fix NFKC-normalizes keyword names. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Section detection is skipped inside RST directive bodies. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Fixes indexing of excluded nested Ruff workspaces. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- The fix parenthesizes `yield` arguments. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Unknown enumeration values in LSP messages are handled gracefully. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Avoids a false positive when a variable is read in a `finally` clause. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Fixes a false positive involving unpacked arguments. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Syntax error noise is reduced by swallowing dedents like indents. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- The fixer skips changes when a defaulted TypeVar precedes a non-defaulted one. (0.16.1) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.1)
- Fixes a missing check on unrecognized early bound. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Resolves local string literal bindings to avoid more false positives. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Supports the recommended API from newer versions of PySNMP. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Supports the recommended API from newer versions of PySNMP. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)
- Fixes a false positive involving a TypeVar default before Python 3.13. (0.16.0) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.16.0)

## ruff 0.15

### Breaking changes

- The pytest-fixture-autouse rule has been removed. (0.15.20) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.20)
- The parser now rejects _ as a match-pattern target. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The pydocstyle rule now prevents property docstrings from starting with verbs. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The parser now rejects __debug__ as a lambda parameter. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The flake8-pyi rule formerly named PYI033 is renamed to legacy-type-comment. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The parser now rejects multiple starred names in sequence patterns. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The parser now rejects parenthesized star imports. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The flake8-pyi rule now applies to Python files as well. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The parser now rejects starred comprehension targets. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The parser now rejects unparenthesized generator expressions in class bases. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The parser now rejects yield expressions after commas. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The rule no longer offers an autofix for `np.in1d`. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)

### New APIs and options

- Adds a rule to replace `noqa` comments with `ruff:ignore`. (0.15.22) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.22)
- Adds a rule to use human-readable names in `ruff:ignore` comments. (0.15.22) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.22)
- Adds a rule to use human-readable names in configuration selectors. (0.15.22) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.22)
- Adds an option for adding ruff:ignore comments. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Adds --extend-exclude to ruff format. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Rule selectors can now use human-readable names. (0.15.20) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.20)
- Adds a rule that bans `pytest` autouse fixtures. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- The command accepts rule names. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Implements the yield-in-context-manager-in-async-generator diagnostic, allowing Ruff to detect this pattern. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Adds the airflow-task-implicit-multiple-outputs rule. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Adds the incorrect-decorator-order rule. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Adds the fallible-context-manager rule. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Adds the too-many-try-statements rule. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)

### Performance

- Reserves capacity for builtin bindings. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Optimizes formatter text width and indentation. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Source files are created lazily for lint diagnostics. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Uses ArrayVec for qualified name segments. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Avoids allocating when parsing single string literals. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Avoids reallocating singleton call arguments. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Skips repeated-key checks for singleton dictionaries. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Drops excess capacity from statement suites during parsing. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Avoids redundant TokenValue drops in the lexer. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Uses ThinVec in the AST to shrink Stmt. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Reduces memory usage by dropping token-excess capacity and improves performance by approximating the initial tokens Vec size. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Avoids unnecessary parser lookahead for operators. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)

### Behavior and default changes

- Allows subclassing builtins in stub files. (0.15.22) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.22)
- Drops the tuple-comprehension preview behavior for C409. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Formatting comments no longer normalizes whitespace. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Skips overload-with-docstring in stub files. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Marks PYI061 fixes as unsafe in Python files. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Unknown rule selectors now emit a warning instead of an error. (0.15.20) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.20)
- Diagnostic links in the playground are now clickable. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- LSP and playground diagnostics now use human-readable names. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The server renders subdiagnostics and secondary annotations as related information. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- Severity is no longer displayed in output. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- Python version comparisons are exempt from this rule. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Suppression comments can use human-readable rule names. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Automatically adds `from __future__ import annotations` for this rule. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Avoids fixes for ambiguous `argnames` and `argvalues` combinations. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)

### Tooling

- Adds an autofix for E402. (0.15.22) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.22)
- Adds linting and fixes for use of deprecated abc decorators. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Suppression comments and code actions support human-readable names when hovered. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- The playground now uses diagnostic tags. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- CLI output now uses human-readable names. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18), [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Pytest style checks also cover `pytest_asyncio` fixtures. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Automatically adds `from __future__ import annotations` for this rule. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Adds full support for PEP 798. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)

### Fixes and other changes

- Ignores mutable type updates in `redefined-loop-name`. (0.15.22) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.22)
- Fixes a false positive in `__all__`. (0.15.22) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.22)
- Marks the EXE004 fix as unsafe. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Refines detection of non-empty f-strings. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Fixes an autofix that incorrectly stripped + from comments. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Detects syntax errors in individual notebook cells. (0.15.21) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.21)
- Shebang handling in ruff:ignore comments now matches noqa shebang handling. (0.15.20) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.20)
- Ruff falls back to default settings when editor-only settings are invalid. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Fixes a panic when inserting text at a notebook cell boundary. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Updates fix suggestions for __floor__, __trunc__, __length_hint__, and __matmul__ variants. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Ruff crates are published to crates.io. (0.15.19) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.19)
- Ruff now detects mapping keys that are equivalent numeric values. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- The parser now validates the default order of function type parameters. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- Ruff now detects mapping keys equivalent to booleans. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- Ruff now handles nested ruff:ignore comments. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- Ruff now detects repeated signed and complex dictionary keys. (0.15.18) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.18)
- `trio.as_safe_channel` is recognized as a safe decorator. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Clarifies the diagnostic message for single parameters. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- The formatter preserves whitespace for Quarto cell option comments. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Fixes diagnostics when `ruff:enable` or `ruff:disable` appears where `ruff:ignore` is expected. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Fixes diagnostics when `ruff:enable` or `ruff:disable` appears where `ruff:ignore` is expected. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Suppressions respect diagnostic start and parent ranges, as well as trailing comments. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Handling of ignore comments within a disable/enable pair is fixed. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- Preserves leading empty literals to avoid syntax errors. (0.15.17) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.17)
- No longer flags `ruff:ignore` comments as code. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Fixes a conflict with RUF100 when `noqa` is on commented-out code. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Avoids removing a `format` call when doing so would change behavior. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Avoids syntax errors from invalid character replacements in f-strings before Python 3.12; the fix also covers PLE2512, PLE2513, PLE2514, and PLE2515. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Narrows the diagnostic range and excludes cases without exception handlers. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Treats `yield` before `break` from a terminal loop as terminal. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Avoids converting `format` calls with more kinds of side effects. (0.15.16) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.16)
- Returns a code action for resolve requests that contain no URL or no valid URL. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Reports duplicate imports in typing.TYPE_CHECKING blocks. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Treats function-scope bare annotations as locals, per PEP 526. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Fixes formatting of lambdas nested within f-strings. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Fixes how Ruff handles closing fences in Markdown. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Expands semantic syntax errors reported for invalid walruses. (0.15.15) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.15)
- Skips the rule for lambdas with positional-only parameters. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Treats generic frozenset annotations as immutable. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Fixes lambda formatting in interpolated string expressions. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Adds a recursion limit to the parser. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Avoids false positives in else clauses. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Marks the fix as unsafe when the first argument is a class attribute annotated as int. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Preserves f-string source verbatim in the fix. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Avoids strict behavior when future annotations are enabled. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Avoids strict behavior when future annotations are enabled. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
- Avoids strict behavior when future annotations are enabled. (0.15.14) — [release notes](https://github.com/astral-sh/ruff/releases/tag/0.15.14)
