Coverage for src/prosemark/cli/materialize.py: 100%
37 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 materializing placeholders."""
3from pathlib import Path
5import click
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
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()
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()
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 )
46 result = interactor.execute(title=title)
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')
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