Coverage for src/prosemark/cli/materialize.py: 100%

37 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-09-28 19:17 +0000

1"""CLI command for materializing placeholders.""" 

2 

3from pathlib import Path 

4 

5import click 

6 

7from prosemark.adapters.binder_repo_fs import BinderRepoFs 

8from prosemark.adapters.clock_system import ClockSystem 

9from prosemark.adapters.console_pretty import ConsolePretty 

10from prosemark.adapters.editor_launcher_system import EditorLauncherSystem 

11from prosemark.adapters.id_generator_uuid7 import IdGeneratorUuid7 

12from prosemark.adapters.logger_stdout import LoggerStdout 

13from prosemark.adapters.node_repo_fs import NodeRepoFs 

14from prosemark.app.materialize_node import MaterializeNode 

15from prosemark.exceptions import FileSystemError, PlaceholderNotFoundError 

16 

17 

18@click.command() 

19@click.argument('title') 

20@click.option('--parent', '_parent', help='Parent node ID to search within') 

21@click.option('--path', '-p', type=click.Path(path_type=Path), help='Project directory') 

22def materialize_command(title: str, _parent: str | None, path: Path | None) -> None: 

23 """Convert a placeholder to an actual node.""" 

24 try: 

25 project_root = path or Path.cwd() 

26 

27 # Wire up dependencies 

28 binder_repo = BinderRepoFs(project_root) 

29 clock = ClockSystem() 

30 console = ConsolePretty() 

31 editor = EditorLauncherSystem() 

32 node_repo = NodeRepoFs(project_root, editor, clock) 

33 id_generator = IdGeneratorUuid7() 

34 logger = LoggerStdout() 

35 

36 # Execute use case 

37 interactor = MaterializeNode( 

38 binder_repo=binder_repo, 

39 node_repo=node_repo, 

40 id_generator=id_generator, 

41 clock=clock, 

42 console=console, 

43 logger=logger, 

44 ) 

45 

46 result = interactor.execute(title=title) 

47 

48 # Only output success messages if it was newly materialized 

49 if not result.was_already_materialized: 

50 click.echo(f'Materialized "{title}" ({result.node_id})') 

51 click.echo(f'Created files: {result.node_id}.md, {result.node_id}.notes.md') 

52 click.echo('Updated binder structure') 

53 

54 except PlaceholderNotFoundError: 

55 click.echo('Error: Item not found', err=True) 

56 raise SystemExit(1) from None 

57 except FileSystemError: 

58 click.echo('Error: File creation failed', err=True) 

59 raise SystemExit(2) from None