|
1 | 1 | # Changelog
|
2 | 2 |
|
| 3 | +## 0.12.0 |
| 4 | + |
| 5 | +Check out the [blog post](https://astral.sh/blog/ruff-v0.12.0) for a migration |
| 6 | +guide and overview of the changes! |
| 7 | + |
| 8 | +### Breaking changes |
| 9 | + |
| 10 | +- **Detection of more syntax errors** |
| 11 | + |
| 12 | + Ruff now detects version-related syntax errors, such as the use of the `match` |
| 13 | + statement on Python versions before 3.10, and syntax errors emitted by |
| 14 | + CPython's compiler, such as irrefutable `match` patterns before the final |
| 15 | + `case` arm. |
| 16 | + |
| 17 | +- **New default Python version handling for syntax errors** |
| 18 | + |
| 19 | + Ruff will default to the _latest_ supported Python version (3.13) when |
| 20 | + checking for the version-related syntax errors mentioned above to prevent |
| 21 | + false positives in projects without a Python version configured. The default |
| 22 | + in all other cases, like applying lint rules, is unchanged and remains at the |
| 23 | + minimum supported Python version (3.9). |
| 24 | + |
| 25 | +- **Updated f-string formatting** |
| 26 | + |
| 27 | + Ruff now formats multi-line f-strings with format specifiers to avoid adding a |
| 28 | + line break after the format specifier. This addresses a change to the Python |
| 29 | + grammar in version 3.13.4 that made such a line break a syntax error. |
| 30 | + |
| 31 | +- **`rust-toolchain.toml` is no longer included in source distributions** |
| 32 | + |
| 33 | + The `rust-toolchain.toml` is used to specify a higher Rust version than Ruff's |
| 34 | + minimum supported Rust version (MSRV) for development and building release |
| 35 | + artifacts. However, when present in source distributions, it would also cause |
| 36 | + downstream package maintainers to pull in the same Rust toolchain, even if |
| 37 | + their available toolchain was MSRV-compatible. |
| 38 | + |
| 39 | +### Removed Rules |
| 40 | + |
| 41 | +The following rules have been removed: |
| 42 | + |
| 43 | +- [`suspicious-xmle-tree-usage`](https://docs.astral.sh/ruff/rules/suspicious-xmle-tree-usage/) |
| 44 | + (`S320`) |
| 45 | + |
| 46 | +### Deprecated Rules |
| 47 | + |
| 48 | +The following rules have been deprecated: |
| 49 | + |
| 50 | +- [`pandas-df-variable-name`](https://docs.astral.sh/ruff/rules/pandas-df-variable-name/) |
| 51 | + |
| 52 | +### Stabilization |
| 53 | + |
| 54 | +The following rules have been stabilized and are no longer in preview: |
| 55 | + |
| 56 | +- [`for-loop-writes`](https://docs.astral.sh/ruff/rules/for-loop-writes) (`FURB122`) |
| 57 | +- [`check-and-remove-from-set`](https://docs.astral.sh/ruff/rules/check-and-remove-from-set) (`FURB132`) |
| 58 | +- [`verbose-decimal-constructor`](https://docs.astral.sh/ruff/rules/verbose-decimal-constructor) (`FURB157`) |
| 59 | +- [`fromisoformat-replace-z`](https://docs.astral.sh/ruff/rules/fromisoformat-replace-z) (`FURB162`) |
| 60 | +- [`int-on-sliced-str`](https://docs.astral.sh/ruff/rules/int-on-sliced-str) (`FURB166`) |
| 61 | +- [`exc-info-outside-except-handler`](https://docs.astral.sh/ruff/rules/exc-info-outside-except-handler) (`LOG014`) |
| 62 | +- [`import-outside-top-level`](https://docs.astral.sh/ruff/rules/import-outside-top-level) (`PLC0415`) |
| 63 | +- [`unnecessary-dict-index-lookup`](https://docs.astral.sh/ruff/rules/unnecessary-dict-index-lookup) (`PLR1733`) |
| 64 | +- [`nan-comparison`](https://docs.astral.sh/ruff/rules/nan-comparison) (`PLW0177`) |
| 65 | +- [`eq-without-hash`](https://docs.astral.sh/ruff/rules/eq-without-hash) (`PLW1641`) |
| 66 | +- [`pytest-parameter-with-default-argument`](https://docs.astral.sh/ruff/rules/pytest-parameter-with-default-argument) (`PT028`) |
| 67 | +- [`pytest-warns-too-broad`](https://docs.astral.sh/ruff/rules/pytest-warns-too-broad) (`PT030`) |
| 68 | +- [`pytest-warns-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-warns-with-multiple-statements) (`PT031`) |
| 69 | +- [`invalid-formatter-suppression-comment`](https://docs.astral.sh/ruff/rules/invalid-formatter-suppression-comment) (`RUF028`) |
| 70 | +- [`dataclass-enum`](https://docs.astral.sh/ruff/rules/dataclass-enum) (`RUF049`) |
| 71 | +- [`class-with-mixed-type-vars`](https://docs.astral.sh/ruff/rules/class-with-mixed-type-vars) (`RUF053`) |
| 72 | +- [`unnecessary-round`](https://docs.astral.sh/ruff/rules/unnecessary-round) (`RUF057`) |
| 73 | +- [`starmap-zip`](https://docs.astral.sh/ruff/rules/starmap-zip) (`RUF058`) |
| 74 | +- [`non-pep604-annotation-optional`](https://docs.astral.sh/ruff/rules/non-pep604-annotation-optional) (`UP045`) |
| 75 | +- [`non-pep695-generic-class`](https://docs.astral.sh/ruff/rules/non-pep695-generic-class) (`UP046`) |
| 76 | +- [`non-pep695-generic-function`](https://docs.astral.sh/ruff/rules/non-pep695-generic-function) (`UP047`) |
| 77 | +- [`private-type-parameter`](https://docs.astral.sh/ruff/rules/private-type-parameter) (`UP049`) |
| 78 | + |
| 79 | +The following behaviors have been stabilized: |
| 80 | + |
| 81 | +- [`collection-literal-concatenation`] (`RUF005`) now recognizes slices, in |
| 82 | + addition to list literals and variables. |
| 83 | +- The fix for [`readlines-in-for`] (`FURB129`) is now marked as always safe. |
| 84 | +- [`if-else-block-instead-of-if-exp`] (`SIM108`) will now further simplify |
| 85 | + expressions to use `or` instead of an `if` expression, where possible. |
| 86 | +- [`unused-noqa`] (`RUF100`) now checks for file-level `noqa` comments as well |
| 87 | + as inline comments. |
| 88 | +- [`subprocess-without-shell-equals-true`] (`S603`) now accepts literal strings, |
| 89 | + as well as lists and tuples of literal strings, as trusted input. |
| 90 | +- [`boolean-type-hint-positional-argument`] (`FBT001`) now applies to types that |
| 91 | + include `bool`, like `bool | int` or `typing.Optional[bool]`, in addition to |
| 92 | + plain `bool` annotations. |
| 93 | +- [`non-pep604-annotation-union`] (`UP007`) has now been split into two rules. |
| 94 | + `UP007` now applies only to `typing.Union`, while |
| 95 | + [`non-pep604-annotation-optional`] (`UP045`) checks for use of |
| 96 | + `typing.Optional`. `UP045` has also been stabilized in this release, but you |
| 97 | + may need to update existing `include`, `ignore`, or `noqa` settings to |
| 98 | + accommodate this change. |
| 99 | + |
| 100 | +### Preview features |
| 101 | + |
| 102 | +- \[`ruff`\] Check for non-context-manager use of `pytest.raises`, `pytest.warns`, and `pytest.deprecated_call` (`RUF061`) ([#17368](https://github.com/astral-sh/ruff/pull/17368)) |
| 103 | +- [syntax-errors] Raise unsupported syntax error for template strings prior to Python 3.14 ([#18664](https://github.com/astral-sh/ruff/pull/18664)) |
| 104 | + |
| 105 | +### Bug fixes |
| 106 | + |
| 107 | +- Add syntax error when conversion flag does not immediately follow exclamation mark ([#18706](https://github.com/astral-sh/ruff/pull/18706)) |
| 108 | +- Add trailing space around `readlines` ([#18542](https://github.com/astral-sh/ruff/pull/18542)) |
| 109 | +- Fix `\r` and `\r\n` handling in t- and f-string debug texts ([#18673](https://github.com/astral-sh/ruff/pull/18673)) |
| 110 | +- Hug closing `}` when f-string expression has a format specifier ([#18704](https://github.com/astral-sh/ruff/pull/18704)) |
| 111 | +- \[`flake8-pyi`\] Avoid syntax error in the case of starred and keyword arguments (`PYI059`) ([#18611](https://github.com/astral-sh/ruff/pull/18611)) |
| 112 | +- \[`flake8-return`\] Fix `RET504` autofix generating a syntax error ([#18428](https://github.com/astral-sh/ruff/pull/18428)) |
| 113 | +- \[`pep8-naming`\] Suppress fix for `N804` and `N805` if the recommended name is already used ([#18472](https://github.com/astral-sh/ruff/pull/18472)) |
| 114 | +- \[`pycodestyle`\] Avoid causing a syntax error in expressions spanning multiple lines (`E731`) ([#18479](https://github.com/astral-sh/ruff/pull/18479)) |
| 115 | +- \[`pyupgrade`\] Suppress `UP008` if `super` is shadowed ([#18688](https://github.com/astral-sh/ruff/pull/18688)) |
| 116 | +- \[`refurb`\] Parenthesize lambda and ternary expressions (`FURB122`, `FURB142`) ([#18592](https://github.com/astral-sh/ruff/pull/18592)) |
| 117 | +- \[`ruff`\] Handle extra arguments to `deque` (`RUF037`) ([#18614](https://github.com/astral-sh/ruff/pull/18614)) |
| 118 | +- \[`ruff`\] Preserve parentheses around `deque` in fix for `unnecessary-empty-iterable-within-deque-call` (`RUF037`) ([#18598](https://github.com/astral-sh/ruff/pull/18598)) |
| 119 | +- \[`ruff`\] Validate arguments before offering a fix (`RUF056`) ([#18631](https://github.com/astral-sh/ruff/pull/18631)) |
| 120 | +- \[`ruff`\] Skip fix for `RUF059` if dummy name is already bound ([#18509](https://github.com/astral-sh/ruff/pull/18509)) |
| 121 | +- \[`pylint`\] Fix `PLW0128` to check assignment targets in square brackets and after asterisks ([#18665](https://github.com/astral-sh/ruff/pull/18665)) |
| 122 | + |
| 123 | +### Rule changes |
| 124 | + |
| 125 | +- Fix false positive on mutations in `return` statements (`B909`) ([#18408](https://github.com/astral-sh/ruff/pull/18408)) |
| 126 | +- Treat `ty:` comments as pragma comments ([#18532](https://github.com/astral-sh/ruff/pull/18532)) |
| 127 | +- \[`flake8-pyi`\] Apply `custom-typevar-for-self` to string annotations (`PYI019`) ([#18311](https://github.com/astral-sh/ruff/pull/18311)) |
| 128 | +- \[`pyupgrade`\] Don't offer a fix for `Optional[None]` (`UP007`, `UP045)` ([#18545](https://github.com/astral-sh/ruff/pull/18545)) |
| 129 | +- \[`pyupgrade`\] Fix `super(__class__, self)` detection (`UP008`) ([#18478](https://github.com/astral-sh/ruff/pull/18478)) |
| 130 | +- \[`refurb`\] Make the fix for `FURB163` unsafe for `log2`, `log10`, `*args`, and deleted comments ([#18645](https://github.com/astral-sh/ruff/pull/18645)) |
| 131 | + |
| 132 | +### Server |
| 133 | + |
| 134 | +- Support cancellation requests ([#18627](https://github.com/astral-sh/ruff/pull/18627)) |
| 135 | + |
| 136 | +### Documentation |
| 137 | + |
| 138 | +- Drop confusing second `*` from glob pattern example for `per-file-target-version` ([#18709](https://github.com/astral-sh/ruff/pull/18709)) |
| 139 | +- Update Neovim configuration examples ([#18491](https://github.com/astral-sh/ruff/pull/18491)) |
| 140 | +- \[`pylint`\] De-emphasize `__hash__ = Parent.__hash__` (`PLW1641`) ([#18613](https://github.com/astral-sh/ruff/pull/18613)) |
| 141 | +- \[`refurb`\] Add a note about float literal handling (`FURB157`) ([#18615](https://github.com/astral-sh/ruff/pull/18615)) |
| 142 | + |
3 | 143 | ## 0.11.13
|
4 | 144 |
|
5 | 145 | ### Preview features
|
@@ -391,7 +531,7 @@ See also, the "Remapped rules" section which may result in disabled rules.
|
391 | 531 |
|
392 | 532 | - **More robust noqa parsing** ([#16483](https://github.com/astral-sh/ruff/pull/16483))
|
393 | 533 |
|
394 |
| - 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*](https://docs.astral.sh/ruff/linter/#error-suppression) for the full specification. |
| 534 | + 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_](https://docs.astral.sh/ruff/linter/#error-suppression) for the full specification. |
395 | 535 |
|
396 | 536 | - **Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment** ([#14005](https://github.com/astral-sh/ruff/pull/14005))
|
397 | 537 |
|
@@ -1803,7 +1943,7 @@ The following fixes have been stabilized:
|
1803 | 1943 |
|
1804 | 1944 | ## 0.5.6
|
1805 | 1945 |
|
1806 |
| -Ruff 0.5.6 automatically enables linting and formatting of notebooks in *preview mode*. |
| 1946 | +Ruff 0.5.6 automatically enables linting and formatting of notebooks in _preview mode_. |
1807 | 1947 | You can opt-out of this behavior by adding `*.ipynb` to the `extend-exclude` setting.
|
1808 | 1948 |
|
1809 | 1949 | ```toml
|
@@ -2556,7 +2696,7 @@ To setup `ruff server` with your editor, refer to the [README.md](https://github
|
2556 | 2696 |
|
2557 | 2697 | ### Server
|
2558 | 2698 |
|
2559 |
| -*This section is devoted to updates for our new language server, written in Rust.* |
| 2699 | +_This section is devoted to updates for our new language server, written in Rust._ |
2560 | 2700 |
|
2561 | 2701 | - Enable ruff-specific source actions ([#10916](https://github.com/astral-sh/ruff/pull/10916))
|
2562 | 2702 | - Refreshes diagnostics for open files when file configuration is changed ([#10988](https://github.com/astral-sh/ruff/pull/10988))
|
@@ -3963,7 +4103,7 @@ Read Ruff's new [versioning policy](https://docs.astral.sh/ruff/versioning/).
|
3963 | 4103 | - \[`refurb`\] Add `single-item-membership-test` (`FURB171`) ([#7815](https://github.com/astral-sh/ruff/pull/7815))
|
3964 | 4104 | - \[`pylint`\] Add `and-or-ternary` (`R1706`) ([#7811](https://github.com/astral-sh/ruff/pull/7811))
|
3965 | 4105 |
|
3966 |
| -*New rules are added in [preview](https://docs.astral.sh/ruff/preview/).* |
| 4106 | +_New rules are added in [preview](https://docs.astral.sh/ruff/preview/)._ |
3967 | 4107 |
|
3968 | 4108 | ### Configuration
|
3969 | 4109 |
|
@@ -4038,3 +4178,12 @@ Read Ruff's new [versioning policy](https://docs.astral.sh/ruff/versioning/).
|
4038 | 4178 | ### Playground
|
4039 | 4179 |
|
4040 | 4180 | - Fix playground `Quick Fix` action ([#7824](https://github.com/astral-sh/ruff/pull/7824))
|
| 4181 | + |
| 4182 | +[`boolean-type-hint-positional-argument`]: https://docs.astral.sh/ruff/rules/boolean-type-hint-positional-argument |
| 4183 | +[`collection-literal-concatenation`]: https://docs.astral.sh/ruff/rules/collection-literal-concatenation |
| 4184 | +[`if-else-block-instead-of-if-exp`]: https://docs.astral.sh/ruff/rules/if-else-block-instead-of-if-exp |
| 4185 | +[`non-pep604-annotation-optional`]: https://docs.astral.sh/ruff/rules/non-pep604-annotation-optional |
| 4186 | +[`non-pep604-annotation-union`]: https://docs.astral.sh/ruff/rules/non-pep604-annotation-union |
| 4187 | +[`readlines-in-for`]: https://docs.astral.sh/ruff/rules/readlines-in-for |
| 4188 | +[`subprocess-without-shell-equals-true`]: https://docs.astral.sh/ruff/rules/subprocess-without-shell-equals-true |
| 4189 | +[`unused-noqa`]: https://docs.astral.sh/ruff/rules/unused-noqa |
0 commit comments