rumdl 0.0.162__tar.gz → 0.0.164__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rumdl might be problematic. Click here for more details.
- {rumdl-0.0.162 → rumdl-0.0.164}/CHANGELOG.md +129 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/Cargo.lock +33 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/Cargo.toml +2 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/PKG-INFO +14 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/README.md +13 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md024.md +7 -4
- rumdl-0.0.164/src/cache.rs +394 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/file_processor.rs +79 -50
- {rumdl-0.0.162 → rumdl-0.0.164}/src/filtered_lines.rs +22 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/fix_coordinator.rs +57 -20
- {rumdl-0.0.162 → rumdl-0.0.164}/src/formatter.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/lib.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/lint_context.rs +101 -76
- {rumdl-0.0.162 → rumdl-0.0.164}/src/lsp/server.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/lsp/types.rs +8 -8
- {rumdl-0.0.162 → rumdl-0.0.164}/src/main.rs +36 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/azure.rs +13 -13
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/concise.rs +12 -12
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/github.rs +16 -16
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/gitlab.rs +17 -17
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/grouped.rs +19 -19
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/json.rs +13 -13
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/json_lines.rs +15 -15
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/junit.rs +14 -14
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/pylint.rs +12 -12
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/sarif.rs +16 -16
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/text.rs +10 -10
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/mod.rs +4 -4
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rule.rs +7 -7
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md001_heading_increment.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md002_first_heading_h1.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md003_heading_style.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md004_unordered_list_style.rs +3 -3
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md005_list_indent.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md006_start_bullets.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md007_ul_indent.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md009_trailing_spaces.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md010_no_hard_tabs.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md011_no_reversed_links.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md012_no_multiple_blanks.rs +5 -5
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md013_line_length.rs +89 -70
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md014_commands_show_output.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md018_no_missing_space_atx.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md019_no_multiple_space_atx.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md020_no_missing_space_closed_atx.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md021_no_multiple_space_closed_atx.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md022_blanks_around_headings.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md023_heading_start_left.rs +3 -3
- rumdl-0.0.164/src/rules/md024_no_duplicate_heading/md024_config.rs +38 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md024_no_duplicate_heading.rs +59 -17
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md025_single_title.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md026_no_trailing_punctuation.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md027_multiple_spaces_blockquote.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md028_no_blanks_blockquote.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md029_ordered_list_prefix.rs +3 -3
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md030_list_marker_space.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md031_blanks_around_fences.rs +4 -4
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md032_blanks_around_lists.rs +3 -3
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md033_no_inline_html.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md034_no_bare_urls.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md035_hr_style.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md036_no_emphasis_only_first.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md037_spaces_around_emphasis.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md038_no_space_in_code.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md039_no_space_in_links.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md040_fenced_code_language.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md041_first_line_heading.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md042_no_empty_links.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md043_required_headings.rs +3 -3
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md044_proper_names.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md045_no_alt_text.rs +3 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md046_code_block_style.rs +42 -15
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md047_single_trailing_newline.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md048_code_fence_style.rs +4 -4
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md049_emphasis_style.rs +9 -4
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md050_strong_style.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md051_link_fragments.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md052_reference_links_images.rs +48 -4
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md053_link_image_reference_definitions.rs +3 -3
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md054_link_image_style.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md055_table_pipe_style.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md056_table_column_count.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md057_existing_relative_links.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md058_blanks_around_tables.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/fix_utils.rs +19 -19
- {rumdl-0.0.162 → rumdl-0.0.164}/src/watch.rs +20 -18
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/character_ranges/mod.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/config_application_tests.rs +45 -12
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/config_tests.rs +6 -3
- rumdl-0.0.164/tests/html_comments_test.rs +224 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/inline_config_blocks_test.rs +8 -9
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_tests.rs +5 -5
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md052_literal_brackets_test.rs +34 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/per_file_ignores_integration_test.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/heading_edge_cases_test.rs +3 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/inline_content_edge_cases_test.rs +6 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md024_test.rs +2 -2
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_nested_list_continuation_test.rs +4 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_test.rs +12 -3
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md034_test.rs +1 -1
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md046_test.rs +29 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md050_test.rs +88 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/sentence_per_line_test.rs +1 -4
- rumdl-0.0.162/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -19
- {rumdl-0.0.162 → rumdl-0.0.164}/.config/nextest.toml +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/.mise.toml +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/.rumdl.toml +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/.rustfmt.toml +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/LICENSE +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/MANIFEST.in +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/Makefile +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/assets/logo.png +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benches/range_performance.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/RULES.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/global-settings.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/inline-configuration.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md001.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md002.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md003.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md004.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md005.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md006.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md007.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md009.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md010.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md011.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md012.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md013.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md014.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md018.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md019.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md020.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md021.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md022.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md023.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md025.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md026.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md027.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md028.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md029.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md030.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md031.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md032.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md033.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md034.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md035.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md036.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md037.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md038.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md039.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md040.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md041.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md042.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md043.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md044.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md045.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md046.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md047.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md048.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md049.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md050.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md051.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md052.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md053.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md054.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md055.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md056.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md057.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/md058.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/pyproject.toml +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/rumdl/__init__.py +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/rumdl/__main__.py +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/rumdl/py.typed +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/rumdl.schema.json +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/rumdl.toml.example +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/rust-toolchain.toml +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/scripts/generate-downloads-table.sh +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/scripts/pre-release.sh +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/exit_codes.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/inline_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/parallel.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/performance.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/profiling.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rule_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/stdin_processor.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/anchor_styles/github.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/anchor_styles/jekyll.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/anchor_styles/kramdown.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/anchor_styles/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/header_id_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/jinja_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/kramdown_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/line_ending.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_admonitions.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_common.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_critic.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_footnotes.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_patterns.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_snippets.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_tabs.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocs_test_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mkdocstrings_refs.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/skip_context.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/src/vscode.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/code_block_blockquote_edge_cases.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/common/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/config_upward_traversal_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/crlf_line_endings_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/exclude_with_explicit_paths_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/fix_counting_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/fix_performance_baseline_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/fixable_unfixable_config_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/init_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/kramdown_integration_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lib.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_formatting_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_initialization_options_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_mkdocs_flavor_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/lsp_unopened_document_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md009_md013_integration_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md009_md013_order_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md013_hard_breaks_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md013_reflow_nested_lists_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md032_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md032_ordered_list_bug_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md033_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md037_xxxx_regression_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md038_false_positive_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md051_readme_bug_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md051_toc_bug_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/md054_code_span_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/mkdocs_anchor_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/mkdocs_anchor_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/perf_check.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md005_dynamic_indent_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md026_kramdown_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md028_md009_interaction_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_code_block_separation_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_fix_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_issue42_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md033_blockquote_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md033_kramdown_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md037_kramdown_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_comprehensive_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_property_based_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_regression_prevention_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md051_unicode_security_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/mkdocs_admonitions_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/mkdocs_extensions_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/mkdocs_snippets_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules/rule_interaction_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/schema_validation_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/skip_context_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/test_ast_code_block_issue.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/test_gfm_vs_default_parsing.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/test_lint_context_flow.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/test_list_ast_structure.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/test_multiline_ast.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/test_underscore_edge_cases.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/unfixable_rules_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utf8_boundary_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.162 → rumdl-0.0.164}/tests/vscode_windows_test.rs +0 -0
|
@@ -7,6 +7,115 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.164] - 2025-10-21
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **File-Level Caching (Ruff-inspired)**: Dramatic performance improvements for repeat runs
|
|
15
|
+
- Blake3-based content hashing for fast cache lookups
|
|
16
|
+
- Automatic cache invalidation on content, config, or version changes
|
|
17
|
+
- Cache stored in `.rumdl-cache/{version}/{hash}.json`
|
|
18
|
+
- CLI flags: `--no-cache` to disable, `--cache-dir` to customize location
|
|
19
|
+
- Enabled by default for instant subsequent runs
|
|
20
|
+
|
|
21
|
+
- **Thread-Safe Parallel Caching**: Best of both worlds - parallelization AND caching
|
|
22
|
+
- Implemented Arc<Mutex<LintCache>> for safe cache sharing across threads
|
|
23
|
+
- Mutex locked ONLY for brief cache get/set operations
|
|
24
|
+
- Full parallelization during expensive linting operations
|
|
25
|
+
- Matches Ruff's architecture for optimal performance
|
|
26
|
+
|
|
27
|
+
- **Convergence Detection**: Added hash-based detection to identify when fixes have stabilized
|
|
28
|
+
- Stops iteration when content hash remains unchanged
|
|
29
|
+
- More efficient than counting rule applications
|
|
30
|
+
- Returns convergence status in fix results
|
|
31
|
+
|
|
32
|
+
- **Convergence Failure Warnings**: Report when auto-fix doesn't converge (Ruff-style)
|
|
33
|
+
- Warns if 100 iteration limit reached without convergence
|
|
34
|
+
- Shows rule codes involved in potential infinite loop
|
|
35
|
+
- Encourages bug reports for convergence failures
|
|
36
|
+
- Available via `RUMDL_DEBUG_FIX_PERF` environment variable
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- **Auto-fix Iteration**: Automatic iteration until convergence (fixes #88)
|
|
41
|
+
- `--fix` now automatically iterates up to 100 passes until content stabilizes (same as Ruff)
|
|
42
|
+
- No need to manually re-run `rumdl check --fix` multiple times
|
|
43
|
+
- Hash-based convergence detection prevents unnecessary iterations
|
|
44
|
+
- Significantly improves user experience for multi-pass fix scenarios
|
|
45
|
+
|
|
46
|
+
- **Unified Linting Architecture**: Removed ~60 lines of duplicate linting logic
|
|
47
|
+
- Refactored `process_file_collect_warnings` to use `process_file_inner`
|
|
48
|
+
- Single code path for all file processing
|
|
49
|
+
- Cache works for ALL output formats (text, JSON, GitLab, SARIF, JUnit)
|
|
50
|
+
|
|
51
|
+
- **Parallel File Processing for Fix Mode**: 4.8x speedup on multi-file fixes
|
|
52
|
+
- Previously fix mode was always sequential
|
|
53
|
+
- Now uses parallel processing when safe (multiple independent files)
|
|
54
|
+
- Each file processes all its fix iterations independently
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- **Multi-pass Fixes**: No longer require manual re-runs to apply all possible fixes
|
|
59
|
+
- Previously users had to run `rumdl check --fix` multiple times
|
|
60
|
+
- Now automatically handles dependent rule fixes in single command
|
|
61
|
+
- Examples: MD010 (tabs) before MD007 (list indent), MD013 (line length) before MD009 (trailing spaces)
|
|
62
|
+
|
|
63
|
+
- **Cache Correctness**: Include enabled rules in cache key (Ruff-style)
|
|
64
|
+
- Cache now respects `--enable`/`--disable` CLI flags
|
|
65
|
+
- Different rule configurations create separate cache entries
|
|
66
|
+
- Prevents incorrect cached results when switching rule sets
|
|
67
|
+
- Changed `LintWarning.rule_name` from `Option<&'static str>` to `Option<String>` for proper serialization
|
|
68
|
+
|
|
69
|
+
- **Cache Parallelization**: Cache now works correctly with parallel processing
|
|
70
|
+
- No mutex contention during parallel file processing
|
|
71
|
+
- All output formats benefit from caching (previously only JSON/GitLab/SARIF/JUnit)
|
|
72
|
+
|
|
73
|
+
### Performance
|
|
74
|
+
|
|
75
|
+
- **Single file with cache**: 943ms → 7ms (135x faster)
|
|
76
|
+
- **Multi-file (21 files) cold cache**: 14.4s → 4s (parallel processing)
|
|
77
|
+
- **Multi-file (21 files) warm cache**: 14.4s → 0.019s (757x faster!)
|
|
78
|
+
- **JSON format (17 files) with cache**: 13.9s → 60ms (231x faster)
|
|
79
|
+
|
|
80
|
+
## [0.0.163] - 2025-10-20
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
|
|
84
|
+
- **MD024**: Default `siblings_only` to true for better usability
|
|
85
|
+
- Multiple headings with same text now only flagged if they're direct siblings
|
|
86
|
+
- Reduces false positives in documents with common section headings
|
|
87
|
+
- More intuitive default behavior matching common use cases
|
|
88
|
+
|
|
89
|
+
### Fixed
|
|
90
|
+
|
|
91
|
+
- **MD013**: Enforce line length in sentence_per_line mode (fixes #111)
|
|
92
|
+
- Previously, sentence_per_line mode completely ignored line_length setting
|
|
93
|
+
- Now warns about single sentences exceeding configured line_length
|
|
94
|
+
- No auto-fix for long single sentences (requires manual rephrasing)
|
|
95
|
+
- Still auto-fixes multi-sentence lines by splitting on sentence boundaries
|
|
96
|
+
- Cleaned up warning messages by removing verbose parentheticals
|
|
97
|
+
- Maintains semantic integrity (won't split mid-sentence) while respecting configured line_length
|
|
98
|
+
|
|
99
|
+
- **HTML Comments**: Complete fix to ignore all content inside HTML comments (fixes #119, #20)
|
|
100
|
+
- All rules now properly ignore content within HTML comment blocks (`<!-- ... -->`)
|
|
101
|
+
- Added `in_html_comment` field to `LineInfo` for comprehensive tracking
|
|
102
|
+
- Extended filtered lines API with `skip_html_comments()` method
|
|
103
|
+
- Updated MD013, MD049, and other rules to skip HTML comment content
|
|
104
|
+
- Prevents false positives from commented-out markdown (MD013, MD049, MD005, MD006, MD039, MD042)
|
|
105
|
+
- Better handling of multi-line HTML comments across all linting rules
|
|
106
|
+
|
|
107
|
+
- **MD046**: Resolve false positives from Issue #118
|
|
108
|
+
- Fixed incorrect flagging of valid code block syntax
|
|
109
|
+
- Improved code block style detection accuracy
|
|
110
|
+
|
|
111
|
+
- **MD050**: Resolve false positives from Issue #118
|
|
112
|
+
- Fixed incorrect strong style detection in edge cases
|
|
113
|
+
- Better handling of emphasis patterns
|
|
114
|
+
|
|
115
|
+
- **Tests**: Fixed sentence_per_line_detection test assertion
|
|
116
|
+
- Updated test to match simplified warning message from MD013
|
|
117
|
+
- Test was expecting verbose message after message was simplified in earlier commit
|
|
118
|
+
|
|
10
119
|
## [0.0.162] - 2025-10-16
|
|
11
120
|
|
|
12
121
|
### Added
|
|
@@ -1108,7 +1217,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
1108
1217
|
|
|
1109
1218
|
- Initial implementation of remaining rules for markdownlint parity
|
|
1110
1219
|
|
|
1111
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
1220
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.163...HEAD
|
|
1221
|
+
[0.0.163]: https://github.com/rvben/rumdl/compare/v0.0.162...v0.0.163
|
|
1222
|
+
[0.0.162]: https://github.com/rvben/rumdl/compare/v0.0.161...v0.0.162
|
|
1223
|
+
[0.0.161]: https://github.com/rvben/rumdl/compare/v0.0.160...v0.0.161
|
|
1224
|
+
[0.0.160]: https://github.com/rvben/rumdl/compare/v0.0.159...v0.0.160
|
|
1225
|
+
[0.0.159]: https://github.com/rvben/rumdl/compare/v0.0.158...v0.0.159
|
|
1226
|
+
[0.0.158]: https://github.com/rvben/rumdl/compare/v0.0.157...v0.0.158
|
|
1227
|
+
[0.0.157]: https://github.com/rvben/rumdl/compare/v0.0.156...v0.0.157
|
|
1228
|
+
[0.0.156]: https://github.com/rvben/rumdl/compare/v0.0.155...v0.0.156
|
|
1229
|
+
[0.0.155]: https://github.com/rvben/rumdl/compare/v0.0.154...v0.0.155
|
|
1230
|
+
[0.0.154]: https://github.com/rvben/rumdl/compare/v0.0.153...v0.0.154
|
|
1231
|
+
[0.0.153]: https://github.com/rvben/rumdl/compare/v0.0.152...v0.0.153
|
|
1232
|
+
[0.0.152]: https://github.com/rvben/rumdl/compare/v0.0.151...v0.0.152
|
|
1233
|
+
[0.0.151]: https://github.com/rvben/rumdl/compare/v0.0.150...v0.0.151
|
|
1234
|
+
[0.0.150]: https://github.com/rvben/rumdl/compare/v0.0.149...v0.0.150
|
|
1235
|
+
[0.0.149]: https://github.com/rvben/rumdl/compare/v0.0.148...v0.0.149
|
|
1236
|
+
[0.0.148]: https://github.com/rvben/rumdl/compare/v0.0.147...v0.0.148
|
|
1237
|
+
[0.0.147]: https://github.com/rvben/rumdl/compare/v0.0.146...v0.0.147
|
|
1238
|
+
[0.0.146]: https://github.com/rvben/rumdl/compare/v0.0.145...v0.0.146
|
|
1239
|
+
[0.0.145]: https://github.com/rvben/rumdl/compare/v0.0.144...v0.0.145
|
|
1112
1240
|
[0.0.144]: https://github.com/rvben/rumdl/compare/v0.0.143...v0.0.144
|
|
1113
1241
|
[0.0.142]: https://github.com/rvben/rumdl/compare/v0.0.141...v0.0.142
|
|
1114
1242
|
[0.0.140]: https://github.com/rvben/rumdl/compare/v0.0.139...v0.0.140
|
|
@@ -111,6 +111,18 @@ version = "1.0.100"
|
|
|
111
111
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
112
112
|
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
|
|
113
113
|
|
|
114
|
+
[[package]]
|
|
115
|
+
name = "arrayref"
|
|
116
|
+
version = "0.3.9"
|
|
117
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
118
|
+
checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
|
|
119
|
+
|
|
120
|
+
[[package]]
|
|
121
|
+
name = "arrayvec"
|
|
122
|
+
version = "0.7.6"
|
|
123
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
124
|
+
checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
|
|
125
|
+
|
|
114
126
|
[[package]]
|
|
115
127
|
name = "assert_cmd"
|
|
116
128
|
version = "2.0.17"
|
|
@@ -224,6 +236,19 @@ version = "2.9.4"
|
|
|
224
236
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
225
237
|
checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
|
|
226
238
|
|
|
239
|
+
[[package]]
|
|
240
|
+
name = "blake3"
|
|
241
|
+
version = "1.8.2"
|
|
242
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
243
|
+
checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0"
|
|
244
|
+
dependencies = [
|
|
245
|
+
"arrayref",
|
|
246
|
+
"arrayvec",
|
|
247
|
+
"cc",
|
|
248
|
+
"cfg-if",
|
|
249
|
+
"constant_time_eq",
|
|
250
|
+
]
|
|
251
|
+
|
|
227
252
|
[[package]]
|
|
228
253
|
name = "borrow-or-share"
|
|
229
254
|
version = "0.2.2"
|
|
@@ -377,6 +402,12 @@ dependencies = [
|
|
|
377
402
|
"windows-sys 0.59.0",
|
|
378
403
|
]
|
|
379
404
|
|
|
405
|
+
[[package]]
|
|
406
|
+
name = "constant_time_eq"
|
|
407
|
+
version = "0.3.1"
|
|
408
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
409
|
+
checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
|
|
410
|
+
|
|
380
411
|
[[package]]
|
|
381
412
|
name = "core-foundation-sys"
|
|
382
413
|
version = "0.8.7"
|
|
@@ -1952,10 +1983,11 @@ dependencies = [
|
|
|
1952
1983
|
|
|
1953
1984
|
[[package]]
|
|
1954
1985
|
name = "rumdl"
|
|
1955
|
-
version = "0.0.
|
|
1986
|
+
version = "0.0.164"
|
|
1956
1987
|
dependencies = [
|
|
1957
1988
|
"anyhow",
|
|
1958
1989
|
"assert_cmd",
|
|
1990
|
+
"blake3",
|
|
1959
1991
|
"chrono",
|
|
1960
1992
|
"clap",
|
|
1961
1993
|
"colored",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rumdl"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.164"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
rust-version = "1.89.0"
|
|
6
6
|
description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
|
|
@@ -87,6 +87,7 @@ num_cpus = "1.16"
|
|
|
87
87
|
chrono = { version = "0.4", features = ["serde"] }
|
|
88
88
|
notify = "6.1"
|
|
89
89
|
etcetera = "0.8"
|
|
90
|
+
blake3 = "1.5"
|
|
90
91
|
|
|
91
92
|
[features]
|
|
92
93
|
default = ["parallel"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rumdl
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.164
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -172,6 +172,19 @@ uv tool install rumdl
|
|
|
172
172
|
uv tool run rumdl check .
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
+
### Using Nix (macOS/Linux)
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
nix-channel --update
|
|
179
|
+
nix-env --install --attr nixpkgs.rumdl
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Alternatively, you can use flakes to run it without installation.
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
nix run --extra-experimental-features 'flakes nix-command' nixpkgs/nixpkgs-unstable#rumdl -- --version
|
|
186
|
+
```
|
|
187
|
+
|
|
175
188
|
### Download binary
|
|
176
189
|
|
|
177
190
|
```bash
|
|
@@ -143,6 +143,19 @@ uv tool install rumdl
|
|
|
143
143
|
uv tool run rumdl check .
|
|
144
144
|
```
|
|
145
145
|
|
|
146
|
+
### Using Nix (macOS/Linux)
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
nix-channel --update
|
|
150
|
+
nix-env --install --attr nixpkgs.rumdl
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Alternatively, you can use flakes to run it without installation.
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
nix run --extra-experimental-features 'flakes nix-command' nixpkgs/nixpkgs-unstable#rumdl -- --version
|
|
157
|
+
```
|
|
158
|
+
|
|
146
159
|
### Download binary
|
|
147
160
|
|
|
148
161
|
```bash
|
|
@@ -73,12 +73,15 @@ How to run the test suite...
|
|
|
73
73
|
|
|
74
74
|
## Configuration
|
|
75
75
|
|
|
76
|
-
```
|
|
77
|
-
MD024
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
```toml
|
|
77
|
+
[MD024]
|
|
78
|
+
allow-different-nesting = false # Allow duplicates at different levels (default: false)
|
|
79
|
+
siblings-only = true # Only check siblings at same level (default: true)
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
+
**Note:** rumdl defaults `siblings-only` to `true` (unlike markdownlint's `false` ) to reduce false positives in CHANGELOGs and structured documentation. To match markdownlint's stricter behavior, set
|
|
83
|
+
`siblings-only = false` .
|
|
84
|
+
|
|
82
85
|
## Automatic fixes
|
|
83
86
|
|
|
84
87
|
This rule cannot be automatically fixed because changing heading text requires understanding the content's meaning. You'll need to manually update duplicate headings to be more descriptive.
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
//! File-level caching for lint results
|
|
2
|
+
//!
|
|
3
|
+
//! Inspired by Ruff's caching implementation, this module provides fast caching
|
|
4
|
+
//! of lint results to avoid re-checking unchanged files.
|
|
5
|
+
//!
|
|
6
|
+
//! Cache key: (file_content_hash, config_hash, rumdl_version)
|
|
7
|
+
//! Cache value: Vec<LintWarning>
|
|
8
|
+
//! Storage: .rumdl-cache/{version}/{hash}.json
|
|
9
|
+
|
|
10
|
+
use rumdl_lib::rule::LintWarning;
|
|
11
|
+
use serde::{Deserialize, Serialize};
|
|
12
|
+
use std::fs;
|
|
13
|
+
use std::path::PathBuf;
|
|
14
|
+
|
|
15
|
+
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
|
16
|
+
|
|
17
|
+
/// Cache statistics for reporting
|
|
18
|
+
#[derive(Debug, Default, Clone)]
|
|
19
|
+
pub struct CacheStats {
|
|
20
|
+
pub hits: usize,
|
|
21
|
+
pub misses: usize,
|
|
22
|
+
pub writes: usize,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
impl CacheStats {
|
|
26
|
+
#[allow(dead_code)]
|
|
27
|
+
pub fn hit_rate(&self) -> f64 {
|
|
28
|
+
let total = self.hits + self.misses;
|
|
29
|
+
if total == 0 {
|
|
30
|
+
0.0
|
|
31
|
+
} else {
|
|
32
|
+
(self.hits as f64 / total as f64) * 100.0
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// A cache entry stored on disk
|
|
38
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
39
|
+
struct CacheEntry {
|
|
40
|
+
/// Blake3 hash of file content
|
|
41
|
+
file_hash: String,
|
|
42
|
+
/// Blake3 hash of config
|
|
43
|
+
config_hash: String,
|
|
44
|
+
/// Blake3 hash of enabled rules (sorted rule names)
|
|
45
|
+
rules_hash: String,
|
|
46
|
+
/// rumdl version
|
|
47
|
+
version: String,
|
|
48
|
+
/// Cached lint warnings
|
|
49
|
+
warnings: Vec<LintWarning>,
|
|
50
|
+
/// Timestamp when cached (Unix timestamp)
|
|
51
|
+
timestamp: i64,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/// File-level cache for lint results
|
|
55
|
+
pub struct LintCache {
|
|
56
|
+
/// Base cache directory (e.g., .rumdl-cache/)
|
|
57
|
+
cache_dir: PathBuf,
|
|
58
|
+
/// Whether caching is enabled
|
|
59
|
+
enabled: bool,
|
|
60
|
+
/// Cache statistics
|
|
61
|
+
stats: CacheStats,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
impl LintCache {
|
|
65
|
+
/// Create a new cache instance
|
|
66
|
+
///
|
|
67
|
+
/// # Arguments
|
|
68
|
+
/// * `cache_dir` - Base directory for cache (e.g., ".rumdl-cache")
|
|
69
|
+
/// * `enabled` - Whether caching is enabled
|
|
70
|
+
#[allow(dead_code)]
|
|
71
|
+
pub fn new(cache_dir: PathBuf, enabled: bool) -> Self {
|
|
72
|
+
Self {
|
|
73
|
+
cache_dir,
|
|
74
|
+
enabled,
|
|
75
|
+
stats: CacheStats::default(),
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// Get default cache directory for a project
|
|
80
|
+
#[allow(dead_code)]
|
|
81
|
+
pub fn default_cache_dir() -> PathBuf {
|
|
82
|
+
PathBuf::from(".rumdl-cache")
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// Compute Blake3 hash of content
|
|
86
|
+
fn hash_content(content: &str) -> String {
|
|
87
|
+
blake3::hash(content.as_bytes()).to_hex().to_string()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// Compute hash of config
|
|
91
|
+
/// This is a public function that can be called from file_processor
|
|
92
|
+
pub fn hash_config(config: &rumdl_lib::config::Config) -> String {
|
|
93
|
+
// Serialize config to JSON and hash it
|
|
94
|
+
// If serialization fails, return a default hash
|
|
95
|
+
let config_json = serde_json::to_string(config).unwrap_or_default();
|
|
96
|
+
blake3::hash(config_json.as_bytes()).to_hex().to_string()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/// Compute hash of enabled rules (Ruff-style)
|
|
100
|
+
/// This ensures different rule configurations get different cache entries
|
|
101
|
+
pub fn hash_rules(rules: &[Box<dyn rumdl_lib::rule::Rule>]) -> String {
|
|
102
|
+
// Sort rule names for deterministic hashing
|
|
103
|
+
let mut rule_names: Vec<&str> = rules.iter().map(|r| r.name()).collect();
|
|
104
|
+
rule_names.sort_unstable();
|
|
105
|
+
|
|
106
|
+
// Hash the sorted rule names
|
|
107
|
+
let rules_str = rule_names.join(",");
|
|
108
|
+
blake3::hash(rules_str.as_bytes()).to_hex().to_string()
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/// Get the cache file path for a given content and config hash
|
|
112
|
+
/// Includes rules_hash in filename to separate different rule configurations
|
|
113
|
+
fn cache_file_path(&self, file_hash: &str, rules_hash: &str) -> PathBuf {
|
|
114
|
+
// Include first 8 chars of rules_hash to keep filenames reasonable
|
|
115
|
+
let short_rules_hash = &rules_hash[..8];
|
|
116
|
+
self.cache_dir
|
|
117
|
+
.join(VERSION)
|
|
118
|
+
.join(format!("{file_hash}_{short_rules_hash}.json"))
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/// Try to get cached results for a file
|
|
122
|
+
///
|
|
123
|
+
/// Returns Some(warnings) if cache hit, None if cache miss
|
|
124
|
+
pub fn get(&mut self, content: &str, config_hash: &str, rules_hash: &str) -> Option<Vec<LintWarning>> {
|
|
125
|
+
if !self.enabled {
|
|
126
|
+
return None;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
let file_hash = Self::hash_content(content);
|
|
130
|
+
let cache_path = self.cache_file_path(&file_hash, rules_hash);
|
|
131
|
+
|
|
132
|
+
// Try to read cache file
|
|
133
|
+
let cache_data = match fs::read_to_string(&cache_path) {
|
|
134
|
+
Ok(data) => data,
|
|
135
|
+
Err(_) => {
|
|
136
|
+
self.stats.misses += 1;
|
|
137
|
+
return None;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// Try to parse cache entry
|
|
142
|
+
let entry: CacheEntry = match serde_json::from_str(&cache_data) {
|
|
143
|
+
Ok(entry) => entry,
|
|
144
|
+
Err(_) => {
|
|
145
|
+
self.stats.misses += 1;
|
|
146
|
+
return None;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// Validate cache entry (Ruff-style: file content + config + enabled rules)
|
|
151
|
+
if entry.file_hash != file_hash
|
|
152
|
+
|| entry.config_hash != config_hash
|
|
153
|
+
|| entry.rules_hash != rules_hash
|
|
154
|
+
|| entry.version != VERSION
|
|
155
|
+
{
|
|
156
|
+
self.stats.misses += 1;
|
|
157
|
+
return None;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Cache hit!
|
|
161
|
+
self.stats.hits += 1;
|
|
162
|
+
Some(entry.warnings)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/// Store lint results in cache
|
|
166
|
+
pub fn set(&mut self, content: &str, config_hash: &str, rules_hash: &str, warnings: Vec<LintWarning>) {
|
|
167
|
+
if !self.enabled {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
let file_hash = Self::hash_content(content);
|
|
172
|
+
let cache_path = self.cache_file_path(&file_hash, rules_hash);
|
|
173
|
+
|
|
174
|
+
// Create cache directory if it doesn't exist
|
|
175
|
+
if let Some(parent) = cache_path.parent() {
|
|
176
|
+
let _ = fs::create_dir_all(parent);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Create cache entry
|
|
180
|
+
let entry = CacheEntry {
|
|
181
|
+
file_hash,
|
|
182
|
+
config_hash: config_hash.to_string(),
|
|
183
|
+
rules_hash: rules_hash.to_string(),
|
|
184
|
+
version: VERSION.to_string(),
|
|
185
|
+
warnings,
|
|
186
|
+
timestamp: chrono::Utc::now().timestamp(),
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// Write to cache (ignore errors - cache is optional)
|
|
190
|
+
if let Ok(json) = serde_json::to_string_pretty(&entry) {
|
|
191
|
+
let _ = fs::write(&cache_path, json);
|
|
192
|
+
self.stats.writes += 1;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/// Clear the entire cache
|
|
197
|
+
#[allow(dead_code)]
|
|
198
|
+
pub fn clear(&self) -> std::io::Result<()> {
|
|
199
|
+
if self.cache_dir.exists() {
|
|
200
|
+
fs::remove_dir_all(&self.cache_dir)?;
|
|
201
|
+
}
|
|
202
|
+
Ok(())
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/// Initialize cache directory structure
|
|
206
|
+
#[allow(dead_code)]
|
|
207
|
+
pub fn init(&self) -> std::io::Result<()> {
|
|
208
|
+
if !self.enabled {
|
|
209
|
+
return Ok(());
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Create version-specific directory
|
|
213
|
+
let version_dir = self.cache_dir.join(VERSION);
|
|
214
|
+
fs::create_dir_all(&version_dir)?;
|
|
215
|
+
|
|
216
|
+
// Create .gitignore if it doesn't exist
|
|
217
|
+
let gitignore_path = self.cache_dir.join(".gitignore");
|
|
218
|
+
if !gitignore_path.exists() {
|
|
219
|
+
fs::write(gitignore_path, "# Automatically created by rumdl.\n*\n")?;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Create CACHEDIR.TAG file (standard cache directory marker)
|
|
223
|
+
let cachedir_tag = self.cache_dir.join("CACHEDIR.TAG");
|
|
224
|
+
if !cachedir_tag.exists() {
|
|
225
|
+
fs::write(
|
|
226
|
+
cachedir_tag,
|
|
227
|
+
"Signature: 8a477f597d28d172789f06886806bc55\n# This file is a cache directory tag created by rumdl.\n",
|
|
228
|
+
)?;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
Ok(())
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/// Get cache statistics
|
|
235
|
+
#[allow(dead_code)]
|
|
236
|
+
pub fn stats(&self) -> &CacheStats {
|
|
237
|
+
&self.stats
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/// Check if caching is enabled
|
|
241
|
+
#[allow(dead_code)]
|
|
242
|
+
pub fn is_enabled(&self) -> bool {
|
|
243
|
+
self.enabled
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
#[cfg(test)]
|
|
248
|
+
mod tests {
|
|
249
|
+
use super::*;
|
|
250
|
+
use tempfile::TempDir;
|
|
251
|
+
|
|
252
|
+
#[test]
|
|
253
|
+
fn test_cache_disabled() {
|
|
254
|
+
let temp_dir = TempDir::new().unwrap();
|
|
255
|
+
let mut cache = LintCache::new(temp_dir.path().to_path_buf(), false);
|
|
256
|
+
|
|
257
|
+
let content = "# Test";
|
|
258
|
+
let config_hash = "abc123";
|
|
259
|
+
|
|
260
|
+
// Should return None when disabled
|
|
261
|
+
assert!(cache.get(content, config_hash, "test_rules_hash").is_none());
|
|
262
|
+
|
|
263
|
+
// Set should be no-op when disabled
|
|
264
|
+
cache.set(content, config_hash, "test_rules_hash", vec![]);
|
|
265
|
+
assert_eq!(cache.stats().writes, 0);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
#[test]
|
|
269
|
+
fn test_cache_miss() {
|
|
270
|
+
let temp_dir = TempDir::new().unwrap();
|
|
271
|
+
let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
|
|
272
|
+
|
|
273
|
+
let content = "# Test";
|
|
274
|
+
let config_hash = "abc123";
|
|
275
|
+
|
|
276
|
+
// First access should be a miss
|
|
277
|
+
assert!(cache.get(content, config_hash, "test_rules_hash").is_none());
|
|
278
|
+
assert_eq!(cache.stats().misses, 1);
|
|
279
|
+
assert_eq!(cache.stats().hits, 0);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
#[test]
|
|
283
|
+
fn test_cache_hit() {
|
|
284
|
+
let temp_dir = TempDir::new().unwrap();
|
|
285
|
+
let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
|
|
286
|
+
cache.init().unwrap();
|
|
287
|
+
|
|
288
|
+
let content = "# Test";
|
|
289
|
+
let config_hash = "abc123";
|
|
290
|
+
let warnings = vec![];
|
|
291
|
+
|
|
292
|
+
// Store in cache
|
|
293
|
+
cache.set(content, config_hash, "test_rules_hash", warnings.clone());
|
|
294
|
+
|
|
295
|
+
// Should hit cache
|
|
296
|
+
let cached = cache.get(content, config_hash, "test_rules_hash");
|
|
297
|
+
assert!(cached.is_some());
|
|
298
|
+
assert_eq!(cached.unwrap(), warnings);
|
|
299
|
+
assert_eq!(cache.stats().hits, 1);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
#[test]
|
|
303
|
+
fn test_cache_invalidation_on_content_change() {
|
|
304
|
+
let temp_dir = TempDir::new().unwrap();
|
|
305
|
+
let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
|
|
306
|
+
cache.init().unwrap();
|
|
307
|
+
|
|
308
|
+
let content1 = "# Test 1";
|
|
309
|
+
let content2 = "# Test 2";
|
|
310
|
+
let config_hash = "abc123";
|
|
311
|
+
|
|
312
|
+
// Cache content1
|
|
313
|
+
cache.set(content1, config_hash, "test_rules_hash", vec![]);
|
|
314
|
+
|
|
315
|
+
// content2 should miss (different content)
|
|
316
|
+
assert!(cache.get(content2, config_hash, "test_rules_hash").is_none());
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
#[test]
|
|
320
|
+
fn test_cache_invalidation_on_config_change() {
|
|
321
|
+
let temp_dir = TempDir::new().unwrap();
|
|
322
|
+
let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
|
|
323
|
+
cache.init().unwrap();
|
|
324
|
+
|
|
325
|
+
let content = "# Test";
|
|
326
|
+
let config_hash1 = "abc123";
|
|
327
|
+
let config_hash2 = "def456";
|
|
328
|
+
|
|
329
|
+
// Cache with config1
|
|
330
|
+
cache.set(content, config_hash1, "test_rules_hash", vec![]);
|
|
331
|
+
|
|
332
|
+
// Should miss with config2 (different config)
|
|
333
|
+
assert!(cache.get(content, config_hash2, "test_rules_hash").is_none());
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
#[test]
|
|
337
|
+
fn test_hash_content() {
|
|
338
|
+
let content1 = "# Test";
|
|
339
|
+
let content2 = "# Test";
|
|
340
|
+
let content3 = "# Different";
|
|
341
|
+
|
|
342
|
+
let hash1 = LintCache::hash_content(content1);
|
|
343
|
+
let hash2 = LintCache::hash_content(content2);
|
|
344
|
+
let hash3 = LintCache::hash_content(content3);
|
|
345
|
+
|
|
346
|
+
// Same content should produce same hash
|
|
347
|
+
assert_eq!(hash1, hash2);
|
|
348
|
+
|
|
349
|
+
// Different content should produce different hash
|
|
350
|
+
assert_ne!(hash1, hash3);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
#[test]
|
|
354
|
+
fn test_cache_stats() {
|
|
355
|
+
let temp_dir = TempDir::new().unwrap();
|
|
356
|
+
let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
|
|
357
|
+
cache.init().unwrap();
|
|
358
|
+
|
|
359
|
+
let content = "# Test";
|
|
360
|
+
let config_hash = "abc123";
|
|
361
|
+
|
|
362
|
+
// Miss
|
|
363
|
+
cache.get(content, config_hash, "test_rules_hash");
|
|
364
|
+
assert_eq!(cache.stats().misses, 1);
|
|
365
|
+
assert_eq!(cache.stats().hits, 0);
|
|
366
|
+
|
|
367
|
+
// Write
|
|
368
|
+
cache.set(content, config_hash, "test_rules_hash", vec![]);
|
|
369
|
+
assert_eq!(cache.stats().writes, 1);
|
|
370
|
+
|
|
371
|
+
// Hit
|
|
372
|
+
cache.get(content, config_hash, "test_rules_hash");
|
|
373
|
+
assert_eq!(cache.stats().hits, 1);
|
|
374
|
+
|
|
375
|
+
// Hit rate
|
|
376
|
+
assert_eq!(cache.stats().hit_rate(), 50.0); // 1 hit out of 2 total
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
#[test]
|
|
380
|
+
fn test_cache_clear() {
|
|
381
|
+
let temp_dir = TempDir::new().unwrap();
|
|
382
|
+
let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
|
|
383
|
+
cache.init().unwrap();
|
|
384
|
+
|
|
385
|
+
// Add something to cache
|
|
386
|
+
cache.set("# Test", "abc", "test_rules_hash", vec![]);
|
|
387
|
+
|
|
388
|
+
// Clear cache
|
|
389
|
+
cache.clear().unwrap();
|
|
390
|
+
|
|
391
|
+
// Cache directory should be gone
|
|
392
|
+
assert!(!cache.cache_dir.exists());
|
|
393
|
+
}
|
|
394
|
+
}
|