rumdl 0.0.108__tar.gz → 0.0.109__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.
Files changed (373) hide show
  1. {rumdl-0.0.108 → rumdl-0.0.109}/.config/nextest.toml +20 -4
  2. {rumdl-0.0.108 → rumdl-0.0.109}/.pre-commit-config.yaml +5 -5
  3. {rumdl-0.0.108 → rumdl-0.0.109}/CHANGELOG.md +4 -1
  4. {rumdl-0.0.108 → rumdl-0.0.109}/Cargo.lock +6 -6
  5. {rumdl-0.0.108 → rumdl-0.0.109}/Cargo.toml +1 -1
  6. {rumdl-0.0.108 → rumdl-0.0.109}/Makefile +7 -1
  7. {rumdl-0.0.108 → rumdl-0.0.109}/PKG-INFO +1 -1
  8. {rumdl-0.0.108 → rumdl-0.0.109}/src/lint_context.rs +27 -35
  9. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md004_unordered_list_style.rs +8 -15
  10. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md006_start_bullets.rs +49 -21
  11. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md011_no_reversed_links.rs +15 -0
  12. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md029_ordered_list_prefix.rs +63 -19
  13. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md033_no_inline_html.rs +5 -0
  14. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md037_spaces_around_emphasis.rs +52 -8
  15. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md042_no_empty_links.rs +36 -0
  16. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md046_code_block_style.rs +1 -81
  17. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md051_link_fragments.rs +5 -0
  18. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/code_block_utils.rs +17 -3
  19. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/document_structure.rs +23 -15
  20. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/table_utils.rs +104 -5
  21. {rumdl-0.0.108 → rumdl-0.0.109}/tests/cli_integration_tests.rs +6 -45
  22. rumdl-0.0.109/tests/common/cli_test_utils.rs +257 -0
  23. rumdl-0.0.109/tests/common/fixtures.rs +92 -0
  24. rumdl-0.0.109/tests/common/mod.rs +3 -0
  25. rumdl-0.0.109/tests/common/test_utils.rs +160 -0
  26. {rumdl-0.0.108 → rumdl-0.0.109}/tests/lsp_memory_leak_tests.rs +14 -14
  27. {rumdl-0.0.108 → rumdl-0.0.109}/tests/markdownlint_cli_integration.rs +4 -15
  28. {rumdl-0.0.108 → rumdl-0.0.109}/tests/markdownlintignore_test.rs +3 -10
  29. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/list_rules_integration_test.rs +4 -6
  30. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md032_test.rs +34 -0
  31. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md046_test.rs +26 -0
  32. {rumdl-0.0.108 → rumdl-0.0.109}/tests/thread_safety_tests.rs +3 -3
  33. {rumdl-0.0.108 → rumdl-0.0.109}/.mise.toml +0 -0
  34. {rumdl-0.0.108 → rumdl-0.0.109}/.rumdl.toml +0 -0
  35. {rumdl-0.0.108 → rumdl-0.0.109}/.rustfmt.toml +0 -0
  36. {rumdl-0.0.108 → rumdl-0.0.109}/LICENSE +0 -0
  37. {rumdl-0.0.108 → rumdl-0.0.109}/MANIFEST.in +0 -0
  38. {rumdl-0.0.108 → rumdl-0.0.109}/README.md +0 -0
  39. {rumdl-0.0.108 → rumdl-0.0.109}/assets/logo.png +0 -0
  40. {rumdl-0.0.108 → rumdl-0.0.109}/benches/fix_performance.rs +0 -0
  41. {rumdl-0.0.108 → rumdl-0.0.109}/benches/range_performance.rs +0 -0
  42. {rumdl-0.0.108 → rumdl-0.0.109}/benches/range_utils_benchmark.rs +0 -0
  43. {rumdl-0.0.108 → rumdl-0.0.109}/benches/rule_performance.rs +0 -0
  44. {rumdl-0.0.108 → rumdl-0.0.109}/benches/simple_fix_bench.rs +0 -0
  45. {rumdl-0.0.108 → rumdl-0.0.109}/benchmark/bin/bench_lint_context.rs +0 -0
  46. {rumdl-0.0.108 → rumdl-0.0.109}/benchmark/bin/benchmark.rs +0 -0
  47. {rumdl-0.0.108 → rumdl-0.0.109}/benchmark/bin/benchmark_rule.rs +0 -0
  48. {rumdl-0.0.108 → rumdl-0.0.109}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  49. {rumdl-0.0.108 → rumdl-0.0.109}/benchmark/bin/measure_code_span_performance.rs +0 -0
  50. {rumdl-0.0.108 → rumdl-0.0.109}/docs/RULES.md +0 -0
  51. {rumdl-0.0.108 → rumdl-0.0.109}/docs/global-settings.md +0 -0
  52. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md001.md +0 -0
  53. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md002.md +0 -0
  54. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md003.md +0 -0
  55. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md004.md +0 -0
  56. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md005.md +0 -0
  57. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md006.md +0 -0
  58. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md007.md +0 -0
  59. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md009.md +0 -0
  60. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md010.md +0 -0
  61. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md011.md +0 -0
  62. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md012.md +0 -0
  63. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md013.md +0 -0
  64. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md014.md +0 -0
  65. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md018.md +0 -0
  66. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md019.md +0 -0
  67. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md020.md +0 -0
  68. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md021.md +0 -0
  69. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md022.md +0 -0
  70. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md023.md +0 -0
  71. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md024.md +0 -0
  72. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md025.md +0 -0
  73. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md026.md +0 -0
  74. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md027.md +0 -0
  75. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md028.md +0 -0
  76. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md029.md +0 -0
  77. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md030.md +0 -0
  78. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md031.md +0 -0
  79. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md032.md +0 -0
  80. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md033.md +0 -0
  81. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md034.md +0 -0
  82. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md035.md +0 -0
  83. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md036.md +0 -0
  84. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md037.md +0 -0
  85. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md038.md +0 -0
  86. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md039.md +0 -0
  87. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md040.md +0 -0
  88. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md041.md +0 -0
  89. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md042.md +0 -0
  90. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md043.md +0 -0
  91. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md044.md +0 -0
  92. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md045.md +0 -0
  93. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md046.md +0 -0
  94. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md047.md +0 -0
  95. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md048.md +0 -0
  96. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md049.md +0 -0
  97. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md050.md +0 -0
  98. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md051.md +0 -0
  99. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md052.md +0 -0
  100. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md053.md +0 -0
  101. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md054.md +0 -0
  102. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md055.md +0 -0
  103. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md056.md +0 -0
  104. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md057.md +0 -0
  105. {rumdl-0.0.108 → rumdl-0.0.109}/docs/md058.md +0 -0
  106. {rumdl-0.0.108 → rumdl-0.0.109}/docs/vscode-extension.md +0 -0
  107. {rumdl-0.0.108 → rumdl-0.0.109}/parity_check.py +0 -0
  108. {rumdl-0.0.108 → rumdl-0.0.109}/pyproject.toml +0 -0
  109. {rumdl-0.0.108 → rumdl-0.0.109}/python/MANIFEST.in +0 -0
  110. {rumdl-0.0.108 → rumdl-0.0.109}/python/PYTHON-README.md +0 -0
  111. {rumdl-0.0.108 → rumdl-0.0.109}/python/rumdl/__init__.py +0 -0
  112. {rumdl-0.0.108 → rumdl-0.0.109}/python/rumdl/__main__.py +0 -0
  113. {rumdl-0.0.108 → rumdl-0.0.109}/python/rumdl/py.typed +0 -0
  114. {rumdl-0.0.108 → rumdl-0.0.109}/rumdl.toml.example +0 -0
  115. {rumdl-0.0.108 → rumdl-0.0.109}/rust-toolchain.toml +0 -0
  116. {rumdl-0.0.108 → rumdl-0.0.109}/scripts/extract-changelog.sh +0 -0
  117. {rumdl-0.0.108 → rumdl-0.0.109}/scripts/prepare-release.sh +0 -0
  118. {rumdl-0.0.108 → rumdl-0.0.109}/scripts/setup-pre-commit.sh +0 -0
  119. {rumdl-0.0.108 → rumdl-0.0.109}/scripts/update-pre-commit-docs.sh +0 -0
  120. {rumdl-0.0.108 → rumdl-0.0.109}/src/bin/debug_frontmatter.rs +0 -0
  121. {rumdl-0.0.108 → rumdl-0.0.109}/src/config.rs +0 -0
  122. {rumdl-0.0.108 → rumdl-0.0.109}/src/exit_codes.rs +0 -0
  123. {rumdl-0.0.108 → rumdl-0.0.109}/src/inline_config.rs +0 -0
  124. {rumdl-0.0.108 → rumdl-0.0.109}/src/lib.rs +0 -0
  125. {rumdl-0.0.108 → rumdl-0.0.109}/src/lsp/mod.rs +0 -0
  126. {rumdl-0.0.108 → rumdl-0.0.109}/src/lsp/server.rs +0 -0
  127. {rumdl-0.0.108 → rumdl-0.0.109}/src/lsp/types.rs +0 -0
  128. {rumdl-0.0.108 → rumdl-0.0.109}/src/main.rs +0 -0
  129. {rumdl-0.0.108 → rumdl-0.0.109}/src/markdownlint_config.rs +0 -0
  130. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/azure.rs +0 -0
  131. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/concise.rs +0 -0
  132. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/github.rs +0 -0
  133. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/gitlab.rs +0 -0
  134. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/grouped.rs +0 -0
  135. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/json.rs +0 -0
  136. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/json_lines.rs +0 -0
  137. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/junit.rs +0 -0
  138. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/mod.rs +0 -0
  139. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/pylint.rs +0 -0
  140. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/sarif.rs +0 -0
  141. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/formatters/text.rs +0 -0
  142. {rumdl-0.0.108 → rumdl-0.0.109}/src/output/mod.rs +0 -0
  143. {rumdl-0.0.108 → rumdl-0.0.109}/src/parallel.rs +0 -0
  144. {rumdl-0.0.108 → rumdl-0.0.109}/src/performance.rs +0 -0
  145. {rumdl-0.0.108 → rumdl-0.0.109}/src/profiling.rs +0 -0
  146. {rumdl-0.0.108 → rumdl-0.0.109}/src/python.rs +0 -0
  147. {rumdl-0.0.108 → rumdl-0.0.109}/src/rule.rs +0 -0
  148. {rumdl-0.0.108 → rumdl-0.0.109}/src/rule_config.rs +0 -0
  149. {rumdl-0.0.108 → rumdl-0.0.109}/src/rule_config_serde.rs +0 -0
  150. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/blockquote_utils.rs +0 -0
  151. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/code_block_utils.rs +0 -0
  152. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/code_fence_utils.rs +0 -0
  153. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/emphasis_style.rs +0 -0
  154. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/front_matter_utils.rs +0 -0
  155. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/heading_utils.rs +0 -0
  156. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/list_utils.rs +0 -0
  157. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md001_heading_increment.rs +0 -0
  158. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  159. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md002_first_heading_h1.rs +0 -0
  160. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md003_heading_style/md003_config.rs +0 -0
  161. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md003_heading_style.rs +0 -0
  162. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  163. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md005_list_indent.rs +0 -0
  164. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  165. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md007_ul_indent.rs +0 -0
  166. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  167. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md009_trailing_spaces.rs +0 -0
  168. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  169. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md010_no_hard_tabs.rs +0 -0
  170. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  171. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md012_no_multiple_blanks.rs +0 -0
  172. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md013_line_length/md013_config.rs +0 -0
  173. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md013_line_length.rs +0 -0
  174. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  175. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md014_commands_show_output.rs +0 -0
  176. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md018_no_missing_space_atx.rs +0 -0
  177. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  178. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  179. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  180. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  181. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md022_blanks_around_headings.rs +0 -0
  182. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md023_heading_start_left.rs +0 -0
  183. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  184. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md024_no_duplicate_heading.rs +0 -0
  185. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md025_single_title/md025_config.rs +0 -0
  186. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md025_single_title.rs +0 -0
  187. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  188. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  189. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  190. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  191. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  192. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  193. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md030_list_marker_space.rs +0 -0
  194. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md031_blanks_around_fences.rs +0 -0
  195. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md032_blanks_around_lists.rs +0 -0
  196. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  197. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md034_no_bare_urls.rs +0 -0
  198. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md035_hr_style/md035_config.rs +0 -0
  199. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md035_hr_style.rs +0 -0
  200. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  201. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  202. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md038_no_space_in_code.rs +0 -0
  203. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md039_no_space_in_links.rs +0 -0
  204. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md040_fenced_code_language.rs +0 -0
  205. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md041_first_line_heading.rs +0 -0
  206. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md043_required_headings.rs +0 -0
  207. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md044_proper_names/md044_config.rs +0 -0
  208. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md044_proper_names.rs +0 -0
  209. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  210. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md045_no_alt_text.rs +0 -0
  211. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  212. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md047_single_trailing_newline.rs +0 -0
  213. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  214. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md048_code_fence_style.rs +0 -0
  215. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  216. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md049_emphasis_style.rs +0 -0
  217. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md050_strong_style/md050_config.rs +0 -0
  218. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md050_strong_style.rs +0 -0
  219. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md052_reference_links_images.rs +0 -0
  220. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  221. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  222. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md054_link_image_style.rs +0 -0
  223. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  224. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md055_table_pipe_style.rs +0 -0
  225. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md056_table_column_count.rs +0 -0
  226. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  227. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md057_existing_relative_links.rs +0 -0
  228. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/md058_blanks_around_tables.rs +0 -0
  229. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/mod.rs +0 -0
  230. {rumdl-0.0.108 → rumdl-0.0.109}/src/rules/strong_style.rs +0 -0
  231. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/ast_utils.rs +0 -0
  232. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/early_returns.rs +0 -0
  233. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/element_cache.rs +0 -0
  234. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/emphasis_utils.rs +0 -0
  235. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/fix_utils.rs +0 -0
  236. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/markdown_elements.rs +0 -0
  237. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/mod.rs +0 -0
  238. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/range_utils.rs +0 -0
  239. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/regex_cache.rs +0 -0
  240. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/string_interner.rs +0 -0
  241. {rumdl-0.0.108 → rumdl-0.0.109}/src/utils/text_reflow.rs +0 -0
  242. {rumdl-0.0.108 → rumdl-0.0.109}/src/vscode.rs +0 -0
  243. {rumdl-0.0.108 → rumdl-0.0.109}/tests/advanced_integration_tests.rs +0 -0
  244. {rumdl-0.0.108 → rumdl-0.0.109}/tests/character_ranges/additional_tests.rs +0 -0
  245. {rumdl-0.0.108 → rumdl-0.0.109}/tests/character_ranges/basic_tests.rs +0 -0
  246. {rumdl-0.0.108 → rumdl-0.0.109}/tests/character_ranges/comprehensive_tests.rs +0 -0
  247. {rumdl-0.0.108 → rumdl-0.0.109}/tests/character_ranges/extended_tests.rs +0 -0
  248. {rumdl-0.0.108 → rumdl-0.0.109}/tests/character_ranges/mod.rs +0 -0
  249. {rumdl-0.0.108 → rumdl-0.0.109}/tests/character_ranges/unicode_utils.rs +0 -0
  250. {rumdl-0.0.108 → rumdl-0.0.109}/tests/cli_duplication_test.rs +0 -0
  251. {rumdl-0.0.108 → rumdl-0.0.109}/tests/cli_explain_test.rs +0 -0
  252. {rumdl-0.0.108 → rumdl-0.0.109}/tests/cli_flag_precedence_test.rs +0 -0
  253. {rumdl-0.0.108 → rumdl-0.0.109}/tests/cli_lsp_fix_consistency.rs +0 -0
  254. {rumdl-0.0.108 → rumdl-0.0.109}/tests/cli_statistics_test.rs +0 -0
  255. {rumdl-0.0.108 → rumdl-0.0.109}/tests/commonmark_compliance_tests.rs +0 -0
  256. {rumdl-0.0.108 → rumdl-0.0.109}/tests/comprehensive_integration_tests.rs +0 -0
  257. {rumdl-0.0.108 → rumdl-0.0.109}/tests/comprehensive_output_format_tests.rs +0 -0
  258. {rumdl-0.0.108 → rumdl-0.0.109}/tests/config_application_tests.rs +0 -0
  259. {rumdl-0.0.108 → rumdl-0.0.109}/tests/config_file_command_test.rs +0 -0
  260. {rumdl-0.0.108 → rumdl-0.0.109}/tests/config_tests.rs +0 -0
  261. {rumdl-0.0.108 → rumdl-0.0.109}/tests/configuration_inheritance_tests.rs +0 -0
  262. {rumdl-0.0.108 → rumdl-0.0.109}/tests/consistency_regression_tests.rs +0 -0
  263. {rumdl-0.0.108 → rumdl-0.0.109}/tests/cross_platform_compatibility_tests.rs +0 -0
  264. {rumdl-0.0.108 → rumdl-0.0.109}/tests/deeply_nested_lists_performance_test.rs +0 -0
  265. {rumdl-0.0.108 → rumdl-0.0.109}/tests/escaped_brackets_test.rs +0 -0
  266. {rumdl-0.0.108 → rumdl-0.0.109}/tests/final_confidence_assessment.rs +0 -0
  267. {rumdl-0.0.108 → rumdl-0.0.109}/tests/init_command_test.rs +0 -0
  268. {rumdl-0.0.108 → rumdl-0.0.109}/tests/init_tests.rs +0 -0
  269. {rumdl-0.0.108 → rumdl-0.0.109}/tests/inline_config_blocks_test.rs +0 -0
  270. {rumdl-0.0.108 → rumdl-0.0.109}/tests/inline_config_test.rs +0 -0
  271. {rumdl-0.0.108 → rumdl-0.0.109}/tests/integration_tests.rs +0 -0
  272. {rumdl-0.0.108 → rumdl-0.0.109}/tests/json_output_test.rs +0 -0
  273. {rumdl-0.0.108 → rumdl-0.0.109}/tests/lib.rs +0 -0
  274. {rumdl-0.0.108 → rumdl-0.0.109}/tests/lsp_editor_integration_tests.rs +0 -0
  275. {rumdl-0.0.108 → rumdl-0.0.109}/tests/lsp_integration_tests.rs +0 -0
  276. {rumdl-0.0.108 → rumdl-0.0.109}/tests/lsp_tests.rs +0 -0
  277. {rumdl-0.0.108 → rumdl-0.0.109}/tests/malformed_markdown_stress_tests.rs +0 -0
  278. {rumdl-0.0.108 → rumdl-0.0.109}/tests/markdownlint_config_test.rs +0 -0
  279. {rumdl-0.0.108 → rumdl-0.0.109}/tests/md013_reflow_integration_test.rs +0 -0
  280. {rumdl-0.0.108 → rumdl-0.0.109}/tests/nested_code_block_test.rs +0 -0
  281. {rumdl-0.0.108 → rumdl-0.0.109}/tests/output_format_integration_tests.rs +0 -0
  282. {rumdl-0.0.108 → rumdl-0.0.109}/tests/output_format_tests.rs +0 -0
  283. {rumdl-0.0.108 → rumdl-0.0.109}/tests/perf_check.rs +0 -0
  284. {rumdl-0.0.108 → rumdl-0.0.109}/tests/performance_validation_tests.rs +0 -0
  285. {rumdl-0.0.108 → rumdl-0.0.109}/tests/pyproject_config_tests.rs +0 -0
  286. {rumdl-0.0.108 → rumdl-0.0.109}/tests/python_bindings_test.rs +0 -0
  287. {rumdl-0.0.108 → rumdl-0.0.109}/tests/real_world_repository_tests.rs +0 -0
  288. {rumdl-0.0.108 → rumdl-0.0.109}/tests/regression_prevention_tests.rs +0 -0
  289. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  290. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/heading_edge_cases_test.rs +0 -0
  291. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  292. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/link_edge_cases_test.rs +0 -0
  293. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md001_test.rs +0 -0
  294. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md001_unicode_test.rs +0 -0
  295. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md002_test.rs +0 -0
  296. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md003_test.rs +0 -0
  297. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md004_test.rs +0 -0
  298. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md005_test.rs +0 -0
  299. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md005_unicode_test.rs +0 -0
  300. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md006_test.rs +0 -0
  301. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md006_unicode_test.rs +0 -0
  302. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md007_test.rs +0 -0
  303. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md009_test.rs +0 -0
  304. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md010_test.rs +0 -0
  305. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md011_test.rs +0 -0
  306. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md012_test.rs +0 -0
  307. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md013_test.rs +0 -0
  308. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md014_test.rs +0 -0
  309. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md018_test.rs +0 -0
  310. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md019_test.rs +0 -0
  311. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md020_test.rs +0 -0
  312. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md021_test.rs +0 -0
  313. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md022_test.rs +0 -0
  314. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md023_extended_test.rs +0 -0
  315. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md023_test.rs +0 -0
  316. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md024_test.rs +0 -0
  317. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md025_test.rs +0 -0
  318. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md026_test.rs +0 -0
  319. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md027_test.rs +0 -0
  320. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md028_test.rs +0 -0
  321. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md029_test.rs +0 -0
  322. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md029_unicode_test.rs +0 -0
  323. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md030_test.rs +0 -0
  324. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md031_test.rs +0 -0
  325. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md033_extended_test.rs +0 -0
  326. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md033_test.rs +0 -0
  327. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md034_ipv6_test.rs +0 -0
  328. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md034_test.rs +0 -0
  329. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md035_test.rs +0 -0
  330. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md036_test.rs +0 -0
  331. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md037_test.rs +0 -0
  332. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md038_nested_backticks_test.rs +0 -0
  333. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md038_test.rs +0 -0
  334. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md039_test.rs +0 -0
  335. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md040_test.rs +0 -0
  336. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md041_test.rs +0 -0
  337. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md042_test.rs +0 -0
  338. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md043_test.rs +0 -0
  339. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md044_test.rs +0 -0
  340. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md045_test.rs +0 -0
  341. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md047_test.rs +0 -0
  342. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md048_test.rs +0 -0
  343. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md049_test.rs +0 -0
  344. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md050_test.rs +0 -0
  345. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md051_test.rs +0 -0
  346. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md051_unicode_test.rs +0 -0
  347. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md052_test.rs +0 -0
  348. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md053_additional_test.rs +0 -0
  349. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md053_proptest.rs +0 -0
  350. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md053_test.rs +0 -0
  351. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md054_test.rs +0 -0
  352. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md054_unicode_test.rs +0 -0
  353. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md055_test.rs +0 -0
  354. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md056_test.rs +0 -0
  355. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md057_test.rs +0 -0
  356. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/md058_test.rs +0 -0
  357. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules/mod.rs +0 -0
  358. {rumdl-0.0.108 → rumdl-0.0.109}/tests/rules_mod_test.rs +0 -0
  359. {rumdl-0.0.108 → rumdl-0.0.109}/tests/unicode_edge_case_tests.rs +0 -0
  360. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils/blockquote_utils_test.rs +0 -0
  361. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils/code_block_utils_extended_test.rs +0 -0
  362. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils/code_block_utils_test.rs +0 -0
  363. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils/core_utils_test.rs +0 -0
  364. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils/front_matter_utils_test.rs +0 -0
  365. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils/line_index_test.rs +0 -0
  366. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils/mod.rs +0 -0
  367. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils_markdown_edge_cases.rs +0 -0
  368. {rumdl-0.0.108 → rumdl-0.0.109}/tests/utils_tests.rs +0 -0
  369. {rumdl-0.0.108 → rumdl-0.0.109}/tests/vscode_extension_fixes.rs +0 -0
  370. {rumdl-0.0.108 → rumdl-0.0.109}/tests/vscode_test.rs +0 -0
  371. {rumdl-0.0.108 → rumdl-0.0.109}/tests/vscode_tests.rs +0 -0
  372. {rumdl-0.0.108 → rumdl-0.0.109}/tests/vscode_windows_comprehensive_test.rs +0 -0
  373. {rumdl-0.0.108 → rumdl-0.0.109}/tests/vscode_windows_test.rs +0 -0
