Skip to content

async method fixture is run with different self than the test method #197

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

Closed
Incanus3 opened this issue Nov 10, 2020 · 9 comments · Fixed by #439
Closed

async method fixture is run with different self than the test method #197

Incanus3 opened this issue Nov 10, 2020 · 9 comments · Fixed by #439

Comments

@Incanus3
Copy link

Hi,
I just ran into this - if you make a fixture method async, it is run with a different self, so you can't set attributes on self and read them in test methods. Here is a simple snippet to reproduce the problem:

import pytest

pytestmark = pytest.mark.asyncio

class TestAsyncFixture:
  @pytest.fixture #(autouse = True)
  async def setup(self):
    # await self.client._handle_ws_request(self.payment_start_request)
    self.some_attr = 'value'

    print()
    print('in fixture')
    print(self)
    print(self.__dict__)

  async def test_response(self, setup):
    print('in test')
    print(self)          # different object
    print(self.__dict__) # some_attr missing

At first, I thought this only concerns autouse fixtures, but now I tried using it without autouse and it has the same problem. Is this a known issue, or is it supposed to work?

I'm using

python            3.8.3
pytest            6.1.2
pytest-asyncio    0.14.0

Btw, thanks for this great library, I'm using it heavily and it's been of great help.

@Tinche
Copy link
Member

Tinche commented Nov 10, 2020

I was not aware of this. Could you look into it and submit a PR? Thanks.

@Incanus3
Copy link
Author

I'm afraid that's beyond my abilities. I went over the code, but 1) I don't understand a lot of it, since I'm completely unfamiliar with pytest internals, hooks, etc. and 2) none of it seems related to me - AFAIU none of your code concerns class-based tests, instantiation of the test classes and passing the instance btw fixture methods and test methods.

@seifertm
Copy link
Contributor

seifertm commented Nov 16, 2020

@Incanus3 I understand that the plugin code might be hard to understand at first. But on second glance, it's not that hard :)
Let me provide a few pointers.

The discovery of test cases is performed by pytest, not pytest-asyncio. Pytest's responsibilities include finding fixtures and test cases in class-based tests. That's why you cannot find anything concerning class-based tests in pytest-asyncio. Pytest's plugin system allows us to take action before or after a fixture or test case is executed.

For example, the function pytest_fixture_setup is used to modify the fixture initialization:

@pytest.hookimpl(hookwrapper=True)
def pytest_fixture_setup(fixturedef, request):
"""Adjust the event loop policy when an event loop is produced."""
if fixturedef.argname == "event_loop":
outcome = yield
loop = outcome.get_result()
policy = asyncio.get_event_loop_policy()
policy.set_event_loop(loop)
return
if isasyncgenfunction(fixturedef.func):
# This is an async generator function. Wrap it accordingly.
generator = fixturedef.func
fixture_stripper = FixtureStripper(fixturedef)
fixture_stripper.add(FixtureStripper.EVENT_LOOP)
fixture_stripper.add(FixtureStripper.REQUEST)
def wrapper(*args, **kwargs):
loop = fixture_stripper.get_and_strip_from(FixtureStripper.EVENT_LOOP, kwargs)
request = fixture_stripper.get_and_strip_from(FixtureStripper.REQUEST, kwargs)
gen_obj = generator(*args, **kwargs)
async def setup():
res = await gen_obj.__anext__()
return res
def finalizer():
"""Yield again, to finalize."""
async def async_finalizer():
try:
await gen_obj.__anext__()
except StopAsyncIteration:
pass
else:
msg = "Async generator fixture didn't stop."
msg += "Yield only once."
raise ValueError(msg)
loop.run_until_complete(async_finalizer())
request.addfinalizer(finalizer)
return loop.run_until_complete(setup())
fixturedef.func = wrapper
elif inspect.iscoroutinefunction(fixturedef.func):
coro = fixturedef.func
fixture_stripper = FixtureStripper(fixturedef)
fixture_stripper.add(FixtureStripper.EVENT_LOOP)
def wrapper(*args, **kwargs):
loop = fixture_stripper.get_and_strip_from(FixtureStripper.EVENT_LOOP, kwargs)
async def setup():
res = await coro(*args, **kwargs)
return res
return loop.run_until_complete(setup())
fixturedef.func = wrapper
yield

It is called for each fixture and receives a fixturedef argument. fixturedefis a pytest type that describes a fixture and contains the fixture function object, among other information.

Now let's have a look at pytest_fixture_setup in detail: First, there is a special treatment for the event_loop:

if fixturedef.argname == "event_loop":

Then it checks if the fixture is any async generator:

if isasyncgenfunction(fixturedef.func):
)
However, this is not the case for your setup function, because it does not yield any value.

The last check is whether your fixture is a coroutine function.

elif inspect.iscoroutinefunction(fixturedef.func):
coro = fixturedef.func
fixture_stripper = FixtureStripper(fixturedef)
fixture_stripper.add(FixtureStripper.EVENT_LOOP)
def wrapper(*args, **kwargs):
loop = fixture_stripper.get_and_strip_from(FixtureStripper.EVENT_LOOP, kwargs)
async def setup():
res = await coro(*args, **kwargs)
return res
return loop.run_until_complete(setup())
fixturedef.func = wrapper
yield

This check should be true, so the function replaces the fixture with a wrapper. The wrapper retrieves an event loop, awaits the fixture, and returns the result.

The problem seems to be that the wrapper references a different self. It might be worth looking into functools.wrap and see if it solves the issue.

