pytest-asyncio 1.2.0__tar.gz → 1.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/PKG-INFO +3 -4
  2. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/constraints.txt +17 -17
  3. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/migrate_from_0_23.rst +2 -0
  4. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/changelog.rst +30 -0
  5. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pyproject.toml +2 -3
  6. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio/plugin.py +3 -8
  7. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio.egg-info/PKG-INFO +3 -4
  8. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio.egg-info/requires.txt +1 -1
  9. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/hypothesis/test_base.py +1 -1
  10. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/test_class_scope.py +21 -6
  11. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/test_function_scope.py +20 -5
  12. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/test_invalid_arguments.py +8 -4
  13. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/test_module_scope.py +21 -6
  14. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/test_package_scope.py +20 -5
  15. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/test_session_scope.py +21 -6
  16. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/modes/test_strict_mode.py +4 -4
  17. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_asyncio_mark.py +14 -7
  18. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_event_loop_fixture.py +3 -53
  19. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_fixture_loop_scopes.py +6 -5
  20. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_set_event_loop.py +3 -3
  21. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tox.ini +2 -3
  22. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/.readthedocs.yaml +0 -0
  23. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/LICENSE +0 -0
  24. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/MANIFEST.in +0 -0
  25. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/Makefile +0 -0
  26. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/README.rst +0 -0
  27. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/SECURITY.rst +0 -0
  28. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/changelog.d/.gitkeep +0 -0
  29. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/dependencies/docs/constraints.txt +0 -0
  30. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/dependencies/pytest-min/constraints.txt +0 -0
  31. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/dependencies/pytest-min/requirements.txt +0 -0
  32. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/concepts.rst +0 -0
  33. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/concepts_concurrent_execution_example.py +0 -0
  34. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/concepts_function_scope_example.py +0 -0
  35. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/concepts_module_scope_example.py +0 -0
  36. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/conf.py +0 -0
  37. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/change_default_fixture_loop.rst +0 -0
  38. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/change_default_test_loop.rst +0 -0
  39. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/change_fixture_loop.rst +0 -0
  40. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/change_fixture_loop_example.py +0 -0
  41. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/class_scoped_loop_example.py +0 -0
  42. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/index.rst +0 -0
  43. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/migrate_from_0_21.rst +0 -0
  44. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/module_scoped_loop_example.py +0 -0
  45. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/multiple_loops.rst +0 -0
  46. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/multiple_loops_example.py +0 -0
  47. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/package_scoped_loop_example.py +0 -0
  48. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/parametrize_with_asyncio.rst +0 -0
  49. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/parametrize_with_asyncio_example.py +0 -0
  50. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/run_class_tests_in_same_loop.rst +0 -0
  51. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/run_module_tests_in_same_loop.rst +0 -0
  52. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/run_package_tests_in_same_loop.rst +0 -0
  53. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/test_item_is_async.rst +0 -0
  54. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/test_item_is_async_example.py +0 -0
  55. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/how-to-guides/uvloop.rst +0 -0
  56. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/index.rst +0 -0
  57. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/configuration.rst +0 -0
  58. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/decorators/index.rst +0 -0
  59. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/decorators/pytest_asyncio_fixture_example.py +0 -0
  60. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/fixtures/event_loop_policy_example.py +0 -0
  61. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/fixtures/event_loop_policy_parametrized_example.py +0 -0
  62. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/fixtures/index.rst +0 -0
  63. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/functions.rst +0 -0
  64. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/index.rst +0 -0
  65. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/markers/class_scoped_loop_custom_policies_strict_mode_example.py +0 -0
  66. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/markers/class_scoped_loop_strict_mode_example.py +0 -0
  67. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/markers/class_scoped_loop_with_fixture_strict_mode_example.py +0 -0
  68. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/markers/function_scoped_loop_pytestmark_strict_mode_example.py +0 -0
  69. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/markers/function_scoped_loop_strict_mode_example.py +0 -0
  70. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/markers/index.rst +0 -0
  71. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/reference/markers/module_scoped_loop_strict_mode_example.py +0 -0
  72. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/docs/support.rst +0 -0
  73. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio/__init__.py +0 -0
  74. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio/py.typed +0 -0
  75. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio.egg-info/SOURCES.txt +0 -0
  76. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio.egg-info/dependency_links.txt +0 -0
  77. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio.egg-info/entry_points.txt +0 -0
  78. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/pytest_asyncio.egg-info/top_level.txt +0 -0
  79. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/setup.cfg +0 -0
  80. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/__init__.py +0 -0
  81. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/async_fixtures/__init__.py +0 -0
  82. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/async_fixtures/test_async_fixtures.py +0 -0
  83. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/async_fixtures/test_async_fixtures_contextvars.py +0 -0
  84. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/async_fixtures/test_nested.py +0 -0
  85. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/async_fixtures/test_shared_module_fixture.py +0 -0
  86. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/conftest.py +0 -0
  87. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/hypothesis/__init__.py +0 -0
  88. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/__init__.py +0 -0
  89. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/markers/test_mixed_scope.py +0 -0
  90. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/modes/__init__.py +0 -0
  91. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/modes/test_auto_mode.py +0 -0
  92. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_asyncio_debug.py +0 -0
  93. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_asyncio_fixture.py +0 -0
  94. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_doctest.py +0 -0
  95. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_import.py +0 -0
  96. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_is_async_test.py +0 -0
  97. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_package.py +0 -0
  98. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_port_factories.py +0 -0
  99. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_simple.py +0 -0
  100. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_skips.py +0 -0
  101. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_subprocess.py +0 -0
  102. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tests/test_task_cleanup.py +0 -0
  103. {pytest_asyncio-1.2.0 → pytest_asyncio-1.3.0}/tools/get-version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytest-asyncio
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: Pytest support for asyncio
5
5
  Author-email: Tin Tvrtković <tinchester@gmail.com>
