Skip to content

Commit 87f0feb

Browse files
authored
Bump 0.12.0 (#18724)
- [x] Updated changelog - [x] Updated breaking changes
1 parent 685eac1 commit 87f0feb

File tree

11 files changed

+203
-20
lines changed

11 files changed

+203
-20
lines changed

BREAKING_CHANGES.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,39 @@
11
# Breaking Changes
22

3+
## 0.12.0
4+
5+
- **Detection of more syntax errors**
6+
7+
Ruff now detects version-related syntax errors, such as the use of the `match`
8+
statement on Python versions before 3.10, and syntax errors emitted by
9+
CPython's compiler, such as irrefutable `match` patterns before the final
10+
`case` arm.
11+
12+
- **New default Python version handling for syntax errors**
13+
14+
Ruff will default to the _latest_ supported Python version (3.13) when
15+
checking for the version-related syntax errors mentioned above to prevent
16+
false positives in projects without a Python version configured. The default
17+
in all other cases, like applying lint rules, is unchanged and remains at the
18+
minimum supported Python version (3.9).
19+
20+
- **Updated f-string formatting**
21+
22+
Ruff now formats multi-line f-strings with format specifiers to avoid adding a
23+
line break after the format specifier. This addresses a change to the Python
24+
grammar in version 3.13.4 that made such a line break a syntax error.
25+
26+
- **`rust-toolchain.toml` is no longer included in source distributions**
27+
28+
The `rust-toolchain.toml` is used to specify a higher Rust version than Ruff's
29+
minimum supported Rust version (MSRV) for development and building release
30+
artifacts. However, when present in source distributions, it would also cause
31+
downstream package maintainers to pull in the same Rust toolchain, even if
32+
their available toolchain was MSRV-compatible.
33+
34+
- **[`suspicious-xmle-tree-usage`](https://docs.astral.sh/ruff/rules/suspicious-xmle-tree-usage/)
35+
(`S320`) has been removed**
36+
337
## 0.11.0
438

539
This is a follow-up to release 0.10.0. Because of a mistake in the release process, the `requires-python` inference changes were not included in that release. Ruff 0.11.0 now includes this change as well as the stabilization of the preview behavior for `PGH004`.

CHANGELOG.md

Lines changed: 153 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,145 @@
11
# Changelog
22

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+
3143
## 0.11.13
4144

5145
### Preview features
@@ -391,7 +531,7 @@ See also, the "Remapped rules" section which may result in disabled rules.
391531

392532
- **More robust noqa parsing** ([#16483](https://github.com/astral-sh/ruff/pull/16483))
393533

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.
395535

396536
- **Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment** ([#14005](https://github.com/astral-sh/ruff/pull/14005))
397537

@@ -1803,7 +1943,7 @@ The following fixes have been stabilized:
18031943

18041944
## 0.5.6
18051945

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_.
18071947
You can opt-out of this behavior by adding `*.ipynb` to the `extend-exclude` setting.
18081948

18091949
```toml
@@ -2556,7 +2696,7 @@ To setup `ruff server` with your editor, refer to the [README.md](https://github
25562696

25572697
### Server
25582698

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._
25602700

25612701
- Enable ruff-specific source actions ([#10916](https://github.com/astral-sh/ruff/pull/10916))
25622702
- 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/).
39634103
- \[`refurb`\] Add `single-item-membership-test` (`FURB171`) ([#7815](https://github.com/astral-sh/ruff/pull/7815))
39644104
- \[`pylint`\] Add `and-or-ternary` (`R1706`) ([#7811](https://github.com/astral-sh/ruff/pull/7811))
39654105

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/)._
39674107

39684108
### Configuration
39694109

@@ -4038,3 +4178,12 @@ Read Ruff's new [versioning policy](https://docs.astral.sh/ruff/versioning/).
40384178
### Playground
40394179

40404180
- 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

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ curl -LsSf https://astral.sh/ruff/install.sh | sh
148148
powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"
149149

150150
# For a specific version.
151-
curl -LsSf https://astral.sh/ruff/0.11.13/install.sh | sh
152-
powershell -c "irm https://astral.sh/ruff/0.11.13/install.ps1 | iex"
151+
curl -LsSf https://astral.sh/ruff/0.12.0/install.sh | sh
152+
powershell -c "irm https://astral.sh/ruff/0.12.0/install.ps1 | iex"
153153
```
154154

155155
You can also install Ruff via [Homebrew](https://formulae.brew.sh/formula/ruff), [Conda](https://anaconda.org/conda-forge/ruff),
@@ -182,7 +182,7 @@ Ruff can also be used as a [pre-commit](https://pre-commit.com/) hook via [`ruff
182182
```yaml
183183
- repo: https://github.com/astral-sh/ruff-pre-commit
184184
# Ruff version.
185-
rev: v0.11.13
185+
rev: v0.12.0
186186
hooks:
187187
# Run the linter.
188188
- id: ruff

crates/ruff/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ruff"
3-
version = "0.11.13"
3+
version = "0.12.0"
44
publish = true
55
authors = { workspace = true }
66
edition = { workspace = true }

crates/ruff_linter/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ruff_linter"
3-
version = "0.11.13"
3+
version = "0.12.0"
44
publish = false
55
authors = { workspace = true }
66
edition = { workspace = true }

crates/ruff_wasm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ruff_wasm"
3-
version = "0.11.13"
3+
version = "0.12.0"
44
publish = false
55
authors = { workspace = true }
66
edition = { workspace = true }

docs/integrations.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ You can add the following configuration to `.gitlab-ci.yml` to run a `ruff forma
8080
stage: build
8181
interruptible: true
8282
image:
83-
name: ghcr.io/astral-sh/ruff:0.11.13-alpine
83+
name: ghcr.io/astral-sh/ruff:0.12.0-alpine
8484
before_script:
8585
- cd $CI_PROJECT_DIR
8686
- ruff --version
@@ -106,7 +106,7 @@ Ruff can be used as a [pre-commit](https://pre-commit.com) hook via [`ruff-pre-c
106106
```yaml
107107
- repo: https://github.com/astral-sh/ruff-pre-commit
108108
# Ruff version.
109-
rev: v0.11.13
109+
rev: v0.12.0
110110
hooks:
111111
# Run the linter.
112112
- id: ruff
@@ -119,7 +119,7 @@ To enable lint fixes, add the `--fix` argument to the lint hook:
119119
```yaml
120120
- repo: https://github.com/astral-sh/ruff-pre-commit
121121
# Ruff version.
122-
rev: v0.11.13
122+
rev: v0.12.0
123123
hooks:
124124
# Run the linter.
125125
- id: ruff
@@ -133,7 +133,7 @@ To avoid running on Jupyter Notebooks, remove `jupyter` from the list of allowed
133133
```yaml
134134
- repo: https://github.com/astral-sh/ruff-pre-commit
135135
# Ruff version.
136-
rev: v0.11.13
136+
rev: v0.12.0
137137
hooks:
138138
# Run the linter.
139139
- id: ruff

docs/tutorial.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ This tutorial has focused on Ruff's command-line interface, but Ruff can also be
369369
```yaml
370370
- repo: https://github.com/astral-sh/ruff-pre-commit
371371
# Ruff version.
372-
rev: v0.11.13
372+
rev: v0.12.0
373373
hooks:
374374
# Run the linter.
375375
- id: ruff

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
44

55
[project]
66
name = "ruff"
7-
version = "0.11.13"
7+
version = "0.12.0"
88
description = "An extremely fast Python linter and code formatter, written in Rust."
99
authors = [{ name = "Astral Software Inc.", email = "[email protected]" }]
1010
readme = "README.md"

0 commit comments

Comments
 (0)