Did that make things clearer?

@Incanus3
Copy link
Author

Incanus3 commented Nov 16, 2020

Hi and thanks @seifertm, this is pretty helpful, even though I understood most of this before, at least conceptually (I didn't know how exactly does pytest.hookimpl work, but from your pointers I probably don't need to).

When I looked at this before, I actually made a mistake that's not directly related to pytest, but rather stems from my apparently not-so-great knowledge of asyncio - I thought the inspect.iscoroutinefunction branch would only be executed for the old-style @asyncio.coroutine decorated functions, not async ones, so I though if the name of the arg is not event_loop, it's not a generator function and it's not an asyncio.coroutine (which I now found out all async functions are) none of the branches takes effect.

The second thing I was struggling with still holds though - even though I can intercept the fixture initialization and replace it with a wrapper (or potentially a different function altogether), I don't see how I can influence the way the function is actually called later in the process. I went back to the code, added a small test and added a few debug prints to the pytest_fixture_setup function and lo and behold, the coroutine function branch indeed gets called, but if I print out the coro (i.e. fixturedef.func), I can see it is already a bound to the "wrong" object, that is, a different object than the self that is passed to the test method. I could do with this function anything I wanted, but since I don't have access to the "right" test class instance, I have no way of rebinding the function.

@seifertm
Copy link
Contributor

I can reproduce that that the self object is the same in the setup and pytest_fixture_setup, but different in the test case.

However, I currently have no idea why this should be the case. It seems not to be happening when using regular synchronous methods.

@asvetlov
Copy link
Contributor

@seifertm can I kindly ask you to check the self instance behavior for non-asyncio test cases?
Is it the same or not? Does pytest-asyncio break the standard rule?

@seifertm
Copy link
Contributor

Good question. I checked once with async test functions and once with non-async tests.

It seems that pytest-asyncio behaves differently here.

The output of the async tests:

in fixture
<test_self.TestAsyncFixture object at 0x7f77cf9727f0>
{'some_attr': 'value'}
in test
<test_self.TestAsyncFixture object at 0x7f77cf55a670>
{}

Output for the non-async tests:

in fixture
<test_self.TestAsyncFixture object at 0x7f0129c76670>
{'some_attr': 'value'}
in test
<test_self.TestAsyncFixture object at 0x7f0129c76670>
{'some_attr': 'value'}

@mjpieters
Copy link
Contributor

mjpieters commented Nov 6, 2022

I came here to report this same bug.

Pytest resolves fixtures that are bound methods each time a test method is run, by using the _pytest.fixtures.resolve_fixture_function() utility function, which looks for request.instance (where request is a FixtureRequest instance). If that attribute is set, it'll check if __self__ exists on the fixture and if the type of __self__ is compatible with the instance (isinstance(request.instance, fixturefunc.__self__.__class__)) before using fixturefunc.__get__(request.instance). When the fixture definition flag unittest is set, the isinstance() check is skipped, the method is rebound unconditionally in that case.

Now, this re-wrapping fails for pytest-asyncio fixtures because the _wrap_async wrapper doesn't have a __self__ attribute, nor can it be used as a bound method anyway. That's to be expected.

All this means there are two ways this can be fixed:

  1. If _wrap_async is passed a bound fixture method, have it unwrap the fixture function (use original.__func__) and if you had to unwrap, you need to rebind the _async_fixture_wrapper to the original __self__ attribute (use .__get__(original.__self__)) and have the wrapper pass on arbitrary positional arguments (*args) to the unbound fixture function. This way pytest's fixture re-binding using resolve_fixture_function() will work again as designed.
  2. Have _wrap_async resolve the fixture binding in the _async_fixture_wrapper; it has access to the same request, and so can rebind func inside _async_fixture_wrapper. It can't quite reuse resolve_fixture_function() here as you already replaced the bound fixture method, so you'd either have to re-implement that function or create a synthetic FixtureDef with the original bound fixture method.

Here is a version that re-implements the utility function, inline, each time it is called; I dropped the isinstance check the original makes, for simplicity:

def _wrap_async(func) -> None:
    @functools.wraps(func, assigned=(*functools.WRAPPER_ASSIGNMENTS, "__self__"))
    def _async_fixture_wrapper(
        event_loop: asyncio.AbstractEventLoop, request: SubRequest, **kwargs: Any
    ) -> _R:
        fixturefunc = func
        if request.instance is not None:
            # rebind bound fixture method to active instance
            try:
                unbound, self = fixturefunc.__func__, fixturefunc.__self__
            except AttributeError:
                pass
            else:
                fixturefunc = unbound.__get__(request.instance)

        async def setup() -> _R:
            res = await fixturefunc(**_add_kwargs(fixturefunc, kwargs, event_loop, request))
            return res

        return event_loop.run_until_complete(setup())

    return _async_fixture_wrapper

Using that version of _wrap_async fixes this bug for me.

I'll come up with a more complete implementation in a PR.

@seifertm
Copy link
Contributor

Thank you for the great explanation of the root cause!