6
6
  Maintainer-email: Michael Seifert <m.seifert@digitalernachschub.de>
@@ -15,7 +15,6 @@ Classifier: Framework :: AsyncIO
15
15
  Classifier: Framework :: Pytest
16
16
  Classifier: Intended Audience :: Developers
17
17
  Classifier: Programming Language :: Python :: 3 :: Only
18
- Classifier: Programming Language :: Python :: 3.9
19
18
  Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
@@ -23,11 +22,11 @@ Classifier: Programming Language :: Python :: 3.13
23
22
  Classifier: Programming Language :: Python :: 3.14
24
23
  Classifier: Topic :: Software Development :: Testing
25
24
  Classifier: Typing :: Typed
26
- Requires-Python: >=3.9
25
+ Requires-Python: >=3.10
27
26
  Description-Content-Type: text/x-rst
28
27
  License-File: LICENSE
29
28
  Requires-Dist: backports-asyncio-runner<2,>=1.1; python_version < "3.11"
30
- Requires-Dist: pytest<9,>=8.2
29
+ Requires-Dist: pytest<10,>=8.2
31
30
  Requires-Dist: typing-extensions>=4.12; python_version < "3.13"
32
31
  Provides-Extra: docs
33
32
  Requires-Dist: sphinx>=5.3; extra == "docs"
@@ -1,22 +1,22 @@
1
1
  alabaster==0.7.16
2
2
  annotated-types-0.7.0
3
- attrs==25.3.0
3
+ attrs==25.4.0
4
4
  babel==2.17.0
5
5
  backports.asyncio.runner==1.2.0
6
6
  backports.tarfile==1.2.0
7
- certifi==2025.8.3
8
- charset-normalizer==3.4.3
7
+ certifi==2025.10.5
8
+ charset-normalizer==3.4.4
9
9
  check-wheel-contents==0.6.1
10
- cffi==1.17.1
10
+ cffi==2.0.0
11
11
  click==8.1.8
12
- coverage==7.10.6
13
- cryptography==45.0.7
12
+ coverage==7.10.7
13
+ cryptography==46.0.3
14
14
  docutils==0.21.2
15
15
  exceptiongroup==1.3.0
16
- hypothesis==6.138.15
16
+ hypothesis==6.141.1
17
17
  iniconfig==2.1.0
18
18
  id==1.5.0
19
- idna==3.10
19
+ idna==3.11
20
20
  imagesize==1.4.1
21
21
  importlib_metadata==8.7.0
22
22
  iniconfig==2.1.0
@@ -27,25 +27,25 @@ jeepney==0.9.0
27
27
  Jinja2==3.1.6
28
28
  keyring==25.6.0
29
29
  markdown-it-py==3.0.0
30
- MarkupSafe==3.0.2
30
+ MarkupSafe==3.0.3
31
31
  mdurl==0.1.2
32
32
  more-itertools==10.8.0
33
- nh3==0.3.0
33
+ nh3==0.3.2
34
34
  packaging==25.0
