Coverage for archdocs/cli.py: 100%
32 statements
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-09 14:41 +0000
« 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
8from archdocs import page, settings
9from archdocs.main import ArchitectureParserAndRenderer, SettingsForArchdocs
12@typing.final
13class OutputFormat(enum.StrEnum):
14 mermaid_text = "mermaid"
15 markdown_text = "markdown"
16 html_page = "html"
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)
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
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")