Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-pytest-cases for 
openSUSE:Factory checked in at 2026-04-13 23:18:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytest-cases (Old)
 and      /work/SRC/openSUSE:Factory/.python-pytest-cases.new.21863 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pytest-cases"

Mon Apr 13 23:18:26 2026 rev:3 rq:1346222 version:3.10.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pytest-cases/python-pytest-cases.changes  
2025-10-07 18:28:33.645940578 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-pytest-cases.new.21863/python-pytest-cases.changes
       2026-04-13 23:19:00.520425733 +0200
@@ -1,0 +2,10 @@
+Sun Apr 12 17:29:18 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 3.10.1:
+  * Fixed python version in package metadata. `3.13` was missing.
+  * Fixed an issue with `pytest 9` related to the fixture closure
+    building fixes
+  * Added the `with_case_tags` decorator for applying common tags
+    to all cases defined in a case class. Fixes #351.
+
+-------------------------------------------------------------------

Old:
----
  pytest_cases-3.9.1.tar.gz

New:
----
  _scmsync.obsinfo
  build.specials.obscpio
  pytest_cases-3.10.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pytest-cases.spec ++++++
--- /var/tmp/diff_new_pack.D6HTjU/_old  2026-04-13 23:19:01.160452151 +0200
+++ /var/tmp/diff_new_pack.D6HTjU/_new  2026-04-13 23:19:01.160452151 +0200
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-pytest-cases
-Version:        3.9.1
+Version:        3.10.1
 Release:        0
 Summary:        Separate test code from test cases in pytest
 License:        BSD-3-Clause
@@ -59,6 +59,8 @@
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %files %{python_files}
+%doc README.md
+%license LICENSE
 %{python_sitelib}/pytest_cases
 %{python_sitelib}/pytest_cases-%{version}.dist-info
 

++++++ _scmsync.obsinfo ++++++
mtime: 1776014980
commit: c49ae353f68e16ba66bbd3de5d4247ca6a6f7511c155ff1d1672701f100dee8a
url: https://src.opensuse.org/python-pytest/python-pytest-cases.git
revision: c49ae353f68e16ba66bbd3de5d4247ca6a6f7511c155ff1d1672701f100dee8a
projectscmsync: https://src.opensuse.org/python-pytest/_ObsPrj.git

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-04-12 19:30:04.000000000 +0200
@@ -0,0 +1 @@
+.osc

++++++ pytest_cases-3.9.1.tar.gz -> pytest_cases-3.10.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/PKG-INFO 
new/pytest_cases-3.10.1/PKG-INFO
--- old/pytest_cases-3.9.1/PKG-INFO     2025-06-09 22:04:50.362207400 +0200
+++ new/pytest_cases-3.10.1/PKG-INFO    2026-03-03 00:05:21.264756000 +0100
@@ -1,9 +1,9 @@
 Metadata-Version: 2.4
 Name: pytest-cases
-Version: 3.9.1
+Version: 3.10.1
 Summary: Separate test code from test cases in pytest.
 Home-page: https://github.com/smarie/python-pytest-cases
-Download-URL: https://github.com/smarie/python-pytest-cases/tarball/3.9.1
+Download-URL: https://github.com/smarie/python-pytest-cases/tarball/3.10.1
 Author: Sylvain MARIE <[email protected]>
 Maintainer: Sylvain MARIE <[email protected]>
 License: BSD 3-Clause
@@ -18,6 +18,7 @@
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: 3.14
 Classifier: Framework :: Pytest
 Description-Content-Type: text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/ci_tools/flake8-requirements.txt 
new/pytest_cases-3.10.1/ci_tools/flake8-requirements.txt
--- old/pytest_cases-3.9.1/ci_tools/flake8-requirements.txt     2025-06-09 
22:04:27.000000000 +0200
+++ new/pytest_cases-3.10.1/ci_tools/flake8-requirements.txt    2026-03-03 
00:04:56.000000000 +0100
@@ -3,6 +3,7 @@
 flake8-html>=0.4,<1
 flake8-bandit>=2.1.1,<3
 bandit<1.7.3  # temporary until this is fixed 
https://github.com/tylerwince/flake8-bandit/issues/21
+pbr  # for bandit 1.7.2 to run
 flake8-bugbear>=20.1.0,<21.0.0
 flake8-docstrings>=1.5,<2
 flake8-print>=3.1.1,<4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/docs/api_reference.md 
