Skip to content

Commit 27e9d1f

Browse files
MichaReiserdylwil3ntBre
authored
Ruff v0.10 Release (#16708)
Co-authored-by: dylwil3 <[email protected]> Co-authored-by: Brent Westbrook <[email protected]>
1 parent acf35c5 commit 27e9d1f

File tree

11 files changed

+177
-19
lines changed

11 files changed

+177
-19
lines changed

BREAKING_CHANGES.md

+41
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,46 @@
11
# Breaking Changes
22

3+
## 0.10.0
4+
5+
- **Changes to how the Python version is inferred when a `target-version` is not specified** ([#16319](https://github.com/astral-sh/ruff/pull/16319))
6+
7+
In previous versions of Ruff, you could specify your Python version with:
8+
9+
- The `target-version` option in a `ruff.toml` file or the `[tool.ruff]` section of a pyproject.toml file.
10+
- The `project.requires-python` field in a `pyproject.toml` file with a `[tool.ruff]` section.
11+
12+
These options worked well in most cases, and are still recommended for fine control of the Python version. However, because of the way Ruff discovers config files, `pyproject.toml` files without a `[tool.ruff]` section would be ignored, including the `requires-python` setting. Ruff would then use the default Python version (3.9 as of this writing) instead, which is surprising when you've attempted to request another version.
13+
14+
In v0.10, config discovery has been updated to address this issue:
15+
16+
- If Ruff finds a `ruff.toml` file without a `target-version`, it will check
17+
for a `pyproject.toml` file in the same directory and respect its
18+
`requires-python` version, even if it does not contain a `[tool.ruff]`
19+
section.
20+
- If Ruff finds a user-level configuration, the `requires-python` field of the closest `pyproject.toml` in a parent directory will take precedence.
21+
- If there is no config file (`ruff.toml`or `pyproject.toml` with a
22+
`[tool.ruff]` section) in the directory of the file being checked, Ruff will
23+
search for the closest `pyproject.toml` in the parent directories and use its
24+
`requires-python` setting.
25+
26+
- **Updated `TYPE_CHECKING` behavior** ([#16669](https://github.com/astral-sh/ruff/pull/16669))
27+
28+
Previously, Ruff only recognized typechecking blocks that tested the `typing.TYPE_CHECKING` symbol. Now, Ruff recognizes any local variable named `TYPE_CHECKING`. This release also removes support for the legacy `if 0:` and `if False:` typechecking checks. Use a local `TYPE_CHECKING` variable instead.
29+
30+
- **More robust noqa parsing** ([#16483](https://github.com/astral-sh/ruff/pull/16483))
31+
32+
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.
33+
34+
- **Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment** ([#14005](https://github.com/astral-sh/ruff/pull/14005))
35+
36+
This change fixes a bug in the formatter where it introduced unnecessary parentheses around with statements with a single context manager and a trailing comment. This change may result in a change in formatting for some users.
37+
38+
- **Bump alpine default tag to 3.21 for derived Docker images** ([#16456](https://github.com/astral-sh/ruff/pull/16456))
39+
40+
Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Now the ruff:alpine image will use 3.21 instead of 3.20 and ruff:alpine3.20 will no longer be updated.
41+
42+
- **\[`unsafe-markup-use`\]: `RUF035` has been recoded to `S704`** ([#15957](https://github.com/astral-sh/ruff/pull/15957))
43+
344
## 0.9.0
445

546
Ruff now formats your code according to the 2025 style guide. As a result, your code might now get formatted differently. See the [changelog](./CHANGELOG.md#090) for a detailed list of changes.

CHANGELOG.md

+120-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,122 @@
11
# Changelog
22

3+
## 0.10.0
4+
5+
Check out the [blog post](https://astral.sh/blog/ruff-v0.10.0) for a migration guide and overview of the changes!
6+
7+
### Breaking changes
8+
9+
See also, the "Remapped rules" section which may result in disabled rules.
10+
11+
- **Changes to how the Python version is inferred when a `target-version` is not specified** ([#16319](https://github.com/astral-sh/ruff/pull/16319))
12+
13+
In previous versions of Ruff, you could specify your Python version with:
14+
15+
- The `target-version` option in a `ruff.toml` file or the `[tool.ruff]` section of a pyproject.toml file.
16+
- The `project.requires-python` field in a `pyproject.toml` file with a `[tool.ruff]` section.
17+
18+
These options worked well in most cases, and are still recommended for fine control of the Python version. However, because of the way Ruff discovers config files, `pyproject.toml` files without a `[tool.ruff]` section would be ignored, including the `requires-python` setting. Ruff would then use the default Python version (3.9 as of this writing) instead, which is surprising when you've attempted to request another version.
19+
20+
In v0.10, config discovery has been updated to address this issue:
21+
22+
- If Ruff finds a `ruff.toml` file without a `target-version`, it will check
23+
for a `pyproject.toml` file in the same directory and respect its
24+
`requires-python` version, even if it does not contain a `[tool.ruff]`
25+
section.
26+
- If Ruff finds a user-level configuration, the `requires-python` field of the closest `pyproject.toml` in a parent directory will take precedence.
27+
- If there is no config file (`ruff.toml`or `pyproject.toml` with a
28+
`[tool.ruff]` section) in the directory of the file being checked, Ruff will
29+
search for the closest `pyproject.toml` in the parent directories and use its
30+
`requires-python` setting.
31+
32+
- **Updated `TYPE_CHECKING` behavior** ([#16669](https://github.com/astral-sh/ruff/pull/16669))
33+
34+
Previously, Ruff only recognized typechecking blocks that tested the `typing.TYPE_CHECKING` symbol. Now, Ruff recognizes any local variable named `TYPE_CHECKING`. This release also removes support for the legacy `if 0:` and `if False:` typechecking checks. Use a local `TYPE_CHECKING` variable instead.
35+
36+
- **More robust noqa parsing** ([#16483](https://github.com/astral-sh/ruff/pull/16483))
37+
38+
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.
39+
40+
- **Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment** ([#14005](https://github.com/astral-sh/ruff/pull/14005))
41+
42+
This change fixes a bug in the formatter where it introduced unnecessary parentheses around with statements with a single context manager and a trailing comment. This change may result in a change in formatting for some users.
43+
44+
- **Bump alpine default tag to 3.21 for derived Docker images** ([#16456](https://github.com/astral-sh/ruff/pull/16456))
45+
46+
Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Now the ruff:alpine image will use 3.21 instead of 3.20 and ruff:alpine3.20 will no longer be updated.
47+
48+
### Deprecated Rules
49+
50+
The following rules have been deprecated:
51+
52+
- [`non-pep604-isinstance`](https://docs.astral.sh/ruff/rules/non-pep604-isinstance/) (`UP038`)
53+
- [`suspicious-xmle-tree-usage`](https://docs.astral.sh/ruff/rules/suspicious-xmle-tree-usage/) (`S320`)
54+
55+
### Remapped rules
56+
57+
The following rules have been remapped to new rule codes:
58+
59+
- \[`unsafe-markup-use`\]: `RUF035` to `S704`
60+
61+
### Stabilization
62+
63+
The following rules have been stabilized and are no longer in preview:
64+
65+
- [`batched-without-explicit-strict`](https://docs.astral.sh/ruff/rules/batched-without-explicit-strict) (`B911`)
66+
- [`unnecessary-dict-comprehension-for-iterable`](https://docs.astral.sh/ruff/rules/unnecessary-dict-comprehension-for-iterable) (`C420`)
67+
- [`datetime-min-max`](https://docs.astral.sh/ruff/rules/datetime-min-max) (`DTZ901`)
68+
- [`fast-api-unused-path-parameter`](https://docs.astral.sh/ruff/rules/fast-api-unused-path-parameter) (`FAST003`)
69+
- [`root-logger-call`](https://docs.astral.sh/ruff/rules/root-logger-call) (`LOG015`)
70+
- [`len-test`](https://docs.astral.sh/ruff/rules/len-test) (`PLC1802`)
71+
- [`shallow-copy-environ`](https://docs.astral.sh/ruff/rules/shallow-copy-environ) (`PLW1507`)
72+
- [`os-listdir`](https://docs.astral.sh/ruff/rules/os-listdir) (`PTH208`)
73+
- [`invalid-pathlib-with-suffix`](https://docs.astral.sh/ruff/rules/invalid-pathlib-with-suffix) (`PTH210`)
74+
- [`invalid-assert-message-literal-argument`](https://docs.astral.sh/ruff/rules/invalid-assert-message-literal-argument) (`RUF040`)
75+
- [`unnecessary-nested-literal`](https://docs.astral.sh/ruff/rules/unnecessary-nested-literal) (`RUF041`)
76+
- [`unnecessary-cast-to-int`](https://docs.astral.sh/ruff/rules/unnecessary-cast-to-int) (`RUF046`)
77+
- [`map-int-version-parsing`](https://docs.astral.sh/ruff/rules/map-int-version-parsing) (`RUF048`)
78+
- [`if-key-in-dict-del`](https://docs.astral.sh/ruff/rules/if-key-in-dict-del) (`RUF051`)
79+
- [`unsafe-markup-use`](https://docs.astral.sh/ruff/rules/unsafe-markup-use) (`S704`). This rule has also been renamed from `RUF035`.
80+
- [`split-static-string`](https://docs.astral.sh/ruff/rules/split-static-string) (`SIM905`)
81+
- [`runtime-cast-value`](https://docs.astral.sh/ruff/rules/runtime-cast-value) (`TC006`)
82+
- [`unquoted-type-alias`](https://docs.astral.sh/ruff/rules/unquoted-type-alias) (`TC007`)
83+
- [`non-pep646-unpack`](https://docs.astral.sh/ruff/rules/non-pep646-unpack) (`UP044`)
84+
85+
The following behaviors have been stabilized:
86+
87+
- [`bad-staticmethod-argument`](https://docs.astral.sh/ruff/rules/bad-staticmethod-argument/) (`PLW0211`) [`invalid-first-argument-name-for-class-method`](https://docs.astral.sh/ruff/rules/invalid-first-argument-name-for-class-method/) (`N804`): `__new__` methods are now no longer flagged by `invalid-first-argument-name-for-class-method` (`N804`) but instead by `bad-staticmethod-argument` (`PLW0211`)
88+
- [`bad-str-strip-call`](https://docs.astral.sh/ruff/rules/bad-str-strip-call/) (`PLE1310`): The rule now applies to objects which are known to have type `str` or `bytes`.
89+
- [`blanket-noqa`](https://docs.astral.sh/ruff/rules/blanket-noqa/) (`PGH004`): Also detect blanked file-level noqa comments (and not just line level comments).
90+
- [`custom-type-var-for-self`](https://docs.astral.sh/ruff/rules/custom-type-var-for-self/) (`PYI019`): More accurate detection of custom `TypeVars` replaceable by `Self`. The range of the diagnostic is now the full function header rather than just the return annotation.
91+
- [`invalid-argument-name`](https://docs.astral.sh/ruff/rules/invalid-argument-name/) (`N803`): Ignore argument names of functions decorated with `typing.override`
92+
- [`invalid-envvar-default`](https://docs.astral.sh/ruff/rules/invalid-envvar-default/) (`PLW1508`): Detect default value arguments to `os.environ.get` with invalid type.
93+
- [`pytest-raises-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-raises-with-multiple-statements/) (`PT012`) [`pytest-warns-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-warns-with-multiple-statements/) (`PT031`): Allow `for` statements with an empty body in `pytest.raises` and `pytest.warns` `with` statements.
94+
- [`redundant-open-modes`](https://docs.astral.sh/ruff/rules/redundant-open-modes/) (`UP015`): The diagnostic range is now the range of the redundant mode argument where it previously was the range of the entire open call. You may have to replace your `noqa` comments when suppressing `UP015`.
95+
- [`stdlib-module-shadowing`](https://docs.astral.sh/ruff/rules/stdlib-module-shadowing/) (`A005`): Changes the default value of `lint.flake8-builtins.strict-checking` from `true` to `false`.
96+
- [`type-none-comparison`](https://docs.astral.sh/ruff/rules/type-none-comparison/) (`FURB169`): Now also recognizes `type(expr) is type(None)` comparisons where `expr` isn't a name expression.
97+
98+
The following fixes or improvements to fixes have been stabilized:
99+
100+
- [`repeated-equality-comparison`](https://docs.astral.sh/ruff/rules/repeated-equality-comparison/) (`PLR1714`) ([#16685](https://github.com/astral-sh/ruff/pull/16685))
101+
- [`needless-bool`](https://docs.astral.sh/ruff/rules/needless-bool/) (`SIM103`) ([#16684](https://github.com/astral-sh/ruff/pull/16684))
102+
- [`unused-private-type-var`](https://docs.astral.sh/ruff/rules/unused-private-type-var/) (`PYI018`) ([#16682](https://github.com/astral-sh/ruff/pull/16682))
103+
104+
### Server
105+
106+
- Remove logging output for `ruff.printDebugInformation` ([#16617](https://github.com/astral-sh/ruff/pull/16617))
107+
108+
### Configuration
109+
110+
- \[`flake8-builtins`\] Deprecate the `builtins-` prefixed options in favor of the unprefixed options (e.g. `builtins-allowed-modules` is now deprecated in favor of `allowed-modules`) ([#16092](https://github.com/astral-sh/ruff/pull/16092))
111+
112+
### Bug fixes
113+
114+
- [flake8-bandit] Fix mixed-case hash algorithm names (S324) ([#16552](https://github.com/astral-sh/ruff/pull/16552))
115+
116+
### CLI
117+
118+
- [ruff] Fix `last_tag`/`commits_since_last_tag` for `version` command ([#16686](https://github.com/astral-sh/ruff/pull/16686))
119+
3120
## 0.9.10
4121

5122
### Preview features
@@ -1331,7 +1448,7 @@ The following fixes have been stabilized:
13311448

13321449
## 0.5.6
13331450

1334-
Ruff 0.5.6 automatically enables linting and formatting of notebooks in *preview mode*.
1451+
Ruff 0.5.6 automatically enables linting and formatting of notebooks in _preview mode_.
13351452
You can opt-out of this behavior by adding `*.ipynb` to the `extend-exclude` setting.
13361453

13371454
```toml
@@ -2084,7 +2201,7 @@ To setup `ruff server` with your editor, refer to the [README.md](https://github
20842201

20852202
### Server
20862203

2087-
*This section is devoted to updates for our new language server, written in Rust.*
2204+
_This section is devoted to updates for our new language server, written in Rust._
20882205

20892206
- Enable ruff-specific source actions ([#10916](https://github.com/astral-sh/ruff/pull/10916))
20902207
- Refreshes diagnostics for open files when file configuration is changed ([#10988](https://github.com/astral-sh/ruff/pull/10988))
@@ -3491,7 +3608,7 @@ Read Ruff's new [versioning policy](https://docs.astral.sh/ruff/versioning/).
34913608
- \[`refurb`\] Add `single-item-membership-test` (`FURB171`) ([#7815](https://github.com/astral-sh/ruff/pull/7815))
34923609
- \[`pylint`\] Add `and-or-ternary` (`R1706`) ([#7811](https://github.com/astral-sh/ruff/pull/7811))
34933610

3494-
*New rules are added in [preview](https://docs.astral.sh/ruff/preview/).*
3611+
_New rules are added in [preview](https://docs.astral.sh/ruff/preview/)._
34953612

34963613
### Configuration
34973614

Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ curl -LsSf https://astral.sh/ruff/install.sh | sh
149149
powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"
150150

151151
# For a specific version.
152-
curl -LsSf https://astral.sh/ruff/0.9.10/install.sh | sh
153-
powershell -c "irm https://astral.sh/ruff/0.9.10/install.ps1 | iex"
152+
curl -LsSf https://astral.sh/ruff/0.10.0/install.sh | sh
153+
powershell -c "irm https://astral.sh/ruff/0.10.0/install.ps1 | iex"
154154
```
155155

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

crates/ruff/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ruff"
3-
version = "0.9.10"
3+
version = "0.10.0"
44
publish = true
55
authors = { workspace = true }
66
edition = { workspace = true }

crates/ruff_linter/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ruff_linter"
3-
version = "0.9.10"
3+
version = "0.10.0"
44
publish = false
55
authors = { workspace = true }
66
edition = { workspace = true }

crates/ruff_wasm/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ruff_wasm"
3-
version = "0.9.10"
3+
version = "0.10.0"
44
publish = false
55
authors = { workspace = true }
66
edition = { workspace = true }

docs/integrations.md

+4-4
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.9.10-alpine
83+
name: ghcr.io/astral-sh/ruff:0.10.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.9.10
109+
rev: v0.10.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.9.10
122+
rev: v0.10.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.9.10
136+
rev: v0.10.0
137137
hooks:
138138
# Run the linter.
139139
- id: ruff

docs/tutorial.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ This tutorial has focused on Ruff's command-line interface, but Ruff can also be
365365
```yaml
366366
- repo: https://github.com/astral-sh/ruff-pre-commit
367367
# Ruff version.
368-
rev: v0.9.10
368+
rev: v0.10.0
369369
hooks:
370370
# Run the linter.
371371
- id: ruff

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
44

55
[project]
66
name = "ruff"
7-
version = "0.9.10"
7+
version = "0.10.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"

scripts/benchmarks/pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "scripts"
3-
version = "0.9.10"
3+
version = "0.10.0"
44
description = ""
55
authors = ["Charles Marsh <[email protected]>"]
66

0 commit comments

Comments
 (0)