dominiklohmann added a commit to tenzir/tenzir that referenced this issue Nov 16, 2022
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio)
from 0.20.1 to 0.20.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.20.2</h2>
<hr />
<h2>title: 'pytest-asyncio: pytest support for asyncio'</h2>
<p><a href="https://pypi.python.org/pypi/pytest-asyncio"><img
src="https://img.shields.io/pypi/v/pytest-asyncio.svg" alt="image"
/></a></p>
<p><a
href="https://github.com/pytest-dev/pytest-asyncio/actions?workflow=CI"><img
src="https://github.com/pytest-dev/pytest-asyncio/workflows/CI/badge.svg"
alt="image" /></a></p>
<p><a href="https://codecov.io/gh/pytest-dev/pytest-asyncio"><img
src="https://codecov.io/gh/pytest-dev/pytest-asyncio/branch/master/graph/badge.svg"
alt="image" /></a></p>
<p><a href="https://github.com/pytest-dev/pytest-asyncio"><img
src="https://img.shields.io/pypi/pyversions/pytest-asyncio.svg"
alt="Supported Python versions" /></a></p>
<p><a href="https://github.com/ambv/black"><img
src="https://img.shields.io/badge/code%20style-black-000000.svg"
alt="image" /></a></p>
<p>pytest-asyncio is an Apache2 licensed library, written in Python, for
testing asyncio code with pytest.</p>
<p>asyncio code is usually written in the form of coroutines, which
makes
it slightly more difficult to test using normal testing tools.
pytest-asyncio provides useful fixtures and markers to make testing
easier.</p>
<pre lang="{.sourceCode" data-meta=".python}"><code>@pytest.mark.asyncio
async def test_some_asyncio_code():
    res = await library.do_something()
    assert b&quot;expected result&quot; == res
