summaryrefslogtreecommitdiff
path: root/dev-python/ipython/files/ipython-8.24.0-pytest-8.patch
blob: 04f1a1534ac5814aff2c754a9c82c32ab7b68f26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From 7df70a3cd79068be6f98596e427d60a5d0cfe5b3 Mon Sep 17 00:00:00 2001
From: Steve Kowalik <steven@wedontsleep.org>
Date: Thu, 23 May 2024 13:00:43 +1000
Subject: [PATCH] Support pytest 8.1+ changes in pytest plugin

Pytest 8.1 has also changed the plugin API, as well as required new
keyword arguments. I've shifted the pytest version calculation to the
module level so we can use it everywhere, and continue supporting all
versions of pytest that we can.

Fixes #14390
---
 IPython/testing/plugin/pytest_ipdoctest.py | 36 ++++++++++++++++------
 1 file changed, 26 insertions(+), 10 deletions(-)

diff --git a/IPython/testing/plugin/pytest_ipdoctest.py b/IPython/testing/plugin/pytest_ipdoctest.py
index fc8af13b579..40a3ae92b40 100644
--- 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, import_path
@@ -69,6 +73,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(
@@ -143,7 +149,7 @@ def pytest_collect_file(
     return None
 
 
-if int(pytest.__version__.split(".")[0]) < 7:
+if pytest_version[0] < 7:
     _collect_file = pytest_collect_file
 
     def pytest_collect_file(
@@ -448,7 +454,7 @@ def reportinfo(self) -> Tuple[Union["os.PathLike[str]", str], Optional[int], str
         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:
@@ -521,7 +527,7 @@ def collect(self) -> Iterable[IPDoctestItem]:
                 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:
@@ -636,20 +642,26 @@ def _find(
                     )
 
         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)
@@ -671,7 +683,7 @@ def _find(
                     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:
@@ -701,11 +713,15 @@ def func() -> None:
 
     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