new/pytest_cases-3.10.1/docs/api_reference.md
--- old/pytest_cases-3.9.1/docs/api_reference.md        2025-06-09 
22:04:27.000000000 +0200
+++ new/pytest_cases-3.10.1/docs/api_reference.md       2026-03-03 
00:04:56.000000000 +0100
@@ -51,6 +51,57 @@
  - `marks`: optional pytest marks to add on the case. Note that decorating the 
function directly with the mark also works, and if marks are provided in both 
places they are merged.
 
 
+### `@with_case_tags`
+
+```python
+@with_case_tags(*tags,  # type: Any
+                ):
+```
+
+This decorator can be applied to a class defining cases to apply multiple
+`*tags` to all case methods defined thereby.
+
+```python
+@with_case_tags('tag_1', 'tag_2')
+class CasesContainerClass:
+
+    def case_one(self, ...):
+        ...
+
+    @case(tags='another_tag')
+    def case_two(self, ...):
+        ...
+    
+    @case(tags='tag_1')
+    def case_three(self, ...):
+        ...
+```
+
+This is equivalent to:
+
+
+```python
+class CasesContainerClass:
+
+    @case(tags=('tag_1', 'tag_2'))
+    def case_one(self, ...):
+        ...
+
+    @case(tags=('another_tag', 'tag_1', 'tag_2'))
+    def case_two(self, ...):
+        ...
+
+    @case(tags=('tag_1', 'tag_2'))
+    def case_three(self, ...):
+        ...
+```
+
+**Parameters:**
+
+ - `tags`: custom tags to be added to all case methods. See also 
[`@case(tags=...)`](#case).
+
+
+
 ### `copy_case_info`
 
 ```python
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/docs/changelog.md 
new/pytest_cases-3.10.1/docs/changelog.md
--- old/pytest_cases-3.9.1/docs/changelog.md    2025-06-09 22:04:27.000000000 
+0200
+++ new/pytest_cases-3.10.1/docs/changelog.md   2026-03-03 00:04:56.000000000 
+0100
@@ -1,5 +1,21 @@
 # Changelog
 
+### 3.10.1 - Accurate metadata on PyPi
+
+- Fixed python version in package metadata. `3.13` was missing.
+
+### 3.10.0 - New `with_case_tags` decorator + pytest 9 compatibility
+
+- Fixed an issue with `pytest 9` related to the fixture closure building fixes
+  [pytest-dev/pytest#13789](https://github.com/pytest-dev/pytest/pull/13789),
+  solving 
[pytest-dev/pytest#13773](https://github.com/pytest-dev/pytest/issues/13773).
+  Fixed [#374](https://github.com/smarie/python-pytest-cases/issues/374). PR
+  [#376](https://github.com/smarie/python-pytest-cases/pull/376) by 
[jammer87](https://github.com/jammer87).
+- Added the `with_case_tags` decorator for applying common tags to all cases
+  defined in a case class. Fixes 
[#351](https://github.com/smarie/python-pytest-cases/issues/351).
+  PR [#361](https://github.com/smarie/python-pytest-cases/pull/361)
+  by [@michele-riva](https://github.com/michele-riva).
+
 ### 3.9.1 - support for python 3.14 and pytest 8.4
 
 - Fixed `AttributeError: 'MiniMetafunc' object has no attribute 
'_params_directness'` when a case function is 
@@ -12,6 +28,10 @@
   [#186](https://github.com/smarie/python-pytest-cases/issues/186)
 - Fixed test suite for python 3.14, officializing the support for this version.
 
+### 3.9.0 - yanked version
+
+This version was yanked. See 3.9.1.
+
 ### 3.8.6 - compatibility fix
 
 - Fixed issue with legacy python 2.7 and 3.5. Fixes 
[#352](https://github.com/smarie/python-pytest-cases/issues/352).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/docs/index.md 
new/pytest_cases-3.10.1/docs/index.md
--- old/pytest_cases-3.9.1/docs/index.md        2025-06-09 22:04:27.000000000 
+0200
+++ new/pytest_cases-3.10.1/docs/index.md       2026-03-03 00:04:56.000000000 
+0100
@@ -269,7 +269,7 @@
 ``` 
 
 
- - the `has_tag` argument allows you to filter cases based on tags set on case 
functions using the `@case` decorator. See API reference of 
[`@case`](./api_reference.md#case) and 
[`@parametrize_with_cases`](./api_reference.md#parametrize_with_cases).
+ - the `has_tag` argument allows you to filter cases based on tags set on case 
functions using the `@case` decorator. See API reference of 
[`@case`](./api_reference.md#case) and 
[`@parametrize_with_cases`](./api_reference.md#parametrize_with_cases). Tags 
shared by multiple cases grouped inside a class may be added automatically to 
all cases using the [`@with_case_tags`](./api_reference.md#with_case_tags) 
decorator.
 
 
 ```python
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/noxfile.py 
new/pytest_cases-3.10.1/noxfile.py
--- old/pytest_cases-3.9.1/noxfile.py   2025-06-09 22:04:27.000000000 +0200
+++ new/pytest_cases-3.10.1/noxfile.py  2026-03-03 00:04:56.000000000 +0100
@@ -53,26 +53,32 @@
 ENVS = {
     # python 3.14
     (PY314, "pytest-latest"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": ""}},
+    (PY314, "pytest8.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<9"}},
     (PY314, "pytest7.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<8"}},
     (PY314, "pytest6.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<7"}},
     # python 3.13
     (PY313, "pytest-latest"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": ""}},
+    (PY313, "pytest8.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<9"}},
     (PY313, "pytest7.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<8"}},
     (PY313, "pytest6.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<7"}},
     # python 3.12
     (PY312, "pytest-latest"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": ""}},
+    (PY312, "pytest8.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<9"}},
     (PY312, "pytest7.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<8"}},
     (PY312, "pytest6.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<7"}},
     # python 3.11
     # We'll run 'pytest-latest' this last for coverage
+    (PY311, "pytest8.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<9"}},
     (PY311, "pytest7.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<8"}},
     (PY311, "pytest6.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<7"}},
     # python 3.10
     (PY310, "pytest-latest"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": ""}},
+    (PY310, "pytest8.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<9"}},
     (PY310, "pytest7.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<8"}},
     (PY310, "pytest6.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<7"}},
     # python 3.9
     (PY39, "pytest-latest"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": ""}},
+    (PY39, "pytest8.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<9"}},
     (PY39, "pytest7.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<8"}},
     (PY39, "pytest6.x"): {"coverage": False, "pkg_specs": {"pip": ">19", 
"pytest": "<7"}},
     # IMPORTANT: this should be last so that the folder docs/reports is not 
deleted afterwards
@@ -294,7 +300,7 @@
         # keyring set https://upload.pypi.org/legacy/ your-username
         # keyring set https://test.pypi.org/legacy/ your-username
         install_reqs(session, phase="PyPi", phase_reqs=["twine"])
-        session.run("twine", "upload", "dist/*", "-u", "smarie")  # -r testpypi
+        session.run("twine", "upload", "dist/*", "-u", "__token__")  # -r 
testpypi
 
     # create the github release
     install_reqs(session, phase="release", phase_reqs=["click", "PyGithub"])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/pyproject.toml 
new/pytest_cases-3.10.1/pyproject.toml
--- old/pytest_cases-3.9.1/pyproject.toml       2025-06-09 22:04:27.000000000 
+0200
+++ new/pytest_cases-3.10.1/pyproject.toml      2026-03-03 00:04:56.000000000 
+0100
@@ -1,6 +1,6 @@
 [build-system]
 requires = [
-    "setuptools>=39.2",
+    "setuptools>=39.2,<82",  # setuptools v82 does not have pkg_resources 
anymore https://github.com/pypa/setuptools/issues/5174
     "setuptools_scm",
     "wheel"
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/setup.cfg 
new/pytest_cases-3.10.1/setup.cfg
--- old/pytest_cases-3.9.1/setup.cfg    2025-06-09 22:04:50.362207400 +0200
+++ new/pytest_cases-3.10.1/setup.cfg   2026-03-03 00:05:21.265363000 +0100
@@ -20,6 +20,7 @@
        Programming Language :: Python :: 3.10
        Programming Language :: Python :: 3.11
        Programming Language :: Python :: 3.12
+       Programming Language :: Python :: 3.13
        Programming Language :: Python :: 3.14
        Framework :: Pytest
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/src/pytest_cases/__init__.py 
new/pytest_cases-3.10.1/src/pytest_cases/__init__.py
--- old/pytest_cases-3.9.1/src/pytest_cases/__init__.py 2025-06-09 
22:04:27.000000000 +0200
+++ new/pytest_cases-3.10.1/src/pytest_cases/__init__.py        2026-03-03 
00:04:56.000000000 +0100
@@ -10,7 +10,7 @@
 from .fixture_parametrize_plus import pytest_parametrize_plus, 
parametrize_plus, parametrize, fixture_ref
 
 from .case_funcs import case, copy_case_info, set_case_id, get_case_id, 
get_case_marks, \
-    get_case_tags, matches_tag_query, is_case_class, is_case_function
+    get_case_tags, matches_tag_query, is_case_class, is_case_function, 
with_case_tags
 from .case_parametrizer_new import parametrize_with_cases, THIS_MODULE, 
get_all_cases, get_parametrize_args, \
     get_current_case_id, get_current_cases, get_current_params, 
CasesCollectionWarning
 
@@ -53,6 +53,7 @@
     # case functions
     'case', 'copy_case_info', 'set_case_id', 'get_case_id', 'get_case_marks',
     'get_case_tags', 'matches_tag_query', 'is_case_class', 'is_case_function',
+    'with_case_tags',
     # test functions
     'get_all_cases', 'parametrize_with_cases', 'THIS_MODULE', 
'get_parametrize_args', 'get_current_case_id',
     'get_current_cases', 'get_current_params', 'CasesCollectionWarning'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/src/pytest_cases/_version.py 
new/pytest_cases-3.10.1/src/pytest_cases/_version.py
--- old/pytest_cases-3.9.1/src/pytest_cases/_version.py 2025-06-09 
22:04:50.000000000 +0200
+++ new/pytest_cases-3.10.1/src/pytest_cases/_version.py        2026-03-03 
00:05:21.000000000 +0100
@@ -1,7 +1,14 @@
 # file generated by setuptools-scm
 # don't change, don't track in version control
 
-__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
+__all__ = [
+    "__version__",
+    "__version_tuple__",
+    "version",
+    "version_tuple",
+    "__commit_id__",
+    "commit_id",
+]
 
 TYPE_CHECKING = False
 if TYPE_CHECKING:
@@ -9,13 +16,19 @@
     from typing import Union
 
     VERSION_TUPLE = Tuple[Union[int, str], ...]
+    COMMIT_ID = Union[str, None]
 else:
     VERSION_TUPLE = object
+    COMMIT_ID = object
 
 version: str
 __version__: str
 __version_tuple__: VERSION_TUPLE
 version_tuple: VERSION_TUPLE
+commit_id: COMMIT_ID
+__commit_id__: COMMIT_ID
 
-__version__ = version = '3.9.1'
-__version_tuple__ = version_tuple = (3, 9, 1)
+__version__ = version = '3.10.1'
+__version_tuple__ = version_tuple = (3, 10, 1)
+
+__commit_id__ = commit_id = 'gd495c03c1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/src/pytest_cases/case_funcs.py 
new/pytest_cases-3.10.1/src/pytest_cases/case_funcs.py
--- old/pytest_cases-3.9.1/src/pytest_cases/case_funcs.py       2025-06-09 
22:04:27.000000000 +0200
+++ new/pytest_cases-3.10.1/src/pytest_cases/case_funcs.py      2026-03-03 
00:04:56.000000000 +0100
@@ -366,3 +366,35 @@
         except:
             # GH#287: safe fallback
             return False
+
+
+def with_case_tags(*tags):
+    """Attach `tags` to all cases defined in the decorated class."""
+    def _decorator(cls):
+        if is_case_function(cls):
+            raise ValueError(
+                'Cannot use `with_case_tags` on a case '
+                'function. Use the `@case` decorator instead.'
+                )
+        if not is_case_class(cls):
+            raise ValueError('`with_case_tags` can only be applied to classes '
+                             'defining a collection of cases.')
+        for case_name in dir(cls):
+            case_ = getattr(cls, case_name)
+            if not is_case_function(case_):  # Not a case
+                continue
+            try:
+                case_info = getattr(case_, CASE_FIELD)
+            except AttributeError:
+                # Not explicitly decorated with @case. Do so now.
+                # NB: `case(obj) is obj`, i.e., the `@case` decorator
+                # only adds some attributes to `obj`. In the future, if
+                # `@case` will return a different object, we will have
+                # to `setattr(cls, case_name, case_mod)`
+                _ = case(case_)
+                case_info = getattr(case_, CASE_FIELD)
+            tags_to_add = tuple(t for t in tags if t not in case_info.tags)
+            case_info.add_tags(tags_to_add)
+        return cls
+    return _decorator
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pytest_cases-3.9.1/src/pytest_cases/common_pytest_marks.py 
new/pytest_cases-3.10.1/src/pytest_cases/common_pytest_marks.py
--- old/pytest_cases-3.9.1/src/pytest_cases/common_pytest_marks.py      
2025-06-09 22:04:27.000000000 +0200
+++ new/pytest_cases-3.10.1/src/pytest_cases/common_pytest_marks.py     
2026-03-03 00:04:56.000000000 +0100
@@ -46,6 +46,7 @@
 PYTEST8_OR_GREATER = PYTEST_VERSION >= Version('8.0.0')
 PYTEST81_OR_GREATER = PYTEST_VERSION >= Version('8.1.0')
 PYTEST84_OR_GREATER = PYTEST_VERSION >= Version('8.4.0')
+PYTEST9_OR_GREATER = PYTEST_VERSION >= Version('9.0.0')
 
 
 def get_param_argnames_as_list(argnames):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest_cases-3.9.1/src/pytest_cases/plugin.py 
new/pytest_cases-3.10.1/src/pytest_cases/plugin.py
--- old/pytest_cases-3.9.1/src/pytest_cases/plugin.py   2025-06-09 
22:04:27.000000000 +0200
+++ new/pytest_cases-3.10.1/src/pytest_cases/plugin.py  2026-03-03 
00:04:56.000000000 +0100
@@ -28,7 +28,8 @@
 
 from .common_mini_six import string_types
 from .common_pytest_lazy_values import get_lazy_args
-from .common_pytest_marks import PYTEST35_OR_GREATER, PYTEST46_OR_GREATER, 
PYTEST37_OR_GREATER, PYTEST7_OR_GREATER, PYTEST8_OR_GREATER
+from .common_pytest_marks import PYTEST35_OR_GREATER, PYTEST46_OR_GREATER, 
PYTEST37_OR_GREATER, PYTEST7_OR_GREATER, \
+    PYTEST8_OR_GREATER, PYTEST9_OR_GREATER
 from .common_pytest import get_pytest_nodeid, get_pytest_function_scopeval, 
is_function_node, get_param_names, \
     get_param_argnames_as_list, has_function_scope, 
set_callspec_arg_scope_to_function, in_callspec_explicit_args
 
@@ -334,8 +335,18 @@
                     # normal fixture
                     self.add_required_fixture(fixname, fixturedefs)
 
-                    # add all dependencies in the to do list
-                    dependencies = _fixdef.argnames
+                    # add all dependencies, accounting for overrides
+                    if PYTEST9_OR_GREATER:
+                        dependencies = []
+                        for _fixture_or_overridden in reversed(fixturedefs):
+                            dependencies = 
list(_fixture_or_overridden.argnames) + dependencies
+                            # If there's an override and doesn't depend on the 
overridden fixture,
+                            # ignore remaining definitions
+                            if fixname not in _fixture_or_overridden.argnames:
+                                break
+                    else:
+                        dependencies = _fixdef.argnames
+
                     # - append: was pytest default
                     # pending_fixture_names += dependencies
                     # - prepend: makes much more sense
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pytest_cases-3.9.1/src/pytest_cases.egg-info/PKG-INFO 
new/pytest_cases-3.10.1/src/pytest_cases.egg-info/PKG-INFO
--- old/pytest_cases-3.9.1/src/pytest_cases.egg-info/PKG-INFO   2025-06-09 
22:04:50.000000000 +0200
+++ new/pytest_cases-3.10.1/src/pytest_cases.egg-info/PKG-INFO  2026-03-03 
00:05:21.000000000 +0100
@@ -1,9 +1,9 @@
 Metadata-Version: 2.4
 Name: pytest-cases
-Version: 3.9.1
+Version: 3.10.1
 Summary: Separate test code from test cases in pytest.
 Home-page: https://github.com/smarie/python-pytest-cases
-Download-URL: https://github.com/smarie/python-pytest-cases/tarball/3.9.1
+Download-URL: https://github.com/smarie/python-pytest-cases/tarball/3.10.1
 Author: Sylvain MARIE <[email protected]>
 Maintainer: Sylvain MARIE <[email protected]>
 License: BSD 3-Clause
@@ -18,6 +18,7 @@
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: 3.14
 Classifier: Framework :: Pytest
 Description-Content-Type: text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pytest_cases-3.9.1/src/pytest_cases.egg-info/SOURCES.txt 
new/pytest_cases-3.10.1/src/pytest_cases.egg-info/SOURCES.txt
--- old/pytest_cases-3.9.1/src/pytest_cases.egg-info/SOURCES.txt        
2025-06-09 22:04:50.000000000 +0200
+++ new/pytest_cases-3.10.1/src/pytest_cases.egg-info/SOURCES.txt       
2026-03-03 00:05:21.000000000 +0100
@@ -125,6 +125,7 @@
 tests/cases/issues/test_issue_246.py
 tests/cases/issues/test_issue_274.py
 tests/cases/issues/test_issue_286.py
+tests/cases/issues/test_issue_374.py
 tests/cases/issues/test_py35_issue_176.py
 tests/cases/issues/test_py35_issue_243.py
 tests/cases/issues/test_py35_issue_286.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pytest_cases-3.9.1/tests/cases/issues/test_issue_374.py 
new/pytest_cases-3.10.1/tests/cases/issues/test_issue_374.py
--- old/pytest_cases-3.9.1/tests/cases/issues/test_issue_374.py 1970-01-01 
01:00:00.000000000 +0100
+++ new/pytest_cases-3.10.1/tests/cases/issues/test_issue_374.py        
2026-03-03 00:04:56.000000000 +0100
@@ -0,0 +1,91 @@
+OVERRIDDEN_FIXTURES_TEST_FILE = """
+import pytest
+
[email protected]
+def db(): pass
+
[email protected]
+def app(db): pass
+
+
+# See https://github.com/pytest-dev/pytest/issues/13773
+# Issue occurred in collection with Pytest 9+
+
+    
+class TestOverrideWithParent:
+    # Overrides module-level app, doesn't request `db` directly, only 
transitively.
+    @pytest.fixture
+    def app(self, app): pass
+
+    def test_something(self, app): pass
+
+
+
+class TestOverrideWithoutParent:
+    # Overrides module-level app, doesn't request `db` at all.
+    @pytest.fixture
+    def app(self): pass
+
+    def test_something(self, app): pass
+"""
+
+
+def test_overridden_fixtures(pytester):
+    pytester.makepyfile(OVERRIDDEN_FIXTURES_TEST_FILE)
+    result = pytester.runpytest()
+    result.assert_outcomes(passed=2)
+
+
+# Using union fixtures.
+OVERRIDDEN_UNION_FIXTURES_TEST_FILE = """
+import pytest
+from pytest_cases import parametrize, parametrize_with_cases, case, fixture
+
+@fixture
+def db(): pass
+
+@fixture
+def app(db): pass
+
+def case_hello():
+    return "hello !"
+
+@fixture
+def surname():
+    return "joe"
+
+@fixture
+@parametrize("_name", ["you", "earthling"])
+def name(_name, surname, app):
+    return f"{_name} {surname}"
+
+@case(id="hello_fixture")
+def case_basic3(name):
+    return "hello, %s !" % name
+
+
+class TestOverrideWithParent:
+    # Overrides module-level name, doesn't request `name` directly, only 
transitively.
+    @fixture
+    def name(self, name):
+        return "overridden %s" % name
+
+    @parametrize_with_cases("msg", cases=".")
+    def test_something(self, msg): pass
+
+class TestOverrideWithoutParent:
+    # Overrides module-level name, doesn't request name at all
+    @fixture
+    @parametrize("_name", ["hi", "martian"])
+    def name(self, _name):
+        return _name
+
+    @parametrize_with_cases("msg", cases=".")
+    def test_something(self, msg): pass
+"""
+
+
+def test_overridden_unions(pytester):
+    pytester.makepyfile(OVERRIDDEN_UNION_FIXTURES_TEST_FILE)
+    result = pytester.runpytest()
+    result.assert_outcomes(passed=6)

Reply via email to