Skip to content

Commit 67d708f

Browse files
committed
Extract getfixturedefs compatibility function
1 parent cc86d99 commit 67d708f

File tree

5 files changed

+30
-12
lines changed

5 files changed

+30
-12
lines changed

poetry.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ parse = "*"
4040
parse-type = "*"
4141
pytest = ">=6.2.0"
4242
typing-extensions = "*"
43+
packaging = "*"
4344

4445
[tool.poetry.group.dev.dependencies]
4546
tox = ">=4.11.3"

src/pytest_bdd/compat.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from collections.abc import Sequence
2+
from importlib.metadata import version
3+
from typing import Optional
4+
5+
from _pytest.fixtures import FixtureDef, FixtureManager
6+
from _pytest.nodes import Node
7+
from packaging.version import Version
8+
from packaging.version import parse as parse_version
9+
10+
pytest_version = parse_version(version("pytest"))
11+
12+
13+
if pytest_version >= Version("8.1"):
14+
15+
def getfixturedefs(fixturemanager: FixtureManager, fixturename: str, node: Node) -> Optional[Sequence[FixtureDef]]:
16+
return fixturemanager.getfixturedefs(fixturename, node)
17+
18+
else:
19+
20+
def getfixturedefs(fixturemanager: FixtureManager, fixturename: str, node: Node) -> Optional[Sequence[FixtureDef]]:
21+
return fixturemanager.getfixturedefs(fixturename, node.nodeid)

src/pytest_bdd/generation.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
import os.path
66
from typing import TYPE_CHECKING, cast
77

8-
import pytest
98
from _pytest._io import TerminalWriter
109
from mako.lookup import TemplateLookup
1110

11+
from .compat import getfixturedefs
1212
from .feature import get_features
1313
from .scenario import inject_fixturedefs_for_step, make_python_docstring, make_python_name, make_string_literal
1414
from .steps import get_step_fixture_name
@@ -130,10 +130,7 @@ def _find_step_fixturedef(
130130
"""Find step fixturedef."""
131131
with inject_fixturedefs_for_step(step=step, fixturemanager=fixturemanager, node=item):
132132
bdd_name = get_step_fixture_name(step=step)
133-
if hasattr(pytest, "version_tuple") and pytest.version_tuple >= (8, 1):
134-
return fixturemanager.getfixturedefs(bdd_name, item)
135-
else:
136-
return fixturemanager.getfixturedefs(bdd_name, item.nodeid)
133+
return getfixturedefs(fixturemanager, bdd_name, item)
137134

138135

139136
def parse_feature_files(paths: list[str], **kwargs: Any) -> tuple[list[Feature], list[ScenarioTemplate], list[Step]]:

src/pytest_bdd/scenario.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@
2323
from typing_extensions import ParamSpec
2424

2525
from . import exceptions
26+
from .compat import getfixturedefs
2627
from .feature import get_feature, get_features
2728
from .steps import StepFunctionContext, get_step_fixture_name, inject_fixture
2829
from .utils import CONFIG_STACK, get_args, get_caller_module_locals, get_caller_module_path
2930

3031
if TYPE_CHECKING:
3132
from _pytest.mark.structures import ParameterSet
33+
from _pytest.nodes import Node
3234

3335
from .parser import Feature, Scenario, ScenarioTemplate, Step
3436

@@ -42,7 +44,7 @@
4244
ALPHA_REGEX = re.compile(r"^\d+_*")
4345

4446

45-
def find_fixturedefs_for_step(step: Step, fixturemanager: FixtureManager, node) -> Iterable[FixtureDef[Any]]:
47+
def find_fixturedefs_for_step(step: Step, fixturemanager: FixtureManager, node: Node) -> Iterable[FixtureDef[Any]]:
4648
"""Find the fixture defs that can parse a step."""
4749
# happens to be that _arg2fixturedefs is changed during the iteration so we use a copy
4850
fixture_def_by_name = list(fixturemanager._arg2fixturedefs.items())
@@ -59,10 +61,7 @@ def find_fixturedefs_for_step(step: Step, fixturemanager: FixtureManager, node)
5961
if not match:
6062
continue
6163

62-
if hasattr(pytest, "version_tuple") and pytest.version_tuple >= (8, 1):
63-
fixturedefs = fixturemanager.getfixturedefs(fixturename, node)
64-
else:
65-
fixturedefs = fixturemanager.getfixturedefs(fixturename, node.nodeid)
64+
fixturedefs = getfixturedefs(fixturemanager, fixturename, node)
6665
if fixturedef not in (fixturedefs or []):
6766
continue
6867

@@ -117,7 +116,7 @@ def iterparentnodeids(nodeid: str) -> Iterator[str]:
117116

118117

119118
@contextlib.contextmanager
120-
def inject_fixturedefs_for_step(step: Step, fixturemanager: FixtureManager, node) -> Iterator[None]:
119+
def inject_fixturedefs_for_step(step: Step, fixturemanager: FixtureManager, node: Node) -> Iterator[None]:
121120
"""Inject fixture definitions that can parse a step.
122121
123122
We fist iterate over all the fixturedefs that can parse the step.

0 commit comments

Comments
 (0)