mirror of https://github.com/astral-sh/ruff
264 lines
14 KiB
Markdown
264 lines
14 KiB
Markdown
# Changelog 0.13.x
|
||
|
||
## 0.13.0
|
||
|
||
Check out the [blog post](https://astral.sh/blog/ruff-v0.13.0) for a migration
|
||
guide and overview of the changes!
|
||
|
||
### Breaking changes
|
||
|
||
- **Several rules can now add `from __future__ import annotations` automatically**
|
||
|
||
`TC001`, `TC002`, `TC003`, `RUF013`, and `UP037` now add `from __future__ import annotations` as part of their fixes when the
|
||
`lint.future-annotations` setting is enabled. This allows the rules to move
|
||
more imports into `TYPE_CHECKING` blocks (`TC001`, `TC002`, and `TC003`),
|
||
use PEP 604 union syntax on Python versions before 3.10 (`RUF013`), and
|
||
unquote more annotations (`UP037`).
|
||
|
||
- **Full module paths are now used to verify first-party modules**
|
||
|
||
Ruff now checks that the full path to a module exists on disk before
|
||
categorizing it as a first-party import. This change makes first-party
|
||
import detection more accurate, helping to avoid false positives on local
|
||
directories with the same name as a third-party dependency, for example. See
|
||
the [FAQ
|
||
section](https://docs.astral.sh/ruff/faq/#how-does-ruff-determine-which-of-my-imports-are-first-party-third-party-etc) on import categorization for more details.
|
||
|
||
- **Deprecated rules must now be selected by exact rule code**
|
||
|
||
Ruff will no longer activate deprecated rules selected by their group name
|
||
or prefix. As noted below, the two remaining deprecated rules were also
|
||
removed in this release, so this won't affect any current rules, but it will
|
||
still affect any deprecations in the future.
|
||
|
||
- **The deprecated macOS configuration directory fallback has been removed**
|
||
|
||
Ruff will no longer look for a user-level configuration file at
|
||
`~/Library/Application Support/ruff/ruff.toml` on macOS. This feature was
|
||
deprecated in v0.5 in favor of using the [XDG
|
||
specification](https://specifications.freedesktop.org/basedir-spec/latest/)
|
||
(usually resolving to `~/.config/ruff/ruff.toml`), like on Linux. The
|
||
fallback and accompanying deprecation warning have now been removed.
|
||
|
||
### Removed Rules
|
||
|
||
The following rules have been removed:
|
||
|
||
- [`pandas-df-variable-name`](https://docs.astral.sh/ruff/rules/pandas-df-variable-name) (`PD901`)
|
||
- [`non-pep604-isinstance`](https://docs.astral.sh/ruff/rules/non-pep604-isinstance) (`UP038`)
|
||
|
||
### Stabilization
|
||
|
||
The following rules have been stabilized and are no longer in preview:
|
||
|
||
- [`airflow-dag-no-schedule-argument`](https://docs.astral.sh/ruff/rules/airflow-dag-no-schedule-argument)
|
||
(`AIR002`)
|
||
- [`airflow3-removal`](https://docs.astral.sh/ruff/rules/airflow3-removal) (`AIR301`)
|
||
- [`airflow3-moved-to-provider`](https://docs.astral.sh/ruff/rules/airflow3-moved-to-provider)
|
||
(`AIR302`)
|
||
- [`airflow3-suggested-update`](https://docs.astral.sh/ruff/rules/airflow3-suggested-update)
|
||
(`AIR311`)
|
||
- [`airflow3-suggested-to-move-to-provider`](https://docs.astral.sh/ruff/rules/airflow3-suggested-to-move-to-provider)
|
||
(`AIR312`)
|
||
- [`long-sleep-not-forever`](https://docs.astral.sh/ruff/rules/long-sleep-not-forever) (`ASYNC116`)
|
||
- [`f-string-number-format`](https://docs.astral.sh/ruff/rules/f-string-number-format) (`FURB116`)
|
||
- [`os-symlink`](https://docs.astral.sh/ruff/rules/os-symlink) (`PTH211`)
|
||
- [`generic-not-last-base-class`](https://docs.astral.sh/ruff/rules/generic-not-last-base-class)
|
||
(`PYI059`)
|
||
- [`redundant-none-literal`](https://docs.astral.sh/ruff/rules/redundant-none-literal) (`PYI061`)
|
||
- [`pytest-raises-ambiguous-pattern`](https://docs.astral.sh/ruff/rules/pytest-raises-ambiguous-pattern)
|
||
(`RUF043`)
|
||
- [`unused-unpacked-variable`](https://docs.astral.sh/ruff/rules/unused-unpacked-variable)
|
||
(`RUF059`)
|
||
- [`useless-class-metaclass-type`](https://docs.astral.sh/ruff/rules/useless-class-metaclass-type)
|
||
(`UP050`)
|
||
|
||
The following behaviors have been stabilized:
|
||
|
||
- [`assert-raises-exception`](https://docs.astral.sh/ruff/rules/assert-raises-exception) (`B017`)
|
||
now checks for direct calls to `unittest.TestCase.assert_raises` and `pytest.raises` instead of
|
||
only the context manager forms.
|
||
- [`missing-trailing-comma`](https://docs.astral.sh/ruff/rules/missing-trailing-comma) (`COM812`)
|
||
and [`prohibited-trailing-comma`](https://docs.astral.sh/ruff/rules/prohibited-trailing-comma)
|
||
(`COM819`) now check for trailing commas in PEP 695 type parameter lists.
|
||
- [`raw-string-in-exception`](https://docs.astral.sh/ruff/rules/raw-string-in-exception) (`EM101`)
|
||
now also checks for byte strings in exception messages.
|
||
- [`invalid-mock-access`](https://docs.astral.sh/ruff/rules/invalid-mock-access) (`PGH005`) now
|
||
checks for `AsyncMock` methods like `not_awaited` in addition to the synchronous variants.
|
||
- [`useless-import-alias`](https://docs.astral.sh/ruff/rules/useless-import-alias) (`PLC0414`) no
|
||
longer applies to `__init__.py` files, where it conflicted with one of the suggested fixes for
|
||
[`unused-import`](https://docs.astral.sh/ruff/rules/unused-import) (`F401`).
|
||
- [`bidirectional-unicode`](https://docs.astral.sh/ruff/rules/bidirectional-unicode) (`PLE2502`) now
|
||
also checks for U+061C (Arabic Letter Mark).
|
||
- The fix for
|
||
[`multiple-with-statements`](https://docs.astral.sh/ruff/rules/multiple-with-statements)
|
||
(`SIM117`) is now marked as always safe.
|
||
|
||
### Preview features
|
||
|
||
- \[`pyupgrade`\] Enable `UP043` in stub files ([#20027](https://github.com/astral-sh/ruff/pull/20027))
|
||
|
||
### Bug fixes
|
||
|
||
- \[`pyupgrade`\] Apply `UP008` only when the `__class__` cell exists ([#19424](https://github.com/astral-sh/ruff/pull/19424))
|
||
- \[`ruff`\] Fix empty f-string detection in `in-empty-collection` (`RUF060`) ([#20249](https://github.com/astral-sh/ruff/pull/20249))
|
||
|
||
### Server
|
||
|
||
- Add support for using uv as an alternative formatter backend ([#19665](https://github.com/astral-sh/ruff/pull/19665))
|
||
|
||
### Documentation
|
||
|
||
- \[`pep8-naming`\] Fix formatting of `__all__` (`N816`) ([#20301](https://github.com/astral-sh/ruff/pull/20301))
|
||
|
||
## 0.13.1
|
||
|
||
Released on 2025-09-18.
|
||
|
||
### Preview features
|
||
|
||
- \[`flake8-simplify`\] Detect unnecessary `None` default for additional key expression types (`SIM910`) ([#20343](https://github.com/astral-sh/ruff/pull/20343))
|
||
- \[`flake8-use-pathlib`\] Add fix for `PTH123` ([#20169](https://github.com/astral-sh/ruff/pull/20169))
|
||
- \[`flake8-use-pathlib`\] Fix `PTH101`, `PTH104`, `PTH105`, `PTH121` fixes ([#20143](https://github.com/astral-sh/ruff/pull/20143))
|
||
- \[`flake8-use-pathlib`\] Make `PTH111` fix unsafe because it can change behavior ([#20215](https://github.com/astral-sh/ruff/pull/20215))
|
||
- \[`pycodestyle`\] Fix `E301` to only trigger for functions immediately within a class ([#19768](https://github.com/astral-sh/ruff/pull/19768))
|
||
- \[`refurb`\] Mark `single-item-membership-test` fix as always unsafe (`FURB171`) ([#20279](https://github.com/astral-sh/ruff/pull/20279))
|
||
|
||
### Bug fixes
|
||
|
||
- Handle t-strings for token-based rules and suppression comments ([#20357](https://github.com/astral-sh/ruff/pull/20357))
|
||
- \[`flake8-bandit`\] Fix truthiness: dict-only `**` displays not truthy for `shell` (`S602`, `S604`, `S609`) ([#20177](https://github.com/astral-sh/ruff/pull/20177))
|
||
- \[`flake8-simplify`\] Fix diagnostic to show correct method name for `str.rsplit` calls (`SIM905`) ([#20459](https://github.com/astral-sh/ruff/pull/20459))
|
||
- \[`flynt`\] Use triple quotes for joined raw strings with newlines (`FLY002`) ([#20197](https://github.com/astral-sh/ruff/pull/20197))
|
||
- \[`pyupgrade`\] Fix false positive when class name is shadowed by local variable (`UP008`) ([#20427](https://github.com/astral-sh/ruff/pull/20427))
|
||
- \[`pyupgrade`\] Prevent infinite loop with `I002` and `UP026` ([#20327](https://github.com/astral-sh/ruff/pull/20327))
|
||
- \[`ruff`\] Recognize t-strings, generators, and lambdas in `invalid-index-type` (`RUF016`) ([#20213](https://github.com/astral-sh/ruff/pull/20213))
|
||
|
||
### Rule changes
|
||
|
||
- \[`RUF102`\] Respect rule redirects in invalid rule code detection ([#20245](https://github.com/astral-sh/ruff/pull/20245))
|
||
- \[`flake8-bugbear`\] Mark the fix for `unreliable-callable-check` as always unsafe (`B004`) ([#20318](https://github.com/astral-sh/ruff/pull/20318))
|
||
- \[`ruff`\] Allow dataclass attribute value instantiation from nested frozen dataclass (`RUF009`) ([#20352](https://github.com/astral-sh/ruff/pull/20352))
|
||
|
||
### CLI
|
||
|
||
- Add fixes to `output-format=sarif` ([#20300](https://github.com/astral-sh/ruff/pull/20300))
|
||
- Treat panics as fatal diagnostics, sort panics last ([#20258](https://github.com/astral-sh/ruff/pull/20258))
|
||
|
||
### Documentation
|
||
|
||
- \[`ruff`\] Add `analyze.string-imports-min-dots` to settings ([#20375](https://github.com/astral-sh/ruff/pull/20375))
|
||
- Update README.md with Albumentations new repository URL ([#20415](https://github.com/astral-sh/ruff/pull/20415))
|
||
|
||
### Other changes
|
||
|
||
- Bump MSRV to Rust 1.88 ([#20470](https://github.com/astral-sh/ruff/pull/20470))
|
||
- Enable inline noqa for multiline strings in playground ([#20442](https://github.com/astral-sh/ruff/pull/20442))
|
||
|
||
### Contributors
|
||
|
||
- [@chirizxc](https://github.com/chirizxc)
|
||
- [@danparizher](https://github.com/danparizher)
|
||
- [@IDrokin117](https://github.com/IDrokin117)
|
||
- [@amyreese](https://github.com/amyreese)
|
||
- [@AlexWaygood](https://github.com/AlexWaygood)
|
||
- [@dylwil3](https://github.com/dylwil3)
|
||
- [@njhearp](https://github.com/njhearp)
|
||
- [@woodruffw](https://github.com/woodruffw)
|
||
- [@dcreager](https://github.com/dcreager)
|
||
- [@TaKO8Ki](https://github.com/TaKO8Ki)
|
||
- [@BurntSushi](https://github.com/BurntSushi)
|
||
- [@salahelfarissi](https://github.com/salahelfarissi)
|
||
- [@MichaReiser](https://github.com/MichaReiser)
|
||
|
||
## 0.13.2
|
||
|
||
Released on 2025-09-25.
|
||
|
||
### Preview features
|
||
|
||
- \[`flake8-async`\] Implement `blocking-path-method` (`ASYNC240`) ([#20264](https://github.com/astral-sh/ruff/pull/20264))
|
||
- \[`flake8-bugbear`\] Implement `map-without-explicit-strict` (`B912`) ([#20429](https://github.com/astral-sh/ruff/pull/20429))
|
||
- \[`flake8-bultins`\] Detect class-scope builtin shadowing in decorators, default args, and attribute initializers (`A003`) ([#20178](https://github.com/astral-sh/ruff/pull/20178))
|
||
- \[`ruff`\] Implement `logging-eager-conversion` (`RUF065`) ([#19942](https://github.com/astral-sh/ruff/pull/19942))
|
||
- Include `.pyw` files by default when linting and formatting ([#20458](https://github.com/astral-sh/ruff/pull/20458))
|
||
|
||
### Bug fixes
|
||
|
||
- Deduplicate input paths ([#20105](https://github.com/astral-sh/ruff/pull/20105))
|
||
- \[`flake8-comprehensions`\] Preserve trailing commas for single-element lists (`C409`) ([#19571](https://github.com/astral-sh/ruff/pull/19571))
|
||
- \[`flake8-pyi`\] Avoid syntax error from conflict with `PIE790` (`PYI021`) ([#20010](https://github.com/astral-sh/ruff/pull/20010))
|
||
- \[`flake8-simplify`\] Correct fix for positive `maxsplit` without separator (`SIM905`) ([#20056](https://github.com/astral-sh/ruff/pull/20056))
|
||
- \[`pyupgrade`\] Fix `UP008` not to apply when `__class__` is a local variable ([#20497](https://github.com/astral-sh/ruff/pull/20497))
|
||
- \[`ruff`\] Fix `B004` to skip invalid `hasattr`/`getattr` calls ([#20486](https://github.com/astral-sh/ruff/pull/20486))
|
||
- \[`ruff`\] Replace `-nan` with `nan` when using the value to construct a `Decimal` (`FURB164` ) ([#20391](https://github.com/astral-sh/ruff/pull/20391))
|
||
|
||
### Documentation
|
||
|
||
- Add 'Finding ways to help' to CONTRIBUTING.md ([#20567](https://github.com/astral-sh/ruff/pull/20567))
|
||
- Update import path to `ruff-wasm-web` ([#20539](https://github.com/astral-sh/ruff/pull/20539))
|
||
- \[`flake8-bandit`\] Clarify the supported hashing functions (`S324`) ([#20534](https://github.com/astral-sh/ruff/pull/20534))
|
||
|
||
### Other changes
|
||
|
||
- \[`playground`\] Allow hover quick fixes to appear for overlapping diagnostics ([#20527](https://github.com/astral-sh/ruff/pull/20527))
|
||
- \[`playground`\] Fix non‑BMP code point handling in quick fixes and markers ([#20526](https://github.com/astral-sh/ruff/pull/20526))
|
||
|
||
### Contributors
|
||
|
||
- [@BurntSushi](https://github.com/BurntSushi)
|
||
- [@mtshiba](https://github.com/mtshiba)
|
||
- [@second-ed](https://github.com/second-ed)
|
||
- [@danparizher](https://github.com/danparizher)
|
||
- [@ShikChen](https://github.com/ShikChen)
|
||
- [@PieterCK](https://github.com/PieterCK)
|
||
- [@GDYendell](https://github.com/GDYendell)
|
||
- [@RazerM](https://github.com/RazerM)
|
||
- [@TaKO8Ki](https://github.com/TaKO8Ki)
|
||
- [@amyreese](https://github.com/amyreese)
|
||
- [@ntbre](https://github.com/ntBre)
|
||
- [@MichaReiser](https://github.com/MichaReiser)
|
||
|
||
## 0.13.3
|
||
|
||
Released on 2025-10-02.
|
||
|
||
### Preview features
|
||
|
||
- Display diffs for `ruff format --check` and add support for different output formats ([#20443](https://github.com/astral-sh/ruff/pull/20443))
|
||
- \[`pyflakes`\] Handle some common submodule import situations for `unused-import` (`F401`) ([#20200](https://github.com/astral-sh/ruff/pull/20200))
|
||
- \[`ruff`\] Do not flag `%r` + `repr()` combinations (`RUF065`) ([#20600](https://github.com/astral-sh/ruff/pull/20600))
|
||
|
||
### Bug fixes
|
||
|
||
- \[`cli`\] Add conflict between `--add-noqa` and `--diff` options ([#20642](https://github.com/astral-sh/ruff/pull/20642))
|
||
- \[`pylint`\] Exempt required imports from `PLR0402` ([#20381](https://github.com/astral-sh/ruff/pull/20381))
|
||
- \[`pylint`\] Fix missing `max-nested-blocks` in settings display ([#20574](https://github.com/astral-sh/ruff/pull/20574))
|
||
- \[`pyupgrade`\] Prevent infinite loop with `I002` and `UP026` ([#20634](https://github.com/astral-sh/ruff/pull/20634))
|
||
|
||
### Rule changes
|
||
|
||
- \[`flake8-simplify`\] Improve help message clarity (`SIM105`) ([#20548](https://github.com/astral-sh/ruff/pull/20548))
|
||
|
||
### Documentation
|
||
|
||
- Add the *The Basics* title back to CONTRIBUTING.md ([#20624](https://github.com/astral-sh/ruff/pull/20624))
|
||
- Fixed documentation for try_consider_else ([#20587](https://github.com/astral-sh/ruff/pull/20587))
|
||
- \[`isort`\] Clarify dependency between `order-by-type` and `case-sensitive` settings ([#20559](https://github.com/astral-sh/ruff/pull/20559))
|
||
- \[`pylint`\] Clarify fix safety to include left-hand hashability (`PLR6201`) ([#20518](https://github.com/astral-sh/ruff/pull/20518))
|
||
|
||
### Other changes
|
||
|
||
- \[`playground`\] Fix quick fixes for empty ranges in playground ([#20599](https://github.com/astral-sh/ruff/pull/20599))
|
||
|
||
### Contributors
|
||
|
||
- [@TaKO8Ki](https://github.com/TaKO8Ki)
|
||
- [@ntBre](https://github.com/ntBre)
|
||
- [@dylwil3](https://github.com/dylwil3)
|
||
- [@MichaReiser](https://github.com/MichaReiser)
|
||
- [@danparizher](https://github.com/danparizher)
|
||
- [@LilMonk](https://github.com/LilMonk)
|
||
- [@mgiovani](https://github.com/mgiovani)
|
||
- [@IDrokin117](https://github.com/IDrokin117)
|