rumdl 0.0.107__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 (374) hide show
  1. rumdl-0.0.109/.config/nextest.toml +82 -0
  2. {rumdl-0.0.107 → rumdl-0.0.109}/.pre-commit-config.yaml +38 -11
  3. {rumdl-0.0.107 → rumdl-0.0.109}/CHANGELOG.md +12 -1
  4. {rumdl-0.0.107 → rumdl-0.0.109}/Cargo.lock +10 -10
  5. {rumdl-0.0.107 → rumdl-0.0.109}/Cargo.toml +1 -1
  6. {rumdl-0.0.107 → rumdl-0.0.109}/Makefile +18 -2
  7. {rumdl-0.0.107 → rumdl-0.0.109}/PKG-INFO +1 -1
  8. rumdl-0.0.109/src/bin/debug_frontmatter.rs +42 -0
  9. {rumdl-0.0.107 → rumdl-0.0.109}/src/lint_context.rs +27 -35
  10. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md004_unordered_list_style.rs +8 -15
  11. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md006_start_bullets.rs +49 -21
  12. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md011_no_reversed_links.rs +15 -0
  13. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md029_ordered_list_prefix.rs +63 -19
  14. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md033_no_inline_html.rs +5 -0
  15. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md037_spaces_around_emphasis.rs +151 -8
  16. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md042_no_empty_links.rs +36 -0
  17. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md044_proper_names.rs +107 -0
  18. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md046_code_block_style.rs +1 -81
  19. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md049_emphasis_style.rs +74 -0
  20. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md050_strong_style.rs +83 -6
  21. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md051_link_fragments.rs +5 -0
  22. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md052_reference_links_images.rs +81 -3
  23. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md058_blanks_around_tables.rs +30 -0
  24. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/code_block_utils.rs +17 -3
  25. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/document_structure.rs +23 -15
  26. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/table_utils.rs +136 -12
  27. {rumdl-0.0.107 → rumdl-0.0.109}/tests/cli_integration_tests.rs +6 -45
  28. rumdl-0.0.109/tests/common/cli_test_utils.rs +257 -0
  29. rumdl-0.0.109/tests/common/fixtures.rs +92 -0
  30. rumdl-0.0.109/tests/common/mod.rs +3 -0
  31. rumdl-0.0.109/tests/common/test_utils.rs +160 -0
  32. {rumdl-0.0.107 → rumdl-0.0.109}/tests/lsp_memory_leak_tests.rs +14 -14
  33. {rumdl-0.0.107 → rumdl-0.0.109}/tests/markdownlint_cli_integration.rs +4 -15
  34. {rumdl-0.0.107 → rumdl-0.0.109}/tests/markdownlintignore_test.rs +3 -10
  35. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/emphasis_edge_cases_test.rs +7 -2
  36. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/inline_content_edge_cases_test.rs +4 -2
  37. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/list_rules_integration_test.rs +4 -6
  38. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md032_test.rs +34 -0
  39. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md044_test.rs +2 -1
  40. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md046_test.rs +26 -0
  41. {rumdl-0.0.107 → rumdl-0.0.109}/tests/thread_safety_tests.rs +3 -3
  42. rumdl-0.0.107/.config/nextest.toml +0 -46
  43. {rumdl-0.0.107 → rumdl-0.0.109}/.mise.toml +0 -0
  44. {rumdl-0.0.107 → rumdl-0.0.109}/.rumdl.toml +0 -0
  45. {rumdl-0.0.107 → rumdl-0.0.109}/.rustfmt.toml +0 -0
  46. {rumdl-0.0.107 → rumdl-0.0.109}/LICENSE +0 -0
  47. {rumdl-0.0.107 → rumdl-0.0.109}/MANIFEST.in +0 -0
  48. {rumdl-0.0.107 → rumdl-0.0.109}/README.md +0 -0
  49. {rumdl-0.0.107 → rumdl-0.0.109}/assets/logo.png +0 -0
  50. {rumdl-0.0.107 → rumdl-0.0.109}/benches/fix_performance.rs +0 -0
  51. {rumdl-0.0.107 → rumdl-0.0.109}/benches/range_performance.rs +0 -0
  52. {rumdl-0.0.107 → rumdl-0.0.109}/benches/range_utils_benchmark.rs +0 -0
  53. {rumdl-0.0.107 → rumdl-0.0.109}/benches/rule_performance.rs +0 -0
  54. {rumdl-0.0.107 → rumdl-0.0.109}/benches/simple_fix_bench.rs +0 -0
  55. {rumdl-0.0.107 → rumdl-0.0.109}/benchmark/bin/bench_lint_context.rs +0 -0
  56. {rumdl-0.0.107 → rumdl-0.0.109}/benchmark/bin/benchmark.rs +0 -0
  57. {rumdl-0.0.107 → rumdl-0.0.109}/benchmark/bin/benchmark_rule.rs +0 -0
  58. {rumdl-0.0.107 → rumdl-0.0.109}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  59. {rumdl-0.0.107 → rumdl-0.0.109}/benchmark/bin/measure_code_span_performance.rs +0 -0
  60. {rumdl-0.0.107 → rumdl-0.0.109}/docs/RULES.md +0 -0
  61. {rumdl-0.0.107 → rumdl-0.0.109}/docs/global-settings.md +0 -0
  62. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md001.md +0 -0
  63. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md002.md +0 -0
  64. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md003.md +0 -0
  65. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md004.md +0 -0
  66. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md005.md +0 -0
  67. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md006.md +0 -0
  68. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md007.md +0 -0
  69. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md009.md +0 -0
  70. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md010.md +0 -0
  71. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md011.md +0 -0
  72. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md012.md +0 -0
  73. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md013.md +0 -0
  74. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md014.md +0 -0
  75. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md018.md +0 -0
  76. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md019.md +0 -0
  77. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md020.md +0 -0
  78. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md021.md +0 -0
  79. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md022.md +0 -0
  80. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md023.md +0 -0
  81. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md024.md +0 -0
  82. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md025.md +0 -0
  83. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md026.md +0 -0
  84. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md027.md +0 -0
  85. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md028.md +0 -0
  86. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md029.md +0 -0
  87. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md030.md +0 -0
  88. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md031.md +0 -0
  89. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md032.md +0 -0
  90. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md033.md +0 -0
  91. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md034.md +0 -0
  92. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md035.md +0 -0
  93. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md036.md +0 -0
  94. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md037.md +0 -0
  95. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md038.md +0 -0
  96. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md039.md +0 -0
  97. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md040.md +0 -0
  98. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md041.md +0 -0
  99. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md042.md +0 -0
  100. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md043.md +0 -0
  101. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md044.md +0 -0
  102. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md045.md +0 -0
  103. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md046.md +0 -0
  104. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md047.md +0 -0
  105. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md048.md +0 -0
  106. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md049.md +0 -0
  107. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md050.md +0 -0
  108. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md051.md +0 -0
  109. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md052.md +0 -0
  110. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md053.md +0 -0
  111. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md054.md +0 -0
  112. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md055.md +0 -0
  113. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md056.md +0 -0
  114. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md057.md +0 -0
  115. {rumdl-0.0.107 → rumdl-0.0.109}/docs/md058.md +0 -0
  116. {rumdl-0.0.107 → rumdl-0.0.109}/docs/vscode-extension.md +0 -0
  117. {rumdl-0.0.107 → rumdl-0.0.109}/parity_check.py +0 -0
  118. {rumdl-0.0.107 → rumdl-0.0.109}/pyproject.toml +0 -0
  119. {rumdl-0.0.107 → rumdl-0.0.109}/python/MANIFEST.in +0 -0
  120. {rumdl-0.0.107 → rumdl-0.0.109}/python/PYTHON-README.md +0 -0
  121. {rumdl-0.0.107 → rumdl-0.0.109}/python/rumdl/__init__.py +0 -0
  122. {rumdl-0.0.107 → rumdl-0.0.109}/python/rumdl/__main__.py +0 -0
  123. {rumdl-0.0.107 → rumdl-0.0.109}/python/rumdl/py.typed +0 -0
  124. {rumdl-0.0.107 → rumdl-0.0.109}/rumdl.toml.example +0 -0
  125. {rumdl-0.0.107 → rumdl-0.0.109}/rust-toolchain.toml +0 -0
  126. {rumdl-0.0.107 → rumdl-0.0.109}/scripts/extract-changelog.sh +0 -0
  127. {rumdl-0.0.107 → rumdl-0.0.109}/scripts/prepare-release.sh +0 -0
  128. {rumdl-0.0.107 → rumdl-0.0.109}/scripts/setup-pre-commit.sh +0 -0
  129. {rumdl-0.0.107 → rumdl-0.0.109}/scripts/update-pre-commit-docs.sh +0 -0
  130. {rumdl-0.0.107 → rumdl-0.0.109}/src/config.rs +0 -0
  131. {rumdl-0.0.107 → rumdl-0.0.109}/src/exit_codes.rs +0 -0
  132. {rumdl-0.0.107 → rumdl-0.0.109}/src/inline_config.rs +0 -0
  133. {rumdl-0.0.107 → rumdl-0.0.109}/src/lib.rs +0 -0
  134. {rumdl-0.0.107 → rumdl-0.0.109}/src/lsp/mod.rs +0 -0
  135. {rumdl-0.0.107 → rumdl-0.0.109}/src/lsp/server.rs +0 -0
  136. {rumdl-0.0.107 → rumdl-0.0.109}/src/lsp/types.rs +0 -0
  137. {rumdl-0.0.107 → rumdl-0.0.109}/src/main.rs +0 -0
  138. {rumdl-0.0.107 → rumdl-0.0.109}/src/markdownlint_config.rs +0 -0
  139. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/azure.rs +0 -0
  140. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/concise.rs +0 -0
  141. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/github.rs +0 -0
  142. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/gitlab.rs +0 -0
  143. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/grouped.rs +0 -0
  144. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/json.rs +0 -0
  145. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/json_lines.rs +0 -0
  146. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/junit.rs +0 -0
  147. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/mod.rs +0 -0
  148. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/pylint.rs +0 -0
  149. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/sarif.rs +0 -0
  150. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/formatters/text.rs +0 -0
  151. {rumdl-0.0.107 → rumdl-0.0.109}/src/output/mod.rs +0 -0
  152. {rumdl-0.0.107 → rumdl-0.0.109}/src/parallel.rs +0 -0
  153. {rumdl-0.0.107 → rumdl-0.0.109}/src/performance.rs +0 -0
  154. {rumdl-0.0.107 → rumdl-0.0.109}/src/profiling.rs +0 -0
  155. {rumdl-0.0.107 → rumdl-0.0.109}/src/python.rs +0 -0
  156. {rumdl-0.0.107 → rumdl-0.0.109}/src/rule.rs +0 -0
  157. {rumdl-0.0.107 → rumdl-0.0.109}/src/rule_config.rs +0 -0
  158. {rumdl-0.0.107 → rumdl-0.0.109}/src/rule_config_serde.rs +0 -0
  159. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/blockquote_utils.rs +0 -0
  160. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/code_block_utils.rs +0 -0
  161. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/code_fence_utils.rs +0 -0
  162. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/emphasis_style.rs +0 -0
  163. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/front_matter_utils.rs +0 -0
  164. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/heading_utils.rs +0 -0
  165. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/list_utils.rs +0 -0
  166. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md001_heading_increment.rs +0 -0
  167. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  168. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md002_first_heading_h1.rs +0 -0
  169. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md003_heading_style/md003_config.rs +0 -0
  170. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md003_heading_style.rs +0 -0
  171. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  172. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md005_list_indent.rs +0 -0
  173. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  174. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md007_ul_indent.rs +0 -0
  175. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  176. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md009_trailing_spaces.rs +0 -0
  177. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  178. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md010_no_hard_tabs.rs +0 -0
  179. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  180. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md012_no_multiple_blanks.rs +0 -0
  181. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md013_line_length/md013_config.rs +0 -0
  182. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md013_line_length.rs +0 -0
  183. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  184. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md014_commands_show_output.rs +0 -0
  185. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md018_no_missing_space_atx.rs +0 -0
  186. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  187. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  188. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  189. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  190. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md022_blanks_around_headings.rs +0 -0
  191. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md023_heading_start_left.rs +0 -0
  192. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  193. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md024_no_duplicate_heading.rs +0 -0
  194. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md025_single_title/md025_config.rs +0 -0
  195. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md025_single_title.rs +0 -0
  196. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  197. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  198. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  199. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  200. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  201. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  202. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md030_list_marker_space.rs +0 -0
  203. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md031_blanks_around_fences.rs +0 -0
  204. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md032_blanks_around_lists.rs +0 -0
  205. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  206. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md034_no_bare_urls.rs +0 -0
  207. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md035_hr_style/md035_config.rs +0 -0
  208. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md035_hr_style.rs +0 -0
  209. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  210. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  211. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md038_no_space_in_code.rs +0 -0
  212. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md039_no_space_in_links.rs +0 -0
  213. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md040_fenced_code_language.rs +0 -0
  214. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md041_first_line_heading.rs +0 -0
  215. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md043_required_headings.rs +0 -0
  216. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md044_proper_names/md044_config.rs +0 -0
  217. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  218. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md045_no_alt_text.rs +0 -0
  219. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  220. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md047_single_trailing_newline.rs +0 -0
  221. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  222. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md048_code_fence_style.rs +0 -0
  223. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  224. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md050_strong_style/md050_config.rs +0 -0
  225. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  226. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  227. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md054_link_image_style.rs +0 -0
  228. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  229. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md055_table_pipe_style.rs +0 -0
  230. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md056_table_column_count.rs +0 -0
  231. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  232. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/md057_existing_relative_links.rs +0 -0
  233. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/mod.rs +0 -0
  234. {rumdl-0.0.107 → rumdl-0.0.109}/src/rules/strong_style.rs +0 -0
  235. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/ast_utils.rs +0 -0
  236. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/early_returns.rs +0 -0
  237. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/element_cache.rs +0 -0
  238. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/emphasis_utils.rs +0 -0
  239. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/fix_utils.rs +0 -0
  240. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/markdown_elements.rs +0 -0
  241. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/mod.rs +0 -0
  242. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/range_utils.rs +0 -0
  243. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/regex_cache.rs +0 -0
  244. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/string_interner.rs +0 -0
  245. {rumdl-0.0.107 → rumdl-0.0.109}/src/utils/text_reflow.rs +0 -0
  246. {rumdl-0.0.107 → rumdl-0.0.109}/src/vscode.rs +0 -0
  247. {rumdl-0.0.107 → rumdl-0.0.109}/tests/advanced_integration_tests.rs +0 -0
  248. {rumdl-0.0.107 → rumdl-0.0.109}/tests/character_ranges/additional_tests.rs +0 -0
  249. {rumdl-0.0.107 → rumdl-0.0.109}/tests/character_ranges/basic_tests.rs +0 -0
  250. {rumdl-0.0.107 → rumdl-0.0.109}/tests/character_ranges/comprehensive_tests.rs +0 -0
  251. {rumdl-0.0.107 → rumdl-0.0.109}/tests/character_ranges/extended_tests.rs +0 -0
  252. {rumdl-0.0.107 → rumdl-0.0.109}/tests/character_ranges/mod.rs +0 -0
  253. {rumdl-0.0.107 → rumdl-0.0.109}/tests/character_ranges/unicode_utils.rs +0 -0
  254. {rumdl-0.0.107 → rumdl-0.0.109}/tests/cli_duplication_test.rs +0 -0
  255. {rumdl-0.0.107 → rumdl-0.0.109}/tests/cli_explain_test.rs +0 -0
  256. {rumdl-0.0.107 → rumdl-0.0.109}/tests/cli_flag_precedence_test.rs +0 -0
  257. {rumdl-0.0.107 → rumdl-0.0.109}/tests/cli_lsp_fix_consistency.rs +0 -0
  258. {rumdl-0.0.107 → rumdl-0.0.109}/tests/cli_statistics_test.rs +0 -0
  259. {rumdl-0.0.107 → rumdl-0.0.109}/tests/commonmark_compliance_tests.rs +0 -0
  260. {rumdl-0.0.107 → rumdl-0.0.109}/tests/comprehensive_integration_tests.rs +0 -0
  261. {rumdl-0.0.107 → rumdl-0.0.109}/tests/comprehensive_output_format_tests.rs +0 -0
  262. {rumdl-0.0.107 → rumdl-0.0.109}/tests/config_application_tests.rs +0 -0
  263. {rumdl-0.0.107 → rumdl-0.0.109}/tests/config_file_command_test.rs +0 -0
  264. {rumdl-0.0.107 → rumdl-0.0.109}/tests/config_tests.rs +0 -0
  265. {rumdl-0.0.107 → rumdl-0.0.109}/tests/configuration_inheritance_tests.rs +0 -0
  266. {rumdl-0.0.107 → rumdl-0.0.109}/tests/consistency_regression_tests.rs +0 -0
  267. {rumdl-0.0.107 → rumdl-0.0.109}/tests/cross_platform_compatibility_tests.rs +0 -0
  268. {rumdl-0.0.107 → rumdl-0.0.109}/tests/deeply_nested_lists_performance_test.rs +0 -0
  269. {rumdl-0.0.107 → rumdl-0.0.109}/tests/escaped_brackets_test.rs +0 -0
  270. {rumdl-0.0.107 → rumdl-0.0.109}/tests/final_confidence_assessment.rs +0 -0
  271. {rumdl-0.0.107 → rumdl-0.0.109}/tests/init_command_test.rs +0 -0
  272. {rumdl-0.0.107 → rumdl-0.0.109}/tests/init_tests.rs +0 -0
  273. {rumdl-0.0.107 → rumdl-0.0.109}/tests/inline_config_blocks_test.rs +0 -0
  274. {rumdl-0.0.107 → rumdl-0.0.109}/tests/inline_config_test.rs +0 -0
  275. {rumdl-0.0.107 → rumdl-0.0.109}/tests/integration_tests.rs +0 -0
  276. {rumdl-0.0.107 → rumdl-0.0.109}/tests/json_output_test.rs +0 -0
  277. {rumdl-0.0.107 → rumdl-0.0.109}/tests/lib.rs +0 -0
  278. {rumdl-0.0.107 → rumdl-0.0.109}/tests/lsp_editor_integration_tests.rs +0 -0
  279. {rumdl-0.0.107 → rumdl-0.0.109}/tests/lsp_integration_tests.rs +0 -0
  280. {rumdl-0.0.107 → rumdl-0.0.109}/tests/lsp_tests.rs +0 -0
  281. {rumdl-0.0.107 → rumdl-0.0.109}/tests/malformed_markdown_stress_tests.rs +0 -0
  282. {rumdl-0.0.107 → rumdl-0.0.109}/tests/markdownlint_config_test.rs +0 -0
  283. {rumdl-0.0.107 → rumdl-0.0.109}/tests/md013_reflow_integration_test.rs +0 -0
  284. {rumdl-0.0.107 → rumdl-0.0.109}/tests/nested_code_block_test.rs +0 -0
  285. {rumdl-0.0.107 → rumdl-0.0.109}/tests/output_format_integration_tests.rs +0 -0
  286. {rumdl-0.0.107 → rumdl-0.0.109}/tests/output_format_tests.rs +0 -0
  287. {rumdl-0.0.107 → rumdl-0.0.109}/tests/perf_check.rs +0 -0
  288. {rumdl-0.0.107 → rumdl-0.0.109}/tests/performance_validation_tests.rs +0 -0
  289. {rumdl-0.0.107 → rumdl-0.0.109}/tests/pyproject_config_tests.rs +0 -0
  290. {rumdl-0.0.107 → rumdl-0.0.109}/tests/python_bindings_test.rs +0 -0
  291. {rumdl-0.0.107 → rumdl-0.0.109}/tests/real_world_repository_tests.rs +0 -0
  292. {rumdl-0.0.107 → rumdl-0.0.109}/tests/regression_prevention_tests.rs +0 -0
  293. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/heading_edge_cases_test.rs +0 -0
  294. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/link_edge_cases_test.rs +0 -0
  295. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md001_test.rs +0 -0
  296. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md001_unicode_test.rs +0 -0
  297. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md002_test.rs +0 -0
  298. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md003_test.rs +0 -0
  299. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md004_test.rs +0 -0
  300. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md005_test.rs +0 -0
  301. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md005_unicode_test.rs +0 -0
  302. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md006_test.rs +0 -0
  303. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md006_unicode_test.rs +0 -0
  304. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md007_test.rs +0 -0
  305. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md009_test.rs +0 -0
  306. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md010_test.rs +0 -0
  307. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md011_test.rs +0 -0
  308. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md012_test.rs +0 -0
  309. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md013_test.rs +0 -0
  310. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md014_test.rs +0 -0
  311. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md018_test.rs +0 -0
  312. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md019_test.rs +0 -0
  313. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md020_test.rs +0 -0
  314. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md021_test.rs +0 -0
  315. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md022_test.rs +0 -0
  316. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md023_extended_test.rs +0 -0
  317. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md023_test.rs +0 -0
  318. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md024_test.rs +0 -0
  319. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md025_test.rs +0 -0
  320. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md026_test.rs +0 -0
  321. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md027_test.rs +0 -0
  322. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md028_test.rs +0 -0
  323. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md029_test.rs +0 -0
  324. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md029_unicode_test.rs +0 -0
  325. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md030_test.rs +0 -0
  326. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md031_test.rs +0 -0
  327. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md033_extended_test.rs +0 -0
  328. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md033_test.rs +0 -0
  329. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md034_ipv6_test.rs +0 -0
  330. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md034_test.rs +0 -0
  331. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md035_test.rs +0 -0
  332. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md036_test.rs +0 -0
  333. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md037_test.rs +0 -0
  334. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md038_nested_backticks_test.rs +0 -0
  335. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md038_test.rs +0 -0
  336. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md039_test.rs +0 -0
  337. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md040_test.rs +0 -0
  338. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md041_test.rs +0 -0
  339. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md042_test.rs +0 -0
  340. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md043_test.rs +0 -0
  341. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md045_test.rs +0 -0
  342. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md047_test.rs +0 -0
  343. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md048_test.rs +0 -0
  344. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md049_test.rs +0 -0
  345. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md050_test.rs +0 -0
  346. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md051_test.rs +0 -0
  347. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md051_unicode_test.rs +0 -0
  348. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md052_test.rs +0 -0
  349. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md053_additional_test.rs +0 -0
  350. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md053_proptest.rs +0 -0
  351. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md053_test.rs +0 -0
  352. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md054_test.rs +0 -0
  353. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md054_unicode_test.rs +0 -0
  354. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md055_test.rs +0 -0
  355. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md056_test.rs +0 -0
  356. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md057_test.rs +0 -0
  357. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/md058_test.rs +0 -0
  358. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules/mod.rs +0 -0
  359. {rumdl-0.0.107 → rumdl-0.0.109}/tests/rules_mod_test.rs +0 -0
  360. {rumdl-0.0.107 → rumdl-0.0.109}/tests/unicode_edge_case_tests.rs +0 -0
  361. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils/blockquote_utils_test.rs +0 -0
  362. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils/code_block_utils_extended_test.rs +0 -0
  363. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils/code_block_utils_test.rs +0 -0
  364. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils/core_utils_test.rs +0 -0
  365. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils/front_matter_utils_test.rs +0 -0
  366. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils/line_index_test.rs +0 -0
  367. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils/mod.rs +0 -0
  368. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils_markdown_edge_cases.rs +0 -0
  369. {rumdl-0.0.107 → rumdl-0.0.109}/tests/utils_tests.rs +0 -0
  370. {rumdl-0.0.107 → rumdl-0.0.109}/tests/vscode_extension_fixes.rs +0 -0
  371. {rumdl-0.0.107 → rumdl-0.0.109}/tests/vscode_test.rs +0 -0
  372. {rumdl-0.0.107 → rumdl-0.0.109}/tests/vscode_tests.rs +0 -0
  373. {rumdl-0.0.107 → rumdl-0.0.109}/tests/vscode_windows_comprehensive_test.rs +0 -0
  374. {rumdl-0.0.107 → rumdl-0.0.109}/tests/vscode_windows_test.rs +0 -0
