forked from pool/python-ipython
138ab35c4c
* Improve inference from return type annotations in completer and the introduction of the optional target ipython[matplotlib] to explicitly request the matplotlib optional dependencies. * Move of the matplotlib backend handling from IPython to matplotlib. * pytest 8 compatibility. * typing-extension now needs 4.6 or newer. It was already the case, but not explicated. * Attempt to speed running code under debugger in some cases. - Add patch support-pytest-8.1.patch: * Support pytest >= 8.1 with the pytest plugin. OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:jupyter/python-ipython?expand=0&rev=129
126 lines
4.6 KiB
Diff
126 lines
4.6 KiB
Diff
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
|
|
|
|
|