@@ -36,8 +36,8 @@ retries = 0
36
36
  # Quick profile for development
37
37
  [profile.quick]
38
38
 
39
- # Skip slow tests
40
- default-filter = 'not test(/memory/) and not test(/stress/) and not test(/large/)'
39
+ # Skip slow tests and performance tests
40
+ default-filter = 'not test(/memory/) and not test(/stress/) and not test(/large/) and not test(/error_propagation/) and not test(/performance/) and not test(/comprehensive/) and not test(/deeply_nested/)'
41
41
 
42
42
  # Even more parallel execution locally
43
43
  test-threads = "num-cpus"
@@ -45,11 +45,27 @@ test-threads = "num-cpus"
45
45
  # Less verbose output
46
46
  status-level = "fail"
47
47
 
48
+ # Development profile - balance between speed and coverage
49
+ [profile.dev]
50
+
51
+ # Skip the slowest tests but include integration tests
52
+ default-filter = 'not test(/error_propagation/) and not test(/deeply_nested/) and not test(/memory/) and not test(/stress/) and not test(/large/) and not test(/performance/) and not test(/perf_check/)'
53
+
54
+ # Good parallelization for dev machines
55
+ test-threads = "num-cpus"
56
+
57
+ # Show failures immediately
58
+ failure-output = "immediate"
59
+ status-level = "fail"
60
+
61
+ # No retries for faster feedback
62
+ retries = 0
63
+
48
64
  # Ultra-fast profile for pre-commit hooks
