Skip to content

Commit

Permalink
Revert "parsers.re now does fullmatch."
Browse files Browse the repository at this point in the history
This reverts commit 18320bb
This reverts commit cc1180d
  • Loading branch information
youtux committed Nov 5, 2022
1 parent b915c2a commit 1d84d29
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 56 deletions.
1 change: 0 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ Unreleased
----------
- Fix bug where steps without parsers would take precedence over steps with parsers. `#534 <https://github.com/pytest-dev/pytest-bdd/pull/534>`_
- Step functions can now be decorated multiple times with @given, @when, @then. Previously every decorator would override ``converters`` and ``target_fixture`` every at every application. `#534 <https://github.com/pytest-dev/pytest-bdd/pull/534>`_ `#544 <https://github.com/pytest-dev/pytest-bdd/pull/544>`_ `#525 <https://github.com/pytest-dev/pytest-bdd/issues/525>`_
- ``parsers.re`` now does a `fullmatch <https://docs.python.org/3/library/re.html#re.fullmatch>`_ instead of a partial match. This is to make it work just like the other parsers, since they don't ignore non-matching characters at the end of the string. `#539 <https://github.com/pytest-dev/pytest-bdd/pull/539>`_
- Require pytest>=6.2 `#534 <https://github.com/pytest-dev/pytest-bdd/pull/534>`_
- Using modern way to specify hook options to avoid deprecation warnings with pytest >=7.2.
- Add generic ``step`` decorator that will be used for all kind of steps `#548 <https://github.com/pytest-dev/pytest-bdd/pull/548>`_
Expand Down
4 changes: 2 additions & 2 deletions src/pytest_bdd/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ def parse_arguments(self, name: str) -> dict[str, str] | None:
:return: `dict` of step arguments
"""
match = self.regex.fullmatch(name)
match = self.regex.match(name)
if match is None:
return None
return match.groupdict()

def is_matching(self, name: str) -> bool:
"""Match given name with the step name."""
return bool(self.regex.fullmatch(name))
return bool(self.regex.match(name))


class parse(StepParser):
Expand Down
53 changes: 0 additions & 53 deletions tests/args/regex/test_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,59 +55,6 @@ def _(euro, values):
result.assert_outcomes(passed=1)


def test_exact_match(pytester):
"""Test that parsers.re does an exact match (fullmatch) of the whole string.
This tests exists because in the past we only used re.match, which only finds a match at the beginning
of the string, so if there were any more characters not matching at the end, they were ignored"""

pytester.makefile(
".feature",
arguments=textwrap.dedent(
"""\
Feature: Step arguments
Scenario: Every step takes a parameter with the same name
Given I have 2 Euro
# Step that should not be found:
When I pay 1 Euro by mistake
Then I should have 1 Euro left
"""
),
)

pytester.makepyfile(
textwrap.dedent(
r"""
import pytest
from pytest_bdd import parsers, given, when, then, scenarios
scenarios("arguments.feature")
@given(parsers.re(r"I have (?P<amount>\d+) Euro"), converters={"amount": int}, target_fixture="wallet")
def _(amount):
return {"EUR": amount}
# Purposefully using a re that will not match the step "When I pay 1 Euro and 50 cents"
@when(parsers.re(r"I pay (?P<amount>\d+) Euro"), converters={"amount": int})
def _(amount, wallet):
wallet["EUR"] -= amount
@then(parsers.re(r"I should have (?P<amount>\d+) Euro left"), converters={"amount": int})
def _(amount, wallet):
assert wallet["EUR"] == amount
"""
)
)
result = pytester.runpytest()
result.assert_outcomes(failed=1)
result.stdout.fnmatch_lines(
'*StepDefinitionNotFoundError: Step definition is not found: When "I pay 1 Euro by mistake"*'
)


def test_argument_in_when(pytester):
pytester.makefile(
".feature",
Expand Down

0 comments on commit 1d84d29

Please sign in to comment.