Coverage report: 99%

Files Functions Classes

coverage.py v7.8.0, created at 2025-09-24 18:08 +0000

File function statements missing excluded branches partial coverage
src/prosemark/__init__.py (no function) 3 0 6 0 0 100%
src/prosemark/adapters/__init__.py (no function) 11 0 0 0 0 100%
src/prosemark/adapters/binder_repo_fs.py BinderRepoFs.__init__ 4 0 0 0 0 100%
src/prosemark/adapters/binder_repo_fs.py BinderRepoFs.load 17 0 0 2 0 100%
src/prosemark/adapters/binder_repo_fs.py BinderRepoFs.save 10 0 0 2 0 100%
src/prosemark/adapters/binder_repo_fs.py BinderRepoFs._extract_managed_block 9 0 0 4 0 100%
src/prosemark/adapters/binder_repo_fs.py BinderRepoFs._update_managed_block 7 0 0 2 0 100%
src/prosemark/adapters/binder_repo_fs.py BinderRepoFs._create_new_content 1 0 0 0 0 100%
src/prosemark/adapters/binder_repo_fs.py (no function) 15 0 2 0 0 100%
src/prosemark/adapters/binder_scaffold.py generate_binder_scaffold 28 0 3 8 0 100%
src/prosemark/adapters/binder_scaffold.py _generate_scaffold_content 1 0 0 0 0 100%
src/prosemark/adapters/binder_scaffold.py (no function) 5 0 0 0 0 100%
src/prosemark/adapters/clock_system.py ClockSystem.now_iso 1 0 0 0 0 100%
src/prosemark/adapters/clock_system.py (no function) 4 0 0 0 0 100%
src/prosemark/adapters/console_pretty.py ConsolePretty.__init__ 2 0 0 0 0 100%
src/prosemark/adapters/console_pretty.py ConsolePretty.print 1 0 0 0 0 100%
src/prosemark/adapters/console_pretty.py ConsolePretty.print_tree 3 0 0 2 0 100%
src/prosemark/adapters/console_pretty.py ConsolePretty._print_tree_item 5 0 0 2 0 100%
src/prosemark/adapters/console_pretty.py ConsolePretty._detect_color_support 7 0 0 6 0 100%
src/prosemark/adapters/console_pretty.py (no function) 10 0 2 0 0 100%
src/prosemark/adapters/daily_repo_fs.py DailyRepoFs.__init__ 4 0 0 0 0 100%
src/prosemark/adapters/daily_repo_fs.py DailyRepoFs.write_freeform 18 0 0 2 0 100%
src/prosemark/adapters/daily_repo_fs.py (no function) 10 0 0 0 0 100%
src/prosemark/adapters/editor_launcher_system.py EditorLauncherSystem.open 15 0 0 0 0 100%
src/prosemark/adapters/editor_launcher_system.py EditorLauncherSystem._find_editor 11 0 0 10 0 100%
src/prosemark/adapters/editor_launcher_system.py EditorLauncherSystem._command_exists 5 0 0 0 0 100%
src/prosemark/adapters/editor_launcher_system.py EditorLauncherSystem._build_command 5 0 0 2 0 100%
src/prosemark/adapters/editor_launcher_system.py EditorLauncherSystem._supports_cursor_hint 2 0 0 0 0 100%
src/prosemark/adapters/editor_launcher_system.py EditorLauncherSystem._add_cursor_hint 11 0 0 10 0 100%
src/prosemark/adapters/editor_launcher_system.py (no function) 18 0 0 0 0 100%
src/prosemark/adapters/fake_clock.py FakeClock.__init__ 1 0 0 0 0 100%
src/prosemark/adapters/fake_clock.py FakeClock.now_iso 1 0 0 0 0 100%
src/prosemark/adapters/fake_clock.py (no function) 4 0 0 0 0 100%
src/prosemark/adapters/fake_config.py FakeConfigPort.__init__ 1 0 0 0 0 100%
src/prosemark/adapters/fake_config.py FakeConfigPort.create_default_config 1 0 0 0 0 100%
src/prosemark/adapters/fake_config.py FakeConfigPort.config_exists 1 0 0 0 0 100%
src/prosemark/adapters/fake_config.py FakeConfigPort.get_default_config_values 1 0 0 0 0 100%
src/prosemark/adapters/fake_config.py (no function) 7 0 0 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.__init__ 2 0 0 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.print 1 0 0 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.print_tree 1 0 0 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.get_output 1 0 0 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.last_output 0 0 4 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.output_contains 1 0 0 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.get_tree_calls 1 0 0 0 0 100%
src/prosemark/adapters/fake_console.py FakeConsolePort.tree_call_count 1 0 0 0 0 100%
src/prosemark/adapters/fake_console.py (no function) 11 0 2 0 0 100%
src/prosemark/adapters/fake_id_generator.py FakeIdGenerator.__init__ 2 0 2 0 0 100%
src/prosemark/adapters/fake_id_generator.py FakeIdGenerator.new 4 0 2 0 0 100%
src/prosemark/adapters/fake_id_generator.py FakeIdGenerator.reset 0 0 6 0 0 100%
src/prosemark/adapters/fake_id_generator.py FakeIdGenerator.remaining_count 0 0 7 0 0 100%
src/prosemark/adapters/fake_id_generator.py FakeIdGenerator.generated_count 1 0 0 0 0 100%
src/prosemark/adapters/fake_id_generator.py FakeIdGenerator.peek_next 0 0 14 0 0 100%
src/prosemark/adapters/fake_id_generator.py (no function) 6 0 3 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.__init__ 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.debug 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.info 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.warning 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.error 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.exception 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.get_logs 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.get_logs_by_level 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.has_logged 10 0 2 8 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.get_logged_messages 10 0 2 6 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.clear_logs 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.last_log 0 0 4 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.log_count 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.log_count_by_level 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.info_messages 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.error_messages 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.debug_messages 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.exception_messages 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py FakeLogger.clear 1 0 0 0 0 100%
src/prosemark/adapters/fake_logger.py (no function) 25 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.__init__ 7 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.create 4 0 3 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.read_frontmatter 5 0 3 2 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.write_frontmatter 0 0 17 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.open_in_editor 6 0 6 2 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.delete 3 0 3 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.node_exists 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.get_editor_calls 0 0 7 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.clear_editor_calls 0 0 6 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.get_delete_calls 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.delete_called_with 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.clear_delete_calls 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.get_node_count 0 0 7 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.set_open_in_editor_exception 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.open_in_editor_calls 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.open_in_editor_calls 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.set_existing_files 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.set_existing_notes_files 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.get_existing_files 7 0 0 2 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.get_existing_notes_files 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.file_exists 7 0 0 4 0 100%
src/prosemark/adapters/fake_node_repo.py FakeNodeRepo.set_frontmatter_mismatch 1 0 0 0 0 100%
src/prosemark/adapters/fake_node_repo.py (no function) 24 0 4 0 0 100%
src/prosemark/adapters/fake_storage.py FakeBinderRepo.__init__ 1 0 0 0 0 100%
src/prosemark/adapters/fake_storage.py FakeBinderRepo.load 1 0 3 0 0 100%
src/prosemark/adapters/fake_storage.py FakeBinderRepo.save 1 0 0 0 0 100%
src/prosemark/adapters/fake_storage.py FakeBinderRepo.set_binder 1 0 0 0 0 100%
src/prosemark/adapters/fake_storage.py (no function) 8 0 2 0 0 100%
src/prosemark/adapters/frontmatter_codec.py FrontmatterCodec.parse 10 0 0 4 0 100%
src/prosemark/adapters/frontmatter_codec.py FrontmatterCodec.generate 8 0 0 2 0 100%
src/prosemark/adapters/frontmatter_codec.py FrontmatterCodec.update_frontmatter 3 0 0 0 0 100%
src/prosemark/adapters/frontmatter_codec.py FrontmatterCodec._validate_frontmatter_format 6 0 0 6 0 100%
src/prosemark/adapters/frontmatter_codec.py FrontmatterCodec._check_misplaced_frontmatter 10 0 0 8 0 100%
src/prosemark/adapters/frontmatter_codec.py FrontmatterCodec._parse_yaml_content 11 0 0 4 0 100%
src/prosemark/adapters/frontmatter_codec.py FrontmatterCodec._convert_datetimes_to_strings 6 0 0 4 0 100%
src/prosemark/adapters/frontmatter_codec.py (no function) 18 0 0 0 0 100%
src/prosemark/adapters/id_generator.py SimpleIdGenerator.new 1 0 0 0 0 100%
src/prosemark/adapters/id_generator.py (no function) 4 0 0 0 0 100%
src/prosemark/adapters/id_generator_uuid7.py IdGeneratorUuid7.new 1 0 0 0 0 100%
src/prosemark/adapters/id_generator_uuid7.py (no function) 4 0 0 0 0 100%
src/prosemark/adapters/logger_stdout.py LoggerStdout.__init__ 2 0 0 0 0 100%
src/prosemark/adapters/logger_stdout.py LoggerStdout.debug 1 0 1 0 0 100%
src/prosemark/adapters/logger_stdout.py LoggerStdout.info 1 0 1 0 0 100%
src/prosemark/adapters/logger_stdout.py LoggerStdout.warning 1 0 1 0 0 100%
src/prosemark/adapters/logger_stdout.py LoggerStdout.error 1 0 1 0 0 100%
src/prosemark/adapters/logger_stdout.py LoggerStdout.exception 0 0 2 0 0 100%
src/prosemark/adapters/logger_stdout.py (no function) 10 0 0 0 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser.parse_to_binder 11 0 0 2 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser.render_from_binder 4 0 0 2 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._validate_markdown_format 5 0 0 4 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._check_bracket_patterns 4 0 0 4 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._handle_no_matches 7 0 0 6 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._build_binder_tree 13 0 0 4 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._raise_malformed_error 2 0 0 0 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._raise_parse_error 2 0 0 0 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._render_item 6 0 0 4 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._extract_node_id 7 0 2 4 0 100%
src/prosemark/adapters/markdown_binder_parser.py MarkdownBinderParser._find_parent 6 0 0 4 0 100%
src/prosemark/adapters/markdown_binder_parser.py (no function) 24 0 0 0 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.__init__ 4 0 0 0 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.create 15 0 0 2 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.read_frontmatter 15 0 0 2 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.write_frontmatter 13 0 0 2 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.open_in_editor 15 0 0 6 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.delete 12 0 0 6 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.get_existing_files 14 0 2 2 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs._is_valid_node_id 5 0 0 4 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs._is_uuid7_format 14 0 0 8 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs._is_reasonable_node_id 4 0 0 2 0 100%
src/prosemark/adapters/node_repo_fs.py NodeRepoFs.file_exists 7 0 0 4 0 100%
src/prosemark/adapters/node_repo_fs.py (no function) 24 0 0 0 0 100%
src/prosemark/app/__init__.py (no function) 2 0 0 0 0 100%
src/prosemark/app/add_node.py AddNode.__init__ 6 0 0 0 0 100%
src/prosemark/app/add_node.py AddNode.execute 21 0 0 8 0 100%
src/prosemark/app/add_node.py AddNode._find_item 7 0 0 6 0 100%
src/prosemark/app/add_node.py (no function) 7 0 7 0 0 100%
src/prosemark/app/audit_project.py AuditReport.has_issues 1 0 0 0 0 100%
src/prosemark/app/audit_project.py AuditProject.__init__ 4 0 0 0 0 100%
src/prosemark/app/audit_project.py AuditProject.execute 11 0 0 0 0 100%
src/prosemark/app/audit_project.py AuditProject._check_items 16 0 3 10 0 100%
src/prosemark/app/audit_project.py AuditProject._find_orphans 12 0 0 8 0 100%
src/prosemark/app/audit_project.py AuditProject._collect_ids 4 0 0 4 0 100%
src/prosemark/app/audit_project.py AuditProject._display_report 25 0 0 18 0 100%
src/prosemark/app/audit_project.py (no function) 37 0 5 0 0 100%
src/prosemark/app/init_project.py InitProject.__init__ 3 0 0 0 0 100%
src/prosemark/app/init_project.py InitProject.execute 11 0 0 2 0 100%
src/prosemark/app/init_project.py (no function) 6 0 4 0 0 100%
src/prosemark/app/materialize_all_placeholders.py MaterializeAllPlaceholders.__init__ 6 0 0 0 0 100%
src/prosemark/app/materialize_all_placeholders.py MaterializeAllPlaceholders.execute 35 0 0 14 0 100%
src/prosemark/app/materialize_all_placeholders.py MaterializeAllPlaceholders._discover_placeholders 3 0 0 0 0 100%
src/prosemark/app/materialize_all_placeholders.py MaterializeAllPlaceholders._collect_placeholders_recursive 8 0 0 6 0 100%
src/prosemark/app/materialize_all_placeholders.py MaterializeAllPlaceholders._materialize_single_placeholder 3 0 0 0 0 100%
src/prosemark/app/materialize_all_placeholders.py MaterializeAllPlaceholders._create_failure_record 3 0 0 0 0 100%
src/prosemark/app/materialize_all_placeholders.py MaterializeAllPlaceholders._categorize_error 12 0 0 10 0 100%
src/prosemark/app/materialize_all_placeholders.py (no function) 19 0 7 0 0 100%
src/prosemark/app/materialize_node.py MaterializeNode.__init__ 6 0 0 0 0 100%
src/prosemark/app/materialize_node.py MaterializeNode.execute 15 0 3 0 0 100%
src/prosemark/app/materialize_node.py MaterializeNode._find_placeholder 7 0 0 6 0 100%
src/prosemark/app/materialize_node.py (no function) 8 0 7 0 0 100%
src/prosemark/app/move_node.py MoveNode.__init__ 3 0 0 0 0 100%
src/prosemark/app/move_node.py MoveNode.execute 25 0 5 10 0 100%
src/prosemark/app/move_node.py MoveNode._find_item 5 0 2 4 0 100%
src/prosemark/app/move_node.py MoveNode._remove_item 8 0 0 6 0 100%
src/prosemark/app/move_node.py MoveNode._would_create_cycle 1 0 0 0 0 100%
src/prosemark/app/move_node.py (no function) 10 0 4 0 0 100%
src/prosemark/app/remove_node.py RemoveNode.__init__ 4 0 0 0 0 100%
src/prosemark/app/remove_node.py RemoveNode.execute 25 0 0 12 0 100%
src/prosemark/app/remove_node.py RemoveNode._find_parent_and_position 9 0 0 8 0 100%
src/prosemark/app/remove_node.py (no function) 8 0 5 0 0 100%
src/prosemark/app/use_cases.py AuditReport.is_clean 1 0 0 0 0 100%
src/prosemark/app/use_cases.py AuditReport.format_report 20 0 0 10 0 100%
src/prosemark/app/use_cases.py AuditReport.to_json 2 0 0 0 0 100%
src/prosemark/app/use_cases.py InitProject.__init__ 5 0 0 0 0 100%
src/prosemark/app/use_cases.py InitProject.execute 13 0 0 2 0 100%
src/prosemark/app/use_cases.py InitProject._create_initial_binder 4 0 0 0 0 100%
src/prosemark/app/use_cases.py InitProject._create_default_config 3 0 0 0 0 100%
src/prosemark/app/use_cases.py AddNode.__init__ 5 0 0 0 0 100%
src/prosemark/app/use_cases.py AddNode.execute 12 0 0 0 0 100%
src/prosemark/app/use_cases.py AddNode._add_node_to_binder 16 0 1 8 0 100%
src/prosemark/app/use_cases.py EditPart.__init__ 3 0 0 0 0 100%
src/prosemark/app/use_cases.py EditPart.execute 16 0 0 4 0 100%
src/prosemark/app/use_cases.py MoveNode.__init__ 2 0 0 0 0 100%
src/prosemark/app/use_cases.py MoveNode.execute 23 0 0 8 0 100%
src/prosemark/app/use_cases.py MoveNode._would_create_circular_dependency 3 0 0 2 0 100%
src/prosemark/app/use_cases.py MoveNode._is_ancestor 8 0 1 4 0 100%
src/prosemark/app/use_cases.py MoveNode._find_parent_of_node 7 0 1 4 0 100%
src/prosemark/app/use_cases.py MoveNode._find_parent_of_node._search_for_parent 8 0 0 8 0 100%
src/prosemark/app/use_cases.py MoveNode._remove_node_from_current_location 8 0 0 4 0 100%
src/prosemark/app/use_cases.py MoveNode._add_node_to_new_location 12 0 0 6 0 100%
src/prosemark/app/use_cases.py RemoveNode.__init__ 3 0 0 0 0 100%
src/prosemark/app/use_cases.py RemoveNode.execute 18 0 0 6 0 100%
src/prosemark/app/use_cases.py RemoveNode._find_parent_of_node 7 0 1 4 0 100%
src/prosemark/app/use_cases.py RemoveNode._find_parent_of_node._search_for_parent 8 0 0 8 0 100%
src/prosemark/app/use_cases.py RemoveNode._promote_children_to_parent_level 10 0 0 6 0 100%
src/prosemark/app/use_cases.py RemoveNode._remove_node_from_binder 4 0 0 2 0 100%
src/prosemark/app/use_cases.py WriteFreeform.__init__ 4 0 0 0 0 100%
src/prosemark/app/use_cases.py WriteFreeform.execute 16 0 0 2 0 100%
src/prosemark/app/use_cases.py ShowStructure.__init__ 2 0 0 0 0 100%
src/prosemark/app/use_cases.py ShowStructure.execute 7 0 0 4 0 100%
src/prosemark/app/use_cases.py ShowStructure._format_full_structure 13 0 0 6 0 100%
src/prosemark/app/use_cases.py ShowStructure._format_subtree_structure 9 0 0 2 0 100%
src/prosemark/app/use_cases.py ShowStructure._format_items 8 0 0 4 0 100%
src/prosemark/app/use_cases.py ShowStructure._format_items_with_root_connectors 8 0 0 4 0 100%
src/prosemark/app/use_cases.py ShowStructure._format_single_item 14 0 0 6 0 100%
src/prosemark/app/use_cases.py ShowStructure._count_all_items 4 0 0 2 0 100%
src/prosemark/app/use_cases.py ShowStructure._count_placeholders 4 0 0 2 0 100%
src/prosemark/app/use_cases.py MaterializeNode.__init__ 4 0 0 0 0 100%
src/prosemark/app/use_cases.py MaterializeNode.execute 22 0 4 4 0 100%
src/prosemark/app/use_cases.py MaterializeNode._find_item_by_title_recursive 7 0 0 6 0 100%
src/prosemark/app/use_cases.py AuditBinder.__init__ 3 0 0 0 0 100%
src/prosemark/app/use_cases.py AuditBinder.execute 17 0 0 0 0 100%
src/prosemark/app/use_cases.py AuditBinder._scan_placeholders 5 0 0 2 0 100%
src/prosemark/app/use_cases.py AuditBinder._scan_placeholders._scan_item_recursive 8 0 0 4 0 100%
src/prosemark/app/use_cases.py AuditBinder._get_existing_node_files 1 0 0 0 0 100%
src/prosemark/app/use_cases.py AuditBinder._scan_missing_files 7 0 0 2 0 100%
src/prosemark/app/use_cases.py AuditBinder._scan_missing_notes_files 8 0 0 4 0 100%
src/prosemark/app/use_cases.py AuditBinder._scan_orphaned_files 7 0 0 2 0 100%
src/prosemark/app/use_cases.py AuditBinder._scan_orphaned_invalid_files 29 1 5 12 1 95%
src/prosemark/app/use_cases.py AuditBinder._scan_id_mismatches 21 0 0 4 0 100%
src/prosemark/app/use_cases.py (no function) 89 0 10 0 0 100%
src/prosemark/cli/__init__.py (no function) 11 0 0 0 0 100%
src/prosemark/cli/add.py add_command 42 0 0 6 0 100%
src/prosemark/cli/add.py (no function) 18 0 0 0 0 100%
src/prosemark/cli/audit.py _report_placeholders 4 0 0 6 0 100%
src/prosemark/cli/audit.py _report_missing_nodes 4 0 0 6 0 100%
src/prosemark/cli/audit.py _report_orphans 4 0 0 6 0 100%
src/prosemark/cli/audit.py _report_mismatches 4 0 0 6 0 100%
src/prosemark/cli/audit.py audit_command 33 0 0 12 0 100%
src/prosemark/cli/audit.py (no function) 17 0 0 0 0 100%
src/prosemark/cli/edit.py edit_command 26 0 0 4 0 100%
src/prosemark/cli/edit.py (no function) 15 0 0 0 0 100%
src/prosemark/cli/init.py FileSystemConfigPort.create_default_config 0 0 0 0 0 100%
src/prosemark/cli/init.py FileSystemConfigPort.config_exists 1 0 0 0 0 100%
src/prosemark/cli/init.py FileSystemConfigPort.get_default_config_values 1 0 0 0 0 100%
src/prosemark/cli/init.py FileSystemConfigPort.load_config 1 0 0 0 0 100%
src/prosemark/cli/init.py init_command 20 0 0 0 0 100%
src/prosemark/cli/init.py (no function) 22 0 0 0 0 100%
src/prosemark/cli/main.py FileSystemConfigPort.create_default_config 0 0 0 0 0 100%
src/prosemark/cli/main.py FileSystemConfigPort.config_exists 1 0 0 0 0 100%
src/prosemark/cli/main.py FileSystemConfigPort.get_default_config_values 1 0 0 0 0 100%
src/prosemark/cli/main.py FileSystemConfigPort.load_config 1 0 0 0 0 100%
src/prosemark/cli/main.py _get_project_root 1 0 0 0 0 100%
src/prosemark/cli/main.py init 20 0 0 0 0 100%
src/prosemark/cli/main.py add 23 0 0 0 0 100%
src/prosemark/cli/main.py edit 26 0 0 4 0 100%
src/prosemark/cli/main.py structure 28 0 0 8 0 100%
src/prosemark/cli/main.py write 6 0 0 0 0 100%
src/prosemark/cli/main.py _validate_materialize_args 6 0 0 4 0 100%
src/prosemark/cli/main.py _create_shared_dependencies 7 0 0 0 0 100%
src/prosemark/cli/main.py _generate_json_result 17 0 0 8 0 100%
src/prosemark/cli/main.py _check_result_failure_status 6 0 0 6 0 100%
src/prosemark/cli/main.py _report_materialization_progress 10 0 0 8 0 100%
src/prosemark/cli/main.py _materialize_all_placeholders 23 0 0 8 0 100%
src/prosemark/cli/main.py _materialize_all_placeholders.progress_callback 2 0 0 0 0 100%
src/prosemark/cli/main.py _describe_materialization_result 6 0 0 2 0 100%
src/prosemark/cli/main.py _get_safe_attribute 8 0 0 2 0 100%
src/prosemark/cli/main.py _get_summary_message 9 0 0 6 0 100%
src/prosemark/cli/main.py _materialize_single_placeholder 5 0 0 0 0 100%
src/prosemark/cli/main.py materialize 25 0 0 4 0 100%
src/prosemark/cli/main.py move 20 0 0 0 0 100%
src/prosemark/cli/main.py remove 27 0 0 6 0 100%
src/prosemark/cli/main.py _validate_materialize_all_options 15 0 0 10 0 100%
src/prosemark/cli/main.py _execute_dry_run_materialize 9 0 0 4 0 100%
src/prosemark/cli/main.py _execute_materialize_all 2 0 0 0 0 100%
src/prosemark/cli/main.py materialize_all 30 0 0 6 0 100%
src/prosemark/cli/main.py audit 40 0 0 26 0 100%
src/prosemark/cli/main.py main 1 0 0 0 0 100%
src/prosemark/cli/main.py (no function) 76 0 2 0 0 100%
src/prosemark/cli/materialize.py materialize_command 22 0 0 0 0 100%
src/prosemark/cli/materialize.py (no function) 15 0 0 0 0 100%
src/prosemark/cli/move.py move_command 24 0 0 4 0 100%
src/prosemark/cli/move.py (no function) 13 0 0 0 0 100%
src/prosemark/cli/remove.py remove_command 25 0 0 4 0 100%
src/prosemark/cli/remove.py (no function) 16 0 0 0 0 100%
src/prosemark/cli/structure.py structure_command 25 0 0 8 0 100%
src/prosemark/cli/structure.py (no function) 13 0 2 0 0 100%
src/prosemark/cli/write.py write_command 6 0 0 0 0 100%
src/prosemark/cli/write.py (no function) 10 0 0 0 0 100%
src/prosemark/domain/__init__.py (no function) 0 0 0 0 0 100%
src/prosemark/domain/batch_materialize_result.py BatchMaterializeResult.__post_init__ 7 0 3 2 0 100%
src/prosemark/domain/batch_materialize_result.py BatchMaterializeResult.success_rate 3 0 0 2 0 100%
src/prosemark/domain/batch_materialize_result.py BatchMaterializeResult.has_failures 1 0 0 0 0 100%
src/prosemark/domain/batch_materialize_result.py BatchMaterializeResult.is_complete_success 1 0 0 0 0 100%
src/prosemark/domain/batch_materialize_result.py BatchMaterializeResult.is_complete_failure 1 0 0 0 0 100%
src/prosemark/domain/batch_materialize_result.py BatchMaterializeResult.summary_message 9 0 0 6 0 100%
src/prosemark/domain/batch_materialize_result.py (no function) 21 0 0 2 0 100%
src/prosemark/domain/binder.py (no function) 7 0 0 0 0 100%
src/prosemark/domain/entities.py Node.__init__ 21 0 0 8 0 100%
src/prosemark/domain/entities.py Node.get_expected_draft_path 2 0 0 0 0 100%
src/prosemark/domain/entities.py Node.get_expected_notes_path 2 0 0 0 0 100%
src/prosemark/domain/entities.py Node.touch 4 0 0 2 0 100%
src/prosemark/domain/entities.py Node.update_metadata 6 0 0 6 0 100%
src/prosemark/domain/entities.py Node.from_metadata 3 0 0 0 0 100%
src/prosemark/domain/entities.py Node.to_metadata 1 0 0 0 0 100%
src/prosemark/domain/entities.py Node.__str__ 2 0 0 0 0 100%
src/prosemark/domain/entities.py Node.__eq__ 3 0 0 2 0 100%
src/prosemark/domain/entities.py Node.__hash__ 1 0 0 0 0 100%
src/prosemark/domain/entities.py FreeformContent.__post_init__ 3 0 0 0 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_required_fields 6 0 0 4 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_uuid_format 9 0 0 2 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_filename_pattern 8 0 0 2 0 100%
src/prosemark/domain/entities.py FreeformContent._extract_filename_parts 6 0 0 2 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_uuid_match 3 0 0 2 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_timestamp_format 4 0 0 2 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_timestamp_components 10 0 0 0 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_time_ranges 12 0 0 8 0 100%
src/prosemark/domain/entities.py FreeformContent._validate_timestamp_consistency 10 0 0 2 0 100%
src/prosemark/domain/entities.py FreeformContent._raise_uuid_version_error 2 0 0 0 0 100%
src/prosemark/domain/entities.py FreeformContent.get_expected_filename 4 0 0 0 0 100%
src/prosemark/domain/entities.py FreeformContent.parse_filename 10 0 0 4 0 100%
src/prosemark/domain/entities.py FreeformContent.update_title 1 0 0 0 0 100%
src/prosemark/domain/entities.py FreeformContent.__eq__ 3 0 0 2 0 100%
src/prosemark/domain/entities.py FreeformContent.__hash__ 1 0 0 0 0 100%
src/prosemark/domain/entities.py FreeformContent.get_filename_pattern 1 0 0 0 0 100%
src/prosemark/domain/entities.py (no function) 63 0 0 0 0 100%
src/prosemark/domain/materialize_failure.py MaterializeFailure.__post_init__ 12 0 0 8 0 100%
src/prosemark/domain/materialize_failure.py MaterializeFailure.is_retryable 2 0 0 0 0 100%
src/prosemark/domain/materialize_failure.py MaterializeFailure.is_critical 2 0 0 0 0 100%
src/prosemark/domain/materialize_failure.py MaterializeFailure.should_stop_batch 1 0 0 0 0 100%
src/prosemark/domain/materialize_failure.py MaterializeFailure.formatted_error 3 0 0 2 0 100%
src/prosemark/domain/materialize_failure.py MaterializeFailure.__str__ 1 0 0 0 0 100%
src/prosemark/domain/materialize_failure.py (no function) 18 0 0 0 0 100%
src/prosemark/domain/materialize_result.py MaterializeResult.__post_init__ 17 0 0 10 0 100%
src/prosemark/domain/materialize_result.py MaterializeResult._is_valid_uuid7 2 0 0 0 0 100%
src/prosemark/domain/materialize_result.py MaterializeResult._is_valid_position 2 0 0 0 0 100%
src/prosemark/domain/materialize_result.py MaterializeResult.main_file_path 2 0 0 0 0 100%
src/prosemark/domain/materialize_result.py MaterializeResult.notes_file_path 2 0 0 0 0 100%
src/prosemark/domain/materialize_result.py MaterializeResult.__str__ 1 0 0 0 0 100%
src/prosemark/domain/materialize_result.py (no function) 20 0 0 0 0 100%
src/prosemark/domain/models.py NodeId.__post_init__ 13 0 3 4 0 100%
src/prosemark/domain/models.py NodeId.__str__ 1 0 0 0 0 100%
src/prosemark/domain/models.py NodeId.__repr__ 1 0 0 0 0 100%
src/prosemark/domain/models.py NodeId.__hash__ 1 0 0 0 0 100%
src/prosemark/domain/models.py NodeId.__eq__ 3 0 0 2 0 100%
src/prosemark/domain/models.py NodeId.generate 13 0 0 0 0 100%
src/prosemark/domain/models.py BinderItem.__init__ 12 0 0 6 0 100%
src/prosemark/domain/models.py BinderItem.id 1 0 0 0 0 100%
src/prosemark/domain/models.py BinderItem.is_root 1 0 0 0 0 100%
src/prosemark/domain/models.py BinderItem.is_leaf 1 0 0 0 0 100%
src/prosemark/domain/models.py BinderItem.is_placeholder 1 0 0 0 0 100%
src/prosemark/domain/models.py BinderItem.is_materialized 1 0 0 0 0 100%
src/prosemark/domain/models.py BinderItem.materialize 5 0 0 2 0 100%
src/prosemark/domain/models.py BinderItem.get_depth 6 0 0 2 0 100%
src/prosemark/domain/models.py BinderItem.get_path_to_root 6 0 0 2 0 100%
src/prosemark/domain/models.py BinderItem.get_siblings 3 0 0 2 0 100%
src/prosemark/domain/models.py BinderItem.add_child 2 0 0 0 0 100%
src/prosemark/domain/models.py BinderItem.remove_child 3 0 0 2 0 100%
src/prosemark/domain/models.py Binder.children 1 0 0 0 0 100%
src/prosemark/domain/models.py Binder.__post_init__ 1 0 0 0 0 100%
src/prosemark/domain/models.py Binder.validate_integrity 4 0 0 0 0 100%
src/prosemark/domain/models.py Binder.find_by_id 6 0 0 4 0 100%
src/prosemark/domain/models.py Binder.find_by_id._search_item 7 0 0 6 0 100%
src/prosemark/domain/models.py Binder.find_item_by_node_id 1 0 0 0 0 100%
src/prosemark/domain/models.py Binder.get_all_node_ids 5 0 0 2 0 100%
src/prosemark/domain/models.py Binder.get_all_node_ids._collect_node_ids 4 0 0 4 0 100%
src/prosemark/domain/models.py Binder.find_placeholder_by_display_title 6 0 0 4 0 100%
src/prosemark/domain/models.py Binder.find_placeholder_by_display_title._search_item 7 0 0 6 0 100%
src/prosemark/domain/models.py Binder.add_root_item 3 0 0 0 0 100%
src/prosemark/domain/models.py Binder.remove_root_item 2 0 0 2 0 100%
src/prosemark/domain/models.py Binder.depth_first_traversal 5 0 0 2 0 100%
src/prosemark/domain/models.py Binder.depth_first_traversal._traverse 3 0 0 2 0 100%
src/prosemark/domain/models.py NodeMetadata.to_dict 7 0 0 4 0 100%
src/prosemark/domain/models.py NodeMetadata.from_dict 16 0 0 6 0 100%
src/prosemark/domain/models.py (no function) 61 0 0 0 0 100%
src/prosemark/domain/placeholder_summary.py PlaceholderSummary.__post_init__ 12 0 0 8 0 100%
src/prosemark/domain/placeholder_summary.py PlaceholderSummary._is_valid_position 3 0 0 0 0 100%
src/prosemark/domain/placeholder_summary.py PlaceholderSummary.is_root_level 1 0 0 0 0 100%
src/prosemark/domain/placeholder_summary.py PlaceholderSummary.hierarchy_path 3 0 0 2 0 100%
src/prosemark/domain/placeholder_summary.py PlaceholderSummary.position_indices 3 0 0 0 0 100%
src/prosemark/domain/placeholder_summary.py PlaceholderSummary.with_updated_position 1 0 0 0 0 100%
src/prosemark/domain/placeholder_summary.py PlaceholderSummary.__str__ 3 0 0 2 0 100%
src/prosemark/domain/placeholder_summary.py (no function) 18 0 0 0 0 100%
src/prosemark/domain/policies.py validate_no_duplicate_ids 4 0 0 2 0 100%
src/prosemark/domain/policies.py validate_no_duplicate_ids._collect_node_ids 7 0 0 6 0 100%
src/prosemark/domain/policies.py validate_tree_structure 3 0 0 2 0 100%
src/prosemark/domain/policies.py validate_tree_structure._validate_item_structure 2 0 6 2 0 100%
src/prosemark/domain/policies.py validate_placeholder_handling 3 0 0 2 0 100%
src/prosemark/domain/policies.py validate_placeholder_handling._validate_placeholder_item 5 0 0 4 0 100%
src/prosemark/domain/policies.py (no function) 5 0 2 0 0 100%
src/prosemark/exceptions.py (no function) 18 0 0 0 0 100%
src/prosemark/freewriting/__init__.py (no function) 0 0 0 0 0 100%
src/prosemark/freewriting/adapters/__init__.py (no function) 0 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.__init__ 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.tui_adapter 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.parse_arguments 15 0 0 2 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.parse_arguments._validate_directory 4 0 0 2 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.parse_arguments._validate_theme 4 0 0 2 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.validate_node_argument 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.validate_node_argument._validate_uuid 5 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.create_tui_config 4 0 0 2 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.launch_tui 11 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.handle_cli_error 8 0 0 4 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.validate_write_command_args 24 0 0 16 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.get_available_themes 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.get_current_working_directory 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.check_directory_writable 9 0 0 2 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.check_directory_writable._check_create_directory 7 0 0 2 1 89%
src/prosemark/freewriting/adapters/cli_adapter.py TyperCLIAdapter.check_directory_writable._check_write_permission 7 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py create_freewrite_command 4 0 0 0 0 100%
src/prosemark/freewriting/adapters/cli_adapter.py create_freewrite_command.write 13 13 0 0 0 0%
src/prosemark/freewriting/adapters/cli_adapter.py main 7 3 0 0 0 57%
src/prosemark/freewriting/adapters/cli_adapter.py (no function) 33 1 3 2 1 94%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.write_file 5 0 2 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.read_file 5 0 0 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.file_exists 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.create_directory 4 0 0 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.get_current_directory 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.is_writable 20 0 1 2 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.get_absolute_path 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.join_paths 6 0 0 4 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.get_file_size 4 0 0 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.backup_file 7 0 0 0 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.ensure_parent_directory 6 0 0 2 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py FileSystemAdapter.sanitize_title 7 0 0 2 0 100%
src/prosemark/freewriting/adapters/file_system_adapter.py (no function) 28 0 0 0 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter.__init__ 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter.create_session 7 0 0 0 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter.append_content 10 0 0 4 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter.validate_node_uuid 6 0 0 0 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter.create_daily_filename 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter.get_session_stats 12 0 0 6 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter._validate_session_config 6 0 0 4 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter._determine_output_path 4 0 0 2 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter._ensure_writable_target 11 0 0 6 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter._initialize_output_file 22 0 0 12 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter._initialize_output_file._verify_file_created 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter._append_to_daily_file 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py FreewriteServiceAdapter._append_to_node_file 5 0 0 2 0 100%
src/prosemark/freewriting/adapters/freewrite_service_adapter.py (no function) 25 0 3 0 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.__init__ 5 0 0 0 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.node_exists 7 0 0 2 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.create_node 16 1 0 6 1 91%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.append_to_node 30 0 0 4 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.get_node_path 3 0 0 0 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.get_node_path._validate_node_format 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.validate_node_uuid 5 0 0 0 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.validate_node_uuid._validate 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/node_service_adapter.py NodeServiceAdapter.add_to_binder 18 4 0 4 0 82%
src/prosemark/freewriting/adapters/node_service_adapter.py (no function) 17 0 5 0 0 100%
src/prosemark/freewriting/adapters/title_handler.py process_title 6 0 0 4 0 100%
src/prosemark/freewriting/adapters/title_handler.py sanitize_title_for_filename 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/title_handler.py (no function) 3 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp.__init__ 10 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp.compose 6 6 0 0 0 0%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp.on_mount 13 0 0 2 1 93%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp.on_input_submitted 18 2 0 6 2 83%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp.on_input_changed 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp.action_pause 11 0 0 8 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp.action_quit 3 3 0 2 0 0%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp._update_timer 5 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp._update_display 8 0 0 4 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp._update_stats_display 21 0 0 6 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py FreewritingApp._show_completion_message 8 0 0 6 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.__init__ 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.freewrite_service 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.initialize_session 5 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.handle_input_submission 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.get_display_content 4 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.calculate_progress 1 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.handle_error 2 0 0 0 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.on_input_change 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.on_input_submit 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.on_session_pause 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.on_session_resume 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.on_session_exit 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.update_content_area 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.update_stats_display 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.clear_input_area 3 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.show_error_message 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.hide_error_message 2 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.set_theme 4 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py TextualTUIAdapter.run_tui 10 0 0 2 0 100%
src/prosemark/freewriting/adapters/tui_adapter.py (no function) 50 0 5 0 0 100%
src/prosemark/freewriting/container.py create_file_system_adapter 1 0 0 0 0 100%
src/prosemark/freewriting/container.py create_node_service_adapter 1 0 0 0 0 100%
src/prosemark/freewriting/container.py create_freewrite_service_adapter 1 0 0 0 0 100%
src/prosemark/freewriting/container.py create_cli_adapter 4 0 0 2 0 100%
src/prosemark/freewriting/container.py create_tui_adapter 1 0 0 0 0 100%
src/prosemark/freewriting/container.py create_prosemark_dependencies 4 0 0 0 0 100%
src/prosemark/freewriting/container.py wire_freewriting_adapters 7 0 0 0 0 100%
src/prosemark/freewriting/container.py run_freewriting_session 23 0 0 6 0 100%
src/prosemark/freewriting/container.py (no function) 20 0 6 0 0 100%
src/prosemark/freewriting/domain/__init__.py (no function) 0 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py FreewriteError.__init__ 3 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py FreewriteError.__str__ 4 0 0 2 0 100%
src/prosemark/freewriting/domain/exceptions.py ValidationError.__init__ 5 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py FileSystemError.__init__ 7 0 0 2 0 100%
src/prosemark/freewriting/domain/exceptions.py NodeError.__init__ 6 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py SessionError.__init__ 6 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py TUIError.__init__ 6 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py CLIError.__init__ 8 0 0 2 0 100%
src/prosemark/freewriting/domain/exceptions.py CLIError.__str__ 1 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py ConfigurationError.__init__ 5 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py ContentError.__init__ 6 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py ArgumentValidationError.__init__ 1 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py ThemeNotFoundError.__init__ 1 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py DirectoryNotWritableError.__init__ 1 0 0 0 0 100%
src/prosemark/freewriting/domain/exceptions.py (no function) 28 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession.__post_init__ 6 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession._validate_session_id 5 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession._validate_target_node 6 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession._validate_start_time 4 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession._validate_goals 6 0 0 4 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession._validate_counters 6 0 0 4 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession._validate_file_path 2 0 3 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession.calculate_word_count 5 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession.add_content_line 5 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession.update_elapsed_time 4 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession.change_state 1 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteSession.is_goal_reached 6 0 0 4 0 100%
src/prosemark/freewriting/domain/models.py SessionConfig.__post_init__ 3 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py SessionConfig._validate_target_node 6 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py SessionConfig._validate_goals 6 0 0 4 0 100%
src/prosemark/freewriting/domain/models.py SessionConfig._validate_directory 2 0 3 0 0 100%
src/prosemark/freewriting/domain/models.py SessionConfig.has_goals 1 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py SessionConfig.is_node_targeted 1 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteContent.__post_init__ 2 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FreewriteContent._validate_line_number 3 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FreewriteContent._validate_word_count 4 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FreewriteContent.from_content 4 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FileTarget.__post_init__ 3 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FileTarget._validate_file_path 2 0 3 0 0 100%
src/prosemark/freewriting/domain/models.py FileTarget._validate_node_consistency 9 0 0 4 0 100%
src/prosemark/freewriting/domain/models.py FileTarget._validate_file_format 3 0 0 2 0 100%
src/prosemark/freewriting/domain/models.py FileTarget.for_daily_file 1 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py FileTarget.for_node 1 0 0 0 0 100%
src/prosemark/freewriting/domain/models.py (no function) 77 0 0 0 0 100%
src/prosemark/freewriting/ports/__init__.py (no function) 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CLIAdapterPort.tui_adapter 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CLIAdapterPort.parse_arguments 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CLIAdapterPort.validate_node_argument 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CLIAdapterPort.create_tui_config 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CLIAdapterPort.launch_tui 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CLIAdapterPort.handle_cli_error 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CommandValidationPort.validate_write_command_args 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CommandValidationPort.get_available_themes 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CommandValidationPort.get_current_working_directory 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py CommandValidationPort.check_directory_writable 0 0 0 0 0 100%
src/prosemark/freewriting/ports/cli_adapter.py (no function) 45 0 3 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.write_file 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.read_file 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.file_exists 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.create_directory 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.get_current_directory 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.is_writable 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.get_absolute_path 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.join_paths 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.get_file_size 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.backup_file 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.ensure_parent_directory 0 0 0 0 0 100%
src/prosemark/freewriting/ports/file_system.py FileSystemPort.resolve_path 0 0 10 0 0 100%
src/prosemark/freewriting/ports/file_system.py (no function) 26 0 2 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FreewriteServicePort.create_session 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FreewriteServicePort.append_content 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FreewriteServicePort.validate_node_uuid 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FreewriteServicePort.create_daily_filename 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FreewriteServicePort.get_session_stats 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py NodeServicePort.node_exists 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py NodeServicePort.create_node 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py NodeServicePort.append_to_node 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FileSystemPort.write_file 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FileSystemPort.file_exists 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FileSystemPort.get_current_directory 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py FileSystemPort.is_writable 0 0 0 0 0 100%
src/prosemark/freewriting/ports/freewrite_service.py (no function) 31 0 3 0 0 100%
src/prosemark/freewriting/ports/node_service.py NodeServicePort.node_exists 0 0 0 0 0 100%
src/prosemark/freewriting/ports/node_service.py NodeServicePort.create_node 0 0 0 0 0 100%
src/prosemark/freewriting/ports/node_service.py NodeServicePort.append_to_node 0 0 0 0 0 100%
src/prosemark/freewriting/ports/node_service.py NodeServicePort.get_node_path 0 0 0 0 0 100%
src/prosemark/freewriting/ports/node_service.py NodeServicePort.validate_node_uuid 0 0 0 0 0 100%
src/prosemark/freewriting/ports/node_service.py NodeServicePort.add_to_binder 0 0 0 0 0 100%
src/prosemark/freewriting/ports/node_service.py (no function) 16 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIAdapterPort.freewrite_service 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIAdapterPort.initialize_session 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIAdapterPort.handle_input_submission 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIAdapterPort.get_display_content 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIAdapterPort.calculate_progress 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIAdapterPort.handle_error 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIEventPort.on_input_change 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIEventPort.on_input_submit 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIEventPort.on_session_pause 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIEventPort.on_session_resume 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIEventPort.on_session_exit 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIDisplayPort.update_content_area 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIDisplayPort.update_stats_display 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIDisplayPort.clear_input_area 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIDisplayPort.show_error_message 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIDisplayPort.hide_error_message 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py TUIDisplayPort.set_theme 0 0 0 0 0 100%
src/prosemark/freewriting/ports/tui_adapter.py (no function) 81 0 4 0 0 100%
src/prosemark/freewriting/test_helpers.py create_title_processing_mock 5 0 0 2 0 100%
src/prosemark/freewriting/test_helpers.py create_title_processing_mock.side_effect 9 0 0 6 2 87%
src/prosemark/freewriting/test_helpers.py create_integration_tui_mock 2 0 0 0 0 100%
src/prosemark/freewriting/test_helpers.py create_integration_tui_mock.mock_tui_constructor 4 0 0 0 0 100%
src/prosemark/freewriting/test_helpers.py (no function) 9 2 0 2 1 73%
src/prosemark/ports/__init__.py (no function) 10 0 0 0 0 100%
src/prosemark/ports/binder_repo.py BinderRepo.load 0 0 0 0 0 100%
src/prosemark/ports/binder_repo.py BinderRepo.save 0 0 0 0 0 100%
src/prosemark/ports/binder_repo.py (no function) 7 0 2 0 0 100%
src/prosemark/ports/cli_adapter.py CLIAdapterPort.some_method 0 0 7 0 0 100%
src/prosemark/ports/cli_adapter.py (no function) 0 0 6 0 0 100%
src/prosemark/ports/clock.py Clock.now_iso 0 0 2 0 0 100%
src/prosemark/ports/clock.py (no function) 4 0 0 0 0 100%
src/prosemark/ports/config_port.py ConfigPort.create_default_config 0 0 2 0 0 100%
src/prosemark/ports/config_port.py ConfigPort.config_exists 0 0 2 0 0 100%
src/prosemark/ports/config_port.py ConfigPort.get_default_config_values 0 0 2 0 0 100%
src/prosemark/ports/config_port.py (no function) 14 0 0 0 0 100%
src/prosemark/ports/console_port.py ConsolePort.print 0 0 2 0 0 100%
src/prosemark/ports/console_port.py ConsolePort.print_info 1 0 0 0 0 100%
src/prosemark/ports/console_port.py ConsolePort.print_success 1 0 0 0 0 100%
src/prosemark/ports/console_port.py ConsolePort.print_warning 1 0 0 0 0 100%
src/prosemark/ports/console_port.py ConsolePort.print_error 1 0 0 0 0 100%
src/prosemark/ports/console_port.py ConsolePort.print_tree 3 0 0 2 0 100%
src/prosemark/ports/console_port.py ConsolePort._print_item 7 0 0 4 0 100%
src/prosemark/ports/console_port.py (no function) 11 0 2 0 0 100%
src/prosemark/ports/daily_repo.py DailyRepo.write_freeform 0 0 0 0 0 100%
src/prosemark/ports/daily_repo.py (no function) 4 0 0 0 0 100%
src/prosemark/ports/editor_port.py EditorPort.open 0 0 1 0 0 100%
src/prosemark/ports/editor_port.py (no function) 4 0 0 0 0 100%
src/prosemark/ports/freewrite_service.py FreewriteServicePort.some_method 0 0 7 0 0 100%
src/prosemark/ports/freewrite_service.py (no function) 0 0 6 0 0 100%
src/prosemark/ports/id_generator.py IdGenerator.new 0 0 2 0 0 100%
src/prosemark/ports/id_generator.py (no function) 5 0 2 0 0 100%
src/prosemark/ports/logger.py Logger.debug 0 0 2 0 0 100%
src/prosemark/ports/logger.py Logger.info 0 0 2 0 0 100%
src/prosemark/ports/logger.py Logger.warning 0 0 2 0 0 100%
src/prosemark/ports/logger.py Logger.error 0 0 2 0 0 100%
src/prosemark/ports/logger.py Logger.exception 0 0 2 0 0 100%
src/prosemark/ports/logger.py (no function) 12 0 0 0 0 100%
src/prosemark/ports/node_repo.py NodeRepo.create 0 0 0 0 0 100%
src/prosemark/ports/node_repo.py NodeRepo.read_frontmatter 0 0 0 0 0 100%
src/prosemark/ports/node_repo.py NodeRepo.write_frontmatter 0 0 0 0 0 100%
src/prosemark/ports/node_repo.py NodeRepo.open_in_editor 0 0 0 0 0 100%
src/prosemark/ports/node_repo.py NodeRepo.delete 0 0 0 0 0 100%
src/prosemark/ports/node_repo.py NodeRepo.get_existing_files 0 0 0 0 0 100%
src/prosemark/ports/node_repo.py NodeRepo.file_exists 0 0 0 0 0 100%
src/prosemark/ports/node_repo.py (no function) 17 0 2 0 0 100%
src/prosemark/ports/tui_adapter.py TUIAdapterPort.some_method 0 0 7 0 0 100%
src/prosemark/ports/tui_adapter.py (no function) 0 0 6 0 0 100%
Total   4545 36 351 1050 10 99%

No items found using the specified filter.