35
35
  pluggy==1.6.0
36
36
  Pygments==2.19.2
37
- pycparser==2.22
38
- pydantic==2.11.7
37
+ pycparser==2.23
38
+ pydantic==2.11.10
39
39
  pydantic-core==2.33.2
40
- pytest==8.4.2
40
+ pytest==9.0.0
41
41
  readme-renderer==44.0
42
42
  requests==2.32.5
43
43
  requests-toolbelt==1.0.0
44
44
  rfc3986==2.0.0
45
- rich==14.1.0
45
+ rich==14.2.0
46
46
  SecretStorage==3.3.3
47
47
  setuptools==80.9.0
48
- setuptools-scm==9.2.0
48
+ setuptools-scm==9.2.2
49
49
  snowballstemmer==3.0.1
50
50
  sortedcontainers==2.4.0
51
51
  Sphinx==8.0.2
@@ -57,10 +57,10 @@ sphinxcontrib-jquery==4.1
57
57
  sphinxcontrib-jsmath==1.0.1
58
58
  sphinxcontrib-qthelp==2.0.0
59
59
  sphinxcontrib-serializinghtml==2.0.0
60
- tomli==2.2.1
60
+ tomli==2.3.0
61
61
  twine==6.2.0
62
62
  typing_extensions==4.15.0
63
- typing-inspection==0.4.1
63
+ typing-inspection==0.4.2
64
64
  urllib3==2.5.0
65
65
  wheel-filename==1.4.2
66
66
  zipp==3.23.0
@@ -1,3 +1,5 @@
1
+ .. _how_to_guides/migrate_from_0_23:
2
+
1
3
  ========================================
2
4
  How to migrate from pytest-asyncio v0.23
3
5
  ========================================
@@ -10,6 +10,28 @@ This project uses `towncrier <https://towncrier.readthedocs.io/>`__ for changlog
10
10
 
11
11
  .. towncrier release notes start
12
12
 
13
+ `1.3.0 <https://github.com/pytest-dev/pytest-asyncio/tree/1.3.0>`_ - 2025-11-10
14
+ ===============================================================================
15
+
16
+ Removed
17
+ -------
18
+
19
+ - Support for Python 3.9 (`#1278 <https://github.com/pytest-dev/pytest-asyncio/issues/1278>`_)
20
+
21
+
22
+ Added
23
+ -----
24
+
25
+ - Support for pytest 9 (`#1279 <https://github.com/pytest-dev/pytest-asyncio/issues/1279>`_)
26
+
27
+
28
+ Notes for Downstream Packagers
29
+ ------------------------------
30
+
31
+ - Tested Python versions include free threaded Python 3.14t (`#1274 <https://github.com/pytest-dev/pytest-asyncio/issues/1274>`_)
32
+ - Tests are run in the same pytest process, instead of spawning a subprocess with `pytest.Pytester.runpytest_subprocess`. This prevents the test suite from accidentally using a system installation of pytest-asyncio, which could result in test errors. (`#1275 <https://github.com/pytest-dev/pytest-asyncio/issues/1275>`_)
33
+
34
+
13
35
  `1.2.0 <https://github.com/pytest-dev/pytest-asyncio/tree/1.2.0>`_ - 2025-09-12
14
36
  ===============================================================================
15
37
 
@@ -62,6 +84,10 @@ Notes for Downstream Packagers
62
84
  `1.0.0 <https://github.com/pytest-dev/pytest-asyncio/tree/1.0.0>`_ - 2025-05-26
63
85
  ===============================================================================
64
86
 
87
+ .. seealso::
88
+
89
+ :ref:`How to migrate from pytest-asyncio v0.23 <how_to_guides/migrate_from_0_23>`
90
+
65
91
  Removed
66
92
  -------
67
93
 
@@ -211,6 +237,10 @@ As of v0.23, pytest-asyncio attaches an asyncio event loop to each item of the t
211
237
  This release is backwards-compatible with v0.21.
212
238
  Changes are non-breaking, unless you upgrade from v0.22.
213
239
 
240
+ .. seealso::
241
+
242
+ :ref:`How to migrate from pytest-asyncio v0.21 <how_to_guides/migrate_from_0_21>`
243
+
214
244
  - BREAKING: The *asyncio_event_loop* mark has been removed. Event loops with class, module, package, and session scopes can be requested via the *scope* keyword argument to the _asyncio_ mark.
