Skip to content

Commit

Permalink
doctest: inline _setup_fixtures, make more similar to Function
Browse files Browse the repository at this point in the history
There used to be two callers to `_setup_fixtures()`, now there's only
one, so inline it and make `DoctestItem` more similar to `Function`.

(Eventually we may want to generalize `TopRequest` from taking
`Function` directly to some "fixture-supporting item", removing the
remaining `type: ignore` here and allowing plugins to do it in a stable
manner).
  • Loading branch information
bluetech committed Sep 8, 2023
1 parent b3a981d commit ab63ebb
Showing 1 changed file with 15 additions and 17 deletions.
32 changes: 15 additions & 17 deletions src/_pytest/doctest.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,8 +261,14 @@ def __init__(
super().__init__(name, parent)
self.runner = runner
self.dtest = dtest

# Stuff needed for fixture support.
self.obj = None
self.fixture_request: Optional[TopRequest] = None
fm = self.session._fixturemanager
fixtureinfo = fm.getfixtureinfo(node=self, func=None, cls=None)
self._fixtureinfo = fixtureinfo
self.fixturenames = fixtureinfo.names_closure
self._initrequest()

@classmethod
def from_parent( # type: ignore
Expand All @@ -277,11 +283,16 @@ def from_parent( # type: ignore
"""The public named constructor."""
return super().from_parent(name=name, parent=parent, runner=runner, dtest=dtest)

def _initrequest(self) -> None:
self.funcargs: Dict[str, object] = {}
self._request = TopRequest(self, _ispytest=True) # type: ignore[arg-type]

def setup(self) -> None:
if self.dtest is not None:
self.fixture_request = _setup_fixtures(self)
globs = dict(getfixture=self.fixture_request.getfixturevalue)
for name, value in self.fixture_request.getfixturevalue(
self._request._fillfixtures()

globs = dict(getfixture=self._request.getfixturevalue)
for name, value in self._request.getfixturevalue(
"doctest_namespace"
).items():
globs[name] = value
Expand Down Expand Up @@ -589,19 +600,6 @@ def _from_module(self, module, object):
)


def _setup_fixtures(doctest_item: DoctestItem) -> TopRequest:
"""Used by DoctestTextfile and DoctestItem to setup fixture information."""

doctest_item.funcargs = {} # type: ignore[attr-defined]
fm = doctest_item.session._fixturemanager
fixtureinfo = fm.getfixtureinfo(node=doctest_item, func=None, cls=None)
doctest_item._fixtureinfo = fixtureinfo # type: ignore[attr-defined]
doctest_item.fixturenames = fixtureinfo.names_closure # type: ignore[attr-defined]
fixture_request = TopRequest(doctest_item, _ispytest=True) # type: ignore[arg-type]
fixture_request._fillfixtures()
return fixture_request


def _init_checker_class() -> Type["doctest.OutputChecker"]:
import doctest
import re
Expand Down

0 comments on commit ab63ebb

Please sign in to comment.