Coverage for flowr / exporters / mermaid_exporter.py: 48%
33 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-22 18:42 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-22 18:42 +0000
1"""Mermaid export adapter for flowr."""
3import argparse
5from flowr.domain.flow_definition import Flow
6from flowr.domain.mermaid import to_mermaid
9class MermaidExporter:
10 """Export adapter that serializes flow definitions as Mermaid diagrams."""
12 def format_name(self) -> str:
13 """Return the canonical format name."""
14 return "mermaid"
16 def description(self) -> str:
17 """Return a short human-readable description."""
18 return "Export flow definitions as Mermaid diagrams"
20 def supports_directory(self) -> bool:
21 """Return True — Mermaid adapter supports directory-mode export."""
22 return True
24 def accepted_options(self) -> list[str]:
25 """Return the option keys the Mermaid adapter consumes."""
26 return ["no_conditions"]
28 def add_arguments(self, parser: object) -> None:
29 """Register Mermaid-specific CLI flags."""
30 p: argparse.ArgumentParser = parser # type: ignore[assignment]
31 p.add_argument(
32 "--no-conditions",
33 action="store_true",
34 dest="adapter_no_conditions",
35 )
37 def export(
38 self,
39 flow: Flow,
40 options: dict,
41 subflows: dict[str, Flow] | None = None,
42 ) -> str:
43 """Export a single flow definition as a Mermaid stateDiagram-v2."""
44 diagram = to_mermaid(flow)
45 if options.get("no_conditions"):
46 lines = diagram.split("\n")
47 filtered = [lines[0]]
48 for line in lines[1:]:
49 if " --> " in line and " : " in line:
50 parts = line.split(" : ", 1)
51 trigger_part = parts[1].split(" | ")[0]
52 filtered.append(f"{parts[0]} : {trigger_part}")
53 else:
54 filtered.append(line)
55 diagram = "\n".join(filtered)
56 return diagram
58 def export_directory(self, flows: list[tuple[str, Flow]], options: dict) -> str:
59 """Export a collection of flows as separated Mermaid diagrams."""
60 diagrams = []
61 for _name, flow in flows:
62 diagrams.append(self.export(flow, options))
63 return "\n---\n".join(diagrams)