Description: Update pytest plugin for pytest 8
 Pytest 8.1 changed the plugin API. This patch cherry-picks the upstream
 modifications to the plugin for pytest 8.1+ support. This patch can be
 dropped with upstream version 8.25.0.
Author: Chris Peterson <chris.peterson@canonical.com>
Origin: upstream, https://github.com/ipython/ipython/commit/7df70a3cd79068be6f98596e427d60a5d0cfe5b3
Bug: https://github.com/ipython/ipython/issues/14390
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/ipython/+bug/2068674
Forwarded: not-needed
Last-Update: 2024-06-06
---
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
--- a/IPython/testing/plugin/pytest_ipdoctest.py
+++ b/IPython/testing/plugin/pytest_ipdoctest.py
@@ -38,7 +38,11 @@
 from _pytest.compat import safe_getattr
 from _pytest.config import Config
 from _pytest.config.argparsing import Parser
-from _pytest.fixtures import FixtureRequest
+
+try:
+    from _pytest.fixtures import TopRequest as FixtureRequest
+except ImportError:
+    from _pytest.fixtures import FixtureRequest
 from _pytest.nodes import Collector
 from _pytest.outcomes import OutcomeException
 from _pytest.pathlib import fnmatch_ex
@@ -68,6 +72,8 @@
 # Lazy definition of output checker class
 CHECKER_CLASS: Optional[Type["IPDoctestOutputChecker"]] = None
 
+pytest_version = tuple([int(part) for part in pytest.__version__.split(".")])
+
 
 def pytest_addoption(parser: Parser) -> None:
     parser.addini(
@@ -142,7 +148,7 @@
     return None
 
 
-if int(pytest.__version__.split(".")[0]) < 7:
+if pytest_version[0] < 7:
     _collect_file = pytest_collect_file
 
     def pytest_collect_file(
@@ -444,7 +450,7 @@
         assert self.dtest is not None
         return self.path, self.dtest.lineno, "[ipdoctest] %s" % self.name
 
-    if int(pytest.__version__.split(".")[0]) < 7:
+    if pytest_version[0] < 7:
 
         @property
         def path(self) -> Path:
@@ -517,7 +523,7 @@
                 self, name=test.name, runner=runner, dtest=test
             )
 
-    if int(pytest.__version__.split(".")[0]) < 7:
+    if pytest_version[0] < 7:
 
         @property
         def path(self) -> Path:
@@ -632,20 +638,26 @@
                     )
 
         if self.path.name == "conftest.py":
-            if int(pytest.__version__.split(".")[0]) < 7:
+            if pytest_version[0] < 7:
                 module = self.config.pluginmanager._importconftest(
                     self.path,
                     self.config.getoption("importmode"),
                 )
             else:
+                kwargs = {"rootpath": self.config.rootpath}
+                if pytest_version >= (8, 1):
+                    kwargs["consider_namespace_packages"] = False
                 module = self.config.pluginmanager._importconftest(
                     self.path,
                     self.config.getoption("importmode"),
-                    rootpath=self.config.rootpath,
+                    **kwargs,
                 )
         else:
             try:
-                module = import_path(self.path, root=self.config.rootpath)
+                kwargs = {"root": self.config.rootpath}
+                if pytest_version >= (8, 1):
+                    kwargs["consider_namespace_packages"] = False
+                module = import_path(self.path, **kwargs)
             except ImportError:
                 if self.config.getvalue("ipdoctest_ignore_import_errors"):
                     pytest.skip("unable to import module %r" % self.path)
@@ -667,7 +679,7 @@
                     self, name=test.name, runner=runner, dtest=test
                 )
 
-    if int(pytest.__version__.split(".")[0]) < 7:
+    if pytest_version[0] < 7:
 
         @property
         def path(self) -> Path:
@@ -697,11 +709,15 @@
 
     doctest_item.funcargs = {}  # type: ignore[attr-defined]
     fm = doctest_item.session._fixturemanager
+    kwargs = {"node": doctest_item, "func": func, "cls": None}
+    if pytest_version <= (8, 0):
+        kwargs["funcargs"] = False
     doctest_item._fixtureinfo = fm.getfixtureinfo(  # type: ignore[attr-defined]
-        node=doctest_item, func=func, cls=None, funcargs=False
+        **kwargs
     )
     fixture_request = FixtureRequest(doctest_item, _ispytest=True)
-    fixture_request._fillfixtures()
+    if pytest_version <= (8, 0):
+        fixture_request._fillfixtures()
     return fixture_request
 
 