@@ -0,0 +1,82 @@
1
+ # Nextest configuration
2
+ # https://nexte.st/book/configuration
3
+
4
+ [profile.default]
5
+ # Detect flaky tests and retry them
6
+ retries = { backoff = "exponential", count = 2, delay = "1s", max-delay = "10s" }
7
+
8
+ # Run tests with 2x the number of CPUs
9
+ test-threads = "num-cpus"
10
+
11
+ # Fail fast on first failure in CI
12
+ fail-fast = false
13
+
14
+ # Show failed tests immediately
15
+ failure-output = "immediate"
16
+
17
+ # Show successful tests at the end
18
+ success-output = "final"
19
+
20
+ # Status output level
21
+ status-level = "pass"
22
+
23
+ [profile.ci]
24
+
25
+ # More conservative in CI
26
+ test-threads = "num-cpus"
27
+
28
+ # Always show all output in CI
29
+ failure-output = "immediate"
30
+ success-output = "immediate"
31
+ status-level = "all"
32
+
33
+ # No retries in CI to catch flaky tests
34
+ retries = 0
35
+
36
+ # Quick profile for development
37
+ [profile.quick]
38
+
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
+
42
+ # Even more parallel execution locally
43
+ test-threads = "num-cpus"
44
+
45
+ # Less verbose output
46
+ status-level = "fail"
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
+
64
+ # Ultra-fast profile for pre-commit hooks
65
+ [profile.pre-commit]
66
+
67
+ # Only run unit tests in lib, skip all integration tests and binaries
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/)'
69
+
70
+ # Maximum parallelism for speed
71
+ test-threads = "num-cpus"
72
+
73
+ # Minimal output for speed
74
+ status-level = "fail"
75
+ failure-output = "immediate"
76
+ success-output = "never"
77
+
78
+ # No retries to save time
79
+ retries = 0
80
+
81
+ # Fail fast on first failure
82
+ fail-fast = true
@@ -1,6 +1,10 @@
1
1
  # Pre-commit hooks for rumdl