</code></pre>
<p>pytest-asyncio has been strongly influenced by
<a
href="https://github.com/eugeniy/pytest-tornado">pytest-tornado</a>.</p>
<h1>Features</h1>
<ul>
<li>fixtures for creating and injecting versions of the asyncio event
loop</li>
<li>fixtures for injecting unused tcp/udp ports</li>
<li>pytest markers for treating tests as asyncio coroutines</li>
<li>easy testing with non-default event loops</li>
<li>support for [async def]{.title-ref} fixtures and async generator
fixtures</li>
<li>support <em>auto</em> mode to handle all async fixtures and tests
automatically by asyncio; provide <em>strict</em> mode if a test suite
should work with different async frameworks simultaneously, e.g.
<code>asyncio</code> and <code>trio</code>.</li>
</ul>
<h1>Installation</h1>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/blob/master/CHANGELOG.rst">pytest-asyncio's
changelog</a>.</em></p>
<blockquote>
<h1>0.20.2 (22-11-11)</h1>
<ul>
<li>Fixes an issue with async fixtures that are defined as methods on a
test class not being rebound to the actual test instance.
<code>[#197](pytest-dev/pytest-asyncio#197)
&lt;https://github.com/pytest-dev/pytest-asyncio/issues/197&gt;</code>_</li>
<li>Replaced usage of deprecated <code>@pytest.mark.tryfirst</code> with
<code>@pytest.hookimpl(tryfirst=True)</code>
<code>[#438](pytest-dev/pytest-asyncio#438)
&lt;https://github.com/pytest-dev/pytest-asyncio/pull/438&gt;</code>_</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/07a1416c2fe15d85fc149b3caa35b057de0b3d6e"><code>07a1416</code></a>
Prepare release of v0.20.2.</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/dc3ad211d160006b4a30996c0a2a2c29754ef1fc"><code>dc3ad21</code></a>
Build(deps): Bump pytest-trio in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/441">#441</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/d9faba85890334f0548732d35f1b1d54a850a69f"><code>d9faba8</code></a>
Build(deps): Bump mypy from 0.982 to 0.990 in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/440">#440</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/fe63e346154b61bbfe767e585b0b3b55fb37463e"><code>fe63e34</code></a>
Handle bound fixture methods correctly (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/439">#439</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/38fc0320c39e24a473240303fbc780213354e64d"><code>38fc032</code></a>
Bump to pytest 7.2.0 (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/438">#438</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/28ba705a81d041bd3b5487eb53ded447676dad37"><code>28ba705</code></a>
Build(deps): Bump hypothesis in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/437">#437</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/91e723a373952640e08d69adaff1957a8cbe8c8e"><code>91e723a</code></a>
Build(deps): Bump zipp from 3.9.0 to 3.10.0 in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/434">#434</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/0ca201b09a8ce2ff3ddc912ad434d9db34ef5078"><code>0ca201b</code></a>
Fix setuptools deprecation warning for license_file (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/432">#432</a>)</li>
<li>See full diff in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.20.1...v0.20.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pytest-asyncio&package-manager=pip&previous-version=0.20.1&new-version=0.20.2)](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 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>
bors bot added a commit to microsoft/Qcodes that referenced this issue Nov 29, 2022
4826: Update traitlets requirement from ~=5.5.0 to ~=5.6.0 r=jenshnielsen a=dependabot[bot]

Updates the requirements on [traitlets](https://github.com/ipython/traitlets) to permit the latest version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/ipython/traitlets/releases">traitlets's releases</a>.</em></p>
<blockquote>
<h2>v5.6.0</h2>
<h2>5.6.0</h2>
<p>(<a href="https://github.com/ipython/traitlets/compare/5.5.0...2c5188a3562f03c0703315b21df41ca7ace23dd3">Full Changelog</a>)</p>
<h3>Maintenance and upkeep improvements</h3>
<ul>
<li>Adopt jupyter releaser <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/806">#806</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Use base setup dependency type <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/805">#805</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>More CI Cleanup <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/803">#803</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>More maintenance cleanup <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/802">#802</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Add project description <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/801">#801</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Bump actions/setup-python from 2 to 4 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/798">#798</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Bump actions/checkout from 2 to 3 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/797">#797</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Bump pre-commit/action from 2.0.0 to 3.0.0 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/796">#796</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Bump actions/upload-artifact from 2 to 3 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/795">#795</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Add dependabot <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/794">#794</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Add more typings <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/791">#791</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Format changelog <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/789">#789</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
</ul>
<h3>Contributors to this release</h3>
<p>(<a href="https://github.com/ipython/traitlets/graphs/contributors?from=2022-10-18&amp;to=2022-11-29&amp;type=c">GitHub contributors page for this release</a>)</p>
<p><a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Ablink1073+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​blink1073</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Adependabot+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​dependabot</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Amaartenbreddels+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​maartenbreddels</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Apre-commit-ci+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​pre-commit-ci</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Armorshea+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​rmorshea</code></a></p>`
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/ipython/traitlets/blob/main/CHANGELOG.md">traitlets's changelog</a>.</em></p>
<blockquote>
<h2>5.6.0</h2>
<p>(<a href="https://github.com/ipython/traitlets/compare/5.5.0...2c5188a3562f03c0703315b21df41ca7ace23dd3">Full Changelog</a>)</p>
<h3>Maintenance and upkeep improvements</h3>
<ul>
<li>Adopt jupyter releaser <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/806">#806</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Use base setup dependency type <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/805">#805</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>More CI Cleanup <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/803">#803</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>More maintenance cleanup <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/802">#802</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Add project description <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/801">#801</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Bump actions/setup-python from 2 to 4 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/798">#798</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Bump actions/checkout from 2 to 3 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/797">#797</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Bump pre-commit/action from 2.0.0 to 3.0.0 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/796">#796</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Bump actions/upload-artifact from 2 to 3 <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/795">#795</a> (<a href="https://github.com/dependabot"><code>`@​dependabot</code></a>)</li>`
<li>Add dependabot <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/794">#794</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Add more typings <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/791">#791</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
<li>Format changelog <a href="https://github-redirect.dependabot.com/ipython/traitlets/pull/789">#789</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
</ul>
<h3>Contributors to this release</h3>
<p>(<a href="https://github.com/ipython/traitlets/graphs/contributors?from=2022-10-18&amp;to=2022-11-29&amp;type=c">GitHub contributors page for this release</a>)</p>
<p><a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Ablink1073+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​blink1073</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Adependabot+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​dependabot</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Amaartenbreddels+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​maartenbreddels</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Apre-commit-ci+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​pre-commit-ci</code></a>` | <a href="https://github.com/search?q=repo%3Aipython%2Ftraitlets+involves%3Armorshea+updated%3A2022-10-18..2022-11-29&amp;type=Issues"><code>`@​rmorshea</code></a></p>`
<!-- raw HTML omitted -->
<h2>5.5.0</h2>
<ul>
<li>Clean up application typing</li>
<li>Update tests and docs to use non-deprecated functions</li>
<li>Clean up version handling</li>
<li>Prep for jupyter releaser</li>
<li>Format the changelog</li>
</ul>
<h2>5.4.0</h2>
<ul>
<li>Fix version_info</li>
<li>Make generated config files more lintable</li>
<li>Fix union trait from string</li>
<li>Add security.md, and tidelift bage</li>
</ul>
<h2>5.3.0</h2>
<ul>
<li>Fix traitlet name in docstring</li>
<li>Re-support multiple-alias key for ArgParseConfigLoader</li>
</ul>
<h2>5.2.2</h2>
<ul>
<li>Make <code>traitlets.__all__</code> explicit and validate in test.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/ipython/traitlets/commit/0c3655cb80338833e515f25c3eb2c26ca37159bd"><code>0c3655c</code></a> Publish 5.6.0</li>
<li><a href="https://github.com/ipython/traitlets/commit/2c5188a3562f03c0703315b21df41ca7ace23dd3"><code>2c5188a</code></a> Adopt jupyter releaser (<a href="https://github-redirect.dependabot.com/ipython/traitlets/issues/806">#806</a>)</li>
<li><a href="https://github.com/ipython/traitlets/commit/21bdae98e578b06756dca53680434d3d23d0c3b7"><code>21bdae9</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://github-redirect.dependabot.com/ipython/traitlets/issues/807">#807</a>)</li>
<li><a href="https://github.com/ipython/traitlets/commit/d04d020d6406fb2c22faf55aa84977468d3eab7f"><code>d04d020</code></a> Use base setup dependency type (<a href="https://github-redirect.dependabot.com/ipython/traitlets/issues/805">#805</a>)</li>
<li><a href="https://github.com/ipython/traitlets/commit/d2bc5799994f4d63b083be4af84ef9ec997fd160"><code>d2bc579</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://github-redirect.dependabot.com/ipython/traitlets/issues/804">#804</a>)</li>
<li><a href="https://github.com/ipython/traitlets/commit/d344d48f84e7f4db69479a602b06fc44ea4d3762"><code>d344d48</code></a> More CI Cleanup (<a href="https://github-redirect.dependabot.com/ipython/traitlets/issues/803">#803</a>)</li>
<li><a href="https://github.com/ipython/traitlets/commit/65a4725a11c776054210583cf9da490e96bd2d23"><code>65a4725</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/ipython/traitlets/issues/802">#802</a> from blink1073/ci-cleanup</li>
<li><a href="https://github.com/ipython/traitlets/commit/53d35038dc2a2d1bdf37f20d8d53396d22ddbfc9"><code>53d3503</code></a> add codecov file</li>
<li><a href="https://github.com/ipython/traitlets/commit/98ee32848f34f100a5bb8087de3d491289610a94"><code>98ee328</code></a> more maintenance cleanup</li>
<li><a href="https://github.com/ipython/traitlets/commit/1077cfb03ae20eb0a5df731d947db1736cadb46a"><code>1077cfb</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/ipython/traitlets/issues/801">#801</a> from blink1073/add-project-description</li>
<li>Additional commits viewable in <a href="https://github.com/ipython/traitlets/compare/5.5.0...v5.6.0">compare view</a></li>
</ul>
</details>
<br />


You can trigger a rebase of this PR 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` 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>

4827: Update asttokens requirement from ~=2.1.0 to ~=2.2.0 r=jenshnielsen a=dependabot[bot]

Updates the requirements on [asttokens](https://github.com/gristlabs/asttokens) to permit the latest version.
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/gristlabs/asttokens/commit/ee35c90189554824e1e031012a4b020b7dd9fe81"><code>ee35c90</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/gristlabs/asttokens/issues/101">#101</a> from gristlabs/astroid</li>
<li><a href="https://github.com/gristlabs/asttokens/commit/17fb607f8de7f9e487b3ad23c0ff9d8c1c5266fe"><code>17fb607</code></a> fix is_empty_astroid_slice</li>
<li><a href="https://github.com/gristlabs/asttokens/commit/586ca787cc71a7483d78f9efb4ce50e2c97cb53b"><code>586ca78</code></a> coverage</li>
<li><a href="https://github.com/gristlabs/asttokens/commit/8a01fbca4518582eb16c81cdf64424bba9a750a9"><code>8a01fbc</code></a> mypy</li>
<li><a href="https://github.com/gristlabs/asttokens/commit/32b476b0f9f86c876b94dc53ffc319756705bcb8"><code>32b476b</code></a> comment on astroid_node_classes</li>
<li><a href="https://github.com/gristlabs/asttokens/commit/5c7e360f93b55553b6898f14936d9873461eb3a9"><code>5c7e360</code></a> Specifically ignore empty slices</li>
<li><a href="https://github.com/gristlabs/asttokens/commit/c30bd05009f74cbe6646571c2849cead29189290"><code>c30bd05</code></a> Fix tests for newest astroid</li>
<li>See full diff in <a href="https://github.com/gristlabs/asttokens/compare/2.1.0...2.2.0">compare view</a></li>
</ul>
</details>
<br />


You can trigger a rebase of this PR 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` 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>

4831: Bump pytest-asyncio from 0.20.1 to 0.20.2 r=jenshnielsen a=dependabot[bot]

Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.20.1 to 0.20.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.20.2</h2>
<hr />
<h2>title: 'pytest-asyncio: pytest support for asyncio'</h2>
<p><a href="https://pypi.python.org/pypi/pytest-asyncio"><img src="https://img.shields.io/pypi/v/pytest-asyncio.svg" alt="image" /></a></p>
<p><a href="https://github.com/pytest-dev/pytest-asyncio/actions?workflow=CI"><img src="https://github.com/pytest-dev/pytest-asyncio/workflows/CI/badge.svg" alt="image" /></a></p>
<p><a href="https://codecov.io/gh/pytest-dev/pytest-asyncio"><img src="https://codecov.io/gh/pytest-dev/pytest-asyncio/branch/master/graph/badge.svg" alt="image" /></a></p>
<p><a href="https://github.com/pytest-dev/pytest-asyncio"><img src="https://img.shields.io/pypi/pyversions/pytest-asyncio.svg" alt="Supported Python versions" /></a></p>
<p><a href="https://github.com/ambv/black"><img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="image" /></a></p>
<p>pytest-asyncio is an Apache2 licensed library, written in Python, for
testing asyncio code with pytest.</p>
<p>asyncio code is usually written in the form of coroutines, which makes
it slightly more difficult to test using normal testing tools.
pytest-asyncio provides useful fixtures and markers to make testing
easier.</p>
<pre lang="{.sourceCode" data-meta=".python}"><code>`@pytest.mark.asyncio`
async def test_some_asyncio_code():
    res = await library.do_something()
    assert b&quot;expected result&quot; == res
</code></pre>
<p>pytest-asyncio has been strongly influenced by
<a href="https://github.com/eugeniy/pytest-tornado">pytest-tornado</a>.</p>
<h1>Features</h1>
<ul>
<li>fixtures for creating and injecting versions of the asyncio event
loop</li>
<li>fixtures for injecting unused tcp/udp ports</li>
<li>pytest markers for treating tests as asyncio coroutines</li>
<li>easy testing with non-default event loops</li>
<li>support for [async def]{.title-ref} fixtures and async generator
fixtures</li>
<li>support <em>auto</em> mode to handle all async fixtures and tests
automatically by asyncio; provide <em>strict</em> mode if a test suite
should work with different async frameworks simultaneously, e.g.
<code>asyncio</code> and <code>trio</code>.</li>
</ul>
<h1>Installation</h1>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/pytest-dev/pytest-asyncio/blob/master/CHANGELOG.rst">pytest-asyncio's changelog</a>.</em></p>
<blockquote>
<h1>0.20.2 (22-11-11)</h1>
<ul>
<li>Fixes an issue with async fixtures that are defined as methods on a test class not being rebound to the actual test instance. <code>[#197](pytest-dev/pytest-asyncio#197) &lt;https://github.com/pytest-dev/pytest-asyncio/issues/197&gt;</code>_</li>
<li>Replaced usage of deprecated <code>`@pytest.mark.tryfirst</code>` with <code>`@pytest.hookimpl(tryfirst=True)</code>` <code>[#438](pytest-dev/pytest-asyncio#438) &lt;https://github.com/pytest-dev/pytest-asyncio/pull/438&gt;</code>_</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/07a1416c2fe15d85fc149b3caa35b057de0b3d6e"><code>07a1416</code></a> Prepare release of v0.20.2.</li>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/dc3ad211d160006b4a30996c0a2a2c29754ef1fc"><code>dc3ad21</code></a> Build(deps): Bump pytest-trio in /dependencies/default (<a href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/441">#441</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/d9faba85890334f0548732d35f1b1d54a850a69f"><code>d9faba8</code></a> Build(deps): Bump mypy from 0.982 to 0.990 in /dependencies/default (<a href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/440">#440</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/fe63e346154b61bbfe767e585b0b3b55fb37463e"><code>fe63e34</code></a> Handle bound fixture methods correctly (<a href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/439">#439</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/38fc0320c39e24a473240303fbc780213354e64d"><code>38fc032</code></a> Bump to pytest 7.2.0 (<a href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/438">#438</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/28ba705a81d041bd3b5487eb53ded447676dad37"><code>28ba705</code></a> Build(deps): Bump hypothesis in /dependencies/default (<a href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/437">#437</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/91e723a373952640e08d69adaff1957a8cbe8c8e"><code>91e723a</code></a> Build(deps): Bump zipp from 3.9.0 to 3.10.0 in /dependencies/default (<a href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/434">#434</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/0ca201b09a8ce2ff3ddc912ad434d9db34ef5078"><code>0ca201b</code></a> Fix setuptools deprecation warning for license_file (<a href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/432">#432</a>)</li>
<li>See full diff in <a href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.20.1...v0.20.2">compare view</a></li>
</ul>
</details>
<br />


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

You can trigger a rebase of this PR 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` 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>

4833: Bump pytest-rerunfailures from 10.2 to 10.3 r=jenshnielsen a=dependabot[bot]

Bumps [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures) from 10.2 to 10.3.
<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>10.3 (unreleased)</h2>
<p>Bug fixes
+++++++++</p>
<ul>
<li>
<p>Fix crash when pytest-xdist is installed but disabled.
(Thanks to <code>`@mgorny` &lt;https://github.com/mgorny&gt;</code>_ for the PR.)</p>
</li>
<li>
<p>Fix crash when xfail(strict=True) mark is used with --rerun-only flag.</p>
</li>
</ul>
<p>Features
++++++++</p>
<ul>
<li>Added option <code>--rerun-except</code> to rerun failed tests those are other than the mentioned Error.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/88496e913c4f7a85debff6a644b989fb5274715a"><code>88496e9</code></a> Preparing release 10.3</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/e80c12eb9456b7646c3c6610b2c08420e9247cd4"><code>e80c12e</code></a> replace pkg_resources with package+importlib.metadata</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/2731a8725967fb30db18c3c9301a80cf7954df5f"><code>2731a87</code></a> [pre-commit.ci] pre-commit autoupdate</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/43538ddb4e0663c7007e995eba20f717a9e862e6"><code>43538dd</code></a> [pre-commit.ci] pre-commit autoupdate</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/2b862b39ccd4e8fcce908d7f328285ee44632a1b"><code>2b862b3</code></a> Fix crash with strict xfail and --only-rerun flag</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/121ce30b17d89e2cde36804e8965ebc3199e19f2"><code>121ce30</code></a> [pre-commit.ci] pre-commit autoupdate</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/fc6c352095829b5134e0d321ee335ba829f7720f"><code>fc6c352</code></a> [pre-commit.ci] pre-commit autoupdate</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/e558b1b250a25ea0646404237cee13e27bab37fb"><code>e558b1b</code></a> [pre-commit.ci] pre-commit autoupdate</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/719b78f80d43f698481769814e55f869123922c1"><code>719b78f</code></a> [pre-commit.ci] auto fixes from pre-commit.com hooks</li>
<li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/bd040fc521e681df523be251cf0f408713ad8579"><code>bd040fc</code></a> [pre-commit.ci] pre-commit autoupdate</li>
<li>Additional commits viewable in <a href="https://github.com/pytest-dev/pytest-rerunfailures/compare/10.2...10.3">compare view</a></li>
</ul>
</details>
<br />


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

You can trigger a rebase of this PR 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` 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>

4834: Bump nbclient from 0.7.0 to 0.7.1 r=jenshnielsen a=dependabot[bot]

Bumps [nbclient](https://github.com/jupyter/nbclient) from 0.7.0 to 0.7.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/jupyter/nbclient/releases">nbclient's releases</a>.</em></p>
<blockquote>
<h2>v0.7.1</h2>
<h2>0.7.1</h2>
<p>(<a href="https://github.com/jupyter/nbclient/compare/v0.7.0...168340e8313e63fd9e037280f98ed22d47e2231b">Full Changelog</a>)</p>
<h3>Maintenance and upkeep improvements</h3>
<ul>
<li>CI Refactor <a href="https://github-redirect.dependabot.com/jupyter/nbclient/pull/257">#257</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
</ul>
<h3>Other merged PRs</h3>
<ul>
<li>Remove nest-asyncio <a href="https://github-redirect.dependabot.com/jupyter/nbclient/pull/259">#259</a> (<a href="https://github.com/davidbrochart"><code>`@​davidbrochart</code></a>)</li>`
<li>Add upper bound to dependencies <a href="https://github-redirect.dependabot.com/jupyter/nbclient/pull/258">#258</a> (<a href="https://github.com/davidbrochart"><code>`@​davidbrochart</code></a>)</li>`
</ul>
<h3>Contributors to this release</h3>
<p>(<a href="https://github.com/jupyter/nbclient/graphs/contributors?from=2022-10-06&amp;to=2022-11-29&amp;type=c">GitHub contributors page for this release</a>)</p>
<p><a href="https://github.com/search?q=repo%3Ajupyter%2Fnbclient+involves%3Ablink1073+updated%3A2022-10-06..2022-11-29&amp;type=Issues"><code>`@​blink1073</code></a>` | <a href="https://github.com/search?q=repo%3Ajupyter%2Fnbclient+involves%3Adavidbrochart+updated%3A2022-10-06..2022-11-29&amp;type=Issues"><code>`@​davidbrochart</code></a>` | <a href="https://github.com/search?q=repo%3Ajupyter%2Fnbclient+involves%3Apre-commit-ci+updated%3A2022-10-06..2022-11-29&amp;type=Issues"><code>`@​pre-commit-ci</code></a></p>`
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/jupyter/nbclient/blob/main/CHANGELOG.md">nbclient's changelog</a>.</em></p>
<blockquote>
<h2>0.7.1</h2>
<p>(<a href="https://github.com/jupyter/nbclient/compare/v0.7.0...168340e8313e63fd9e037280f98ed22d47e2231b">Full Changelog</a>)</p>
<h3>Maintenance and upkeep improvements</h3>
<ul>
<li>CI Refactor <a href="https://github-redirect.dependabot.com/jupyter/nbclient/pull/257">#257</a> (<a href="https://github.com/blink1073"><code>`@​blink1073</code></a>)</li>`
</ul>
<h3>Other merged PRs</h3>
<ul>
<li>Remove nest-asyncio <a href="https://github-redirect.dependabot.com/jupyter/nbclient/pull/259">#259</a> (<a href="https://github.com/davidbrochart"><code>`@​davidbrochart</code></a>)</li>`
<li>Add upper bound to dependencies <a href="https://github-redirect.dependabot.com/jupyter/nbclient/pull/258">#258</a> (<a href="https://github.com/davidbrochart"><code>`@​davidbrochart</code></a>)</li>`
</ul>
<h3>Contributors to this release</h3>
<p>(<a href="https://github.com/jupyter/nbclient/graphs/contributors?from=2022-10-06&amp;to=2022-11-29&amp;type=c">GitHub contributors page for this release</a>)</p>
<p><a href="https://github.com/search?q=repo%3Ajupyter%2Fnbclient+involves%3Ablink1073+updated%3A2022-10-06..2022-11-29&amp;type=Issues"><code>`@​blink1073</code></a>` | <a href="https://github.com/search?q=repo%3Ajupyter%2Fnbclient+involves%3Adavidbrochart+updated%3A2022-10-06..2022-11-29&amp;type=Issues"><code>`@​davidbrochart</code></a>` | <a href="https://github.com/search?q=repo%3Ajupyter%2Fnbclient+involves%3Apre-commit-ci+updated%3A2022-10-06..2022-11-29&amp;type=Issues"><code>`@​pre-commit-ci</code></a></p>`
<!-- raw HTML omitted -->
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/jupyter/nbclient/commit/beeb44a5c9334f53d96a54137aec50b3b053c7b9"><code>beeb44a</code></a> Publish 0.7.1</li>
<li><a href="https://github.com/jupyter/nbclient/commit/168340e8313e63fd9e037280f98ed22d47e2231b"><code>168340e</code></a> Remove nest-asyncio (<a href="https://github-redirect.dependabot.com/jupyter/nbclient/issues/259">#259</a>)</li>
<li><a href="https://github.com/jupyter/nbclient/commit/afc608c0d90c38107245095407163d1ecfa85c3b"><code>afc608c</code></a> CI Refactor (<a href="https://github-redirect.dependabot.com/jupyter/nbclient/issues/257">#257</a>)</li>
<li><a href="https://github.com/jupyter/nbclient/commit/765d2293b2bbdd82ef643cf3015ad8fa2d96c926"><code>765d229</code></a> Add upper bound to dependencies (<a href="https://github-redirect.dependabot.com/jupyter/nbclient/issues/258">#258</a>)</li>
<li><a href="https://github.com/jupyter/nbclient/commit/989cd568e0a1c300560034817ff7088c8aaa8cae"><code>989cd56</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://github-redirect.dependabot.com/jupyter/nbclient/issues/256">#256</a>)</li>
<li>See full diff in <a href="https://github.com/jupyter/nbclient/compare/v0.7.0...v0.7.1">compare view</a></li>
</ul>
</details>
<br />


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

You can trigger a rebase of this PR 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` 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>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
github-actions bot pushed a commit to afonasev/deta_todo_service that referenced this issue Feb 1, 2023
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio)
from 0.20.1 to 0.20.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.20.3</h2>
<hr />
<h2>title: 'pytest-asyncio'</h2>
<p><a href="https://pypi.python.org/pypi/pytest-asyncio"><img
src="https://img.shields.io/pypi/v/pytest-asyncio.svg" alt="image"
/></a></p>
<p><a
href="https://github.com/pytest-dev/pytest-asyncio/actions?workflow=CI"><img
src="https://github.com/pytest-dev/pytest-asyncio/workflows/CI/badge.svg"
alt="image" /></a></p>
<p><a href="https://codecov.io/gh/pytest-dev/pytest-asyncio"><img
src="https://codecov.io/gh/pytest-dev/pytest-asyncio/branch/master/graph/badge.svg"
alt="image" /></a></p>
<p><a href="https://github.com/pytest-dev/pytest-asyncio"><img
src="https://img.shields.io/pypi/pyversions/pytest-asyncio.svg"
alt="Supported Python versions" /></a></p>
<p><a href="https://github.com/ambv/black"><img
src="https://img.shields.io/badge/code%20style-black-000000.svg"
alt="image" /></a></p>
<p>pytest-asyncio is a
<a href="https://docs.pytest.org/en/latest/contents.html">pytest</a>
plugin. It
facilitates testing of code that uses the
<a href="https://docs.python.org/3/library/asyncio.html">asyncio</a>
library.</p>
<p>Specifically, pytest-asyncio provides support for coroutines as test
functions. This allows users to <em>await</em> code inside their tests.
For
example, the following code is executed as a test item by pytest:</p>
<pre lang="{.python}"><code>@pytest.mark.asyncio
async def test_some_asyncio_code():
    res = await library.do_something()
    assert b&quot;expected result&quot; == res
</code></pre>
<p>Note that test classes subclassing the standard
<a href="https://docs.python.org/3/library/unittest.html">unittest</a>
library are
not supported. Users are advised to use
<a
href="https://docs.python.org/3/library/unittest.html#unittest.IsolatedAsyncioTestCase">unittest.IsolatedAsyncioTestCase</a>
or an async framework such as
<a href="https://asynctest.readthedocs.io/en/latest">asynctest</a>.</p>
<p>pytest-asyncio is available under the <a
href="https://github.com/pytest-dev/pytest-asyncio/blob/master/LICENSE">Apache
License
2.0</a>.</p>
<h1>Installation</h1>
<p>To install pytest-asyncio, simply:</p>
<pre lang="{.bash}"><code>$ pip install pytest-asyncio
</code></pre>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/blob/master/CHANGELOG.rst">pytest-asyncio's
changelog</a>.</em></p>
<blockquote>
<h1>0.20.3 (22-12-08)</h1>
<ul>
<li>Prevent DeprecationWarning to bubble up on CPython 3.10.9 and
3.11.1.
<code>[#460](pytest-dev/pytest-asyncio#460)
&lt;https://github.com/pytest-dev/pytest-asyncio/issues/460&gt;</code>_</li>
</ul>
<h1>0.20.2 (22-11-11)</h1>
<ul>
<li>Fixes an issue with async fixtures that are defined as methods on a
test class not being rebound to the actual test instance.
<code>[#197](pytest-dev/pytest-asyncio#197)
&lt;https://github.com/pytest-dev/pytest-asyncio/issues/197&gt;</code>_</li>
<li>Replaced usage of deprecated <code>@pytest.mark.tryfirst</code> with
<code>@pytest.hookimpl(tryfirst=True)</code>
<code>[#438](pytest-dev/pytest-asyncio#438)
&lt;https://github.com/pytest-dev/pytest-asyncio/pull/438&gt;</code>_</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/007e8ec12662ffd896c6151239dc7ed1402dc710"><code>007e8ec</code></a>
[fix] Prevent DeprecationWarning about existing event loops to bubble up
into...</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/44ca3da2ad68ea672d07a76ccc065922e13b5d5b"><code>44ca3da</code></a>
Build(deps): Bump zipp from 3.10.0 to 3.11.0 in /dependencies/default
(<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/455">#455</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/c3c601cfd9a59e52b555cfd8313d16dbc15fb704"><code>c3c601c</code></a>
Build(deps): Bump pypa/gh-action-pypi-publish from 1.5.1 to 1.5.2 (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/456">#456</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/a962e2bc89e1181de77e486b1d7cbd7815662350"><code>a962e2b</code></a>
Build(deps): Bump importlib-metadata in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/454">#454</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/56a393abec9b60d4e061b053dfdf8ce6985c8b6b"><code>56a393a</code></a>
Simplify README, move most content to a separate user documentation. (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/448">#448</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/3c78732497e02cfb4463fafd7c5b17bf1c88ce95"><code>3c78732</code></a>
Build(deps): Bump hypothesis in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/453">#453</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/d6a9a72ef1749a864e64ac6222a8d0da99e67de5"><code>d6a9a72</code></a>
Build(deps): Bump exceptiongroup in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/451">#451</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/42da7a0fea2b2bf0846dbbed5d1abcf56c7fa38b"><code>42da7a0</code></a>
Build(deps): Bump hypothesis in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/450">#450</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/0b281b1b76b93c29894519e0750a4f8634786741"><code>0b281b1</code></a>
Build(deps): Bump mypy from 0.990 to 0.991 in /dependencies/default (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/446">#446</a>)</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/d39589c0353657ee6d75d38db779cc4ecb2491c4"><code>d39589c</code></a>
Update pre-commit hooks (<a
href="https://github-redirect.dependabot.com/pytest-dev/pytest-asyncio/issues/449">#449</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.20.1...v0.20.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pytest-asyncio&package-manager=pip&previous-version=0.20.1&new-version=0.20.3)](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 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] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
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.

5 participants