Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pytest-xdist breaks asyncio-based code expecting to be run in the main thread #620

Closed
webknjaz opened this issue Jan 25, 2021 · 39 comments · Fixed by #1027
Closed

pytest-xdist breaks asyncio-based code expecting to be run in the main thread #620

webknjaz opened this issue Jan 25, 2021 · 39 comments · Fixed by #1027

Comments

@webknjaz
Copy link
Member

When asyncio-based software needs to register signal handlers, calling add_signal_handler() only works when the current thread is main and raises a RuntimeError otherwise.

When I first tried integrating pytest-xdist into aiohttp's test suite a few years ago, we've faced a problem that about 15% of pytest invocations would hit this and had to disable the plugin:

The reproducer is to clone aio-libs/aiohttp, add -n auto to addopts somewhere in setup.cfg, and re-run make test until you see the traceback. On aiohttp side, it's coming from the watcher.attach_loop() call invoked from the pytest plugin @ https://github.com/aio-libs/aiohttp/blob/742a8b6/aiohttp/pytest_plugin.py#L161.

Now that I've had some time to try to debug what's happening, I've stuck a debugger right before the line that raises RuntimeError and confirmed that the thread wasn't main:

>>> import threading
>>> threading.enumerate()
[<_MainThread(MainThread, started 140666216200000)>, <_DummyThread(Dummy-1, started daemon 140666196751936)>]
>>> threading.current_thread()
<_DummyThread(Dummy-1, started daemon                 
140666196751936)>

