rumdl 0.0.156__tar.gz → 0.0.158__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rumdl might be problematic. Click here for more details.

Files changed (465) hide show
  1. {rumdl-0.0.156 → rumdl-0.0.158}/CHANGELOG.md +234 -0
  2. {rumdl-0.0.156 → rumdl-0.0.158}/Cargo.lock +54 -1
  3. {rumdl-0.0.156 → rumdl-0.0.158}/Cargo.toml +2 -1
  4. {rumdl-0.0.156 → rumdl-0.0.158}/PKG-INFO +1 -1
  5. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md042.md +28 -0
  6. {rumdl-0.0.156 → rumdl-0.0.158}/src/config.rs +67 -44
  7. rumdl-0.0.158/src/file_processor.rs +794 -0
  8. rumdl-0.0.158/src/formatter.rs +407 -0
  9. {rumdl-0.0.156 → rumdl-0.0.158}/src/lib.rs +8 -8
  10. {rumdl-0.0.156 → rumdl-0.0.158}/src/lsp/server.rs +69 -3
  11. rumdl-0.0.158/src/main.rs +1394 -0
  12. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/code_block_utils.rs +16 -22
  13. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md009_trailing_spaces.rs +3 -3
  14. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md010_no_hard_tabs.rs +3 -5
  15. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md011_no_reversed_links.rs +12 -14
  16. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md012_no_multiple_blanks.rs +2 -1
  17. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md022_blanks_around_headings.rs +9 -10
  18. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md026_no_trailing_punctuation.rs +12 -17
  19. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md032_blanks_around_lists.rs +6 -5
  20. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md034_no_bare_urls.rs +26 -18
  21. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md037_spaces_around_emphasis.rs +9 -12
  22. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md042_no_empty_links.rs +150 -18
  23. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md046_code_block_style.rs +2 -2
  24. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md047_single_trailing_newline.rs +15 -66
  25. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md049_emphasis_style.rs +5 -9
  26. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md050_strong_style.rs +4 -9
  27. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md057_existing_relative_links.rs +6 -17
  28. rumdl-0.0.158/src/stdin_processor.rs +212 -0
  29. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/code_block_utils.rs +31 -7
  30. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_patterns.rs +33 -5
  31. {rumdl-0.0.156 → rumdl-0.0.158}/src/vscode.rs +78 -66
  32. rumdl-0.0.158/src/watch.rs +489 -0
  33. {rumdl-0.0.156 → rumdl-0.0.158}/tests/cli_integration_tests.rs +38 -53
  34. rumdl-0.0.158/tests/code_block_blockquote_edge_cases.rs +243 -0
  35. {rumdl-0.0.156 → rumdl-0.0.158}/tests/config_tests.rs +15 -32
  36. rumdl-0.0.158/tests/crlf_line_endings_test.rs +350 -0
  37. rumdl-0.0.158/tests/exclude_with_explicit_paths_test.rs +225 -0
  38. rumdl-0.0.158/tests/mkdocs_anchor_edge_cases_test.rs +338 -0
  39. rumdl-0.0.158/tests/mkdocs_anchor_test.rs +115 -0
  40. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/link_edge_cases_test.rs +18 -8
  41. rumdl-0.0.158/tests/rules/md033_blockquote_test.rs +282 -0
  42. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md034_test.rs +69 -0
  43. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md042_test.rs +91 -15
  44. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_comprehensive_test.rs +3 -2
  45. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/mod.rs +1 -0
  46. {rumdl-0.0.156 → rumdl-0.0.158}/tests/vscode_test.rs +2 -24
  47. {rumdl-0.0.156 → rumdl-0.0.158}/tests/vscode_tests.rs +20 -82
  48. rumdl-0.0.156/src/main.rs +0 -3474
  49. {rumdl-0.0.156 → rumdl-0.0.158}/.config/nextest.toml +0 -0
  50. {rumdl-0.0.156 → rumdl-0.0.158}/.mise.toml +0 -0
  51. {rumdl-0.0.156 → rumdl-0.0.158}/.pre-commit-config.yaml +0 -0
  52. {rumdl-0.0.156 → rumdl-0.0.158}/.rumdl.toml +0 -0
  53. {rumdl-0.0.156 → rumdl-0.0.158}/.rustfmt.toml +0 -0
  54. {rumdl-0.0.156 → rumdl-0.0.158}/LICENSE +0 -0
  55. {rumdl-0.0.156 → rumdl-0.0.158}/MANIFEST.in +0 -0
  56. {rumdl-0.0.156 → rumdl-0.0.158}/Makefile +0 -0
  57. {rumdl-0.0.156 → rumdl-0.0.158}/README.md +0 -0
  58. {rumdl-0.0.156 → rumdl-0.0.158}/assets/logo.png +0 -0
  59. {rumdl-0.0.156 → rumdl-0.0.158}/benches/fix_performance.rs +0 -0
  60. {rumdl-0.0.156 → rumdl-0.0.158}/benches/range_performance.rs +0 -0
  61. {rumdl-0.0.156 → rumdl-0.0.158}/benches/range_utils_benchmark.rs +0 -0
  62. {rumdl-0.0.156 → rumdl-0.0.158}/benches/rule_performance.rs +0 -0
  63. {rumdl-0.0.156 → rumdl-0.0.158}/benches/simple_fix_bench.rs +0 -0
  64. {rumdl-0.0.156 → rumdl-0.0.158}/benchmark/bin/bench_lint_context.rs +0 -0
  65. {rumdl-0.0.156 → rumdl-0.0.158}/benchmark/bin/benchmark.rs +0 -0
  66. {rumdl-0.0.156 → rumdl-0.0.158}/benchmark/bin/benchmark_rule.rs +0 -0
  67. {rumdl-0.0.156 → rumdl-0.0.158}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  68. {rumdl-0.0.156 → rumdl-0.0.158}/benchmark/bin/measure_code_span_performance.rs +0 -0
  69. {rumdl-0.0.156 → rumdl-0.0.158}/docs/LINTCONTEXT_OPTIMIZATION_PLAN.md +0 -0
  70. {rumdl-0.0.156 → rumdl-0.0.158}/docs/LINTCONTEXT_OPTIMIZATION_SUMMARY.md +0 -0
  71. {rumdl-0.0.156 → rumdl-0.0.158}/docs/LINTCONTEXT_PERFORMANCE_ANALYSIS.md +0 -0
  72. {rumdl-0.0.156 → rumdl-0.0.158}/docs/PHASE_2_OPTIMIZATION_COMPLETE.md +0 -0
  73. {rumdl-0.0.156 → rumdl-0.0.158}/docs/PHASE_3_OPTIMIZATION_COMPLETE.md +0 -0
  74. {rumdl-0.0.156 → rumdl-0.0.158}/docs/RULES.md +0 -0
  75. {rumdl-0.0.156 → rumdl-0.0.158}/docs/global-settings.md +0 -0
  76. {rumdl-0.0.156 → rumdl-0.0.158}/docs/inline-configuration.md +0 -0
  77. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md001.md +0 -0
  78. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md002.md +0 -0
  79. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md003.md +0 -0
  80. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md004.md +0 -0
  81. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md005.md +0 -0
  82. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md006.md +0 -0
  83. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md007.md +0 -0
  84. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md009.md +0 -0
  85. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md010.md +0 -0
  86. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md011.md +0 -0
  87. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md012.md +0 -0
  88. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md013.md +0 -0
  89. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md014.md +0 -0
  90. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md018.md +0 -0
  91. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md019.md +0 -0
  92. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md020.md +0 -0
  93. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md021.md +0 -0
  94. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md022.md +0 -0
  95. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md023.md +0 -0
  96. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md024.md +0 -0
  97. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md025.md +0 -0
  98. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md026.md +0 -0
  99. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md027.md +0 -0
  100. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md028.md +0 -0
  101. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md029.md +0 -0
  102. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md030.md +0 -0
  103. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md031.md +0 -0
  104. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md032.md +0 -0
  105. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md033.md +0 -0
  106. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md034.md +0 -0
  107. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md035.md +0 -0
  108. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md036.md +0 -0
  109. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md037.md +0 -0
  110. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md038.md +0 -0
  111. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md039.md +0 -0
  112. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md040.md +0 -0
  113. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md041.md +0 -0
  114. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md043.md +0 -0
  115. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md044.md +0 -0
  116. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md045.md +0 -0
  117. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md046.md +0 -0
  118. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md047.md +0 -0
  119. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md048.md +0 -0
  120. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md049.md +0 -0
  121. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md050.md +0 -0
  122. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md051.md +0 -0
  123. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md052.md +0 -0
  124. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md053.md +0 -0
  125. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md054.md +0 -0
  126. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md055.md +0 -0
  127. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md056.md +0 -0
  128. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md057.md +0 -0
  129. {rumdl-0.0.156 → rumdl-0.0.158}/docs/md058.md +0 -0
  130. {rumdl-0.0.156 → rumdl-0.0.158}/docs/vscode-extension.md +0 -0
  131. {rumdl-0.0.156 → rumdl-0.0.158}/parity_check.py +0 -0
  132. {rumdl-0.0.156 → rumdl-0.0.158}/pyproject.toml +0 -0
  133. {rumdl-0.0.156 → rumdl-0.0.158}/rumdl/__init__.py +0 -0
  134. {rumdl-0.0.156 → rumdl-0.0.158}/rumdl/__main__.py +0 -0
  135. {rumdl-0.0.156 → rumdl-0.0.158}/rumdl/py.typed +0 -0
  136. {rumdl-0.0.156 → rumdl-0.0.158}/rumdl.schema.json +0 -0
  137. {rumdl-0.0.156 → rumdl-0.0.158}/rumdl.toml.example +0 -0
  138. {rumdl-0.0.156 → rumdl-0.0.158}/rust-toolchain.toml +0 -0
  139. {rumdl-0.0.156 → rumdl-0.0.158}/scripts/extract-changelog.sh +0 -0
  140. {rumdl-0.0.156 → rumdl-0.0.158}/scripts/generate-downloads-table.sh +0 -0
  141. {rumdl-0.0.156 → rumdl-0.0.158}/scripts/pre-release.sh +0 -0
  142. {rumdl-0.0.156 → rumdl-0.0.158}/scripts/prepare-release.sh +0 -0
  143. {rumdl-0.0.156 → rumdl-0.0.158}/scripts/setup-pre-commit.sh +0 -0
  144. {rumdl-0.0.156 → rumdl-0.0.158}/scripts/update-pre-commit-docs.sh +0 -0
  145. {rumdl-0.0.156 → rumdl-0.0.158}/src/exit_codes.rs +0 -0
  146. {rumdl-0.0.156 → rumdl-0.0.158}/src/fix_coordinator.rs +0 -0
  147. {rumdl-0.0.156 → rumdl-0.0.158}/src/inline_config.rs +0 -0
  148. {rumdl-0.0.156 → rumdl-0.0.158}/src/lint_context.rs +0 -0
  149. {rumdl-0.0.156 → rumdl-0.0.158}/src/lsp/mod.rs +0 -0
  150. {rumdl-0.0.156 → rumdl-0.0.158}/src/lsp/types.rs +0 -0
  151. {rumdl-0.0.156 → rumdl-0.0.158}/src/markdownlint_config.rs +0 -0
  152. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/azure.rs +0 -0
  153. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/concise.rs +0 -0
  154. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/github.rs +0 -0
  155. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/gitlab.rs +0 -0
  156. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/grouped.rs +0 -0
  157. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/json.rs +0 -0
  158. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/json_lines.rs +0 -0
  159. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/junit.rs +0 -0
  160. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/mod.rs +0 -0
  161. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/pylint.rs +0 -0
  162. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/sarif.rs +0 -0
  163. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/formatters/text.rs +0 -0
  164. {rumdl-0.0.156 → rumdl-0.0.158}/src/output/mod.rs +0 -0
  165. {rumdl-0.0.156 → rumdl-0.0.158}/src/parallel.rs +0 -0
  166. {rumdl-0.0.156 → rumdl-0.0.158}/src/performance.rs +0 -0
  167. {rumdl-0.0.156 → rumdl-0.0.158}/src/profiling.rs +0 -0
  168. {rumdl-0.0.156 → rumdl-0.0.158}/src/rule.rs +0 -0
  169. {rumdl-0.0.156 → rumdl-0.0.158}/src/rule_config.rs +0 -0
  170. {rumdl-0.0.156 → rumdl-0.0.158}/src/rule_config_serde.rs +0 -0
  171. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/blockquote_utils.rs +0 -0
  172. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/code_fence_utils.rs +0 -0
  173. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/emphasis_style.rs +0 -0
  174. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/front_matter_utils.rs +0 -0
  175. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/heading_utils.rs +0 -0
  176. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/list_utils.rs +0 -0
  177. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md001_heading_increment.rs +0 -0
  178. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  179. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md002_first_heading_h1.rs +0 -0
  180. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md003_heading_style/md003_config.rs +0 -0
  181. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md003_heading_style.rs +0 -0
  182. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  183. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md004_unordered_list_style.rs +0 -0
  184. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md005_list_indent.rs +0 -0
  185. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md006_start_bullets.rs +0 -0
  186. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  187. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md007_ul_indent.rs +0 -0
  188. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  189. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  190. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  191. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md013_line_length/md013_config.rs +0 -0
  192. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md013_line_length.rs +0 -0
  193. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  194. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md014_commands_show_output.rs +0 -0
  195. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md018_no_missing_space_atx.rs +0 -0
  196. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  197. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  198. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  199. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  200. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md023_heading_start_left.rs +0 -0
  201. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  202. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md024_no_duplicate_heading.rs +0 -0
  203. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md025_single_title/md025_config.rs +0 -0
  204. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md025_single_title.rs +0 -0
  205. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  206. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  207. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  208. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  209. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md029_ordered_list_prefix.rs +0 -0
  210. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  211. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md030_list_marker_space.rs +0 -0
  212. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md031_blanks_around_fences.rs +0 -0
  213. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  214. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md033_no_inline_html.rs +0 -0
  215. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md035_hr_style/md035_config.rs +0 -0
  216. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md035_hr_style.rs +0 -0
  217. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  218. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  219. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md038_no_space_in_code.rs +0 -0
  220. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md039_no_space_in_links.rs +0 -0
  221. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md040_fenced_code_language.rs +0 -0
  222. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md041_first_line_heading.rs +0 -0
  223. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md043_required_headings.rs +0 -0
  224. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md044_proper_names/md044_config.rs +0 -0
  225. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md044_proper_names.rs +0 -0
  226. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  227. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md045_no_alt_text.rs +0 -0
  228. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  229. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  230. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md048_code_fence_style.rs +0 -0
  231. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  232. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md050_strong_style/md050_config.rs +0 -0
  233. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md051_link_fragments.rs +0 -0
  234. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md052_reference_links_images.rs +0 -0
  235. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  236. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  237. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md054_link_image_style.rs +0 -0
  238. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  239. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md055_table_pipe_style.rs +0 -0
  240. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md056_table_column_count.rs +0 -0
  241. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  242. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/md058_blanks_around_tables.rs +0 -0
  243. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/mod.rs +0 -0
  244. {rumdl-0.0.156 → rumdl-0.0.158}/src/rules/strong_style.rs +0 -0
  245. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/anchor_styles/github.rs +0 -0
  246. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/anchor_styles/jekyll.rs +0 -0
  247. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/anchor_styles/kramdown.rs +0 -0
  248. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
  249. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/anchor_styles/mod.rs +0 -0
  250. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/ast_utils.rs +0 -0
  251. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/document_structure.rs +0 -0
  252. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/early_returns.rs +0 -0
  253. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/element_cache.rs +0 -0
  254. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/emphasis_utils.rs +0 -0
  255. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/fix_utils.rs +0 -0
  256. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/header_id_utils.rs +0 -0
  257. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/jinja_utils.rs +0 -0
  258. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/kramdown_utils.rs +0 -0
  259. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/line_ending.rs +0 -0
  260. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/markdown_elements.rs +0 -0
  261. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_admonitions.rs +0 -0
  262. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_common.rs +0 -0
  263. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_critic.rs +0 -0
  264. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_footnotes.rs +0 -0
  265. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_snippets.rs +0 -0
  266. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_tabs.rs +0 -0
  267. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocs_test_utils.rs +0 -0
  268. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mkdocstrings_refs.rs +0 -0
  269. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/mod.rs +0 -0
  270. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/range_utils.rs +0 -0
  271. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/regex_cache.rs +0 -0
  272. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/skip_context.rs +0 -0
  273. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/string_interner.rs +0 -0
  274. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/table_utils.rs +0 -0
  275. {rumdl-0.0.156 → rumdl-0.0.158}/src/utils/text_reflow.rs +0 -0
  276. {rumdl-0.0.156 → rumdl-0.0.158}/tests/advanced_integration_tests.rs +0 -0
  277. {rumdl-0.0.156 → rumdl-0.0.158}/tests/character_ranges/additional_tests.rs +0 -0
  278. {rumdl-0.0.156 → rumdl-0.0.158}/tests/character_ranges/basic_tests.rs +0 -0
  279. {rumdl-0.0.156 → rumdl-0.0.158}/tests/character_ranges/comprehensive_tests.rs +0 -0
  280. {rumdl-0.0.156 → rumdl-0.0.158}/tests/character_ranges/extended_tests.rs +0 -0
  281. {rumdl-0.0.156 → rumdl-0.0.158}/tests/character_ranges/mod.rs +0 -0
  282. {rumdl-0.0.156 → rumdl-0.0.158}/tests/character_ranges/unicode_utils.rs +0 -0
  283. {rumdl-0.0.156 → rumdl-0.0.158}/tests/cli_duplication_test.rs +0 -0
  284. {rumdl-0.0.156 → rumdl-0.0.158}/tests/cli_explain_test.rs +0 -0
  285. {rumdl-0.0.156 → rumdl-0.0.158}/tests/cli_flag_precedence_test.rs +0 -0
  286. {rumdl-0.0.156 → rumdl-0.0.158}/tests/cli_lsp_fix_consistency.rs +0 -0
  287. {rumdl-0.0.156 → rumdl-0.0.158}/tests/cli_statistics_test.rs +0 -0
  288. {rumdl-0.0.156 → rumdl-0.0.158}/tests/common/cli_test_utils.rs +0 -0
  289. {rumdl-0.0.156 → rumdl-0.0.158}/tests/common/fixtures.rs +0 -0
  290. {rumdl-0.0.156 → rumdl-0.0.158}/tests/common/mod.rs +0 -0
  291. {rumdl-0.0.156 → rumdl-0.0.158}/tests/common/test_utils.rs +0 -0
  292. {rumdl-0.0.156 → rumdl-0.0.158}/tests/commonmark_compliance_tests.rs +0 -0
  293. {rumdl-0.0.156 → rumdl-0.0.158}/tests/comprehensive_integration_tests.rs +0 -0
  294. {rumdl-0.0.156 → rumdl-0.0.158}/tests/comprehensive_output_format_tests.rs +0 -0
  295. {rumdl-0.0.156 → rumdl-0.0.158}/tests/config_application_tests.rs +0 -0
  296. {rumdl-0.0.156 → rumdl-0.0.158}/tests/config_file_command_test.rs +0 -0
  297. {rumdl-0.0.156 → rumdl-0.0.158}/tests/config_upward_traversal_test.rs +0 -0
  298. {rumdl-0.0.156 → rumdl-0.0.158}/tests/configuration_inheritance_tests.rs +0 -0
  299. {rumdl-0.0.156 → rumdl-0.0.158}/tests/consistency_regression_tests.rs +0 -0
  300. {rumdl-0.0.156 → rumdl-0.0.158}/tests/cross_platform_compatibility_tests.rs +0 -0
  301. {rumdl-0.0.156 → rumdl-0.0.158}/tests/deeply_nested_lists_performance_test.rs +0 -0
  302. {rumdl-0.0.156 → rumdl-0.0.158}/tests/escaped_brackets_test.rs +0 -0
  303. {rumdl-0.0.156 → rumdl-0.0.158}/tests/final_confidence_assessment.rs +0 -0
  304. {rumdl-0.0.156 → rumdl-0.0.158}/tests/fix_counting_test.rs +0 -0
  305. {rumdl-0.0.156 → rumdl-0.0.158}/tests/fix_performance_baseline_test.rs +0 -0
  306. {rumdl-0.0.156 → rumdl-0.0.158}/tests/fixable_unfixable_config_test.rs +0 -0
  307. {rumdl-0.0.156 → rumdl-0.0.158}/tests/init_command_test.rs +0 -0
  308. {rumdl-0.0.156 → rumdl-0.0.158}/tests/init_tests.rs +0 -0
  309. {rumdl-0.0.156 → rumdl-0.0.158}/tests/inline_config_blocks_test.rs +0 -0
  310. {rumdl-0.0.156 → rumdl-0.0.158}/tests/inline_config_test.rs +0 -0
  311. {rumdl-0.0.156 → rumdl-0.0.158}/tests/integration_tests.rs +0 -0
  312. {rumdl-0.0.156 → rumdl-0.0.158}/tests/json_output_test.rs +0 -0
  313. {rumdl-0.0.156 → rumdl-0.0.158}/tests/kramdown_integration_test.rs +0 -0
  314. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lib.rs +0 -0
  315. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_editor_integration_tests.rs +0 -0
  316. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_formatting_tests.rs +0 -0
  317. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_initialization_options_test.rs +0 -0
  318. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_integration_tests.rs +0 -0
  319. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_memory_leak_tests.rs +0 -0
  320. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_mkdocs_flavor_test.rs +0 -0
  321. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_tests.rs +0 -0
  322. {rumdl-0.0.156 → rumdl-0.0.158}/tests/lsp_unopened_document_test.rs +0 -0
  323. {rumdl-0.0.156 → rumdl-0.0.158}/tests/malformed_markdown_stress_tests.rs +0 -0
  324. {rumdl-0.0.156 → rumdl-0.0.158}/tests/markdownlint_cli_integration.rs +0 -0
  325. {rumdl-0.0.156 → rumdl-0.0.158}/tests/markdownlint_config_test.rs +0 -0
  326. {rumdl-0.0.156 → rumdl-0.0.158}/tests/markdownlintignore_test.rs +0 -0
  327. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md009_md013_integration_test.rs +0 -0
  328. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md009_md013_order_test.rs +0 -0
  329. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md013_hard_breaks_test.rs +0 -0
  330. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md013_reflow_integration_test.rs +0 -0
  331. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md032_edge_cases_test.rs +0 -0
  332. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md032_ordered_list_bug_test.rs +0 -0
  333. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md033_edge_cases_test.rs +0 -0
  334. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md037_xxxx_regression_test.rs +0 -0
  335. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md038_false_positive_test.rs +0 -0
  336. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md051_issue_39_regression_test.rs +0 -0
  337. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md051_readme_bug_test.rs +0 -0
  338. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md051_toc_bug_test.rs +0 -0
  339. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md052_literal_brackets_test.rs +0 -0
  340. {rumdl-0.0.156 → rumdl-0.0.158}/tests/md054_code_span_test.rs +0 -0
  341. {rumdl-0.0.156 → rumdl-0.0.158}/tests/nested_code_block_test.rs +0 -0
  342. {rumdl-0.0.156 → rumdl-0.0.158}/tests/output_format_integration_tests.rs +0 -0
  343. {rumdl-0.0.156 → rumdl-0.0.158}/tests/output_format_tests.rs +0 -0
  344. {rumdl-0.0.156 → rumdl-0.0.158}/tests/per_file_ignores_integration_test.rs +0 -0
  345. {rumdl-0.0.156 → rumdl-0.0.158}/tests/perf_check.rs +0 -0
  346. {rumdl-0.0.156 → rumdl-0.0.158}/tests/performance_validation_tests.rs +0 -0
  347. {rumdl-0.0.156 → rumdl-0.0.158}/tests/pyproject_config_tests.rs +0 -0
  348. {rumdl-0.0.156 → rumdl-0.0.158}/tests/real_world_repository_tests.rs +0 -0
  349. {rumdl-0.0.156 → rumdl-0.0.158}/tests/regression_prevention_tests.rs +0 -0
  350. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  351. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/heading_edge_cases_test.rs +0 -0
  352. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  353. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/list_rules_integration_test.rs +0 -0
  354. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md001_test.rs +0 -0
  355. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md001_unicode_test.rs +0 -0
  356. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md002_test.rs +0 -0
  357. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md003_test.rs +0 -0
  358. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md004_test.rs +0 -0
  359. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md005_dynamic_indent_test.rs +0 -0
  360. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md005_test.rs +0 -0
  361. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md005_unicode_test.rs +0 -0
  362. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md006_test.rs +0 -0
  363. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md006_unicode_test.rs +0 -0
  364. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md007_test.rs +0 -0
  365. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md009_test.rs +0 -0
  366. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md010_test.rs +0 -0
  367. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md011_test.rs +0 -0
  368. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md012_test.rs +0 -0
  369. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md013_test.rs +0 -0
  370. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md014_test.rs +0 -0
  371. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md018_test.rs +0 -0
  372. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md019_test.rs +0 -0
  373. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md020_test.rs +0 -0
  374. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md021_test.rs +0 -0
  375. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md022_test.rs +0 -0
  376. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md023_extended_test.rs +0 -0
  377. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md023_test.rs +0 -0
  378. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md024_test.rs +0 -0
  379. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md025_test.rs +0 -0
  380. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md026_kramdown_test.rs +0 -0
  381. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md026_test.rs +0 -0
  382. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md027_test.rs +0 -0
  383. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md028_md009_interaction_test.rs +0 -0
  384. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md028_test.rs +0 -0
  385. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md029_code_block_separation_test.rs +0 -0
  386. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md029_fix_test.rs +0 -0
  387. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md029_issue42_test.rs +0 -0
  388. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
  389. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
  390. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md029_test.rs +0 -0
  391. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md029_unicode_test.rs +0 -0
  392. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md030_test.rs +0 -0
  393. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md031_kramdown_test.rs +0 -0
  394. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md031_test.rs +0 -0
  395. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md032_test.rs +0 -0
  396. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md033_extended_test.rs +0 -0
  397. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md033_kramdown_test.rs +0 -0
  398. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md033_test.rs +0 -0
  399. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md034_ipv6_test.rs +0 -0
  400. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md035_test.rs +0 -0
  401. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md036_test.rs +0 -0
  402. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md037_kramdown_test.rs +0 -0
  403. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md037_test.rs +0 -0
  404. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md038_nested_backticks_test.rs +0 -0
  405. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md038_test.rs +0 -0
  406. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md039_test.rs +0 -0
  407. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md040_test.rs +0 -0
  408. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md041_test.rs +0 -0
  409. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md043_test.rs +0 -0
  410. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md044_test.rs +0 -0
  411. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md045_test.rs +0 -0
  412. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md046_test.rs +0 -0
  413. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md047_test.rs +0 -0
  414. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md048_test.rs +0 -0
  415. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md049_test.rs +0 -0
  416. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md050_test.rs +0 -0
  417. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
  418. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_edge_cases_test.rs +0 -0
  419. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_issue_39_regression_test.rs +0 -0
  420. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
  421. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_property_based_test.rs +0 -0
  422. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_regression_prevention_test.rs +0 -0
  423. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_test.rs +0 -0
  424. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md051_unicode_security_test.rs +0 -0
  425. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md052_test.rs +0 -0
  426. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md053_additional_test.rs +0 -0
  427. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md053_proptest.rs +0 -0
  428. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md053_test.rs +0 -0
  429. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md054_test.rs +0 -0
  430. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md054_unicode_test.rs +0 -0
  431. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md055_test.rs +0 -0
  432. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md056_test.rs +0 -0
  433. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md057_test.rs +0 -0
  434. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md058_kramdown_test.rs +0 -0
  435. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/md058_test.rs +0 -0
  436. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/mkdocs_admonitions_test.rs +0 -0
  437. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
  438. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/mkdocs_extensions_test.rs +0 -0
  439. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/mkdocs_snippets_test.rs +0 -0
  440. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules/rule_interaction_test.rs +0 -0
  441. {rumdl-0.0.156 → rumdl-0.0.158}/tests/rules_mod_test.rs +0 -0
  442. {rumdl-0.0.156 → rumdl-0.0.158}/tests/sentence_per_line_test.rs +0 -0
  443. {rumdl-0.0.156 → rumdl-0.0.158}/tests/skip_context_tests.rs +0 -0
  444. {rumdl-0.0.156 → rumdl-0.0.158}/tests/test_ast_code_block_issue.rs +0 -0
  445. {rumdl-0.0.156 → rumdl-0.0.158}/tests/test_gfm_vs_default_parsing.rs +0 -0
  446. {rumdl-0.0.156 → rumdl-0.0.158}/tests/test_lint_context_flow.rs +0 -0
  447. {rumdl-0.0.156 → rumdl-0.0.158}/tests/test_list_ast_structure.rs +0 -0
  448. {rumdl-0.0.156 → rumdl-0.0.158}/tests/test_multiline_ast.rs +0 -0
  449. {rumdl-0.0.156 → rumdl-0.0.158}/tests/test_underscore_edge_cases.rs +0 -0
  450. {rumdl-0.0.156 → rumdl-0.0.158}/tests/thread_safety_tests.rs +0 -0
  451. {rumdl-0.0.156 → rumdl-0.0.158}/tests/unfixable_rules_test.rs +0 -0
  452. {rumdl-0.0.156 → rumdl-0.0.158}/tests/unicode_edge_case_tests.rs +0 -0
  453. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utf8_boundary_tests.rs +0 -0
  454. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils/blockquote_utils_test.rs +0 -0
  455. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils/code_block_utils_extended_test.rs +0 -0
  456. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils/code_block_utils_test.rs +0 -0
  457. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils/core_utils_test.rs +0 -0
  458. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils/front_matter_utils_test.rs +0 -0
  459. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils/line_index_test.rs +0 -0
  460. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils/mod.rs +0 -0
  461. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils_markdown_edge_cases.rs +0 -0
  462. {rumdl-0.0.156 → rumdl-0.0.158}/tests/utils_tests.rs +0 -0
  463. {rumdl-0.0.156 → rumdl-0.0.158}/tests/vscode_extension_fixes.rs +0 -0
  464. {rumdl-0.0.156 → rumdl-0.0.158}/tests/vscode_windows_comprehensive_test.rs +0 -0
  465. {rumdl-0.0.156 → rumdl-0.0.158}/tests/vscode_windows_test.rs +0 -0
