Skip to content

Commit

Permalink
First commit for setting default parser
Browse files Browse the repository at this point in the history
  • Loading branch information
jsa34 committed Nov 15, 2024
1 parent 8f9df7c commit e89e17c
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 14 deletions.
51 changes: 39 additions & 12 deletions src/pytest_bdd/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,37 @@

import abc
import re as base_re
from typing import Any, TypeVar, cast, overload
from typing import TYPE_CHECKING, Any, TypeVar, cast

import parse as base_parse
from _pytest.config import Config
from parse_type import cfparse as base_cfparse

if TYPE_CHECKING:
from _pytest.config.argparsing import Parser as PytestArgParser


def add_options(parser: PytestArgParser) -> None:
"""Add pytest-bdd options."""
group = parser.getgroup("bdd")
group.addoption(
"--bdd-default-parser",
action="store",
default=None,
help="Set the default step parser type (e.g. string, parse, re, cfparse).",
)


def configure(config: Config):
"""Set the default parser in pytest configuration."""
try:
parser_type = config.getoption("bdd_default_parser") or config.getini("bdd_default_parser")
except ValueError:
# If the option is not found, fallback to the default parser
parser_type = "string"

config._bdd_default_parser = parser_type


class StepParser(abc.ABC):
"""Parser of the individual step."""
Expand Down Expand Up @@ -103,18 +129,19 @@ def is_matching(self, name: str) -> bool:
TStepParser = TypeVar("TStepParser", bound=StepParser)


@overload
def get_parser(step_name: str) -> string: ...


@overload
def get_parser(step_name: TStepParser) -> TStepParser: ...


def get_parser(step_name: str | StepParser) -> StepParser:
def get_parser(step_name: str | StepParser, config: Config | None = None) -> StepParser:
"""Get parser by given name."""

if isinstance(step_name, StepParser):
return step_name

return string(step_name)
default_parser = getattr(config, "_bdd_default_parser", "string") if config else "string"

parser_classes = {
"string": string,
"parse": parse,
"re": re,
"cfparse": cfparse,
}

parser_cls = parser_classes.get(default_parser, string)
return parser_cls(step_name)
10 changes: 9 additions & 1 deletion src/pytest_bdd/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import pytest
from typing_extensions import ParamSpec

from . import cucumber_json, generation, gherkin_terminal_reporter, given, reporting, then, when
from . import cucumber_json, generation, gherkin_terminal_reporter, given, parsers, reporting, then, when
from .utils import CONFIG_STACK

if TYPE_CHECKING:
Expand Down Expand Up @@ -55,12 +55,19 @@ def _pytest_bdd_example() -> dict:
return {}


@pytest.fixture
def _pytest_step_config(request) -> Config:
"""Provide pytest config."""
return request.config


def pytest_addoption(parser: Parser) -> None:
"""Add pytest-bdd options."""
add_bdd_ini(parser)
cucumber_json.add_options(parser)
generation.add_options(parser)
gherkin_terminal_reporter.add_options(parser)
parsers.add_options(parser)


def add_bdd_ini(parser: Parser) -> None:
Expand All @@ -73,6 +80,7 @@ def pytest_configure(config: Config) -> None:
CONFIG_STACK.append(config)
cucumber_json.configure(config)
gherkin_terminal_reporter.configure(config)
parsers.configure(config)


def pytest_unconfigure(config: Config) -> None:
Expand Down
2 changes: 1 addition & 1 deletion tests/args/cfparse/test_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def _(euro, values):
"""
)
)
result = pytester.runpytest()
result = pytester.runpytest("-s", "-v", "--full-trace")
result.assert_outcomes(passed=1)


Expand Down

0 comments on commit e89e17c

Please sign in to comment.