From 7c204f61579f7166c72bd14f3db14fdaf3927f89 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Fri, 14 Jul 2023 10:59:00 +0300 Subject: [PATCH] Export `FixtureDef` FixtureDef is used in the `pytest_fixture_setup` hook so needs to be public. However since its current internals are quite dubious (and not all marked with `_` prefix) I've added an explicit note that only documented fields/methods are considered public. Refs #7469. --- changelog/7469.feature.rst | 1 + doc/en/reference/reference.rst | 2 +- src/_pytest/fixtures.py | 11 ++++++++++- src/pytest/__init__.py | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 changelog/7469.feature.rst diff --git a/changelog/7469.feature.rst b/changelog/7469.feature.rst new file mode 100644 index 00000000000..8e9df72697c --- /dev/null +++ b/changelog/7469.feature.rst @@ -0,0 +1 @@ +:class:`~pytest.FixtureDef` is now exported as ``pytest.FixtureDef`` for typing purposes. diff --git a/doc/en/reference/reference.rst b/doc/en/reference/reference.rst index cf83ae05f21..ea008110e4a 100644 --- a/doc/en/reference/reference.rst +++ b/doc/en/reference/reference.rst @@ -910,7 +910,7 @@ ExitCode FixtureDef ~~~~~~~~~~ -.. autoclass:: _pytest.fixtures.FixtureDef() +.. autoclass:: pytest.FixtureDef() :members: :show-inheritance: diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 707362607e8..25e94909eb0 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -216,6 +216,7 @@ def add_funcarg_pseudo_fixture_def( params=valuelist, unittest=False, ids=None, + _ispytest=True, ) arg2fixturedefs[argname] = [fixturedef] if name2pseudofixturedef is not None: @@ -974,7 +975,11 @@ def _eval_scope_callable( @final class FixtureDef(Generic[FixtureValue]): - """A container for a fixture definition.""" + """A container for a fixture definition. + + Note: At this time, only explicitly documented fields and methods are + considered public stable API. + """ def __init__( self, @@ -988,7 +993,10 @@ def __init__( ids: Optional[ Union[Tuple[Optional[object], ...], Callable[[Any], Optional[object]]] ] = None, + *, + _ispytest: bool = False, ) -> None: + check_ispytest(_ispytest) self._fixturemanager = fixturemanager # The "base" node ID for the fixture. # @@ -1708,6 +1716,7 @@ def parsefactories( # noqa: F811 params=marker.params, unittest=unittest, ids=marker.ids, + _ispytest=True, ) faclist = self._arg2fixturedefs.setdefault(name, []) diff --git a/src/pytest/__init__.py b/src/pytest/__init__.py index 58ddb3288eb..831ede1fa1f 100644 --- a/src/pytest/__init__.py +++ b/src/pytest/__init__.py @@ -20,6 +20,7 @@ from _pytest.debugging import pytestPDB as __pytestPDB from _pytest.doctest import DoctestItem from _pytest.fixtures import fixture +from _pytest.fixtures import FixtureDef from _pytest.fixtures import FixtureLookupError from _pytest.fixtures import FixtureRequest from _pytest.fixtures import yield_fixture @@ -102,6 +103,7 @@ "fail", "File", "fixture", + "FixtureDef", "FixtureLookupError", "FixtureRequest", "freeze_includes",