2
- # Install with: pre-commit install
3
- # Run manually: pre-commit run --all-files
2
+ # Install with:
3
+ # pre-commit install # Install commit hooks
4
+ # pre-commit install --hook-type pre-push # Install push hooks
5
+ # Run manually:
6
+ # pre-commit run --all-files # Run commit hooks
7
+ # pre-commit run --hook-stage push --all-files # Run push hooks
4
8
 
5
9
  repos:
6
10
  # Rust formatting and linting
@@ -15,26 +19,19 @@ repos:
15
19
 
16
20
  - id: cargo-clippy
17
21
  name: cargo clippy
18
- entry: make lint
22
+ entry: make lint-fast
19
23
  language: system
20
24
  types: [rust]
21
25
  pass_filenames: false
22
26
 
23
27
  - id: cargo-test-quick
24
28
  name: cargo test (quick)
25
- entry: make test-quick
29
+ entry: make test-pre-commit
26
30
  language: system
27
31
  types: [rust]
28
32
  pass_filenames: false
29
33
  stages: [pre-commit]
30
34
 
31
- - id: cargo-check
32
- name: cargo check
33
- entry: cargo check --all-targets --all-features
34
- language: system
35
- types: [rust]
36
- pass_filenames: false
37
-
38
35
  # General file quality checks
