|
1 | 1 | # Changelog
|
2 | 2 |
|
| 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 | + |
3 | 120 | ## 0.9.10
|
4 | 121 |
|
5 | 122 | ### Preview features
|
@@ -1331,7 +1448,7 @@ The following fixes have been stabilized:
|
1331 | 1448 |
|
1332 | 1449 | ## 0.5.6
|
1333 | 1450 |
|
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_. |
1335 | 1452 | You can opt-out of this behavior by adding `*.ipynb` to the `extend-exclude` setting.
|
1336 | 1453 |
|
1337 | 1454 | ```toml
|
@@ -2084,7 +2201,7 @@ To setup `ruff server` with your editor, refer to the [README.md](https://github
|
2084 | 2201 |
|
2085 | 2202 | ### Server
|
2086 | 2203 |
|
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._ |
2088 | 2205 |
|
2089 | 2206 | - Enable ruff-specific source actions ([#10916](https://github.com/astral-sh/ruff/pull/10916))
|
2090 | 2207 | - 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/).
|
3491 | 3608 | - \[`refurb`\] Add `single-item-membership-test` (`FURB171`) ([#7815](https://github.com/astral-sh/ruff/pull/7815))
|
3492 | 3609 | - \[`pylint`\] Add `and-or-ternary` (`R1706`) ([#7811](https://github.com/astral-sh/ruff/pull/7811))
|
3493 | 3610 |
|
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/)._ |
3495 | 3612 |
|
3496 | 3613 | ### Configuration
|
3497 | 3614 |
|
|
0 commit comments