Initial stub with pyparsing
This commit is contained in:
parent
b3d5f6fd3f
commit
6b06338cf2
|
@ -89,6 +89,20 @@ category = "main"
|
|||
optional = false
|
||||
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]]
|
||||
name = "mako"
|
||||
version = "1.2.1"
|
||||
|
@ -233,6 +247,10 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = ">=3.6.8"
|
||||
|
||||
[package.dependencies]
|
||||
jinja2 = {version = "*", optional = true, markers = "extra == \"diagrams\""}
|
||||
railroad-diagrams = {version = "*", optional = true, markers = "extra == \"diagrams\""}
|
||||
|
||||
[package.extras]
|
||||
diagrams = ["railroad-diagrams", "jinja2"]
|
||||
|
||||
|
@ -287,6 +305,14 @@ psutil = ["psutil (>=3.0)"]
|
|||
setproctitle = ["setproctitle"]
|
||||
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]]
|
||||
name = "six"
|
||||
version = "1.16.0"
|
||||
|
@ -380,7 +406,7 @@ testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7
|
|||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.8"
|
||||
content-hash = "e82156a2ff38a1f6f6276d73eb262f79b943c1f9e21b33bc2f19640f373717cc"
|
||||
content-hash = "51381b2b649ef593ff81738a8afbdd753930f518f6e04ca3d748a4841d3032b0"
|
||||
|
||||
[metadata.files]
|
||||
atomicwrites = [
|
||||
|
@ -465,6 +491,10 @@ iniconfig = [
|
|||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
||||
{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 = [
|
||||
{file = "Mako-1.2.1-py3-none-any.whl", hash = "sha256:df3921c3081b013c8a2d5ff03c18375651684921ae83fd12e64800b7da923257"},
|
||||
{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-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 = [
|
||||
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||
|
|
|
@ -45,6 +45,7 @@ pytest = ">=6.2.0"
|
|||
typing-extensions = "*"
|
||||
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.
|
||||
pyparsing = "^3.0.9"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
tox = "^3.25.1"
|
||||
|
@ -53,6 +54,7 @@ types-setuptools = "^64.0.1"
|
|||
pytest-xdist = "^2.5.0"
|
||||
coverage = {extras = ["toml"], version = "^6.4.3"}
|
||||
Pygments = "^2.12.0" # for code-block highlighting
|
||||
pyparsing = {extras = ["diagrams"], version = "^3.0.9"}
|
||||
|
||||
[build-system]
|
||||
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