39
36
  - repo: https://github.com/pre-commit/pre-commit-hooks
40
37
  rev: v4.6.0
@@ -57,3 +54,33 @@ repos:
57
54
  hooks:
58
55
  - id: rumdl
59
56
  exclude: ^(test_tmp|benchmark/test-data|docs/temp|CHANGELOG\.md)
57
+
58
+ # Pre-push hooks for comprehensive validation
59
+ - repo: local
60
+ hooks:
61
+ - id: cargo-test-full
62
+ name: cargo test (full suite)
63
+ entry: make test-push
64
+ language: system
65
+ types: [rust]
66
+ pass_filenames: false
67
+ stages: [pre-push]
68
+ verbose: true
69
+
70
+ - id: cargo-lint-full
71
+ name: cargo clippy (all targets)
72
+ entry: make lint
73
+ language: system
74
+ types: [rust]
75
+ pass_filenames: false
76
+ stages: [pre-push]
77
+ verbose: true
78
+
79
+ - id: cargo-doc-check
80
+ name: cargo doc (check)
81
+ entry: cargo doc --no-deps --all-features
82
+ language: system
83
+ types: [rust]
84
+ pass_filenames: false
85
+ stages: [pre-push]
86
+ verbose: true
@@ -7,8 +7,17 @@ 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
+
12
+ ## [0.0.107] - 2025-08-06
13
+
10
14
  ## [0.0.107] - 2025-08-06