215
245
  - Introduces the *event_loop_policy* fixture which allows testing with non-default or multiple event loops `#662 <https://github.com/pytest-dev/pytest-asyncio/pull/662>`_
216
246
  - Introduces ``pytest_asyncio.is_async_test`` which returns whether a test item is managed by pytest-asyncio `#376 <https://github.com/pytest-dev/pytest-asyncio/issues/376>`_
@@ -20,14 +20,13 @@ maintainers = [
20
20
  authors = [
21
21
  { name = "Tin Tvrtković", email = "tinchester@gmail.com" },
22
22
  ]
23
- requires-python = ">=3.9"
23
+ requires-python = ">=3.10"
24
24
  classifiers = [
25
25
  "Development Status :: 5 - Production/Stable",
26
26
  "Framework :: AsyncIO",
27
27
  "Framework :: Pytest",
28
28
  "Intended Audience :: Developers",
29
29
  "Programming Language :: Python :: 3 :: Only",
30
- "Programming Language :: Python :: 3.9",
31
30
  "Programming Language :: Python :: 3.10",
32
31
  "Programming Language :: Python :: 3.11",
33
32
  "Programming Language :: Python :: 3.12",
@@ -42,7 +41,7 @@ dynamic = [
42
41
 
43
42
  dependencies = [
44
43
  "backports-asyncio-runner>=1.1,<2; python_version<'3.11'",
45
- "pytest>=8.2,<9",
44
+ "pytest>=8.2,<10",
46
45
  "typing-extensions>=4.12; python_version<'3.13'",
47
46
  ]
48
47
  optional-dependencies.docs = [
@@ -16,6 +16,7 @@ from asyncio import AbstractEventLoop, AbstractEventLoopPolicy
16
16
  from collections.abc import (
17
17
  AsyncIterator,
18
18
  Awaitable,
19
+ Callable,
19
20
  Generator,
20
21
  Iterable,
21
22
  Iterator,
@@ -24,10 +25,9 @@ from collections.abc import (
24
25
  from types import AsyncGeneratorType, CoroutineType
25
26
  from typing import (
26
27
  Any,
27
- Callable,
28
28
  Literal,
29
+ ParamSpec,
29
30
  TypeVar,
30
- Union,
31
31
  overload,
32
32
  )
33
33
 
@@ -49,11 +49,6 @@ from pytest import (
49
49
  PytestPluginManager,
50
50
  )
51
51
 
52
- if sys.version_info >= (3, 10):
53
- from typing import ParamSpec
54
- else:
55
- from typing_extensions import ParamSpec
56
-
57
52
  if sys.version_info >= (3, 11):
58
53
  from asyncio import Runner
59
54
  else:
@@ -65,7 +60,7 @@ else:
65
60
  from typing_extensions import TypeIs
66
61
 
67
62
  _ScopeName = Literal["session", "package", "module", "class", "function"]
68
- _R = TypeVar("_R", bound=Union[Awaitable[Any], AsyncIterator[Any]])
63
+ _R = TypeVar("_R", bound=Awaitable[Any] | AsyncIterator[Any])
69
64
  _P = ParamSpec("_P")
70
65
  FixtureFunction = Callable[_P, _R]
71
66
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytest-asyncio
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: Pytest support for asyncio
5
5
  Author-email: Tin Tvrtković <tinchester@gmail.com>
6
6
  Maintainer-email: Michael Seifert <m.seifert@digitalernachschub.de>
@@ -15,7 +15,6 @@ Classifier: Framework :: AsyncIO
15
15
  Classifier: Framework :: Pytest
16
16
  Classifier: Intended Audience :: Developers
17
17
  Classifier: Programming Language :: Python :: 3 :: Only
18
- Classifier: Programming Language :: Python :: 3.9
19
18
  Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
@@ -23,11 +22,11 @@ Classifier: Programming Language :: Python :: 3.13
23
22
  Classifier: Programming Language :: Python :: 3.14
24
23
  Classifier: Topic :: Software Development :: Testing
25
24
  Classifier: Typing :: Typed
26
- Requires-Python: >=3.9
25
+ Requires-Python: >=3.10
27
26
  Description-Content-Type: text/x-rst
28
27
  License-File: LICENSE
29
28
  Requires-Dist: backports-asyncio-runner<2,>=1.1; python_version < "3.11"
30
- Requires-Dist: pytest<9,>=8.2
29
+ Requires-Dist: pytest<10,>=8.2
31
30
  Requires-Dist: typing-extensions>=4.12; python_version < "3.13"
32
31
  Provides-Extra: docs
33
32
  Requires-Dist: sphinx>=5.3; extra == "docs"
@@ -1,4 +1,4 @@
1
- pytest<9,>=8.2
1
+ pytest<10,>=8.2
2
2
 
3
3
  [:python_version < "3.11"]
4
4
  backports-asyncio-runner<2,>=1.1
@@ -27,7 +27,7 @@ def test_hypothesis_given_decorator_before_asyncio_mark(pytester: Pytester):
27
27
  """
28
28
  )
29
29
  )
30
- result = pytester.runpytest_subprocess("--asyncio-mode=strict", "-W default")
30
+ result = pytester.runpytest("--asyncio-mode=strict", "-W default")
31
31
  result.assert_outcomes(passed=1)
32
32
 
33
33
 
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
+ import sys
6
7
  from textwrap import dedent
7
8
 
8
9
  import pytest
@@ -143,8 +144,15 @@ def test_asyncio_mark_respects_the_loop_policy(
143
144
  """
144
145
  )
145
146
  )
146
- result = pytester.runpytest("--asyncio-mode=strict")
147
- result.assert_outcomes(passed=2)
147
+ pytest_args = ["--asyncio-mode=strict"]
148
+ if sys.version_info >= (3, 14):
149
+ pytest_args.extend(["-W", "default"])
150
+ result = pytester.runpytest(*pytest_args)
151
+ if sys.version_info >= (3, 14):
152
+ result.assert_outcomes(passed=2, warnings=3)
153
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
154
+ else:
155
+ result.assert_outcomes(passed=2)
148
156
 
149
157
 
150
158
  def test_asyncio_mark_respects_parametrized_loop_policies(
@@ -175,8 +183,15 @@ def test_asyncio_mark_respects_parametrized_loop_policies(
175
183
  """
176
184
  )
177
185
  )
178
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
179
- result.assert_outcomes(passed=2)
186
+ pytest_args = ["--asyncio-mode=strict"]
187
+ if sys.version_info >= (3, 14):
188
+ pytest_args.extend(["-W", "default"])
189
+ result = pytester.runpytest(*pytest_args)
190
+ if sys.version_info >= (3, 14):
191
+ result.assert_outcomes(passed=2, warnings=2)
192
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
193
+ else:
194
+ result.assert_outcomes(passed=2)
180
195
 
181
196
 
182
197
  def test_asyncio_mark_provides_class_scoped_loop_to_fixtures(
@@ -205,7 +220,7 @@ def test_asyncio_mark_provides_class_scoped_loop_to_fixtures(
205
220
  """
206
221
  )
207
222
  )
208
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
223
+ result = pytester.runpytest("--asyncio-mode=strict")
209
224
  result.assert_outcomes(passed=1)
210
225
 
211
226
 
@@ -293,5 +308,5 @@ def test_standalone_test_does_not_trigger_warning_about_no_current_event_loop_be
293
308
  """
294
309
  )
295
310
  )
296
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
311
+ result = pytester.runpytest("--asyncio-mode=strict")
297
312
  result.assert_outcomes(warnings=0, passed=1)
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import sys
3
4
  from textwrap import dedent
4
5
 
5
6
  from pytest import Pytester
@@ -87,7 +88,7 @@ def test_warns_when_scope_argument_is_present(pytester: Pytester):
87
88
  """
88
89
  )
89
90
  )
90
- result = pytester.runpytest("--asyncio-mode=strict", "--assert=plain")
91
+ result = pytester.runpytest("--asyncio-mode=strict", "-W", "default")
91
92
  result.assert_outcomes(passed=1, warnings=1)
92
93
  result.stdout.fnmatch_lines("*DeprecationWarning*")
93
94
 
@@ -119,8 +120,15 @@ def test_asyncio_mark_respects_the_loop_policy(
119
120
  """
120
121
  ),
121
122
  )
122
- result = pytester.runpytest("--asyncio-mode=strict")
123
- result.assert_outcomes(passed=1)
123
+ pytest_args = ["--asyncio-mode=strict"]
124
+ if sys.version_info >= (3, 14):
125
+ pytest_args.extend(["-W", "default"])
126
+ result = pytester.runpytest(*pytest_args)
127
+ if sys.version_info >= (3, 14):
128
+ result.assert_outcomes(passed=1, warnings=2)
129
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
130
+ else:
131
+ result.assert_outcomes(passed=1)
124
132
 
125
133
 
126
134
  def test_asyncio_mark_respects_parametrized_loop_policies(
@@ -157,8 +165,15 @@ def test_asyncio_mark_respects_parametrized_loop_policies(
157
165
  """
158
166
  )
159
167
  )
160
- result = pytester.runpytest("--asyncio-mode=strict")
161
- result.assert_outcomes(passed=2)
168
+ pytest_args = ["--asyncio-mode=strict"]
169
+ if sys.version_info >= (3, 14):
170
+ pytest_args.extend(["-W", "default"])
171
+ result = pytester.runpytest(*pytest_args)
172
+ if sys.version_info >= (3, 14):
173
+ result.assert_outcomes(passed=2, warnings=3)
174
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
175
+ else:
176
+ result.assert_outcomes(passed=2)
162
177
 
163
178
 
164
179
  def test_asyncio_mark_provides_function_scoped_loop_to_fixtures(
@@ -8,6 +8,7 @@ import pytest
8
8
  def test_no_error_when_scope_passed_as_sole_keyword_argument(
9
9
  pytester: pytest.Pytester,
10
10
  ):
11
+ pytester.makeini("[pytest]\nasyncio_default_fixture_loop_scope = function")
11
12
  pytester.makepyfile(
12
13
  dedent(
13
14
  """\
@@ -19,7 +20,7 @@ def test_no_error_when_scope_passed_as_sole_keyword_argument(
19
20
  """
20
21
  )
21
22
  )
22
- result = pytester.runpytest_subprocess()
23
+ result = pytester.runpytest("--assert=plain")
23
24
  result.assert_outcomes(passed=1)
24
25
  result.stdout.no_fnmatch_line("*ValueError*")
25
26
 
@@ -27,6 +28,7 @@ def test_no_error_when_scope_passed_as_sole_keyword_argument(
27
28
  def test_error_when_scope_passed_as_positional_argument(
28
29
  pytester: pytest.Pytester,
29
30
  ):
31
+ pytester.makeini("[pytest]\nasyncio_default_fixture_loop_scope = function")
30
32
  pytester.makepyfile(
31
33
  dedent(
32
34
  """\
@@ -38,7 +40,7 @@ def test_error_when_scope_passed_as_positional_argument(
38
40
  """
39
41
  )
40
42
  )
41
- result = pytester.runpytest_subprocess()
43
+ result = pytester.runpytest("--assert=plain")
42
44
  result.assert_outcomes(errors=1)
43
45
  result.stdout.fnmatch_lines(
44
46
  ["*ValueError: mark.asyncio accepts only a keyword argument*"]
@@ -48,6 +50,7 @@ def test_error_when_scope_passed_as_positional_argument(
48
50
  def test_error_when_wrong_keyword_argument_is_passed(
49
51
  pytester: pytest.Pytester,
50
52
  ):
53
+ pytester.makeini("[pytest]\nasyncio_default_fixture_loop_scope = function")
51
54
  pytester.makepyfile(
52
55
  dedent(
53
56
  """\
@@ -59,7 +62,7 @@ def test_error_when_wrong_keyword_argument_is_passed(
59
62
  """
60
63
  )
61
64
  )
62
- result = pytester.runpytest_subprocess()
65
+ result = pytester.runpytest("--assert=plain")
63
66
  result.assert_outcomes(errors=1)
64
67
  result.stdout.fnmatch_lines(
65
68
  ["*ValueError: mark.asyncio accepts only a keyword argument 'loop_scope'*"]
@@ -69,6 +72,7 @@ def test_error_when_wrong_keyword_argument_is_passed(
69
72
  def test_error_when_additional_keyword_arguments_are_passed(
70
73
  pytester: pytest.Pytester,
71
74
  ):
75
+ pytester.makeini("[pytest]\nasyncio_default_fixture_loop_scope = function")
72
76
  pytester.makepyfile(
73
77
  dedent(
74
78
  """\
@@ -80,7 +84,7 @@ def test_error_when_additional_keyword_arguments_are_passed(
80
84
  """
81
85
  )
82
86
  )
83
- result = pytester.runpytest_subprocess()
87
+ result = pytester.runpytest("--assert=plain")
84
88
  result.assert_outcomes(errors=1)
85
89
  result.stdout.fnmatch_lines(
86
90
  ["*ValueError: mark.asyncio accepts only a keyword argument*"]
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import sys
3
4
  from textwrap import dedent
4
5
 
5
6
  from pytest import Pytester
@@ -87,8 +88,15 @@ def test_asyncio_mark_respects_the_loop_policy(
87
88
  """
88
89
  ),
89
90
  )
90
- result = pytester.runpytest("--asyncio-mode=strict")
91
- result.assert_outcomes(passed=2)
91
+ pytest_args = ["--asyncio-mode=strict"]
92
+ if sys.version_info >= (3, 14):
93
+ pytest_args.extend(["-W", "default"])
94
+ result = pytester.runpytest(*pytest_args)
95
+ if sys.version_info >= (3, 14):
96
+ result.assert_outcomes(passed=2, warnings=3)
97
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
98
+ else:
99
+ result.assert_outcomes(passed=2)
92
100
 
93
101
 
94
102
  def test_asyncio_mark_respects_parametrized_loop_policies(
@@ -119,8 +127,15 @@ def test_asyncio_mark_respects_parametrized_loop_policies(
119
127
  """
120
128
  )
121
129
  )
122
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
123
- result.assert_outcomes(passed=2)
130
+ pytest_args = ["--asyncio-mode=strict"]
131
+ if sys.version_info >= (3, 14):
132
+ pytest_args.extend(["-W", "default"])
133
+ result = pytester.runpytest(*pytest_args)
134
+ if sys.version_info >= (3, 14):
135
+ result.assert_outcomes(passed=2, warnings=2)
136
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
137
+ else:
138
+ result.assert_outcomes(passed=2)
124
139
 
125
140
 
126
141
  def test_asyncio_mark_provides_module_scoped_loop_to_fixtures(
@@ -150,7 +165,7 @@ def test_asyncio_mark_provides_module_scoped_loop_to_fixtures(
150
165
  """
151
166
  )
152
167
  )
153
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
168
+ result = pytester.runpytest("--asyncio-mode=strict")
154
169
  result.assert_outcomes(passed=1)
155
170
 
156
171
 
@@ -298,5 +313,5 @@ def test_standalone_test_does_not_trigger_warning_about_no_current_event_loop_be
298
313
  """
299
314
  )
300
315
  )
301
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
316
+ result = pytester.runpytest("--asyncio-mode=strict")
302
317
  result.assert_outcomes(warnings=0, passed=1)
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import sys
3
4
  from textwrap import dedent
4
5
 
5
6
  from pytest import Pytester
@@ -127,8 +128,15 @@ def test_asyncio_mark_respects_the_loop_policy(
127
128
  """
128
129
  ),
129
130
  )
130
- result = pytester.runpytest("--asyncio-mode=strict")
131
- result.assert_outcomes(passed=2)
131
+ pytest_args = ["--asyncio-mode=strict"]
132
+ if sys.version_info >= (3, 14):
133
+ pytest_args.extend(["-W", "default"])
134
+ result = pytester.runpytest(*pytest_args)
135
+ if sys.version_info >= (3, 14):
136
+ result.assert_outcomes(passed=2, warnings=3)
137
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
138
+ else:
139
+ result.assert_outcomes(passed=2)
132
140
 
133
141
 
134
142
  def test_asyncio_mark_respects_parametrized_loop_policies(
@@ -160,8 +168,15 @@ def test_asyncio_mark_respects_parametrized_loop_policies(
160
168
  """
161
169
  ),
162
170
  )
163
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
164
- result.assert_outcomes(passed=2)
171
+ pytest_args = ["--asyncio-mode=strict"]
172
+ if sys.version_info >= (3, 14):
173
+ pytest_args.extend(["-W", "default"])
174
+ result = pytester.runpytest(*pytest_args)
175
+ if sys.version_info >= (3, 14):
176
+ result.assert_outcomes(passed=2, warnings=2)
177
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
178
+ else:
179
+ result.assert_outcomes(passed=2)
165
180
 
166
181
 
167
182
  def test_asyncio_mark_provides_package_scoped_loop_to_fixtures(
@@ -207,7 +222,7 @@ def test_asyncio_mark_provides_package_scoped_loop_to_fixtures(
207
222
  """
208
223
  ),
209
224
  )
210
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
225
+ result = pytester.runpytest("--asyncio-mode=strict")
211
226
  result.assert_outcomes(passed=1)
212
227
 
213
228
 
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import sys
3
4
  from textwrap import dedent
4
5
 
5
6
  from pytest import Pytester
@@ -128,8 +129,15 @@ def test_asyncio_mark_respects_the_loop_policy(
128
129
  """
129
130
  ),
130
131
  )
131
- result = pytester.runpytest("--asyncio-mode=strict")
132
- result.assert_outcomes(passed=2)
132
+ pytest_args = ["--asyncio-mode=strict"]
133
+ if sys.version_info >= (3, 14):
134
+ pytest_args.extend(["-W", "default"])
135
+ result = pytester.runpytest(*pytest_args)
136
+ if sys.version_info >= (3, 14):
137
+ result.assert_outcomes(passed=2, warnings=3)
138
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
139
+ else:
140
+ result.assert_outcomes(passed=2)
133
141
 
134
142
 
135
143
  def test_asyncio_mark_respects_parametrized_loop_policies(
@@ -161,8 +169,15 @@ def test_asyncio_mark_respects_parametrized_loop_policies(
161
169
  """
162
170
  ),
163
171
  )
164
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
165
- result.assert_outcomes(passed=2)
172
+ pytest_args = ["--asyncio-mode=strict"]
173
+ if sys.version_info >= (3, 14):
174
+ pytest_args.extend(["-W", "default"])
175
+ result = pytester.runpytest(*pytest_args)
176
+ if sys.version_info >= (3, 14):
177
+ result.assert_outcomes(passed=2, warnings=2)
178
+ result.stdout.fnmatch_lines("*DefaultEventLoopPolicy*")
179
+ else:
180
+ result.assert_outcomes(passed=2)
166
181
 
167
182
 
168
183
  def test_asyncio_mark_provides_session_scoped_loop_to_fixtures(
@@ -212,7 +227,7 @@ def test_asyncio_mark_provides_session_scoped_loop_to_fixtures(
212
227
  """
213
228
  )
214
229
  )
215
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
230
+ result = pytester.runpytest("--asyncio-mode=strict")
216
231
  result.assert_outcomes(passed=1)
217
232
 
218
233
 
@@ -423,5 +438,5 @@ def test_standalone_test_does_not_trigger_warning_about_no_current_event_loop_be
423
438
  """
424
439
  )
425
440
  )
426
- result = pytester.runpytest_subprocess("--asyncio-mode=strict")
441
+ result = pytester.runpytest("--asyncio-mode=strict")
427
442
  result.assert_outcomes(warnings=0, passed=1)
@@ -94,7 +94,7 @@ def test_strict_mode_ignores_unmarked_coroutine(pytester: Pytester):
94
94
  """
95
95
  )
96
96
  )
97
- result = pytester.runpytest_subprocess("--asyncio-mode=strict", "-W default")
97
+ result = pytester.runpytest("--asyncio-mode=strict", "-W default", "--assert=plain")
98
98
  if pytest_version >= (8, 4, 0):
99
99
  result.assert_outcomes(failed=1, skipped=0, warnings=0)
100
100
  else:
@@ -119,7 +119,7 @@ def test_strict_mode_ignores_unmarked_fixture(pytester: Pytester):
119
119
  """
120
120
  )
121
121
  )
122
- result = pytester.runpytest_subprocess("--asyncio-mode=strict", "-W default")
122
+ result = pytester.runpytest("--asyncio-mode=strict", "-W default", "--assert=plain")
123
123
 
124
124
  if pytest_version >= (8, 4, 0):
125
125
  result.assert_outcomes(failed=1, skipped=0, warnings=2)
@@ -155,7 +155,7 @@ def test_strict_mode_marked_test_unmarked_fixture_warning(pytester: Pytester):
155
155
  """
156
156
  )
157
157
  )
158
- result = pytester.runpytest_subprocess("--asyncio-mode=strict", "-W default")
158
+ result = pytester.runpytest("--asyncio-mode=strict", "-W default", "--assert=plain")
159
159
  if pytest_version >= (8, 4, 0):
160
160
  result.assert_outcomes(passed=1, failed=0, skipped=0, warnings=2)
161
161
  else:
@@ -202,7 +202,7 @@ def test_strict_mode_marked_test_unmarked_autouse_fixture_warning(pytester: Pyte
202
202
  """
203
203
  )
204
204
  )
205
- result = pytester.runpytest_subprocess("--asyncio-mode=strict", "-W default")
205
+ result = pytester.runpytest("--asyncio-mode=strict", "-W default", "--assert=plain")
206
206
  if pytest_version >= (8, 4, 0):
207
207
  result.assert_outcomes(passed=1, warnings=2)
208
208
  else: