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

1"""Mermaid export adapter for flowr.""" 

2 

3import argparse 

4 

5from flowr.domain.flow_definition import Flow 

6from flowr.domain.mermaid import to_mermaid 

7 

8 

9class MermaidExporter: 

10 """Export adapter that serializes flow definitions as Mermaid diagrams.""" 

11 

12 def format_name(self) -> str: 

13 """Return the canonical format name.""" 

14 return "mermaid" 

15 

16 def description(self) -> str: 

17 """Return a short human-readable description.""" 

18 return "Export flow definitions as Mermaid diagrams" 

19 

20 def supports_directory(self) -> bool: 

21 """Return True — Mermaid adapter supports directory-mode export.""" 

22 return True 

23 

24 def accepted_options(self) -> list[str]: 

25 """Return the option keys the Mermaid adapter consumes.""" 

26 return ["no_conditions"] 

27 

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 ) 

36 

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 

57 

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)