rumdl 0.0.145__tar.gz → 0.0.147__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 (448) hide show
  1. {rumdl-0.0.145 → rumdl-0.0.147}/CHANGELOG.md +30 -0
  2. {rumdl-0.0.145 → rumdl-0.0.147}/Cargo.lock +1 -1
  3. {rumdl-0.0.145 → rumdl-0.0.147}/Cargo.toml +1 -1
  4. {rumdl-0.0.145 → rumdl-0.0.147}/PKG-INFO +1 -1
  5. rumdl-0.0.147/src/fix_coordinator.rs +609 -0
  6. {rumdl-0.0.145 → rumdl-0.0.147}/src/lib.rs +1 -0
  7. {rumdl-0.0.145 → rumdl-0.0.147}/src/lint_context.rs +17 -4
  8. {rumdl-0.0.145 → rumdl-0.0.147}/src/main.rs +70 -3
  9. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/heading_utils.rs +105 -46
  10. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md003_heading_style.rs +0 -7
  11. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md011_no_reversed_links.rs +12 -12
  12. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md014_commands_show_output.rs +14 -10
  13. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md018_no_missing_space_atx.rs +25 -12
  14. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md020_no_missing_space_closed_atx.rs +39 -18
  15. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md021_no_multiple_space_closed_atx.rs +20 -17
  16. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md032_blanks_around_lists.rs +21 -5
  17. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md033_no_inline_html.rs +48 -7
  18. rumdl-0.0.147/src/rules/md034_no_bare_urls.rs +447 -0
  19. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md039_no_space_in_links.rs +39 -19
  20. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md050_strong_style.rs +9 -12
  21. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md054_link_image_style.rs +1 -1
  22. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/ast_utils.rs +27 -27
  23. rumdl-0.0.147/tests/md032_edge_cases_test.rs +375 -0
  24. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md032_ordered_list_bug_test.rs +34 -0
  25. rumdl-0.0.147/tests/md033_edge_cases_test.rs +174 -0
  26. rumdl-0.0.147/tests/md054_code_span_test.rs +102 -0
  27. rumdl-0.0.147/tests/test_ast_code_block_issue.rs +69 -0
  28. rumdl-0.0.147/tests/test_gfm_vs_default_parsing.rs +61 -0
  29. rumdl-0.0.147/tests/test_lint_context_flow.rs +48 -0
  30. rumdl-0.0.147/tests/test_list_ast_structure.rs +123 -0
  31. rumdl-0.0.147/tests/test_multiline_ast.rs +51 -0
  32. rumdl-0.0.145/src/rules/md034_no_bare_urls.rs +0 -747
  33. {rumdl-0.0.145 → rumdl-0.0.147}/.config/nextest.toml +0 -0
  34. {rumdl-0.0.145 → rumdl-0.0.147}/.mise.toml +0 -0
  35. {rumdl-0.0.145 → rumdl-0.0.147}/.pre-commit-config.yaml +0 -0
  36. {rumdl-0.0.145 → rumdl-0.0.147}/.rumdl.toml +0 -0
  37. {rumdl-0.0.145 → rumdl-0.0.147}/.rustfmt.toml +0 -0
  38. {rumdl-0.0.145 → rumdl-0.0.147}/LICENSE +0 -0
  39. {rumdl-0.0.145 → rumdl-0.0.147}/MANIFEST.in +0 -0
  40. {rumdl-0.0.145 → rumdl-0.0.147}/Makefile +0 -0
  41. {rumdl-0.0.145 → rumdl-0.0.147}/README.md +0 -0
  42. {rumdl-0.0.145 → rumdl-0.0.147}/assets/logo.png +0 -0
  43. {rumdl-0.0.145 → rumdl-0.0.147}/benches/fix_performance.rs +0 -0
  44. {rumdl-0.0.145 → rumdl-0.0.147}/benches/range_performance.rs +0 -0
  45. {rumdl-0.0.145 → rumdl-0.0.147}/benches/range_utils_benchmark.rs +0 -0
  46. {rumdl-0.0.145 → rumdl-0.0.147}/benches/rule_performance.rs +0 -0
  47. {rumdl-0.0.145 → rumdl-0.0.147}/benches/simple_fix_bench.rs +0 -0
  48. {rumdl-0.0.145 → rumdl-0.0.147}/benchmark/bin/bench_lint_context.rs +0 -0
  49. {rumdl-0.0.145 → rumdl-0.0.147}/benchmark/bin/benchmark.rs +0 -0
  50. {rumdl-0.0.145 → rumdl-0.0.147}/benchmark/bin/benchmark_rule.rs +0 -0
  51. {rumdl-0.0.145 → rumdl-0.0.147}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  52. {rumdl-0.0.145 → rumdl-0.0.147}/benchmark/bin/measure_code_span_performance.rs +0 -0
  53. {rumdl-0.0.145 → rumdl-0.0.147}/docs/RULES.md +0 -0
  54. {rumdl-0.0.145 → rumdl-0.0.147}/docs/global-settings.md +0 -0
  55. {rumdl-0.0.145 → rumdl-0.0.147}/docs/inline-configuration.md +0 -0
  56. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md001.md +0 -0
  57. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md002.md +0 -0
  58. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md003.md +0 -0
  59. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md004.md +0 -0
  60. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md005.md +0 -0
  61. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md006.md +0 -0
  62. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md007.md +0 -0
  63. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md009.md +0 -0
  64. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md010.md +0 -0
  65. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md011.md +0 -0
  66. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md012.md +0 -0
  67. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md013.md +0 -0
  68. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md014.md +0 -0
  69. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md018.md +0 -0
  70. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md019.md +0 -0
  71. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md020.md +0 -0
  72. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md021.md +0 -0
  73. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md022.md +0 -0
  74. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md023.md +0 -0
  75. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md024.md +0 -0
  76. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md025.md +0 -0
  77. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md026.md +0 -0
  78. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md027.md +0 -0
  79. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md028.md +0 -0
  80. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md029.md +0 -0
  81. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md030.md +0 -0
  82. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md031.md +0 -0
  83. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md032.md +0 -0
  84. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md033.md +0 -0
  85. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md034.md +0 -0
  86. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md035.md +0 -0
  87. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md036.md +0 -0
  88. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md037.md +0 -0
  89. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md038.md +0 -0
  90. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md039.md +0 -0
  91. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md040.md +0 -0
  92. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md041.md +0 -0
  93. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md042.md +0 -0
  94. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md043.md +0 -0
  95. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md044.md +0 -0
  96. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md045.md +0 -0
  97. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md046.md +0 -0
  98. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md047.md +0 -0
  99. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md048.md +0 -0
  100. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md049.md +0 -0
  101. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md050.md +0 -0
  102. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md051.md +0 -0
  103. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md052.md +0 -0
  104. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md053.md +0 -0
  105. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md054.md +0 -0
  106. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md055.md +0 -0
  107. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md056.md +0 -0
  108. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md057.md +0 -0
  109. {rumdl-0.0.145 → rumdl-0.0.147}/docs/md058.md +0 -0
  110. {rumdl-0.0.145 → rumdl-0.0.147}/docs/vscode-extension.md +0 -0
  111. {rumdl-0.0.145 → rumdl-0.0.147}/parity_check.py +0 -0
  112. {rumdl-0.0.145 → rumdl-0.0.147}/pyproject.toml +0 -0
  113. {rumdl-0.0.145 → rumdl-0.0.147}/python/MANIFEST.in +0 -0
  114. {rumdl-0.0.145 → rumdl-0.0.147}/python/PYTHON-README.md +0 -0
  115. {rumdl-0.0.145 → rumdl-0.0.147}/python/rumdl/__init__.py +0 -0
  116. {rumdl-0.0.145 → rumdl-0.0.147}/python/rumdl/__main__.py +0 -0
  117. {rumdl-0.0.145 → rumdl-0.0.147}/python/rumdl/py.typed +0 -0
  118. {rumdl-0.0.145 → rumdl-0.0.147}/rumdl.toml.example +0 -0
  119. {rumdl-0.0.145 → rumdl-0.0.147}/rust-toolchain.toml +0 -0
  120. {rumdl-0.0.145 → rumdl-0.0.147}/scripts/extract-changelog.sh +0 -0
  121. {rumdl-0.0.145 → rumdl-0.0.147}/scripts/generate-downloads-table.sh +0 -0
  122. {rumdl-0.0.145 → rumdl-0.0.147}/scripts/pre-release.sh +0 -0
  123. {rumdl-0.0.145 → rumdl-0.0.147}/scripts/prepare-release.sh +0 -0
  124. {rumdl-0.0.145 → rumdl-0.0.147}/scripts/setup-pre-commit.sh +0 -0
  125. {rumdl-0.0.145 → rumdl-0.0.147}/scripts/update-pre-commit-docs.sh +0 -0
  126. {rumdl-0.0.145 → rumdl-0.0.147}/src/config.rs +0 -0
  127. {rumdl-0.0.145 → rumdl-0.0.147}/src/exit_codes.rs +0 -0
  128. {rumdl-0.0.145 → rumdl-0.0.147}/src/inline_config.rs +0 -0
  129. {rumdl-0.0.145 → rumdl-0.0.147}/src/lsp/mod.rs +0 -0
  130. {rumdl-0.0.145 → rumdl-0.0.147}/src/lsp/server.rs +0 -0
  131. {rumdl-0.0.145 → rumdl-0.0.147}/src/lsp/types.rs +0 -0
  132. {rumdl-0.0.145 → rumdl-0.0.147}/src/markdownlint_config.rs +0 -0
  133. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/azure.rs +0 -0
  134. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/concise.rs +0 -0
  135. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/github.rs +0 -0
  136. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/gitlab.rs +0 -0
  137. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/grouped.rs +0 -0
  138. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/json.rs +0 -0
  139. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/json_lines.rs +0 -0
  140. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/junit.rs +0 -0
  141. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/mod.rs +0 -0
  142. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/pylint.rs +0 -0
  143. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/sarif.rs +0 -0
  144. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/formatters/text.rs +0 -0
  145. {rumdl-0.0.145 → rumdl-0.0.147}/src/output/mod.rs +0 -0
  146. {rumdl-0.0.145 → rumdl-0.0.147}/src/parallel.rs +0 -0
  147. {rumdl-0.0.145 → rumdl-0.0.147}/src/performance.rs +0 -0
  148. {rumdl-0.0.145 → rumdl-0.0.147}/src/profiling.rs +0 -0
  149. {rumdl-0.0.145 → rumdl-0.0.147}/src/python.rs +0 -0
  150. {rumdl-0.0.145 → rumdl-0.0.147}/src/rule.rs +0 -0
  151. {rumdl-0.0.145 → rumdl-0.0.147}/src/rule_config.rs +0 -0
  152. {rumdl-0.0.145 → rumdl-0.0.147}/src/rule_config_serde.rs +0 -0
  153. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/blockquote_utils.rs +0 -0
  154. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/code_block_utils.rs +0 -0
  155. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/code_fence_utils.rs +0 -0
  156. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/emphasis_style.rs +0 -0
  157. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/front_matter_utils.rs +0 -0
  158. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/list_utils.rs +0 -0
  159. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md001_heading_increment.rs +0 -0
  160. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  161. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md002_first_heading_h1.rs +0 -0
  162. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md003_heading_style/md003_config.rs +0 -0
  163. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  164. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md004_unordered_list_style.rs +0 -0
  165. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md005_list_indent.rs +0 -0
  166. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md006_start_bullets.rs +0 -0
  167. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  168. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md007_ul_indent.rs +0 -0
  169. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  170. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md009_trailing_spaces.rs +0 -0
  171. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  172. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md010_no_hard_tabs.rs +0 -0
  173. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  174. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md012_no_multiple_blanks.rs +0 -0
  175. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md013_line_length/md013_config.rs +0 -0
  176. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md013_line_length.rs +0 -0
  177. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  178. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  179. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  180. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md022_blanks_around_headings.rs +0 -0
  181. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md023_heading_start_left.rs +0 -0
  182. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  183. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md024_no_duplicate_heading.rs +0 -0
  184. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md025_single_title/md025_config.rs +0 -0
  185. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md025_single_title.rs +0 -0
  186. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  187. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  188. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  189. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  190. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  191. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md029_ordered_list_prefix.rs +0 -0
  192. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  193. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md030_list_marker_space.rs +0 -0
  194. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md031_blanks_around_fences.rs +0 -0
  195. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  196. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md035_hr_style/md035_config.rs +0 -0
  197. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md035_hr_style.rs +0 -0
  198. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  199. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  200. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  201. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md038_no_space_in_code.rs +0 -0
  202. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md040_fenced_code_language.rs +0 -0
  203. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md041_first_line_heading.rs +0 -0
  204. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md042_no_empty_links.rs +0 -0
  205. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md043_required_headings.rs +0 -0
  206. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md044_proper_names/md044_config.rs +0 -0
  207. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md044_proper_names.rs +0 -0
  208. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  209. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md045_no_alt_text.rs +0 -0
  210. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  211. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md046_code_block_style.rs +0 -0
  212. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md047_single_trailing_newline.rs +0 -0
  213. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  214. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md048_code_fence_style.rs +0 -0
  215. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  216. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md049_emphasis_style.rs +0 -0
  217. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md050_strong_style/md050_config.rs +0 -0
  218. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md051_link_fragments.rs +0 -0
  219. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md052_reference_links_images.rs +0 -0
  220. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  221. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  222. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  223. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md055_table_pipe_style.rs +0 -0
  224. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md056_table_column_count.rs +0 -0
  225. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  226. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md057_existing_relative_links.rs +0 -0
  227. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/md058_blanks_around_tables.rs +0 -0
  228. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/mod.rs +0 -0
  229. {rumdl-0.0.145 → rumdl-0.0.147}/src/rules/strong_style.rs +0 -0
  230. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/anchor_styles/github.rs +0 -0
  231. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/anchor_styles/jekyll.rs +0 -0
  232. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/anchor_styles/kramdown.rs +0 -0
  233. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
  234. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/anchor_styles/mod.rs +0 -0
  235. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/code_block_utils.rs +0 -0
  236. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/document_structure.rs +0 -0
  237. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/early_returns.rs +0 -0
  238. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/element_cache.rs +0 -0
  239. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/emphasis_utils.rs +0 -0
  240. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/fix_utils.rs +0 -0
  241. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/header_id_utils.rs +0 -0
  242. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/kramdown_utils.rs +0 -0
  243. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/line_ending.rs +0 -0
  244. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/markdown_elements.rs +0 -0
  245. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_admonitions.rs +0 -0
  246. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_common.rs +0 -0
  247. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_critic.rs +0 -0
  248. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_footnotes.rs +0 -0
  249. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_patterns.rs +0 -0
  250. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_snippets.rs +0 -0
  251. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_tabs.rs +0 -0
  252. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocs_test_utils.rs +0 -0
  253. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mkdocstrings_refs.rs +0 -0
  254. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/mod.rs +0 -0
  255. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/range_utils.rs +0 -0
  256. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/regex_cache.rs +0 -0
  257. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/skip_context.rs +0 -0
  258. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/string_interner.rs +0 -0
  259. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/table_utils.rs +0 -0
  260. {rumdl-0.0.145 → rumdl-0.0.147}/src/utils/text_reflow.rs +0 -0
  261. {rumdl-0.0.145 → rumdl-0.0.147}/src/vscode.rs +0 -0
  262. {rumdl-0.0.145 → rumdl-0.0.147}/tests/advanced_integration_tests.rs +0 -0
  263. {rumdl-0.0.145 → rumdl-0.0.147}/tests/character_ranges/additional_tests.rs +0 -0
  264. {rumdl-0.0.145 → rumdl-0.0.147}/tests/character_ranges/basic_tests.rs +0 -0
  265. {rumdl-0.0.145 → rumdl-0.0.147}/tests/character_ranges/comprehensive_tests.rs +0 -0
  266. {rumdl-0.0.145 → rumdl-0.0.147}/tests/character_ranges/extended_tests.rs +0 -0
  267. {rumdl-0.0.145 → rumdl-0.0.147}/tests/character_ranges/mod.rs +0 -0
  268. {rumdl-0.0.145 → rumdl-0.0.147}/tests/character_ranges/unicode_utils.rs +0 -0
  269. {rumdl-0.0.145 → rumdl-0.0.147}/tests/cli_duplication_test.rs +0 -0
  270. {rumdl-0.0.145 → rumdl-0.0.147}/tests/cli_explain_test.rs +0 -0
  271. {rumdl-0.0.145 → rumdl-0.0.147}/tests/cli_flag_precedence_test.rs +0 -0
  272. {rumdl-0.0.145 → rumdl-0.0.147}/tests/cli_integration_tests.rs +0 -0
  273. {rumdl-0.0.145 → rumdl-0.0.147}/tests/cli_lsp_fix_consistency.rs +0 -0
  274. {rumdl-0.0.145 → rumdl-0.0.147}/tests/cli_statistics_test.rs +0 -0
  275. {rumdl-0.0.145 → rumdl-0.0.147}/tests/common/cli_test_utils.rs +0 -0
  276. {rumdl-0.0.145 → rumdl-0.0.147}/tests/common/fixtures.rs +0 -0
  277. {rumdl-0.0.145 → rumdl-0.0.147}/tests/common/mod.rs +0 -0
  278. {rumdl-0.0.145 → rumdl-0.0.147}/tests/common/test_utils.rs +0 -0
  279. {rumdl-0.0.145 → rumdl-0.0.147}/tests/commonmark_compliance_tests.rs +0 -0
  280. {rumdl-0.0.145 → rumdl-0.0.147}/tests/comprehensive_integration_tests.rs +0 -0
  281. {rumdl-0.0.145 → rumdl-0.0.147}/tests/comprehensive_output_format_tests.rs +0 -0
  282. {rumdl-0.0.145 → rumdl-0.0.147}/tests/config_application_tests.rs +0 -0
  283. {rumdl-0.0.145 → rumdl-0.0.147}/tests/config_file_command_test.rs +0 -0
  284. {rumdl-0.0.145 → rumdl-0.0.147}/tests/config_tests.rs +0 -0
  285. {rumdl-0.0.145 → rumdl-0.0.147}/tests/config_upward_traversal_test.rs +0 -0
  286. {rumdl-0.0.145 → rumdl-0.0.147}/tests/configuration_inheritance_tests.rs +0 -0
  287. {rumdl-0.0.145 → rumdl-0.0.147}/tests/consistency_regression_tests.rs +0 -0
  288. {rumdl-0.0.145 → rumdl-0.0.147}/tests/cross_platform_compatibility_tests.rs +0 -0
  289. {rumdl-0.0.145 → rumdl-0.0.147}/tests/deeply_nested_lists_performance_test.rs +0 -0
  290. {rumdl-0.0.145 → rumdl-0.0.147}/tests/escaped_brackets_test.rs +0 -0
  291. {rumdl-0.0.145 → rumdl-0.0.147}/tests/final_confidence_assessment.rs +0 -0
  292. {rumdl-0.0.145 → rumdl-0.0.147}/tests/fix_counting_test.rs +0 -0
  293. {rumdl-0.0.145 → rumdl-0.0.147}/tests/fix_performance_baseline_test.rs +0 -0
  294. {rumdl-0.0.145 → rumdl-0.0.147}/tests/fixable_unfixable_config_test.rs +0 -0
  295. {rumdl-0.0.145 → rumdl-0.0.147}/tests/init_command_test.rs +0 -0
  296. {rumdl-0.0.145 → rumdl-0.0.147}/tests/init_tests.rs +0 -0
  297. {rumdl-0.0.145 → rumdl-0.0.147}/tests/inline_config_blocks_test.rs +0 -0
  298. {rumdl-0.0.145 → rumdl-0.0.147}/tests/inline_config_test.rs +0 -0
  299. {rumdl-0.0.145 → rumdl-0.0.147}/tests/integration_tests.rs +0 -0
  300. {rumdl-0.0.145 → rumdl-0.0.147}/tests/json_output_test.rs +0 -0
  301. {rumdl-0.0.145 → rumdl-0.0.147}/tests/kramdown_integration_test.rs +0 -0
  302. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lib.rs +0 -0
  303. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_editor_integration_tests.rs +0 -0
  304. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_formatting_tests.rs +0 -0
  305. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_initialization_options_test.rs +0 -0
  306. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_integration_tests.rs +0 -0
  307. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_memory_leak_tests.rs +0 -0
  308. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_mkdocs_flavor_test.rs +0 -0
  309. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_tests.rs +0 -0
  310. {rumdl-0.0.145 → rumdl-0.0.147}/tests/lsp_unopened_document_test.rs +0 -0
  311. {rumdl-0.0.145 → rumdl-0.0.147}/tests/malformed_markdown_stress_tests.rs +0 -0
  312. {rumdl-0.0.145 → rumdl-0.0.147}/tests/markdownlint_cli_integration.rs +0 -0
  313. {rumdl-0.0.145 → rumdl-0.0.147}/tests/markdownlint_config_test.rs +0 -0
  314. {rumdl-0.0.145 → rumdl-0.0.147}/tests/markdownlintignore_test.rs +0 -0
  315. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md013_reflow_integration_test.rs +0 -0
  316. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md037_xxxx_regression_test.rs +0 -0
  317. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md038_false_positive_test.rs +0 -0
  318. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md051_issue_39_regression_test.rs +0 -0
  319. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md051_readme_bug_test.rs +0 -0
  320. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md051_toc_bug_test.rs +0 -0
  321. {rumdl-0.0.145 → rumdl-0.0.147}/tests/md052_literal_brackets_test.rs +0 -0
  322. {rumdl-0.0.145 → rumdl-0.0.147}/tests/nested_code_block_test.rs +0 -0
  323. {rumdl-0.0.145 → rumdl-0.0.147}/tests/output_format_integration_tests.rs +0 -0
  324. {rumdl-0.0.145 → rumdl-0.0.147}/tests/output_format_tests.rs +0 -0
  325. {rumdl-0.0.145 → rumdl-0.0.147}/tests/perf_check.rs +0 -0
  326. {rumdl-0.0.145 → rumdl-0.0.147}/tests/performance_validation_tests.rs +0 -0
  327. {rumdl-0.0.145 → rumdl-0.0.147}/tests/pyproject_config_tests.rs +0 -0
  328. {rumdl-0.0.145 → rumdl-0.0.147}/tests/python_bindings_test.rs +0 -0
  329. {rumdl-0.0.145 → rumdl-0.0.147}/tests/real_world_repository_tests.rs +0 -0
  330. {rumdl-0.0.145 → rumdl-0.0.147}/tests/regression_prevention_tests.rs +0 -0
  331. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  332. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/heading_edge_cases_test.rs +0 -0
  333. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  334. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/link_edge_cases_test.rs +0 -0
  335. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/list_rules_integration_test.rs +0 -0
  336. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md001_test.rs +0 -0
  337. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md001_unicode_test.rs +0 -0
  338. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md002_test.rs +0 -0
  339. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md003_test.rs +0 -0
  340. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md004_test.rs +0 -0
  341. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md005_dynamic_indent_test.rs +0 -0
  342. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md005_test.rs +0 -0
  343. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md005_unicode_test.rs +0 -0
  344. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md006_test.rs +0 -0
  345. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md006_unicode_test.rs +0 -0
  346. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md007_test.rs +0 -0
  347. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md009_test.rs +0 -0
  348. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md010_test.rs +0 -0
  349. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md011_test.rs +0 -0
  350. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md012_test.rs +0 -0
  351. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md013_test.rs +0 -0
  352. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md014_test.rs +0 -0
  353. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md018_test.rs +0 -0
  354. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md019_test.rs +0 -0
  355. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md020_test.rs +0 -0
  356. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md021_test.rs +0 -0
  357. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md022_test.rs +0 -0
  358. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md023_extended_test.rs +0 -0
  359. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md023_test.rs +0 -0
  360. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md024_test.rs +0 -0
  361. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md025_test.rs +0 -0
  362. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md026_kramdown_test.rs +0 -0
  363. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md026_test.rs +0 -0
  364. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md027_test.rs +0 -0
  365. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md028_md009_interaction_test.rs +0 -0
  366. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md028_test.rs +0 -0
  367. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md029_code_block_separation_test.rs +0 -0
  368. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md029_fix_test.rs +0 -0
  369. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md029_issue42_test.rs +0 -0
  370. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
  371. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
  372. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md029_test.rs +0 -0
  373. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md029_unicode_test.rs +0 -0
  374. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md030_test.rs +0 -0
  375. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md031_kramdown_test.rs +0 -0
  376. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md031_test.rs +0 -0
  377. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md032_test.rs +0 -0
  378. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md033_extended_test.rs +0 -0
  379. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md033_kramdown_test.rs +0 -0
  380. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md033_test.rs +0 -0
  381. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md034_ipv6_test.rs +0 -0
  382. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md034_test.rs +0 -0
  383. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md035_test.rs +0 -0
  384. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md036_test.rs +0 -0
  385. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md037_kramdown_test.rs +0 -0
  386. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md037_test.rs +0 -0
  387. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md038_nested_backticks_test.rs +0 -0
  388. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md038_test.rs +0 -0
  389. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md039_test.rs +0 -0
  390. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md040_test.rs +0 -0
  391. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md041_test.rs +0 -0
  392. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md042_test.rs +0 -0
  393. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md043_test.rs +0 -0
  394. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md044_test.rs +0 -0
  395. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md045_test.rs +0 -0
  396. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md046_test.rs +0 -0
  397. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md047_test.rs +0 -0
  398. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md048_test.rs +0 -0
  399. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md049_test.rs +0 -0
  400. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md050_test.rs +0 -0
  401. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_comprehensive_test.rs +0 -0
  402. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
  403. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_edge_cases_test.rs +0 -0
  404. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_issue_39_regression_test.rs +0 -0
  405. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
  406. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_property_based_test.rs +0 -0
  407. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_regression_prevention_test.rs +0 -0
  408. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_test.rs +0 -0
  409. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md051_unicode_security_test.rs +0 -0
  410. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md052_test.rs +0 -0
  411. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md053_additional_test.rs +0 -0
  412. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md053_proptest.rs +0 -0
  413. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md053_test.rs +0 -0
  414. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md054_test.rs +0 -0
  415. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md054_unicode_test.rs +0 -0
  416. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md055_test.rs +0 -0
  417. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md056_test.rs +0 -0
  418. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md057_test.rs +0 -0
  419. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md058_kramdown_test.rs +0 -0
  420. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/md058_test.rs +0 -0
  421. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/mkdocs_admonitions_test.rs +0 -0
  422. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
  423. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/mkdocs_extensions_test.rs +0 -0
  424. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/mkdocs_snippets_test.rs +0 -0
  425. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/mod.rs +0 -0
  426. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules/rule_interaction_test.rs +0 -0
  427. {rumdl-0.0.145 → rumdl-0.0.147}/tests/rules_mod_test.rs +0 -0
  428. {rumdl-0.0.145 → rumdl-0.0.147}/tests/sentence_per_line_test.rs +0 -0
  429. {rumdl-0.0.145 → rumdl-0.0.147}/tests/skip_context_tests.rs +0 -0
  430. {rumdl-0.0.145 → rumdl-0.0.147}/tests/test_underscore_edge_cases.rs +0 -0
  431. {rumdl-0.0.145 → rumdl-0.0.147}/tests/thread_safety_tests.rs +0 -0
  432. {rumdl-0.0.145 → rumdl-0.0.147}/tests/unfixable_rules_test.rs +0 -0
  433. {rumdl-0.0.145 → rumdl-0.0.147}/tests/unicode_edge_case_tests.rs +0 -0
  434. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utf8_boundary_tests.rs +0 -0
  435. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils/blockquote_utils_test.rs +0 -0
  436. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils/code_block_utils_extended_test.rs +0 -0
  437. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils/code_block_utils_test.rs +0 -0
  438. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils/core_utils_test.rs +0 -0
  439. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils/front_matter_utils_test.rs +0 -0
  440. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils/line_index_test.rs +0 -0
  441. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils/mod.rs +0 -0
  442. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils_markdown_edge_cases.rs +0 -0
  443. {rumdl-0.0.145 → rumdl-0.0.147}/tests/utils_tests.rs +0 -0
  444. {rumdl-0.0.145 → rumdl-0.0.147}/tests/vscode_extension_fixes.rs +0 -0
  445. {rumdl-0.0.145 → rumdl-0.0.147}/tests/vscode_test.rs +0 -0
  446. {rumdl-0.0.145 → rumdl-0.0.147}/tests/vscode_tests.rs +0 -0
  447. {rumdl-0.0.145 → rumdl-0.0.147}/tests/vscode_windows_comprehensive_test.rs +0 -0
  448. {rumdl-0.0.145 → rumdl-0.0.147}/tests/vscode_windows_test.rs +0 -0
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.146] - 2025-09-24
11
+
12
+ ### Added
13
+
14
+ - **Fix Coordinator**: New intelligent fix system as default behavior (#88)
15
+ - ~75% faster execution on large files (15.6s vs 60.7s for OpenAPI spec)
16
+ - ~90% of issues fixed in single pass (vs 2-3 passes previously required)
17
+ - Topological sort ensures optimal rule ordering based on dependencies
18
+ - Handles cyclic dependencies gracefully
19
+ - Opt-out available via RUMDL_NO_FIX_COORDINATOR=1
20
+ - Debug output available via RUMDL_DEBUG_FIX_PERF=1
21
+
22
+ ### Changed
23
+
24
+ - Fix mode now uses Fix Coordinator by default for dramatic performance gains
25
+ - Fix strategy prioritizes intelligent ordering over bulk fixes
26
+
27
+ ### Performance
28
+
29
+ - First pass: 87% faster than v0.0.141, 74% faster than v0.0.143
30
+ - Completes 3 full passes (35.5s) faster than v0.0.141 does single pass (115.6s)
31
+ - Reduces LintContext creations through intelligent batching
32
+
33
+ ## [0.0.145] - 2025-09-23
34
+
35
+ ### Fixed
36
+
37
+ - **MD032**: Refined to handle nested code blocks correctly
38
+ - Various CI test failures and compatibility improvements
39
+
10
40
  ## [0.0.144] - 2025-09-22
11
41
 
12
42
  ## [0.0.142] - 2025-09-20
@@ -1644,7 +1644,7 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1644
1644
 
1645
1645
  [[package]]
1646
1646
  name = "rumdl"
1647
- version = "0.0.145"
1647
+ version = "0.0.147"
1648
1648
  dependencies = [
1649
1649
  "anyhow",
1650
1650
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.145"
3
+ version = "0.0.147"
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)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.145
3
+ Version: 0.0.147
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -0,0 +1,609 @@
1
+ use crate::config::Config;
2
+ use crate::lint_context::LintContext;
3
+ use crate::rule::{LintWarning, Rule};
4
+ use std::collections::{HashMap, HashSet};
5
+
6
+ /// Coordinates rule fixing to minimize the number of passes needed
7
+ pub struct FixCoordinator {
8
+ /// Rules that should run before others (rule -> rules that depend on it)
9
+ dependencies: HashMap<&'static str, Vec<&'static str>>,
10
+ }
11
+
12
+ impl Default for FixCoordinator {
13
+ fn default() -> Self {
14
+ Self::new()
15
+ }
16
+ }
17
+
18
+ impl FixCoordinator {
19
+ pub fn new() -> Self {
20
+ let mut dependencies = HashMap::new();
21
+
22
+ // CRITICAL DEPENDENCIES:
23
+ // These dependencies prevent cascading issues that require multiple passes
24
+
25
+ // MD010 (tabs->spaces) MUST run before:
26
+ // - MD007 (list indentation) - because tabs affect indent calculation
27
+ // - MD005 (list indent consistency) - same reason
28
+ dependencies.insert("MD010", vec!["MD007", "MD005"]);
29
+
30
+ // MD013 (line length) MUST run before:
31
+ // - MD009 (trailing spaces) - line wrapping might add/remove trailing spaces
32
+ // - MD012 (multiple blanks) - reflowing can affect blank lines
33
+ dependencies.insert("MD013", vec!["MD009", "MD012"]);
34
+
35
+ // MD004 (list style) should run before:
36
+ // - MD007 (list indentation) - changing markers affects indentation
37
+ dependencies.insert("MD004", vec!["MD007"]);
38
+
39
+ // MD022/MD023 (heading spacing) should run before:
40
+ // - MD012 (multiple blanks) - heading fixes can affect blank lines
41
+ dependencies.insert("MD022", vec!["MD012"]);
42
+ dependencies.insert("MD023", vec!["MD012"]);
43
+
44
+ Self { dependencies }
45
+ }
46
+
47
+ /// Get the optimal order for running rules based on dependencies
48
+ pub fn get_optimal_order<'a>(&self, rules: &'a [Box<dyn Rule>]) -> Vec<&'a dyn Rule> {
49
+ // Build a map of rule names to rules for quick lookup
50
+ let rule_map: HashMap<&str, &dyn Rule> = rules.iter().map(|r| (r.name(), r.as_ref())).collect();
51
+
52
+ // Build reverse dependencies (rule -> rules it depends on)
53
+ let mut reverse_deps: HashMap<&str, HashSet<&str>> = HashMap::new();
54
+ for (prereq, dependents) in &self.dependencies {
55
+ for dependent in dependents {
56
+ reverse_deps.entry(dependent).or_default().insert(prereq);
57
+ }
58
+ }
59
+
60
+ // Perform topological sort
61
+ let mut sorted = Vec::new();
62
+ let mut visited = HashSet::new();
63
+ let mut visiting = HashSet::new();
64
+
65
+ fn visit<'a>(
66
+ rule_name: &str,
67
+ rule_map: &HashMap<&str, &'a dyn Rule>,
68
+ reverse_deps: &HashMap<&str, HashSet<&str>>,
69
+ visited: &mut HashSet<String>,
70
+ visiting: &mut HashSet<String>,
71
+ sorted: &mut Vec<&'a dyn Rule>,
72
+ ) {
73
+ if visited.contains(rule_name) {
74
+ return;
75
+ }
76
+
77
+ if visiting.contains(rule_name) {
78
+ // Cycle detected, but we'll just skip it
79
+ return;
80
+ }
81
+
82
+ visiting.insert(rule_name.to_string());
83
+
84
+ // Visit dependencies first
85
+ if let Some(deps) = reverse_deps.get(rule_name) {
86
+ for dep in deps {
87
+ if rule_map.contains_key(dep) {
88
+ visit(dep, rule_map, reverse_deps, visited, visiting, sorted);
89
+ }
90
+ }
91
+ }
92
+
93
+ visiting.remove(rule_name);
94
+ visited.insert(rule_name.to_string());
95
+
96
+ // Add this rule to sorted list
97
+ if let Some(&rule) = rule_map.get(rule_name) {
98
+ sorted.push(rule);
99
+ }
100
+ }
101
+
102
+ // Visit all rules
103
+ for rule in rules {
104
+ visit(
105
+ rule.name(),
106
+ &rule_map,
107
+ &reverse_deps,
108
+ &mut visited,
109
+ &mut visiting,
110
+ &mut sorted,
111
+ );
112
+ }
113
+
114
+ // Add any rules not in dependency graph
115
+ for rule in rules {
116
+ if !sorted.iter().any(|r| r.name() == rule.name()) {
117
+ sorted.push(rule.as_ref());
118
+ }
119
+ }
120
+
121
+ sorted
122
+ }
123
+
124
+ /// Apply fixes iteratively until no more fixes are needed or max iterations reached
125
+ /// Returns (rules_fixed_count, iterations, context_creations, fixed_rule_names)
126
+ pub fn apply_fixes_iterative(
127
+ &self,
128
+ rules: &[Box<dyn Rule>],
129
+ all_warnings: &[LintWarning],
130
+ content: &mut String,
131
+ config: &Config,
132
+ max_iterations: usize,
133
+ ) -> Result<(usize, usize, usize, HashSet<String>), String> {
134
+ // Get optimal rule order
135
+ let ordered_rules = self.get_optimal_order(rules);
136
+
137
+ // Group warnings by rule for quick lookup
138
+ let mut warnings_by_rule: HashMap<&str, Vec<&LintWarning>> = HashMap::new();
139
+ for warning in all_warnings {
140
+ if let Some(rule_name) = warning.rule_name {
141
+ warnings_by_rule.entry(rule_name).or_default().push(warning);
142
+ }
143
+ }
144
+
145
+ let mut total_fixed = 0;
146
+ let mut total_ctx_creations = 0;
147
+ let mut iterations = 0;
148
+
149
+ // Keep track of which rules have been processed successfully
150
+ let mut processed_rules = HashSet::new();
151
+
152
+ // Track which rules actually applied fixes
153
+ let mut fixed_rule_names = HashSet::new();
154
+
155
+ // Keep applying fixes until content stabilizes
156
+ while iterations < max_iterations {
157
+ iterations += 1;
158
+
159
+ let mut fixes_in_iteration = 0;
160
+ let mut any_fix_applied = false;
161
+
162
+ // Process one rule at a time with its own context
163
+ for rule in &ordered_rules {
164
+ // Skip rules we've already successfully processed
165
+ if processed_rules.contains(rule.name()) {
166
+ continue;
167
+ }
168
+
169
+ // Only process rules that had warnings
170
+ if !warnings_by_rule.contains_key(rule.name()) {
171
+ processed_rules.insert(rule.name());
172
+ continue;
173
+ }
174
+
175
+ // Check if rule is disabled
176
+ if config
177
+ .global
178
+ .unfixable
179
+ .iter()
180
+ .any(|r| r.eq_ignore_ascii_case(rule.name()))
181
+ {
182
+ processed_rules.insert(rule.name());
183
+ continue;
184
+ }
185
+
186
+ if !config.global.fixable.is_empty()
187
+ && !config
188
+ .global
189
+ .fixable
190
+ .iter()
191
+ .any(|r| r.eq_ignore_ascii_case(rule.name()))
192
+ {
193
+ processed_rules.insert(rule.name());
194
+ continue;
195
+ }
196
+
197
+ // Create context for this specific rule
198
+ let ctx = LintContext::new(content, config.markdown_flavor());
199
+ total_ctx_creations += 1;
200
+
201
+ // Apply fix
202
+ match rule.fix(&ctx) {
203
+ Ok(fixed_content) => {
204
+ if fixed_content != *content {
205
+ *content = fixed_content;
206
+ fixes_in_iteration += 1;
207
+ any_fix_applied = true;
208
+ processed_rules.insert(rule.name());
209
+ fixed_rule_names.insert(rule.name().to_string());
210
+
211
+ // If this rule has dependents, break to start fresh iteration
212
+ if self.dependencies.contains_key(rule.name()) {
213
+ break;
214
+ }
215
+ // Otherwise continue with the next rule
216
+ } else {
217
+ // No changes from this rule, mark as processed
218
+ processed_rules.insert(rule.name());
219
+ }
220
+ }
221
+ Err(_) => {
222
+ // Error applying fix, mark as processed to avoid retrying
223
+ processed_rules.insert(rule.name());
224
+ }
225
+ }
226
+ }
227
+
228
+ total_fixed += fixes_in_iteration;
229
+
230
+ // If no fixes were made in this iteration, we're done
231
+ if !any_fix_applied {
232
+ break;
233
+ }
234
+
235
+ // If all rules have been processed, we're done
236
+ if processed_rules.len() >= ordered_rules.len() {
237
+ break;
238
+ }
239
+ }
240
+
241
+ Ok((total_fixed, iterations, total_ctx_creations, fixed_rule_names))
242
+ }
243
+ }
244
+
245
+ #[cfg(test)]
246
+ mod tests {
247
+ use super::*;
248
+ use crate::config::GlobalConfig;
249
+ use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory};
250
+
251
+ // Mock rule for testing
252
+ #[derive(Clone)]
253
+ struct MockRule {
254
+ name: &'static str,
255
+ warnings: Vec<LintWarning>,
256
+ fix_content: String,
257
+ }
258
+
259
+ impl Rule for MockRule {
260
+ fn name(&self) -> &'static str {
261
+ self.name
262
+ }
263
+
264
+ fn check(&self, _ctx: &LintContext) -> LintResult {
265
+ Ok(self.warnings.clone())
266
+ }
267
+
268
+ fn fix(&self, _ctx: &LintContext) -> Result<String, LintError> {
269
+ Ok(self.fix_content.clone())
270
+ }
271
+
272
+ fn description(&self) -> &'static str {
273
+ "Mock rule for testing"
274
+ }
275
+
276
+ fn category(&self) -> RuleCategory {
277
+ RuleCategory::Whitespace
278
+ }
279
+
280
+ fn as_any(&self) -> &dyn std::any::Any {
281
+ self
282
+ }
283
+ }
284
+
285
+ #[test]
286
+ fn test_dependency_ordering() {
287
+ let coordinator = FixCoordinator::new();
288
+
289
+ let rules: Vec<Box<dyn Rule>> = vec![
290
+ Box::new(MockRule {
291
+ name: "MD009",
292
+ warnings: vec![],
293
+ fix_content: "".to_string(),
294
+ }),
295
+ Box::new(MockRule {
296
+ name: "MD013",
297
+ warnings: vec![],
298
+ fix_content: "".to_string(),
299
+ }),
300
+ Box::new(MockRule {
301
+ name: "MD010",
302
+ warnings: vec![],
303
+ fix_content: "".to_string(),
304
+ }),
305
+ Box::new(MockRule {
306
+ name: "MD007",
307
+ warnings: vec![],
308
+ fix_content: "".to_string(),
309
+ }),
310
+ ];
311
+
312
+ let ordered = coordinator.get_optimal_order(&rules);
313
+ let ordered_names: Vec<&str> = ordered.iter().map(|r| r.name()).collect();
314
+
315
+ // MD010 should come before MD007 (dependency)
316
+ let md010_idx = ordered_names.iter().position(|&n| n == "MD010").unwrap();
317
+ let md007_idx = ordered_names.iter().position(|&n| n == "MD007").unwrap();
318
+ assert!(md010_idx < md007_idx, "MD010 should come before MD007");
319
+
320
+ // MD013 should come before MD009 (dependency)
321
+ let md013_idx = ordered_names.iter().position(|&n| n == "MD013").unwrap();
322
+ let md009_idx = ordered_names.iter().position(|&n| n == "MD009").unwrap();
323
+ assert!(md013_idx < md009_idx, "MD013 should come before MD009");
324
+ }
325
+
326
+ #[test]
327
+ fn test_single_iteration_fix() {
328
+ let coordinator = FixCoordinator::new();
329
+
330
+ let rules: Vec<Box<dyn Rule>> = vec![Box::new(MockRule {
331
+ name: "MD001",
332
+ warnings: vec![LintWarning {
333
+ line: 1,
334
+ column: 1,
335
+ end_line: 1,
336
+ end_column: 10,
337
+ message: "Test warning".to_string(),
338
+ rule_name: Some("MD001"),
339
+ severity: crate::rule::Severity::Error,
340
+ fix: None,
341
+ }],
342
+ fix_content: "fixed content".to_string(),
343
+ })];
344
+
345
+ let warnings = vec![LintWarning {
346
+ line: 1,
347
+ column: 1,
348
+ end_line: 1,
349
+ end_column: 10,
350
+ message: "Test warning".to_string(),
351
+ rule_name: Some("MD001"),
352
+ severity: crate::rule::Severity::Error,
353
+ fix: None,
354
+ }];
355
+
356
+ let mut content = "original content".to_string();
357
+ let config = Config {
358
+ global: GlobalConfig::default(),
359
+ rules: Default::default(),
360
+ };
361
+
362
+ let result = coordinator.apply_fixes_iterative(&rules, &warnings, &mut content, &config, 5);
363
+
364
+ assert!(result.is_ok());
365
+ let (total_fixed, iterations, ctx_creations, _) = result.unwrap();
366
+ assert_eq!(total_fixed, 1);
367
+ assert_eq!(iterations, 1);
368
+ assert_eq!(ctx_creations, 1);
369
+ assert_eq!(content, "fixed content");
370
+ }
371
+
372
+ #[test]
373
+ fn test_multiple_iteration_with_dependencies() {
374
+ let coordinator = FixCoordinator::new();
375
+
376
+ let rules: Vec<Box<dyn Rule>> = vec![
377
+ Box::new(MockRule {
378
+ name: "MD010", // Has dependents
379
+ warnings: vec![LintWarning {
380
+ line: 1,
381
+ column: 1,
382
+ end_line: 1,
383
+ end_column: 10,
384
+ message: "Tabs".to_string(),
385
+ rule_name: Some("MD010"),
386
+ severity: crate::rule::Severity::Error,
387
+ fix: None,
388
+ }],
389
+ fix_content: "content with spaces".to_string(),
390
+ }),
391
+ Box::new(MockRule {
392
+ name: "MD007", // Depends on MD010
393
+ warnings: vec![LintWarning {
394
+ line: 1,
395
+ column: 1,
396
+ end_line: 1,
397
+ end_column: 10,
398
+ message: "Indentation".to_string(),
399
+ rule_name: Some("MD007"),
400
+ severity: crate::rule::Severity::Error,
401
+ fix: None,
402
+ }],
403
+ fix_content: "content with spaces and proper indent".to_string(),
404
+ }),
405
+ ];
406
+
407
+ let warnings = vec![
408
+ LintWarning {
409
+ line: 1,
410
+ column: 1,
411
+ end_line: 1,
412
+ end_column: 10,
413
+ message: "Tabs".to_string(),
414
+ rule_name: Some("MD010"),
415
+ severity: crate::rule::Severity::Error,
416
+ fix: None,
417
+ },
418
+ LintWarning {
419
+ line: 1,
420
+ column: 1,
421
+ end_line: 1,
422
+ end_column: 10,
423
+ message: "Indentation".to_string(),
424
+ rule_name: Some("MD007"),
425
+ severity: crate::rule::Severity::Error,
426
+ fix: None,
427
+ },
428
+ ];
429
+
430
+ let mut content = "content with tabs".to_string();
431
+ let config = Config {
432
+ global: GlobalConfig::default(),
433
+ rules: Default::default(),
434
+ };
435
+
436
+ let result = coordinator.apply_fixes_iterative(&rules, &warnings, &mut content, &config, 5);
437
+
438
+ assert!(result.is_ok());
439
+ let (total_fixed, iterations, ctx_creations, _) = result.unwrap();
440
+ assert_eq!(total_fixed, 2);
441
+ assert_eq!(iterations, 2); // Should take 2 iterations due to dependency
442
+ assert!(ctx_creations >= 2);
443
+ }
444
+
445
+ #[test]
446
+ fn test_unfixable_rules_skipped() {
447
+ let coordinator = FixCoordinator::new();
448
+
449
+ let rules: Vec<Box<dyn Rule>> = vec![Box::new(MockRule {
450
+ name: "MD001",
451
+ warnings: vec![LintWarning {
452
+ line: 1,
453
+ column: 1,
454
+ end_line: 1,
455
+ end_column: 10,
456
+ message: "Test".to_string(),
457
+ rule_name: Some("MD001"),
458
+ severity: crate::rule::Severity::Error,
459
+ fix: None,
460
+ }],
461
+ fix_content: "fixed".to_string(),
462
+ })];
463
+
464
+ let warnings = vec![LintWarning {
465
+ line: 1,
466
+ column: 1,
467
+ end_line: 1,
468
+ end_column: 10,
469
+ message: "Test".to_string(),
470
+ rule_name: Some("MD001"),
471
+ severity: crate::rule::Severity::Error,
472
+ fix: None,
473
+ }];
474
+
475
+ let mut content = "original".to_string();
476
+ let mut config = Config {
477
+ global: GlobalConfig::default(),
478
+ rules: Default::default(),
479
+ };
480
+ config.global.unfixable = vec!["MD001".to_string()];
481
+
482
+ let result = coordinator.apply_fixes_iterative(&rules, &warnings, &mut content, &config, 5);
483
+
484
+ assert!(result.is_ok());
485
+ let (total_fixed, _, _, _) = result.unwrap();
486
+ assert_eq!(total_fixed, 0);
487
+ assert_eq!(content, "original"); // Should not be changed
488
+ }
489
+
490
+ #[test]
491
+ fn test_max_iterations_limit() {
492
+ // This test ensures we don't loop infinitely
493
+ let coordinator = FixCoordinator::new();
494
+
495
+ // Create a rule that always changes content
496
+ #[derive(Clone)]
497
+ struct AlwaysChangeRule;
498
+ impl Rule for AlwaysChangeRule {
499
+ fn name(&self) -> &'static str {
500
+ "MD999"
501
+ }
502
+ fn check(&self, _: &LintContext) -> LintResult {
503
+ Ok(vec![LintWarning {
504
+ line: 1,
505
+ column: 1,
506
+ end_line: 1,
507
+ end_column: 10,
508
+ message: "Always warns".to_string(),
509
+ rule_name: Some("MD999"),
510
+ severity: crate::rule::Severity::Error,
511
+ fix: None,
512
+ }])
513
+ }
514
+ fn fix(&self, ctx: &LintContext) -> Result<String, LintError> {
515
+ Ok(format!("{}x", ctx.content))
516
+ }
517
+ fn description(&self) -> &'static str {
518
+ "Always changes"
519
+ }
520
+ fn category(&self) -> RuleCategory {
521
+ RuleCategory::Whitespace
522
+ }
523
+ fn as_any(&self) -> &dyn std::any::Any {
524
+ self
525
+ }
526
+ }
527
+
528
+ let rules: Vec<Box<dyn Rule>> = vec![Box::new(AlwaysChangeRule)];
529
+ let warnings = vec![LintWarning {
530
+ line: 1,
531
+ column: 1,
532
+ end_line: 1,
533
+ end_column: 10,
534
+ message: "Always warns".to_string(),
535
+ rule_name: Some("MD999"),
536
+ severity: crate::rule::Severity::Error,
537
+ fix: None,
538
+ }];
539
+
540
+ let mut content = "test".to_string();
541
+ let config = Config {
542
+ global: GlobalConfig::default(),
543
+ rules: Default::default(),
544
+ };
545
+
546
+ let result = coordinator.apply_fixes_iterative(&rules, &warnings, &mut content, &config, 3);
547
+
548
+ assert!(result.is_ok());
549
+ let (_, iterations, _, _) = result.unwrap();
550
+ assert_eq!(iterations, 1); // Should stop after first successful fix
551
+ }
552
+
553
+ #[test]
554
+ fn test_empty_rules_and_warnings() {
555
+ let coordinator = FixCoordinator::new();
556
+ let rules: Vec<Box<dyn Rule>> = vec![];
557
+ let warnings: Vec<LintWarning> = vec![];
558
+
559
+ let mut content = "unchanged".to_string();
560
+ let config = Config {
561
+ global: GlobalConfig::default(),
562
+ rules: Default::default(),
563
+ };
564
+
565
+ let result = coordinator.apply_fixes_iterative(&rules, &warnings, &mut content, &config, 5);
566
+
567
+ assert!(result.is_ok());
568
+ let (total_fixed, iterations, ctx_creations, _) = result.unwrap();
569
+ assert_eq!(total_fixed, 0);
570
+ assert_eq!(iterations, 1);
571
+ assert_eq!(ctx_creations, 0);
572
+ assert_eq!(content, "unchanged");
573
+ }
574
+
575
+ #[test]
576
+ fn test_cyclic_dependencies_handled() {
577
+ // Test that cyclic dependencies don't cause infinite loops
578
+ let mut coordinator = FixCoordinator::new();
579
+
580
+ // Create a cycle: A -> B -> C -> A
581
+ coordinator.dependencies.insert("RuleA", vec!["RuleB"]);
582
+ coordinator.dependencies.insert("RuleB", vec!["RuleC"]);
583
+ coordinator.dependencies.insert("RuleC", vec!["RuleA"]);
584
+
585
+ let rules: Vec<Box<dyn Rule>> = vec![
586
+ Box::new(MockRule {
587
+ name: "RuleA",
588
+ warnings: vec![],
589
+ fix_content: "".to_string(),
590
+ }),
591
+ Box::new(MockRule {
592
+ name: "RuleB",
593
+ warnings: vec![],
594
+ fix_content: "".to_string(),
595
+ }),
596
+ Box::new(MockRule {
597
+ name: "RuleC",
598
+ warnings: vec![],
599
+ fix_content: "".to_string(),
600
+ }),
601
+ ];
602
+
603
+ // Should not panic or infinite loop
604
+ let ordered = coordinator.get_optimal_order(&rules);
605
+
606
+ // Should return all rules despite cycle
607
+ assert_eq!(ordered.len(), 3);
608
+ }
609
+ }
@@ -1,5 +1,6 @@
1
1
  pub mod config;
2
2
  pub mod exit_codes;
3
+ pub mod fix_coordinator;
3
4
  pub mod inline_config;
4
5
  pub mod lint_context;
5
6
  pub mod lsp;