Skip to content

Commit c9b9b48

Browse files
committed
Merge branch 'main' into dcreager/splat
* main: (76 commits) Move fix suggestion to subdiagnostic (#19464) [ty] Implement non-stdlib stub mapping for classes and functions (#19471) [ty] Disallow illegal uses of `ClassVar` (#19483) [ty] Disallow `Final` in function parameter/return-type annotations (#19480) [ty] Extend `Final` test suite (#19476) [ty] Minor change to diagnostic message for invalid Literal uses (#19482) [ty] Detect illegal non-enum attribute accesses in Literal annotation (#19477) [ty] Reduce size of `TypeInference` (#19435) Run MD tests for Markdown-only changes (#19479) Revert "[ty] Detect illegal non-enum attribute accesses in Literal annotation" [ty] Detect illegal non-enum attribute accesses in Literal annotation [ty] Added semantic token support for more identifiers (#19473) [ty] Make tuple subclass constructors sound (#19469) [ty] Pass down specialization to generic dataclass bases (#19472) [ty] Garbage-collect reachability constraints (#19414) [ty] Implicit instance attributes declared `Final` (#19462) [ty] Expansion of enums into unions of literals (#19382) [ty] Avoid rechecking the entire project when changing the opened files (#19463) [ty] Add warning for unknown `TY_MEMORY_REPORT` value (#19465) [ty] Sync vendored typeshed stubs (#19461) ...
2 parents 369ef05 + fd335eb commit c9b9b48

File tree

915 files changed

+27515
-27940
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

915 files changed

+27515
-27940
lines changed

.github/workflows/ci.yaml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,12 @@ jobs:
143143
env:
144144
MERGE_BASE: ${{ steps.merge_base.outputs.sha }}
145145
run: |
146-
if git diff --quiet "${MERGE_BASE}...HEAD" -- ':**' \
147-
':!**/*.md' \
148-
':crates/ty_python_semantic/resources/mdtest/**/*.md' \
146+
# NOTE: Do not exclude all Markdown files here, but rather use
147+
# specific exclude patterns like 'docs/**'), because tests for
148+
# 'ty' are written in Markdown.
149+
if git diff --quiet "${MERGE_BASE}...HEAD" -- \
149150
':!docs/**' \
150151
':!assets/**' \
151-
':.github/workflows/ci.yaml' \
152152
; then
153153
echo "changed=false" >> "$GITHUB_OUTPUT"
154154
else
@@ -238,13 +238,13 @@ jobs:
238238
- name: "Install Rust toolchain"
239239
run: rustup show
240240
- name: "Install mold"
241-
uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 # v1
241+
uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 # v1
242242
- name: "Install cargo nextest"
243-
uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 # v2.56.13
243+
uses: taiki-e/install-action@c99cc51b309eee71a866715cfa08c922f11cf898 # v2.56.19
244244
with:
245245
tool: cargo-nextest
246246
- name: "Install cargo insta"
247-
uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 # v2.56.13
247+
uses: taiki-e/install-action@c99cc51b309eee71a866715cfa08c922f11cf898 # v2.56.19
248248
with:
249249
tool: cargo-insta
250250
- name: ty mdtests (GitHub annotations)
@@ -296,13 +296,13 @@ jobs:
296296
- name: "Install Rust toolchain"
297297
run: rustup show
298298
- name: "Install mold"
299-
uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 # v1
299+
uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 # v1
300300
- name: "Install cargo nextest"
301-
uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 # v2.56.13
301+
uses: taiki-e/install-action@c99cc51b309eee71a866715cfa08c922f11cf898 # v2.56.19
302302
with:
303303
tool: cargo-nextest
304304
- name: "Install cargo insta"
305-
uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 # v2.56.13
305+
uses: taiki-e/install-action@c99cc51b309eee71a866715cfa08c922f11cf898 # v2.56.19
306306
with:
307307
tool: cargo-insta
308308
- name: "Run tests"
@@ -325,7 +325,7 @@ jobs:
325325
- name: "Install Rust toolchain"
326326
run: rustup show
327327
- name: "Install cargo nextest"
328-
uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 # v2.56.13
328+
uses: taiki-e/install-action@c99cc51b309eee71a866715cfa08c922f11cf898 # v2.56.19
329329
with:
330330
tool: cargo-nextest
331331
- name: "Run tests"
@@ -381,7 +381,7 @@ jobs:
381381
- name: "Install Rust toolchain"
382382
run: rustup show
383383
- name: "Install mold"
384-
uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 # v1
384+
uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 # v1
385385
- name: "Build"
386386
run: cargo build --release --locked
387387

@@ -406,7 +406,7 @@ jobs:
406406
MSRV: ${{ steps.msrv.outputs.value }}
407407
run: rustup default "${MSRV}"
408408
- name: "Install mold"
409-
uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 # v1
409+
uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 # v1
410410
- name: "Build tests"
411411
shell: bash
412412
env:
@@ -903,7 +903,7 @@ jobs:
903903
run: rustup show
904904

905905
- name: "Install codspeed"
906-
uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 # v2.56.13
906+
uses: taiki-e/install-action@c99cc51b309eee71a866715cfa08c922f11cf898 # v2.56.19
907907
with:
908908
tool: cargo-codspeed
909909

@@ -936,7 +936,7 @@ jobs:
936936
run: rustup show
937937

938938
- name: "Install codspeed"
939-
uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 # v2.56.13
939+
uses: taiki-e/install-action@c99cc51b309eee71a866715cfa08c922f11cf898 # v2.56.19
940940
with:
941941
tool: cargo-codspeed
942942

.github/workflows/daily_fuzz.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
- name: "Install Rust toolchain"
3939
run: rustup show
4040
- name: "Install mold"
41-
uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 # v1
41+
uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 # v1
4242
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0
4343
- name: Build ruff
4444
# A debug build means the script runs slower once it gets started,

.github/workflows/sync_typeshed.yaml

Lines changed: 140 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
name: Sync typeshed
22

3+
# How this works:
4+
#
5+
# 1. A Linux worker:
6+
# a. Checks out Ruff and typeshed
7+
# b. Deletes the vendored typeshed stdlib stubs from Ruff
8+
# c. Copies the latest versions of the stubs from typeshed
9+
# d. Uses docstring-adder to sync all docstrings available on Linux
10+
# e. Creates a new branch on the upstream astral-sh/ruff repository
11+
# f. Commits the changes it's made and pushes them to the new upstream branch
12+
# 2. Once the Linux worker is done, a Windows worker:
13+
# a. Checks out the branch created by the Linux worker
14+
# b. Syncs all docstrings available on Windows that are not available on Linux
15+
# c. Commits the changes and pushes them to the same upstream branch
16+
# 3. Once the Windows worker is done, a MacOS worker:
17+
# a. Checks out the branch created by the Linux worker
18+
# b. Syncs all docstrings available on MacOS that are not available on Linux or Windows
19+
# c. Commits the changes and pushes them to the same upstream branch
20+
# d. Creates a PR against the `main` branch using the branch all three workers have pushed to
21+
# 4. If any of steps 1-3 failed, an issue is created in the `astral-sh/ruff` repository
22+
323
on:
424
workflow_dispatch:
525
schedule:
@@ -10,7 +30,17 @@ env:
1030
FORCE_COLOR: 1
1131
GH_TOKEN: ${{ github.token }}
1232

33+
# The name of the upstream branch that the first worker creates,
34+
# and which all three workers push to.
35+
UPSTREAM_BRANCH: typeshedbot/sync-typeshed
36+
37+
# The path to the directory that contains the vendored typeshed stubs,
38+
# relative to the root of the Ruff repository.
39+
VENDORED_TYPESHED: crates/ty_vendored/vendor/typeshed
40+
1341
jobs:
42+
# Sync typeshed stubs, and sync all docstrings available on Linux.
43+
# Push the changes to a new branch on the upstream repository.
1444
sync:
1545
name: Sync typeshed
1646
runs-on: ubuntu-latest
@@ -19,7 +49,6 @@ jobs:
1949
if: ${{ github.repository == 'astral-sh/ruff' || github.event_name != 'schedule' }}
2050
permissions:
2151
contents: write
22-
pull-requests: write
2352
steps:
2453
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
2554
name: Checkout Ruff
@@ -37,67 +66,129 @@ jobs:
3766
git config --global user.name typeshedbot
3867
git config --global user.email '<>'
3968
- uses: astral-sh/setup-uv@bd01e18f51369d5a26f1651c3cb451d3417e3bba # v6.3.1
40-
- name: Sync typeshed
41-
id: sync
69+
- name: Sync typeshed stubs
4270
run: |
43-
docstring_adder="git+https://github.com/astral-sh/docstring-adder.git@6de51c5f44aea11fe8c8f2d30f9ee0683682c3d2"
44-
45-
# Run with the full matrix of Python versions supported by typeshed,
46-
# so that we codemod in docstrings that only exist on certain versions.
47-
#
48-
# The codemod will only add docstrings to functions/classes that do not
49-
# already have docstrings. We run with Python 3.14 before running with
50-
# any other Python version so that we get the Python 3.14 version of the
51-
# docstring for a definition that exists on all Python versions: if we
52-
# ran with Python 3.9 first, then the later runs with Python 3.10+ would
53-
# not modify the docstring that had already been added using the old version of Python.
54-
#
55-
# TODO: In order to add docstrings for platform-specific APIs, we would also
56-
# need to run the codemod on Windows. We get the runtime docstrings by inspecting
57-
# the docstrings at runtime, so if an API doesn't exist at runtime (because e.g.
58-
# it's Windows-specific and we're running on Linux), then we won't add a docstring to it.
59-
#
60-
uvx --python=3.14 --force-reinstall --from="${docstring_adder}" add-docstrings --stdlib-path ./typeshed/stdlib
61-
uvx --python=3.13 --force-reinstall --from="${docstring_adder}" add-docstrings --stdlib-path ./typeshed/stdlib
62-
uvx --python=3.12 --force-reinstall --from="${docstring_adder}" add-docstrings --stdlib-path ./typeshed/stdlib
63-
uvx --python=3.11 --force-reinstall --from="${docstring_adder}" add-docstrings --stdlib-path ./typeshed/stdlib
64-
uvx --python=3.10 --force-reinstall --from="${docstring_adder}" add-docstrings --stdlib-path ./typeshed/stdlib
65-
uvx --python=3.9 --force-reinstall --from="${docstring_adder}" add-docstrings --stdlib-path ./typeshed/stdlib
71+
rm -rf "ruff/${VENDORED_TYPESHED}"
72+
mkdir "ruff/${VENDORED_TYPESHED}"
73+
cp typeshed/README.md "ruff/${VENDORED_TYPESHED}"
74+
cp typeshed/LICENSE "ruff/${VENDORED_TYPESHED}"
75+
76+
# The pyproject.toml file is needed by a later job for the black configuration.
77+
# It's deleted before creating the PR.
78+
cp typeshed/pyproject.toml "ruff/${VENDORED_TYPESHED}"
79+
80+
cp -r typeshed/stdlib "ruff/${VENDORED_TYPESHED}/stdlib"
81+
rm -rf "ruff/${VENDORED_TYPESHED}/stdlib/@tests"
82+
git -C typeshed rev-parse HEAD > "ruff/${VENDORED_TYPESHED}/source_commit.txt"
83+
cd ruff
84+
git checkout -b "${UPSTREAM_BRANCH}"
85+
git add .
86+
git commit -m "Sync typeshed. Source commit: https://github.com/python/typeshed/commit/$(git -C ../typeshed rev-parse HEAD)" --allow-empty
87+
- name: Sync Linux docstrings
88+
if: ${{ success() }}
89+
run: |
90+
cd ruff
91+
./scripts/codemod_docstrings.sh
92+
git commit -am "Sync Linux docstrings" --allow-empty
93+
- name: Push the changes
94+
id: commit
95+
if: ${{ success() }}
96+
run: git -C ruff push --force --set-upstream origin "${UPSTREAM_BRANCH}"
97+
98+
# Checkout the branch created by the sync job,
99+
# and sync all docstrings available on Windows that are not available on Linux.
100+
# Commit the changes and push them to the same branch.
101+
docstrings-windows:
102+
runs-on: windows-latest
103+
timeout-minutes: 20
104+
needs: [sync]
105+
106+
# Don't run the cron job on forks.
107+
# The job will also be skipped if the sync job failed, because it's specified in `needs` above,
108+
# and we haven't used `always()` in the `if` condition here
109+
# (https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#example-requiring-successful-dependent-jobs)
110+
if: ${{ github.repository == 'astral-sh/ruff' || github.event_name != 'schedule' }}
111+
112+
permissions:
113+
contents: write
114+
steps:
115+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
116+
name: Checkout Ruff
117+
with:
118+
persist-credentials: true
119+
ref: ${{ env.UPSTREAM_BRANCH}}
120+
- uses: astral-sh/setup-uv@bd01e18f51369d5a26f1651c3cb451d3417e3bba # v6.3.1
121+
- name: Setup git
122+
run: |
123+
git config --global user.name typeshedbot
124+
git config --global user.email '<>'
125+
- name: Sync Windows docstrings
126+
id: docstrings
127+
shell: bash
128+
run: ./scripts/codemod_docstrings.sh
129+
- name: Commit the changes
130+
if: ${{ steps.docstrings.outcome == 'success' }}
131+
run: |
132+
git commit -am "Sync Windows docstrings" --allow-empty
133+
git push
134+
135+
# Checkout the branch created by the sync job,
136+
# and sync all docstrings available on macOS that are not available on Linux or Windows.
137+
# Push the changes to the same branch and create a PR against the `main` branch using that branch.
138+
docstrings-macos-and-pr:
139+
runs-on: macos-latest
140+
timeout-minutes: 20
141+
needs: [sync, docstrings-windows]
142+
143+
# Don't run the cron job on forks.
144+
# The job will also be skipped if the sync or docstrings-windows jobs failed,
145+
# because they're specified in `needs` above and we haven't used an `always()` condition in the `if` here
146+
# (https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#example-requiring-successful-dependent-jobs)
147+
if: ${{ github.repository == 'astral-sh/ruff' || github.event_name != 'schedule' }}
148+
149+
permissions:
150+
contents: write
151+
pull-requests: write
152+
steps:
153+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
154+
name: Checkout Ruff
155+
with:
156+
persist-credentials: true
157+
ref: ${{ env.UPSTREAM_BRANCH}}
158+
- uses: astral-sh/setup-uv@bd01e18f51369d5a26f1651c3cb451d3417e3bba # v6.3.1
159+
- name: Setup git
160+
run: |
161+
git config --global user.name typeshedbot
162+
git config --global user.email '<>'
163+
- name: Sync macOS docstrings
164+
run: ./scripts/codemod_docstrings.sh
165+
- name: Commit and push the changes
166+
if: ${{ success() }}
167+
run: |
168+
git commit -am "Sync macOS docstrings" --allow-empty
66169
67170
# Here we just reformat the codemodded stubs so that they are
68171
# consistent with the other typeshed stubs around them.
69172
# Typeshed formats code using black in their CI, so we just invoke
70173
# black on the stubs the same way that typeshed does.
71-
uvx --directory=typeshed pre-commit run -a black || true
72-
73-
rm -rf ruff/crates/ty_vendored/vendor/typeshed
74-
mkdir ruff/crates/ty_vendored/vendor/typeshed
75-
cp typeshed/README.md ruff/crates/ty_vendored/vendor/typeshed
76-
cp typeshed/LICENSE ruff/crates/ty_vendored/vendor/typeshed
77-
cp -r typeshed/stdlib ruff/crates/ty_vendored/vendor/typeshed/stdlib
78-
rm -rf ruff/crates/ty_vendored/vendor/typeshed/stdlib/@tests
79-
git -C typeshed rev-parse HEAD > ruff/crates/ty_vendored/vendor/typeshed/source_commit.txt
80-
- name: Commit the changes
81-
id: commit
82-
if: ${{ steps.sync.outcome == 'success' }}
83-
run: |
84-
cd ruff
85-
git checkout -b typeshedbot/sync-typeshed
86-
git add .
87-
git diff --staged --quiet || git commit -m "Sync typeshed. Source commit: https://github.com/python/typeshed/commit/$(git -C ../typeshed rev-parse HEAD)"
174+
uvx black "${VENDORED_TYPESHED}/stdlib" --config "${VENDORED_TYPESHED}/pyproject.toml" || true
175+
git commit -am "Format codemodded docstrings" --allow-empty
176+
177+
rm "${VENDORED_TYPESHED}/pyproject.toml"
178+
git commit -am "Remove pyproject.toml file"
179+
180+
git push
88181
- name: Create a PR
89-
if: ${{ steps.sync.outcome == 'success' && steps.commit.outcome == 'success' }}
182+
if: ${{ success() }}
90183
run: |
91-
cd ruff
92-
git push --force origin typeshedbot/sync-typeshed
93-
gh pr list --repo "$GITHUB_REPOSITORY" --head typeshedbot/sync-typeshed --json id --jq length | grep 1 && exit 0 # exit if there is existing pr
184+
gh pr list --repo "${GITHUB_REPOSITORY}" --head "${UPSTREAM_BRANCH}" --json id --jq length | grep 1 && exit 0 # exit if there is existing pr
94185
gh pr create --title "[ty] Sync vendored typeshed stubs" --body "Close and reopen this PR to trigger CI" --label "ty"
95186
96187
create-issue-on-failure:
97188
name: Create an issue if the typeshed sync failed
98189
runs-on: ubuntu-latest
99-
needs: [sync]
100-
if: ${{ github.repository == 'astral-sh/ruff' && always() && github.event_name == 'schedule' && needs.sync.result == 'failure' }}
190+
needs: [sync, docstrings-windows, docstrings-macos-and-pr]
191+
if: ${{ github.repository == 'astral-sh/ruff' && always() && github.event_name == 'schedule' && (needs.sync.result == 'failure' || needs.docstrings-windows.result == 'failure' || needs.docstrings-macos-and-pr.result == 'failure') }}
101192
permissions:
102193
issues: write
103194
steps:

.pre-commit-config.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ repos:
8181
pass_filenames: false # This makes it a lot faster
8282

8383
- repo: https://github.com/astral-sh/ruff-pre-commit
84-
rev: v0.12.3
84+
rev: v0.12.4
8585
hooks:
8686
- id: ruff-format
8787
- id: ruff
@@ -128,5 +128,10 @@ repos:
128128
# but the integration only works if shellcheck is installed
129129
- "github.com/wasilibs/go-shellcheck/cmd/shellcheck@v0.10.0"
130130

131+
- repo: https://github.com/shellcheck-py/shellcheck-py
132+
rev: v0.10.0.1
133+
hooks:
134+
- id: shellcheck
135+
131136
ci:
132137
skip: [cargo-fmt, dev-generate-all]

CHANGELOG.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,36 @@
11
# Changelog
22

3+
## 0.12.4
4+
5+
### Preview features
6+
7+
- \[`flake8-type-checking`, `pyupgrade`, `ruff`\] Add `from __future__ import annotations` when it would allow new fixes (`TC001`, `TC002`, `TC003`, `UP037`, `RUF013`) ([#19100](https://github.com/astral-sh/ruff/pull/19100))
8+
- \[`flake8-use-pathlib`\] Add autofix for `PTH109` ([#19245](https://github.com/astral-sh/ruff/pull/19245))
9+
- \[`pylint`\] Detect indirect `pathlib.Path` usages for `unspecified-encoding` (`PLW1514`) ([#19304](https://github.com/astral-sh/ruff/pull/19304))
10+
11+
### Bug fixes
12+
13+
- \[`flake8-bugbear`\] Fix `B017` false negatives for keyword exception arguments ([#19217](https://github.com/astral-sh/ruff/pull/19217))
14+
- \[`flake8-use-pathlib`\] Fix false negative on direct `Path()` instantiation (`PTH210`) ([#19388](https://github.com/astral-sh/ruff/pull/19388))
15+
- \[`flake8-django`\] Fix `DJ008` false positive for abstract models with type-annotated `abstract` field ([#19221](https://github.com/astral-sh/ruff/pull/19221))
16+
- \[`isort`\] Fix `I002` import insertion after docstring with multiple string statements ([#19222](https://github.com/astral-sh/ruff/pull/19222))
17+
- \[`isort`\] Treat form feed as valid whitespace before a semicolon ([#19343](https://github.com/astral-sh/ruff/pull/19343))
18+
- \[`pydoclint`\] Fix `SyntaxError` from fixes with line continuations (`D201`, `D202`) ([#19246](https://github.com/astral-sh/ruff/pull/19246))
19+
- \[`refurb`\] `FURB164` fix should validate arguments and should usually be marked unsafe ([#19136](https://github.com/astral-sh/ruff/pull/19136))
20+
21+
### Rule changes
22+
23+
- \[`flake8-use-pathlib`\] Skip single dots for `invalid-pathlib-with-suffix` (`PTH210`) on versions >= 3.14 ([#19331](https://github.com/astral-sh/ruff/pull/19331))
24+
- \[`pep8_naming`\] Avoid false positives on standard library functions with uppercase names (`N802`) ([#18907](https://github.com/astral-sh/ruff/pull/18907))
25+
- \[`pycodestyle`\] Handle brace escapes for t-strings in logical lines ([#19358](https://github.com/astral-sh/ruff/pull/19358))
26+
- \[`pylint`\] Extend invalid string character rules to include t-strings ([#19355](https://github.com/astral-sh/ruff/pull/19355))
27+
- \[`ruff`\] Allow `strict` kwarg when checking for `starmap-zip` (`RUF058`) in Python 3.14+ ([#19333](https://github.com/astral-sh/ruff/pull/19333))
28+
29+
### Documentation
30+
31+
- \[`flake8-type-checking`\] Make `TC010` docs example more realistic ([#19356](https://github.com/astral-sh/ruff/pull/19356))
32+
- Make more documentation examples error out-of-the-box ([#19288](https://github.com/astral-sh/ruff/pull/19288),[#19272](https://github.com/astral-sh/ruff/pull/19272),[#19291](https://github.com/astral-sh/ruff/pull/19291),[#19296](https://github.com/astral-sh/ruff/pull/19296),[#19292](https://github.com/astral-sh/ruff/pull/19292),[#19295](https://github.com/astral-sh/ruff/pull/19295),[#19297](https://github.com/astral-sh/ruff/pull/19297),[#19309](https://github.com/astral-sh/ruff/pull/19309))
33+
334
## 0.12.3
435

536
### Preview features

0 commit comments

Comments
 (0)