Skip to content

Fix subtest reruns with structured NodeId keys - #363

Merged
icemac merged 2 commits into
pytest-dev:masterfrom
janmrow:fix-subtest-nodeid-compatibility
Sep 8, 2026
Merged

icemac merged 2 commits into
pytest-dev:masterfrom
janmrow:fix-subtest-nodeid-compatibility

Conversation

@janmrow

@janmrow janmrow commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

pytest-dev/pytest#14758 changed how pytest stores node IDs internally: instead of strings, it now uses NodeId objects.

Because of this, the private failed_subtests mapping uses NodeId objects as keys.

pytest-rerunfailures was still looking up failed subtests using string .nodeid values. So that failed subtests were not rerun with newer pytest versions.

This change uses .id when NodeId is available, and falls back to .nodeid for older pytest versions.

Tested locally:

  • the full test suite passes with pytest 9.1.1 and pytest main at 431f3e1f5,
  • subtest regression tests pass,
  • related xdist/subtest tests pass.

Only the failed_subtests handling was changed. Other uses of .nodeid stay the same.

@icemac

icemac commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Thank you for this PR. 😃

@icemac
icemac merged commit 87a8b47 into pytest-dev:master Sep 8, 2026
44 checks passed
lukasmasuch pushed a commit to streamlit/streamlit that referenced this pull request Sep 21, 2026
…roup (#17052)

Bumps the python-testing group with 1 update:
[pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures).

Updates `pytest-rerunfailures` from 16.6.1 to 16.7
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst">pytest-rerunfailures's
changelog</a>.</em></p>
<blockquote>
<h2>16.7 (2026-09-17)</h2>
<p>Features
++++++++</p>
<ul>
<li>Allow configuring <code>only_rerun</code> regular expressions in
<code>pytest.ini</code> files.

(<code>[#165](pytest-dev/pytest-rerunfailures#165)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/165&gt;</code>_)</li>
<li>Show each rerun attempt and its final outcome in the rerun test
summary info
section.
(<code>[#191](pytest-dev/pytest-rerunfailures#191)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/191&gt;</code>_)</li>
<li>Allow flaky marker conditions to inspect the exception that caused a
failed
test phase, including when running with pytest-xdist.
(<code>[#230](pytest-dev/pytest-rerunfailures#230)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/230&gt;</code>_)</li>
</ul>
<p>Bug Fixes
+++++++++</p>
<ul>
<li>Match <code>only_rerun</code> against the full exception chain
(<code>__cause__</code> and
<code>__context__</code>), not only the outermost exception. Match
<code>rerun_except</code>
against explicit <code>__cause__</code> links only, so implicit
<code>except</code> /
<code>finally</code> context does not suppress reruns.
(<code>[#353](pytest-dev/pytest-rerunfailures#353)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/353&gt;</code>_)</li>
<li>Fix <code>INTERNALERROR</code> when <code>only_rerun</code> or
<code>rerun_except</code> is given a bare
exception class instead of a list.
(<code>[#362](pytest-dev/pytest-rerunfailures#362)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/362&gt;</code>_)</li>
<li>Fix subtest reruns with newer pytest versions that use structured
<code>NodeId</code>
values internally.
(<code>[#363](pytest-dev/pytest-rerunfailures#363)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/363&gt;</code>_)</li>
<li>Mark teardown failures from an attempt that is rerun as reruns, so a
later
successful attempt is not reported as an error.
(<code>[#366](pytest-dev/pytest-rerunfailures#366)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/366&gt;</code>_)</li>
</ul>
<p>Misc
++++</p>
<ul>
<li>Keep the test suite passing when pytest-randomly is installed,
including when
the outer pytest is started with <code>-p no:randomly</code>.
(<code>[#218](pytest-dev/pytest-rerunfailures#218)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/218&gt;</code>_)</li>
<li>Test the free-threaded Python 3.14 build in CI, via a new
<code>py314t</code> tox
environment and a matching workflow job.
(<code>[#361](pytest-dev/pytest-rerunfailures#361)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/361&gt;</code>_)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/fead4c656301dae378897a10b8e8998e52d6bb2c"><code>fead4c6</code></a>
Preparing release 16.7</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/ed62cfc3cafafc6d71bc97a9488cfa9f6601affb"><code>ed62cfc</code></a>
Show each rerun attempt outcome in summary (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/370">#370</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/64687c9511133582d6647f3864eb111c8d52f93a"><code>64687c9</code></a>
Add pytest.ini support for only_rerun (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/369">#369</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/1997015a4b7f334a5b2f55a2c953d5954ab53fce"><code>1997015</code></a>
Preserve rerun status for teardown failures (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/367">#367</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/4220386e845dafeec8ef2261ae31c33b54f2431a"><code>4220386</code></a>
Match only_rerun against wrapped exception causes (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/364">#364</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/87d81b2b0924a9c59a729826cd19c0e1b285a93f"><code>87d81b2</code></a>
Keep nested pytester sessions isolated from pytest-randomly (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/368">#368</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/be14a6bd94ec3da02a7ddfd20e5a7364188f587d"><code>be14a6b</code></a>
Allow flaky conditions to inspect failure exceptions (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/365">#365</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/78561a50e6b1afdca9c937d109750001599ff76d"><code>78561a5</code></a>
ci: test the free-threaded Python 3.14 build (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/361">#361</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/402afb4a4197de7a8f827b84f11a15f0b4ab1cdc"><code>402afb4</code></a>
Fix bare exception class in only_rerun / rerun_except causing
INTERNALERROR (...</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/87a8b47de931f859712a1496dc49ac6a5aeba41d"><code>87a8b47</code></a>
Fix subtest reruns with structured NodeId keys (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/363">#363</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-rerunfailures/compare/16.6.1...16.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pytest-rerunfailures&package-manager=uv&previous-version=16.6.1&new-version=16.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Lockfile-only upgrade of a dev/CI pytest plugin; no production code
changes, though CI flaky-test retry and reporting behavior may shift
slightly.
> 
> **Overview**
> Updates the **python-testing** dependency lock so
**pytest-rerunfailures** resolves to **16.7** instead of **16.6.1**
(sdist/wheel URLs and hashes in `uv.lock` only).
> 
> That release mainly improves pytest rerun behavior used in CI
(`--reruns` on Playwright jobs): configurable `only_rerun` in
`pytest.ini`, clearer per-attempt summary output, flaky conditions that
can inspect failure exceptions (including with xdist), and fixes for
exception-chain matching, bare exception classes causing
`INTERNALERROR`, subtest reruns with newer pytest, and teardown failures
on retried attempts.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
d459911. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
svazquezco added a commit to softwareone-platform/mpt-api-python-client that referenced this pull request Sep 21, 2026
Bumps the python-development group with 3 updates:
[pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures),
[ruff](https://github.com/astral-sh/ruff) and
[wemake-python-styleguide](https://github.com/wemake-services/wemake-python-styleguide).

Updates `pytest-rerunfailures` from 16.6.1 to 16.7
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst">pytest-rerunfailures's
changelog</a>.</em></p>
<blockquote>
<h2>16.7 (2026-09-17)</h2>
<p>Features
++++++++</p>
<ul>
<li>Allow configuring <code>only_rerun</code> regular expressions in
<code>pytest.ini</code> files.

(<code>[#165](pytest-dev/pytest-rerunfailures#165)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/165&gt;</code>_)</li>
<li>Show each rerun attempt and its final outcome in the rerun test
summary info
section.
(<code>[#191](pytest-dev/pytest-rerunfailures#191)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/191&gt;</code>_)</li>
<li>Allow flaky marker conditions to inspect the exception that caused a
failed
test phase, including when running with pytest-xdist.
(<code>[#230](pytest-dev/pytest-rerunfailures#230)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/230&gt;</code>_)</li>
</ul>
<p>Bug Fixes
+++++++++</p>
<ul>
<li>Match <code>only_rerun</code> against the full exception chain
(<code>__cause__</code> and
<code>__context__</code>), not only the outermost exception. Match
<code>rerun_except</code>
against explicit <code>__cause__</code> links only, so implicit
<code>except</code> /
<code>finally</code> context does not suppress reruns.
(<code>[#353](pytest-dev/pytest-rerunfailures#353)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/353&gt;</code>_)</li>
<li>Fix <code>INTERNALERROR</code> when <code>only_rerun</code> or
<code>rerun_except</code> is given a bare
exception class instead of a list.
(<code>[#362](pytest-dev/pytest-rerunfailures#362)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/362&gt;</code>_)</li>
<li>Fix subtest reruns with newer pytest versions that use structured
<code>NodeId</code>
values internally.
(<code>[#363](pytest-dev/pytest-rerunfailures#363)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/363&gt;</code>_)</li>
<li>Mark teardown failures from an attempt that is rerun as reruns, so a
later
successful attempt is not reported as an error.
(<code>[#366](pytest-dev/pytest-rerunfailures#366)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/366&gt;</code>_)</li>
</ul>
<p>Misc
++++</p>
<ul>
<li>Keep the test suite passing when pytest-randomly is installed,
including when
the outer pytest is started with <code>-p no:randomly</code>.
(<code>[#218](pytest-dev/pytest-rerunfailures#218)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/218&gt;</code>_)</li>
<li>Test the free-threaded Python 3.14 build in CI, via a new
<code>py314t</code> tox
environment and a matching workflow job.
(<code>[#361](pytest-dev/pytest-rerunfailures#361)
&lt;https://github.com/pytest-dev/pytest-rerunfailures/issues/361&gt;</code>_)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/fead4c656301dae378897a10b8e8998e52d6bb2c"><code>fead4c6</code></a>
Preparing release 16.7</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/ed62cfc3cafafc6d71bc97a9488cfa9f6601affb"><code>ed62cfc</code></a>
Show each rerun attempt outcome in summary (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/370">#370</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/64687c9511133582d6647f3864eb111c8d52f93a"><code>64687c9</code></a>
Add pytest.ini support for only_rerun (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/369">#369</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/1997015a4b7f334a5b2f55a2c953d5954ab53fce"><code>1997015</code></a>
Preserve rerun status for teardown failures (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/367">#367</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/4220386e845dafeec8ef2261ae31c33b54f2431a"><code>4220386</code></a>
Match only_rerun against wrapped exception causes (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/364">#364</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/87d81b2b0924a9c59a729826cd19c0e1b285a93f"><code>87d81b2</code></a>
Keep nested pytester sessions isolated from pytest-randomly (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/368">#368</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/be14a6bd94ec3da02a7ddfd20e5a7364188f587d"><code>be14a6b</code></a>
Allow flaky conditions to inspect failure exceptions (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/365">#365</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/78561a50e6b1afdca9c937d109750001599ff76d"><code>78561a5</code></a>
ci: test the free-threaded Python 3.14 build (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/361">#361</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/402afb4a4197de7a8f827b84f11a15f0b4ab1cdc"><code>402afb4</code></a>
Fix bare exception class in only_rerun / rerun_except causing
INTERNALERROR (...</li>
<li><a
href="https://github.com/pytest-dev/pytest-rerunfailures/commit/87a8b47de931f859712a1496dc49ac6a5aeba41d"><code>87a8b47</code></a>
Fix subtest reruns with structured NodeId keys (<a
href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/363">#363</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-rerunfailures/compare/16.6.1...16.7">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.16.7 to 0.16.8
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.16.8</h2>
<h2>Release Notes</h2>
<p>Released on 2026-09-16.</p>
<h3>Bug fixes</h3>
<ul>
<li>Visit functional <code>TypedDict</code> keyword arguments correctly
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/28584">#28584</a>)</li>
<li>[<code>flake8-simplify</code>] Detect nested <code>async with</code>
under sync parent (<code>SIM117</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27821">#27821</a>)</li>
<li>[<code>flake8-simplify</code>] Preserve operand order in
<code>SIM109</code> fix (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27824">#27824</a>)</li>
<li>[<code>pyupgrade</code>] Preserve required parentheses in multiline
<code>UP040</code> fixes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28164">#28164</a>)</li>
<li>[<code>pyupgrade</code>] Skip <code>TypeVarTuple</code> and
<code>ParamSpec</code> conversions with bounds or constraints
(<code>UP040</code>, <code>UP046</code>, <code>UP047</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28505">#28505</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>Add support for <code>__lazy_modules__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28459">#28459</a>)</li>
<li>Recognize PEP-728 <code>TypedDict</code> class keywords (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28533">#28533</a>)</li>
<li>Recognize quoted types in <code>typing.TypeForm</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28507">#28507</a>)</li>
<li>Support conditional assignment to <code>__lazy_modules__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28491">#28491</a>)</li>
<li>[<code>flake8-type-checking</code>] Prefer lazy imports over
<code>TYPE_CHECKING</code> on Python 3.15 and later (<code>TC001</code>,
<code>TC002</code>, <code>TC003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28541">#28541</a>)</li>
<li>[<code>pyupgrade</code>] Make the fix for <code>UP040</code> always
unsafe (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28526">#28526</a>)</li>
<li>[<code>pyupgrade</code>] Stop recommending deprecated
<code>ByteString</code> aliases (<code>UP035</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28498">#28498</a>)</li>
<li>[<code>ruff</code>, <code>flake8-use-pathlib</code>] Recognize the
<code>parent_mode</code> argument (<code>RUF064</code>,
<code>PTH103</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28528">#28528</a>)</li>
<li>[<code>ruff</code>] Detect <code>\Z</code> in
<code>pytest.raises()</code> match patterns (<code>RUF043</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28598">#28598</a>)</li>
</ul>
<h3>CLI</h3>
<ul>
<li>Use rule name and code in formatter incompatibility warnings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28571">#28571</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>[<code>flake8-tidy-imports</code>] Add
<code>extend-banned-api</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28644">#28644</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/VedantMadane"><code>@​VedantMadane</code></a></li>
<li><a href="https://github.com/alzeph"><code>@​alzeph</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a
href="https://github.com/fredrikblau"><code>@​fredrikblau</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
<li><a href="https://github.com/zsol"><code>@​zsol</code></a></li>
<li><a
href="https://github.com/Aniket-a14"><code>@​Aniket-a14</code></a></li>
<li><a href="https://github.com/r-b-1"><code>@​r-b-1</code></a></li>
</ul>
<h2>Install ruff 0.16.8</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://releases.astral.sh/github/ruff/releases/download/0.16.8/ruff-installer.sh
| sh
&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.16.8</h2>
<p>Released on 2026-09-16.</p>
<h3>Bug fixes</h3>
<ul>
<li>Visit functional <code>TypedDict</code> keyword arguments correctly
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/28584">#28584</a>)</li>
<li>[<code>flake8-simplify</code>] Detect nested <code>async with</code>
under sync parent (<code>SIM117</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27821">#27821</a>)</li>
<li>[<code>flake8-simplify</code>] Preserve operand order in
<code>SIM109</code> fix (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27824">#27824</a>)</li>
<li>[<code>pyupgrade</code>] Preserve required parentheses in multiline
<code>UP040</code> fixes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28164">#28164</a>)</li>
<li>[<code>pyupgrade</code>] Skip <code>TypeVarTuple</code> and
<code>ParamSpec</code> conversions with bounds or constraints
(<code>UP040</code>, <code>UP046</code>, <code>UP047</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28505">#28505</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>Add support for <code>__lazy_modules__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28459">#28459</a>)</li>
<li>Recognize PEP-728 <code>TypedDict</code> class keywords (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28533">#28533</a>)</li>
<li>Recognize quoted types in <code>typing.TypeForm</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28507">#28507</a>)</li>
<li>Support conditional assignment to <code>__lazy_modules__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28491">#28491</a>)</li>
<li>[<code>flake8-type-checking</code>] Prefer lazy imports over
<code>TYPE_CHECKING</code> on Python 3.15 and later (<code>TC001</code>,
<code>TC002</code>, <code>TC003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28541">#28541</a>)</li>
<li>[<code>pyupgrade</code>] Make the fix for <code>UP040</code> always
unsafe (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28526">#28526</a>)</li>
<li>[<code>pyupgrade</code>] Stop recommending deprecated
<code>ByteString</code> aliases (<code>UP035</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28498">#28498</a>)</li>
<li>[<code>ruff</code>, <code>flake8-use-pathlib</code>] Recognize the
<code>parent_mode</code> argument (<code>RUF064</code>,
<code>PTH103</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28528">#28528</a>)</li>
<li>[<code>ruff</code>] Detect <code>\Z</code> in
<code>pytest.raises()</code> match patterns (<code>RUF043</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28598">#28598</a>)</li>
</ul>
<h3>CLI</h3>
<ul>
<li>Use rule name and code in formatter incompatibility warnings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28571">#28571</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>[<code>flake8-tidy-imports</code>] Add
<code>extend-banned-api</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28644">#28644</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/VedantMadane"><code>@​VedantMadane</code></a></li>
<li><a href="https://github.com/alzeph"><code>@​alzeph</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a
href="https://github.com/fredrikblau"><code>@​fredrikblau</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
<li><a href="https://github.com/zsol"><code>@​zsol</code></a></li>
<li><a
href="https://github.com/Aniket-a14"><code>@​Aniket-a14</code></a></li>
<li><a href="https://github.com/r-b-1"><code>@​r-b-1</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/astral-sh/ruff/commit/62914c4b9b79a9e5004374a9c482ad2ed69290e1"><code>62914c4</code></a>
Bump version to 0.16.8 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28648">#28648</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/c47e0cdc665f56536ce7f7a8ac40fa0ff3f79482"><code>c47e0cd</code></a>
[ty] Bound aliased intersection expansion during inference (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28546">#28546</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/ff4747b509ab4fffbe5689fcae39caa7503d1dcf"><code>ff4747b</code></a>
renovate: update uv hashes correctly with setup-uv (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28621">#28621</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/94efeaa28630d80b2a74adf3c3963de99ed4ee29"><code>94efeaa</code></a>
[ty] Compact reachable binding and declaration histories (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28349">#28349</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/50020fb1e8aa83b0826fa6f5f33a1e93c10cc60e"><code>50020fb</code></a>
[ty] Avoid storing constraint nodes twice (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28375">#28375</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/446bb68da50014bb75f5ce1504a80c5883e3b0b2"><code>446bb68</code></a>
[ty] Compare bound-method receivers before signatures (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28384">#28384</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/304ab86be5de6507e276ab09f5b43f44aeb92469"><code>304ab86</code></a>
[<code>flake8-type-checking</code>] Prefer lazy imports over
<code>TYPE_CHECKING</code> on 3.15+ (`...</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/d940b244f7512427b0d87c7953e88c60e69f9bdf"><code>d940b24</code></a>
[ty] Watch script dependencies in CLI watch mode (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28125">#28125</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/fe9f065a504127b11da72c2ff6d7813ddf3ce8ac"><code>fe9f065</code></a>
[flake8-tidy-imports] Add <code>extend-banned-api</code> (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28644">#28644</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/31131db44f057cce68fa6b95552b7db54167b0b3"><code>31131db</code></a>
[ty] Support <code>type[A &amp; B]</code> (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27124">#27124</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.16.7...0.16.8">compare
view</a></li>
</ul>
</details>
<br />

Updates `wemake-python-styleguide` from 1.8.0 to 1.8.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/wemake-services/wemake-python-styleguide/releases">wemake-python-styleguide's
releases</a>.</em></p>
<blockquote>
<h2>Version 1.8.1</h2>
<h2>What's Changed</h2>
<h3>Bugfixes</h3>
<ul>
<li>Count overused str and bytes separately for <code>WPS226</code>, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3782">#3782</a></li>
<li>Do not count docstrings for <code>WPS226</code>, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3803">#3803</a></li>
<li>Do not count attribute and type alias docstrings for
<code>WPS226</code>, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3805">#3805</a></li>
<li>Adds direct links to violations when searching by code, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3790">#3790</a></li>
</ul>
<h3>Misc</h3>
<ul>
<li>Fixed claude skill definition and metadata, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3780">#3780</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/TokenStyle"><code>@​TokenStyle</code></a> made
their first contribution in <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/pull/3784">wemake-services/wemake-python-styleguide#3784</a></li>
<li><a
href="https://github.com/webdevsamran"><code>@​webdevsamran</code></a>
made their first contribution in <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/pull/3794">wemake-services/wemake-python-styleguide#3794</a></li>
<li><a
href="https://github.com/AndreyGatsuk"><code>@​AndreyGatsuk</code></a>
made their first contribution in <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/pull/3792">wemake-services/wemake-python-styleguide#3792</a></li>
<li><a href="https://github.com/vyhuholl"><code>@​vyhuholl</code></a>
made their first contribution in <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/pull/3804">wemake-services/wemake-python-styleguide#3804</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/wemake-services/wemake-python-styleguide/compare/1.8.0...1.8.1">https://github.com/wemake-services/wemake-python-styleguide/compare/1.8.0...1.8.1</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/wemake-services/wemake-python-styleguide/blob/master/CHANGELOG.md">wemake-python-styleguide's
changelog</a>.</em></p>
<blockquote>
<h2>1.8.1</h2>
<h3>Bugfixes</h3>
<ul>
<li>Count overused str and bytes separately for <code>WPS226</code>, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3782">#3782</a></li>
<li>Do not count docstrings for <code>WPS226</code>, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3803">#3803</a></li>
<li>Do not count attribute and type alias docstrings for
<code>WPS226</code>, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3805">#3805</a></li>
<li>Adds direct links to violations when searching by code, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3790">#3790</a></li>
</ul>
<h3>Misc</h3>
<ul>
<li>Fixed claude skill definition and metadata, <a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3780">#3780</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/7ae4ac712e133cdda143729e17f5fdcf2ed744bf"><code>7ae4ac7</code></a>
Version 1.8.1 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3809">#3809</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/88e8395295729c4f38ee5e19e25513274bc96ba4"><code>88e8395</code></a>
Do not count attribute docstrings for WPS226 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3806">#3806</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/b841755197231e26af00dd0a09698a715387d0b5"><code>b841755</code></a>
chore(deps-dev): bump ruff from 0.16.5 to 0.16.6 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3807">#3807</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/0ee6dc93e0646b31417cadfbc96080d7cd59041b"><code>0ee6dc9</code></a>
Do not count docstrings for WPS226 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3804">#3804</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/6e0b6b4c33c409a197d651f0dcfeced6798479c0"><code>6e0b6b4</code></a>
chore(deps-dev): bump lxml from 6.1.2 to 6.1.3 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3802">#3802</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/aec757b47ee802032ff44588c007689e28f3fbac"><code>aec757b</code></a>
chore(deps-dev): bump sphinxcontrib-mermaid from 2.1.0 to 2.1.1 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3800">#3800</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/fdd37895109c0591b4fba0e806be5bd1c20f71b4"><code>fdd3789</code></a>
chore(deps-dev): bump pytest-randomly from 4.1.0 to 5.0.0 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3801">#3801</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/42ffc0684bdae3ee159ed48655d96fcb181632e9"><code>42ffc06</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3799">#3799</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/9960e2ce189b414cc4766f95d6f8b710019a2fa9"><code>9960e2c</code></a>
chore(deps): bump reagento/relator from 1.7.0 to 1.7.1 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3796">#3796</a>)</li>
<li><a
href="https://github.com/wemake-services/wemake-python-styleguide/commit/1e8f17b27fc60266f65e0cc560378c17365ba764"><code>1e8f17b</code></a>
chore(deps-dev): bump import-linter from 2.13 to 2.14 (<a
href="https://redirect.github.com/wemake-services/wemake-python-styleguide/issues/3797">#3797</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/wemake-services/wemake-python-styleguide/compare/1.8.0...1.8.1">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants