Coverage report: 97%

Files Functions Classes

coverage.py v7.17.0, created at 2026-10-31 22:06 +0000

      Statements   Branches   Total
File function   coverage statements missing excluded   coverage branches partial   coverage
src/coursebook/__init__.py (no function)   100% 10 0 0   100% 0 0   100%
src/coursebook/__main__.py (no function)   0% 3 3 0   100% 0 0   0%
src/coursebook/assembly.py assemble_document   100% 13 0 0   100% 6 0   100%
src/coursebook/assembly.py assemble_slides   100% 15 0 0   90% 10 1   96%
src/coursebook/assembly.py _get_body   100% 8 0 0   100% 4 0   100%
src/coursebook/assembly.py _has_content   100% 1 0 0   100% 0 0   100%
src/coursebook/assembly.py _join   100% 1 0 0   100% 0 0   100%
src/coursebook/assembly.py _titled   100% 3 0 0   100% 2 0   100%
src/coursebook/assembly.py (no function)   100% 13 0 4   100% 0 0   100%
src/coursebook/cli.py main   100% 17 0 0   100% 8 0   100%
src/coursebook/cli.py _build   100% 5 0 0   100% 4 0   100%
src/coursebook/cli.py _create_parser   100% 19 0 0   100% 0 0   100%
src/coursebook/cli.py _new   100% 6 0 0   100% 2 0   100%
src/coursebook/cli.py (no function)   100% 14 0 3   100% 0 0   100%
src/coursebook/exporters.py Exporter.export   100% 4 0 0   100% 0 0   100%
src/coursebook/exporters.py Exporter.get_arguments   100% 12 0 0   75% 8 2   90%
src/coursebook/exporters.py Exporter.get_metadata   100% 1 0 0   100% 0 0   100%
src/coursebook/exporters.py PowerPointExporter.get_arguments   100% 3 0 0   100% 0 0   100%
src/coursebook/exporters.py WordExporter.get_arguments   100% 4 0 0   100% 2 0   100%
src/coursebook/exporters.py HtmlExporter.get_arguments   100% 6 0 0   100% 2 0   100%
src/coursebook/exporters.py HtmlExporter.get_metadata   96% 25 1 0   80% 20 4   89%
src/coursebook/exporters.py PdfExporter.export   100% 12 0 0   100% 0 0   100%
src/coursebook/exporters.py PdfExporter.get_arguments   83% 6 1 0   50% 2 1   75%
src/coursebook/exporters.py PdfExporter.get_metadata   94% 33 2 0   50% 26 13   75%
src/coursebook/exporters.py get_exporter   100% 12 0 0   100% 6 0   100%
src/coursebook/exporters.py _add_metadata   80% 5 1 0   50% 2 1   71%
src/coursebook/exporters.py _list_paths   100% 1 0 0   100% 0 0   100%
src/coursebook/exporters.py _represent_string   100% 2 0 0   100% 0 0   100%
src/coursebook/exporters.py (no function)   100% 77 0 4   100% 0 0   100%
src/coursebook/markdown.py extract_images   100% 5 0 0   100% 4 0   100%
src/coursebook/markdown.py namespace_footnotes   100% 4 0 0   100% 2 0   100%
src/coursebook/markdown.py normalize_name   100% 1 0 0   100% 0 0   100%
src/coursebook/markdown.py shift_headings   100% 9 0 0   100% 4 0   100%
src/coursebook/markdown.py split_front_matter   95% 22 1 0   93% 14 1   94%
src/coursebook/markdown.py split_sections   100% 20 0 0   100% 10 0   100%
src/coursebook/markdown.py _iterate_lines   100% 11 0 0   100% 8 0   100%
src/coursebook/markdown.py (no function)   100% 20 0 3   100% 0 0   100%
src/coursebook/outline.py OutlineEntry.file_name   100% 1 0 0   100% 0 0   100%
src/coursebook/outline.py OutlineEntry.name   100% 4 0 0   100% 2 0   100%
src/coursebook/outline.py OutlineEntry.numbered   100% 1 0 0   100% 0 0   100%
src/coursebook/outline.py OutlineEntry.walk   100% 3 0 0   100% 2 0   100%
src/coursebook/outline.py Outline.from_lines   100% 19 0 0   100% 10 0   100%
src/coursebook/outline.py Outline.walk   100% 2 0 0   100% 2 0   100%
src/coursebook/outline.py Outline.__iter__   100% 1 0 0   100% 0 0   100%
src/coursebook/outline.py Outline.__len__   100% 1 0 0   100% 0 0   100%
src/coursebook/outline.py parse_outline_line   100% 6 0 0   100% 2 0   100%
src/coursebook/outline.py _split_file   100% 4 0 0   100% 2 0   100%
src/coursebook/outline.py _parse_parts   100% 12 0 0   100% 6 0   100%
src/coursebook/outline.py _clean_label   100% 4 0 0   100% 2 0   100%
src/coursebook/outline.py _is_unnumbered   100% 1 0 0   100% 0 0   100%
src/coursebook/outline.py _letters   100% 1 0 0   100% 0 0   100%
src/coursebook/outline.py _parse_letters   67% 3 1 0   50% 2 1   60%
src/coursebook/outline.py _parse_number   0% 3 3 0   0% 2 0   0%
src/coursebook/outline.py _parse_roman   20% 10 8 0   12% 8 1   17%
src/coursebook/outline.py _place_label   100% 20 0 0   100% 14 0   100%
src/coursebook/outline.py _place_unnumbered   100% 7 0 0   100% 4 0   100%
src/coursebook/outline.py _roman   100% 5 0 0   100% 2 0   100%
src/coursebook/outline.py (no function)   100% 53 0 3   100% 0 0   100%
src/coursebook/project.py Project.from_folder   100% 11 0 0   100% 2 0   100%
src/coursebook/project.py Project.include   100% 3 0 0   100% 2 0   100%
src/coursebook/project.py Project.missing   100% 1 0 0   100% 0 0   100%
src/coursebook/project.py Project.output_folder   100% 1 0 0   100% 0 0   100%
src/coursebook/project.py Project.unused   100% 2 0 0   100% 0 0   100%
src/coursebook/project.py Project.assemble   100% 6 0 0   100% 4 0   100%
src/coursebook/project.py Project.build   100% 21 0 0   100% 8 0   100%
src/coursebook/project.py Project._get_options   100% 10 0 0   100% 4 0   100%
src/coursebook/project.py Project._get_template   93% 15 1 0   83% 12 2   89%
src/coursebook/project.py Project._find   100% 5 0 0   100% 2 0   100%
src/coursebook/project.py Project._resolve   100% 1 0 0   100% 0 0   100%
src/coursebook/project.py build   100% 2 0 0   100% 0 0   100%
src/coursebook/project.py _formats_for   100% 1 0 0   100% 0 0   100%
src/coursebook/project.py _load_named_sources   100% 6 0 0   83% 6 1   92%
src/coursebook/project.py _warn_shared_sources   100% 5 0 0   100% 4 0   100%
src/coursebook/project.py (no function)   100% 44 0 5   100% 0 0   100%
src/coursebook/scaffold.py create_project   100% 33 0 0   90% 10 1   98%
src/coursebook/scaffold.py write_template   96% 25 1 0   90% 10 1   94%
src/coursebook/scaffold.py _format_entry   100% 3 0 0   100% 0 0   100%
src/coursebook/scaffold.py _format_project_file   100% 10 0 0   100% 4 0   100%
src/coursebook/scaffold.py _give_entries_own_files   88% 8 1 0   83% 6 1   86%
src/coursebook/scaffold.py (no function)   100% 18 0 3   100% 0 0   100%
src/coursebook/settings.py Settings.__post_init__   100% 2 0 0   100% 2 0   100%
src/coursebook/settings.py Settings.from_mapping   100% 11 0 0   100% 4 0   100%
src/coursebook/settings.py Settings.formats_for   100% 1 0 0   100% 0 0   100%
src/coursebook/settings.py Settings.template_for   100% 4 0 0   100% 2 0   100%
src/coursebook/settings.py find_project_file   100% 14 0 0   100% 6 0   100%
src/coursebook/settings.py normalize_sections   100% 10 0 0   83% 6 1   94%
src/coursebook/settings.py read_project_file   100% 14 0 0   100% 6 0   100%
src/coursebook/settings.py _convert_setting   93% 15 1 0   90% 10 1   92%
src/coursebook/settings.py _outline_items   100% 15 0 0   100% 10 0   100%
src/coursebook/settings.py _read_ini   100% 25 0 0   100% 12 0   100%
src/coursebook/settings.py _read_structured   100% 15 0 0   100% 4 0   100%
src/coursebook/settings.py (no function)   100% 57 0 3   100% 0 0   100%
src/coursebook/sources.py Source.from_file   100% 7 0 0   100% 0 0   100%
src/coursebook/sources.py Source.from_text   100% 3 0 0   100% 0 0   100%
src/coursebook/sources.py Source.get   100% 1 0 0   100% 0 0   100%
src/coursebook/sources.py load_sources   100% 10 0 0   100% 4 0   100%
src/coursebook/sources.py (no function)   100% 20 0 0   100% 0 0   100%
src/coursebook/styles.py Style.format_heading   100% 3 0 0   100% 2 0   100%
src/coursebook/styles.py get_style   100% 13 0 0   100% 6 0   100%
src/coursebook/styles.py (no function)   100% 47 0 3   100% 0 0   100%
src/coursebook/templates.py create_word_template   100% 7 0 0   100% 0 0   100%
src/coursebook/templates.py find_template   100% 19 0 0   100% 14 0   100%
src/coursebook/templates.py get_pandoc_template   100% 2 0 0   100% 0 0   100%
src/coursebook/templates.py list_templates   100% 5 0 0   100% 2 0   100%
src/coursebook/templates.py prepare_template   100% 15 0 0   100% 6 0   100%
src/coursebook/templates.py _apply_formatting   100% 36 0 0   100% 24 0   100%
src/coursebook/templates.py _add_page_numbers   100% 11 0 0   100% 0 0   100%
src/coursebook/templates.py _convert_office_template   100% 7 0 0   75% 4 1   91%
src/coursebook/templates.py _convert_theme   100% 22 0 0   100% 16 0   100%
src/coursebook/templates.py _convert_theme_content_types   100% 4 0 0   100% 0 0   100%
src/coursebook/templates.py _convert_theme_relationships   100% 5 0 0   100% 2 0   100%
src/coursebook/templates.py _number_footnotes_continuously   46% 13 7 0   33% 6 2   42%
src/coursebook/templates.py _set_default_font   80% 10 2 0   50% 6 3   69%
src/coursebook/templates.py _set_font   100% 3 0 0   100% 0 0   100%
src/coursebook/templates.py _replace_theme_fonts   100% 4 0 0   100% 4 0   100%
src/coursebook/templates.py (no function)   100% 39 0 7   100% 0 0   100%
tests/conftest.py coursebook_project   100% 1 0 0   100% 0 0   100%
tests/conftest.py law_review_project   100% 1 0 0   100% 0 0   100%
tests/conftest.py (no function)   100% 9 0 0   100% 0 0   100%
tests/test_main.py test_coursebook   100% 1 0 0   100% 0 0   100%
tests/test_main.py (no function)   100% 3 0 2   100% 0 0   100%
tests/test_markdown.py test_front_matter_with_dashes   100% 3 0 0   100% 0 0   100%
tests/test_markdown.py test_front_matter_with_quotes   100% 3 0 0   100% 0 0   100%
tests/test_markdown.py test_no_front_matter   100% 2 0 0   100% 0 0   100%
tests/test_markdown.py test_unclosed_front_matter   100% 2 0 0   100% 0 0   100%
tests/test_markdown.py test_front_matter_must_be_mapping   100% 2 0 0   100% 0 0   100%
tests/test_markdown.py test_split_sections   100% 5 0 0   100% 0 0   100%
tests/test_markdown.py test_split_sections_skips_empty_sections   100% 2 0 0   100% 0 0   100%
tests/test_markdown.py test_split_sections_manuscript_alias   100% 2 0 0   100% 0 0   100%
tests/test_markdown.py test_dividers_in_code_are_ignored   100% 4 0 0   100% 0 0   100%
tests/test_markdown.py test_unknown_divider   100% 2 0 0   100% 0 0   100%
tests/test_markdown.py test_shift_headings   100% 4 0 0   100% 0 0   100%
tests/test_markdown.py test_namespace_footnotes   100% 3 0 0   100% 0 0   100%
tests/test_markdown.py test_extract_images   100% 2 0 0   100% 0 0   100%
tests/test_markdown.py test_normalize_name   100% 1 0 0   100% 0 0   100%
tests/test_markdown.py test_source_from_file   100% 8 0 0   100% 0 0   100%
tests/test_markdown.py test_source_errors_name_the_file   100% 3 0 0   100% 0 0   100%
tests/test_markdown.py test_duplicate_sources   100% 4 0 0   100% 0 0   100%
tests/test_markdown.py (no function)   100% 23 0 0   100% 0 0   100%
tests/test_outline.py _levels   100% 1 0 0   100% 0 0   100%
tests/test_outline.py test_readme_outline   100% 7 0 0   100% 0 0   100%
tests/test_outline.py test_repeated_labels   100% 3 0 0   100% 0 0   100%
tests/test_outline.py test_deep_outline   100% 2 0 0   100% 0 0   100%
tests/test_outline.py test_arabic_top_level   100% 2 0 0   100% 0 0   100%
tests/test_outline.py test_letter_i_after_h   100% 3 0 0   100% 0 0   100%
tests/test_outline.py test_upper_i_after_h   100% 3 0 0   100% 0 0   100%
tests/test_outline.py test_label_punctuation   100% 3 0 0   100% 0 0   100%
tests/test_outline.py test_tuples_and_blank_lines   100% 2 0 0   100% 0 0   100%
tests/test_outline.py test_skipped_label_warns   100% 4 0 0   100% 0 0   100%
tests/test_outline.py test_double_letters   100% 3 0 0   100% 0 0   100%
tests/test_outline.py test_invalid_labels   100% 2 0 0   100% 0 0   100%
tests/test_outline.py test_invalid_lines   100% 2 0 0   100% 0 0   100%
tests/test_outline.py test_unnumbered_entries   100% 4 0 0   100% 0 0   100%
tests/test_outline.py test_unnumbered_entry_too_deep   100% 2 0 0   100% 0 0   100%
tests/test_outline.py test_entry_files   100% 11 0 0   100% 0 0   100%
tests/test_outline.py test_too_many_parts   100% 2 0 0   100% 0 0   100%
tests/test_outline.py (no function)   100% 24 0 0   100% 0 0   100%
tests/test_project.py _headings   100% 2 0 0   100% 0 0   100%
tests/test_project.py _slides   100% 6 0 0   100% 2 0   100%
tests/test_project.py _part   100% 2 0 0   100% 0 0   100%
tests/test_project.py test_project_from_folder   100% 6 0 0   100% 0 0   100%
tests/test_project.py test_assemble_text   100% 8 0 0   100% 0 0   100%
tests/test_project.py test_assemble_slides   100% 5 0 0   100% 0 0   100%
tests/test_project.py test_assemble_notes   100% 4 0 0   100% 0 0   100%
tests/test_project.py test_assemble_unknown_section   100% 3 0 0   100% 0 0   100%
tests/test_project.py test_build_coursebook   100% 11 0 0   100% 0 0   100%
tests/test_project.py test_build_slides   100% 10 0 0   100% 0 0   100%
tests/test_project.py test_build_notes   100% 6 0 0   100% 0 0   100%
tests/test_project.py test_build_law_review   100% 15 0 0   100% 0 0   100%
tests/test_project.py test_word_template_from_project   100% 8 0 0   100% 0 0   100%
tests/test_project.py test_output_folder_override   100% 3 0 0   100% 0 0   100%
tests/test_project.py test_project_without_outline   100% 3 0 0   100% 0 0   100%
tests/test_project.py test_missing_bibliography   100% 3 0 0   100% 0 0   100%
tests/test_project.py test_cli   100% 6 0 0   100% 0 0   100%
tests/test_project.py test_cli_error   100% 2 0 0   100% 0 0   100%
tests/test_project.py _set_option   100% 4 0 0   100% 0 0   100%
tests/test_project.py test_build_pdf_and_html   100% 9 0 0   100% 0 0   100%
tests/test_project.py test_html_embeds_images   100% 5 0 0   100% 0 0   100%
tests/test_project.py test_slides_cannot_be_pdf   100% 3 0 0   100% 0 0   100%
tests/test_project.py test_pdf_needs_typst   100% 4 0 0   100% 0 0   100%
tests/test_project.py test_named_source_files   100% 13 0 0   100% 0 0   100%
tests/test_project.py test_csl_from_settings   100% 4 0 0   100% 0 0   100%
tests/test_project.py test_csl_is_ignored_without_bibliography   100% 2 0 0   100% 0 0   100%
tests/test_project.py test_missing_csl   100% 3 0 0   100% 0 0   100%
tests/test_project.py test_cli_new_and_template   100% 16 0 0   100% 0 0   100%
tests/test_project.py test_cli_default_project   100% 4 0 0   100% 0 0   100%
tests/test_project.py (no function)   100% 39 0 0   100% 0 0   100%
tests/test_scaffold.py test_create_project   100% 10 0 0   100% 0 0   100%
tests/test_scaffold.py test_project_file_formats   100% 7 0 0   100% 0 0   100%
tests/test_scaffold.py test_shared_titles_get_own_files   100% 4 0 0   100% 0 0   100%
tests/test_scaffold.py test_existing_files_are_kept   100% 6 0 0   100% 0 0   100%
tests/test_scaffold.py test_invalid_new_projects   100% 7 0 0   100% 0 0   100%
tests/test_scaffold.py test_write_templates   100% 10 0 0   100% 0 0   100%
tests/test_scaffold.py test_write_templates_without_names   100% 7 0 0   100% 0 0   100%
tests/test_scaffold.py (no function)   100% 17 0 0   100% 0 0   100%
tests/test_settings.py _write   100% 3 0 0   100% 0 0   100%
tests/test_settings.py test_read_ini   100% 7 0 0   100% 0 0   100%
tests/test_settings.py test_read_toml   100% 5 0 0   100% 0 0   100%
tests/test_settings.py test_ini_repeated_labels   100% 3 0 0   100% 0 0   100%
tests/test_settings.py test_ini_types   100% 7 0 0   100% 0 0   100%
tests/test_settings.py test_formats   100% 5 0 0   100% 0 0   100%
tests/test_settings.py test_yaml   100% 4 0 0   100% 0 0   100%
tests/test_settings.py test_outline_inside_project_table   100% 5 0 0   100% 0 0   100%
tests/test_settings.py test_invalid_project_files   100% 3 0 0   100% 0 0   100%
tests/test_settings.py test_unsupported_extension   100% 3 0 0   100% 0 0   100%
tests/test_settings.py test_find_project_file   100% 5 0 0   100% 0 0   100%
tests/test_settings.py test_find_project_file_missing   100% 6 0 0   100% 0 0   100%
tests/test_settings.py test_settings_helpers   100% 4 0 0   100% 0 0   100%
tests/test_settings.py (no function)   100% 19 0 0   100% 0 0   100%
tests/test_styles.py test_get_style   100% 1 0 0   100% 0 0   100%
tests/test_styles.py test_unknown_style   100% 4 0 0   100% 0 0   100%
tests/test_styles.py test_style_overrides   100% 3 0 0   100% 0 0   100%
tests/test_styles.py test_format_heading   100% 5 0 0   100% 0 0   100%
tests/test_styles.py test_custom_style_is_registered   100% 6 0 0   100% 0 0   100%
tests/test_styles.py test_get_exporter   100% 1 0 0   100% 0 0   100%
tests/test_styles.py test_unknown_exporter   100% 2 0 0   100% 0 0   100%
tests/test_styles.py test_exporter_arguments   100% 9 0 0   100% 0 0   100%
tests/test_styles.py test_formatting_metadata   100% 13 0 0   100% 0 0   100%
tests/test_styles.py test_exporter_sections   100% 3 0 0   100% 2 0   100%
tests/test_styles.py (no function)   100% 18 0 0   100% 0 0   100%
tests/test_templates.py test_list_templates   100% 2 0 0   100% 0 0   100%
tests/test_templates.py test_find_included_template   100% 2 0 0   100% 0 0   100%
tests/test_templates.py test_project_template_comes_first   100% 4 0 0   100% 0 0   100%
tests/test_templates.py test_missing_template   100% 4 0 0   100% 0 0   100%
tests/test_templates.py test_wrong_template_type   100% 6 0 0   100% 0 0   100%
tests/test_templates.py test_convert_theme   100% 6 0 0   100% 0 0   100%
tests/test_templates.py test_theme_without_presentation   100% 5 0 0   100% 0 0   100%
tests/test_templates.py test_convert_office_templates   100% 11 0 0   100% 2 0   100%
tests/test_templates.py test_documents_are_used_as_is   100% 2 0 0   100% 0 0   100%
tests/test_templates.py test_create_word_template   100% 14 0 0   100% 0 0   100%
tests/test_templates.py test_empty_formatting_keeps_pandoc_template   100% 5 0 0   100% 0 0   100%
tests/test_templates.py test_word_template_page_layout   100% 10 0 0   100% 0 0   100%
tests/test_templates.py test_find_included_csl   100% 4 0 0   100% 0 0   100%
tests/test_templates.py (no function)   100% 25 0 0   100% 0 0   100%
Total     98% 1995 34 40   89% 444 39   97%

No items found using the specified filter.