49
65
  [profile.pre-commit]
50
66
 
51
67
  # Only run unit tests in lib, skip all integration tests and binaries
52
- default-filter = 'package(rumdl) and kind(lib) and not test(/slow|stress|large|integration|comprehensive|cli|config|advanced|commonmark|consistency|performance|benchmark|parity/)'
68
+ default-filter = 'package(rumdl) and kind(lib) and not test(/slow|stress|large|integration|comprehensive|cli|config|advanced|commonmark|consistency|performance|benchmark|parity|error_propagation|deeply_nested|memory/)'
53
69
 
54
70
  # Maximum parallelism for speed
55
71
  test-threads = "num-cpus"
@@ -63,4 +79,4 @@ success-output = "never"
63
79
  retries = 0
64
80
 
65
81
  # Fail fast on first failure
66
- fail-fast = true
82
+ fail-fast = true
@@ -1,8 +1,8 @@
1
1
  # Pre-commit hooks for rumdl
2
- # Install with:
2
+ # Install with:
3
3
  # pre-commit install # Install commit hooks
4
4
  # pre-commit install --hook-type pre-push # Install push hooks
5
- # Run manually:
5
+ # Run manually:
6
6
  # pre-commit run --all-files # Run commit hooks
7
7
  # pre-commit run --hook-stage push --all-files # Run push hooks
