Coverage for src/prosemark/cli/compile.py: 100%
32 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-09-30 23:09 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-09-30 23:09 +0000
1"""CLI command for compiling node subtrees."""
3from pathlib import Path
4from typing import Annotated
6import typer
8from prosemark.adapters.clock_system import ClockSystem
9from prosemark.adapters.editor_launcher_system import EditorLauncherSystem
10from prosemark.adapters.node_repo_fs import NodeRepoFs
11from prosemark.app.compile.use_cases import CompileSubtreeUseCase
12from prosemark.domain.compile.models import CompileRequest
13from prosemark.domain.models import NodeId
14from prosemark.exceptions import NodeNotFoundError
15from prosemark.ports.compile.service import NodeNotFoundError as CompileNodeNotFoundError
18def compile_command(
19 node_id: Annotated[str, typer.Argument(help='Node ID to compile')],
20 path: Annotated[Path | None, typer.Option('--path', '-p', help='Project directory')] = None,
21) -> None:
22 """Compile a node and its subtree into concatenated plain text."""
23 try:
24 project_root = path or Path.cwd()
26 # Validate the node ID format
27 try:
28 target_node_id = NodeId(node_id)
29 except Exception as e:
30 typer.echo(f'Error: Invalid node ID format: {node_id}', err=True)
31 raise typer.Exit(1) from e
33 # Wire up dependencies
34 clock = ClockSystem()
35 editor = EditorLauncherSystem()
36 node_repo = NodeRepoFs(project_root, editor, clock)
38 # Create use case
39 compile_use_case = CompileSubtreeUseCase(node_repo)
41 # Create request
42 request = CompileRequest(node_id=target_node_id, include_empty=False)
44 # Execute compilation
45 result = compile_use_case.compile_subtree(request)
47 # Output the compiled content to stdout
48 typer.echo(result.content)
50 except (NodeNotFoundError, CompileNodeNotFoundError) as e:
51 typer.echo(f'Error: Node not found: {node_id}', err=True)
52 raise typer.Exit(1) from e
54 except Exception as e:
55 typer.echo(f'Error: Compilation failed: {e}', err=True)
56 raise typer.Exit(1) from e