From e559bfb74fa71dd4ac96dcb07bd2fac8448aa7aa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Sep 2022 09:23:15 -0500 Subject: [PATCH 1/6] doctest: Fix circular import with pytest.Item --- src/_pytest/doctest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/_pytest/doctest.py b/src/_pytest/doctest.py index ed072fcd628..3b0db462a58 100644 --- a/src/_pytest/doctest.py +++ b/src/_pytest/doctest.py @@ -34,6 +34,7 @@ from _pytest.config.argparsing import Parser from _pytest.fixtures import FixtureRequest from _pytest.nodes import Collector +from _pytest.nodes import Item from _pytest.outcomes import OutcomeException from _pytest.pathlib import fnmatch_ex from _pytest.pathlib import import_path @@ -246,7 +247,7 @@ def _get_runner( ) -class DoctestItem(pytest.Item): +class DoctestItem(Item): def __init__( self, name: str, From 39d8a34cea84284551aaa34aa29e5e34b046dba4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Sep 2022 09:28:22 -0500 Subject: [PATCH 2/6] doctest: Fix circular import with pytest.Module --- src/_pytest/doctest.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/_pytest/doctest.py b/src/_pytest/doctest.py index 3b0db462a58..12f7e310032 100644 --- a/src/_pytest/doctest.py +++ b/src/_pytest/doctest.py @@ -38,6 +38,7 @@ from _pytest.outcomes import OutcomeException from _pytest.pathlib import fnmatch_ex from _pytest.pathlib import import_path +from _pytest.python import Module from _pytest.python_api import approx from _pytest.warning_types import PytestWarning @@ -412,7 +413,7 @@ def _get_continue_on_failure(config): return continue_on_failure -class DoctestTextfile(pytest.Module): +class DoctestTextfile(Module): obj = None def collect(self) -> Iterable[DoctestItem]: @@ -492,7 +493,7 @@ def _mock_aware_unwrap( inspect.unwrap = real_unwrap -class DoctestModule(pytest.Module): +class DoctestModule(Module): def collect(self) -> Iterable[DoctestItem]: import doctest From 51d4215373b82531d7115c56d489dc9712317aff Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Sep 2022 09:31:41 -0500 Subject: [PATCH 3/6] doctest: Fix circular import with pytest.fixture --- src/_pytest/doctest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/_pytest/doctest.py b/src/_pytest/doctest.py index 12f7e310032..4b19a710aa7 100644 --- a/src/_pytest/doctest.py +++ b/src/_pytest/doctest.py @@ -32,6 +32,7 @@ from _pytest.compat import safe_getattr from _pytest.config import Config from _pytest.config.argparsing import Parser +from _pytest.fixtures import fixture from _pytest.fixtures import FixtureRequest from _pytest.nodes import Collector from _pytest.nodes import Item @@ -733,7 +734,7 @@ def _get_report_choice(key: str) -> int: }[key] -@pytest.fixture(scope="session") +@fixture(scope="session") def doctest_namespace() -> Dict[str, Any]: """Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests. From a7091f9e139f65d7358c3a7c49e3ecfee766fb2f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Sep 2022 09:40:53 -0500 Subject: [PATCH 4/6] doctest: Fix circular import with pytest.skip --- src/_pytest/doctest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/_pytest/doctest.py b/src/_pytest/doctest.py index 4b19a710aa7..771f0890d88 100644 --- a/src/_pytest/doctest.py +++ b/src/_pytest/doctest.py @@ -23,7 +23,6 @@ from typing import TYPE_CHECKING from typing import Union -import pytest from _pytest import outcomes from _pytest._code.code import ExceptionInfo from _pytest._code.code import ReprFileLocation @@ -37,6 +36,7 @@ from _pytest.nodes import Collector from _pytest.nodes import Item from _pytest.outcomes import OutcomeException +from _pytest.outcomes import skip from _pytest.pathlib import fnmatch_ex from _pytest.pathlib import import_path from _pytest.python import Module @@ -452,7 +452,7 @@ def _check_all_skipped(test: "doctest.DocTest") -> None: all_skipped = all(x.options.get(doctest.SKIP, False) for x in test.examples) if all_skipped: - pytest.skip("all tests skipped by +SKIP option") + skip("all tests skipped by +SKIP option") def _is_mocked(obj: object) -> bool: @@ -552,7 +552,7 @@ def _find( ) except ImportError: if self.config.getvalue("doctest_ignore_import_errors"): - pytest.skip("unable to import module %r" % self.path) + skip("unable to import module %r" % self.path) else: raise # Uses internal doctest module parsing mechanism. From dbb179652aeca7537ab37db4f2ebcaf248814510 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Sep 2022 09:11:09 -0500 Subject: [PATCH 5/6] doctest: export pytest.DoctestItem for typing purposes Fixes #10312 --- src/pytest/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pytest/__init__.py b/src/pytest/__init__.py index c1634e296bc..f25ecde9c47 100644 --- a/src/pytest/__init__.py +++ b/src/pytest/__init__.py @@ -18,6 +18,7 @@ from _pytest.config.argparsing import OptionGroup from _pytest.config.argparsing import Parser from _pytest.debugging import pytestPDB as __pytestPDB +from _pytest.doctest import DoctestItem from _pytest.fixtures import fixture from _pytest.fixtures import FixtureLookupError from _pytest.fixtures import FixtureRequest @@ -92,6 +93,7 @@ "Config", "console_main", "deprecated_call", + "DoctestItem", "exit", "ExceptionInfo", "ExitCode", From ca05830b89e110b806680186ef25de2cf8e2dfe9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Sep 2022 09:15:34 -0500 Subject: [PATCH 6/6] docs: Note in changelog --- changelog/10313.trivial.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog/10313.trivial.rst diff --git a/changelog/10313.trivial.rst b/changelog/10313.trivial.rst new file mode 100644 index 00000000000..8203b580211 --- /dev/null +++ b/changelog/10313.trivial.rst @@ -0,0 +1,3 @@ +Made ``_pytest.doctest.DoctestItem`` export ``pytest.DoctestItem`` for +type check and runtime purposes. Made `_pytest.doctest` use internal APIs +to avoid circular imports.