zope.pytestlayer 9.0__tar.gz → 9.2__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 (100) hide show
  1. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/.pre-commit-config.yaml +5 -5
  2. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/.readthedocs.yaml +2 -2
  3. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/CHANGES.rst +16 -0
  4. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/CONTRIBUTING.md +2 -2
  5. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/MANIFEST.in +3 -2
  6. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/PKG-INFO +20 -4
  7. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/pyproject.toml +5 -2
  8. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/setup.py +4 -4
  9. zope_pytestlayer-9.2/sitecustomize.py +17 -0
  10. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/_compat.py +2 -2
  11. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/fixture.py +2 -1
  12. zope_pytestlayer-9.2/src/zope/pytestlayer/tests/conftest.py +6 -0
  13. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/test_doctest.py +1 -1
  14. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/test_integration.py +29 -27
  15. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope.pytestlayer.egg-info/PKG-INFO +20 -4
  16. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope.pytestlayer.egg-info/SOURCES.txt +1 -0
  17. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope.pytestlayer.egg-info/requires.txt +1 -1
  18. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/tox.ini +10 -7
  19. zope_pytestlayer-9.0/src/zope/pytestlayer/tests/conftest.py +0 -3
  20. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/COPYRIGHT.txt +0 -0
  21. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/HACKING.rst +0 -0
  22. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/LICENSE.txt +0 -0
  23. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/README.rst +0 -0
  24. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/docs/about.rst +0 -0
  25. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/docs/api.rst +0 -0
  26. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/docs/changes.rst +0 -0
  27. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/docs/conf.py +0 -0
  28. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/docs/index.rst +0 -0
  29. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/pytest.ini +0 -0
  30. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/setup.cfg +0 -0
  31. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/__init__.py +0 -0
  32. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/doctest.py +0 -0
  33. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/layered.py +0 -0
  34. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/plugin.py +0 -0
  35. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/testing.py +0 -0
  36. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/__init__.py +0 -0
  37. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/bad_layer/__init__.py +0 -0
  38. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/bad_layer/conftest.py +0 -0
  39. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/bad_layer/test_core.py +0 -0
  40. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/custom_fixture_name/__init__.py +0 -0
  41. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/custom_fixture_name/conftest.py +0 -0
  42. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/custom_fixture_name/test_core.py +0 -0
  43. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/keep_layer_across_test_classes/__init__.py +0 -0
  44. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/keep_layer_across_test_classes/conftest.py +0 -0
  45. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/keep_layer_across_test_classes/test_core.py +0 -0
  46. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/layers_with_same_name/__init__.py +0 -0
  47. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/layers_with_same_name/conftest.py +0 -0
  48. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/layers_with_same_name/test_core.py +0 -0
  49. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/no_setup_or_teardown/__init__.py +0 -0
  50. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/no_setup_or_teardown/conftest.py +0 -0
  51. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/no_setup_or_teardown/test_core.py +0 -0
  52. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_by_layer/__init__.py +0 -0
  53. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_by_layer/conftest.py +0 -0
  54. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_by_layer/test_core.py +0 -0
  55. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_with_layered_suite/__init__.py +0 -0
  56. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_with_layered_suite/conftest.py +0 -0
  57. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_with_layered_suite/foo.txt +0 -0
  58. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_with_layered_suite/foobar.txt +0 -0
  59. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/order_with_layered_suite/test_core.py +0 -0
  60. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/session_fixture/__init__.py +0 -0
  61. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/session_fixture/conftest.py +0 -0
  62. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/session_fixture/test_core.py +0 -0
  63. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/shared_with_layered_suite/__init__.py +0 -0
  64. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/shared_with_layered_suite/conftest.py +0 -0
  65. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/shared_with_layered_suite/mydoctest.txt +0 -0
  66. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/shared_with_layered_suite/test_core.py +0 -0
  67. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer/__init__.py +0 -0
  68. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer/conftest.py +0 -0
  69. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer/test_core.py +0 -0
  70. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer_in_two_modules/__init__.py +0 -0
  71. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer_in_two_modules/conftest.py +0 -0
  72. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer_in_two_modules/test_core.py +0 -0
  73. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer_in_two_modules/test_second_module.py +0 -0
  74. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer_with_unattached_base_layer/__init__.py +0 -0
  75. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer_with_unattached_base_layer/conftest.py +0 -0
  76. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layer_with_unattached_base_layer/test_core.py +0 -0
  77. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layered_suite/__init__.py +0 -0
  78. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layered_suite/conftest.py +0 -0
  79. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layered_suite/doctest.txt +0 -0
  80. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/single_layered_suite/test_core.py +0 -0
  81. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layered_suites/__init__.py +0 -0
  82. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layered_suites/bar.txt +0 -0
  83. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layered_suites/conftest.py +0 -0
  84. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layered_suites/foo.txt +0 -0
  85. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layered_suites/test_core.py +0 -0
  86. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layers/__init__.py +0 -0
  87. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layers/conftest.py +0 -0
  88. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_dependent_layers/test_core.py +0 -0
  89. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_independent_layers/__init__.py +0 -0
  90. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_independent_layers/conftest.py +0 -0
  91. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/two_independent_layers/test_core.py +0 -0
  92. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/with_and_without_layer/__init__.py +0 -0
  93. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/with_and_without_layer/conftest.py +0 -0
  94. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/fixture/with_and_without_layer/test_core.py +0 -0
  95. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/test_fixture.py +0 -0
  96. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope/pytestlayer/tests/test_layer.py +0 -0
  97. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope.pytestlayer.egg-info/dependency_links.txt +0 -0
  98. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope.pytestlayer.egg-info/entry_points.txt +0 -0
  99. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope.pytestlayer.egg-info/not-zip-safe +0 -0
  100. {zope_pytestlayer-9.0 → zope_pytestlayer-9.2}/src/zope.pytestlayer.egg-info/top_level.txt +0 -0
