Skip to content

Commit c64915c

Browse files
authored
Merge branch 'master' into pre-commit-ci-update-config
2 parents 9081a08 + 977bf61 commit c64915c

File tree

9 files changed

+297
-268
lines changed

9 files changed

+297
-268
lines changed

.github/workflows/main.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343

4444
- name: Install poetry
4545
run: |
46-
python -m pip install poetry==1.6.1
46+
python -m pip install poetry==1.8.2
4747
4848
- name: Configure poetry
4949
run: |

CHANGES.rst

+11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@ Changelog
33

44
Unreleased
55
----------
6+
7+
7.1.2
8+
----------
9+
- Address another compatibility issue with pytest 8.1 (fixture registration). `#680 <https://github.com/pytest-dev/pytest-bdd/pull/680>`_
10+
11+
7.1.1
12+
----------
13+
- Address a bug introduced in pytest-bdd 7.1 caused by incorrect pytest version check.
14+
15+
7.1
16+
----------
617
- Address compatibility issue with pytest 8.1. `#666 <https://github.com/pytest-dev/pytest-bdd/pull/666>`_
718

819
7.0.1

README.rst

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
BDD library for the pytest runner
22
=================================
33

4-
.. image:: http://img.shields.io/pypi/v/pytest-bdd.svg
4+
.. image:: https://img.shields.io/pypi/v/pytest-bdd.svg
55
:target: https://pypi.python.org/pypi/pytest-bdd
66
.. image:: https://codecov.io/gh/pytest-dev/pytest-bdd/branch/master/graph/badge.svg
7-
:target: https://codecov.io/gh/pytest-dev/pytest-bdd
8-
.. image:: https://travis-ci.org/pytest-dev/pytest-bdd.svg?branch=master
9-
:target: https://travis-ci.org/pytest-dev/pytest-bdd
7+
:target: https://codecov.io/gh/pytest-dev/pytest-bdd
8+
.. image:: https://github.com/pytest-dev/pytest-bdd/actions/workflows/main.yml/badge.svg
9+
:target: https://github.com/pytest-dev/pytest-bdd/actions/workflows/main.yml
1010
.. image:: https://readthedocs.org/projects/pytest-bdd/badge/?version=stable
11-
:target: https://readthedocs.org/projects/pytest-bdd/
12-
:alt: Documentation Status
11+
:target: https://readthedocs.org/projects/pytest-bdd/
12+
:alt: Documentation Status
1313

1414
pytest-bdd implements a subset of the Gherkin language to enable automating project
1515
requirements testing and to facilitate behavioral driven development.

poetry.lock

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

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "pytest-bdd"
3-
version = "7.0.1"
3+
version = "7.1.2"
44
description = "BDD for pytest"
55
authors = ["Oleg Pidsadnyi <[email protected]>", "Anatoly Bubenkov <[email protected]>"]
66
maintainers = ["Alessio Bogon <[email protected]>"]

src/pytest_bdd/compat.py

+57-3
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,75 @@
22

33
from collections.abc import Sequence
44
from importlib.metadata import version
5+
from typing import Any
56

6-
from _pytest.fixtures import FixtureDef, FixtureManager
7+
from _pytest.fixtures import FixtureDef, FixtureManager, FixtureRequest
78
from _pytest.nodes import Node
8-
from packaging.version import Version
99
from packaging.version import parse as parse_version
1010

1111
pytest_version = parse_version(version("pytest"))
1212

13+
__all__ = ["getfixturedefs", "inject_fixture"]
1314

14-
if pytest_version >= Version("8.1"):
15+
if pytest_version.release >= (8, 1):
1516

1617
def getfixturedefs(fixturemanager: FixtureManager, fixturename: str, node: Node) -> Sequence[FixtureDef] | None:
1718
return fixturemanager.getfixturedefs(fixturename, node)
1819

20+
def inject_fixture(request: FixtureRequest, arg: str, value: Any) -> None:
21+
"""Inject fixture into pytest fixture request.
22+
23+
:param request: pytest fixture request
24+
:param arg: argument name
25+
:param value: argument value
26+
"""
27+
28+
request._fixturemanager._register_fixture(
29+
name=arg,
30+
func=lambda: value,
31+
nodeid=request.node.nodeid,
32+
)
33+
1934
else:
2035

