dev-python/ipython: Backport pytest-8 fixes

Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
Michał Górny
2024-05-27 15:21:47 +02:00
parent b7b6c19f68
commit eef9089242
2 changed files with 305 additions and 0 deletions

View File

@@ -0,0 +1,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

View File

@@ -0,0 +1,180 @@
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DISTUTILS_USE_PEP517=standalone
PYTHON_COMPAT=( pypy3 python3_{10..12} )
PYTHON_REQ_USE='readline(+),sqlite,threads(+)'
inherit distutils-r1 optfeature pypi virtualx
DESCRIPTION="Advanced interactive shell for Python"
HOMEPAGE="
https://ipython.org/
https://github.com/ipython/ipython/
https://pypi.org/project/ipython/
"
LICENSE="BSD"
SLOT="0"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~arm64-macos ~x64-macos"
IUSE="doc examples notebook nbconvert qt5 +smp test"
RESTRICT="!test? ( test )"
RDEPEND="
dev-python/decorator[${PYTHON_USEDEP}]
>=dev-python/jedi-0.16[${PYTHON_USEDEP}]
dev-python/matplotlib-inline[${PYTHON_USEDEP}]
>=dev-python/pexpect-4.3[${PYTHON_USEDEP}]
>=dev-python/prompt-toolkit-3.0.41[${PYTHON_USEDEP}]
<dev-python/prompt-toolkit-3.1[${PYTHON_USEDEP}]
>=dev-python/pygments-2.4.0[${PYTHON_USEDEP}]
dev-python/stack-data[${PYTHON_USEDEP}]
>=dev-python/traitlets-5.13.0[${PYTHON_USEDEP}]
$(python_gen_cond_dep '
dev-python/exceptiongroup[${PYTHON_USEDEP}]
' 3.10)
$(python_gen_cond_dep '
dev-python/typing-extensions[${PYTHON_USEDEP}]
' 3.10 3.11)
"
BDEPEND="
dev-python/setuptools[${PYTHON_USEDEP}]
test? (
app-text/dvipng[truetype]
>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
dev-python/matplotlib[${PYTHON_USEDEP}]
dev-python/nbformat[${PYTHON_USEDEP}]
>=dev-python/numpy-1.23[${PYTHON_USEDEP}]
dev-python/matplotlib-inline[${PYTHON_USEDEP}]
dev-python/pickleshare[${PYTHON_USEDEP}]
dev-python/pytest-asyncio[${PYTHON_USEDEP}]
dev-python/requests[${PYTHON_USEDEP}]
dev-python/testpath[${PYTHON_USEDEP}]
)
doc? (
>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
dev-python/matplotlib[${PYTHON_USEDEP}]
>=dev-python/sphinx-2[${PYTHON_USEDEP}]
dev-python/sphinx-rtd-theme[${PYTHON_USEDEP}]
)
"
distutils_enable_tests pytest
RDEPEND+="
nbconvert? (
dev-python/nbconvert[${PYTHON_USEDEP}]
)
"
PDEPEND="
$(python_gen_cond_dep '
notebook? (
dev-python/notebook[${PYTHON_USEDEP}]
dev-python/ipywidgets[${PYTHON_USEDEP}]
dev-python/widgetsnbextension[${PYTHON_USEDEP}]
)
qt5? ( dev-python/qtconsole[${PYTHON_USEDEP}] )
' 'python*')
smp? (
>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
>=dev-python/ipyparallel-6.2.3[${PYTHON_USEDEP}]
)
"
PATCHES=(
"${FILESDIR}"/2.1.0-substitute-files.patch
# https://github.com/ipython/ipython/pull/14441
"${FILESDIR}/${P}-pytest-8.patch"
)
python_prepare_all() {
# Remove out of date insource files
#rm IPython/extensions/cythonmagic.py || die
#rm IPython/extensions/rmagic.py || die
# Prevent un-needed download during build
if use doc; then
sed -e "/^ 'sphinx.ext.intersphinx',/d" -i docs/source/conf.py || die
fi
# Rename the test directory to reduce sys.path pollution
# https://github.com/ipython/ipython/issues/12892
mv IPython/extensions/{,ipython_}tests || die
distutils-r1_python_prepare_all
}
python_compile_all() {
if use doc; then
emake -C docs html_noapi
HTML_DOCS=( docs/build/html/. )
fi
}
src_test() {
virtx distutils-r1_src_test
}
python_test() {
local -x IPYTHON_TESTING_TIMEOUT_SCALE=20
local EPYTEST_DESELECT=(
# TODO: looks to be a regression due to a newer dep
IPython/core/tests/test_oinspect.py::test_class_signature
IPython/core/tests/test_oinspect.py::test_render_signature_long
IPython/terminal/tests/test_shortcuts.py::test_modify_shortcut_with_filters
)
case ${EPYTHON} in
pypy3)
EPYTEST_DESELECT+=(
# https://github.com/numpy/numpy/issues/25164
IPython/lib/tests/test_display.py::TestAudioDataWithoutNumpy
)
;;
esac
# nonfatal implied by virtx
local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
nonfatal epytest -p asyncio --asyncio-mode=auto ||
die "Tests failed on ${EPYTHON}"
}
python_install() {
distutils-r1_python_install
# Create ipythonX.Y symlinks.
# TODO:
# 1. do we want them for pypy? No. pypy has no numpy
# 2. handle it in the eclass instead (use _python_ln_rel).
# With pypy not an option the dosym becomes unconditional
dosym ../lib/python-exec/${EPYTHON}/ipython \
/usr/bin/ipython${EPYTHON#python}
}
python_install_all() {
distutils-r1_python_install_all
if use examples; then
dodoc -r examples
docompress -x /usr/share/doc/${PF}/examples
fi
}
pkg_postinst() {
optfeature "code formatting" dev-python/black
optfeature "sympyprinting" dev-python/sympy
optfeature "cythonmagic" dev-python/cython
optfeature "%lprun magic command" dev-python/line-profiler
optfeature "%matplotlib magic command" dev-python/matplotlib-inline
if use nbconvert; then
if ! has_version virtual/pandoc ; then
einfo "Node.js will be used to convert notebooks to other formats"
einfo "like HTML. Support for that is still experimental. If you"
einfo "encounter any problems, please use app-text/pandoc instead."
fi
fi
}