[flake8-type-checking] Support auto-quoting when annotations contain quotes#11811
Conversation
41e9c0f to
d97e2bd
Compare
41064e7 to
54e4882
Compare
54e4882 to
29e0d4a
Compare
CodSpeed Performance ReportMerging #11811 will not alter performanceComparing Summary
|
crates/ruff_linter/resources/test/fixtures/flake8_type_checking/quote.py
Outdated
Show resolved
Hide resolved
Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com>
b11a732 to
14f51e3
Compare
|
Thanks, I was away for a while I want to work on this tomorrow. |
b218633 to
06462cb
Compare
Signed-off-by: Shaygan <hey@glyphack.com>
06462cb to
e8c0f90
Compare
|
Signed-off-by: Shaygan <hey@glyphack.com>
Signed-off-by: Shaygan <hey@glyphack.com>
169add9 to
75f4407
Compare
...nter__rules__flake8_type_checking__tests__quote_typing-only-third-party-import_quote.py.snap
Outdated
Show resolved
Hide resolved
|
Thanks for working on this. Overall, the approach looks good. I'll give it a detailed review once you think it's ready. I'd also recommend adding test cases with mixed quote style i.e., scenarios where we might not be able to provide a fix. |
Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com>
Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com>
| let generator = Generator::from(self.stylist); | ||
| match expr { | ||
| Expr::Subscript(ast::ExprSubscript { value, slice, .. }) => { | ||
| if let Some(name) = value.as_name_expr() { |
There was a problem hiding this comment.
Should we only look for Name node here? What about attribute nodes like pd.DataFrame or typing.Optional[int] which is more relevant in this context as it's a subscript expression.
There was a problem hiding this comment.
Correct. Is it enough if we rely on an attribute with value of "typing" and attr of "Optional" or "Literal", etc.?
Or should we fully resolved and check the qualified name in this case that the symbol is resolved to that class or not?
There was a problem hiding this comment.
I added another case for attributes.
| def func(self) -> DataFrame | list[Series]: | ||
| pass | ||
|
|
||
| def f(): |
There was a problem hiding this comment.
I think I know why the test is failing within the current MAX_ITERATIONS value. All of the different test cases are within the same function here so when some of them tries to add the if TYPE_CHECKING block along with the TYPE_CHECKING import, the edits collide and thus it won't be applied which will then require another iteration. We should split the test cases, grouping them based on similarity, in similar way as done in the top half of the file.
There was a problem hiding this comment.
You are right. I think I can fix that easily. There's just another problem I encountered. Aside from the new tests I've written the old ones also have this problem that each time the type annotation is changed a new import is added and the duplicate imports I think are removed in the end. So now the file fails again.
---- rules::flake8_type_checking::tests::quote::rule_typingonlythirdpartyimport_path_new_quote_py_expects stdout ----
thread 'rules::flake8_type_checking::tests::quote::rule_typingonlythirdpartyimport_path_new_quote_py_expects' panicked at crates/ruff_linter/src/test.rs:167:17:
Failed to converge after 10 iterations. This likely indicates a bug in the implementation of the fix. Last diagnostics:
quote.py:17:24: TCH002 [*] Move third-party import `pandas.DataFrame` into a type-checking block
|
16 | def f():
17 | from pandas import DataFrame
| ^^^^^^^^^ TCH002
18 |
19 | def baz() -> DataFrame:
|
= help: Move into type-checking block
ℹ Unsafe fix
3 3 | if TYPE_CHECKING:
4 4 | from pandas import DataFrame
5 5 | from pandas import DataFrame
6 |+ from pandas import DataFrame
6 7 | import pandas as pd
7 8 | import pandas as pd
8 9 | import pandas as pd
--------------------------------------------------------------------------------
14 15 |
15 16 |
16 17 | def f():
17 |- from pandas import DataFrame
18 18 |
19 |- def baz() -> DataFrame:
19 |+ def baz() -> "DataFrame":
20 20 | ...
21 21 |
22 22 |
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
It can be reproduced by just duplicating one of the functions multiple times in master:
def f():
from pandas import DataFrame
def baz() -> DataFrame[int]:
...
def f():
from pandas import DataFrame
def baz() -> DataFrame[int]:
...
def f():
from pandas import DataFrame
def baz() -> DataFrame[int]:
...
My guess is that two rules are conflicting here. One is moving the import to type checking block but since now that import is in type checking block another function later in the quote.py is using that import and it is resolved when the symbol is looked up here
I'm not sure if I'm right because the import should be resolved to the import inside the function itself. It's my guess. I will investigate this later after resolving other issues.
For now I'm going to create a new file that will avoid this issue. Moving my new test cases to a file works fine.
|
Thanks for writing an extensive test suite. I think the changes are looking pretty great and close to being merged. I would suggest to separate the test cases in groups where the first group raises the diagnostics and the second group doesn't. The first group would need to be split into individual isolated functions like existing test cases. The second group can be in a single function because that won't raise any diagnostics. Also, apologies for the late review, I was on vacation for the past 2 weeks which is why the review was delayed. |
d28840b to
5c4b4df
Compare
flake8-type-checking] Support auto-quoting when annotations contain quotes
| if let Some(qualified_name) = self.semantic.resolve_qualified_name(value) { | ||
| if self | ||
| .semantic | ||
| .match_typing_qualified_name(&qualified_name, "Literal") | ||
| { | ||
| self.state.push(QuoteAnnotatorState::Literal); | ||
| } else if self | ||
| .semantic | ||
| .match_typing_qualified_name(&qualified_name, "Annotated") | ||
| { | ||
| self.state.push(QuoteAnnotatorState::AnnotatedFirst); | ||
| } else { | ||
| self.state.push(QuoteAnnotatorState::Other); | ||
| } | ||
| } |
There was a problem hiding this comment.
I've updated the code to use the semantic model to resolve the expression into its qualified name and we use that to match against the typing import. This way we make sure that any import aliases are correctly resolved.
There was a problem hiding this comment.
I really appreciate your help and the reviews it thought me a lot.
| if let Some(last) = self.state.last_mut() { | ||
| if *last == QuoteAnnotatorState::AnnotatedFirst { | ||
| *last = QuoteAnnotatorState::AnnotatedRest; | ||
| } | ||
| } |
There was a problem hiding this comment.
Previously, the state would only append so it would be [..., AnnotatedFirst, AnnotatedRest] and later it would only pop the AnnotatedRest state. I've updated this to replace AnnotatedFirst with AnnotatedRest instead.
| self.annotation.push_str(" | "); | ||
| self.visit_expr(right); | ||
| } | ||
| _ => { |
There was a problem hiding this comment.
There was a branch for Expr::BoolOp although I don't think that's required. Can you confirm this? @Glyphack
There was a problem hiding this comment.
You are correct. I was not very familiar with syntax in type annotation but I don't see anything with a boolean operation.
| #[test_case(Rule::RuntimeImportInTypeCheckingBlock, Path::new("quote.py"))] | ||
| #[test_case(Rule::TypingOnlyThirdPartyImport, Path::new("quote.py"))] | ||
| #[test_case(Rule::RuntimeImportInTypeCheckingBlock, Path::new("quote2.py"))] | ||
| #[test_case(Rule::TypingOnlyThirdPartyImport, Path::new("quote2.py"))] | ||
| #[test_case(Rule::RuntimeImportInTypeCheckingBlock, Path::new("quote3.py"))] | ||
| #[test_case(Rule::TypingOnlyThirdPartyImport, Path::new("quote3.py"))] |
There was a problem hiding this comment.
I've split the files because otherwise we run into the iteration limit in tests which is set to 10. We'd need to increase it substantially (~20) to fit all the test cases in a single file. The reason the limit needs to be increased seems unrelated to what's being changed in this PR and my guess for why it's happening is because the import edits are colliding.
dhruvmanila
left a comment
There was a problem hiding this comment.
Thanks for contributing this change and for your patience throughout the review cycle! I think this is ready to land, I'll go through the snapshots once and move ahead.
There was a problem hiding this comment.
This is a large snapshot diff because one of the test case was removed which had DataFrame["int"] as an annotation. Previously, we would highlight this but won't be auto-fixable but now we do. Once that happens, it hits the iteration limit in tests and so I moved it to a different file which means the line numbers for all subsequent test cases have been updated. I verified that this snapshot update is correct by keeping the test case and updating the limit which gives reduced diff in the snapshot.
* [red-knot] binary arithmetic on instances (#13800)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
* [red-knot] Fix edge case for binary-expression inference where the lhs and rhs are the exact same type (#13823)
## Summary
This fixes an edge case that @carljm and I missed when implementing
https://github.com/astral-sh/ruff/pull/13800. Namely, if the left-hand
operand is the _exact same type_ as the right-hand operand, the
reflected dunder on the right-hand operand is never tried:
```pycon
>>> class Foo:
... def __radd__(self, other):
... return 42
...
>>> Foo() + Foo()
Traceback (most recent call last):
File "<python-input-1>", line 1, in <module>
Foo() + Foo()
~~~~~~^~~~~~~
TypeError: unsupported operand type(s) for +: 'Foo' and 'Foo'
```
This edge case _is_ covered in Brett's blog at
https://snarky.ca/unravelling-binary-arithmetic-operations-in-python/,
but I missed it amongst all the other subtleties of this algorithm. The
motivations and history behind it were discussed in
https://mail.python.org/archives/list/python-dev@python.org/thread/7NZUCODEAPQFMRFXYRMGJXDSIS3WJYIV/
## Test Plan
I added an mdtest for this cornercase.
* [red-knot] Enhancing Diagnostics for Compare Expression Inference (#13819)
## Summary
- Refactored comparison type inference functions in `infer.rs`: Changed
the return type from `Option` to `Result` to lay the groundwork for
providing more detailed diagnostics.
- Updated diagnostic messages.
This is a small step toward improving diagnostics in the future.
Please refer to #13787
## Test Plan
mdtest included!
---------
Co-authored-by: Carl Meyer <carl@astral.sh>
* [python_ast] Make the iter_mut functions public (#13542)
* [red-knot] Implement more types in binary and unary expressions (#13803)
Implemented some points from
https://github.com/astral-sh/ruff/issues/12701
- Handle Unknown and Any in Unary operation
- Handle Boolean in binary operations
- Handle instances in unary operation
- Consider division by False to be division by zero
---------
Co-authored-by: Carl Meyer <carl@astral.sh>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
* Update BREAKING_CHANGES.md for Ruff 0.7 (#13828)
* Bump MSRV to Rust 1.80 (#13826)
* Update Rust crate pep440_rs to 0.7.1 (#13654)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Micha Reiser <micha@reiser.io>
* [red-knot] Cleanup generated names of mdtest tests (#13831)
Co-authored-by: Alex Waygood <alex.waygood@gmail.com>
Co-authored-by: Micha Reiser <micha@reiser.io>
* Simplify iteration idioms (#13834)
Remove unnecessary uses of `.as_ref()`, `.iter()`, `&**` and similar, mostly in situations when iterating over variables. Many of these changes are only possible following #13826, when we bumped our MSRV to 1.80: several useful implementations on `&Box<[T]>` were only stabilised in Rust 1.80. Some of these changes we could have done earlier, however.
* Modernize build scripts (#13837)
Use the modern `cargo::KEY=VALUE` syntax that was stabilised in MSRV 1.77, rather than the deprecated `cargo:KEY=VALUE` syntax.
* Update dependency mdformat to v0.7.18 (#13843)
* Update dependency ruff to v0.7.0 (#13847)
* Update Rust crate libc to v0.2.161 (#13840)
* Update Rust crate anyhow to v1.0.90 (#13839)
* Update Rust crate proc-macro2 to v1.0.88 (#13841)
* Update Rust crate syn to v2.0.82 (#13842)
* Update Rust crate fern to 0.7.0 (#13844)
* Update Rust crate serde_json to v1.0.132 (#13848)
* Update Rust crate uuid to v1.11.0 (#13845)
* Update dependency tomli_w to v1.1.0 (#13849)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [tomli_w](https://redirect.github.com/hukkin/tomli-w)
([changelog](https://redirect.github.com/hukkin/tomli-w/blob/master/CHANGELOG.md))
| `==1.0.0` -> `==1.1.0` |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
<details>
<summary>hukkin/tomli-w (tomli_w)</summary>
###
[`v1.1.0`](https://redirect.github.com/hukkin/tomli-w/blob/HEAD/CHANGELOG.md#110)
[Compare
Source](https://redirect.github.com/hukkin/tomli-w/compare/1.0.0...1.1.0)
- Removed
- Support for Python 3.7 and 3.8
- Added
- Accept generic `collections.abc.Mapping`, not just `dict`, as input.
Thank you [Watal M. Iwasaki](https://redirect.github.com/heavywatal) for
the
[PR](https://redirect.github.com/hukkin/tomli-w/pull/46).
- `indent` keyword argument for customizing indent width of arrays.
Thank you [Wim Jeantine-Glenn](https://redirect.github.com/wimglenn) for
the
[PR](https://redirect.github.com/hukkin/tomli-w/pull/49).
- Type annotations
- Type annotate `dump` function's output stream object as
`typing.IO[bytes]` (previously `typing.BinaryIO`)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/astral-sh/ruff).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJpbnRlcm5hbCJdfQ==-->
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* Update pre-commit dependencies (#13850)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
|
[abravalheri/validate-pyproject](https://redirect.github.com/abravalheri/validate-pyproject)
| repository | minor | `v0.20.2` -> `v0.21` |
|
[astral-sh/ruff-pre-commit](https://redirect.github.com/astral-sh/ruff-pre-commit)
| repository | minor | `v0.6.9` -> `v0.7.0` |
| [crate-ci/typos](https://redirect.github.com/crate-ci/typos) |
repository | minor | `v1.25.0` -> `v1.26.0` |
|
[executablebooks/mdformat](https://redirect.github.com/executablebooks/mdformat)
| repository | patch | `0.7.17` -> `0.7.18` |
Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://redirect.github.com/renovatebot/renovate/discussions/new)
if you have any questions.
---
### Release Notes
<details>
<summary>abravalheri/validate-pyproject
(abravalheri/validate-pyproject)</summary>
###
[`v0.21`](https://redirect.github.com/abravalheri/validate-pyproject/releases/tag/v0.21)
[Compare
Source](https://redirect.github.com/abravalheri/validate-pyproject/compare/v0.20.2...v0.21)
#### What's Changed
- Added support PEP 735 by
[@​henryiii](https://redirect.github.com/henryiii) in
[https://github.com/abravalheri/validate-pyproject/pull/208](https://redirect.github.com/abravalheri/validate-pyproject/pull/208)
- Added support PEP 639 by
[@​henryiii](https://redirect.github.com/henryiii) in
[https://github.com/abravalheri/validate-pyproject/pull/210](https://redirect.github.com/abravalheri/validate-pyproject/pull/210)
- Renamed testing extra to test by
[@​henryiii](https://redirect.github.com/henryiii) in
[https://github.com/abravalheri/validate-pyproject/pull/212](https://redirect.github.com/abravalheri/validate-pyproject/pull/212)
- General updates in CI setup
**Full Changelog**:
https://github.com/abravalheri/validate-pyproject/compare/v0.20.2...v0.21
</details>
<details>
<summary>astral-sh/ruff-pre-commit (astral-sh/ruff-pre-commit)</summary>
###
[`v0.7.0`](https://redirect.github.com/astral-sh/ruff-pre-commit/releases/tag/v0.7.0)
[Compare
Source](https://redirect.github.com/astral-sh/ruff-pre-commit/compare/v0.6.9...v0.7.0)
See: https://github.com/astral-sh/ruff/releases/tag/0.7.0
</details>
<details>
<summary>crate-ci/typos (crate-ci/typos)</summary>
###
[`v1.26.0`](https://redirect.github.com/crate-ci/typos/releases/tag/v1.26.0)
[Compare
Source](https://redirect.github.com/crate-ci/typos/compare/v1.25.0...v1.26.0)
#### \[1.26.0] - 2024-10-07
##### Compatibility
- *(pre-commit)* Requires 3.2+
##### Fixes
- *(pre-commit)* Resolve deprecations in 4.0 about deprecated stage
names
</details>
<details>
<summary>executablebooks/mdformat (executablebooks/mdformat)</summary>
###
[`v0.7.18`](https://redirect.github.com/executablebooks/mdformat/compare/0.7.17...0.7.18)
[Compare
Source](https://redirect.github.com/executablebooks/mdformat/compare/0.7.17...0.7.18)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/astral-sh/ruff).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJpbnRlcm5hbCJdfQ==-->
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* Update NPM Development dependencies (#13851)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@cloudflare/workers-types](https://redirect.github.com/cloudflare/workerd)
| [`4.20241004.0` ->
`4.20241018.0`](https://renovatebot.com/diffs/npm/@cloudflare%2fworkers-types/4.20241004.0/4.20241018.0)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
|
[@types/react-dom](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react-dom)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom))
| [`18.3.0` ->
`18.3.1`](https://renovatebot.com/diffs/npm/@types%2freact-dom/18.3.0/18.3.1)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
|
[@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin))
| [`8.8.0` ->
`8.10.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.8.0/8.10.0)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
|
[@typescript-eslint/parser](https://typescript-eslint.io/packages/parser)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser))
| [`8.8.0` ->
`8.10.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.8.0/8.10.0)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
| [eslint-plugin-react-hooks](https://react.dev/)
([source](https://redirect.github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks))
| [`^4.6.0` ->
`^5.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/4.6.2/5.0.0)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
|
[miniflare](https://redirect.github.com/cloudflare/workers-sdk/tree/main/packages/miniflare#readme)
([source](https://redirect.github.com/cloudflare/workers-sdk/tree/HEAD/packages/miniflare))
| [`3.20240925.0` ->
`3.20241011.0`](https://renovatebot.com/diffs/npm/miniflare/3.20240925.0/3.20241011.0)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
| [tailwindcss](https://tailwindcss.com)
([source](https://redirect.github.com/tailwindlabs/tailwindcss)) |
[`3.4.13` ->
`3.4.14`](https://renovatebot.com/diffs/npm/tailwindcss/3.4.13/3.4.14) |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
| [typescript](https://www.typescriptlang.org/)
([source](https://redirect.github.com/microsoft/TypeScript)) | [`5.6.2`
-> `5.6.3`](https://renovatebot.com/diffs/npm/typescript/5.6.2/5.6.3) |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
| [vite](https://vite.dev)
([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite))
| [`5.4.8` ->
`5.4.9`](https://renovatebot.com/diffs/npm/vite/5.4.8/5.4.9) |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
| [wrangler](https://redirect.github.com/cloudflare/workers-sdk)
([source](https://redirect.github.com/cloudflare/workers-sdk/tree/HEAD/packages/wrangler))
| [`3.80.0` ->
`3.81.0`](https://renovatebot.com/diffs/npm/wrangler/3.80.0/3.81.0) |
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
[](https://docs.renovatebot.com/merge-confidence/)
|
---
### Release Notes
<details>
<summary>cloudflare/workerd (@​cloudflare/workers-types)</summary>
###
[`v4.20241018.0`](https://redirect.github.com/cloudflare/workerd/compare/caeb4e0d9e8a7ecbef208e8c54c27bae7e412f7b...fa7168988f89ec72e218a0112be4f6f0229c2d6b)
[Compare
Source](https://redirect.github.com/cloudflare/workerd/compare/caeb4e0d9e8a7ecbef208e8c54c27bae7e412f7b...fa7168988f89ec72e218a0112be4f6f0229c2d6b)
###
[`v4.20241011.0`](https://redirect.github.com/cloudflare/workerd/compare/76198481858fce538e4efa2783c3844e38149227...caeb4e0d9e8a7ecbef208e8c54c27bae7e412f7b)
[Compare
Source](https://redirect.github.com/cloudflare/workerd/compare/76198481858fce538e4efa2783c3844e38149227...caeb4e0d9e8a7ecbef208e8c54c27bae7e412f7b)
</details>
<details>
<summary>typescript-eslint/typescript-eslint
(@​typescript-eslint/eslint-plugin)</summary>
###
[`v8.10.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8100-2024-10-17)
[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.9.0...v8.10.0)
##### 🚀 Features
- support TypeScript 5.6
([#​9972](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/9972))
##### ❤️ Thank You
- Josh Goldberg ✨
You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.
###
[`v8.9.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#890-2024-10-14)
[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.8.1...v8.9.0)
##### 🩹 Fixes
- **eslint-plugin:** \[no-unnecessary-type-parameters] cannot assume
variables are either type or value
- **scope-manager:** \[no-use-before-define] do not treat nested
namespace aliases as variable references
- **eslint-plugin:** \[return-await] sync the behavior with
await-thenable
- **eslint-plugin:** \[prefer-literal-enum-member] report a different
error message when `allowBitwiseExpressions` is enabled
- **eslint-plugin:** \[no-loop-func] sync from upstream base rule
- **eslint-plugin:** \[no-unused-vars] never report the naming of an
enum member
- **eslint-plugin:** correct use-at-your-own-risk type definitions
- **eslint-plugin:** handle unions in await...for
##### ❤️ Thank You
- Abraham Guo
- Anna Bocharova
- Arya Emami
- auvred
- Joshua Chen
- Kirk Waiblinger
- Lotfi Meklati
- mdm317
- Ronen Amiel
- Sukka
- YeonJuan
You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.
###
[`v8.8.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#881-2024-10-07)
[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.8.0...v8.8.1)
##### 🩹 Fixes
- **eslint-plugin:** stop warning on
[@​ts-nocheck](https://redirect.github.com/ts-nocheck) comments
which aren't at the beginning of the file
##### ❤️ Thank You
- Brad Zacher
- Ronen Amiel
- WhitePiano
You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.
</details>
<details>
<summary>typescript-eslint/typescript-eslint
(@​typescript-eslint/parser)</summary>
###
[`v8.10.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8100-2024-10-17)
[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.9.0...v8.10.0)
##### 🚀 Features
- support TypeScript 5.6
([#​9972](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/9972))
##### ❤️ Thank You
- Josh Goldberg ✨
You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.
###
[`v8.9.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#890-2024-10-14)
[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.8.1...v8.9.0)
This was a version bump only for parser to align it with other projects,
there were no code changes.
You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.
###
[`v8.8.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#881-2024-10-07)
[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.8.0...v8.8.1)
This was a version bump only for parser to align it with other projects,
there were no code changes.
You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.
</details>
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
###
[`v5.0.0`](https://redirect.github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#500)
[Compare
Source](https://redirect.github.com/facebook/react/compare/a87edf62d7d69705ddbcec9a24f0780b3db7535f...eslint-plugin-react-hooks@5.0.0)
- **New Violations:** Component names now need to start with an
uppercase letter instead of a non-lowercase letter. This means `_Button`
or `_component` are no longer valid.
([@​kassens](https://redirect.github.com/kassens)) in
[#​25162](https://redirect.github.com/facebook/react/pull/25162)
<!---->
- Consider dispatch from `useActionState` stable.
([@​eps1lon](https://redirect.github.com/eps1lon) in
[#​29665](https://redirect.github.com/facebook/react/pull/29665))
- Add support for ESLint v9.
([@​eps1lon](https://redirect.github.com/eps1lon) in
[#​28773](https://redirect.github.com/facebook/react/pull/28773))
- Accept `as` expression in callback.
([@​StyleShit](https://redirect.github.com/StyleShit) in
[#​28202](https://redirect.github.com/facebook/react/pull/28202))
- Accept `as` expressions in deps array.
([@​StyleShit](https://redirect.github.com/StyleShit) in
[#​28189](https://redirect.github.com/facebook/react/pull/28189))
- Treat `React.use()` the same as `use()`.
([@​kassens](https://redirect.github.com/kassens) in
[#​27769](https://redirect.github.com/facebook/react/pull/27769))
- Move `use()` lint to non-experimental.
([@​kassens](https://redirect.github.com/kassens) in
[#​27768](https://redirect.github.com/facebook/react/pull/27768))
- Support Flow `as` expressions.
([@​cpojer](https://redirect.github.com/cpojer) in
[#​27590](https://redirect.github.com/facebook/react/pull/27590))
- Allow `useEffect(fn, undefined)`.
([@​kassens](https://redirect.github.com/kassens) in
[#​27525](https://redirect.github.com/facebook/react/pull/27525))
- Disallow hooks in async functions.
([@​acdlite](https://redirect.github.com/acdlite) in
[#​27045](https://redirect.github.com/facebook/react/pull/27045))
- Rename experimental `useEvent` to `useEffectEvent`.
([@​sebmarkbage](https://redirect.github.com/sebmarkbage) in
[#​25881](https://redirect.github.com/facebook/react/pull/25881))
- Lint for presence of `useEvent` functions in dependency lists.
([@​poteto](https://redirect.github.com/poteto) in
[#​25512](https://redirect.github.com/facebook/react/pull/25512))
- Check `useEvent` references instead.
([@​poteto](https://redirect.github.com/poteto) in
[#​25319](https://redirect.github.com/facebook/react/pull/25319))
- Update `RulesOfHooks` with `useEvent` rules.
([@​poteto](https://redirect.github.com/poteto) in
[#​25285](https://redirect.github.com/facebook/react/pull/25285))
</details>
<details>
<summary>cloudflare/workers-sdk (miniflare)</summary>
###
[`v3.20241011.0`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/miniflare/CHANGELOG.md#3202410110)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/miniflare@3.20241004.0...miniflare@3.20241011.0)
##### Patch Changes
-
[#​6961](https://redirect.github.com/cloudflare/workers-sdk/pull/6961)
[`5761020`](https://redirect.github.com/cloudflare/workers-sdk/commit/5761020cb41270ce872ad6c555b263597949c06d)
Thanks
[@​dependabot](https://redirect.github.com/apps/dependabot)! -
chore: update dependencies of "miniflare" package
The following dependency versions have been updated:
| Dependency | From | To |
| ------------------------- | ------------- | ------------- |
| workerd | 1.20241004.0 | 1.20241011.1 |
|
[@​cloudflare/workers-types](https://redirect.github.com/cloudflare/workers-types)
| ^4.20241004.0 | ^4.20241011.0 |
-
[#​6943](https://redirect.github.com/cloudflare/workers-sdk/pull/6943)
[`7859a04`](https://redirect.github.com/cloudflare/workers-sdk/commit/7859a04bcd4b2f1cafe67c371bd236acaf7a2d91)
Thanks [@​sdnts](https://redirect.github.com/sdnts)! - fix: local
queues now respect consumer max delays and retry delays properly
###
[`v3.20241004.0`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/miniflare/CHANGELOG.md#3202410040)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/miniflare@3.20240925.1...miniflare@3.20241004.0)
##### Patch Changes
-
[#​6949](https://redirect.github.com/cloudflare/workers-sdk/pull/6949)
[`c863183`](https://redirect.github.com/cloudflare/workers-sdk/commit/c86318354f1a6c0f5c096d6b2a884de740552a19)
Thanks
[@​dependabot](https://redirect.github.com/apps/dependabot)! -
chore: update dependencies of "miniflare" package
The following dependency versions have been updated:
| Dependency | From | To |
| ------------------------- | ------------- | ------------- |
| workerd | 1.20240925.0 | 1.20241004.0 |
|
[@​cloudflare/workers-types](https://redirect.github.com/cloudflare/workers-types)
| ^4.20240925.0 | ^4.20241004.0 |
###
[`v3.20240925.1`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/miniflare/CHANGELOG.md#3202409251)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/miniflare@3.20240925.0...miniflare@3.20240925.1)
##### Patch Changes
-
[#​6835](https://redirect.github.com/cloudflare/workers-sdk/pull/6835)
[`5c50949`](https://redirect.github.com/cloudflare/workers-sdk/commit/5c509494807a1c0418be83c47a459ec80126848e)
Thanks [@​emily-shen](https://redirect.github.com/emily-shen)! -
fix: rename asset plugin options slightly to match wrangler.toml better
Renamed `path` -> `directory`, `bindingName` -> `binding`.
</details>
<details>
<summary>tailwindlabs/tailwindcss (tailwindcss)</summary>
###
[`v3.4.14`](https://redirect.github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.14)
[Compare
Source](https://redirect.github.com/tailwindlabs/tailwindcss/compare/v3.4.13...v3.4.14)
##### Fixed
- Don't set `display: none` on elements that use `hidden="until-found"`
([#​14625](https://redirect.github.com/tailwindlabs/tailwindcss/pull/14625))
</details>
<details>
<summary>microsoft/TypeScript (typescript)</summary>
###
[`v5.6.3`](https://redirect.github.com/microsoft/TypeScript/compare/v5.6.2...d48a5cf89a62a62d6c6ed53ffa18f070d9458b85)
[Compare
Source](https://redirect.github.com/microsoft/TypeScript/compare/v5.6.2...v5.6.3)
</details>
<details>
<summary>vitejs/vite (vite)</summary>
###
[`v5.4.9`](https://redirect.github.com/vitejs/vite/releases/tag/v5.4.9)
[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v5.4.8...v5.4.9)
Please refer to
[CHANGELOG.md](https://redirect.github.com/vitejs/vite/blob/v5.4.9/packages/vite/CHANGELOG.md)
for details.
</details>
<details>
<summary>cloudflare/workers-sdk (wrangler)</summary>
###
[`v3.81.0`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/wrangler/CHANGELOG.md#3810)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/wrangler@3.80.5...wrangler@3.81.0)
##### Minor Changes
-
[#​6990](https://redirect.github.com/cloudflare/workers-sdk/pull/6990)
[`586c253`](https://redirect.github.com/cloudflare/workers-sdk/commit/586c253f7de36360cab275cb1ebf9a2373fd4f4c)
Thanks
[@​courtney-sims](https://redirect.github.com/courtney-sims)! -
feat: Adds new detailed pages deployment output type
##### Patch Changes
-
[#​6963](https://redirect.github.com/cloudflare/workers-sdk/pull/6963)
[`a5ac45d`](https://redirect.github.com/cloudflare/workers-sdk/commit/a5ac45d7d5aa7a6b82de18a8cf14e6eabdd22e9e)
Thanks [@​RamIdeas](https://redirect.github.com/RamIdeas)! - fix:
make `wrangler dev --remote` respect wrangler.toml's `account_id`
property.
This was a regression in the `--x-dev-env` flow recently turned on by
default.
-
[#​6996](https://redirect.github.com/cloudflare/workers-sdk/pull/6996)
[`b8ab809`](https://redirect.github.com/cloudflare/workers-sdk/commit/b8ab8093b9011b5d7d47bcd31fa69cefa6c8fe2a)
Thanks [@​emily-shen](https://redirect.github.com/emily-shen)! -
fix: improve error messaging when accidentally using Workers commands in
Pages project
If we detect a Workers command used with a Pages project (i.e.
wrangler.toml contains `pages_output_build_dir`), error with Pages
version of command rather than "missing entry-point" etc.
###
[`v3.80.5`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/wrangler/CHANGELOG.md#3805)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/wrangler@3.80.4...wrangler@3.80.5)
##### Patch Changes
- Updated dependencies
\[[`5761020`](https://redirect.github.com/cloudflare/workers-sdk/commit/5761020cb41270ce872ad6c555b263597949c06d),
[`7859a04`](https://redirect.github.com/cloudflare/workers-sdk/commit/7859a04bcd4b2f1cafe67c371bd236acaf7a2d91)]:
- miniflare@3.20241011.0
###
[`v3.80.4`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/wrangler/CHANGELOG.md#3804)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/wrangler@3.80.3...wrangler@3.80.4)
##### Patch Changes
-
[#​6937](https://redirect.github.com/cloudflare/workers-sdk/pull/6937)
[`51aedd4`](https://redirect.github.com/cloudflare/workers-sdk/commit/51aedd4333cce9ffa4f6834cdf19e22148dab7e9)
Thanks [@​lrapoport-cf](https://redirect.github.com/lrapoport-cf)!
- fix: show help when kv commands are run without parameters
- Updated dependencies
\[[`c863183`](https://redirect.github.com/cloudflare/workers-sdk/commit/c86318354f1a6c0f5c096d6b2a884de740552a19),
[`fd43068`](https://redirect.github.com/cloudflare/workers-sdk/commit/fd430687ec1431be6c3af1b7420278b636c36e59)]:
- miniflare@3.20241004.0
-
[@​cloudflare/workers-shared](https://redirect.github.com/cloudflare/workers-shared)[@​0](https://redirect.github.com/0).6.0
###
[`v3.80.3`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/wrangler/CHANGELOG.md#3803)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/wrangler@3.80.2...wrangler@3.80.3)
##### Patch Changes
-
[#​6927](https://redirect.github.com/cloudflare/workers-sdk/pull/6927)
[`2af75ed`](https://redirect.github.com/cloudflare/workers-sdk/commit/2af75edb3c0722c04793c74f46aa099f4a3f27a9)
Thanks [@​emily-shen](https://redirect.github.com/emily-shen)! -
fix: respect `CLOUDFLARE_ACCOUNT_ID` with `wrangler pages project`
commands
Fixes
[#​4947](https://redirect.github.com/cloudflare/workers-sdk/issues/4947)
-
[#​6894](https://redirect.github.com/cloudflare/workers-sdk/pull/6894)
[`eaf71b8`](https://redirect.github.com/cloudflare/workers-sdk/commit/eaf71b86cc5650cffb54c942704ce3dd1b5ed6a7)
Thanks
[@​petebacondarwin](https://redirect.github.com/petebacondarwin)!
- fix: improve the rendering of build errors when bundling
-
[#​6920](https://redirect.github.com/cloudflare/workers-sdk/pull/6920)
[`2e64968`](https://redirect.github.com/cloudflare/workers-sdk/commit/2e649686c259c639701a62e754c53448cb694dfc)
Thanks [@​vicb](https://redirect.github.com/vicb)! - chore: update
unenv dependency version
Pulls in [feat(node/net): implement Server
mock](https://redirect.github.com/unjs/unenv/pull/316).
-
[#​6932](https://redirect.github.com/cloudflare/workers-sdk/pull/6932)
[`4c6aad0`](https://redirect.github.com/cloudflare/workers-sdk/commit/4c6aad05b919a56484d13e4a49b861dcafbc0a2c)
Thanks [@​vicb](https://redirect.github.com/vicb)! - fix: allow
`require`ing unenv aliased packages
Before this PR `require`ing packages aliased in unenv would fail.
That's because `require` would load the mjs file.
This PR adds wraps the mjs file in a virtual ES module to allow
`require`ing it.
###
[`v3.80.2`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/wrangler/CHANGELOG.md#3802)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/wrangler@3.80.1...wrangler@3.80.2)
##### Patch Changes
-
[#​6923](https://redirect.github.com/cloudflare/workers-sdk/pull/6923)
[`1320f20`](https://redirect.github.com/cloudflare/workers-sdk/commit/1320f20b38d7b4623fe21d38118bdc9fb8514a99)
Thanks [@​andyjessop](https://redirect.github.com/andyjessop)! -
chore: adds eslint-disable for ESLint error on empty typescript
interface in workers-configuration.d.ts
###
[`v3.80.1`](https://redirect.github.com/cloudflare/workers-sdk/blob/HEAD/packages/wrangler/CHANGELOG.md#3801)
[Compare
Source](https://redirect.github.com/cloudflare/workers-sdk/compare/wrangler@3.80.0...wrangler@3.80.1)
##### Patch Changes
-
[#​6908](https://redirect.github.com/cloudflare/workers-sdk/pull/6908)
[`d696850`](https://redirect.github.com/cloudflare/workers-sdk/commit/d6968507b7eab36abdc4d6c2ffe183788857d08c)
Thanks [@​penalosa](https://redirect.github.com/penalosa)! - fix:
debounce restarting worker on assets dir file changes when `--x-dev-env`
is enabled.
-
[#​6902](https://redirect.github.com/cloudflare/workers-sdk/pull/6902)
[`dc92af2`](https://redirect.github.com/cloudflare/workers-sdk/commit/dc92af28c572e3f7a03b84afd53f10a40ee2a5f8)
Thanks
[@​threepointone](https://redirect.github.com/threepointone)! -
fix: enable esbuild's keepNames: true to set .name on functions/classes
-
[#​6909](https://redirect.github.com/cloudflare/workers-sdk/pull/6909)
[`82180a7`](https://redirect.github.com/cloudflare/workers-sdk/commit/82180a7a7680028f2ea24ae8b1c8479d39627826)
Thanks [@​penalosa](https://redirect.github.com/penalosa)! - fix:
Various fixes for logging in `--x-dev-env`, primarily to ensure the
hotkeys don't wipe useful output and are cleaned up correctly
-
[#​6903](https://redirect.github.com/cloudflare/workers-sdk/pull/6903)
[`54924a4`](https://redirect.github.com/cloudflare/workers-sdk/commit/54924a430354c0e427770ee4289217660141c72e)
Thanks
[@​petebacondarwin](https://redirect.github.com/petebacondarwin)!
- fix: ensure that `alias` config gets passed through to the bundler
when using new `--x-dev-env`
Fixes
[#​6898](https://redirect.github.com/cloudflare/workers-sdk/issues/6898)
-
[#​6911](https://redirect.github.com/cloudflare/workers-sdk/pull/6911)
[`30b7328`](https://redirect.github.com/cloudflare/workers-sdk/commit/30b7328073c86ff9adebd594015bca6844da7163)
Thanks [@​emily-shen](https://redirect.github.com/emily-shen)! -
fix: infer experimentalJsonConfig from file extension
Fixes
[#​5768](https://redirect.github.com/cloudflare/workers-sdk/issues/5768)
- issue with vitest and Pages projects with wrangler.toml
- Updated dependencies
\[[`5c50949`](https://redirect.github.com/cloudflare/workers-sdk/commit/5c509494807a1c0418be83c47a459ec80126848e)]:
- miniflare@3.20240925.1
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/astral-sh/ruff).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJpbnRlcm5hbCJdfQ==-->
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* [`pylint`] - restrict `iteration-over-set` to only work on sets of literals (`PLC0208`) (#13731)
* [red-knot] Consistently rename BoolLiteral => BooleanLiteral (#13856)
## Summary
- Consistent naming: `BoolLiteral` => `BooleanLiteral` (it's mainly the
`Ty::BoolLiteral` variant that was renamed)
I tripped over this a few times now, so I thought I'll smooth it out.
- Add a new test case for `Literal[True] <: bool`, as suggested here:
https://github.com/astral-sh/ruff/pull/13781#discussion_r1804922827
* [red-knot] handle unions on the LHS of is_subtype_of (#13857)
## Summary
Just a drive-by change that occurred to me while I was looking at
`Type::is_subtype_of`: the existing pattern for unions on the *right
hand side*:
```rs
(ty, Type::Union(union)) => union
.elements(db)
.iter()
.any(|&elem_ty| ty.is_subtype_of(db, elem_ty)),
```
is not (generally) correct if the *left hand side* is a union.
## Test Plan
Added new test cases for `is_subtype_of` and `!is_subtype_of`
* Speed up mdtests (#13832)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
* formatter: Introduce `QuoteMetadata` (#13858)
* [red-knot] Improve chained comparisons handling (#13825)
## Summary
A small fix for comparisons of multiple comparators.
Instead of comparing each comparator to the leftmost item, we should
compare it to the closest item on the left.
While implementing this, I noticed that we don’t yet narrow Yoda
comparisons (e.g., `True is x`), so I didn’t change that behavior in
this PR.
## Test Plan
Added some mdtests 🎉
* Speedup mdtest parser (#13835)
* Update cloudflare/wrangler-action action to v3.9.0 (#13846)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* [red-knot] Support for not-equal narrowing (#13749)
Add type narrowing for `!=` expression as stated in
#13694.
### Test Plan
Add tests in new md format.
---------
Co-authored-by: David Peter <mail@david-peter.de>
* [red-knot] Report line numbers in mdtest relative to the markdown file, not the test snippet (#13804)
Co-authored-by: Alex Waygood <alex.waygood@gmail.com>
Co-authored-by: Micha Reiser <micha@reiser.io>
Co-authored-by: Carl Meyer <carl@oddbird.net>
* [red-knot] is_subtype_of: treat literals as subtype of 'object' (#13876)
Add the following subtype relations:
- `BooleanLiteral <: object`
- `IntLiteral <: object`
- `StringLiteral <: object`
- `LiteralString <: object`
- `BytesLiteral <: object`
Added a test case for `bool <: int`.
## Test Plan
New unit tests.
* ci(docker): incorporate docker release enhancements from uv (#13274)
## Summary
This PR updates `ruff` to match `uv` updated [docker releases
approach](https://github.com/astral-sh/uv/blob/main/.github/workflows/build-docker.yml).
It's a combined PR with changes from these PR's
* https://github.com/astral-sh/uv/pull/6053
* https://github.com/astral-sh/uv/pull/6556
* https://github.com/astral-sh/uv/pull/6734
* https://github.com/astral-sh/uv/pull/7568
Summary of changes / features
1. This change would publish an additional tags that includes only
`major.minor`.
For a release with `x.y.z`, this would publish the tags:
* ghcr.io/astral-sh/ruff:latest
* ghcr.io/astral-sh/ruff:x.y.z
* ghcr.io/astral-sh/ruff:x.y
2. Parallelizes multi-platform builds using multiple workers (hence the
new docker-build / docker-publish jobs), which cuts docker releases time
in half.
3. This PR introduces additional images with the ruff binaries from
scratch for both amd64/arm64 and makes the mapping easy to configure by
generating the Dockerfile on the fly. This approach focuses on
minimizing CI time by taking advantage of dedicating a worker per
mapping (20-30s~ per job). For example, on release `x.y.z`, this will
publish the following image tags with format
`ghcr.io/astral-sh/ruff:{tag}` with manifests for both amd64/arm64. This
also include `x.y` tags for each respective additional tag. Note, this
version does not include the python based images, unlike `uv`.
* From **scratch**: `latest`, `x.y.z`, `x.y` (currently being published)
* From **alpine:3.20**: `alpine`, `alpine3.20`, `x.y.z-alpine`,
`x.y.z-alpine3.20`
* From **debian:bookworm-slim**: `debian-slim`, `bookworm-slim`,
`x.y.z-debian-slim`, `x.y.z-bookworm-slim`
* From **buildpack-deps:bookworm**: `debian`, `bookworm`,
`x.y.z-debian`, `x.y.z-bookworm`
4. This PR also fixes `org.opencontainers.image.version` for all tags
(including the one from `scratch`) to contain the right release version
instead of branch name `main` (current behavior).
```
> docker inspect ghcr.io/astral-sh/ruff:0.6.4 | jq -r
'.[0].Config.Labels'
{
...
"org.opencontainers.image.version": "main"
}
```
Closes https://github.com/astral-sh/ruff/issues/13481
## Test Plan
Approach mimics `uv` with almost no changes so risk is low but I still
tested the full workflow.
* I have a working CI release pipeline on my fork run
https://github.com/samypr100/ruff/actions/runs/10966657733
* The resulting images were published to
https://github.com/samypr100/ruff/pkgs/container/ruff
* Fix `D204`'s documentation to correctly mention the conventions when it is enabled (#13867)
* [red-knot] Treat empty intersection as 'object', fix intersection simplification (#13880)
## Summary
- Properly treat the empty intersection as being of type `object`.
- Consequently, change the simplification method to explicitly add
`Never` to the positive side of the intersection when collapsing a type
such as `int & str` to `Never`, as opposed to just clearing both the
positive and the negative side.
- Minor code improvement in `bindings_ty`: use `peekable()` to check
whether the iterator over constraints is empty, instead of handling
first and subsequent elements separately.
fixes #13870
## Test Plan
- New unit tests for `IntersectionBuilder` to make sure the empty
intersection represents `object`.
- Markdown-based regression test for the original issue in #13870
* [red-knot] rename {Class,Module,Function} => {Class,Module,Function}Literal (#13873)
## Summary
* Rename `Type::Class` => `Type::ClassLiteral`
* Rename `Type::Function` => `Type::FunctionLiteral`
* Do not rename `Type::Module`
* Remove `*Literal` suffixes in `display::LiteralTypeKind` variants, as
per clippy suggestion
* Get rid of `Type::is_class()` in favor of `is_subtype_of(…, 'type')`;
modifiy `is_subtype_of` to support this.
* Add new `Type::is_xyz()` methods and use them instead of matching on
`Type` variants.
closes #13863
## Test Plan
New `is_subtype_of_class_literals` unit test.
---------
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
* Alternate quotes for strings inside f-strings in preview (#13860)
* [red-knot] Use track_caller for expect_ methods (#13884)
## Summary
A minor quality-of-life improvement: add
[`#[track_caller]`](https://doc.rust-lang.org/reference/attributes/codegen.html#the-track_caller-attribute)
attribute to `Type::expect_xyz()` methods and some `TypeInference` methods such that the panic-location
is reported one level higher up in the stack trace.
before: reports location inside the `Type::expect_class_literal()`
method. Not very useful.
```
thread 'types::infer::tests::deferred_annotation_builtin' panicked at crates/red_knot_python_semantic/src/types.rs:304:14:
Expected a Type::ClassLiteral variant
```
after: reports location at the `Type::expect_class_literal()` call site,
where the error was made.
```
thread 'types::infer::tests::deferred_annotation_builtin' panicked at crates/red_knot_python_semantic/src/types/infer.rs:4302:14:
Expected a Type::ClassLiteral variant
```
## Test Plan
Called `expect_class_literal()` on something that's not a
`Type::ClassLiteral` and saw that the error was reported at the call
site.
* [`flake8-type-checking`] Support auto-quoting when annotations contain quotes (#11811)
## Summary
This PR updates the fix generation logic for auto-quoting an annotation
to generate an edit even when there's a quote character present.
The logic uses the visitor pattern, maintaining it's state on where it
is and generating the string value one node at a time. This can be
considered as a specialized form of `Generator`. The state required to
maintain is whether we're currently inside a `typing.Literal` or
`typing.Annotated` because the string value in those types should not be
un-quoted i.e., `Generic[Literal["int"]]` should become
`"Generic[Literal['int']]`, the quotes inside the `Literal` should be
preserved.
Fixes: https://github.com/astral-sh/ruff/issues/9137
## Test Plan
Add various test cases to validate this change, validate the snapshots.
There are no ecosystem changes to go through.
---------
Signed-off-by: Shaygan <hey@glyphack.com>
Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com>
* Fix stale syntax errors in playground (#13888)
* Fix E221 and E222 to flag missing or extra whitespace around `==` operator (#13890)
* [red-knot] Type narrowing for `isinstance` checks (#13894)
## Summary
Add type narrowing for `isinstance(object, classinfo)` [1] checks:
```py
x = 1 if flag else "a"
if isinstance(x, int):
reveal_type(x) # revealed: Literal[1]
```
closes #13893
[1] https://docs.python.org/3/library/functions.html#isinstance
## Test Plan
New Markdown-based tests in `narrow/isinstance.md`.
---------
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
* Remove "default" remark from `ruff check` (#13900)
## Summary
`ruff check` has not been the default in a long time. However, the help
message and code comment still designate it as the default. The remark
should have been removed in the deprecation PR #10169.
## Test Plan
Not tested.
* Use referencial equality in `traversal` helper methods (#13895)
* Join implicit concatenated strings when they fit on a line (#13663)
* [red-knot] Infer subscript expression types for bytes literals (#13901)
## Summary
Infer subscript expression types for bytes literals:
```py
b = b"\x00abc\xff"
reveal_type(b[0]) # revealed: Literal[b"\x00"]
reveal_type(b[1]) # revealed: Literal[b"a"]
reveal_type(b[-1]) # revealed: Literal[b"\xff"]
reveal_type(b[-2]) # revealed: Literal[b"c"]
reveal_type(b[False]) # revealed: Literal[b"\x00"]
reveal_type(b[True]) # revealed: Literal[b"a"]
```
part of #13689
(https://github.com/astral-sh/ruff/issues/13689#issuecomment-2404285064)
## Test Plan
- New Markdown-based tests (see `mdtest/subscript/bytes.md`)
- Added missing test for `string_literal[bool_literal]`
* [red-knot] Format mdtest Python snippets more concisely (#13905)
* Fix preview style name in `can_omit_parentheses` to is_f_string_formatting_enabled (#13907)
* Fix `normalize` arguments when `fstring_formatting` is disabled (#13910)
* Bump version to 0.7.1 (#13913)
* Enable nursery rules: 'redundant_clone', 'debug_assert_with_mut_call', and 'unused_peekable' (#13920)
* [red-knot] knot benchmark: fix `--knot-path` arg (#13923)
## Summary
Previously, this would fail with
```
AttributeError: 'str' object has no attribute 'is_file'
```
if I tried to use the `--knot-path` option. I wish we had a type checker
for Python*.
## Test Plan
```sh
uv run benchmark --knot-path ~/.cargo-target/release/red_knot
```
\* to be fair, this would probably require special handling for
`argparse` in the typechecker.
* [red-knot] Infer `Todo`, not `Unknown`, for PEP-604 unions in annotations (#13908)
* [red-knot] Remove lint-phase (#13922)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
* Docs: Add GitLab CI/CD to integrations. (#13915)
* [red-knot] Type narrow in else clause (#13918)
## Summary
Add support for type narrowing in elif and else scopes as part of
#13694.
## Test Plan
- mdtest
- builder unit test for union negation.
---------
Co-authored-by: Carl Meyer <carl@astral.sh>
---------
Signed-off-by: Shaygan <hey@glyphack.com>
Co-authored-by: Carl Meyer <carl@astral.sh>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: cake-monotone <cake.monotone@gmail.com>
Co-authored-by: Neil Mitchell <ndmitchell@gmail.com>
Co-authored-by: Shaygan Hooshyari <sh.hooshyari@gmail.com>
Co-authored-by: Micha Reiser <micha@reiser.io>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Aditya Pratap Singh <adityapratapsjnhh7654@gmail.com>
Co-authored-by: Steve C <diceroll123@gmail.com>
Co-authored-by: David Peter <sharkdp@users.noreply.github.com>
Co-authored-by: TomerBin <tomerbin98@gmail.com>
Co-authored-by: Alex <83035922+Lexxxzy@users.noreply.github.com>
Co-authored-by: David Peter <mail@david-peter.de>
Co-authored-by: aditya pillai <29032680+pilleye@users.noreply.github.com>
Co-authored-by: Carl Meyer <carl@oddbird.net>
Co-authored-by: samypr100 <3933065+samypr100@users.noreply.github.com>
Co-authored-by: Dhruv Manilawala <dhruvmanila@gmail.com>
Co-authored-by: Mihai Capotă <mihai@mihaic.ro>
Co-authored-by: Jonas Vacek <jvacek@users.noreply.github.com>
Summary
This PR updates the fix generation logic for auto-quoting an annotation to generate an edit even when there's a quote character present.
The logic uses the visitor pattern, maintaining it's state on where it is and generating the string value one node at a time. This can be considered as a specialized form of
Generator. The state required to maintain is whether we're currently inside atyping.Literalortyping.Annotatedbecause the string value in those types should not be un-quoted i.e.,Generic[Literal["int"]]should become"Generic[Literal['int']], the quotes inside theLiteralshould be preserved.Fixes: #9137
Test Plan
Add various test cases to validate this change, validate the snapshots. There are no ecosystem changes to go through.