forked from test_framework/pytest-bdd
Initial stub with pyparsing
This commit is contained in:
parent
b3d5f6fd3f
commit
6b06338cf2
|
@ -89,6 +89,20 @@ category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jinja2"
|
||||||
|
version = "3.1.2"
|
||||||
|
description = "A very fast and expressive template engine."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
MarkupSafe = ">=2.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
i18n = ["Babel (>=2.7)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mako"
|
name = "mako"
|
||||||
version = "1.2.1"
|
version = "1.2.1"
|
||||||
|
@ -233,6 +247,10 @@ category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6.8"
|
python-versions = ">=3.6.8"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
jinja2 = {version = "*", optional = true, markers = "extra == \"diagrams\""}
|
||||||
|
railroad-diagrams = {version = "*", optional = true, markers = "extra == \"diagrams\""}
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
diagrams = ["railroad-diagrams", "jinja2"]
|
diagrams = ["railroad-diagrams", "jinja2"]
|
||||||
|
|
||||||
|
@ -287,6 +305,14 @@ psutil = ["psutil (>=3.0)"]
|
||||||
setproctitle = ["setproctitle"]
|
setproctitle = ["setproctitle"]
|
||||||
testing = ["filelock"]
|
testing = ["filelock"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "railroad-diagrams"
|
||||||
|
version = "2.0.4"
|
||||||
|
description = "Generate SVG railroad syntax diagrams, like on JSON.org."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "six"
|
name = "six"
|
||||||
version = "1.16.0"
|
version = "1.16.0"
|
||||||
|
@ -380,7 +406,7 @@ testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.8"
|
python-versions = "^3.8"
|
||||||
content-hash = "e82156a2ff38a1f6f6276d73eb262f79b943c1f9e21b33bc2f19640f373717cc"
|
content-hash = "51381b2b649ef593ff81738a8afbdd753930f518f6e04ca3d748a4841d3032b0"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
atomicwrites = [
|
atomicwrites = [
|
||||||
|
@ -465,6 +491,10 @@ iniconfig = [
|
||||||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
||||||
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
||||||
]
|
]
|
||||||
|
jinja2 = [
|
||||||
|
{file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
|
||||||
|
{file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
|
||||||
|
]
|
||||||
mako = [
|
mako = [
|
||||||
{file = "Mako-1.2.1-py3-none-any.whl", hash = "sha256:df3921c3081b013c8a2d5ff03c18375651684921ae83fd12e64800b7da923257"},
|
{file = "Mako-1.2.1-py3-none-any.whl", hash = "sha256:df3921c3081b013c8a2d5ff03c18375651684921ae83fd12e64800b7da923257"},
|
||||||
{file = "Mako-1.2.1.tar.gz", hash = "sha256:f054a5ff4743492f1aa9ecc47172cb33b42b9d993cffcc146c9de17e717b0307"},
|
{file = "Mako-1.2.1.tar.gz", hash = "sha256:f054a5ff4743492f1aa9ecc47172cb33b42b9d993cffcc146c9de17e717b0307"},
|
||||||
|
@ -587,6 +617,10 @@ pytest-xdist = [
|
||||||
{file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"},
|
{file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"},
|
||||||
{file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"},
|
{file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"},
|
||||||
]
|
]
|
||||||
|
railroad-diagrams = [
|
||||||
|
{file = "railroad-diagrams-2.0.4.tar.gz", hash = "sha256:7413ffa194583bd510efc3e4668f61d5a38beeca186bb7c36eea6d0d6f03fb45"},
|
||||||
|
{file = "railroad_diagrams-2.0.4-py3-none-any.whl", hash = "sha256:769c9aba83fd42361b8ce471953ae8224ed92c66b9c470caefefbb36ff9d991c"},
|
||||||
|
]
|
||||||
six = [
|
six = [
|
||||||
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||||
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||||
|
|
|
@ -45,6 +45,7 @@ pytest = ">=6.2.0"
|
||||||
typing-extensions = "*"
|
typing-extensions = "*"
|
||||||
TatSu = "^5.8.3" # TODO: Find lowest version we can work with.
|
TatSu = "^5.8.3" # TODO: Find lowest version we can work with.
|
||||||
more-itertools = "^8.14.0" # TODO: Find lowest version we can work with.
|
more-itertools = "^8.14.0" # TODO: Find lowest version we can work with.
|
||||||
|
pyparsing = "^3.0.9"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
tox = "^3.25.1"
|
tox = "^3.25.1"
|
||||||
|
@ -53,6 +54,7 @@ types-setuptools = "^64.0.1"
|
||||||
pytest-xdist = "^2.5.0"
|
pytest-xdist = "^2.5.0"
|
||||||
coverage = {extras = ["toml"], version = "^6.4.3"}
|
coverage = {extras = ["toml"], version = "^6.4.3"}
|
||||||
Pygments = "^2.12.0" # for code-block highlighting
|
Pygments = "^2.12.0" # for code-block highlighting
|
||||||
|
pyparsing = {extras = ["diagrams"], version = "^3.0.9"}
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
import collections
|
||||||
|
|
||||||
|
import pyparsing as pp
|
||||||
|
|
||||||
|
from pytest_bdd.parser import Feature, ScenarioTemplate, Step
|
||||||
|
|
||||||
|
pp.enable_all_warnings()
|
||||||
|
|
||||||
|
any_char = pp.Regex(r"[^\n]+").set_name("any_char")
|
||||||
|
|
||||||
|
given_kw = pp.Literal("Given")
|
||||||
|
when_kw = pp.Literal("When")
|
||||||
|
then_kw = pp.Literal("Then")
|
||||||
|
|
||||||
|
step_kw = given_kw | when_kw | then_kw
|
||||||
|
|
||||||
|
scenario_kw = pp.Literal("Scenario")
|
||||||
|
|
||||||
|
step = pp.Group(step_kw("keyword") + any_char("name") + pp.LineEnd())
|
||||||
|
step.set_name("step")
|
||||||
|
|
||||||
|
steps = pp.Group(step[1, ...])("steps")
|
||||||
|
|
||||||
|
scenario = pp.Group(scenario_kw + ":" + any_char("name") + pp.LineEnd() + steps)
|
||||||
|
scenario.set_name("scenario")
|
||||||
|
|
||||||
|
|
||||||
|
scenarios = pp.Group(scenario("scenario")[1, ...])("scenarios")
|
||||||
|
|
||||||
|
start = scenarios
|
||||||
|
start.set_name("start")
|
||||||
|
|
||||||
|
start.create_diagram("/tmp/gherkin.html")
|
||||||
|
|
||||||
|
start.set_default_whitespace_chars(" \t")
|
||||||
|
|
||||||
|
input = """
|
||||||
|
Scenario: My first scenario
|
||||||
|
Given I have a step
|
||||||
|
When I do something
|
||||||
|
Then I should see something else
|
||||||
|
"""
|
||||||
|
|
||||||
|
parsed = start.parse_string(input, parse_all=True)
|
||||||
|
|
||||||
|
print(parsed)
|
||||||
|
|
||||||
|
|
||||||
|
def transform(tokens: pp.ParseResults):
|
||||||
|
res = tokens.as_dict()
|
||||||
|
print(res)
|
||||||
|
|
||||||
|
feature = Feature(
|
||||||
|
scenarios=collections.OrderedDict(),
|
||||||
|
filename="",
|
||||||
|
rel_filename="",
|
||||||
|
name=None,
|
||||||
|
tags=set(),
|
||||||
|
line_number=0,
|
||||||
|
description="",
|
||||||
|
background=None,
|
||||||
|
)
|
||||||
|
for scenario_p in tokens.scenarios:
|
||||||
|
scenario = ScenarioTemplate(
|
||||||
|
feature=feature,
|
||||||
|
name=scenario_p.name,
|
||||||
|
line_number=0,
|
||||||
|
templated=False,
|
||||||
|
)
|
||||||
|
feature.scenarios[scenario.name] = scenario
|
||||||
|
|
||||||
|
for step_p in scenario_p.steps:
|
||||||
|
step = Step(
|
||||||
|
name=step_p.name,
|
||||||
|
type=step_p.keyword,
|
||||||
|
line_number=0,
|
||||||
|
indent=0,
|
||||||
|
keyword=step_p.keyword.strip(),
|
||||||
|
)
|
||||||
|
scenario.add_step(step)
|
||||||
|
return feature
|
||||||
|
|
||||||
|
|
||||||
|
document = transform(parsed)
|
||||||
|
|
||||||
|
print(document)
|
||||||
|
|
||||||
|
|
||||||
|
input = """
|
||||||
|
Scenario: My first scenario
|
||||||
|
Given I have a step
|
||||||
|
When I do something
|
||||||
|
Then I should see something else
|
||||||
|
"""
|
||||||
|
|
||||||
|
parsed = start.parse_string(input, parse_all=True)
|
||||||
|
|
||||||
|
print(parsed.as_dict())
|
Loading…
Reference in New Issue