Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions bowtie/_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,15 @@ def __getattr__(self, attr: str) -> int:
],
),
("info", [("Basic Options", ["implementation", "format"])]),
("smoke", [("Basic Options", ["implementation", "quiet", "format"])]),
(
"smoke",
[
(
"Basic Options",
["implementation", "quiet", "failures-only", "format"],
)
],
),
(
"filter-dialects",
[
Expand Down Expand Up @@ -2392,29 +2400,41 @@ async def download_versions_and_parse_reports_for(
is_flag=True,
help="Don't print any output, just exit with nonzero status on failure.",
)
@click.option(
"--failures-only",
is_flag=True,
help="Only show output for implementations that fail.",
)
@format_option()
async def smoke(start: Starter, format: _F, echo: Callable[..., None]) -> int:
async def smoke(
start: Starter, format: _F, echo: Callable[..., None], failures_only: bool
) -> int:
"""
Smoke test implementations for basic correctness against Bowtie's protocol.
"""
results = [
(implementation.id, implementation.info, await implementation.smoke())
async for _, implementation in start()
]
display_results = results
if (
failures_only and format != "json"
): # keep json unfiltered for machine use
display_results = [
(id, info, r) for id, info, r in results if not r.success
]

match results, format:
case [(_, _, result)], "json":
echo(json.dumps(result.serializable(), indent=2))
case _, "json":
output = {id: result.serializable() for id, _, result in results}
echo(json.dumps(output, indent=2))
case [(_, _, result)], "pretty":
STDOUT.print(result)
case _, "pretty":
for _, _, each in results:
for _, _, each in display_results:
STDOUT.print(each)
case _, "markdown":
for _, info, result in results:
for _, info, result in display_results:
echo(f"# {info.name} ({info.language})\n")

if result.success:
Expand Down
12 changes: 12 additions & 0 deletions bowtie/tests/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -1737,6 +1737,18 @@ async def test_pretty_multiple(self):
# FIXME: We don't assert against the exact output yet, as it's a WIP
assert dedent(stdout), stdout

@pytest.mark.asyncio
async def test_failures_only_hides_passing(self):
stdout, stderr = await bowtie(
"smoke",
"--failures-only",
"--format",
"pretty",
"-i",
miniatures.passes_smoke,
)
assert stdout == "", stderr

@pytest.mark.asyncio
async def test_json_multiple(self):
jsonout, stderr = await bowtie(
Expand Down
Loading