@@ -1,9 +1,9 @@
1
- # Generated from:
2
- # https://github.com/zopefoundation/meta/tree/master/config/pure-python
1
+ # Generated with zope.meta (https://zopemeta.readthedocs.io/) from:
2
+ # https://github.com/zopefoundation/meta/tree/master/src/zope/meta/pure-python
3
3
  minimum_pre_commit_version: '3.6'
4
4
  repos:
5
5
  - repo: https://github.com/pycqa/isort
6
- rev: "6.0.1"
6
+ rev: "7.0.0"
7
7
  hooks:
8
8
  - id: isort
9
9
  - repo: https://github.com/hhatto/autopep8
@@ -12,10 +12,10 @@ repos:
12
12
  - id: autopep8
13
13
  args: [--in-place, --aggressive, --aggressive]
14
14
  - repo: https://github.com/asottile/pyupgrade
15
- rev: v3.20.0
15
+ rev: v3.21.2
16
16
  hooks:
17
17
  - id: pyupgrade
18
- args: [--py39-plus]
18
+ args: [--py310-plus]
19
19
  - repo: https://github.com/isidentical/teyit
20
20
  rev: 0.4.3
21
21
  hooks:
@@ -1,5 +1,5 @@
1
- # Generated from:
2
- # https://github.com/zopefoundation/meta/tree/master/config/pure-python
1
+ # Generated with zope.meta (https://zopemeta.readthedocs.io/) from:
2
+ # https://github.com/zopefoundation/meta/tree/master/src/zope/meta/pure-python
3
3
  # Read the Docs configuration file
4
4
  # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
5
5
 
@@ -2,6 +2,22 @@
2
2
  Change log for zope.pytestlayer
3
3
  =================================
4
4
 
5
+ 9.2 (2026-06-30)
6
+ ================
7
+
8
+ - Add compatibility for ``pytest >= 9.1``, requiring at least that version.
9
+
10
+
11
+ 9.1 (2025-12-03)
12
+ ================
13
+
14
+ - Add compatibility for ``pytest >= 9``.
15
+
16
+ - Add support for Python 3.13, 3.14.
17
+
18
+ - Drop support for Python 3.9.
19
+
20
+
5
21
  9.0 (2025-09-12)
6
22
  ================
7
23
 
@@ -1,6 +1,6 @@
1
1
  <!--