11
15
 
16
+ ### Fixed
17
+ - MD036: Remove automatic fix to prevent document corruption when bold/italic text is used as image captions, labels, or warnings (#23)
18
+ - MD011: No longer flags patterns like `()[1]` inside inline code as reversed links (#19)
19
+ - MD052: No longer flags reference patterns inside HTML comments as undefined references (#20)
20
+
12
21
  ## [0.0.106] - 2025-08-05
13
22
 
14
23
  ### Changed
@@ -291,7 +300,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
291
300
 
292
301
  - Initial implementation of remaining rules for markdownlint parity
293
302
 
294
- [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
305
+ [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
295
306
  [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
296
307
  [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
297
308
  [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
@@ -277,9 +277,9 @@ dependencies = [
277
277
 
278
278
  [[package]]
279
279
  name = "clap"
280
- version = "4.5.42"
280
+ version = "4.5.43"
281
281
  source = "registry+https://github.com/rust-lang/crates.io-index"
282
- checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882"
282
+ checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f"
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.42"
290
+ version = "4.5.43"
291
291
  source = "registry+https://github.com/rust-lang/crates.io-index"
292
- checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966"
292
+ checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65"
293
293
  dependencies = [
294
294
  "anstream",
295
295
  "anstyle",
@@ -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.107"
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.107"
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,14 +61,27 @@ 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
 
78
+ test-pre-commit:
79
+ cargo nextest run --profile pre-commit
80
+
81
+ test-push:
82
+ @echo "Running full test suite (this may take a few minutes)..."
83
+ cargo nextest run
84
+
72
85
  test-ci:
73
86
  cargo nextest run --profile ci
74
87
 
@@ -81,7 +94,10 @@ fmt:
81
94
  cargo fix --allow-dirty --allow-staged
82
95
 
83
96
  lint:
84
- cargo clippy --all-targets --all-features -- -D warnings
97
+ CARGO_INCREMENTAL=1 cargo clippy --all-targets --all-features -- -D warnings
98
+
99
+ lint-fast:
100
+ CARGO_INCREMENTAL=1 cargo clippy --workspace --lib --bins -- -D warnings
85
101
 
86
102
  check:
87
103
  cargo check --all-targets --all-features
@@ -90,7 +106,7 @@ doc:
90
106
  cargo doc --no-deps
91
107
 
92
108
  watch-test:
93
- cargo watch -x test
109
+ cargo watch -x "nextest run --profile quick"
94
110
 
95
111
  all: fmt check test build
96
112
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.107
3
+ Version: 0.0.109
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -0,0 +1,42 @@
1
+ use rumdl::rules::front_matter_utils::FrontMatterUtils;
2
+ use std::env;
3
+ use std::fs;
4
+
5
+ fn main() {
6
+ let args: Vec<String> = env::args().collect();
7
+ let content = if args.len() > 1 {
8
+ fs::read_to_string(&args[1]).expect("Failed to read file")
9
+ } else {
10
+ r#"+++
11
+ title = "My Post"
12
+ tags = ["example", "test"]
13
+ +++
14
+
15
+ # Content
16
+
17
+ [missing] reference should be flagged."#
18
+ .to_string()
19
+ };
20
+
21
+ println!("Content:");
22
+ for (i, line) in content.lines().enumerate() {
23
+ println!("Line {}: {}", i + 1, line);
24
+ }
25
+ println!();
26
+
27
+ let line_count = content.lines().count();
28
+
29
+ // Test with 0-based indexing (what the function actually uses)
30
+ println!("Testing is_in_front_matter with 0-based indexing:");
31
+ for i in 0..line_count {
32
+ let in_frontmatter = FrontMatterUtils::is_in_front_matter(&content, i);
33
+ println!("Line {} (0-based={}): in_frontmatter={}", i + 1, i, in_frontmatter);
34
+ }
35
+
36
+ // Test also with 1-based indexing (what we pass from MD052)
37
+ println!("\nTesting is_in_front_matter with 1-based indexing:");
38
+ for i in 1..=line_count {
39
+ let in_frontmatter = FrontMatterUtils::is_in_front_matter(&content, i);
40
+ println!("Line {i}: in_frontmatter={in_frontmatter}");
41
+ }
42
+ }
@@ -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
  }