rumdl 0.0.114__tar.gz → 0.0.115__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.114 → rumdl-0.0.115}/.config/nextest.toml +24 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/CHANGELOG.md +4 -1
- {rumdl-0.0.114 → rumdl-0.0.115}/Cargo.lock +17 -17
- {rumdl-0.0.114 → rumdl-0.0.115}/Cargo.toml +1 -1
- {rumdl-0.0.114 → rumdl-0.0.115}/Makefile +5 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/PKG-INFO +1 -1
- {rumdl-0.0.114 → rumdl-0.0.115}/src/config.rs +112 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/main.rs +26 -1
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md051_link_fragments.rs +185 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/comprehensive_output_format_tests.rs +9 -7
- rumdl-0.0.115/tests/fixable_unfixable_config_test.rs +227 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md026_test.rs +3 -3
- {rumdl-0.0.114 → rumdl-0.0.115}/.mise.toml +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/.rumdl.toml +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/.rustfmt.toml +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/LICENSE +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/MANIFEST.in +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/README.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/assets/logo.png +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benches/range_performance.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/RULES.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/global-settings.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md001.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md002.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md003.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md004.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md005.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md006.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md007.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md009.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md010.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md011.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md012.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md013.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md014.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md018.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md019.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md020.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md021.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md022.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md023.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md024.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md025.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md026.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md027.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md028.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md029.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md030.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md031.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md032.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md033.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md034.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md035.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md036.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md037.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md038.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md039.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md040.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md041.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md042.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md043.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md044.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md045.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md046.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md047.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md048.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md049.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md050.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md051.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md052.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md053.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md054.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md055.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md056.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md057.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/md058.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/parity_check.py +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/pyproject.toml +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/python/MANIFEST.in +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/rumdl.toml.example +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/rust-toolchain.toml +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/scripts/generate-downloads-table.sh +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/scripts/pre-release.sh +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/exit_codes.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/inline_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/lib.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/lint_context.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/lsp/server.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/lsp/types.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/output/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/parallel.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/performance.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/profiling.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/python.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rule.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rule_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/kramdown_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/src/vscode.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/common/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/config_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/init_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/kramdown_integration_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/lib.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/perf_check.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md026_kramdown_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md033_kramdown_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md037_kramdown_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md051_unicode_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.114 → rumdl-0.0.115}/tests/vscode_windows_test.rs +0 -0
|
@@ -22,6 +22,10 @@ status-level = "pass"
|
|
|
22
22
|
|
|
23
23
|
[profile.ci]
|
|
24
24
|
|
|
25
|
+
# Skip performance tests in CI (they're flaky due to resource variability)
|
|
26
|
+
# Exclude specific integration test binaries and performance-related test functions
|
|
27
|
+
default-filter = 'not (package(rumdl) and binary(deeply_nested_lists_performance_test)) and not (package(rumdl) and binary(performance_validation_tests)) and not (package(rumdl) and binary(perf_check)) and not test(/performance|benchmark/)'
|
|
28
|
+
|
|
25
29
|
# More conservative in CI
|
|
26
30
|
test-threads = "num-cpus"
|
|
27
31
|
|
|
@@ -80,3 +84,23 @@ retries = 0
|
|
|
80
84
|
|
|
81
85
|
# Fail fast on first failure
|
|
82
86
|
fail-fast = true
|
|
87
|
+
|
|
88
|
+
# Performance testing profile - for scheduled/manual runs
|
|
89
|
+
[profile.performance]
|
|
90
|
+
|
|
91
|
+
# Only run performance and benchmark tests
|
|
92
|
+
default-filter = 'test(performance) or test(benchmark) or test(deeply_nested)'
|
|
93
|
+
|
|
94
|
+
# Run tests serially to reduce noise
|
|
95
|
+
test-threads = 1
|
|
96
|
+
|
|
97
|
+
# Show detailed output
|
|
98
|
+
failure-output = "immediate"
|
|
99
|
+
success-output = "immediate"
|
|
100
|
+
status-level = "all"
|
|
101
|
+
|
|
102
|
+
# Allow retries for flaky tests
|
|
103
|
+
retries = { backoff = "exponential", count = 3, delay = "1s", max-delay = "10s" }
|
|
104
|
+
|
|
105
|
+
# Don't fail fast - run all performance tests
|
|
106
|
+
fail-fast = false
|
|
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.115] - 2025-08-12
|
|
11
|
+
|
|
10
12
|
## [0.0.114] - 2025-08-09
|
|
11
13
|
|
|
12
14
|
## [0.0.113] - 2025-08-09
|
|
@@ -308,7 +310,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
308
310
|
|
|
309
311
|
- Initial implementation of remaining rules for markdownlint parity
|
|
310
312
|
|
|
311
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
313
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.115...HEAD
|
|
314
|
+
[0.0.115]: https://github.com/rvben/rumdl/compare/v0.0.114...v0.0.115
|
|
312
315
|
[0.0.114]: https://github.com/rvben/rumdl/compare/v0.0.113...v0.0.114
|
|
313
316
|
[0.0.113]: https://github.com/rvben/rumdl/compare/v0.0.112...v0.0.113
|
|
314
317
|
[0.0.112]: https://github.com/rvben/rumdl/compare/v0.0.111...v0.0.112
|
|
@@ -99,9 +99,9 @@ dependencies = [
|
|
|
99
99
|
|
|
100
100
|
[[package]]
|
|
101
101
|
name = "anyhow"
|
|
102
|
-
version = "1.0.
|
|
102
|
+
version = "1.0.99"
|
|
103
103
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
104
|
-
checksum = "
|
|
104
|
+
checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
|
|
105
105
|
|
|
106
106
|
[[package]]
|
|
107
107
|
name = "assert_cmd"
|
|
@@ -277,9 +277,9 @@ dependencies = [
|
|
|
277
277
|
|
|
278
278
|
[[package]]
|
|
279
279
|
name = "clap"
|
|
280
|
-
version = "4.5.
|
|
280
|
+
version = "4.5.45"
|
|
281
281
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
282
|
-
checksum = "
|
|
282
|
+
checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318"
|
|
283
283
|
dependencies = [
|
|
284
284
|
"clap_builder",
|
|
285
285
|
"clap_derive",
|
|
@@ -287,9 +287,9 @@ dependencies = [
|
|
|
287
287
|
|
|
288
288
|
[[package]]
|
|
289
289
|
name = "clap_builder"
|
|
290
|
-
version = "4.5.
|
|
290
|
+
version = "4.5.44"
|
|
291
291
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
292
|
-
checksum = "
|
|
292
|
+
checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8"
|
|
293
293
|
dependencies = [
|
|
294
294
|
"anstream",
|
|
295
295
|
"anstyle",
|
|
@@ -299,9 +299,9 @@ dependencies = [
|
|
|
299
299
|
|
|
300
300
|
[[package]]
|
|
301
301
|
name = "clap_derive"
|
|
302
|
-
version = "4.5.
|
|
302
|
+
version = "4.5.45"
|
|
303
303
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
304
|
-
checksum = "
|
|
304
|
+
checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6"
|
|
305
305
|
dependencies = [
|
|
306
306
|
"heck",
|
|
307
307
|
"proc-macro2",
|
|
@@ -951,9 +951,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|
|
951
951
|
|
|
952
952
|
[[package]]
|
|
953
953
|
name = "libc"
|
|
954
|
-
version = "0.2.
|
|
954
|
+
version = "0.2.175"
|
|
955
955
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
956
|
-
checksum = "
|
|
956
|
+
checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
|
|
957
957
|
|
|
958
958
|
[[package]]
|
|
959
959
|
name = "linux-raw-sys"
|
|
@@ -1265,9 +1265,9 @@ dependencies = [
|
|
|
1265
1265
|
|
|
1266
1266
|
[[package]]
|
|
1267
1267
|
name = "proc-macro2"
|
|
1268
|
-
version = "1.0.
|
|
1268
|
+
version = "1.0.97"
|
|
1269
1269
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1270
|
-
checksum = "
|
|
1270
|
+
checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1"
|
|
1271
1271
|
dependencies = [
|
|
1272
1272
|
"unicode-ident",
|
|
1273
1273
|
]
|
|
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
|
|
1493
1493
|
|
|
1494
1494
|
[[package]]
|
|
1495
1495
|
name = "rumdl"
|
|
1496
|
-
version = "0.0.
|
|
1496
|
+
version = "0.0.115"
|
|
1497
1497
|
dependencies = [
|
|
1498
1498
|
"anyhow",
|
|
1499
1499
|
"assert_cmd",
|
|
@@ -1770,18 +1770,18 @@ checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683"
|
|
|
1770
1770
|
|
|
1771
1771
|
[[package]]
|
|
1772
1772
|
name = "thiserror"
|
|
1773
|
-
version = "2.0.
|
|
1773
|
+
version = "2.0.14"
|
|
1774
1774
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1775
|
-
checksum = "
|
|
1775
|
+
checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e"
|
|
1776
1776
|
dependencies = [
|
|
1777
1777
|
"thiserror-impl",
|
|
1778
1778
|
]
|
|
1779
1779
|
|
|
1780
1780
|
[[package]]
|
|
1781
1781
|
name = "thiserror-impl"
|
|
1782
|
-
version = "2.0.
|
|
1782
|
+
version = "2.0.14"
|
|
1783
1783
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1784
|
-
checksum = "
|
|
1784
|
+
checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227"
|
|
1785
1785
|
dependencies = [
|
|
1786
1786
|
"proc-macro2",
|
|
1787
1787
|
"quote",
|
|
@@ -101,6 +101,11 @@ test-push:
|
|
|
101
101
|
test-ci:
|
|
102
102
|
cargo nextest run --profile ci
|
|
103
103
|
|
|
104
|
+
test-performance:
|
|
105
|
+
@echo "Running performance tests (this may take a few minutes)..."
|
|
106
|
+
@echo "Tests run serially to reduce noise - be patient!"
|
|
107
|
+
cargo nextest run --profile performance
|
|
108
|
+
|
|
104
109
|
clean:
|
|
105
110
|
cargo clean
|
|
106
111
|
|
|
@@ -90,6 +90,16 @@ pub struct GlobalConfig {
|
|
|
90
90
|
/// Output format for linting results (e.g., "text", "json", "pylint", etc.)
|
|
91
91
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
92
92
|
pub output_format: Option<String>,
|
|
93
|
+
|
|
94
|
+
/// Rules that are allowed to be fixed when --fix is used
|
|
95
|
+
/// If specified, only these rules will be fixed
|
|
96
|
+
#[serde(default)]
|
|
97
|
+
pub fixable: Vec<String>,
|
|
98
|
+
|
|
99
|
+
/// Rules that should never be fixed, even when --fix is used
|
|
100
|
+
/// Takes precedence over fixable
|
|
101
|
+
#[serde(default)]
|
|
102
|
+
pub unfixable: Vec<String>,
|
|
93
103
|
}
|
|
94
104
|
|
|
95
105
|
fn default_respect_gitignore() -> bool {
|
|
@@ -111,6 +121,8 @@ impl Default for GlobalConfig {
|
|
|
111
121
|
respect_gitignore: true,
|
|
112
122
|
line_length: 80,
|
|
113
123
|
output_format: None,
|
|
124
|
+
fixable: Vec::new(),
|
|
125
|
+
unfixable: Vec::new(),
|
|
114
126
|
}
|
|
115
127
|
}
|
|
116
128
|
}
|
|
@@ -999,6 +1011,8 @@ pub struct SourcedGlobalConfig {
|
|
|
999
1011
|
pub respect_gitignore: SourcedValue<bool>,
|
|
1000
1012
|
pub line_length: SourcedValue<u64>,
|
|
1001
1013
|
pub output_format: Option<SourcedValue<String>>,
|
|
1014
|
+
pub fixable: SourcedValue<Vec<String>>,
|
|
1015
|
+
pub unfixable: SourcedValue<Vec<String>>,
|
|
1002
1016
|
}
|
|
1003
1017
|
|
|
1004
1018
|
impl Default for SourcedGlobalConfig {
|
|
@@ -1011,6 +1025,8 @@ impl Default for SourcedGlobalConfig {
|
|
|
1011
1025
|
respect_gitignore: SourcedValue::new(true, ConfigSource::Default),
|
|
1012
1026
|
line_length: SourcedValue::new(80, ConfigSource::Default),
|
|
1013
1027
|
output_format: None,
|
|
1028
|
+
fixable: SourcedValue::new(Vec::new(), ConfigSource::Default),
|
|
1029
|
+
unfixable: SourcedValue::new(Vec::new(), ConfigSource::Default),
|
|
1014
1030
|
}
|
|
1015
1031
|
}
|
|
1016
1032
|
}
|
|
@@ -1077,6 +1093,29 @@ impl SourcedConfig {
|
|
|
1077
1093
|
.and_then(|o| o.file.clone()),
|
|
1078
1094
|
fragment.global.respect_gitignore.overrides.first().and_then(|o| o.line),
|
|
1079
1095
|
);
|
|
1096
|
+
self.global.line_length.merge_override(
|
|
1097
|
+
fragment.global.line_length.value,
|
|
1098
|
+
fragment.global.line_length.source,
|
|
1099
|
+
fragment
|
|
1100
|
+
.global
|
|
1101
|
+
.line_length
|
|
1102
|
+
.overrides
|
|
1103
|
+
.first()
|
|
1104
|
+
.and_then(|o| o.file.clone()),
|
|
1105
|
+
fragment.global.line_length.overrides.first().and_then(|o| o.line),
|
|
1106
|
+
);
|
|
1107
|
+
self.global.fixable.merge_override(
|
|
1108
|
+
fragment.global.fixable.value,
|
|
1109
|
+
fragment.global.fixable.source,
|
|
1110
|
+
fragment.global.fixable.overrides.first().and_then(|o| o.file.clone()),
|
|
1111
|
+
fragment.global.fixable.overrides.first().and_then(|o| o.line),
|
|
1112
|
+
);
|
|
1113
|
+
self.global.unfixable.merge_override(
|
|
1114
|
+
fragment.global.unfixable.value,
|
|
1115
|
+
fragment.global.unfixable.source,
|
|
1116
|
+
fragment.global.unfixable.overrides.first().and_then(|o| o.file.clone()),
|
|
1117
|
+
fragment.global.unfixable.overrides.first().and_then(|o| o.line),
|
|
1118
|
+
);
|
|
1080
1119
|
|
|
1081
1120
|
// Merge output_format if present
|
|
1082
1121
|
if let Some(output_format_fragment) = fragment.global.output_format {
|
|
@@ -1269,6 +1308,14 @@ impl SourcedConfig {
|
|
|
1269
1308
|
None,
|
|
1270
1309
|
None,
|
|
1271
1310
|
);
|
|
1311
|
+
sourced_config
|
|
1312
|
+
.global
|
|
1313
|
+
.fixable
|
|
1314
|
+
.merge_override(cli.fixable.value.clone(), ConfigSource::Cli, None, None);
|
|
1315
|
+
sourced_config
|
|
1316
|
+
.global
|
|
1317
|
+
.unfixable
|
|
1318
|
+
.merge_override(cli.unfixable.value.clone(), ConfigSource::Cli, None, None);
|
|
1272
1319
|
// No rule-specific CLI overrides implemented yet
|
|
1273
1320
|
}
|
|
1274
1321
|
|
|
@@ -1298,6 +1345,8 @@ impl From<SourcedConfig> for Config {
|
|
|
1298
1345
|
respect_gitignore: sourced.global.respect_gitignore.value,
|
|
1299
1346
|
line_length: sourced.global.line_length.value,
|
|
1300
1347
|
output_format: sourced.global.output_format.as_ref().map(|v| v.value.clone()),
|
|
1348
|
+
fixable: sourced.global.fixable.value,
|
|
1349
|
+
unfixable: sourced.global.unfixable.value,
|
|
1301
1350
|
};
|
|
1302
1351
|
Config { global, rules }
|
|
1303
1352
|
}
|
|
@@ -1549,6 +1598,24 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
|
|
|
1549
1598
|
.push_override(value, source, file.clone(), None);
|
|
1550
1599
|
}
|
|
1551
1600
|
}
|
|
1601
|
+
if let Some(fixable) = rumdl_table.get("fixable")
|
|
1602
|
+
&& let Ok(values) = Vec::<String>::deserialize(fixable.clone())
|
|
1603
|
+
{
|
|
1604
|
+
let normalized_values = values.into_iter().map(|s| normalize_key(&s)).collect();
|
|
1605
|
+
fragment
|
|
1606
|
+
.global
|
|
1607
|
+
.fixable
|
|
1608
|
+
.push_override(normalized_values, source, file.clone(), None);
|
|
1609
|
+
}
|
|
1610
|
+
if let Some(unfixable) = rumdl_table.get("unfixable")
|
|
1611
|
+
&& let Ok(values) = Vec::<String>::deserialize(unfixable.clone())
|
|
1612
|
+
{
|
|
1613
|
+
let normalized_values = values.into_iter().map(|s| normalize_key(&s)).collect();
|
|
1614
|
+
fragment
|
|
1615
|
+
.global
|
|
1616
|
+
.unfixable
|
|
1617
|
+
.push_override(normalized_values, source, file.clone(), None);
|
|
1618
|
+
}
|
|
1552
1619
|
|
|
1553
1620
|
// --- Re-introduce special line-length handling ---
|
|
1554
1621
|
let mut found_line_length_val: Option<toml::Value> = None;
|
|
@@ -1590,6 +1657,8 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
|
|
|
1590
1657
|
"line-length",
|
|
1591
1658
|
"output_format",
|
|
1592
1659
|
"output-format",
|
|
1660
|
+
"fixable",
|
|
1661
|
+
"unfixable",
|
|
1593
1662
|
]
|
|
1594
1663
|
.contains(&norm_rule_key.as_str())
|
|
1595
1664
|
{
|
|
@@ -1683,6 +1752,9 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
|
|
|
1683
1752
|
|| !fragment.global.disable.value.is_empty()
|
|
1684
1753
|
|| !fragment.global.include.value.is_empty()
|
|
1685
1754
|
|| !fragment.global.exclude.value.is_empty()
|
|
1755
|
+
|| !fragment.global.fixable.value.is_empty()
|
|
1756
|
+
|| !fragment.global.unfixable.value.is_empty()
|
|
1757
|
+
|| fragment.global.output_format.is_some()
|
|
1686
1758
|
|| !fragment.rules.is_empty();
|
|
1687
1759
|
if has_any { Ok(Some(fragment)) } else { Ok(None) }
|
|
1688
1760
|
}
|
|
@@ -1820,6 +1892,46 @@ fn parse_rumdl_toml(content: &str, path: &str) -> Result<SourcedConfigFragment,
|
|
|
1820
1892
|
);
|
|
1821
1893
|
}
|
|
1822
1894
|
}
|
|
1895
|
+
"fixable" => {
|
|
1896
|
+
if let Some(toml_edit::Value::Array(formatted_array)) = value_item.as_value() {
|
|
1897
|
+
let values: Vec<String> = formatted_array
|
|
1898
|
+
.iter()
|
|
1899
|
+
.filter_map(|item| item.as_str())
|
|
1900
|
+
.map(normalize_key)
|
|
1901
|
+
.collect();
|
|
1902
|
+
fragment
|
|
1903
|
+
.global
|
|
1904
|
+
.fixable
|
|
1905
|
+
.push_override(values, source, file.clone(), None);
|
|
1906
|
+
} else {
|
|
1907
|
+
log::warn!(
|
|
1908
|
+
"[WARN] Expected array for global key '{}' in {}, found {}",
|
|
1909
|
+
key,
|
|
1910
|
+
path,
|
|
1911
|
+
value_item.type_name()
|
|
1912
|
+
);
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
"unfixable" => {
|
|
1916
|
+
if let Some(toml_edit::Value::Array(formatted_array)) = value_item.as_value() {
|
|
1917
|
+
let values: Vec<String> = formatted_array
|
|
1918
|
+
.iter()
|
|
1919
|
+
.filter_map(|item| item.as_str())
|
|
1920
|
+
.map(normalize_key)
|
|
1921
|
+
.collect();
|
|
1922
|
+
fragment
|
|
1923
|
+
.global
|
|
1924
|
+
.unfixable
|
|
1925
|
+
.push_override(values, source, file.clone(), None);
|
|
1926
|
+
} else {
|
|
1927
|
+
log::warn!(
|
|
1928
|
+
"[WARN] Expected array for global key '{}' in {}, found {}",
|
|
1929
|
+
key,
|
|
1930
|
+
path,
|
|
1931
|
+
value_item.type_name()
|
|
1932
|
+
);
|
|
1933
|
+
}
|
|
1934
|
+
}
|
|
1823
1935
|
_ => {
|
|
1824
1936
|
// Add to unknown_keys for potential validation later
|
|
1825
1937
|
// fragment.unknown_keys.push(("[global]".to_string(), key.to_string()));
|
|
@@ -2044,6 +2044,7 @@ fn run_check(args: &CheckArgs, global_config_path: Option<&str>, no_config: bool
|
|
|
2044
2044
|
quiet,
|
|
2045
2045
|
&output_format,
|
|
2046
2046
|
&output_writer,
|
|
2047
|
+
&config,
|
|
2047
2048
|
)
|
|
2048
2049
|
})
|
|
2049
2050
|
.collect();
|
|
@@ -2098,6 +2099,7 @@ fn run_check(args: &CheckArgs, global_config_path: Option<&str>, no_config: bool
|
|
|
2098
2099
|
quiet,
|
|
2099
2100
|
&output_format,
|
|
2100
2101
|
&output_writer,
|
|
2102
|
+
&config,
|
|
2101
2103
|
);
|
|
2102
2104
|
|
|
2103
2105
|
total_files_processed += 1;
|
|
@@ -2354,6 +2356,7 @@ fn print_statistics(warnings: &[rumdl::rule::LintWarning]) {
|
|
|
2354
2356
|
}
|
|
2355
2357
|
|
|
2356
2358
|
// Process file with output formatter
|
|
2359
|
+
#[allow(clippy::too_many_arguments)]
|
|
2357
2360
|
fn process_file_with_formatter(
|
|
2358
2361
|
file_path: &str,
|
|
2359
2362
|
rules: &[Box<dyn Rule>],
|
|
@@ -2362,6 +2365,7 @@ fn process_file_with_formatter(
|
|
|
2362
2365
|
quiet: bool,
|
|
2363
2366
|
output_format: &rumdl::output::OutputFormat,
|
|
2364
2367
|
output_writer: &rumdl::output::OutputWriter,
|
|
2368
|
+
config: &rumdl_config::Config,
|
|
2365
2369
|
) -> (bool, usize, usize, usize, Vec<rumdl::rule::LintWarning>) {
|
|
2366
2370
|
let formatter = output_format.create_formatter();
|
|
2367
2371
|
|
|
@@ -2387,7 +2391,7 @@ fn process_file_with_formatter(
|
|
|
2387
2391
|
// Fix issues if requested
|
|
2388
2392
|
let mut warnings_fixed = 0;
|
|
2389
2393
|
if _fix {
|
|
2390
|
-
warnings_fixed = apply_fixes(rules, &all_warnings, &mut content, file_path, quiet);
|
|
2394
|
+
warnings_fixed = apply_fixes(rules, &all_warnings, &mut content, file_path, quiet, config);
|
|
2391
2395
|
|
|
2392
2396
|
// In fix mode, show warnings with [fixed] for issues that were fixed
|
|
2393
2397
|
if !quiet {
|
|
@@ -2528,6 +2532,7 @@ fn apply_fixes(
|
|
|
2528
2532
|
content: &mut String,
|
|
2529
2533
|
file_path: &str,
|
|
2530
2534
|
quiet: bool,
|
|
2535
|
+
config: &rumdl_config::Config,
|
|
2531
2536
|
) -> usize {
|
|
2532
2537
|
let mut warnings_fixed = 0;
|
|
2533
2538
|
|
|
@@ -2549,6 +2554,26 @@ fn apply_fixes(
|
|
|
2549
2554
|
});
|
|
2550
2555
|
|
|
2551
2556
|
if has_non_disabled_warnings {
|
|
2557
|
+
// Check fixable/unfixable configuration
|
|
2558
|
+
let rule_name = rule.name();
|
|
2559
|
+
|
|
2560
|
+
// If unfixable list contains this rule, skip fixing
|
|
2561
|
+
if config
|
|
2562
|
+
.global
|
|
2563
|
+
.unfixable
|
|
2564
|
+
.iter()
|
|
2565
|
+
.any(|r| r.eq_ignore_ascii_case(rule_name))
|
|
2566
|
+
{
|
|
2567
|
+
continue;
|
|
2568
|
+
}
|
|
2569
|
+
|
|
2570
|
+
// If fixable list is specified and doesn't contain this rule, skip fixing
|
|
2571
|
+
if !config.global.fixable.is_empty()
|
|
2572
|
+
&& !config.global.fixable.iter().any(|r| r.eq_ignore_ascii_case(rule_name))
|
|
2573
|
+
{
|
|
2574
|
+
continue;
|
|
2575
|
+
}
|
|
2576
|
+
|
|
2552
2577
|
let ctx = LintContext::new(content);
|
|
2553
2578
|
match rule.fix(&ctx) {
|
|
2554
2579
|
Ok(fixed_content) => {
|
|
@@ -399,6 +399,22 @@ impl MD051LinkFragments {
|
|
|
399
399
|
return false;
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
+
// Check for Liquid syntax used by Jekyll and other static site generators
|
|
403
|
+
// Liquid tags: {% ... %} for control flow and includes
|
|
404
|
+
// Liquid variables: {{ ... }} for outputting values
|
|
405
|
+
// These are template directives that reference external content and should be skipped
|
|
406
|
+
// We check for proper bracket order to avoid false positives
|
|
407
|
+
if let Some(tag_start) = path_part.find("{%")
|
|
408
|
+
&& path_part[tag_start + 2..].contains("%}")
|
|
409
|
+
{
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
if let Some(var_start) = path_part.find("{{")
|
|
413
|
+
&& path_part[var_start + 2..].contains("}}")
|
|
414
|
+
{
|
|
415
|
+
return true;
|
|
416
|
+
}
|
|
417
|
+
|
|
402
418
|
// Check if it looks like a file path:
|
|
403
419
|
// - Contains a file extension (dot followed by letters)
|
|
404
420
|
// - Contains path separators
|
|
@@ -750,4 +766,173 @@ mod tests {
|
|
|
750
766
|
assert_eq!(result.len(), 1);
|
|
751
767
|
assert!(result[0].message.contains("#testwithunderscores"));
|
|
752
768
|
}
|
|
769
|
+
|
|
770
|
+
#[test]
|
|
771
|
+
fn test_liquid_tags_ignored() {
|
|
772
|
+
let rule = MD051LinkFragments::new();
|
|
773
|
+
|
|
774
|
+
// Test various Liquid tag patterns with fragments (commonly used by Jekyll)
|
|
775
|
+
let content = r#"# Test Liquid Tag Links
|
|
776
|
+
|
|
777
|
+
## CVE-2022-0811
|
|
778
|
+
|
|
779
|
+
This is a heading that exists.
|
|
780
|
+
|
|
781
|
+
## Some Anchor
|
|
782
|
+
|
|
783
|
+
Another heading.
|
|
784
|
+
|
|
785
|
+
## Technical Details
|
|
786
|
+
|
|
787
|
+
More content here.
|
|
788
|
+
|
|
789
|
+
### Testing Liquid cross-file links
|
|
790
|
+
|
|
791
|
+
[Liquid post_url link]({% post_url 2023-03-25-htb-vessel %}#cve-2022-0811)
|
|
792
|
+
[Another Liquid link]({% post_url 2023-09-09-htb-pikatwoo %}#some-anchor)
|
|
793
|
+
[Third Liquid link]({% post_url 2024-01-15-some-post %}#technical-details)
|
|
794
|
+
|
|
795
|
+
### Testing Liquid include with fragment
|
|
796
|
+
|
|
797
|
+
[Liquid include link]({% include file.html %}#section)
|
|
798
|
+
|
|
799
|
+
### Testing other liquid tags
|
|
800
|
+
|
|
801
|
+
[Liquid link tag]({% link _posts/2023-01-01-post.md %}#heading)
|
|
802
|
+
[Liquid variable]({{ site.url }}/page#fragment)
|
|
803
|
+
|
|
804
|
+
### Regular links that should still be validated
|
|
805
|
+
|
|
806
|
+
[Valid internal link](#some-anchor)
|
|
807
|
+
[Invalid internal link](#non-existent-anchor)
|
|
808
|
+
"#;
|
|
809
|
+
|
|
810
|
+
let ctx = LintContext::new(content);
|
|
811
|
+
let result = rule.check(&ctx).unwrap();
|
|
812
|
+
|
|
813
|
+
// Only the invalid internal link should trigger a warning
|
|
814
|
+
// All Liquid tag links should be ignored
|
|
815
|
+
assert_eq!(
|
|
816
|
+
result.len(),
|
|
817
|
+
1,
|
|
818
|
+
"Should only have one warning for the invalid internal link"
|
|
819
|
+
);
|
|
820
|
+
assert!(
|
|
821
|
+
result[0].message.contains("#non-existent-anchor"),
|
|
822
|
+
"Warning should be for the non-existent anchor, not Liquid tag links"
|
|
823
|
+
);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
#[test]
|
|
827
|
+
fn test_liquid_variables_ignored() {
|
|
828
|
+
let rule = MD051LinkFragments::new();
|
|
829
|
+
|
|
830
|
+
// Test Liquid variable patterns ({{ }}) with fragments
|
|
831
|
+
let content = r#"# Test Liquid Variables
|
|
832
|
+
|
|
833
|
+
## Valid Section
|
|
834
|
+
|
|
835
|
+
This section exists.
|
|
836
|
+
|
|
837
|
+
## Links with Liquid Variables
|
|
838
|
+
|
|
839
|
+
These should NOT be flagged as invalid:
|
|
840
|
+
|
|
841
|
+
- [Site URL]({{ site.url }}/page#anchor)
|
|
842
|
+
- [Page URL]({{ page.url }}#fragment)
|
|
843
|
+
- [Base URL]({{ site.baseurl }}/docs#section)
|
|
844
|
+
- [Variable Path]({{ post.url }}#heading)
|
|
845
|
+
"#;
|
|
846
|
+
|
|
847
|
+
let ctx = LintContext::new(content);
|
|
848
|
+
let result = rule.check(&ctx).unwrap();
|
|
849
|
+
|
|
850
|
+
// No errors should be found for Liquid variable links
|
|
851
|
+
assert_eq!(result.len(), 0, "Liquid variable links should not be flagged");
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
#[test]
|
|
855
|
+
fn test_liquid_post_url_regression() {
|
|
856
|
+
// Specific test for the regression reported in issue #39 comments
|
|
857
|
+
let rule = MD051LinkFragments::new();
|
|
858
|
+
let content = r#"# Post Title
|
|
859
|
+
|
|
860
|
+
This is very similar to what I did on [Vessel]({% post_url 2023-03-25-htb-vessel %}#cve-2022-0811), though through Kubernetes this time.
|
|
861
|
+
|
|
862
|
+
## Some Section
|
|
863
|
+
|
|
864
|
+
Content here.
|
|
865
|
+
"#;
|
|
866
|
+
|
|
867
|
+
let ctx = LintContext::new(content);
|
|
868
|
+
let result = rule.check(&ctx).unwrap();
|
|
869
|
+
|
|
870
|
+
// Should have no warnings - Liquid tag link should be ignored
|
|
871
|
+
assert_eq!(
|
|
872
|
+
result.len(),
|
|
873
|
+
0,
|
|
874
|
+
"Liquid post_url tags should not trigger MD051 warnings"
|
|
875
|
+
);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
#[test]
|
|
879
|
+
fn test_mixed_liquid_and_regular_links() {
|
|
880
|
+
let rule = MD051LinkFragments::new();
|
|
881
|
+
let content = r#"# Mixed Links Test
|
|
882
|
+
|
|
883
|
+
## Valid Section
|
|
884
|
+
|
|
885
|
+
Some content.
|
|
886
|
+
|
|
887
|
+
## Another Section
|
|
888
|
+
|
|
889
|
+
More content.
|
|
890
|
+
|
|
891
|
+
### Links
|
|
892
|
+
|
|
893
|
+
[Liquid tag link]({% post_url 2023-01-01-post %}#section) - should be ignored
|
|
894
|
+
[Valid link](#valid-section) - should pass
|
|
895
|
+
[Invalid link](#invalid-section) - should fail
|
|
896
|
+
[Another Liquid tag]({% include file.md %}#part) - should be ignored
|
|
897
|
+
[Cross-file](other.md#heading) - should be ignored (cross-file)
|
|
898
|
+
"#;
|
|
899
|
+
|
|
900
|
+
let ctx = LintContext::new(content);
|
|
901
|
+
let result = rule.check(&ctx).unwrap();
|
|
902
|
+
|
|
903
|
+
// Only the invalid internal link should fail
|
|
904
|
+
assert_eq!(result.len(), 1, "Should only warn about the invalid internal link");
|
|
905
|
+
assert!(result[0].message.contains("#invalid-section"));
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
#[test]
|
|
909
|
+
fn test_liquid_syntax_detection() {
|
|
910
|
+
// Test Liquid tags ({% %})
|
|
911
|
+
assert!(MD051LinkFragments::is_cross_file_link(
|
|
912
|
+
"{% post_url 2023-03-25-htb-vessel %}#cve-2022-0811"
|
|
913
|
+
));
|
|
914
|
+
assert!(MD051LinkFragments::is_cross_file_link(
|
|
915
|
+
"{% link _posts/2023-03-25-post.md %}#section"
|
|
916
|
+
));
|
|
917
|
+
assert!(MD051LinkFragments::is_cross_file_link(
|
|
918
|
+
"{% include anchor.html %}#fragment"
|
|
919
|
+
));
|
|
920
|
+
|
|
921
|
+
// Test Liquid variables ({{ }})
|
|
922
|
+
assert!(MD051LinkFragments::is_cross_file_link("{{ site.url }}/page#anchor"));
|
|
923
|
+
assert!(MD051LinkFragments::is_cross_file_link("{{ page.url }}#fragment"));
|
|
924
|
+
assert!(MD051LinkFragments::is_cross_file_link(
|
|
925
|
+
"{{ site.baseurl }}/docs#section"
|
|
926
|
+
));
|
|
927
|
+
assert!(MD051LinkFragments::is_cross_file_link("{{ post.url }}#heading"));
|
|
928
|
+
|
|
929
|
+
// Regular fragments should not be detected as Liquid
|
|
930
|
+
assert!(!MD051LinkFragments::is_cross_file_link("#regular-fragment"));
|
|
931
|
+
|
|
932
|
+
// Malformed or reversed brackets should not be detected as Liquid
|
|
933
|
+
assert!(!MD051LinkFragments::is_cross_file_link("%}{%#fragment"));
|
|
934
|
+
assert!(!MD051LinkFragments::is_cross_file_link("}}{{#fragment"));
|
|
935
|
+
assert!(!MD051LinkFragments::is_cross_file_link("%}some{%#fragment"));
|
|
936
|
+
assert!(!MD051LinkFragments::is_cross_file_link("}}text{{#fragment"));
|
|
937
|
+
}
|
|
753
938
|
}
|
|
@@ -7,11 +7,14 @@ fn create_test_file() -> (tempfile::TempDir, std::path::PathBuf) {
|
|
|
7
7
|
let temp_dir = tempdir().unwrap();
|
|
8
8
|
let test_file = temp_dir.path().join("test.md");
|
|
9
9
|
|
|
10
|
-
let content =
|
|
11
|
-
|
|
10
|
+
let content = format!(
|
|
11
|
+
r#"# Test Heading
|
|
12
|
+
Content with trailing space{}
|
|
12
13
|
## Second heading
|
|
13
14
|
More content
|
|
14
|
-
"
|
|
15
|
+
"#,
|
|
16
|
+
" " // Add trailing spaces programmatically to trigger MD009
|
|
17
|
+
);
|
|
15
18
|
|
|
16
19
|
fs::write(&test_file, content).unwrap();
|
|
17
20
|
(temp_dir, test_file)
|
|
@@ -70,7 +73,8 @@ fn test_grouped_output_format() {
|
|
|
70
73
|
.stdout(predicate::str::contains("MD022:"))
|
|
71
74
|
.stdout(predicate::str::contains("MD009:"))
|
|
72
75
|
.stdout(predicate::str::contains("1:1 Expected"))
|
|
73
|
-
.stdout(predicate::str::contains("2:28
|
|
76
|
+
.stdout(predicate::str::contains("2:28"))
|
|
77
|
+
.stdout(predicate::str::contains("trailing spaces"));
|
|
74
78
|
}
|
|
75
79
|
|
|
76
80
|
#[test]
|
|
@@ -225,9 +229,7 @@ fn test_output_format_with_fix_mode() {
|
|
|
225
229
|
let test_file = temp_dir.path().join("test.md");
|
|
226
230
|
|
|
227
231
|
// Create content with fixable issues
|
|
228
|
-
let content =
|
|
229
|
-
Content with trailing space
|
|
230
|
-
"#;
|
|
232
|
+
let content = "# Test\nContent with trailing space \n";
|
|
231
233
|
|
|
232
234
|
fs::write(&test_file, content).unwrap();
|
|
233
235
|
|