@@ -7,6 +7,240 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.158] - 2025-10-14
11
+
12
+ ### Fixed
13
+
14
+ - **CRLF Line Ending Support**: Fixed byte position calculations in multiple rules for Windows-style line endings
15
+ - Fixed MD034, MD046, MD057 byte position calculations
16
+ - Fixed MD037, MD049, MD011 byte position calculations
17
+ - Fixed MD050, MD037, MD010, MD026 byte position calculations
18
+ - Fixed code_block_utils byte position calculation in `is_in_code_span`
19
+ - All rules now correctly handle CRLF line endings in fixes and diagnostics
20
+
21
+ - **Test Stability**: Fixed flaky tests with dependency injection pattern
22
+ - Eliminated race conditions from parallel test execution
23
+ - Tests no longer modify global environment variables
24
+ - Added `serial_test` crate for unavoidable global operations
25
+ - All 1731 tests now pass reliably in parallel execution
26
+
27
+ ### Changed
28
+
29
+ - **Code Architecture**: Major refactoring to improve maintainability
30
+ - Extracted `formatter` module (397 lines) - output formatting logic
31
+ - Extracted `watch` module (491 lines) - watch mode functionality
32
+ - Extracted `file_processor` module (792 lines) - file processing logic
33
+ - Extracted `stdin_processor` module (212 lines) - stdin handling
34
+ - main.rs reduced from 3268 to 1394 lines (57% reduction)
35
+ - Improved code organization and testability
36
+
37
+ - **Line Ending Handling**: Refactored line ending preservation
38
+ - Line ending detection and normalization now at I/O boundaries
39
+ - Internal code always works with consistent LF line endings
40
+ - More efficient: 1 normalization per file instead of per-rule
41
+ - Cleaner separation of concerns
42
+ - Simplified MD047, MD012, MD022 to always use LF internally
43
+ - Removed unnecessary line ending detection from rules
44
+ - Added comprehensive end-to-end CRLF tests
45
+
46
+ ### Removed
47
+
48
+ - **Legacy Fix Implementation**: Removed deprecated fix wrapper functions
49
+ - Removed `apply_fixes()` wrapper
50
+ - Removed `apply_fixes_stdin_coordinated()` wrapper
51
+ - Removed `apply_fixes_stdin()` legacy implementation
52
+ - Removed `RUMDL_NO_FIX_COORDINATOR` environment variable
53
+ - Fix Coordinator is now the only fix strategy (3 weeks stable, ~75% faster)
54
+
55
+ ## [0.0.157] - 2025-10-13
56
+
57
+ ### Changed
58
+
59
+ - **Removed legacy fix implementation** - Removed old single-pass fix implementation and `RUMDL_NO_FIX_COORDINATOR` environment variable. Fix Coordinator is now the only fix strategy, providing ~75% faster fixes with better coverage.
60
+
61
+ ### Added
62
+
63
+ - **MD042**: Full support for MkDocs paragraph anchors (#100)
64
+ - Recognize Python-Markdown `attr_list` extension syntax: `[](){ #anchor }`
65
+ - Support for both anchor IDs (`#id`) and CSS classes (`.class`)
66
+ - Support optional colon syntax: `[](){: #anchor }`
67
+ - UTF-8 boundary validation and DoS prevention (500 char limit)
68
+ - 28 comprehensive tests covering edge cases
69
+ - Complete documentation with links to official Python-Markdown specs
70
+ - References: [attr_list](https://python-markdown.github.io/extensions/attr_list/), [mkdocs-autorefs](https://mkdocstrings.github.io/autorefs/)
71
+
72
+ - **MD042**: Smart URL detection in empty links (#104)
73
+ - When link text looks like a URL (e.g., `[https://example.com]()`), use it as the destination
74
+ - Supports http://, https://, ftp://, ftps:// protocols
75
+ - More intelligent fixes than placeholder URLs
76
+
77
+ - **Always respect exclude patterns by default** (#99)
78
+ - Exclude patterns now always respected, even for explicitly provided files
79
+ - Matches behavior of ESLint, Pylint, Mypy
80
+ - Added `--no-exclude` flag to disable all exclusions when needed
81
+ - LSP support for exclude patterns
82
+ - Shows warnings with actionable hints when excluding files
83
+
84
+ - **Hidden directory scanning** (#102)
85
+ - Now scans hidden directories (like `.documentation`) by default
86
+ - More thorough markdown file discovery
87
+
88
+ ### Fixed
89
+
90
+ - **MD033**: Code blocks in blockquotes false positives (#105)
91
+ - Fixed incorrect flagging of HTML tags inside fenced code blocks within blockquotes
92
+ - Properly strips blockquote markers before detecting fence markers
93
+ - 25 new tests covering nested blockquotes and edge cases
94
+
95
+ - **MD034**: Empty link construct false positives (#104)
96
+ - Fixed incorrect flagging of URLs in `[url]()` and `[url][]` patterns
97
+ - Prevents text corruption during formatting
98
+ - Added patterns to properly exclude empty link constructs
99
+
100
+ - **MD042**: Improved fix quality
101
+ - Removed "useless" placeholder fixes that just create new problems
102
+ - Only provides fixes when we have enough information for valid links
103
+ - No longer auto-fixes `[]()` or `[text]()` with placeholders
104
+
105
+ ### Changed
106
+
107
+ - **BREAKING**: Exclude patterns now always respected by default
108
+ - Previously: `--force-exclude` flag needed to respect excludes for explicit files
109
+ - Now: Excludes always respected by default
110
+ - Migration: Use `--no-exclude` flag if you need the old behavior
111
+
112
+ ## [0.0.156] - 2025-10-08
113
+
114
+ ### Fixed
115
+
116
+ - **Build**: Removed feature-gated benchmark binaries that were causing unnecessary reinstalls
117
+ - Benchmark binaries now only built when explicitly requested
118
+ - Reduces package size and installation time
119
+
120
+ ## [0.0.155] - 2025-10-08
121
+
122
+ ### Fixed
123
+
124
+ - **PyPI Package**: Fixed package structure by removing unused cdylib and dependencies
125
+ - Removed unnecessary C dynamic library configuration
126
+ - Cleaner Python package distribution
127
+
128
+ ## [0.0.154] - 2025-10-08
129
+
130
+ ### Fixed
131
+
132
+ - **MD013**: Implemented segment-based reflow to preserve hard breaks
133
+ - Properly handles double-space line breaks
134
+ - Integration tests updated for new behavior
135
+
136
+ ### Performance
137
+
138
+ - **MD034**: Reuse buffers to reduce per-line allocations
139
+ - **MD005**: Eliminate LineIndex creation overhead
140
+ - **MD030**: Eliminate O(n²) complexity by caching line collection
141
+
142
+ ### Documentation
143
+
144
+ - Organized LintContext optimization documentation
145
+
146
+ ## [0.0.153] - 2025-10-07
147
+
148
+ ### Performance
149
+
150
+ - **Major optimization**: 54 rules now use LintContext character frequency caching
151
+ - Significant performance improvement across the board
152
+ - Reduced redundant scanning of document content
153
+
154
+ - **MD051**: Optimized link fragment validation
155
+ - Faster processing of heading anchors and fragments
156
+
157
+ ### Fixed
158
+
159
+ - **MD013**: Improved nested list handling in reflow mode
160
+ - Better preservation of list structure during reformatting
161
+
162
+ ## [0.0.152] - 2025-10-06
163
+
164
+ ### Fixed
165
+
166
+ - **MD013**: Multi-paragraph list reflow improvements and refactoring
167
+ - Better handling of complex list structures
168
+ - More reliable paragraph detection within lists
169
+
170
+ ## [0.0.151] - 2025-10-05
171
+
172
+ ### Fixed
173
+
174
+ - **MD007**: Fixed tab indentation and cascade behavior
175
+ - Properly handles tabs in list indentation
176
+ - Correct cascade behavior matching markdownlint
177
+
178
+ ## [0.0.150] - 2025-10-04
179
+
180
+ ### Fixed
181
+
182
+ - **MD007**: Multiple fixes for list indentation
183
+ - Correct blockquote list handling
184
+ - Fixed text-aligned indentation to match markdownlint cascade behavior
185
+ - Updated test expectations for cascade behavior
186
+
187
+ ## [0.0.149] - 2025-10-03
188
+
189
+ ### Added
190
+
191
+ - **Configuration**: JSON Schema for rumdl.toml configuration (#89)
192
+ - IDE autocomplete and validation support
193
+ - Better configuration documentation
194
+
195
+ - **Configuration**: Per-file rule ignores (#92)
196
+ - Glob pattern support for ignoring rules on specific files
197
+ - Example: `[per-file-ignores] "docs/*.md" = ["MD013"]`
198
+
199
+ ## [0.0.148] - 2025-10-02
200
+
201
+ ### Fixed
202
+
203
+ - **MD042**: Display improvements
204
+ - Show exact source text in error messages
205
+ - Correct display of shorthand reference links
206
+
207
+ - **MkDocs**: Strip backticks from MkDocs auto-references (#97)
208
+ - Prevents false positives on `` [`module.Class`][] `` patterns
209
+
210
+ ## [0.0.147] - 2025-10-01
211
+
212
+ ### Added
213
+
214
+ - **MkDocs**: Added mkdocstrings support (#94)
215
+ - Recognizes mkdocstrings YAML options
216
+ - Multiple rules migrated to use LintContext for better MkDocs handling
217
+
218
+ ### Fixed
219
+
220
+ - **MD041**: Removed auto-fix capability (#93)
221
+ - Auto-fixing front-heading violations was unreliable
222
+ - Now only reports issues without attempting fixes
223
+
224
+ - **MD026**: Corrected documentation to match implementation (#95)
225
+ - Documentation now accurately reflects punctuation handling
226
+
227
+ - **Jinja2**: Added Jinja2 template support (#96)
228
+ - Prevents false positives in template syntax
229
+ - Better support for MkDocs projects using Jinja2
230
+
231
+ - **MD013**: Prevent false positives for already-reflowed content
232
+ - Smarter detection of intentional line breaks
233
+
234
+ - **MD034**: Properly excludes URLs/emails in code spans and HTML
235
+ - No more false positives on inline code URLs
236
+
237
+ - **MD054**: Fixed column indexing bug
238
+ - Correct error position reporting
239
+
240
+ - **MD033 & MD032**: Resolved false positives (#90, #91)
241
+ - More accurate HTML tag detection
242
+ - Better handling of code blocks
243
+
10
244
  ## [0.0.146] - 2025-09-24
11
245
 
12
246
  ### Added
@@ -586,6 +586,7 @@ checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
586
586
  dependencies = [
587
587
  "futures-channel",
588
588
  "futures-core",
589
+ "futures-executor",
589
590
  "futures-io",
590
591
  "futures-sink",
591
592
  "futures-task",
@@ -608,6 +609,17 @@ version = "0.3.31"
608
609
  source = "registry+https://github.com/rust-lang/crates.io-index"
609
610
  checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
610
611
 
612
+ [[package]]
613
+ name = "futures-executor"
614
+ version = "0.3.31"
615
+ source = "registry+https://github.com/rust-lang/crates.io-index"
616
+ checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
617
+ dependencies = [
618
+ "futures-core",
619
+ "futures-task",
620
+ "futures-util",
621
+ ]
622
+
611
623
  [[package]]
612
624
  name = "futures-io"
613
625
  version = "0.3.31"
@@ -1566,7 +1578,7 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1566
1578
 
1567
1579
  [[package]]
1568
1580
  name = "rumdl"
1569
- version = "0.0.156"
1581
+ version = "0.0.158"
1570
1582
  dependencies = [
1571
1583
  "anyhow",
1572
1584
  "assert_cmd",
@@ -1600,6 +1612,7 @@ dependencies = [
1600
1612
  "serde",
1601
1613
  "serde_json",
1602
1614
  "serde_yaml",
1615
+ "serial_test",
1603
1616
  "strsim",
1604
1617
  "tempfile",
1605
1618
  "thiserror",
@@ -1669,6 +1682,15 @@ dependencies = [
1669
1682
  "winapi-util",
1670
1683
  ]
1671
1684
 
1685
+ [[package]]
1686
+ name = "scc"
1687
+ version = "2.4.0"
1688
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1689
+ checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc"
1690
+ dependencies = [
1691
+ "sdd",
1692
+ ]
1693
+
1672
1694
  [[package]]
1673
1695
  name = "schemars"
1674
1696
  version = "0.8.22"
@@ -1699,6 +1721,12 @@ version = "1.2.0"
1699
1721
  source = "registry+https://github.com/rust-lang/crates.io-index"
1700
1722
  checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1701
1723
 
1724
+ [[package]]
1725
+ name = "sdd"
1726
+ version = "3.0.10"
1727
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1728
+ checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca"
1729
+
1702
1730
  [[package]]
1703
1731
  name = "serde"
1704
1732
  version = "1.0.226"
@@ -1786,6 +1814,31 @@ dependencies = [
1786
1814
  "unsafe-libyaml",
1787
1815
  ]
1788
1816
 
1817
+ [[package]]
1818
+ name = "serial_test"
1819
+ version = "3.2.0"
1820
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1821
+ checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9"
1822
+ dependencies = [
1823
+ "futures",
1824
+ "log",
1825
+ "once_cell",
1826
+ "parking_lot",
1827
+ "scc",
1828
+ "serial_test_derive",
1829
+ ]
1830
+
1831
+ [[package]]
1832
+ name = "serial_test_derive"
1833
+ version = "3.2.0"
1834
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1835
+ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef"
1836
+ dependencies = [
1837
+ "proc-macro2",
1838
+ "quote",
1839
+ "syn",
1840
+ ]
1841
+
1789
1842
  [[package]]
1790
1843
  name = "shlex"
1791
1844
  version = "1.3.0"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.156"
3
+ version = "0.0.158"
4
4
  edition = "2024"
5
5
  rust-version = "1.89.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
@@ -103,6 +103,7 @@ rand = "0.9.1"
103
103
  pretty_assertions = "1.4"
104
104
  unicode-segmentation = "1.12"
105
105
  unicode-width = "0.2"
106
+ serial_test = "3.2"
106
107
 
107
108
  [target.'cfg(not(target_env = "msvc"))'.dependencies]
108
109
  tikv-jemallocator = "0.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.156
3
+ Version: 0.0.158
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -67,6 +67,34 @@ When enabled, this rule will:
67
67
  - Reference-style links are checked for both parts
68
68
  - Links with only whitespace are considered empty
69
69
 
70
+ ### MkDocs mode
71
+
72
+ When using MkDocs flavor (`flavor = "mkdocs"`), this rule recognizes valid MkDocs-specific syntax:
73
+
74
+ **Auto-references** (backtick-wrapped Python identifiers):
75
+
76
+ ```markdown
77
+ [`module.Class`][] <!-- Valid MkDocs auto-reference -->
78
+ [`str`][] <!-- Valid Python type reference -->
79
+ [`api.function`][] <!-- Valid API reference -->
80
+ ```
81
+
82
+ **Paragraph anchors** (using Python-Markdown attr_list extension):
83
+
84
+ ```markdown
85
+ [](){ #my-anchor } <!-- Valid anchor point -->
86
+ [](){ #anchor .class } <!-- Valid anchor with CSS class -->
87
+ [](){: #anchor } <!-- Valid with colon syntax -->
88
+ ```
89
+
90
+ These patterns create anchor points in documentation and are widely used in MkDocs projects with the `attr_list` extension.
91
+
92
+ **References:**
93
+
94
+ - [Python-Markdown attr_list extension](https://python-markdown.github.io/extensions/attr_list/)
95
+ - [mkdocs-autorefs plugin](https://mkdocstrings.github.io/autorefs/)
96
+ - [MkDocs auto-references discussion](https://github.com/mkdocs/mkdocs/discussions/3754)
97
+
70
98
  ## Learn more
71
99
 
72
100
  - [CommonMark specification for links](https://spec.commonmark.org/0.31.2/#links)
@@ -251,11 +251,12 @@ pub struct GlobalConfig {
251
251
  #[serde(default)]
252
252
  pub flavor: MarkdownFlavor,
253
253
 
254
- /// Whether to enforce exclude and extend-exclude patterns even for paths that are passed explicitly.
255
- /// By default (false), rumdl will lint any paths passed in directly, even if they would typically be excluded.
256
- /// Setting this to true will cause rumdl to respect exclusions unequivocally.
257
- /// This is useful for pre-commit, which explicitly passes all changed files.
254
+ /// [DEPRECATED] Whether to enforce exclude patterns for explicitly passed paths.
255
+ /// This option is deprecated as of v0.0.156 and has no effect.
256
+ /// Exclude patterns are now always respected, even for explicitly provided files.
257
+ /// This prevents duplication between rumdl config and tool configs like pre-commit.
258
258
  #[serde(default)]
259
+ #[deprecated(since = "0.0.156", note = "Exclude patterns are now always respected")]
259
260
  pub force_exclude: bool,
260
261
  }
261
262
 
@@ -269,6 +270,7 @@ fn default_line_length() -> u64 {
269
270
 
270
271
  // Add the Default impl
271
272
  impl Default for GlobalConfig {
273
+ #[allow(deprecated)]
272
274
  fn default() -> Self {
273
275
  Self {
274
276
  enable: Vec::new(),
@@ -1704,52 +1706,55 @@ impl SourcedConfig {
1704
1706
  None
1705
1707
  }
1706
1708
 
1707
- /// Discover user-level configuration file from platform-specific config directory.
1708
- /// Returns the first configuration file found in the user config directory.
1709
- fn user_configuration_path() -> Option<std::path::PathBuf> {
1710
- use etcetera::{BaseStrategy, choose_base_strategy};
1709
+ /// Internal implementation that accepts config directory for testing
1710
+ fn user_configuration_path_impl(config_dir: &Path) -> Option<std::path::PathBuf> {
1711
+ let config_dir = config_dir.join("rumdl");
1711
1712
 
1712
- match choose_base_strategy() {
1713
- Ok(strategy) => {
1714
- let config_dir = strategy.config_dir().join("rumdl");
1713
+ // Check for config files in precedence order (same as project discovery)
1714
+ const USER_CONFIG_FILES: &[&str] = &[".rumdl.toml", "rumdl.toml", "pyproject.toml"];
1715
1715
 
1716
- // Check for config files in precedence order (same as project discovery)
1717
- const USER_CONFIG_FILES: &[&str] = &[".rumdl.toml", "rumdl.toml", "pyproject.toml"];
1716
+ log::debug!(
1717
+ "[rumdl-config] Checking for user configuration in: {}",
1718
+ config_dir.display()
1719
+ );
1718
1720
 
1719
- log::debug!(
1720
- "[rumdl-config] Checking for user configuration in: {}",
1721
- config_dir.display()
1722
- );
1721
+ for filename in USER_CONFIG_FILES {
1722
+ let config_path = config_dir.join(filename);
1723
1723
 
1724
- for filename in USER_CONFIG_FILES {
1725
- let config_path = config_dir.join(filename);
1726
-
1727
- if config_path.exists() {
1728
- // For pyproject.toml, verify it contains [tool.rumdl] section
1729
- if *filename == "pyproject.toml" {
1730
- if let Ok(content) = std::fs::read_to_string(&config_path) {
1731
- if content.contains("[tool.rumdl]") || content.contains("tool.rumdl") {
1732
- log::debug!(
1733
- "[rumdl-config] Found user configuration at: {}",
1734
- config_path.display()
1735
- );
1736
- return Some(config_path);
1737
- }
1738
- log::debug!("[rumdl-config] Found user pyproject.toml but no [tool.rumdl] section");
1739
- continue;
1740
- }
1741
- } else {
1724
+ if config_path.exists() {
1725
+ // For pyproject.toml, verify it contains [tool.rumdl] section
1726
+ if *filename == "pyproject.toml" {
1727
+ if let Ok(content) = std::fs::read_to_string(&config_path) {
1728
+ if content.contains("[tool.rumdl]") || content.contains("tool.rumdl") {
1742
1729
  log::debug!("[rumdl-config] Found user configuration at: {}", config_path.display());
1743
1730
  return Some(config_path);
1744
1731
  }
1732
+ log::debug!("[rumdl-config] Found user pyproject.toml but no [tool.rumdl] section");
1733
+ continue;
1745
1734
  }
1735
+ } else {
1736
+ log::debug!("[rumdl-config] Found user configuration at: {}", config_path.display());
1737
+ return Some(config_path);
1746
1738
  }
1739
+ }
1740
+ }
1747
1741
 
1748
- log::debug!(
1749
- "[rumdl-config] No user configuration found in: {}",
1750
- config_dir.display()
1751
- );
1752
- None
1742
+ log::debug!(
1743
+ "[rumdl-config] No user configuration found in: {}",
1744
+ config_dir.display()
1745
+ );
1746
+ None
1747
+ }
1748
+
1749
+ /// Discover user-level configuration file from platform-specific config directory.
1750
+ /// Returns the first configuration file found in the user config directory.
1751
+ fn user_configuration_path() -> Option<std::path::PathBuf> {
1752
+ use etcetera::{BaseStrategy, choose_base_strategy};
1753
+
1754
+ match choose_base_strategy() {
1755
+ Ok(strategy) => {
1756
+ let config_dir = strategy.config_dir();
1757
+ Self::user_configuration_path_impl(&config_dir)
1753
1758
  }
1754
1759
  Err(e) => {
1755
1760
  log::debug!("[rumdl-config] Failed to determine user config directory: {e}");
@@ -1758,12 +1763,13 @@ impl SourcedConfig {
1758
1763
  }
1759
1764
  }
1760
1765
 
1761
- /// Load and merge configurations from files and CLI overrides.
1762
- /// If skip_auto_discovery is true, only explicit config paths are loaded.
1763
- pub fn load_with_discovery(
1766
+ /// Internal implementation that accepts user config directory for testing
1767
+ #[doc(hidden)]
1768
+ pub fn load_with_discovery_impl(
1764
1769
  config_path: Option<&str>,
1765
1770
  cli_overrides: Option<&SourcedGlobalConfig>,
1766
1771
  skip_auto_discovery: bool,
1772
+ user_config_dir: Option<&Path>,
1767
1773
  ) -> Result<Self, ConfigError> {
1768
1774
  use std::env;
1769
1775
  log::debug!("[rumdl-config] Current working directory: {:?}", env::current_dir());
@@ -1829,7 +1835,13 @@ impl SourcedConfig {
1829
1835
  // Only perform auto-discovery if not skipped AND no explicit config path provided
1830
1836
  if !skip_auto_discovery && config_path.is_none() {
1831
1837
  // Step 1: Load user configuration first (as a base)
1832
- if let Some(user_config_path) = Self::user_configuration_path() {
1838
+ let user_config_path = if let Some(dir) = user_config_dir {
1839
+ Self::user_configuration_path_impl(dir)
1840
+ } else {
1841
+ Self::user_configuration_path()
1842
+ };
1843
+
1844
+ if let Some(user_config_path) = user_config_path {
1833
1845
  let path_str = user_config_path.display().to_string();
1834
1846
  let filename = user_config_path.file_name().and_then(|n| n.to_str()).unwrap_or("");
1835
1847
 
@@ -1948,6 +1960,16 @@ impl SourcedConfig {
1948
1960
 
1949
1961
  Ok(sourced_config)
1950
1962
  }
1963
+
1964
+ /// Load and merge configurations from files and CLI overrides.
1965
+ /// If skip_auto_discovery is true, only explicit config paths are loaded.
1966
+ pub fn load_with_discovery(
1967
+ config_path: Option<&str>,
1968
+ cli_overrides: Option<&SourcedGlobalConfig>,
1969
+ skip_auto_discovery: bool,
1970
+ ) -> Result<Self, ConfigError> {
1971
+ Self::load_with_discovery_impl(config_path, cli_overrides, skip_auto_discovery, None)
1972
+ }
1951
1973
  }
1952
1974
 
1953
1975
  impl From<SourcedConfig> for Config {
@@ -1962,6 +1984,7 @@ impl From<SourcedConfig> for Config {
1962
1984
  }
1963
1985
  rules.insert(normalized_rule_name, RuleConfig { values });
1964
1986
  }
1987
+ #[allow(deprecated)]
1965
1988
  let global = GlobalConfig {
1966
1989
  enable: sourced.global.enable.value,
1967
1990
  disable: sourced.global.disable.value,