@asvetlov It should be possible to fix this on the asyncio side with ThreadedChildWatcher (https://bugs.python.org/issue35621 / python/cpython#14344) but it only appeared in the stdlib since Python 3.8: https://stackoverflow.com/a/58614689/595220.

It's hard to pinpoint where that thread is coming from but it appears to be execnet's fault:

self.group = execnet.Group()
+ https://github.com/pytest-dev/execnet/blob/116637ab183bc078647f281b52e662650e8178e7/execnet/multi.py#L27.

@nicoddemus do you have any insight into this? I'm rather lost at this point. Is there any way to avoid this race condition?

@RonnyPfannschmidt
Copy link
Member

This is a issue that was Int to execnet with the addition of thread models for gevent /eventlet.

A workaround is to downgrade execnet.

Execnet currently is unmaintained.

@webknjaz
Copy link
Member Author

I tried looking into it and thought that maybe using hasprimary=True would help (https://github.com/pytest-dev/execnet/blob/116637a/execnet/gateway_base.py#L165) but it just gets stuck on worker allocation...

@RonnyPfannschmidt is there a known execnet version I need to downgrade to?

@webknjaz
Copy link
Member Author

webknjaz commented Jan 25, 2021

Tried execnet<1.2 but that's too old for modern Pythons and it explodes trying to call deprecated isAlive().

Sounds like we'll need a backport of ThreadedChildWatcher after all.

@RonnyPfannschmidt do you think there's any reasonable way to have a fixture forcing xdist to bypass scheduling a specific test in workers and just execute it in the main process?

@RonnyPfannschmidt
Copy link
Member

When using xdist, no test run in the main process

@graingert
Copy link
Member

arn't tests in xdist workers also run in only the main thread?

@RonnyPfannschmidt
Copy link
Member

So there is no reasonable way

@graingert
Copy link
Member

I've stuck a debugger right before the line that raises RuntimeError and confirmed that the thread wasn't main:

@webknjaz which process was running the breakpoint()? the xdist leader or an xdist worker?

you should be able to track the stack of what created the <_DummyThread(Dummy-1, started daemon 140666196751936)> with tracemalloc

@RonnyPfannschmidt
Copy link
Member

@graingert an addition to execnet broke that assumption

@graingert
Copy link
Member

@RonnyPfannschmidt do you have a link to the commit that introduced it?

@RonnyPfannschmidt
Copy link
Member

Not right now, I'm on mobile atm, and no longer a maintainer for execnet

@webknjaz
Copy link
Member Author

@graingert can't do that right now but I think the thread is spawned by this call https://github.com/pytest-dev/execnet/blob/116637ab183bc078647f281b52e662650e8178e7/execnet/gateway_base.py#L315

@graingert
Copy link
Member

graingert commented Jan 25, 2021

so it looks like pytest-xdist will run tests on the main thread almost all the time, it's only if there are concurrent remote_exec calls that execnet will actually spawn a thread, eg we always want to hit: https://github.com/pytest-dev/execnet/blob/116637ab183bc078647f281b52e662650e8178e7/execnet/gateway_base.py#L299-L302

so I had a look around for places that remote_exec is called without an associated wait_close, and only found:

diff --git a/execnet/gateway.py b/execnet/gateway.py
index 8e2c1de..8a0da92 100644
--- a/execnet/gateway.py
+++ b/execnet/gateway.py
@@ -75,7 +75,10 @@ class Gateway(gateway_base.BaseGateway):
         """ return some sys/env information from remote. """
         if update or not hasattr(self, "_cache_rinfo"):
             ch = self.remote_exec(rinfo_source)
-            self._cache_rinfo = RInfo(ch.receive())
+            try:
+                self._cache_rinfo = RInfo(ch.receive())
+            finally:
+                ch.wait_close()
         return self._cache_rinfo
 
     def hasreceiver(self):
-- 
2.30.0

maybe this patch will help?

@webknjaz
Copy link
Member Author

Maybe, to verify that we'd have to run a lot of parallel pytest invocations with the "is main thread" check. I'll try to do this when I have a minute.

@graingert
Copy link
Member

@webknjaz
Copy link
Member Author

maybe this patch will help?

@graingert
This patch breaks everything:

INTERNALERROR> AttributeError: 'Channel' object has no attribute 'wait_close'

@graingert
Copy link
Member

graingert commented Jan 26, 2021

@webknjaz sorry that's a typo it's waitclose()

diff --git a/execnet/gateway.py b/execnet/gateway.py
index 8e2c1de..8a0da92 100644
--- a/execnet/gateway.py
+++ b/execnet/gateway.py
@@ -75,7 +75,10 @@ class Gateway(gateway_base.BaseGateway):
         """ return some sys/env information from remote. """
         if update or not hasattr(self, "_cache_rinfo"):
             ch = self.remote_exec(rinfo_source)
-            self._cache_rinfo = RInfo(ch.receive())
+            try:
+                self._cache_rinfo = RInfo(ch.receive())
+            finally:
+                ch.waitclose()
         return self._cache_rinfo
 
     def hasreceiver(self):
-- 
2.30.0

@webknjaz
Copy link
Member Author

@graingert that last patch seems to fix this.

@graingert
Copy link
Member

@webknjaz I don't think it's quite right, because there's a very small window between when the channel is closed and the primary_thread_task_ready semaphore is set

but it should improve things a lot

graingert added a commit to graingert/execnet that referenced this issue Jan 26, 2021
graingert added a commit to graingert/execnet that referenced this issue Jan 26, 2021
@graingert
Copy link
Member

Related to pytest-dev/execnet#96

@mattgodbolt
Copy link

mattgodbolt commented Mar 25, 2021

Hey folks. Apologies, this is a cross-post from the execnet issue, but here for visibility:

wondered if this issue might explain a super-intermittant issue we see.

We're using xdist 1.32, and execnet 1.7.1.

In async tests super rarely we get errors saying RuntimeError: There is no current event loop in thread 'Dummy-1' - which I've traced back to the tests not running on the main thread (and thus not having a default event loop). It seems like this is the same issue - a rare case where tests get run on the "wrong" thread.

Would you concur, and do you have any advice for how to work around it? Thanks in advance.

zmedico added a commit to zmedico/pytest-xdist that referenced this issue Feb 16, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
proposed in pytest-dev/execnet#243, so this
patch should not be merged until there is a release version of execnet
supporting the main_thread_only execmodel.

Closes: pytest-dev#620
@zmedico
Copy link
Contributor

zmedico commented Feb 16, 2024

I have a proposed solution for this issue in pytest-dev/execnet#243 and I'm getting positive results when I patch pytest-xdist to use it.

zmedico added a commit to zmedico/pytest-xdist that referenced this issue Feb 25, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
proposed in pytest-dev/execnet#243, so this
patch should not be merged until there is a release version of execnet
supporting the main_thread_only execmodel.

Closes: pytest-dev#620
zmedico added a commit to zmedico/pytest-xdist that referenced this issue Feb 25, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
proposed in pytest-dev/execnet#243, so this
patch should not be merged until there is a release version of execnet
supporting the main_thread_only execmodel.

Closes: pytest-dev#620
zmedico added a commit to zmedico/pytest-xdist that referenced this issue Feb 25, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
merged to the execnet master branch via pytest-dev/execnet#243, so this
patch should not be merged until there is a released version of execnet
supporting the main_thread_only execmodel.

Also increase minimum python version to 3.8 since execnet dropped 3.7
support in pytest-dev/execnet#245.

Closes: pytest-dev#620
zmedico added a commit to zmedico/pytest-xdist that referenced this issue Feb 25, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
merged to the execnet master branch via pytest-dev/execnet#243, so this
patch should not be merged until there is a released version of execnet
supporting the main_thread_only execmodel.

Also increase minimum python version to 3.8 since execnet dropped 3.7
support in pytest-dev/execnet#245.

Closes: pytest-dev#620
zmedico added a commit to zmedico/pytest-xdist that referenced this issue Apr 8, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
merged to the execnet master branch via pytest-dev/execnet#243, so this
patch should not be merged until there is a released version of execnet
supporting the main_thread_only execmodel.

Closes: pytest-dev#620
bmwiedemann pushed a commit to bmwiedemann/openSUSE that referenced this issue Apr 9, 2024
https://build.opensuse.org/request/show/1165943
by user dirkmueller + anag+factory
- update to 2.1.0:
  * #243: Added main_thread_only execmodel which is derived from
    the thread execmodel and only executes remote_exec calls in the
    main thread.
  * Callers of remote_exec must use the returned channel to wait
    for a task to complete before they call remote_exec again,
    otherwise the remote_exec call will fail with a concurrent
    remote_exec would cause deadlock error. The main_thread_only
    execmodel provides solutions for #96 and
    pytest-dev/pytest-xdist#620 (pending a new pytest-xdist
    release).
  * Also fixed init_popen_io to use closefd=False for shared stdin
    and stdout file descriptors, preventing Bad file descriptor
    errors triggered by test_stdouterrin_setnull.
  * The library is now typed and the typing is exposed to
    type-checkers.
potiuk added a commit to potiuk/airflow that referenced this issue Apr 12, 2024
The WASB blob tests started to fail intermittently after retries were
implemented in apache#38910. Without understanding all the details, it
seems that the async tests run in xdist mode of tests suffer from the
bug of pytest-xdist - because the thread that runs some of the tests
is not main and it likely interferes with signals handling and is
likely an incarnation of
pytest-dev/pytest-xdist#620
(which still needs to be solved in pytest-xdist)

Since those two tests that keeps on failing intermittently and the other
tests have been marked as db_test - likely for the same reason, we
should simply mark all the module as db_test to avoid the interference.
potiuk added a commit to apache/airflow that referenced this issue Apr 12, 2024
The WASB blob tests started to fail intermittently after retries were
implemented in #38910. Without understanding all the details, it
seems that the async tests run in xdist mode of tests suffer from the
bug of pytest-xdist - because the thread that runs some of the tests
is not main and it likely interferes with signals handling and is
likely an incarnation of
pytest-dev/pytest-xdist#620
(which still needs to be solved in pytest-xdist)

Since those two tests that keeps on failing intermittently and the other
tests have been marked as db_test - likely for the same reason, we
should simply mark all the module as db_test to avoid the interference.
zmedico added a commit to zmedico/pytest-xdist that referenced this issue Apr 17, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
merged to the execnet master branch via pytest-dev/execnet#243, so this
patch should not be merged until there is a released version of execnet
supporting the main_thread_only execmodel.

Closes: pytest-dev#620
zmedico added a commit to zmedico/pytest-xdist that referenced this issue Apr 17, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
merged to the execnet master branch via pytest-dev/execnet#243, so this
patch should not be merged until there is a released version of execnet
supporting the main_thread_only execmodel.

Closes: pytest-dev#620
nicoddemus pushed a commit to zmedico/pytest-xdist that referenced this issue Apr 19, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
merged to the execnet master branch via pytest-dev/execnet#243, so this
patch should not be merged until there is a released version of execnet
supporting the main_thread_only execmodel.

Closes: pytest-dev#620
nicoddemus pushed a commit that referenced this issue Apr 19, 2024
Use the execnet main_thread_only execmodel so that code which expects
to run in the main thread will just work.  This execmodel has been
merged to the execnet master branch via pytest-dev/execnet#243, so this
patch should not be merged until there is a released version of execnet
supporting the main_thread_only execmodel.

Closes #620
@nicoddemus
Copy link
Member

This will be available in the next release. 👍

@webknjaz
Copy link
Member Author

FTR the new release of pytest-xdist 3.6.0 explodes in a project that does not use async: #1070 (comment). It seems like it brings some compatibility issues with pytest itself or pytest-cov (which I also see being mentioned in the traceback)...

renovate bot referenced this issue in ixm-one/pytest-cmake-presets Apr 19, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pytest-xdist](https://togithub.com/pytest-dev/pytest-xdist)
([changelog](https://pytest-xdist.readthedocs.io/en/latest/changelog.html))
| `3.5.0` -> `3.6.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest-xdist/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest-xdist/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest-xdist/3.5.0/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest-xdist/3.5.0/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pytest-dev/pytest-xdist (pytest-xdist)</summary>

###
[`v3.6.0`](https://togithub.com/pytest-dev/pytest-xdist/blob/HEAD/CHANGELOG.rst#pytest-xdist-360-2024-04-19)

[Compare
Source](https://togithub.com/pytest-dev/pytest-xdist/compare/v3.5.0...v3.6.0)

\===============================

## Features

- `#&#8203;1027
<https://github.com/pytest-dev/pytest-xdist/pull/1027>`\_:`pytest-xdist`
workers now always execute the tests in the main thread.
Previously some tests might end up executing in a separate thread other
than `main` in the workers, due to some internal ` execnet`` details.
This can cause problems specially with async frameworks where the event
loop is running in the ``main`` thread (for example
`[#&#8203;620](https://togithub.com/pytest-dev/pytest-xdist/issues/620)
[#&#8203;620](https://togithub.com/pytest-dev/pytest-xdist/issues/620)\`\__).

## Bug Fixes

- `#&#8203;1024
<https://github.com/pytest-dev/pytest-xdist/issues/1024>`\_: Added
proper handling of `shouldstop` (such as set by `--max-fail`) and
`shouldfail` conditions in workers.
Previously, a worker might have continued executing further tests before
the controller could terminate the session.

- `#&#8203;1028
<https://github.com/pytest-dev/pytest-xdist/issues/1028>`\_: Fixed
compatibility issue between `looponfail` and editable installs.

- `#&#8203;620
<https://github.com/pytest-dev/pytest-xdist/issues/620>`\_: Use the new
`main_thread_only` `execnet` "execmodel" so that code which expects to
only run in the main thread will now work as expected.

- `#&#8203;937
<https://github.com/pytest-dev/pytest-xdist/issues/937>`\_: Fixed a bug
where plugin would raise an incompatibility error with `--pdb` despite
using `-n0`.

## Removals

- `#&#8203;1053
<https://github.com/pytest-dev/pytest-xdist/issues/1053>`\_: Dropped
support for Python 3.7.

- `#&#8203;1057
<https://github.com/pytest-dev/pytest-xdist/issues/1057>`\_:
pytest>=7.0.0 is now required.

    execnet>=2.1.0 is now required.

## Trivial Changes

- `#&#8203;1020
<https://github.com/pytest-dev/pytest-xdist/issues/1020>`\_:
pytest-xdist's `setup.py` file is removed.

If you relied on this file, e.g. to install pytest using `setup.py
install`,
please see `Why you shouldn't invoke setup.py directly
<https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html#summary>`\_
for alternatives.

- `#&#8203;1057
<https://github.com/pytest-dev/pytest-xdist/issues/1057>`\_: The
internals of pytest-xdist are now fully typed. The typing is not exposed
yet.

- `#&#8203;996
<https://github.com/pytest-dev/pytest-xdist/issues/996>`\_: Adjusted
license file format and content to ensure security scanners will
identity the license.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, 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 has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/ixm-one/pytest-cmake-presets).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMDEuNCIsInVwZGF0ZWRJblZlciI6IjM3LjMwMS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZTpkZXBlbmRlbmNpZXMiXX0=-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@zmedico
Copy link
Contributor

zmedico commented Apr 19, 2024

FTR the new release of pytest-xdist 3.6.0 explodes in a project that does not use async: #1070 (comment). It seems like it brings some compatibility issues with pytest itself or pytest-cov (which I also see being mentioned in the traceback)...

This looks like a pretty small issue. In pytest-cov it calls node.gateway._rinfo() and this method triggers a deadlock error for the main_thread_only execmodel when the gateway is already busy with another remote_exec call, since _rinfo calls remote_exec here:

https://github.com/pytest-dev/execnet/blob/v2.1.1/src/execnet/gateway.py#L85

The Gateway _rinfo method can be implemented in a way that does not acquire the main thread.

In pytest-dev/execnet#274 I've fixed the Gateway __init__ method to call _rinfo in order to cache the result for later, before the other remote_exec call has started.

github-actions bot added a commit to mikelane/reddit-get that referenced this issue Apr 29, 2024
Bumps [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) from
3.5.0 to 3.6.1.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-xdist/blob/master/CHANGELOG.rst">pytest-xdist's
changelog</a>.</em></p>
<blockquote>
<h1>pytest-xdist 3.6.1 (2024-04-28)</h1>
<h2>Bug Fixes</h2>
<ul>

<li><code>[#1071](pytest-dev/pytest-xdist#1071)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1071&gt;</code>_:
Add backward compatibility for deadlock issue with the
<code>execnet</code> new <code>main_thread_only</code>
&quot;execmodel&quot; triggered when pytest-cov accesses rinfo.</li>
</ul>
<h1>pytest-xdist 3.6.0 (2024-04-19)</h1>
<p>This release was YANKED due to a regression fixed in 3.6.1.</p>
<h2>Features</h2>
<ul>

<li><code>[#1027](pytest-dev/pytest-xdist#1027)
&lt;https://github.com/pytest-dev/pytest-xdist/pull/1027&gt;</code>_:<code>pytest-xdist</code>
workers now always execute the tests in the main thread.
Previously some tests might end up executing in a separate thread other
than <code>main</code> in the workers, due to some internal
<code>execnet`` details. This can cause problems specially with async
frameworks where the event loop is running in the ``main`` thread (for
example </code><a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/620">#620</a>
<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/620">pytest-dev/pytest-xdist#620</a>`__).</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>

<p><code>[#1024](pytest-dev/pytest-xdist#1024)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1024&gt;</code>_:
Added proper handling of <code>shouldstop</code> (such as set by
<code>--max-fail</code>) and <code>shouldfail</code> conditions in
workers.
Previously, a worker might have continued executing further tests before
the controller could terminate the session.</p>
</li>
<li>

<p><code>[#1028](pytest-dev/pytest-xdist#1028)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1028&gt;</code>_:
Fixed compatibility issue between <code>looponfail</code> and editable
installs.</p>
</li>
<li>
<p><code>[#620](pytest-dev/pytest-xdist#620)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/620&gt;</code>_:
Use the new <code>main_thread_only</code> <code>execnet</code>
&quot;execmodel&quot; so that code which expects to only run in the main
thread will now work as expected.</p>
</li>
<li>
<p><code>[#937](pytest-dev/pytest-xdist#937)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/937&gt;</code>_:
Fixed a bug where plugin would raise an incompatibility error with
<code>--pdb</code> despite using <code>-n0</code>.</p>
</li>
</ul>
<h2>Removals</h2>
<ul>
<li>

<p><code>[#1053](pytest-dev/pytest-xdist#1053)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1053&gt;</code>_:
Dropped support for Python 3.7.</p>
</li>
<li>

<p><code>[#1057](pytest-dev/pytest-xdist#1057)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1057&gt;</code>_:
pytest&gt;=7.0.0 is now required.</p>
<p>execnet&gt;=2.1.0 is now required.</p>
</li>
</ul>
<h2>Trivial Changes</h2>
<ul>
<li>

<p><code>[#1020](pytest-dev/pytest-xdist#1020)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1020&gt;</code>_:
pytest-xdist's <code>setup.py</code> file is removed.</p>
<p>If you relied on this file, e.g. to install pytest using
<code>setup.py install</code>,
please see <code>Why you shouldn't invoke setup.py directly
&lt;https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html#summary&gt;</code>_
for alternatives.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/4dd2978031eaf7017c84a1cc77667379a2b11c64"><code>4dd2978</code></a>
Release 3.6.1</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/b397288b7ed40ac8c55a173566bb881e0adcb546"><code>b397288</code></a>
Merge pull request <a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1072">#1072</a>
from zmedico/gateway-cache-rinfo</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/12b3cce0ce4f4cffcc35c0e8369759b71b32c0cc"><code>12b3cce</code></a>
Cache execnet gateway rinfo during WorkerController setup</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/c93a106b3ad466e22d19d814394de0422adf4dca"><code>c93a106</code></a>
build(deps): bump hynek/build-and-inspect-python-package (<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1066">#1066</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/52e202263827775ad6bcf18a216000aec4412911"><code>52e2022</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1073">#1073</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/699f939b5cc2d61df9f622d0449a590be216ee7a"><code>699f939</code></a>
Merge pull request <a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1070">#1070</a>
from pytest-dev/release-3.6.0</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/80bc0b8e5be6e256c8f49791e08abd5fa2d2d3a2"><code>80bc0b8</code></a>
Release 3.6.0</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/20e3ac774e8fa34b25665ef183b94c9879f98cd1"><code>20e3ac7</code></a>
Use execnet main_thread_only execmodel (<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1027">#1027</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/0a4238f6da367a9133882d8810a3b556837cb5ae"><code>0a4238f</code></a>
Merge pull request <a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1067">#1067</a>
from pytest-dev/pre-commit-ci-update-config</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/068627994f91068fb27269be421385c7cd3ab201"><code>0686279</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-xdist/compare/v3.5.0...v3.6.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pytest-xdist&package-manager=pip&previous-version=3.5.0&new-version=3.6.1)](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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>
github-actions bot pushed a commit to ryankanno/cookiecutter-py that referenced this issue Apr 29, 2024
Bumps the dev group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [pytest](https://github.com/pytest-dev/pytest) | `8.1.1` | `8.2.0` |
| [black](https://github.com/psf/black) | `24.4.0` | `24.4.2` |
| [tox](https://github.com/tox-dev/tox) | `4.14.2` | `4.15.0` |
| [mypy](https://github.com/python/mypy) | `1.9.0` | `1.10.0` |
| [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) | `3.5.0` | `3.6.1` |
| [ruff](https://github.com/astral-sh/ruff) | `0.4.1` | `0.4.2` |

Updates `pytest` from 8.1.1 to 8.2.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/pytest-dev/pytest/releases">pytest's releases</a>.</em></p>
<blockquote>
<h2>8.2.0</h2>
<h1>pytest 8.2.0 (2024-04-27)</h1>
<h2>Deprecations</h2>
<ul>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/12069">#12069</a>: A deprecation warning is now raised when implementations of one of the following hooks request a deprecated <code>py.path.local</code> parameter instead of the <code>pathlib.Path</code> parameter which replaced it:</p>
<ul>
<li><code>pytest_ignore_collect</code>{.interpreted-text role=&quot;hook&quot;} - the <code>path</code> parameter - use <code>collection_path</code> instead.</li>
<li><code>pytest_collect_file</code>{.interpreted-text role=&quot;hook&quot;} - the <code>path</code> parameter - use <code>file_path</code> instead.</li>
<li><code>pytest_pycollect_makemodule</code>{.interpreted-text role=&quot;hook&quot;} - the <code>path</code> parameter - use <code>module_path</code> instead.</li>
<li><code>pytest_report_header</code>{.interpreted-text role=&quot;hook&quot;} - the <code>startdir</code> parameter - use <code>start_path</code> instead.</li>
<li><code>pytest_report_collectionfinish</code>{.interpreted-text role=&quot;hook&quot;} - the <code>startdir</code> parameter - use <code>start_path</code> instead.</li>
</ul>
<p>The replacement parameters are available since pytest 7.0.0.
The old parameters will be removed in pytest 9.0.0.</p>
<p>See <code>legacy-path-hooks-deprecated</code>{.interpreted-text role=&quot;ref&quot;} for more details.</p>
</li>
</ul>
<h2>Features</h2>
<ul>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/11871">#11871</a>: Added support for reading command line arguments from a file using the prefix character <code>@</code>, like e.g.: <code>pytest @tests.txt</code>. The file must have one argument per line.</p>
<p>See <code>Read arguments from file &lt;args-from-file&gt;</code>{.interpreted-text role=&quot;ref&quot;} for details.</p>
</li>
</ul>
<h2>Improvements</h2>
<ul>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/11523">#11523</a>: <code>pytest.importorskip</code>{.interpreted-text role=&quot;func&quot;} will now issue a warning if the module could be found, but raised <code>ImportError</code>{.interpreted-text role=&quot;class&quot;} instead of <code>ModuleNotFoundError</code>{.interpreted-text role=&quot;class&quot;}.</p>
<p>The warning can be suppressed by passing <code>exc_type=ImportError</code> to <code>pytest.importorskip</code>{.interpreted-text role=&quot;func&quot;}.</p>
<p>See <code>import-or-skip-import-error</code>{.interpreted-text role=&quot;ref&quot;} for details.</p>
</li>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/11728">#11728</a>: For <code>unittest</code>-based tests, exceptions during class cleanup (as raised by functions registered with <code>TestCase.addClassCleanup &lt;unittest.TestCase.addClassCleanup&gt;</code>{.interpreted-text role=&quot;meth&quot;}) are now reported instead of silently failing.</p>
</li>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/11777">#11777</a>: Text is no longer truncated in the <code>short test summary info</code> section when <code>-vv</code> is given.</p>
</li>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/12112">#12112</a>: Improved namespace packages detection when <code>consider_namespace_packages</code>{.interpreted-text role=&quot;confval&quot;} is enabled, covering more situations (like editable installs).</p>
</li>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/9502">#9502</a>: Added <code>PYTEST_VERSION</code>{.interpreted-text role=&quot;envvar&quot;} environment variable which is defined at the start of the pytest session and undefined afterwards. It contains the value of <code>pytest.__version__</code>, and among other things can be used to easily check if code is running from within a pytest run.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>
<p><a href="https://redirect.github.com/pytest-dev/pytest/issues/12065">#12065</a>: Fixed a regression in pytest 8.0.0 where test classes containing <code>setup_method</code> and tests using <code>@staticmethod</code> or <code>@classmethod</code> would crash with <code>AttributeError: 'NoneType' object has no attribute 'setup_method'</code>.</p>
<p>Now the <code>request.instance &lt;pytest.FixtureRequest.instance&gt;</code>{.interpreted-text role=&quot;attr&quot;} attribute of tests using <code>@staticmethod</code> and <code>@classmethod</code> is no longer <code>None</code>, but a fresh instance of the class, like in non-static methods.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/pytest-dev/pytest/commit/6bd3f313447290380cbc2db30fb9ee5cca7eb941"><code>6bd3f31</code></a> Tweak changelog for 8.2.0</li>
<li><a href="https://github.com/pytest-dev/pytest/commit/9b6219b5e89af237e5bc80354d405d2b5c2fc8a0"><code>9b6219b</code></a> Prepare release version 8.2.0</li>
<li><a href="https://github.com/pytest-dev/pytest/commit/835765c9d31e0a86c6028f983b28d32c82a759c4"><code>835765c</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/12130">#12130</a> from bluetech/fixtures-inline</li>
<li><a href="https://github.com/pytest-dev/pytest/commit/7e7503c0b015f61d9d21d3b5f55990b7fcd683f7"><code>7e7503c</code></a> unittest: report class cleanup exceptions (<a href="https://redirect.github.com/pytest-dev/pytest/issues/12250">#12250</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest/commit/882c4da2f37702b00bdbd3b6c74e9821d33e0204"><code>882c4da</code></a> fixtures: inline <code>fail_fixturefunc</code></li>
<li><a href="https://github.com/pytest-dev/pytest/commit/2e8fb9f1401d727e20f004326752fd1922f9c601"><code>2e8fb9f</code></a> fixtures: extract a <code>_check_fixturedef</code> method</li>
<li><a href="https://github.com/pytest-dev/pytest/commit/acf2971f46a9518b3552d48ea9541a1951c2b207"><code>acf2971</code></a> fixtures: inline <code>_getnextfixturedef</code> into <code>_get_active_fixturedef</code></li>
<li><a href="https://github.com/pytest-dev/pytest/commit/3c77aec1dac0894ec4ca774b71ec91c85cf91dd1"><code>3c77aec</code></a> fixtures: move &quot;request&quot; check early</li>
<li><a href="https://github.com/pytest-dev/pytest/commit/d217d68cde0c34d619862f15c773ecc02ecdaabe"><code>d217d68</code></a> fixtures: inline <code>_compute_fixture_value</code></li>
<li><a href="https://github.com/pytest-dev/pytest/commit/530be285751143febe54b8974b234eed5eb8b079"><code>530be28</code></a> fixtures: use early return in <code>_get_active_fixturedef</code></li>
<li>Additional commits viewable in <a href="https://github.com/pytest-dev/pytest/compare/8.1.1...8.2.0">compare view</a></li>
</ul>
</details>
<br />

Updates `black` from 24.4.0 to 24.4.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/psf/black/releases">black's releases</a>.</em></p>
<blockquote>
<h2>24.4.2</h2>
<p>This is a bugfix release to fix two regressions in the new f-string parser introduced in
24.4.1.</p>
<h3>Parser</h3>
<ul>
<li>Fix regression where certain complex f-strings failed to parse (<a href="https://redirect.github.com/psf/black/issues/4332">#4332</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Fix bad performance on certain complex string literals (<a href="https://redirect.github.com/psf/black/issues/4331">#4331</a>)</li>
</ul>
<h2>24.4.1</h2>
<h3>Highlights</h3>
<ul>
<li>Add support for the new Python 3.12 f-string syntax introduced by PEP 701 (<a href="https://redirect.github.com/psf/black/issues/3822">#3822</a>)</li>
</ul>
<h3>Stable style</h3>
<ul>
<li>Fix crash involving indented dummy functions containing newlines (<a href="https://redirect.github.com/psf/black/issues/4318">#4318</a>)</li>
</ul>
<h3>Parser</h3>
<ul>
<li>Add support for type parameter defaults, a new syntactic feature added to Python 3.13
by PEP 696 (<a href="https://redirect.github.com/psf/black/issues/4327">#4327</a>)</li>
</ul>
<h3>Integrations</h3>
<ul>
<li>Github Action now works even when <code>git archive</code> is skipped (<a href="https://redirect.github.com/psf/black/issues/4313">#4313</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/psf/black/blob/main/CHANGES.md">black's changelog</a>.</em></p>
<blockquote>
<h2>24.4.2</h2>
<p>This is a bugfix release to fix two regressions in the new f-string parser introduced in
24.4.1.</p>
<h3>Parser</h3>
<ul>
<li>Fix regression where certain complex f-strings failed to parse (<a href="https://redirect.github.com/psf/black/issues/4332">#4332</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Fix bad performance on certain complex string literals (<a href="https://redirect.github.com/psf/black/issues/4331">#4331</a>)</li>
</ul>
<h2>24.4.1</h2>
<h3>Highlights</h3>
<ul>
<li>Add support for the new Python 3.12 f-string syntax introduced by PEP 701 (<a href="https://redirect.github.com/psf/black/issues/3822">#3822</a>)</li>
</ul>
<h3>Stable style</h3>
<ul>
<li>Fix crash involving indented dummy functions containing newlines (<a href="https://redirect.github.com/psf/black/issues/4318">#4318</a>)</li>
</ul>
<h3>Parser</h3>
<ul>
<li>Add support for type parameter defaults, a new syntactic feature added to Python 3.13
by PEP 696 (<a href="https://redirect.github.com/psf/black/issues/4327">#4327</a>)</li>
</ul>
<h3>Integrations</h3>
<ul>
<li>Github Action now works even when <code>git archive</code> is skipped (<a href="https://redirect.github.com/psf/black/issues/4313">#4313</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/psf/black/commit/3702ba224ecffbcec30af640c149f231d90aebdb"><code>3702ba2</code></a> Prepare release 24.4.2 (<a href="https://redirect.github.com/psf/black/issues/4335">#4335</a>)</li>
<li><a href="https://github.com/psf/black/commit/e4aaa8a9947d951eb1e69979c3c58e197adbe40f"><code>e4aaa8a</code></a> Fix incorrect f-string tokenization (<a href="https://redirect.github.com/psf/black/issues/4332">#4332</a>)</li>
<li><a href="https://github.com/psf/black/commit/ba88fc372eaed34abb33ea02d6860b185388d928"><code>ba88fc3</code></a> Simplify string tokenization regexes (<a href="https://redirect.github.com/psf/black/issues/4331">#4331</a>)</li>
<li><a href="https://github.com/psf/black/commit/5683242fd432d93c9c37540948a39afd06ea4f7d"><code>5683242</code></a> New release template</li>
<li><a href="https://github.com/psf/black/commit/e7fb048281a83733f0b162fc7fa85e48044ea9ec"><code>e7fb048</code></a> Prepare release 24.4.1 (<a href="https://redirect.github.com/psf/black/issues/4328">#4328</a>)</li>
<li><a href="https://github.com/psf/black/commit/3f0f8f1956646fd9f6fc47e133364c1352a478d1"><code>3f0f8f1</code></a> Support PEP 696 (<a href="https://redirect.github.com/psf/black/issues/4327">#4327</a>)</li>
<li><a href="https://github.com/psf/black/commit/2f88085da588d34286bc9a24e288de204f141243"><code>2f88085</code></a> Github Action: Directly install from repo if <code>export-subst</code> is skipped (<a href="https://redirect.github.com/psf/black/issues/4313">#4313</a>)</li>
<li><a href="https://github.com/psf/black/commit/12ce3db077780ab01cc5ad1f92d5c85fcca3f54c"><code>12ce3db</code></a> Move changelog entry to right section (<a href="https://redirect.github.com/psf/black/issues/4326">#4326</a>)</li>
<li><a href="https://github.com/psf/black/commit/1354be2525e4910b8a0d7c46242eae76963db5d2"><code>1354be2</code></a> Add support to style function definitions with newlines before function stubs...</li>
<li><a href="https://github.com/psf/black/commit/f4b644b82f64d5aa2b8959277c9eb9ebcb16affe"><code>f4b644b</code></a> Prevent wrapping of multiline fstrings in parens (<a href="https://redirect.github.com/psf/black/issues/4325">#4325</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/psf/black/compare/24.4.0...24.4.2">compare view</a></li>
</ul>
</details>
<br />

Updates `tox` from 4.14.2 to 4.15.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/tox-dev/tox/releases">tox's releases</a>.</em></p>
<blockquote>
<h2>4.15.0</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<ul>
<li>Remove duplicated and misleading configuration section by <a href="https://github.com/jugmac00"><code>@​jugmac00</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3251">tox-dev/tox#3251</a></li>
<li>Fix dropped leading characters <code>c</code> from constraints' packages by <a href="https://github.com/jugmac00"><code>@​jugmac00</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3250">tox-dev/tox#3250</a></li>
<li>Fix type-checking by <a href="https://github.com/stefanor"><code>@​stefanor</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3260">tox-dev/tox#3260</a></li>
<li>Update installation.rst by <a href="https://github.com/shenxianpeng"><code>@​shenxianpeng</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3257">tox-dev/tox#3257</a></li>
<li>Allow appending to deps with the command line by <a href="https://github.com/stefanor"><code>@​stefanor</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3259">tox-dev/tox#3259</a></li>
<li>Support multiple override appends by <a href="https://github.com/amitschang"><code>@​amitschang</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3261">tox-dev/tox#3261</a></li>
<li>Add bang to invert exit code by <a href="https://github.com/sillydan1"><code>@​sillydan1</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3271">tox-dev/tox#3271</a></li>
<li>fix(parser): Fix --discover parsed incorrectly from env by <a href="https://github.com/mimre25"><code>@​mimre25</code></a> in <a href="https://redirect.github.com/tox-dev/tox/pull/3274">tox-dev/tox#3274</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/shenxianpeng"><code>@​shenxianpeng</code></a> made their first contribution in <a href="https://redirect.github.com/tox-dev/tox/pull/3257">tox-dev/tox#3257</a></li>
<li><a href="https://github.com/amitschang"><code>@​amitschang</code></a> made their first contribution in <a href="https://redirect.github.com/tox-dev/tox/pull/3261">tox-dev/tox#3261</a></li>
<li><a href="https://github.com/sillydan1"><code>@​sillydan1</code></a> made their first contribution in <a href="https://redirect.github.com/tox-dev/tox/pull/3271">tox-dev/tox#3271</a></li>
<li><a href="https://github.com/mimre25"><code>@​mimre25</code></a> made their first contribution in <a href="https://redirect.github.com/tox-dev/tox/pull/3274">tox-dev/tox#3274</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/tox-dev/tox/compare/4.14.2...4.15.0">https://github.com/tox-dev/tox/compare/4.14.2...4.15.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/tox-dev/tox/blob/main/docs/changelog.rst">tox's changelog</a>.</em></p>
<blockquote>
<h2>v4.15.0 (2024-04-26)</h2>
<p>Features - 4.15.0</p>
<pre><code>- Add support for multiple appending override options (-x, --override) on command line - by :user:`amitschang`. (:issue:`3261`)
- Add support for inverting exit code success criteria using bang (!) (:issue:`3271`)
<p>Bugfixes - 4.15.0
</code></pre></p>
<ul>
<li>Fix issue that the leading character <code>c</code> was dropped from packages in constraints files - by :user:<code>jugmac00</code>. (:issue:<code>3247</code>)</li>
<li>Allow appending to <code>deps</code> with <code>--override testenv.deps+=foo</code> - by :user:<code>stefanor</code>. (:issue:<code>3256</code>)</li>
<li>Fix non-existing branch <code>rewrite</code> in the documentation to <code>main</code>. (:issue:<code>3257</code>)</li>
<li>Update test typing for build 1.2.0, which has an explicit <code>Distribution</code> type - by :user:<code>stefanor</code>. (:issue:<code>3260</code>)</li>
<li>Fix broken input parsing for <code>--discover</code> flag. - by :user:<code>mimre25</code> (:issue:<code>3272</code>)</li>
</ul>
<p>Improved Documentation - 4.15.0</p>
<pre><code>- Rephrase ``--discover`` flag's description to avoid confusion between paths and executables. - by :user:`mimre25` (:issue:`3274`)
</code></pre>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/tox-dev/tox/commit/261b4ca55686059489b1314c440f0e2fca21aca5"><code>261b4ca</code></a> release 4.15.0</li>
<li><a href="https://github.com/tox-dev/tox/commit/c54dfbd9ad4aad9f0ef5503b7dff2558cdf64208"><code>c54dfbd</code></a> fix(parser): Fix --discover parsed incorrectly from env (<a href="https://redirect.github.com/tox-dev/tox/issues/3274">#3274</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/809e10f9871e75cf7b07063f47393f9c10861174"><code>809e10f</code></a> Add bang to invert exit code (<a href="https://redirect.github.com/tox-dev/tox/issues/3271">#3271</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/822c9d07699aa090fb8d37cb94247ea0d085125b"><code>822c9d0</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/tox-dev/tox/issues/3267">#3267</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/0e5a3dbb9a1c7eb1df56421cc4bca5e187626ccd"><code>0e5a3db</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/tox-dev/tox/issues/3265">#3265</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/f5850c0d3a893cbb6d9de192fe8e6e857573499b"><code>f5850c0</code></a> Support multiple override appends (<a href="https://redirect.github.com/tox-dev/tox/issues/3261">#3261</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/c2be62972e7f7b3e79260e5c96e4fe5bf76f5929"><code>c2be629</code></a> Allow appending to deps with the command line (<a href="https://redirect.github.com/tox-dev/tox/issues/3259">#3259</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/d28a9ee0ea28b2356b24a0d0e0ed70c0141d41cc"><code>d28a9ee</code></a> Update installation.rst (<a href="https://redirect.github.com/tox-dev/tox/issues/3257">#3257</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/a19a9467cfae5a0fc2c1b6faf1845d412898c693"><code>a19a946</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/tox-dev/tox/issues/3258">#3258</a>)</li>
<li><a href="https://github.com/tox-dev/tox/commit/a22fe8ffce73acdfc2aefd70228ede0337aac19b"><code>a22fe8f</code></a> Fix type-checking (<a href="https://redirect.github.com/tox-dev/tox/issues/3260">#3260</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/tox-dev/tox/compare/4.14.2...4.15.0">compare view</a></li>
</ul>
</details>
<br />

Updates `mypy` from 1.9.0 to 1.10.0
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/python/mypy/blob/master/CHANGELOG.md">mypy's changelog</a>.</em></p>
<blockquote>
<h1>Mypy Release Notes</h1>
<h2>Next release</h2>
<h2>Mypy 1.10</h2>
<p>We’ve just uploaded mypy 1.10 to the Python Package Index (<a href="https://pypi.org/project/mypy/">PyPI</a>). Mypy is a static type checker for Python. This release includes new features, performance improvements and bug fixes. You can install it as follows:</p>
<pre><code>python3 -m pip install -U mypy
</code></pre>
<p>You can read the full documentation for this release on <a href="http://mypy.readthedocs.io">Read the Docs</a>.</p>
<h4>Support TypeIs (PEP 742)</h4>
<p>Mypy now supports <code>TypeIs</code> (<a href="https://peps.python.org/pep-0742/">PEP 742</a>), which allows
functions to narrow the type of a value, similar to <code>isinstance()</code>. Unlike <code>TypeGuard</code>,
<code>TypeIs</code> can narrow in both the <code>if</code> and <code>else</code> branches of an if statement:</p>
<pre lang="python"><code>from typing_extensions import TypeIs
<p>def is_str(s: object) -&gt; TypeIs[str]:
return isinstance(s, str)</p>
<p>def f(o: str | int) -&gt; None:
if is_str(o):
# Type of o is 'str'
...
else:
# Type of o is 'int'
...
</code></pre></p>
<p><code>TypeIs</code> will be added to the <code>typing</code> module in Python 3.13, but it
can be used on earlier Python versions by importing it from
<code>typing_extensions</code>.</p>
<p>This feature was contributed by Jelle Zijlstra (PR <a href="https://redirect.github.com/python/mypy/pull/16898">16898</a>).</p>
<h4>Support TypeVar Defaults (PEP 696)</h4>
<p><a href="https://peps.python.org/pep-0696/">PEP 696</a> adds support for type parameter defaults.
Example:</p>
<pre lang="python"><code>from typing import Generic
from typing_extensions import TypeVar
<p>&lt;/tr&gt;&lt;/table&gt;
</code></pre></p>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/python/mypy/commit/3faf0fc4798ec3ee6b1cd123965193dc0a753fb0"><code>3faf0fc</code></a> Remove +dev for version for release 1.10</li>
<li><a href="https://github.com/python/mypy/commit/a5998d20402515f0c0bf05c7fe1029e93aa9bfa8"><code>a5998d2</code></a> Update CHANGELOG.md (<a href="https://redirect.github.com/python/mypy/issues/17159">#17159</a>)</li>
<li><a href="https://github.com/python/mypy/commit/62ea5b01f0c0c99e7db93326cb8d219eecfb3cb6"><code>62ea5b0</code></a> Various updates to changelog for 1.10 (<a href="https://redirect.github.com/python/mypy/issues/17158">#17158</a>)</li>
<li><a href="https://github.com/python/mypy/commit/2f0864c4e55a74700d8ce2d97ab2d3ca2b288513"><code>2f0864c</code></a> Update CHANGELOG.md with draft for release 1.10 (<a href="https://redirect.github.com/python/mypy/issues/17150">#17150</a>)</li>
<li><a href="https://github.com/python/mypy/commit/e1443bbade91118794055449cc8b4b4f7fd08b7d"><code>e1443bb</code></a> fix: incorrect returned type of access descriptors on unions of types (<a href="https://redirect.github.com/python/mypy/issues/16604">#16604</a>)</li>
<li><a href="https://github.com/python/mypy/commit/5161ac2e5b73dc7597536eb4444219868317e5d9"><code>5161ac2</code></a> Sync typeshed (<a href="https://redirect.github.com/python/mypy/issues/17124">#17124</a>)</li>
<li><a href="https://github.com/python/mypy/commit/e2fc1f28935806ca04b18fab277217f583b51594"><code>e2fc1f2</code></a> Fix crash when expanding invalid Unpack in a <code>Callable</code> alias (<a href="https://redirect.github.com/python/mypy/issues/17028">#17028</a>)</li>
<li><a href="https://github.com/python/mypy/commit/3ff6e47c57a67e807e0b4579a816b4f66ab16824"><code>3ff6e47</code></a> Docs: docstrings in checker.py, ast_helpers.py (<a href="https://redirect.github.com/python/mypy/issues/16908">#16908</a>)</li>
<li><a href="https://github.com/python/mypy/commit/732d98ecb2a98e4eaea14aba1ed8ac9c1f5ccdb6"><code>732d98e</code></a> Fix string formatting for string enums (<a href="https://redirect.github.com/python/mypy/issues/16555">#16555</a>)</li>
<li><a href="https://github.com/python/mypy/commit/80190101f68b52e960c22572ed6cc814de078b9c"><code>8019010</code></a> Narrow individual items when matching a tuple to a sequence pattern (<a href="https://redirect.github.com/python/mypy/issues/16905">#16905</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/python/mypy/compare/1.9.0...v1.10.0">compare view</a></li>
</ul>
</details>
<br />

Updates `pytest-xdist` from 3.5.0 to 3.6.1
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/pytest-dev/pytest-xdist/blob/master/CHANGELOG.rst">pytest-xdist's changelog</a>.</em></p>
<blockquote>
<h1>pytest-xdist 3.6.1 (2024-04-28)</h1>
<h2>Bug Fixes</h2>
<ul>
<li><code>[#1071](pytest-dev/pytest-xdist#1071) &lt;https://github.com/pytest-dev/pytest-xdist/issues/1071&gt;</code>_: Add backward compatibility for deadlock issue with the <code>execnet</code> new <code>main_thread_only</code> &quot;execmodel&quot; triggered when pytest-cov accesses rinfo.</li>
</ul>
<h1>pytest-xdist 3.6.0 (2024-04-19)</h1>
<p>This release was YANKED due to a regression fixed in 3.6.1.</p>
<h2>Features</h2>
<ul>
<li><code>[#1027](pytest-dev/pytest-xdist#1027) &lt;https://github.com/pytest-dev/pytest-xdist/pull/1027&gt;</code>_:<code>pytest-xdist</code> workers now always execute the tests in the main thread.
Previously some tests might end up executing in a separate thread other than <code>main</code> in the workers, due to some internal <code>execnet`` details. This can cause problems specially with async frameworks where the event loop is running in the ``main`` thread (for example </code><a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/620">#620</a> <a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/620">pytest-dev/pytest-xdist#620</a>`__).</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>
<p><code>[#1024](pytest-dev/pytest-xdist#1024) &lt;https://github.com/pytest-dev/pytest-xdist/issues/1024&gt;</code>_: Added proper handling of <code>shouldstop</code> (such as set by <code>--max-fail</code>) and <code>shouldfail</code> conditions in workers.
Previously, a worker might have continued executing further tests before the controller could terminate the session.</p>
</li>
<li>
<p><code>[#1028](pytest-dev/pytest-xdist#1028) &lt;https://github.com/pytest-dev/pytest-xdist/issues/1028&gt;</code>_: Fixed compatibility issue between <code>looponfail</code> and editable installs.</p>
</li>
<li>
<p><code>[#620](pytest-dev/pytest-xdist#620) &lt;https://github.com/pytest-dev/pytest-xdist/issues/620&gt;</code>_: Use the new <code>main_thread_only</code> <code>execnet</code> &quot;execmodel&quot; so that code which expects to only run in the main thread will now work as expected.</p>
</li>
<li>
<p><code>[#937](pytest-dev/pytest-xdist#937) &lt;https://github.com/pytest-dev/pytest-xdist/issues/937&gt;</code>_: Fixed a bug where plugin would raise an incompatibility error with <code>--pdb</code> despite using <code>-n0</code>.</p>
</li>
</ul>
<h2>Removals</h2>
<ul>
<li>
<p><code>[#1053](pytest-dev/pytest-xdist#1053) &lt;https://github.com/pytest-dev/pytest-xdist/issues/1053&gt;</code>_: Dropped support for Python 3.7.</p>
</li>
<li>
<p><code>[#1057](pytest-dev/pytest-xdist#1057) &lt;https://github.com/pytest-dev/pytest-xdist/issues/1057&gt;</code>_: pytest&gt;=7.0.0 is now required.</p>
<p>execnet&gt;=2.1.0 is now required.</p>
</li>
</ul>
<h2>Trivial Changes</h2>
<ul>
<li>
<p><code>[#1020](pytest-dev/pytest-xdist#1020) &lt;https://github.com/pytest-dev/pytest-xdist/issues/1020&gt;</code>_: pytest-xdist's <code>setup.py</code> file is removed.</p>
<p>If you relied on this file, e.g. to install pytest using <code>setup.py install</code>,
please see <code>Why you shouldn't invoke setup.py directly &lt;https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html#summary&gt;</code>_ for alternatives.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/4dd2978031eaf7017c84a1cc77667379a2b11c64"><code>4dd2978</code></a> Release 3.6.1</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/b397288b7ed40ac8c55a173566bb881e0adcb546"><code>b397288</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1072">#1072</a> from zmedico/gateway-cache-rinfo</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/12b3cce0ce4f4cffcc35c0e8369759b71b32c0cc"><code>12b3cce</code></a> Cache execnet gateway rinfo during WorkerController setup</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/c93a106b3ad466e22d19d814394de0422adf4dca"><code>c93a106</code></a> build(deps): bump hynek/build-and-inspect-python-package (<a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1066">#1066</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/52e202263827775ad6bcf18a216000aec4412911"><code>52e2022</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1073">#1073</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/699f939b5cc2d61df9f622d0449a590be216ee7a"><code>699f939</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1070">#1070</a> from pytest-dev/release-3.6.0</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/80bc0b8e5be6e256c8f49791e08abd5fa2d2d3a2"><code>80bc0b8</code></a> Release 3.6.0</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/20e3ac774e8fa34b25665ef183b94c9879f98cd1"><code>20e3ac7</code></a> Use execnet main_thread_only execmodel (<a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1027">#1027</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/0a4238f6da367a9133882d8810a3b556837cb5ae"><code>0a4238f</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1067">#1067</a> from pytest-dev/pre-commit-ci-update-config</li>
<li><a href="https://github.com/pytest-dev/pytest-xdist/commit/068627994f91068fb27269be421385c7cd3ab201"><code>0686279</code></a> [pre-commit.ci] pre-commit autoupdate</li>
<li>Additional commits viewable in <a href="https://github.com/pytest-dev/pytest-xdist/compare/v3.5.0...v3.6.1">compare view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.4.1 to 0.4.2
<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>v0.4.2</h2>
<h2>Changes</h2>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-pyi</code>] Allow for overloaded <code>__exit__</code> and <code>__aexit__</code> definitions (<code>PYI036</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11057">#11057</a>)</li>
<li>[<code>pyupgrade</code>] Catch usages of <code>&quot;%s&quot; % var</code> and provide an unsafe fix (<code>UP031</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11019">#11019</a>)</li>
<li>[<code>refurb</code>] Implement new rule that suggests min/max over <code>sorted()</code> (<code>FURB192</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/10868">#10868</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Fix an issue with missing diagnostics for Neovim and Helix (<a href="https://redirect.github.com/astral-sh/ruff/pull/11092">#11092</a>)</li>
<li>Implement hover documentation for <code>noqa</code> codes (<a href="https://redirect.github.com/astral-sh/ruff/pull/11096">#11096</a>)</li>
<li>Introduce common Ruff configuration options with new server settings (<a href="https://redirect.github.com/astral-sh/ruff/pull/11062">#11062</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Use <code>macos-12</code> for building release wheels to enable macOS 11 compatibility (<a href="https://redirect.github.com/astral-sh/ruff/pull/11146">#11146</a>)</li>
<li>[<code>flake8-blind-expect</code>] Allow raise from in <code>BLE001</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/11131">#11131</a>)</li>
<li>[<code>flake8-pyi</code>] Allow simple assignments to <code>None</code> in enum class scopes (<code>PYI026</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11128">#11128</a>)</li>
<li>[<code>flake8-simplify</code>] Avoid raising <code>SIM911</code> for non-<code>zip</code> attribute calls (<a href="https://redirect.github.com/astral-sh/ruff/pull/11126">#11126</a>)</li>
<li>[<code>refurb</code>] Avoid <code>operator.itemgetter</code> suggestion for single-item tuple (<a href="https://redirect.github.com/astral-sh/ruff/pull/11095">#11095</a>)</li>
<li>[<code>ruff</code>] Respect per-file-ignores for <code>RUF100</code> with no other diagnostics (<a href="https://redirect.github.com/astral-sh/ruff/pull/11058">#11058</a>)</li>
<li>[<code>ruff</code>] Fix async comprehension false positive (<code>RUF029</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11070">#11070</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Document explicitly disabling strict zip (<code>B905</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11040">#11040</a>)</li>
<li>[<code>flake8-type-checking</code>] Mention <code>lint.typing-modules</code> in <code>TCH001</code>, <code>TCH002</code>, and <code>TCH003</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/11144">#11144</a>)</li>
<li>[<code>isort</code>] Improve documentation around custom <code>isort</code> sections (<a href="https://redirect.github.com/astral-sh/ruff/pull/11050">#11050</a>)</li>
<li>[<code>pylint</code>] Fix documentation oversight for <code>invalid-X-returns</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/11094">#11094</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Use <code>matchit</code> to resolve per-file settings (<a href="https://redirect.github.com/astral-sh/ruff/pull/11111">#11111</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a href="https://github.com/AlexWaygood"><code>@​AlexWaygood</code></a></li>
<li><a href="https://github.com/JonathanPlasse"><code>@​JonathanPlasse</code></a></li>
<li><a href="https://github.com/KPCOFGS"><code>@​KPCOFGS</code></a></li>
<li><a href="https://github.com/KotlinIsland"><code>@​KotlinIsland</code></a></li>
<li><a href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a href="https://github.com/augustelalande"><code>@​augustelalande</code></a></li>
<li><a href="https://github.com/autinerd"><code>@​autinerd</code></a></li>
<li><a href="https://github.com/bersbersbers"><code>@​bersbersbers</code></a></li>
<li><a href="https://github.com/carljm"><code>@​carljm</code></a></li>
<li><a href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ibraheemdev"><code>@​ibraheemdev</code></a></li>
<li><a href="https://github.com/jfrost-mo"><code>@​jfrost-mo</code></a></li>
</ul>
<!-- raw HTML omitted -->
</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.4.2</h2>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-pyi</code>] Allow for overloaded <code>__exit__</code> and <code>__aexit__</code> definitions (<code>PYI036</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11057">#11057</a>)</li>
<li>[<code>pyupgrade</code>] Catch usages of <code>&quot;%s&quot; % var</code> and provide an unsafe fix (<code>UP031</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11019">#11019</a>)</li>
<li>[<code>refurb</code>] Implement new rule that suggests min/max over <code>sorted()</code> (<code>FURB192</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/10868">#10868</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Fix an issue with missing diagnostics for Neovim and Helix (<a href="https://redirect.github.com/astral-sh/ruff/pull/11092">#11092</a>)</li>
<li>Implement hover documentation for <code>noqa</code> codes (<a href="https://redirect.github.com/astral-sh/ruff/pull/11096">#11096</a>)</li>
<li>Introduce common Ruff configuration options with new server settings (<a href="https://redirect.github.com/astral-sh/ruff/pull/11062">#11062</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Use <code>macos-12</code> for building release wheels to enable macOS 11 compatibility (<a href="https://redirect.github.com/astral-sh/ruff/pull/11146">#11146</a>)</li>
<li>[<code>flake8-blind-expect</code>] Allow raise from in <code>BLE001</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/11131">#11131</a>)</li>
<li>[<code>flake8-pyi</code>] Allow simple assignments to <code>None</code> in enum class scopes (<code>PYI026</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11128">#11128</a>)</li>
<li>[<code>flake8-simplify</code>] Avoid raising <code>SIM911</code> for non-<code>zip</code> attribute calls (<a href="https://redirect.github.com/astral-sh/ruff/pull/11126">#11126</a>)</li>
<li>[<code>refurb</code>] Avoid <code>operator.itemgetter</code> suggestion for single-item tuple (<a href="https://redirect.github.com/astral-sh/ruff/pull/11095">#11095</a>)</li>
<li>[<code>ruff</code>] Respect per-file-ignores for <code>RUF100</code> with no other diagnostics (<a href="https://redirect.github.com/astral-sh/ruff/pull/11058">#11058</a>)</li>
<li>[<code>ruff</code>] Fix async comprehension false positive (<code>RUF029</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11070">#11070</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Document explicitly disabling strict zip (<code>B905</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/11040">#11040</a>)</li>
<li>[<code>flake8-type-checking</code>] Mention <code>lint.typing-modules</code> in <code>TCH001</code>, <code>TCH002</code>, and <code>TCH003</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/11144">#11144</a>)</li>
<li>[<code>isort</code>] Improve documentation around custom <code>isort</code> sections (<a href="https://redirect.github.com/astral-sh/ruff/pull/11050">#11050</a>)</li>
<li>[<code>pylint</code>] Fix documentation oversight for <code>invalid-X-returns</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/11094">#11094</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Use <code>matchit</code> to resolve per-file settings (<a href="https://redirect.github.com/astral-sh/ruff/pull/11111">#11111</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/astral-sh/ruff/commit/77c93fd63c1c072501d297082aa59c741b2d5466"><code>77c93fd</code></a> Bump version to 0.4.2 (<a href="https://redirect.github.com/astral-sh/ruff/issues/11151">#11151</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/1c9f5e3001da83a7e48aef21ef72d155c8928035"><code>1c9f5e3</code></a> Display the AST even with syntax errors (<a href="https://redirect.github.com/astral-sh/ruff/issues/11147">#11147</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/263a0d25edf0e56358a6132158d96f06bf94701b"><code>263a0d2</code></a> Use <code>macos-12</code> to build release wheels (<a href="https://redirect.github.com/astral-sh/ruff/issues/11146">#11146</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/4738e199747cdfb7dd82d45b3bd23b715ad0d526"><code>4738e19</code></a> Remove unused lexical error types (<a href="https://redirect.github.com/astral-sh/ruff/issues/11145">#11145</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/f428bd5052b9729cb25be4dd74c703308695edab"><code>f428bd5</code></a> Docs: mention <code>lint.typing-modules</code> in <code>TCH001</code>, <code>TCH002</code>, <code>TCH003</code> (<a href="https://redirect.github.com/astral-sh/ruff/issues/11144">#11144</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/4690890e9fc880489007ea557a0c7fcb190d9c73"><code>4690890</code></a> <code>ruff server</code>: In 'publish diagnostics' mode, document diagnostics are cleare...</li>
<li><a href="https://github.com/astral-sh/ruff/commit/19baabba58c55d8c280b701dc5fb346ce19477bd"><code>19baabb</code></a> README: add Apache Superset to project list (<a href="https://redirect.github.com/astral-sh/ruff/issues/11136">#11136</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/cee38f39dfb7eaca22eda3c19a4d81adc4097105"><code>cee38f3</code></a> [<code>flake8-blind-expect</code>] Allow raise from in <code>BLE001</code> (<a href="https://redirect.github.com/astral-sh/ruff/issues/11131">#11131</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/e3fde2814655dd315683833c772d10e6cd55ba08"><code>e3fde28</code></a> [<code>flake8-pyi</code>] Allow overloaded <code>__exit__</code> and <code>__aexit__</code> definitions (`PYI0...</li>
<li><a href="https://github.com/astral-sh/ruff/commit/1c8849f9a8a2e2dcc0849f35fd5c39049a1e4a6e"><code>1c8849f</code></a> Use Matchit to Resolve Per-File Settings (<a href="https://redirect.github.com/astral-sh/ruff/issues/11111">#11111</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/v0.4.1...v0.4.2">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@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>
seumoose pushed a commit to seumoose/example-python-package that referenced this issue Apr 29, 2024
Bumps [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) from
3.3.1 to 3.6.1.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-xdist/blob/master/CHANGELOG.rst">pytest-xdist's
changelog</a>.</em></p>
<blockquote>
<h1>pytest-xdist 3.6.1 (2024-04-28)</h1>
<h2>Bug Fixes</h2>
<ul>

<li><code>[#1071](pytest-dev/pytest-xdist#1071)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1071&gt;</code>_:
Add backward compatibility for deadlock issue with the
<code>execnet</code> new <code>main_thread_only</code>
&quot;execmodel&quot; triggered when pytest-cov accesses rinfo.</li>
</ul>
<h1>pytest-xdist 3.6.0 (2024-04-19)</h1>
<p>This release was YANKED due to a regression fixed in 3.6.1.</p>
<h2>Features</h2>
<ul>

<li><code>[#1027](pytest-dev/pytest-xdist#1027)
&lt;https://github.com/pytest-dev/pytest-xdist/pull/1027&gt;</code>_:<code>pytest-xdist</code>
workers now always execute the tests in the main thread.
Previously some tests might end up executing in a separate thread other
than <code>main</code> in the workers, due to some internal
<code>execnet`` details. This can cause problems specially with async
frameworks where the event loop is running in the ``main`` thread (for
example </code><a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/620">#620</a>
<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/620">pytest-dev/pytest-xdist#620</a>`__).</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>

<p><code>[#1024](pytest-dev/pytest-xdist#1024)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1024&gt;</code>_:
Added proper handling of <code>shouldstop</code> (such as set by
<code>--max-fail</code>) and <code>shouldfail</code> conditions in
workers.
Previously, a worker might have continued executing further tests before
the controller could terminate the session.</p>
</li>
<li>

<p><code>[#1028](pytest-dev/pytest-xdist#1028)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1028&gt;</code>_:
Fixed compatibility issue between <code>looponfail</code> and editable
installs.</p>
</li>
<li>
<p><code>[#620](pytest-dev/pytest-xdist#620)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/620&gt;</code>_:
Use the new <code>main_thread_only</code> <code>execnet</code>
&quot;execmodel&quot; so that code which expects to only run in the main
thread will now work as expected.</p>
</li>
<li>
<p><code>[#937](pytest-dev/pytest-xdist#937)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/937&gt;</code>_:
Fixed a bug where plugin would raise an incompatibility error with
<code>--pdb</code> despite using <code>-n0</code>.</p>
</li>
</ul>
<h2>Removals</h2>
<ul>
<li>

<p><code>[#1053](pytest-dev/pytest-xdist#1053)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1053&gt;</code>_:
Dropped support for Python 3.7.</p>
</li>
<li>

<p><code>[#1057](pytest-dev/pytest-xdist#1057)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1057&gt;</code>_:
pytest&gt;=7.0.0 is now required.</p>
<p>execnet&gt;=2.1.0 is now required.</p>
</li>
</ul>
<h2>Trivial Changes</h2>
<ul>
<li>

<p><code>[#1020](pytest-dev/pytest-xdist#1020)
&lt;https://github.com/pytest-dev/pytest-xdist/issues/1020&gt;</code>_:
pytest-xdist's <code>setup.py</code> file is removed.</p>
<p>If you relied on this file, e.g. to install pytest using
<code>setup.py install</code>,
please see <code>Why you shouldn't invoke setup.py directly
&lt;https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html#summary&gt;</code>_
for alternatives.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/4dd2978031eaf7017c84a1cc77667379a2b11c64"><code>4dd2978</code></a>
Release 3.6.1</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/b397288b7ed40ac8c55a173566bb881e0adcb546"><code>b397288</code></a>
Merge pull request <a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1072">#1072</a>
from zmedico/gateway-cache-rinfo</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/12b3cce0ce4f4cffcc35c0e8369759b71b32c0cc"><code>12b3cce</code></a>
Cache execnet gateway rinfo during WorkerController setup</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/c93a106b3ad466e22d19d814394de0422adf4dca"><code>c93a106</code></a>
build(deps): bump hynek/build-and-inspect-python-package (<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1066">#1066</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/52e202263827775ad6bcf18a216000aec4412911"><code>52e2022</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1073">#1073</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/699f939b5cc2d61df9f622d0449a590be216ee7a"><code>699f939</code></a>
Merge pull request <a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1070">#1070</a>
from pytest-dev/release-3.6.0</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/80bc0b8e5be6e256c8f49791e08abd5fa2d2d3a2"><code>80bc0b8</code></a>
Release 3.6.0</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/20e3ac774e8fa34b25665ef183b94c9879f98cd1"><code>20e3ac7</code></a>
Use execnet main_thread_only execmodel (<a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1027">#1027</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/0a4238f6da367a9133882d8810a3b556837cb5ae"><code>0a4238f</code></a>
Merge pull request <a
href="https://redirect.github.com/pytest-dev/pytest-xdist/issues/1067">#1067</a>
from pytest-dev/pre-commit-ci-update-config</li>
<li><a
href="https://github.com/pytest-dev/pytest-xdist/commit/068627994f91068fb27269be421385c7cd3ab201"><code>0686279</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-xdist/compare/v3.3.1...v3.6.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pytest-xdist&package-manager=pip&previous-version=3.3.1&new-version=3.6.1)](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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
rababerladuseladim referenced this issue in robert-koch-institut/mex-common May 8, 2024
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [dev/pytest-xdist](https://togithub.com/pytest-dev/pytest-xdist)
([changelog](https://pytest-xdist.readthedocs.io/en/latest/changelog.html))
| project.optional-dependencies | minor | `==3.5.0` -> `==3.6.1` |

---

### Release Notes

<details>
<summary>pytest-dev/pytest-xdist (dev/pytest-xdist)</summary>

###
[`v3.6.1`](https://togithub.com/pytest-dev/pytest-xdist/blob/HEAD/CHANGELOG.rst#pytest-xdist-361-2024-04-28)

[Compare
Source](https://togithub.com/pytest-dev/pytest-xdist/compare/v3.6.0...v3.6.1)

\===============================

## Bug Fixes

- `#&#8203;1071
<https://github.com/pytest-dev/pytest-xdist/issues/1071>`\_: Add
backward compatibility for deadlock issue with the `execnet` new
`main_thread_only` "execmodel" triggered when pytest-cov accesses rinfo.

###
[`v3.6.0`](https://togithub.com/pytest-dev/pytest-xdist/blob/HEAD/CHANGELOG.rst#pytest-xdist-360-2024-04-19)

[Compare
Source](https://togithub.com/pytest-dev/pytest-xdist/compare/v3.5.0...v3.6.0)

\===============================

This release was YANKED due to a regression fixed in 3.6.1.

## Features

- `#&#8203;1027
<https://github.com/pytest-dev/pytest-xdist/pull/1027>`\_:`pytest-xdist`
workers now always execute the tests in the main thread.
Previously some tests might end up executing in a separate thread other
than `main` in the workers, due to some internal ` execnet`` details.
This can cause problems specially with async frameworks where the event
loop is running in the ``main`` thread (for example
`[#&#8203;620](https://togithub.com/pytest-dev/pytest-xdist/issues/620)
[#&#8203;620](https://togithub.com/pytest-dev/pytest-xdist/issues/620)\`\__).

## Bug Fixes

- `#&#8203;1024
<https://github.com/pytest-dev/pytest-xdist/issues/1024>`\_: Added
proper handling of `shouldstop` (such as set by `--max-fail`) and
`shouldfail` conditions in workers.
Previously, a worker might have continued executing further tests before
the controller could terminate the session.

- `#&#8203;1028
<https://github.com/pytest-dev/pytest-xdist/issues/1028>`\_: Fixed
compatibility issue between `looponfail` and editable installs.

- `#&#8203;620
<https://github.com/pytest-dev/pytest-xdist/issues/620>`\_: Use the new
`main_thread_only` `execnet` "execmodel" so that code which expects to
only run in the main thread will now work as expected.

- `#&#8203;937
<https://github.com/pytest-dev/pytest-xdist/issues/937>`\_: Fixed a bug
where plugin would raise an incompatibility error with `--pdb` despite
using `-n0`.

## Removals

- `#&#8203;1053
<https://github.com/pytest-dev/pytest-xdist/issues/1053>`\_: Dropped
support for Python 3.7.

- `#&#8203;1057
<https://github.com/pytest-dev/pytest-xdist/issues/1057>`\_:
pytest>=7.0.0 is now required.

    execnet>=2.1.0 is now required.

## Trivial Changes

- `#&#8203;1020
<https://github.com/pytest-dev/pytest-xdist/issues/1020>`\_:
pytest-xdist's `setup.py` file is removed.

If you relied on this file, e.g. to install pytest using `setup.py
install`,
please see `Why you shouldn't invoke setup.py directly
<https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html#summary>`\_
for alternatives.

- `#&#8203;1057
<https://github.com/pytest-dev/pytest-xdist/issues/1057>`\_: The
internals of pytest-xdist are now fully typed. The typing is not exposed
yet.

- `#&#8203;996
<https://github.com/pytest-dev/pytest-xdist/issues/996>`\_: Adjusted
license file format and content to ensure security scanners will
identity the license.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
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 has been generated by [Renovate
Bot](https://togithub.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNTAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjM1MC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
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 a pull request may close this issue.

7 participants