Coverage for archdocs/cli.py: 100%

32 statements  

« prev     ^ index     » next       coverage.py v7.17.2, created at 2026-11-09 14:41 +0000

1import argparse 

2import enum 

3import pathlib 

4import sys 

5import types 

6import typing 

7 

8from archdocs import page, settings 

9from archdocs.main import ArchitectureParserAndRenderer, SettingsForArchdocs 

10 

11 

12@typing.final 

13class OutputFormat(enum.StrEnum): 

14 mermaid_text = "mermaid" 

15 markdown_text = "markdown" 

16 html_page = "html" 

17 

18 

19_RENDERERS_OF_FORMAT: typing.Final = types.MappingProxyType( 

20 { 

21 OutputFormat.mermaid_text: page.render_mermaid_text, 

22 OutputFormat.markdown_text: page.render_markdown_text, 

23 OutputFormat.html_page: page.render_architecture_page, 

24 }, 

25) 

26 

27 

28def _build_argument_parser() -> argparse.ArgumentParser: 

29 root_parser: typing.Final = argparse.ArgumentParser(prog="archdocs") 

30 render_parser: typing.Final = root_parser.add_subparsers(dest="command_name", required=True).add_parser( 

31 "render", help="render the architecture diagram" 

32 ) 

33 render_parser.add_argument("--root-dir", default=".", help="where the sources of the service live") 

34 render_parser.add_argument("--service-name", required=True, help="label of the service on the diagram") 

35 render_parser.add_argument("--kubernetes-dir", default=None, help="manifests or helm chart, from root-dir") 

36 render_parser.add_argument( 

37 "--format", 

38 dest="output_format", 

39 type=OutputFormat, 

40 choices=tuple(OutputFormat), 

41 default=OutputFormat.mermaid_text, 

42 ) 

43 render_parser.add_argument("--output", type=pathlib.Path, default=None, help="file to write, stdout if omitted") 

44 render_parser.add_argument("--mermaid-script-url", default=settings.DEFAULT_MERMAID_SCRIPT_URL) 

45 return root_parser 

46 

47 

48def run_command_line(every_argument: typing.Sequence[str] | None = None) -> None: 

49 parsed_arguments: typing.Final = _build_argument_parser().parse_args(every_argument) 

50 arch_engine: typing.Final = ArchitectureParserAndRenderer( 

51 local_settings=SettingsForArchdocs( 

52 root_dir=parsed_arguments.root_dir, 

53 service_name=parsed_arguments.service_name, 

54 kubernetes_dir=parsed_arguments.kubernetes_dir, 

55 mermaid_script_url=parsed_arguments.mermaid_script_url, 

56 ), 

57 ) 

58 rendered_output: typing.Final = _RENDERERS_OF_FORMAT[parsed_arguments.output_format](arch_engine) 

59 if parsed_arguments.output is None: 

60 sys.stdout.write(rendered_output) 

61 return 

62 parsed_arguments.output.write_text(rendered_output, encoding="utf-8")