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

1"""CLI command for compiling node subtrees.""" 

2 

3from pathlib import Path 

4from typing import Annotated 

5 

6import typer 

7 

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 

16 

17 

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() 

25 

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 

32 

33 # Wire up dependencies 

34 clock = ClockSystem() 

35 editor = EditorLauncherSystem() 

36 node_repo = NodeRepoFs(project_root, editor, clock) 

37 

38 # Create use case 

39 compile_use_case = CompileSubtreeUseCase(node_repo) 

40 

41 # Create request 

42 request = CompileRequest(node_id=target_node_id, include_empty=False) 

43 

44 # Execute compilation 

45 result = compile_use_case.compile_subtree(request) 

46 

47 # Output the compiled content to stdout 

48 typer.echo(result.content) 

49 

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 

53 

54 except Exception as e: 

55 typer.echo(f'Error: Compilation failed: {e}', err=True) 

56 raise typer.Exit(1) from e