2136
def getfixturedefs(fixturemanager: FixtureManager, fixturename: str, node: Node) -> Sequence[FixtureDef] | None:
2237
return fixturemanager.getfixturedefs(fixturename, node.nodeid)
38+
39+
def inject_fixture(request: FixtureRequest, arg: str, value: Any) -> None:
40+
"""Inject fixture into pytest fixture request.
41+
42+
:param request: pytest fixture request
43+
:param arg: argument name
44+
:param value: argument value
45+
"""
46+
fd = FixtureDef(
47+
fixturemanager=request._fixturemanager,
48+
baseid=None,
49+
argname=arg,
50+
func=lambda: value,
51+
scope="function",
52+
params=None,
53+
)
54+
fd.cached_result = (value, 0, None)
55+
56+
old_fd = request._fixture_defs.get(arg)
57+
add_fixturename = arg not in request.fixturenames
58+
59+
def fin() -> None:
60+
request._fixturemanager._arg2fixturedefs[arg].remove(fd)
61+
62+
if old_fd is not None:
63+
request._fixture_defs[arg] = old_fd
64+
65+
if add_fixturename:
66+
request._pyfuncitem._fixtureinfo.names_closure.remove(arg)
67+
68+
request.addfinalizer(fin)
69+
70+
# inject fixture definition
71+
request._fixturemanager._arg2fixturedefs.setdefault(arg, []).append(fd)
72+
73+
# inject fixture value in request cache
74+
request._fixture_defs[arg] = fd
75+
if add_fixturename:
76+
request._pyfuncitem._fixtureinfo.names_closure.append(arg)

src/pytest_bdd/scenario.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
from typing_extensions import ParamSpec
2525

2626
from . import exceptions
27-
from .compat import getfixturedefs
27+
from .compat import getfixturedefs, inject_fixture
2828
from .feature import get_feature, get_features
29-
from .steps import StepFunctionContext, get_step_fixture_name, inject_fixture
29+
from .steps import StepFunctionContext, get_step_fixture_name
3030
from .utils import CONFIG_STACK, get_args, get_caller_module_locals, get_caller_module_path
3131

3232
if TYPE_CHECKING:

src/pytest_bdd/steps.py

+2-42
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ def _(article):
4343
from typing import Any, Callable, Iterable, Literal, TypeVar
4444

4545
import pytest
46-
from _pytest.fixtures import FixtureDef, FixtureRequest
46+
from _pytest.fixtures import FixtureRequest
4747
from typing_extensions import ParamSpec
4848

49+
from . import compat
4950
from .parser import Step
5051
from .parsers import StepParser, get_parser
5152
from .types import GIVEN, THEN, WHEN
@@ -201,44 +202,3 @@ def find_unique_name(name: str, seen: Iterable[str]) -> str:
201202
new_name = f"{name}_{i}"
202203
if new_name not in seen:
203204
return new_name
204-
205-
206-
def inject_fixture(request: FixtureRequest, arg: str, value: Any) -> None:
207-
"""Inject fixture into pytest fixture request.
208-
209-
:param request: pytest fixture request
210-
:param arg: argument name
211-
:param value: argument value
212-
"""
213-
214-
fd = FixtureDef(
215-
fixturemanager=request._fixturemanager,
216-
baseid=None,
217-
argname=arg,
218-
func=lambda: value,
219-
scope="function",
220-
params=None,
221-
)
222-
fd.cached_result = (value, 0, None)
223-
224-
old_fd = request._fixture_defs.get(arg)
225-
add_fixturename = arg not in request.fixturenames
226-
227-
def fin() -> None:
228-
request._fixturemanager._arg2fixturedefs[arg].remove(fd)
229-
230-
if old_fd is not None:
231-
request._fixture_defs[arg] = old_fd
232-
233-
if add_fixturename:
234-
request._pyfuncitem._fixtureinfo.names_closure.remove(arg)
235-
236-
request.addfinalizer(fin)
237-
238-
# inject fixture definition
239-
request._fixturemanager._arg2fixturedefs.setdefault(arg, []).append(fd)
240-
241-
# inject fixture value in request cache
242-
request._fixture_defs[arg] = fd
243-
if add_fixturename:
244-
request._pyfuncitem._fixtureinfo.names_closure.append(arg)

tox.ini

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[tox]
22
distshare = {homedir}/.tox/distshare
3-
envlist = py{3.8,3.9,3.10,3.11}-pytest{6.2,7.0,7.1,7.2,7.3,7.4,latest}-coverage
4-
py{3.12,3.13}-pytest{7.3,7.4,latest}-coverage
3+
envlist = py{3.8,3.9,3.10,3.11}-pytest{6.2,7.0,7.1,7.2,7.3,7.4,8.0,8.1,latest}-coverage
4+
py{3.12,3.13}-pytest{7.3,7.4,8.0,8.1,latest}-coverage
55
py3.12-pytestlatest-xdist-coverage
66
mypy
77

@@ -12,6 +12,8 @@ setenv =
1212
xdist: _PYTEST_MORE_ARGS=-n3 -rfsxX
1313
deps =
1414
pytestlatest: pytest
15+
pytest8.1: pytest~=8.1.0
16+
pytest8.0: pytest~=8.0.0
1517
pytest7.4: pytest~=7.4.0
1618
pytest7.3: pytest~=7.3.0
1719
pytest7.2: pytest~=7.2.0

0 commit comments

Comments
 (0)