rumdl 0.0.93__tar.gz → 0.0.95__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.93 → rumdl-0.0.95}/CHANGELOG.md +19 -1
- {rumdl-0.0.93 → rumdl-0.0.95}/Cargo.lock +18 -18
- {rumdl-0.0.93 → rumdl-0.0.95}/Cargo.toml +1 -1
- {rumdl-0.0.93 → rumdl-0.0.95}/PKG-INFO +11 -1
- {rumdl-0.0.93 → rumdl-0.0.95}/README.md +10 -0
- rumdl-0.0.95/src/bin/benchmark_rule.rs +156 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/bin/measure_code_span_performance.rs +1 -1
- rumdl-0.0.95/src/exit_codes.rs +34 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/lib.rs +1 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/lint_context.rs +22 -6
- {rumdl-0.0.93 → rumdl-0.0.95}/src/main.rs +31 -31
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md009_trailing_spaces.rs +10 -12
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md013_line_length.rs +121 -36
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md034_no_bare_urls.rs +98 -119
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md038_no_space_in_code.rs +32 -11
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md044_proper_names.rs +93 -89
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md047_single_trailing_newline.rs +36 -21
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md052_reference_links_images.rs +7 -3
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md053_link_image_reference_definitions.rs +62 -48
- {rumdl-0.0.93 → rumdl-0.0.95}/.config/nextest.toml +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/.mise.toml +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/.rumdl.toml +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/.rustfmt.toml +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/LICENSE +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/MANIFEST.in +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/Makefile +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/assets/logo.png +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/benches/range_performance.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/RULES.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/global-settings.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md001.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md002.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md003.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md004.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md005.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md006.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md007.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md009.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md010.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md011.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md012.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md013.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md014.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md018.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md019.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md020.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md021.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md022.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md023.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md024.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md025.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md026.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md027.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md028.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md029.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md030.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md031.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md032.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md033.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md034.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md035.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md036.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md037.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md038.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md039.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md040.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md041.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md042.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md043.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md044.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md045.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md046.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md047.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md048.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md049.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md050.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md051.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md052.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md053.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md054.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md055.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md056.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md057.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/md058.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/parity_check.py +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/pyproject.toml +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/python/MANIFEST.in +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/rumdl.toml.example +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/rust-toolchain.toml +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/bin/benchmark.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/init.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/inline_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/lsp/server.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/lsp/types.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/output/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/parallel.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/performance.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/profiling.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/python.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rule.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rule_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/src/vscode.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/config_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/init_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/lib.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/perf_check.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md051_unicode_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.93 → rumdl-0.0.95}/tests/vscode_tests.rs +0 -0
|
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.95] - 2025-07-15
|
|
11
|
+
|
|
12
|
+
## [0.0.94] - 2025-07-04
|
|
13
|
+
|
|
14
|
+
### Performance Improvements
|
|
15
|
+
- Implemented lazy code span loading - 3.8x speedup for 94% of rules that don't use code spans
|
|
16
|
+
- MD013: 34.5% faster check operations through aggressive early returns
|
|
17
|
+
- MD038: 14% faster by leveraging lazy code span loading
|
|
18
|
+
- MD044: 93.5% faster with global regex caching
|
|
19
|
+
- MD047: 8.3% faster using pre-computed line data
|
|
20
|
+
- MD053: 39.7% faster by leveraging pre-parsed reference definitions
|
|
21
|
+
- Overall LintContext creation improved by 11.7%
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- MD053: Fixed escaped character handling in reference definitions
|
|
25
|
+
|
|
10
26
|
## [0.0.93] - 2025-07-03
|
|
11
27
|
|
|
12
28
|
## [0.0.92] - 2025-07-02
|
|
@@ -133,7 +149,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
133
149
|
|
|
134
150
|
- Initial implementation of remaining rules for markdownlint parity
|
|
135
151
|
|
|
136
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
152
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.95...HEAD
|
|
153
|
+
[0.0.95]: https://github.com/rvben/rumdl/compare/v0.0.94...v0.0.95
|
|
154
|
+
[0.0.94]: https://github.com/rvben/rumdl/compare/v0.0.93...v0.0.94
|
|
137
155
|
[0.0.93]: https://github.com/rvben/rumdl/compare/v0.0.92...v0.0.93
|
|
138
156
|
[0.0.92]: https://github.com/rvben/rumdl/compare/v0.0.91...v0.0.92
|
|
139
157
|
[0.0.91]: https://github.com/rvben/rumdl/compare/v0.0.90...v0.0.91
|
|
@@ -220,9 +220,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
|
|
220
220
|
|
|
221
221
|
[[package]]
|
|
222
222
|
name = "cc"
|
|
223
|
-
version = "1.2.
|
|
223
|
+
version = "1.2.29"
|
|
224
224
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
225
|
-
checksum = "
|
|
225
|
+
checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362"
|
|
226
226
|
dependencies = [
|
|
227
227
|
"shlex",
|
|
228
228
|
]
|
|
@@ -277,9 +277,9 @@ dependencies = [
|
|
|
277
277
|
|
|
278
278
|
[[package]]
|
|
279
279
|
name = "clap"
|
|
280
|
-
version = "4.5.
|
|
280
|
+
version = "4.5.41"
|
|
281
281
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
282
|
-
checksum = "
|
|
282
|
+
checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9"
|
|
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.41"
|
|
291
291
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
292
|
-
checksum = "
|
|
292
|
+
checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d"
|
|
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.41"
|
|
303
303
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
304
|
-
checksum = "
|
|
304
|
+
checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491"
|
|
305
305
|
dependencies = [
|
|
306
306
|
"heck",
|
|
307
307
|
"proc-macro2",
|
|
@@ -1004,9 +1004,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
|
|
|
1004
1004
|
|
|
1005
1005
|
[[package]]
|
|
1006
1006
|
name = "memmap2"
|
|
1007
|
-
version = "0.9.
|
|
1007
|
+
version = "0.9.7"
|
|
1008
1008
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1009
|
-
checksum = "
|
|
1009
|
+
checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28"
|
|
1010
1010
|
dependencies = [
|
|
1011
1011
|
"libc",
|
|
1012
1012
|
]
|
|
@@ -1465,7 +1465,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
|
|
1465
1465
|
|
|
1466
1466
|
[[package]]
|
|
1467
1467
|
name = "rumdl"
|
|
1468
|
-
version = "0.0.
|
|
1468
|
+
version = "0.0.95"
|
|
1469
1469
|
dependencies = [
|
|
1470
1470
|
"anyhow",
|
|
1471
1471
|
"assert_cmd",
|
|
@@ -1522,15 +1522,15 @@ checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
|
|
|
1522
1522
|
|
|
1523
1523
|
[[package]]
|
|
1524
1524
|
name = "rustix"
|
|
1525
|
-
version = "1.0.
|
|
1525
|
+
version = "1.0.8"
|
|
1526
1526
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1527
|
-
checksum = "
|
|
1527
|
+
checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
|
|
1528
1528
|
dependencies = [
|
|
1529
1529
|
"bitflags 2.9.1",
|
|
1530
1530
|
"errno",
|
|
1531
1531
|
"libc",
|
|
1532
1532
|
"linux-raw-sys",
|
|
1533
|
-
"windows-sys 0.
|
|
1533
|
+
"windows-sys 0.60.2",
|
|
1534
1534
|
]
|
|
1535
1535
|
|
|
1536
1536
|
[[package]]
|
|
@@ -1796,9 +1796,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
|
|
1796
1796
|
|
|
1797
1797
|
[[package]]
|
|
1798
1798
|
name = "tokio"
|
|
1799
|
-
version = "1.46.
|
|
1799
|
+
version = "1.46.1"
|
|
1800
1800
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1801
|
-
checksum = "
|
|
1801
|
+
checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
|
|
1802
1802
|
dependencies = [
|
|
1803
1803
|
"backtrace",
|
|
1804
1804
|
"bytes",
|
|
@@ -2394,9 +2394,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
|
|
|
2394
2394
|
|
|
2395
2395
|
[[package]]
|
|
2396
2396
|
name = "winnow"
|
|
2397
|
-
version = "0.7.
|
|
2397
|
+
version = "0.7.12"
|
|
2398
2398
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2399
|
-
checksum = "
|
|
2399
|
+
checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95"
|
|
2400
2400
|
dependencies = [
|
|
2401
2401
|
"memchr",
|
|
2402
2402
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rumdl
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.95
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -375,6 +375,16 @@ These options are available for all commands:
|
|
|
375
375
|
- `--config <file>`: Path to configuration file
|
|
376
376
|
- `--no-config`: Ignore all configuration files and use built-in defaults
|
|
377
377
|
|
|
378
|
+
### Exit Codes
|
|
379
|
+
|
|
380
|
+
rumdl uses exit codes following Ruff's convention for easy CI/CD integration:
|
|
381
|
+
|
|
382
|
+
- `0`: Success - no issues found
|
|
383
|
+
- `1`: Linting violations found
|
|
384
|
+
- `2`: Tool error (configuration error, file access error, invalid arguments, etc.)
|
|
385
|
+
|
|
386
|
+
This allows scripts and CI/CD systems to distinguish between "the tool found problems in your files" (exit 1) and "the tool couldn't run properly" (exit 2).
|
|
387
|
+
|
|
378
388
|
### Usage Examples
|
|
379
389
|
|
|
380
390
|
```bash
|
|
@@ -344,6 +344,16 @@ These options are available for all commands:
|
|
|
344
344
|
- `--config <file>`: Path to configuration file
|
|
345
345
|
- `--no-config`: Ignore all configuration files and use built-in defaults
|
|
346
346
|
|
|
347
|
+
### Exit Codes
|
|
348
|
+
|
|
349
|
+
rumdl uses exit codes following Ruff's convention for easy CI/CD integration:
|
|
350
|
+
|
|
351
|
+
- `0`: Success - no issues found
|
|
352
|
+
- `1`: Linting violations found
|
|
353
|
+
- `2`: Tool error (configuration error, file access error, invalid arguments, etc.)
|
|
354
|
+
|
|
355
|
+
This allows scripts and CI/CD systems to distinguish between "the tool found problems in your files" (exit 1) and "the tool couldn't run properly" (exit 2).
|
|
356
|
+
|
|
347
357
|
### Usage Examples
|
|
348
358
|
|
|
349
359
|
```bash
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
use rumdl::config::Config;
|
|
2
|
+
use rumdl::lint_context::LintContext;
|
|
3
|
+
use rumdl::rule::Rule;
|
|
4
|
+
use rumdl::rules::all_rules;
|
|
5
|
+
use std::env;
|
|
6
|
+
use std::time::Instant;
|
|
7
|
+
|
|
8
|
+
fn benchmark_rule(rule: &dyn Rule, test_cases: &[(&str, &str)], iterations: u32) -> Vec<(String, u64, u64)> {
|
|
9
|
+
let mut results = Vec::new();
|
|
10
|
+
|
|
11
|
+
for (name, content) in test_cases {
|
|
12
|
+
// Warm up
|
|
13
|
+
for _ in 0..10 {
|
|
14
|
+
let ctx = LintContext::new(content);
|
|
15
|
+
let _ = rule.check(&ctx);
|
|
16
|
+
let _ = rule.fix(&ctx);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Benchmark check
|
|
20
|
+
let start = Instant::now();
|
|
21
|
+
for _ in 0..iterations {
|
|
22
|
+
let ctx = LintContext::new(content);
|
|
23
|
+
let _ = rule.check(&ctx);
|
|
24
|
+
}
|
|
25
|
+
let check_time = start.elapsed().as_micros() as u64 / iterations as u64;
|
|
26
|
+
|
|
27
|
+
// Benchmark fix
|
|
28
|
+
let start = Instant::now();
|
|
29
|
+
for _ in 0..iterations {
|
|
30
|
+
let ctx = LintContext::new(content);
|
|
31
|
+
let _ = rule.fix(&ctx);
|
|
32
|
+
}
|
|
33
|
+
let fix_time = start.elapsed().as_micros() as u64 / iterations as u64;
|
|
34
|
+
|
|
35
|
+
results.push((name.to_string(), check_time, fix_time));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
results
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
fn generate_test_content(rule_name: &str) -> Vec<(&'static str, String)> {
|
|
42
|
+
match rule_name {
|
|
43
|
+
"MD009" => vec![
|
|
44
|
+
("No trailing spaces", "Line without trailing spaces\n".repeat(100)),
|
|
45
|
+
("With trailing spaces", "Line with trailing spaces \n".repeat(100)),
|
|
46
|
+
("Mixed content", "Normal line\nLine with spaces \nAnother normal\n".repeat(50)),
|
|
47
|
+
("Empty lines", "\n\n\n".repeat(100)),
|
|
48
|
+
],
|
|
49
|
+
"MD013" => vec![
|
|
50
|
+
("Short lines", "Short line\n".repeat(1000)),
|
|
51
|
+
("Long lines", "This is a very long line that exceeds the default line length limit of 80 characters and should trigger MD013\n".repeat(500)),
|
|
52
|
+
("Mixed lengths", "Short\nThis is a very long line that exceeds the limit\nShort again\n".repeat(300)),
|
|
53
|
+
("Code blocks", "```\nThis is a very long line in a code block that should be ignored by MD013\n```\n".repeat(100)),
|
|
54
|
+
],
|
|
55
|
+
"MD047" => vec![
|
|
56
|
+
("Correct ending", "Content with proper ending\n".to_string()),
|
|
57
|
+
("Missing newline", "Content without newline at end".to_string()),
|
|
58
|
+
("Multiple newlines", "Content with multiple newlines\n\n\n".to_string()),
|
|
59
|
+
("Empty file", "".to_string()),
|
|
60
|
+
("Large file correct", "Line\n".repeat(1000)),
|
|
61
|
+
("Large file incorrect", format!("{}\n\n", "Line\n".repeat(1000))),
|
|
62
|
+
],
|
|
63
|
+
"MD038" => vec![
|
|
64
|
+
("No code spans", "Regular text without code\n".repeat(100)),
|
|
65
|
+
("Correct code spans", "Text with `correct code` spans\n".repeat(100)),
|
|
66
|
+
("Spaces in code", "Text with ` spaced code ` spans\n".repeat(100)),
|
|
67
|
+
("Multiple backticks", "Text with ``code with ` backtick`` spans\n".repeat(100)),
|
|
68
|
+
("Mixed content", "Normal text\n`good code`\n` bad code `\n".repeat(100)),
|
|
69
|
+
],
|
|
70
|
+
"MD044" => vec![
|
|
71
|
+
("No proper names", "regular text without any proper names\n".repeat(100)),
|
|
72
|
+
("Correct names", "Using JavaScript and Python correctly\n".repeat(100)),
|
|
73
|
+
("Incorrect names", "Using javascript and python incorrectly\n".repeat(100)),
|
|
74
|
+
("Mixed case", "JavaScript is good, but javascript is bad\n".repeat(100)),
|
|
75
|
+
("Many names", "JavaScript Python TypeScript Ruby Go Rust Java\n".repeat(100)),
|
|
76
|
+
],
|
|
77
|
+
"MD034" => vec and [another](https://test.com)\n".repeat(100)),
|
|
80
|
+
("Bare URLs", "Check out http://example.com and https://test.com for more\n".repeat(100)),
|
|
81
|
+
("Mixed URLs", "Visit [site](http://a.com) or just go to http://b.com directly\n".repeat(100)),
|
|
82
|
+
("Complex URLs", "IPv6: http://[2001:db8::1]/path and port: http://example.com:8080/path?query=1\n".repeat(50)),
|
|
83
|
+
("Many URLs", {
|
|
84
|
+
let mut content = String::new();
|
|
85
|
+
for i in 0..200 {
|
|
86
|
+
content.push_str(&format!("URL {}: http://example{}.com/path/{}/file?id={}\n", i, i, i, i));
|
|
87
|
+
}
|
|
88
|
+
content
|
|
89
|
+
}),
|
|
90
|
+
],
|
|
91
|
+
"MD053" => vec![
|
|
92
|
+
("No references", "Simple text without any links or references\n".repeat(100)),
|
|
93
|
+
("Used references", "[link1][ref1] and [link2][ref2]\n\n[ref1]: http://example1.com\n[ref2]: http://example2.com\n".repeat(50)),
|
|
94
|
+
("Unused references", "Some text here\n\n[unused1]: http://unused1.com\n[unused2]: http://unused2.com\n".repeat(50)),
|
|
95
|
+
("Mixed references", "[used][ref1]\n\n[ref1]: http://used.com\n[unused]: http://unused.com\n".repeat(100)),
|
|
96
|
+
("Many references", {
|
|
97
|
+
let mut content = String::new();
|
|
98
|
+
for i in 0..100 {
|
|
99
|
+
content.push_str(&format!("[link{}][ref{}]\n", i, i));
|
|
100
|
+
}
|
|
101
|
+
content.push_str("\n");
|
|
102
|
+
for i in 0..200 {
|
|
103
|
+
content.push_str(&format!("[ref{}]: http://example{}.com\n", i, i));
|
|
104
|
+
}
|
|
105
|
+
content
|
|
106
|
+
}),
|
|
107
|
+
],
|
|
108
|
+
_ => vec![
|
|
109
|
+
("Default test", "Default test content\n".repeat(100)),
|
|
110
|
+
],
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fn main() {
|
|
115
|
+
let args: Vec<String> = env::args().collect();
|
|
116
|
+
if args.len() != 2 {
|
|
117
|
+
eprintln!("Usage: {} <rule_name>", args[0]);
|
|
118
|
+
std::process::exit(1);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
let rule_name = &args[1];
|
|
122
|
+
let config = Config::default();
|
|
123
|
+
let rules = all_rules(&config);
|
|
124
|
+
|
|
125
|
+
let rule = rules.into_iter()
|
|
126
|
+
.find(|r| r.name() == rule_name)
|
|
127
|
+
.unwrap_or_else(|| {
|
|
128
|
+
eprintln!("Rule {} not found", rule_name);
|
|
129
|
+
std::process::exit(1);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
let test_cases_vec = generate_test_content(rule_name);
|
|
133
|
+
let test_cases: Vec<(&str, &str)> = test_cases_vec.iter()
|
|
134
|
+
.map(|(name, content)| (*name, content.as_str()))
|
|
135
|
+
.collect();
|
|
136
|
+
|
|
137
|
+
println!("Benchmarking {} Rule", rule_name);
|
|
138
|
+
println!("{}", "=".repeat(50));
|
|
139
|
+
println!();
|
|
140
|
+
|
|
141
|
+
let results = benchmark_rule(rule.as_ref(), &test_cases, 100);
|
|
142
|
+
|
|
143
|
+
let mut total_check = 0u64;
|
|
144
|
+
let mut total_fix = 0u64;
|
|
145
|
+
|
|
146
|
+
for (test_name, check_time, fix_time) in &results {
|
|
147
|
+
println!("{:<30} Check: {:>6} μs Fix: {:>6} μs", test_name, check_time, fix_time);
|
|
148
|
+
total_check += check_time;
|
|
149
|
+
total_fix += fix_time;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
println!();
|
|
153
|
+
println!("Average times:");
|
|
154
|
+
println!(" Check: {} μs", total_check / results.len() as u64);
|
|
155
|
+
println!(" Fix: {} μs", total_fix / results.len() as u64);
|
|
156
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/// Exit codes for rumdl, following Ruff's convention
|
|
2
|
+
///
|
|
3
|
+
/// These exit codes allow users and CI/CD systems to distinguish between
|
|
4
|
+
/// different types of failures.
|
|
5
|
+
pub mod exit_codes {
|
|
6
|
+
/// Success - No issues found or all issues were fixed
|
|
7
|
+
pub const SUCCESS: i32 = 0;
|
|
8
|
+
|
|
9
|
+
/// Linting issues found - One or more Markdown violations detected
|
|
10
|
+
pub const VIOLATIONS_FOUND: i32 = 1;
|
|
11
|
+
|
|
12
|
+
/// Tool error - Configuration error, file access error, or internal error
|
|
13
|
+
pub const TOOL_ERROR: i32 = 2;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/// Helper functions for consistent exit behavior
|
|
17
|
+
pub mod exit {
|
|
18
|
+
use super::exit_codes;
|
|
19
|
+
|
|
20
|
+
/// Exit with success code (0)
|
|
21
|
+
pub fn success() -> ! {
|
|
22
|
+
std::process::exit(exit_codes::SUCCESS);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// Exit with violations found code (1)
|
|
26
|
+
pub fn violations_found() -> ! {
|
|
27
|
+
std::process::exit(exit_codes::VIOLATIONS_FOUND);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// Exit with tool error code (2)
|
|
31
|
+
pub fn tool_error() -> ! {
|
|
32
|
+
std::process::exit(exit_codes::TOOL_ERROR);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -243,6 +243,8 @@ pub struct ListBlock {
|
|
|
243
243
|
pub nesting_level: usize,
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
+
use std::sync::{Arc, Mutex};
|
|
247
|
+
|
|
246
248
|
pub struct LintContext<'a> {
|
|
247
249
|
pub content: &'a str,
|
|
248
250
|
pub line_offsets: Vec<usize>,
|
|
@@ -251,7 +253,7 @@ pub struct LintContext<'a> {
|
|
|
251
253
|
pub links: Vec<ParsedLink>, // Pre-parsed links
|
|
252
254
|
pub images: Vec<ParsedImage>, // Pre-parsed images
|
|
253
255
|
pub reference_defs: Vec<ReferenceDef>, // Reference definitions
|
|
254
|
-
|
|
256
|
+
code_spans_cache: Mutex<Option<Arc<Vec<CodeSpan>>>>, // Lazy-loaded inline code spans
|
|
255
257
|
pub list_blocks: Vec<ListBlock>, // Pre-parsed list blocks
|
|
256
258
|
}
|
|
257
259
|
|
|
@@ -270,11 +272,11 @@ impl<'a> LintContext<'a> {
|
|
|
270
272
|
// Pre-compute line information
|
|
271
273
|
let lines = Self::compute_line_info(content, &line_offsets, &code_blocks);
|
|
272
274
|
|
|
273
|
-
// Parse links, images, references,
|
|
275
|
+
// Parse links, images, references, and list blocks
|
|
276
|
+
// Skip code spans - they'll be computed lazily
|
|
274
277
|
let links = Self::parse_links(content, &lines, &code_blocks);
|
|
275
278
|
let images = Self::parse_images(content, &lines, &code_blocks);
|
|
276
279
|
let reference_defs = Self::parse_reference_defs(content, &lines);
|
|
277
|
-
let code_spans = Self::parse_code_spans(content, &lines);
|
|
278
280
|
let list_blocks = Self::parse_list_blocks(&lines);
|
|
279
281
|
|
|
280
282
|
Self {
|
|
@@ -285,11 +287,25 @@ impl<'a> LintContext<'a> {
|
|
|
285
287
|
links,
|
|
286
288
|
images,
|
|
287
289
|
reference_defs,
|
|
288
|
-
|
|
290
|
+
code_spans_cache: Mutex::new(None),
|
|
289
291
|
list_blocks,
|
|
290
292
|
}
|
|
291
293
|
}
|
|
292
294
|
|
|
295
|
+
/// Get code spans - computed lazily on first access
|
|
296
|
+
pub fn code_spans(&self) -> Arc<Vec<CodeSpan>> {
|
|
297
|
+
let mut cache = self.code_spans_cache.lock().unwrap();
|
|
298
|
+
|
|
299
|
+
// Check if we need to compute code spans
|
|
300
|
+
if cache.is_none() {
|
|
301
|
+
let code_spans = Self::parse_code_spans(self.content, &self.lines);
|
|
302
|
+
*cache = Some(Arc::new(code_spans));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Return a reference to the cached code spans
|
|
306
|
+
cache.as_ref().unwrap().clone()
|
|
307
|
+
}
|
|
308
|
+
|
|
293
309
|
/// Map a byte offset to (line, column)
|
|
294
310
|
pub fn offset_to_line_col(&self, offset: usize) -> (usize, usize) {
|
|
295
311
|
match self.line_offsets.binary_search(&offset) {
|
|
@@ -308,8 +324,8 @@ impl<'a> LintContext<'a> {
|
|
|
308
324
|
return true;
|
|
309
325
|
}
|
|
310
326
|
|
|
311
|
-
// Check inline code spans
|
|
312
|
-
self.code_spans
|
|
327
|
+
// Check inline code spans (lazy load if needed)
|
|
328
|
+
self.code_spans()
|
|
313
329
|
.iter()
|
|
314
330
|
.any(|span| pos >= span.byte_offset && pos < span.byte_end)
|
|
315
331
|
}
|