2
- Generated from:
3
- https://github.com/zopefoundation/meta/tree/master/config/pure-python
2
+ Generated with zope.meta (https://zopemeta.readthedocs.io/) from:
3
+ https://github.com/zopefoundation/meta/tree/master/src/zope/meta/pure-python
4
4
  -->
5
5
  # Contributing to zopefoundation projects
6
6
 
@@ -1,5 +1,5 @@
1
- # Generated from:
2
- # https://github.com/zopefoundation/meta/tree/master/config/pure-python
1
+ # Generated with zope.meta (https://zopemeta.readthedocs.io/) from:
2
+ # https://github.com/zopefoundation/meta/tree/master/src/zope/meta/pure-python
3
3
  include *.md
4
4
  include *.rst
5
5
  include *.txt
@@ -12,6 +12,7 @@ recursive-include docs *.rst
12
12
  recursive-include docs Makefile
13
13
 
14
14
  recursive-include src *.py
15
+ include *.py
15
16
  include *.yaml
16
17
  include pytest.ini
17
18
  recursive-include src *.txt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zope.pytestlayer
3
- Version: 9.0
3
+ Version: 9.2
4
4
  Summary: Integration of zope.testrunner-style test layers into pytest framework
5
5
  Home-page: https://github.com/zopefoundation/zope.pytestlayer/
6
6
  Author: gocept
@@ -18,11 +18,11 @@ Classifier: License :: OSI Approved :: Zope Public License
18
18
  Classifier: Natural Language :: English
19
19
  Classifier: Operating System :: OS Independent
20
20
  Classifier: Programming Language :: Python :: 3
21
- Classifier: Programming Language :: Python :: 3.9
22
21
  Classifier: Programming Language :: Python :: 3.10
23
22
  Classifier: Programming Language :: Python :: 3.11
24
23
  Classifier: Programming Language :: Python :: 3.12
25
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
26
26
  Classifier: Programming Language :: Python :: Implementation
27
27
  Classifier: Programming Language :: Python :: Implementation :: CPython
28
28
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -30,9 +30,9 @@ Classifier: Topic :: Software Development
30
30
  Classifier: Topic :: Software Development :: Libraries
31
31
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
32
32
  Classifier: Topic :: Software Development :: Testing
33
- Requires-Python: >=3.9
33
+ Requires-Python: >=3.10
34
34
  License-File: LICENSE.txt
35
- Requires-Dist: pytest>=8
35
+ Requires-Dist: pytest>=9.1
36
36
  Requires-Dist: setuptools
37
37
  Requires-Dist: zope.dottedname
38
38
  Provides-Extra: test
@@ -178,6 +178,22 @@ Developing zope.pytestlayer
178
178
  Change log for zope.pytestlayer
179
179
  =================================
180
180
 
181
+ 9.2 (2026-06-30)
182
+ ================
183
+
184
+ - Add compatibility for ``pytest >= 9.1``, requiring at least that version.
185
+
186
+
187
+ 9.1 (2025-12-03)
188
+ ================
189
+
190
+ - Add compatibility for ``pytest >= 9``.
191
+
192
+ - Add support for Python 3.13, 3.14.
193
+
194
+ - Drop support for Python 3.9.
195
+
196
+
181
197
  9.0 (2025-09-12)
182
198
  ================
183
199
 
@@ -1,10 +1,12 @@
1
- #
1
+ # Generated with zope.meta (https://zopemeta.readthedocs.io/) from:
2
+ # https://github.com/zopefoundation/meta/tree/master/src/zope/meta/pure-python
3
+ #
2
4
  # Generated from:
3
5
  # https://github.com/zopefoundation/meta/tree/master/config/pure-python
4
6
 
5
7
  [build-system]
6
8
  requires = [
7
- "setuptools == 78.1.1",
9
+ "setuptools >= 78.1.1,< 81",
8
10
  "wheel",
9
11
  ]
10
12
  build-backend = "setuptools.build_meta"
@@ -12,6 +14,7 @@ build-backend = "setuptools.build_meta"
12
14
  [tool.coverage.run]
13
15
  branch = true
14
16
  source = ["zope.pytestlayer"]
17
+ parallel = true
15
18
 
16
19
  [tool.coverage.report]
17
20
  fail_under = 98
@@ -5,11 +5,11 @@ from setuptools import setup
5
5
 
6
6
  setup(
7
7
  name='zope.pytestlayer',
8
- version='9.0',
8
+ version='9.2',
9
9
 
10
- python_requires='>=3.9',
10
+ python_requires='>=3.10',
11
11
  install_requires=[
12
- 'pytest >= 8',
12
+ 'pytest >= 9.1',
13
13
  'setuptools',
14
14
  'zope.dottedname',
15
15
  ],
@@ -48,11 +48,11 @@ setup(
48
48
  "Natural Language :: English",
49
49
  "Operating System :: OS Independent",
50
50
  "Programming Language :: Python :: 3",
51
- "Programming Language :: Python :: 3.9",
52
51
  "Programming Language :: Python :: 3.10",
53
52
  "Programming Language :: Python :: 3.11",
54
53
  "Programming Language :: Python :: 3.12",
55
54
  "Programming Language :: Python :: 3.13",
55
+ "Programming Language :: Python :: 3.14",
56
56
  "Programming Language :: Python :: Implementation",
57
57
  "Programming Language :: Python :: Implementation :: CPython",
58
58
  "Programming Language :: Python :: Implementation :: PyPy",
@@ -0,0 +1,17 @@
1
+ """
2
+ Coverage sitecustomize - enable coverage for subprocess started via
3
+ subprocess.Popen
4
+ """
5
+ import atexit
6
+ import os
7
+
8
+
9
+ # Check if coverage subprocess tracking is enabled
10
+ if 'COVERAGE_PROCESS_START' in os.environ:
11
+ import coverage
12
+
13
+ # Start coverage in this subprocess
14
+ cov = coverage.Coverage(
15
+ config_file=os.environ['COVERAGE_PROCESS_START'])
16
+ cov.start()
17
+ atexit.register(cov.save)
@@ -2,10 +2,10 @@
2
2
  def _searchbases(cls, accum):
3
3
  # Simulate the "classic class" search order.
4
4
  if cls in accum:
5
- return
5
+ return # pragma: no cover
6
6
  accum.append(cls)
7
7
  for base in cls.__bases__:
8
- _searchbases(base, accum)
8
+ _searchbases(base, accum) # pragma: no cover
9
9
 
10
10
 
11
11
  def getmro(cls):
@@ -207,7 +207,8 @@ def parsefactories(collector, layer):
207
207
  name = get_fixture_name(layer, scope='function')
208
208
  module = types.ModuleType(name)
209
209
  module.__dict__.update(ns)
210
- collector.session._fixturemanager.parsefactories(module, '')
210
+ collector.session._fixturemanager.parsefactories(
211
+ holder=module, node=collector.session)
211
212
 
212
213
 
213
214
  def raise_if_bad_layer(layer):
@@ -0,0 +1,6 @@
1
+ import pathlib
2
+
3
+
4
+ def pytest_ignore_collect(collection_path: pathlib.Path, config):
5
+ if str(collection_path).endswith('fixture'):
6
+ return True
@@ -5,7 +5,7 @@ class Dummy:
5
5
  """This class has a doctest.
6
6
 
7
7
  It tests the workaround for
8
- https://github.com/zope/zope.pytestlayer/issues/4
8
+ https://github.com/zopefoundation/zope.pytestlayer/issues/4
9
9
 
10
10
  >>> print('foobar.')
11
11
  foobar.
@@ -1,4 +1,6 @@
1
+ import os
1
2
  import os.path
3
+ import pathlib
2
4
  import re
3
5
  import subprocess
4
6
  import sys
@@ -14,13 +16,16 @@ normalizers = [
14
16
  (r'\.py::(test_suite)::/', r'.py <- \1: /'),
15
17
  (r'\.py::(test)', r'.py:NN: \1'),
16
18
  (r'\.py::(.*Test)::', r'.py:NN: \1.'),
17
- # Compatibility with pytest >= 7.3 which adds this line:
18
19
  (r'configfile: pytest.ini', ''),
20
+ (r'cachedir:.*\n', ''),
21
+ (r'rootdir:.*\n', ''),
19
22
  # With pytest >= 3.3.0 progress is reported after a test result.
20
23
  # matches [NNN%], [ NN%] and [ N%]
21
24
  (r'PASSED \[\s*\d{1,3}%\]', 'PASSED'),
22
- # needed to omit all other loaded plugins.
23
- (r'plugins:.*(zope.pytestlayer).*\n', 'plugins: zope.pytestlayer\n'),
25
+ # Omit coverage warnings:
26
+ (r'.*CoverageWarning:.*', ''),
27
+ (r'.*slug="module-not-measured".*', ''),
28
+ (r'.*slug="no-data-collected".*', ''),
24
29
  ]
25
30
 
26
31
 
@@ -44,22 +49,38 @@ def where(request):
44
49
 
45
50
  def run_pytest(name, *args):
46
51
  cmd = [
47
- sys.argv[0], '-vs', '-p', 'no:removestalebytecode',
52
+ sys.executable, '-m', 'pytest', '-vs', '-p', 'no:removestalebytecode',
48
53
  '--disable-pytest-warnings',
49
54
  os.path.join(os.path.dirname(__file__), 'fixture', name),
50
55
  ]
51
56
  cmd.extend(args)
57
+
58
+ # Set up environment for coverage in subprocess
59
+ env = os.environ.copy()
60
+
61
+ # If running under coverage, enable subprocess tracking
62
+ if 'COVERAGE_FILE' in env:
63
+ env['COVERAGE_PROCESS_START'] = 'pyproject.toml'
64
+ # Add project root to PYTHONPATH so sitecustomize.py is found
65
+ project_root = str(pathlib.Path(__file__).parent.parent.parent.parent)
66
+ env['PYTHONPATH'] = project_root + ':' + env.get('PYTHONPATH', '')
67
+ else:
68
+ # Just make brach coverage happy as this branch is only hit when
69
+ # running without coverage
70
+ pass # pragma: no cover
71
+
52
72
  process = subprocess.Popen(
53
73
  cmd,
54
74
  stdout=subprocess.PIPE,
55
- stderr=subprocess.STDOUT)
75
+ stderr=subprocess.STDOUT,
76
+ env=env)
56
77
  output = process.stdout.read().decode('latin-1')
57
78
  for pattern, replacement in normalizers:
58
79
  output = re.sub(pattern, replacement, output)
59
- lines = output.splitlines(True)
80
+ lines = output.strip().splitlines(True)
60
81
  # Sometimes the output ends with an escape sequence so omitting them to
61
82
  # make tests happy:
62
- if lines[-1] == '\x1b[?1034h':
83
+ if lines[-1] == '\x1b[?1034h': # pragma: no cover
63
84
  lines.pop(-1)
64
85
  return lines
65
86
 
@@ -72,7 +93,6 @@ def join(lines, start=4, end=1):
72
93
  def test_single_layer(where):
73
94
  lines = run_pytest('single_layer')
74
95
  assert """\
75
- plugins: zope.pytestlayer
76
96
  collecting ... collected 1 item
77
97
  src/zope/pytestlayer/tests/fixture/single_layer/test_core.py:NN: FooTest.test_dummy single_layer.test_core.FooLayer
78
98
  Set up single_layer.test_core.FooLayer in N.NNN seconds.
@@ -87,7 +107,6 @@ Tear down single_layer.test_core.FooLayer in N.NNN seconds.
87
107
  def test_single_layer_with_unattached_base_layer(where):
88
108
  lines = run_pytest('single_layer_with_unattached_base_layer')
89
109
  assert """\
90
- plugins: zope.pytestlayer
91
110
  collecting ... collected 1 item
92
111
  src/zope/pytestlayer/tests/fixture/single_layer_with_unattached_base_layer/test_core.py:NN: FooTest.test_dummy single_layer_with_unattached_base_layer.test_core.BarLayer
93
112
  Set up single_layer_with_unattached_base_layer.test_core.BarLayer in N.NNN seconds.
@@ -109,7 +128,6 @@ def test_single_layer_with_unattached_base_layer_select_layer(where):
109
128
  'single_layer_with_unattached_base_layer', '-k', 'BarLayer'
110
129
  )
111
130
  assert """\
112
- plugins: zope.pytestlayer
113
131
  collecting ... collected 1 item
114
132
  src/zope/pytestlayer/tests/fixture/single_layer_with_unattached_base_layer/test_core.py:NN: FooTest.test_dummy single_layer_with_unattached_base_layer.test_core.BarLayer
115
133
  Set up single_layer_with_unattached_base_layer.test_core.BarLayer in N.NNN seconds.
@@ -129,7 +147,6 @@ Tear down single_layer_with_unattached_base_layer.test_core.BarLayer in N.NNN se
129
147
  def test_single_layer_in_two_modules(where):
130
148
  lines = run_pytest('single_layer_in_two_modules')
131
149
  assert """\
132
- plugins: zope.pytestlayer
133
150
  collecting ... collected 2 items
134
151
  src/zope/pytestlayer/tests/fixture/single_layer_in_two_modules/test_core.py:NN: FooTest.test_dummy single_layer_in_two_modules.test_core.FooLayer
135
152
  Set up single_layer_in_two_modules.test_core.FooLayer in N.NNN seconds.
@@ -148,7 +165,6 @@ Tear down single_layer_in_two_modules.test_core.FooLayer in N.NNN seconds.
148
165
  def test_single_layered_suite(where):
149
166
  lines = run_pytest('single_layered_suite')
150
167
  assert """\
151
- plugins: zope.pytestlayer
152
168
  collecting ... collected 1 item
153
169
  src/zope/pytestlayer/tests/fixture/single_layered_suite/test_core.py <- test_suite: /src/zope/pytestlayer/tests/fixture/single_layered_suite/doctest.txt single_layered_suite.test_core.FooLayer
154
170
  Set up single_layered_suite.test_core.FooLayer in N.NNN seconds.
@@ -163,7 +179,6 @@ Tear down single_layered_suite.test_core.FooLayer in N.NNN seconds.
163
179
  def test_shared_with_layered_suite(where):
164
180
  lines = run_pytest('shared_with_layered_suite')
165
181
  assert """\
166
- plugins: zope.pytestlayer
167
182
  collecting ... collected 2 items
168
183
  src/zope/pytestlayer/tests/fixture/shared_with_layered_suite/test_core.py:NN: FooTest.test_dummy shared_with_layered_suite.test_core.FooLayer
169
184
  Set up shared_with_layered_suite.test_core.FooLayer in N.NNN seconds.
@@ -182,7 +197,6 @@ Tear down shared_with_layered_suite.test_core.FooLayer in N.NNN seconds.
182
197
  def test_with_and_without_layer(where):
183
198
  lines = run_pytest('with_and_without_layer')
184
199
  assert """\
185
- plugins: zope.pytestlayer
186
200
  collecting ... collected 2 items
187
201
  src/zope/pytestlayer/tests/fixture/with_and_without_layer/test_core.py:NN: UnitTest.test_dummy PASSED
188
202
  src/zope/pytestlayer/tests/fixture/with_and_without_layer/test_core.py:NN: FooTest.test_dummy with_and_without_layer.test_core.FooLayer
@@ -198,7 +212,6 @@ Tear down with_and_without_layer.test_core.FooLayer in N.NNN seconds.
198
212
  def test_two_dependent_layers(where):
199
213
  lines = run_pytest('two_dependent_layers')
200
214
  assert """\
201
- plugins: zope.pytestlayer
202
215
  collecting ... collected 2 items
203
216
  src/zope/pytestlayer/tests/fixture/two_dependent_layers/test_core.py:NN: FooTest.test_dummy two_dependent_layers.test_core.FooLayer
204
217
  Set up two_dependent_layers.test_core.FooLayer in N.NNN seconds.
@@ -221,7 +234,6 @@ Tear down two_dependent_layers.test_core.FooLayer in N.NNN seconds.
221
234
  def test_two_dependent_layered_suites(where):
222
235
  lines = run_pytest('two_dependent_layered_suites')
223
236
  assert """\
224
- plugins: zope.pytestlayer
225
237
  collecting ... collected 2 items
226
238
  src/zope/pytestlayer/tests/fixture/two_dependent_layered_suites/test_core.py <- test_suite: /src/zope/pytestlayer/tests/fixture/two_dependent_layered_suites/foo.txt two_dependent_layered_suites.test_core.FooLayer
227
239
  Set up two_dependent_layered_suites.test_core.FooLayer in N.NNN seconds.
@@ -244,7 +256,6 @@ Tear down two_dependent_layered_suites.test_core.FooLayer in N.NNN seconds.
244
256
  def test_two_independent_layers(where):
245
257
  lines = run_pytest('two_independent_layers')
246
258
  assert """\
247
- plugins: zope.pytestlayer
248
259
  collecting ... collected 2 items
249
260
  src/zope/pytestlayer/tests/fixture/two_independent_layers/test_core.py:NN: FooTest.test_dummy two_independent_layers.test_core.FooLayer
250
261
  Set up two_independent_layers.test_core.FooLayer in N.NNN seconds.
@@ -267,7 +278,6 @@ Tear down two_independent_layers.test_core.BarLayer in N.NNN seconds.
267
278
  def test_keep_layer_across_test_classes(where):
268
279
  lines = run_pytest('keep_layer_across_test_classes')
269
280
  assert """\
270
- plugins: zope.pytestlayer
271
281
  collecting ... collected 3 items
272
282
  src/zope/pytestlayer/tests/fixture/keep_layer_across_test_classes/test_core.py:NN: FooTest.test_dummy order_by_layer.test_core.FooLayer
273
283
  Set up keep_layer_across_test_classes.test_core.FooLayer in N.NNN seconds.
@@ -292,13 +302,12 @@ src/zope/pytestlayer/tests/fixture/keep_layer_across_test_classes/test_core.py:N
292
302
  testTearDown bar
293
303
  Tear down keep_layer_across_test_classes.test_core.BarLayer in N.NNN seconds.
294
304
  """ == join(lines)
295
- assert '=== 3 passed' in lines[-1]
305
+ assert '=== 3 passed' in lines[-1] # pragma: no cover
296
306
 
297
307
 
298
308
  def test_order_by_layer(where):
299
309
  lines = run_pytest('order_by_layer')
300
310
  assert """\
301
- plugins: zope.pytestlayer
302
311
  collecting ... collected 4 items
303
312
  src/zope/pytestlayer/tests/fixture/order_by_layer/test_core.py:NN: FooTest.test_dummy order_by_layer.test_core.FooLayer
304
313
  Set up order_by_layer.test_core.FooLayer in N.NNN seconds.
@@ -336,7 +345,6 @@ Tear down order_by_layer.test_core.FooLayer in N.NNN seconds.
336
345
  def test_order_with_layered_suite(where):
337
346
  lines = run_pytest('order_with_layered_suite')
338
347
  assert """\
339
- plugins: zope.pytestlayer
340
348
  collecting ... collected 6 items
341
349
  src/zope/pytestlayer/tests/fixture/order_with_layered_suite/test_core.py:NN: FooTest.test_dummy order_with_layered_suite.test_core.FooLayer
342
350
  Set up order_with_layered_suite.test_core.FooLayer in N.NNN seconds.
@@ -386,7 +394,6 @@ Tear down order_with_layered_suite.test_core.FooLayer in N.NNN seconds.
386
394
  def test_order_with_layered_suite_select_layer(where):
387
395
  lines = run_pytest('order_with_layered_suite', '-k', 'FooLayer')
388
396
  assert """\
389
- plugins: zope.pytestlayer
390
397
  collecting ... collected 6 items / 2 deselected / 4 selected
391
398
  src/zope/pytestlayer/tests/fixture/order_with_layered_suite/test_core.py:NN: FooTest.test_dummy order_with_layered_suite.test_core.FooLayer
392
399
  Set up order_with_layered_suite.test_core.FooLayer in N.NNN seconds.
@@ -426,7 +433,6 @@ Tear down order_with_layered_suite.test_core.FooLayer in N.NNN seconds.
426
433
  def test_order_with_layered_suite_select_doctest(where):
427
434
  lines = run_pytest('order_with_layered_suite', '-k', 'foobar and txt')
428
435
  assert """\
429
- plugins: zope.pytestlayer
430
436
  collecting ... collected 6 items / 5 deselected / 1 selected
431
437
  src/zope/pytestlayer/tests/fixture/order_with_layered_suite/test_core.py <- test_suite: /src/zope/pytestlayer/tests/fixture/order_with_layered_suite/foobar.txt order_with_layered_suite.test_core.FooLayer
432
438
  Set up order_with_layered_suite.test_core.FooLayer in N.NNN seconds.
@@ -451,7 +457,6 @@ Tear down order_with_layered_suite.test_core.FooLayer in N.NNN seconds.
451
457
  def test_works_even_without_any_setup_or_teardown_methods(where):
452
458
  lines = run_pytest('no_setup_or_teardown')
453
459
  assert """\
454
- plugins: zope.pytestlayer
455
460
  collecting ... collected 1 item
456
461
  src/zope/pytestlayer/tests/fixture/no_setup_or_teardown/test_core.py:NN: FooTest.test_dummy PASSED
457
462
  """ == join(lines)
@@ -469,7 +474,6 @@ has no __bases__ attribute. Layers may be of two sorts: class or instance with _
469
474
  def test_creating_different_fixtures_for_layers_with_the_same_name(where):
470
475
  lines = run_pytest('layers_with_same_name')
471
476
  assert """\
472
- plugins: zope.pytestlayer
473
477
  collecting ... collected 2 items
474
478
  src/zope/pytestlayer/tests/fixture/layers_with_same_name/test_core.py:NN: FooTest.test_dummy layers_with_same_name.test_core.TestLayer
475
479
  Set up layers_with_same_name.test_core.TestLayer in N.NNN seconds.
@@ -491,7 +495,6 @@ def test_selection_of_doctest_names(where):
491
495
  def test_fixture_create_allows_overriding_names(where):
492
496
  lines = run_pytest('custom_fixture_name')
493
497
  assert """\
494
- plugins: zope.pytestlayer
495
498
  collecting ... collected 2 items
496
499
  src/zope/pytestlayer/tests/fixture/custom_fixture_name/test_core.py:NN: test_can_access_layer_via_fixture custom_fixture_name.test_core.FooLayer
497
500
  Set up custom_fixture_name.test_core.FooLayer in N.NNN seconds.
@@ -510,7 +513,6 @@ Tear down custom_fixture_name.test_core.FooLayer in N.NNN seconds.
510
513
  def test_if_session_fixture_is_used_class_fixtures_are_ignored(where):
511
514
  lines = run_pytest('session_fixture')
512
515
  assert """\
513
- plugins: zope.pytestlayer
514
516
  collecting ... collected 2 items
515
517
  src/zope/pytestlayer/tests/fixture/session_fixture/test_core.py:NN: test_can_access_layer_via_fixture session_fixture.test_core.FooLayer
516
518
  Set up session_fixture.test_core.FooLayer in N.NNN seconds.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zope.pytestlayer
3
- Version: 9.0
3
+ Version: 9.2
4
4
  Summary: Integration of zope.testrunner-style test layers into pytest framework
5
5
  Home-page: https://github.com/zopefoundation/zope.pytestlayer/
6
6
  Author: gocept
@@ -18,11 +18,11 @@ Classifier: License :: OSI Approved :: Zope Public License
18
18
  Classifier: Natural Language :: English
19
19
  Classifier: Operating System :: OS Independent
20
20
  Classifier: Programming Language :: Python :: 3
21
- Classifier: Programming Language :: Python :: 3.9
22
21
  Classifier: Programming Language :: Python :: 3.10
23
22
  Classifier: Programming Language :: Python :: 3.11
24
23
  Classifier: Programming Language :: Python :: 3.12
25
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
26
26
  Classifier: Programming Language :: Python :: Implementation
27
27
  Classifier: Programming Language :: Python :: Implementation :: CPython
28
28
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -30,9 +30,9 @@ Classifier: Topic :: Software Development
30
30
  Classifier: Topic :: Software Development :: Libraries
31
31
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
32
32
  Classifier: Topic :: Software Development :: Testing
33
- Requires-Python: >=3.9
33
+ Requires-Python: >=3.10
34
34
  License-File: LICENSE.txt
35
- Requires-Dist: pytest>=8
35
+ Requires-Dist: pytest>=9.1
36
36
  Requires-Dist: setuptools
37
37
  Requires-Dist: zope.dottedname
38
38
  Provides-Extra: test
@@ -178,6 +178,22 @@ Developing zope.pytestlayer
178
178
  Change log for zope.pytestlayer
179
179
  =================================
180
180
 
181
+ 9.2 (2026-06-30)
182
+ ================
183
+
184
+ - Add compatibility for ``pytest >= 9.1``, requiring at least that version.
185
+
186
+
187
+ 9.1 (2025-12-03)
188
+ ================
189
+
190
+ - Add compatibility for ``pytest >= 9``.
191
+
192
+ - Add support for Python 3.13, 3.14.
193
+
194
+ - Drop support for Python 3.9.
195
+
196
+
181
197
  9.0 (2025-09-12)
182
198
  ================
183
199
 
@@ -11,6 +11,7 @@ pyproject.toml
11
11
  pytest.ini
12
12
  setup.cfg
13
13
  setup.py
14
+ sitecustomize.py
14
15
  tox.ini
15
16
  docs/about.rst
16
17
  docs/api.rst
@@ -1,4 +1,4 @@
1
- pytest>=8
1
+ pytest>=9.1
2
2
  setuptools
3
3
  zope.dottedname
4
4
 
@@ -1,15 +1,15 @@
1
- # Generated from:
2
- # https://github.com/zopefoundation/meta/tree/master/config/pure-python
1
+ # Generated with zope.meta (https://zopemeta.readthedocs.io/) from:
2
+ # https://github.com/zopefoundation/meta/tree/master/src/zope/meta/pure-python
3
3
  [tox]
4
4
  minversion = 3.18
5
5
  envlist =
6
6
  release-check
7
7
  lint
8
- py39
9
8
  py310
10
9
  py311
11
10
  py312
12
11
  py313
12
+ py314
13
13
  pypy3
14
14
  docs
15
15
  coverage
@@ -19,7 +19,7 @@ usedevelop = true
19
19
  package = wheel
20
20
  wheel_build_env = .pkg
21
21
  deps =
22
- setuptools == 78.1.1
22
+ setuptools >= 78.1.1,< 81
23
23
  pytest
24
24
  pytest-cov
25
25
  pytest-remove-stale-bytecode
@@ -41,7 +41,7 @@ description = ensure that the distribution is ready to release
41
41
  basepython = python3
42
42
  skip_install = true
43
43
  deps =
44
- setuptools == 78.1.1
44
+ setuptools >= 78.1.1,< 81
45
45
  wheel
46
46
  twine
47
47
  build
@@ -51,7 +51,7 @@ deps =
51
51
  commands_pre =
52
52
  commands =
53
53
  check-manifest
54
- check-python-versions --only setup.py,tox.ini,.github/workflows/tests.yml
54
+ check-python-versions --only pyproject.toml,setup.py,tox.ini,.github/workflows/tests.yml
55
55
  python -m build --sdist --no-isolation
56
56
  twine check dist/*
57
57
 
@@ -83,8 +83,11 @@ deps =
83
83
  pytest
84
84
  pytest-cov
85
85
  pytest-remove-stale-bytecode
86
+ setenv =
87
+ COVERAGE_FILE = {toxinidir}/.coverage
86
88
  commands =
87
89
  mkdir -p {toxinidir}/parts/htmlcov
88
- pytest --cov=src --cov-report=html []
90
+ coverage erase
91
+ pytest --cov=src --cov-report= -vs []
89
92
  coverage html
90
93
  coverage report
@@ -1,3 +0,0 @@
1
- def pytest_ignore_collect(path, config):
2
- if path.strpath.endswith('fixture'):
3
- return True
File without changes