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

1"""CLI command for creating freeform writing files.""" 

2 

3from pathlib import Path 

4 

5import click 

6 

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 

14 

15 

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

23 

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

30 

31 # Execute use case 

32 interactor = WriteFreeform( 

33 daily_repo=daily_repo, 

34 editor_port=editor_port, 

35 logger=logger, 

36 clock=clock, 

37 ) 

38 

39 filename = interactor.execute(title) 

40 

41 # Success output 

42 click.echo(f'Created freeform file: {filename}') 

43 click.echo('Opened in editor') 

44 

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