8
8
 
@@ -64,7 +64,7 @@ repos:
64
64
  language: system
65
65
  types: [rust]
66
66
  pass_filenames: false
67
- stages: [push]
67
+ stages: [pre-push]
68
68
  verbose: true
69
69
 
70
70
  - id: cargo-lint-full
@@ -73,7 +73,7 @@ repos:
73
73
  language: system
74
74
  types: [rust]
75
75
  pass_filenames: false
76
- stages: [push]
76
+ stages: [pre-push]
77
77
  verbose: true
78
78
 
79
79
  - id: cargo-doc-check
@@ -82,5 +82,5 @@ repos:
82
82
  language: system
83
83
  types: [rust]
84
84
  pass_filenames: false
85
- stages: [push]
85
+ stages: [pre-push]
86
86
  verbose: true
@@ -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.110] - 2025-08-08
11
+
10
12
  ## [0.0.107] - 2025-08-06
11
13
 
12
14
  ## [0.0.107] - 2025-08-06
@@ -298,7 +300,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
298
300
 
299
301
  - Initial implementation of remaining rules for markdownlint parity
300
302
 
301
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.107...HEAD
303
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.110...HEAD
304
+ [0.0.110]: https://github.com/rvben/rumdl/compare/v0.0.109...v0.0.110
302
305
  [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
303
306
  [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
304
307
  [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
@@ -672,9 +672,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
672
672
 
673
673
  [[package]]
674
674
  name = "hashbrown"
675
- version = "0.15.4"
675
+ version = "0.15.5"
676
676
  source = "registry+https://github.com/rust-lang/crates.io-index"
677
- checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
677
+ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
678
678
 
679
679
  [[package]]
680
680
  name = "heck"
@@ -848,7 +848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
848
848
  checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
849
849
  dependencies = [
850
850
  "equivalent",
851
- "hashbrown 0.15.4",
851
+ "hashbrown 0.15.5",
852
852
  ]
853
853
 
854
854
  [[package]]
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1493
1493
 
1494
1494
  [[package]]
1495
1495
  name = "rumdl"
1496
- version = "0.0.108"
1496
+ version = "0.0.109"
1497
1497
  dependencies = [
1498
1498
  "anyhow",
1499
1499
  "assert_cmd",
@@ -1689,9 +1689,9 @@ dependencies = [
1689
1689
 
1690
1690
  [[package]]
1691
1691
  name = "slab"
1692
- version = "0.4.10"
1692
+ version = "0.4.11"
1693
1693
  source = "registry+https://github.com/rust-lang/crates.io-index"
1694
- checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
1694
+ checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
1695
1695
 
1696
1696
  [[package]]
1697
1697
  name = "smallvec"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.108"
3
+ version = "0.0.109"
4
4
  edition = "2024"
5
5
  rust-version = "1.88.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
@@ -61,11 +61,17 @@ build:
61
61
  cargo build --release
62
62
 
63
63
  test:
64
+ cargo nextest run --profile dev
65
+
66
+ test-legacy:
64
67
  cargo test
65
68
 
66
69
  test-nextest:
67
70
  cargo nextest run
68
71
 
72
+ test-dev:
73
+ cargo nextest run --profile dev
74
+
69
75
  test-quick:
70
76
  cargo nextest run --profile quick
71
77
 
@@ -100,7 +106,7 @@ doc:
100
106
  cargo doc --no-deps
101
107
 
102
108
  watch-test:
103
- cargo watch -x test
109
+ cargo watch -x "nextest run --profile quick"
104
110
 
105
111
  all: fmt check test build
106
112
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.108
3
+ Version: 0.0.109
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -948,39 +948,18 @@ impl<'a> LintContext<'a> {
948
948
  let leading_spaces = caps.get(1).map_or("", |m| m.as_str());
949
949
  let marker = caps.get(2).map_or("", |m| m.as_str());
950
950
  let spacing = caps.get(3).map_or("", |m| m.as_str());
951
- let content = caps.get(4).map_or("", |m| m.as_str());
951
+ let _content = caps.get(4).map_or("", |m| m.as_str());
952
952
  let marker_column = blockquote_prefix_len + leading_spaces.len();
953
953
  let content_column = marker_column + marker.len() + spacing.len();
954
954
 
955
- // Check if this is likely emphasis or not a list item
955
+ // According to CommonMark spec, unordered list items MUST have at least one space
956
+ // after the marker (-, *, or +). Without a space, it's not a list item.
957
+ // This also naturally handles cases like:
958
+ // - *emphasis* (not a list)
959
+ // - **bold** (not a list)
960
+ // - --- (horizontal rule, not a list)
956
961
  if spacing.is_empty() {
957
- // No space after marker - check if it's likely emphasis or just text
958
- if marker == "*" && content.ends_with('*') && !content[..content.len() - 1].contains('*') {
959
- // Likely emphasis like *text*
960
- None
961
- } else if marker == "*" && content.starts_with('*') {
962
- // Likely bold emphasis like **text** or horizontal rule like ***
963
- None
964
- } else if (marker == "*" || marker == "-")
965
- && content.chars().all(|c| c == marker.chars().next().unwrap())
966
- && content.len() >= 2
967
- {
968
- // Likely horizontal rule like *** or ---
969
- None
970
- } else if !content.is_empty() && content.chars().next().unwrap().is_alphabetic() {
971
- // Single word starting with marker, likely not intended as list
972
- // This matches markdownlint behavior
973
- None
974
- } else {
975
- // Other cases with no space - treat as malformed list item
976
- Some(ListItemInfo {
977
- marker: marker.to_string(),
978
- is_ordered: false,
979
- number: None,
980
- marker_column,
981
- content_column,
982
- })
983
- }
962
+ None
984
963
  } else {
985
964
  Some(ListItemInfo {
986
965
  marker: marker.to_string(),
@@ -995,15 +974,14 @@ impl<'a> LintContext<'a> {
995
974
  let number_str = caps.get(2).map_or("", |m| m.as_str());
996
975
  let delimiter = caps.get(3).map_or("", |m| m.as_str());
997
976
  let spacing = caps.get(4).map_or("", |m| m.as_str());
998
- let content = caps.get(5).map_or("", |m| m.as_str());
977
+ let _content = caps.get(5).map_or("", |m| m.as_str());
999
978
  let marker = format!("{number_str}{delimiter}");
1000
979
  let marker_column = blockquote_prefix_len + leading_spaces.len();
1001
980
  let content_column = marker_column + marker.len() + spacing.len();
1002
981
 
1003
- // Check if this is likely not a list item
1004
- if spacing.is_empty() && !content.is_empty() && content.chars().next().unwrap().is_alphabetic() {
1005
- // No space after marker and starts with alphabetic, likely not intended as list
1006
- // This matches markdownlint behavior
982
+ // According to CommonMark spec, ordered list items MUST have at least one space
983
+ // after the marker (period or parenthesis). Without a space, it's not a list item.
984
+ if spacing.is_empty() {
1007
985
  None
1008
986
  } else {
1009
987
  Some(ListItemInfo {
@@ -1343,6 +1321,9 @@ impl<'a> LintContext<'a> {
1343
1321
 
1344
1322
  if let Some(ref mut block) = current_block {
1345
1323
  // Check if this continues the current block
1324
+ // For nested lists, we need to check if this is a nested item (higher nesting level)
1325
+ // or a continuation at the same or lower level
1326
+ let is_nested = nesting > block.nesting_level;
1346
1327
  let same_type =
1347
1328
  (block.is_ordered && list_item.is_ordered) || (!block.is_ordered && !list_item.is_ordered);
1348
1329
  let same_context = block.blockquote_prefix == blockquote_prefix;
@@ -1392,7 +1373,18 @@ impl<'a> LintContext<'a> {
1392
1373
  found_non_list
1393
1374
  };
1394
1375
 
1395
- if same_type && same_context && reasonable_distance && marker_compatible && !has_non_list_content {
1376
+ // A list continues if:
1377
+ // 1. It's a nested item (indented more than the parent), OR
1378
+ // 2. It's the same type at the same level with reasonable distance
1379
+ let continues_list = if is_nested {
1380
+ // Nested items always continue the list if they're in the same context
1381
+ same_context && reasonable_distance && !has_non_list_content
1382
+ } else {
1383
+ // Same-level items need to match type and markers
1384
+ same_type && same_context && reasonable_distance && marker_compatible && !has_non_list_content
1385
+ };
1386
+
1387
+ if continues_list {
1396
1388
  // Extend current block
1397
1389
  block.end_line = line_num;
1398
1390
  block.item_lines.push(line_num);
@@ -118,16 +118,12 @@ impl Rule for MD004UnorderedListStyle {
118
118
 
119
119
  // Use centralized list blocks for better performance and accuracy
120
120
  for list_block in &ctx.list_blocks {
121
- // Skip ordered lists
122
- if list_block.is_ordered {
123
- continue;
124
- }
125
-
126
121
  // Check each list item in this block
122
+ // We need to check individual items even in mixed lists (ordered with nested unordered)
127
123
  for &item_line in &list_block.item_lines {
128
124
  if let Some(line_info) = ctx.line_info(item_line) {
129
125
  if let Some(list_item) = &line_info.list_item {
130
- // Skip ordered lists (safety check)
126
+ // Skip ordered list items - we only care about unordered ones
131
127
  if list_item.is_ordered {
132
128
  continue;
133
129
  }
@@ -245,16 +241,12 @@ impl Rule for MD004UnorderedListStyle {
245
241
 
246
242
  // Use centralized list blocks
247
243
  for list_block in &ctx.list_blocks {
248
- // Skip ordered lists
249
- if list_block.is_ordered {
250
- continue;
251
- }
252
-
253
244
  // Process each list item in this block
245
+ // We need to check individual items even in mixed lists
254
246
  for &item_line in &list_block.item_lines {
255
247
  if let Some(line_info) = ctx.line_info(item_line) {
256
248
  if let Some(list_item) = &line_info.list_item {
257
- // Skip ordered lists (safety check)
249
+ // Skip ordered list items - we only care about unordered ones
258
250
  if list_item.is_ordered {
259
251
  continue;
260
252
  }
@@ -615,12 +607,13 @@ mod tests {
615
607
  #[test]
616
608
  fn test_edge_case_marker_at_end() {
617
609
  let rule = MD004UnorderedListStyle::new(UnorderedListStyle::Asterisk);
618
- let content = "*\n-\n+";
610
+ // These are valid list items with minimal content (just a space)
611
+ let content = "* \n- \n+ ";
619
612
  let ctx = LintContext::new(content);
620
613
  let result = rule.check(&ctx).unwrap();
621
- assert_eq!(result.len(), 2);
614
+ assert_eq!(result.len(), 2); // Should flag - and + as wrong markers
622
615
  let fixed = rule.fix(&ctx).unwrap();
623
- assert_eq!(fixed, "*\n*\n*");
616
+ assert_eq!(fixed, "* \n* \n* ");
624
617
  }
625
618
 
626
619
  #[test]
@@ -16,21 +16,28 @@ use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
16
16
  pub struct MD006StartBullets;
17
17
 
18
18
  impl MD006StartBullets {
19
- /// Check if a bullet is nested under an ordered list item
19
+ /// Check if a bullet is nested under an ordered list item (anywhere in the hierarchy)
20
20
  fn is_nested_under_ordered_item(
21
21
  &self,
22
22
  ctx: &crate::lint_context::LintContext,
23
23
  current_line: usize,
24
24
  current_indent: usize,
25
25
  ) -> bool {
26
- // Look backward from current line to find parent item
26
+ // Look backward from current line to find any ordered ancestor
27
+ let mut check_indent = current_indent;
28
+
27
29
  for line_idx in (1..current_line).rev() {
28
30
  if let Some(line_info) = ctx.line_info(line_idx) {
29
31
  if let Some(list_item) = &line_info.list_item {
30
- // Found a list item - check if it's at a lower indentation (parent level)
31
- if list_item.marker_column < current_indent {
32
- // This is a parent item - check if it's ordered
33
- return list_item.is_ordered;
32
+ // Found a list item - check if it's at a lower indentation (ancestor level)
33
+ if list_item.marker_column < check_indent {
34
+ // This is an ancestor item
35
+ if list_item.is_ordered {
36
+ // Found an ordered ancestor
37
+ return true;
38
+ }
39
+ // Continue looking for higher-level ancestors
40
+ check_indent = list_item.marker_column;
34
41
  }
35
42
  }
36
43
  // If we encounter non-blank, non-list content at column 0, stop looking
@@ -52,17 +59,17 @@ impl MD006StartBullets {
52
59
  // Track which lines contain valid bullet items
53
60
  let mut valid_bullet_lines = vec![false; lines.len()];
54
61
 
55
- // Process each unordered list block
62
+ // Process each list block
56
63
  for list_block in &ctx.list_blocks {
57
- // Skip ordered lists
58
- if list_block.is_ordered {
59
- continue;
60
- }
61
-
62
64
  // Check each list item in this block
65
+ // We need to check unordered items even in mixed lists
63
66
  for &item_line in &list_block.item_lines {
64
67
  if let Some(line_info) = ctx.line_info(item_line) {
65
68
  if let Some(list_item) = &line_info.list_item {
69
+ // Skip ordered list items - we only care about unordered ones
70
+ if list_item.is_ordered {
71
+ continue;
72
+ }
66
73
  let line_idx = item_line - 1;
67
74
  let indent = list_item.marker_column;
68
75
  let line = &lines[line_idx];
@@ -73,9 +80,16 @@ impl MD006StartBullets {
73
80
  // Top-level items are always valid
74
81
  is_valid = true;
75
82
  } else {
76
- // Check if this is nested under an ordered item with correct indentation (3 spaces)
77
- if indent == 3 && self.is_nested_under_ordered_item(ctx, item_line, indent) {
78
- is_valid = true;
83
+ // Check if this is nested under an ordered item with correct indentation
84
+ // For single-digit ordered lists (1.), need at least 3 spaces for proper nesting
85
+ // For double-digit (10.), need at least 4 spaces, etc.
86
+ // But MD006's purpose is to flag top-level indented lists, not validate nesting depth
87
+ if self.is_nested_under_ordered_item(ctx, item_line, indent) {
88
+ // It's nested under an ordered item
89
+ // Only flag if indentation is less than 3 (won't nest properly in CommonMark)
90
+ if indent >= 3 {
91
+ is_valid = true;
92
+ }
79
93
  } else {
80
94
  // Check if this is a valid nested item under another bullet
81
95
  match Self::find_relevant_previous_bullet(&lines, line_idx) {
@@ -120,14 +134,28 @@ impl MD006StartBullets {
120
134
  end_col - start_col,
121
135
  );
122
136
 
137
+ // Generate appropriate message based on context
138
+ let message = if self.is_nested_under_ordered_item(ctx, item_line, indent) {
139
+ // It's trying to nest under an ordered item but has insufficient indentation
140
+ format!(
141
+ "Nested list needs at least 3 spaces of indentation under ordered item (found {indent})"
142
+ )
143
+ } else if indent > 0 {
144
+ // It's indented but not nested under anything - should start at column 0
145
+ format!(
146
+ "Consider starting bulleted lists at the beginning of the line (found {indent} leading spaces)"
147
+ )
148
+ } else {
149
+ // Shouldn't happen, but just in case
150
+ format!("List indentation issue (found {indent} leading spaces)")
151
+ };
152
+
123
153
  result.push(LintWarning {
124
154
  line: item_line,
125
155
  column: start_col,
126
156
  end_line: item_line,
127
157
  end_column: end_col,
128
- message: format!(
129
- "Consider starting bulleted lists at the beginning of the line (found {indent} leading spaces)"
130
- ),
158
+ message,
131
159
  severity: Severity::Warning,
132
160
  rule_name: Some(self.name()),
133
161
  fix: Some(Fix {
@@ -501,14 +529,14 @@ mod tests {
501
529
  let content = "\
502
530
  1. **Active Directory/LDAP**
503
531
  - Wrong: only 2 spaces
504
- - Also wrong: 4 spaces";
532
+ - Wrong: only 1 space";
505
533
  let ctx = crate::lint_context::LintContext::new(content);
506
534
  let result = rule.check(&ctx).unwrap();
507
- // Should flag the incorrect indentations
535
+ // Should flag the incorrect indentations (less than 3 spaces)
508
536
  assert_eq!(
509
537
  result.len(),
510
538
  2,
511
- "Expected warnings for bullets with incorrect spacing under numbered items"
539
+ "Expected warnings for bullets with insufficient spacing under numbered items"
512
540
  );
513
541
  assert!(result.iter().any(|w| w.line == 2));
514
542
  assert!(result.iter().any(|w| w.line == 3));
@@ -640,4 +640,19 @@ result = inspect.stack()[1]
640
640
  assert_eq!(result.len(), 1, "Should only flag the actual reversed link");
641
641
  assert_eq!(result[0].line, 4, "Should flag the reversed link on line 4");
642
642
  }
643
+
644
+ #[test]
645
+ fn test_issue_26_specific_case() {
646
+ // Test for issue #26 - specific case reported
647
+ let rule = MD011NoReversedLinks;
648
+
649
+ let content = r#"The first thing I need to find is the name of the redacted key name, `doc.<key_name_omitted>`. I'll use `SUBSTRING(ATTRIBUTES(doc)[0], 0, 1) == '<c>'` as that test, where `<c>` is different characters. This gets the first attribute from `doc` and uses `SUBSTRING` to get the first character."#;
650
+ let ctx = LintContext::new(content);
651
+ let result = rule.check(&ctx).unwrap();
652
+ assert_eq!(
653
+ result.len(),
654
+ 0,
655
+ "Should not flag ATTRIBUTES(doc)[0] inside inline code (issue #26)"
656
+ );
657
+ }
643
658
  }
@@ -90,21 +90,33 @@ impl Rule for MD029OrderedListPrefix {
90
90
 
91
91
  let mut warnings = Vec::new();
92
92
 
93
- // Group ordered list blocks that are only separated by code blocks
94
- // This handles cases where the centralized system splits lists that should be continuous
95
- let ordered_blocks: Vec<_> = ctx.list_blocks.iter().filter(|block| block.is_ordered).collect();
96
-
97
- if ordered_blocks.is_empty() {
93
+ // Collect all list blocks that contain ordered items (not just purely ordered blocks)
94
+ // This handles mixed lists where ordered items are nested within unordered lists
95
+ let blocks_with_ordered: Vec<_> = ctx
96
+ .list_blocks
97
+ .iter()
98
+ .filter(|block| {
99
+ // Check if this block contains any ordered items
100
+ block.item_lines.iter().any(|&line| {
101
+ ctx.line_info(line)
102
+ .and_then(|info| info.list_item.as_ref())
103
+ .map(|item| item.is_ordered)
104
+ .unwrap_or(false)
105
+ })
106
+ })
107
+ .collect();
108
+
109
+ if blocks_with_ordered.is_empty() {
98
110
  return Ok(Vec::new());
99
111
  }
100
112
 
101
113
  // Group consecutive list blocks that should be treated as continuous
102
114
  let mut block_groups = Vec::new();
103
- let mut current_group = vec![ordered_blocks[0]];
115
+ let mut current_group = vec![blocks_with_ordered[0]];
104
116
 
105
- for i in 1..ordered_blocks.len() {
106
- let prev_block = ordered_blocks[i - 1];
107
- let current_block = ordered_blocks[i];
117
+ for i in 1..blocks_with_ordered.len() {
118
+ let prev_block = blocks_with_ordered[i - 1];
119
+ let current_block = blocks_with_ordered[i];
108
120
 
109
121
  // Check if there are only code blocks/fences between these list blocks
110
122
  let between_content_is_code_only =
@@ -411,6 +423,33 @@ impl MD029OrderedListPrefix {
411
423
  true
412
424
  }
413
425
 
426
+ /// Find the parent unordered item for an ordered item
427
+ /// Returns the line number of the parent, or 0 if no parent found
428
+ fn find_parent_unordered_item(
429
+ &self,
430
+ ctx: &crate::lint_context::LintContext,
431
+ ordered_line: usize,
432
+ ordered_indent: usize,
433
+ ) -> usize {
434
+ // Look backward from the ordered item to find its unordered parent
435
+ for line_num in (1..ordered_line).rev() {
436
+ if let Some(line_info) = ctx.line_info(line_num) {
437
+ if let Some(list_item) = &line_info.list_item {
438
+ // Found a list item - check if it could be the parent
439
+ if list_item.marker_column < ordered_indent && !list_item.is_ordered {
440
+ // This unordered item is at a lower indentation, so it's the parent
441
+ return line_num;
442
+ }
443
+ }
444
+ // If we encounter non-blank, non-list content at column 0, stop looking
445
+ else if !line_info.is_blank && line_info.indent == 0 {
446
+ break;
447
+ }
448
+ }
449
+ }
450
+ 0 // No parent found
451
+ }
452
+
414
453
  /// Check a group of ordered list blocks that should be treated as continuous
415
454
  fn check_ordered_list_group(
416
455
  &self,
@@ -441,26 +480,31 @@ impl MD029OrderedListPrefix {
441
480
  // Sort by line number to ensure correct order
442
481
  all_items.sort_by_key(|(line_num, _, _)| *line_num);
443
482
 
444
- // Group items by indentation level and process each level independently
445
- let mut level_groups: std::collections::HashMap<
446
- usize,
483
+ // Group items by indentation level AND parent context
484
+ // Use (indent_level, parent_line) as the key to separate sequences under different parents
485
+ type LevelGroups<'a> = std::collections::HashMap<
486
+ (usize, usize),
447
487
  Vec<(
448
488
  usize,
449
- &crate::lint_context::LineInfo,
450
- &crate::lint_context::ListItemInfo,
489
+ &'a crate::lint_context::LineInfo,
490
+ &'a crate::lint_context::ListItemInfo,
451
491
  )>,
452
- > = std::collections::HashMap::new();
492
+ >;
493
+ let mut level_groups: LevelGroups = std::collections::HashMap::new();
453
494
 
454
495
  for (line_num, line_info, list_item) in all_items {
455
- // Group by marker column (indentation level)
496
+ // Find the parent unordered item for this ordered item
497
+ let parent_line = self.find_parent_unordered_item(ctx, line_num, list_item.marker_column);
498
+
499
+ // Group by both marker column (indentation level) and parent context
456
500
  level_groups
457
- .entry(list_item.marker_column)
501
+ .entry((list_item.marker_column, parent_line))
458
502
  .or_default()
459
503
  .push((line_num, line_info, list_item));
460
504
  }
461
505
 
462
- // Process each indentation level separately
463
- for (_indent, mut group) in level_groups {
506
+ // Process each indentation level and parent context separately
507
+ for ((_indent, _parent), mut group) in level_groups {
464
508
  // Sort by line number to ensure correct order
465
509
  group.sort_by_key(|(line_num, _, _)| *line_num);
466
510
 
@@ -299,6 +299,11 @@ impl Rule for MD033NoInlineHtml {
299
299
  if structure.is_in_code_block(line_num) {
300
300
  continue;
301
301
  }
302
+ // Skip lines that are indented code blocks (4+ spaces or tab) per CommonMark spec
303
+ // Even if they're not in the structure's code blocks (e.g., HTML blocks)
304
+ if line.starts_with(" ") || line.starts_with('\t') {
305
+ continue;
306
+ }
302
307
 
303
308
  // Find all HTML tags in the line using regex
304
309
  for tag_match in HTML_TAG_FINDER.find_iter(line) {