Coverage for src/prosemark/cli/write.py: 100%
30 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-09-23 21:54 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-09-23 21:54 +0000
1"""CLI command for creating freeform writing files."""
3from pathlib import Path
5import click
7from prosemark.adapters.clock_system import ClockSystem
8from prosemark.adapters.daily_repo_fs import DailyRepoFs
9from prosemark.adapters.editor_launcher_system import EditorLauncherSystem
10from prosemark.adapters.id_generator import SimpleIdGenerator
11from prosemark.adapters.logger_stdout import LoggerStdout
12from prosemark.app.use_cases import WriteFreeform
13from prosemark.exceptions import EditorLaunchError, FileSystemError
16@click.command()
17@click.argument('title', required=False)
18@click.option('--path', '-p', type=click.Path(path_type=Path), help='Project directory')
19def write_command(title: str | None, path: Path | None) -> None:
20 """Create a timestamped freeform writing file."""
21 try:
22 project_root = path or Path.cwd()
24 # Wire up dependencies
25 clock = ClockSystem()
26 id_generator = SimpleIdGenerator()
27 daily_repo = DailyRepoFs(project_root, id_generator=id_generator, clock=clock)
28 editor_port = EditorLauncherSystem()
29 logger = LoggerStdout()
31 # Execute use case
32 interactor = WriteFreeform(
33 daily_repo=daily_repo,
34 editor_port=editor_port,
35 logger=logger,
36 clock=clock,
37 )
39 filename = interactor.execute(title)
41 # Success output
42 click.echo(f'Created freeform file: {filename}')
43 click.echo('Opened in editor')
45 except FileSystemError:
46 click.echo('Error: File creation failed', err=True)
47 raise SystemExit(1) from None
48 except EditorLaunchError:
49 click.echo('Error: Editor launch failed', err=True)
50 raise SystemExit(2) from None