rumdl 0.0.163__tar.gz → 0.0.164__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 (464) hide show
  1. {rumdl-0.0.163 → rumdl-0.0.164}/CHANGELOG.md +70 -0
  2. {rumdl-0.0.163 → rumdl-0.0.164}/Cargo.lock +33 -1
  3. {rumdl-0.0.163 → rumdl-0.0.164}/Cargo.toml +2 -1
  4. {rumdl-0.0.163 → rumdl-0.0.164}/PKG-INFO +1 -1
  5. rumdl-0.0.164/src/cache.rs +394 -0
  6. {rumdl-0.0.163 → rumdl-0.0.164}/src/file_processor.rs +79 -50
  7. {rumdl-0.0.163 → rumdl-0.0.164}/src/fix_coordinator.rs +57 -20
  8. {rumdl-0.0.163 → rumdl-0.0.164}/src/formatter.rs +1 -1
  9. {rumdl-0.0.163 → rumdl-0.0.164}/src/lib.rs +2 -2
  10. {rumdl-0.0.163 → rumdl-0.0.164}/src/lsp/server.rs +1 -1
  11. {rumdl-0.0.163 → rumdl-0.0.164}/src/lsp/types.rs +8 -8
  12. {rumdl-0.0.163 → rumdl-0.0.164}/src/main.rs +36 -1
  13. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/azure.rs +13 -13
  14. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/concise.rs +12 -12
  15. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/github.rs +16 -16
  16. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/gitlab.rs +17 -17
  17. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/grouped.rs +19 -19
  18. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/json.rs +13 -13
  19. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/json_lines.rs +15 -15
  20. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/junit.rs +14 -14
  21. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/pylint.rs +12 -12
  22. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/sarif.rs +16 -16
  23. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/text.rs +10 -10
  24. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/mod.rs +4 -4
  25. {rumdl-0.0.163 → rumdl-0.0.164}/src/rule.rs +7 -7
  26. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md001_heading_increment.rs +1 -1
  27. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md002_first_heading_h1.rs +1 -1
  28. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md003_heading_style.rs +1 -1
  29. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md004_unordered_list_style.rs +3 -3
  30. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md005_list_indent.rs +1 -1
  31. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md006_start_bullets.rs +1 -1
  32. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md007_ul_indent.rs +1 -1
  33. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md009_trailing_spaces.rs +2 -2
  34. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md010_no_hard_tabs.rs +1 -1
  35. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md011_no_reversed_links.rs +1 -1
  36. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md012_no_multiple_blanks.rs +5 -5
  37. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md013_line_length.rs +4 -4
  38. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md014_commands_show_output.rs +1 -1
  39. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md018_no_missing_space_atx.rs +2 -2
  40. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md019_no_multiple_space_atx.rs +1 -1
  41. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md020_no_missing_space_closed_atx.rs +1 -1
  42. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md021_no_multiple_space_closed_atx.rs +1 -1
  43. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md022_blanks_around_headings.rs +1 -1
  44. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md023_heading_start_left.rs +3 -3
  45. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md024_no_duplicate_heading.rs +3 -3
  46. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md025_single_title.rs +1 -1
  47. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md026_no_trailing_punctuation.rs +1 -1
  48. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md027_multiple_spaces_blockquote.rs +2 -2
  49. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md028_no_blanks_blockquote.rs +1 -1
  50. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md029_ordered_list_prefix.rs +3 -3
  51. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md030_list_marker_space.rs +1 -1
  52. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md031_blanks_around_fences.rs +4 -4
  53. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md032_blanks_around_lists.rs +3 -3
  54. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md033_no_inline_html.rs +2 -2
  55. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md034_no_bare_urls.rs +2 -2
  56. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md035_hr_style.rs +1 -1
  57. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md036_no_emphasis_only_first.rs +1 -1
  58. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md037_spaces_around_emphasis.rs +1 -1
  59. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md038_no_space_in_code.rs +1 -1
  60. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md039_no_space_in_links.rs +2 -2
  61. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md040_fenced_code_language.rs +1 -1
  62. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md041_first_line_heading.rs +1 -1
  63. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md042_no_empty_links.rs +1 -1
  64. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md043_required_headings.rs +3 -3
  65. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md044_proper_names.rs +1 -1
  66. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md045_no_alt_text.rs +1 -1
  67. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md046_code_block_style.rs +4 -4
  68. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md047_single_trailing_newline.rs +1 -1
  69. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md048_code_fence_style.rs +4 -4
  70. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md049_emphasis_style.rs +2 -2
  71. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md050_strong_style.rs +1 -1
  72. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md051_link_fragments.rs +1 -1
  73. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md052_reference_links_images.rs +1 -1
  74. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md053_link_image_reference_definitions.rs +3 -3
  75. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md054_link_image_style.rs +1 -1
  76. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md055_table_pipe_style.rs +1 -1
  77. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md056_table_column_count.rs +1 -1
  78. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md057_existing_relative_links.rs +1 -1
  79. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md058_blanks_around_tables.rs +2 -2
  80. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/fix_utils.rs +19 -19
  81. {rumdl-0.0.163 → rumdl-0.0.164}/src/watch.rs +20 -18
  82. {rumdl-0.0.163 → rumdl-0.0.164}/tests/character_ranges/mod.rs +2 -2
  83. {rumdl-0.0.163 → rumdl-0.0.164}/tests/config_application_tests.rs +45 -12
  84. {rumdl-0.0.163 → rumdl-0.0.164}/tests/config_tests.rs +6 -3
  85. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_tests.rs +5 -5
  86. {rumdl-0.0.163 → rumdl-0.0.164}/tests/per_file_ignores_integration_test.rs +2 -2
  87. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_nested_list_continuation_test.rs +4 -1
  88. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_test.rs +12 -3
  89. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md034_test.rs +1 -1
  90. {rumdl-0.0.163 → rumdl-0.0.164}/.config/nextest.toml +0 -0
  91. {rumdl-0.0.163 → rumdl-0.0.164}/.mise.toml +0 -0
  92. {rumdl-0.0.163 → rumdl-0.0.164}/.pre-commit-config.yaml +0 -0
  93. {rumdl-0.0.163 → rumdl-0.0.164}/.rumdl.toml +0 -0
  94. {rumdl-0.0.163 → rumdl-0.0.164}/.rustfmt.toml +0 -0
  95. {rumdl-0.0.163 → rumdl-0.0.164}/LICENSE +0 -0
  96. {rumdl-0.0.163 → rumdl-0.0.164}/MANIFEST.in +0 -0
  97. {rumdl-0.0.163 → rumdl-0.0.164}/Makefile +0 -0
  98. {rumdl-0.0.163 → rumdl-0.0.164}/README.md +0 -0
  99. {rumdl-0.0.163 → rumdl-0.0.164}/assets/logo.png +0 -0
  100. {rumdl-0.0.163 → rumdl-0.0.164}/benches/fix_performance.rs +0 -0
  101. {rumdl-0.0.163 → rumdl-0.0.164}/benches/range_performance.rs +0 -0
  102. {rumdl-0.0.163 → rumdl-0.0.164}/benches/range_utils_benchmark.rs +0 -0
  103. {rumdl-0.0.163 → rumdl-0.0.164}/benches/rule_performance.rs +0 -0
  104. {rumdl-0.0.163 → rumdl-0.0.164}/benches/simple_fix_bench.rs +0 -0
  105. {rumdl-0.0.163 → rumdl-0.0.164}/benchmark/bin/bench_lint_context.rs +0 -0
  106. {rumdl-0.0.163 → rumdl-0.0.164}/benchmark/bin/benchmark.rs +0 -0
  107. {rumdl-0.0.163 → rumdl-0.0.164}/benchmark/bin/benchmark_rule.rs +0 -0
  108. {rumdl-0.0.163 → rumdl-0.0.164}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  109. {rumdl-0.0.163 → rumdl-0.0.164}/benchmark/bin/measure_code_span_performance.rs +0 -0
  110. {rumdl-0.0.163 → rumdl-0.0.164}/docs/RULES.md +0 -0
  111. {rumdl-0.0.163 → rumdl-0.0.164}/docs/global-settings.md +0 -0
  112. {rumdl-0.0.163 → rumdl-0.0.164}/docs/inline-configuration.md +0 -0
  113. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md001.md +0 -0
  114. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md002.md +0 -0
  115. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md003.md +0 -0
  116. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md004.md +0 -0
  117. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md005.md +0 -0
  118. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md006.md +0 -0
  119. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md007.md +0 -0
  120. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md009.md +0 -0
  121. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md010.md +0 -0
  122. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md011.md +0 -0
  123. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md012.md +0 -0
  124. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md013.md +0 -0
  125. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md014.md +0 -0
  126. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md018.md +0 -0
  127. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md019.md +0 -0
  128. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md020.md +0 -0
  129. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md021.md +0 -0
  130. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md022.md +0 -0
  131. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md023.md +0 -0
  132. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md024.md +0 -0
  133. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md025.md +0 -0
  134. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md026.md +0 -0
  135. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md027.md +0 -0
  136. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md028.md +0 -0
  137. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md029.md +0 -0
  138. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md030.md +0 -0
  139. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md031.md +0 -0
  140. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md032.md +0 -0
  141. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md033.md +0 -0
  142. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md034.md +0 -0
  143. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md035.md +0 -0
  144. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md036.md +0 -0
  145. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md037.md +0 -0
  146. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md038.md +0 -0
  147. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md039.md +0 -0
  148. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md040.md +0 -0
  149. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md041.md +0 -0
  150. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md042.md +0 -0
  151. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md043.md +0 -0
  152. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md044.md +0 -0
  153. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md045.md +0 -0
  154. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md046.md +0 -0
  155. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md047.md +0 -0
  156. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md048.md +0 -0
  157. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md049.md +0 -0
  158. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md050.md +0 -0
  159. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md051.md +0 -0
  160. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md052.md +0 -0
  161. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md053.md +0 -0
  162. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md054.md +0 -0
  163. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md055.md +0 -0
  164. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md056.md +0 -0
  165. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md057.md +0 -0
  166. {rumdl-0.0.163 → rumdl-0.0.164}/docs/md058.md +0 -0
  167. {rumdl-0.0.163 → rumdl-0.0.164}/docs/vscode-extension.md +0 -0
  168. {rumdl-0.0.163 → rumdl-0.0.164}/pyproject.toml +0 -0
  169. {rumdl-0.0.163 → rumdl-0.0.164}/rumdl/__init__.py +0 -0
  170. {rumdl-0.0.163 → rumdl-0.0.164}/rumdl/__main__.py +0 -0
  171. {rumdl-0.0.163 → rumdl-0.0.164}/rumdl/py.typed +0 -0
  172. {rumdl-0.0.163 → rumdl-0.0.164}/rumdl.schema.json +0 -0
  173. {rumdl-0.0.163 → rumdl-0.0.164}/rumdl.toml.example +0 -0
  174. {rumdl-0.0.163 → rumdl-0.0.164}/rust-toolchain.toml +0 -0
  175. {rumdl-0.0.163 → rumdl-0.0.164}/scripts/extract-changelog.sh +0 -0
  176. {rumdl-0.0.163 → rumdl-0.0.164}/scripts/generate-downloads-table.sh +0 -0
  177. {rumdl-0.0.163 → rumdl-0.0.164}/scripts/pre-release.sh +0 -0
  178. {rumdl-0.0.163 → rumdl-0.0.164}/scripts/prepare-release.sh +0 -0
  179. {rumdl-0.0.163 → rumdl-0.0.164}/scripts/setup-pre-commit.sh +0 -0
  180. {rumdl-0.0.163 → rumdl-0.0.164}/scripts/update-pre-commit-docs.sh +0 -0
  181. {rumdl-0.0.163 → rumdl-0.0.164}/src/config.rs +0 -0
  182. {rumdl-0.0.163 → rumdl-0.0.164}/src/exit_codes.rs +0 -0
  183. {rumdl-0.0.163 → rumdl-0.0.164}/src/filtered_lines.rs +0 -0
  184. {rumdl-0.0.163 → rumdl-0.0.164}/src/inline_config.rs +0 -0
  185. {rumdl-0.0.163 → rumdl-0.0.164}/src/lint_context.rs +0 -0
  186. {rumdl-0.0.163 → rumdl-0.0.164}/src/lsp/mod.rs +0 -0
  187. {rumdl-0.0.163 → rumdl-0.0.164}/src/markdownlint_config.rs +0 -0
  188. {rumdl-0.0.163 → rumdl-0.0.164}/src/output/formatters/mod.rs +0 -0
  189. {rumdl-0.0.163 → rumdl-0.0.164}/src/parallel.rs +0 -0
  190. {rumdl-0.0.163 → rumdl-0.0.164}/src/performance.rs +0 -0
  191. {rumdl-0.0.163 → rumdl-0.0.164}/src/profiling.rs +0 -0
  192. {rumdl-0.0.163 → rumdl-0.0.164}/src/rule_config.rs +0 -0
  193. {rumdl-0.0.163 → rumdl-0.0.164}/src/rule_config_serde.rs +0 -0
  194. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/blockquote_utils.rs +0 -0
  195. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/code_block_utils.rs +0 -0
  196. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/code_fence_utils.rs +0 -0
  197. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/emphasis_style.rs +0 -0
  198. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/front_matter_utils.rs +0 -0
  199. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/heading_utils.rs +0 -0
  200. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/list_utils.rs +0 -0
  201. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  202. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md003_heading_style/md003_config.rs +0 -0
  203. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  204. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  205. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  206. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  207. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  208. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md013_line_length/md013_config.rs +0 -0
  209. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  210. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  211. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  212. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md025_single_title/md025_config.rs +0 -0
  213. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  214. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  215. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  216. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  217. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md035_hr_style/md035_config.rs +0 -0
  218. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  219. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md044_proper_names/md044_config.rs +0 -0
  220. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  221. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  222. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  223. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  224. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md050_strong_style/md050_config.rs +0 -0
  225. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  226. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  227. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  228. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/mod.rs +0 -0
  229. {rumdl-0.0.163 → rumdl-0.0.164}/src/rules/strong_style.rs +0 -0
  230. {rumdl-0.0.163 → rumdl-0.0.164}/src/stdin_processor.rs +0 -0
  231. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/anchor_styles/github.rs +0 -0
  232. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/anchor_styles/jekyll.rs +0 -0
  233. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/anchor_styles/kramdown.rs +0 -0
  234. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
  235. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/anchor_styles/mod.rs +0 -0
  236. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/ast_utils.rs +0 -0
  237. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/code_block_utils.rs +0 -0
  238. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/document_structure.rs +0 -0
  239. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/early_returns.rs +0 -0
  240. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/element_cache.rs +0 -0
  241. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/emphasis_utils.rs +0 -0
  242. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/header_id_utils.rs +0 -0
  243. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/jinja_utils.rs +0 -0
  244. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/kramdown_utils.rs +0 -0
  245. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/line_ending.rs +0 -0
  246. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/markdown_elements.rs +0 -0
  247. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_admonitions.rs +0 -0
  248. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_common.rs +0 -0
  249. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_critic.rs +0 -0
  250. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_footnotes.rs +0 -0
  251. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_patterns.rs +0 -0
  252. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_snippets.rs +0 -0
  253. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_tabs.rs +0 -0
  254. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocs_test_utils.rs +0 -0
  255. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mkdocstrings_refs.rs +0 -0
  256. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/mod.rs +0 -0
  257. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/range_utils.rs +0 -0
  258. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/regex_cache.rs +0 -0
  259. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/skip_context.rs +0 -0
  260. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/string_interner.rs +0 -0
  261. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/table_utils.rs +0 -0
  262. {rumdl-0.0.163 → rumdl-0.0.164}/src/utils/text_reflow.rs +0 -0
  263. {rumdl-0.0.163 → rumdl-0.0.164}/src/vscode.rs +0 -0
  264. {rumdl-0.0.163 → rumdl-0.0.164}/tests/advanced_integration_tests.rs +0 -0
  265. {rumdl-0.0.163 → rumdl-0.0.164}/tests/character_ranges/additional_tests.rs +0 -0
  266. {rumdl-0.0.163 → rumdl-0.0.164}/tests/character_ranges/basic_tests.rs +0 -0
  267. {rumdl-0.0.163 → rumdl-0.0.164}/tests/character_ranges/comprehensive_tests.rs +0 -0
  268. {rumdl-0.0.163 → rumdl-0.0.164}/tests/character_ranges/extended_tests.rs +0 -0
  269. {rumdl-0.0.163 → rumdl-0.0.164}/tests/character_ranges/unicode_utils.rs +0 -0
  270. {rumdl-0.0.163 → rumdl-0.0.164}/tests/cli_duplication_test.rs +0 -0
  271. {rumdl-0.0.163 → rumdl-0.0.164}/tests/cli_explain_test.rs +0 -0
  272. {rumdl-0.0.163 → rumdl-0.0.164}/tests/cli_flag_precedence_test.rs +0 -0
  273. {rumdl-0.0.163 → rumdl-0.0.164}/tests/cli_integration_tests.rs +0 -0
  274. {rumdl-0.0.163 → rumdl-0.0.164}/tests/cli_lsp_fix_consistency.rs +0 -0
  275. {rumdl-0.0.163 → rumdl-0.0.164}/tests/cli_statistics_test.rs +0 -0
  276. {rumdl-0.0.163 → rumdl-0.0.164}/tests/code_block_blockquote_edge_cases.rs +0 -0
  277. {rumdl-0.0.163 → rumdl-0.0.164}/tests/common/cli_test_utils.rs +0 -0
  278. {rumdl-0.0.163 → rumdl-0.0.164}/tests/common/fixtures.rs +0 -0
  279. {rumdl-0.0.163 → rumdl-0.0.164}/tests/common/mod.rs +0 -0
  280. {rumdl-0.0.163 → rumdl-0.0.164}/tests/common/test_utils.rs +0 -0
  281. {rumdl-0.0.163 → rumdl-0.0.164}/tests/commonmark_compliance_tests.rs +0 -0
  282. {rumdl-0.0.163 → rumdl-0.0.164}/tests/comprehensive_integration_tests.rs +0 -0
  283. {rumdl-0.0.163 → rumdl-0.0.164}/tests/comprehensive_output_format_tests.rs +0 -0
  284. {rumdl-0.0.163 → rumdl-0.0.164}/tests/config_file_command_test.rs +0 -0
  285. {rumdl-0.0.163 → rumdl-0.0.164}/tests/config_upward_traversal_test.rs +0 -0
  286. {rumdl-0.0.163 → rumdl-0.0.164}/tests/configuration_inheritance_tests.rs +0 -0
  287. {rumdl-0.0.163 → rumdl-0.0.164}/tests/consistency_regression_tests.rs +0 -0
  288. {rumdl-0.0.163 → rumdl-0.0.164}/tests/crlf_line_endings_test.rs +0 -0
  289. {rumdl-0.0.163 → rumdl-0.0.164}/tests/cross_platform_compatibility_tests.rs +0 -0
  290. {rumdl-0.0.163 → rumdl-0.0.164}/tests/deeply_nested_lists_performance_test.rs +0 -0
  291. {rumdl-0.0.163 → rumdl-0.0.164}/tests/escaped_brackets_test.rs +0 -0
  292. {rumdl-0.0.163 → rumdl-0.0.164}/tests/exclude_with_explicit_paths_test.rs +0 -0
  293. {rumdl-0.0.163 → rumdl-0.0.164}/tests/final_confidence_assessment.rs +0 -0
  294. {rumdl-0.0.163 → rumdl-0.0.164}/tests/fix_counting_test.rs +0 -0
  295. {rumdl-0.0.163 → rumdl-0.0.164}/tests/fix_performance_baseline_test.rs +0 -0
  296. {rumdl-0.0.163 → rumdl-0.0.164}/tests/fixable_unfixable_config_test.rs +0 -0
  297. {rumdl-0.0.163 → rumdl-0.0.164}/tests/html_comments_test.rs +0 -0
  298. {rumdl-0.0.163 → rumdl-0.0.164}/tests/init_command_test.rs +0 -0
  299. {rumdl-0.0.163 → rumdl-0.0.164}/tests/init_tests.rs +0 -0
  300. {rumdl-0.0.163 → rumdl-0.0.164}/tests/inline_config_blocks_test.rs +0 -0
  301. {rumdl-0.0.163 → rumdl-0.0.164}/tests/inline_config_test.rs +0 -0
  302. {rumdl-0.0.163 → rumdl-0.0.164}/tests/integration_tests.rs +0 -0
  303. {rumdl-0.0.163 → rumdl-0.0.164}/tests/json_output_test.rs +0 -0
  304. {rumdl-0.0.163 → rumdl-0.0.164}/tests/kramdown_integration_test.rs +0 -0
  305. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lib.rs +0 -0
  306. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_editor_integration_tests.rs +0 -0
  307. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_formatting_tests.rs +0 -0
  308. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_initialization_options_test.rs +0 -0
  309. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_integration_tests.rs +0 -0
  310. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_memory_leak_tests.rs +0 -0
  311. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_mkdocs_flavor_test.rs +0 -0
  312. {rumdl-0.0.163 → rumdl-0.0.164}/tests/lsp_unopened_document_test.rs +0 -0
  313. {rumdl-0.0.163 → rumdl-0.0.164}/tests/malformed_markdown_stress_tests.rs +0 -0
  314. {rumdl-0.0.163 → rumdl-0.0.164}/tests/markdownlint_cli_integration.rs +0 -0
  315. {rumdl-0.0.163 → rumdl-0.0.164}/tests/markdownlint_config_test.rs +0 -0
  316. {rumdl-0.0.163 → rumdl-0.0.164}/tests/markdownlintignore_test.rs +0 -0
  317. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md009_md013_integration_test.rs +0 -0
  318. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md009_md013_order_test.rs +0 -0
  319. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md013_hard_breaks_test.rs +0 -0
  320. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md013_reflow_integration_test.rs +0 -0
  321. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md013_reflow_nested_lists_test.rs +0 -0
  322. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md032_edge_cases_test.rs +0 -0
  323. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md032_ordered_list_bug_test.rs +0 -0
  324. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md033_edge_cases_test.rs +0 -0
  325. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md037_xxxx_regression_test.rs +0 -0
  326. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md038_false_positive_test.rs +0 -0
  327. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md051_issue_39_regression_test.rs +0 -0
  328. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md051_readme_bug_test.rs +0 -0
  329. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md051_toc_bug_test.rs +0 -0
  330. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md052_literal_brackets_test.rs +0 -0
  331. {rumdl-0.0.163 → rumdl-0.0.164}/tests/md054_code_span_test.rs +0 -0
  332. {rumdl-0.0.163 → rumdl-0.0.164}/tests/mkdocs_anchor_edge_cases_test.rs +0 -0
  333. {rumdl-0.0.163 → rumdl-0.0.164}/tests/mkdocs_anchor_test.rs +0 -0
  334. {rumdl-0.0.163 → rumdl-0.0.164}/tests/nested_code_block_test.rs +0 -0
  335. {rumdl-0.0.163 → rumdl-0.0.164}/tests/output_format_integration_tests.rs +0 -0
  336. {rumdl-0.0.163 → rumdl-0.0.164}/tests/output_format_tests.rs +0 -0
  337. {rumdl-0.0.163 → rumdl-0.0.164}/tests/perf_check.rs +0 -0
  338. {rumdl-0.0.163 → rumdl-0.0.164}/tests/performance_validation_tests.rs +0 -0
  339. {rumdl-0.0.163 → rumdl-0.0.164}/tests/pyproject_config_tests.rs +0 -0
  340. {rumdl-0.0.163 → rumdl-0.0.164}/tests/real_world_repository_tests.rs +0 -0
  341. {rumdl-0.0.163 → rumdl-0.0.164}/tests/regression_prevention_tests.rs +0 -0
  342. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  343. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/heading_edge_cases_test.rs +0 -0
  344. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  345. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/link_edge_cases_test.rs +0 -0
  346. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/list_rules_integration_test.rs +0 -0
  347. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md001_test.rs +0 -0
  348. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md001_unicode_test.rs +0 -0
  349. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md002_test.rs +0 -0
  350. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md003_test.rs +0 -0
  351. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md004_test.rs +0 -0
  352. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md005_dynamic_indent_test.rs +0 -0
  353. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md005_test.rs +0 -0
  354. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md005_unicode_test.rs +0 -0
  355. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md006_test.rs +0 -0
  356. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md006_unicode_test.rs +0 -0
  357. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md007_test.rs +0 -0
  358. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md009_test.rs +0 -0
  359. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md010_test.rs +0 -0
  360. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md011_test.rs +0 -0
  361. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md012_test.rs +0 -0
  362. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md013_test.rs +0 -0
  363. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md014_test.rs +0 -0
  364. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md018_test.rs +0 -0
  365. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md019_test.rs +0 -0
  366. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md020_test.rs +0 -0
  367. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md021_test.rs +0 -0
  368. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md022_test.rs +0 -0
  369. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md023_extended_test.rs +0 -0
  370. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md023_test.rs +0 -0
  371. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md024_test.rs +0 -0
  372. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md025_test.rs +0 -0
  373. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md026_kramdown_test.rs +0 -0
  374. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md026_test.rs +0 -0
  375. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md027_test.rs +0 -0
  376. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md028_md009_interaction_test.rs +0 -0
  377. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md028_test.rs +0 -0
  378. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_code_block_separation_test.rs +0 -0
  379. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_fix_test.rs +0 -0
  380. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_issue42_test.rs +0 -0
  381. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
  382. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
  383. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md029_unicode_test.rs +0 -0
  384. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md030_test.rs +0 -0
  385. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md031_kramdown_test.rs +0 -0
  386. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md031_test.rs +0 -0
  387. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md032_test.rs +0 -0
  388. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md033_blockquote_test.rs +0 -0
  389. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md033_extended_test.rs +0 -0
  390. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md033_kramdown_test.rs +0 -0
  391. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md033_test.rs +0 -0
  392. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md034_ipv6_test.rs +0 -0
  393. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md035_test.rs +0 -0
  394. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md036_test.rs +0 -0
  395. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md037_kramdown_test.rs +0 -0
  396. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md037_test.rs +0 -0
  397. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md038_nested_backticks_test.rs +0 -0
  398. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md038_test.rs +0 -0
  399. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md039_test.rs +0 -0
  400. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md040_test.rs +0 -0
  401. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md041_test.rs +0 -0
  402. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md042_test.rs +0 -0
  403. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md043_test.rs +0 -0
  404. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md044_test.rs +0 -0
  405. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md045_test.rs +0 -0
  406. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md046_test.rs +0 -0
  407. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md047_test.rs +0 -0
  408. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md048_test.rs +0 -0
  409. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md049_test.rs +0 -0
  410. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md050_test.rs +0 -0
  411. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_comprehensive_test.rs +0 -0
  412. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
  413. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_edge_cases_test.rs +0 -0
  414. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_issue_39_regression_test.rs +0 -0
  415. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
  416. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_property_based_test.rs +0 -0
  417. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_regression_prevention_test.rs +0 -0
  418. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_test.rs +0 -0
  419. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md051_unicode_security_test.rs +0 -0
  420. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md052_test.rs +0 -0
  421. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md053_additional_test.rs +0 -0
  422. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md053_proptest.rs +0 -0
  423. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md053_test.rs +0 -0
  424. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md054_test.rs +0 -0
  425. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md054_unicode_test.rs +0 -0
  426. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md055_test.rs +0 -0
  427. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md056_test.rs +0 -0
  428. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md057_test.rs +0 -0
  429. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md058_kramdown_test.rs +0 -0
  430. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/md058_test.rs +0 -0
  431. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/mkdocs_admonitions_test.rs +0 -0
  432. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
  433. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/mkdocs_extensions_test.rs +0 -0
  434. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/mkdocs_snippets_test.rs +0 -0
  435. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/mod.rs +0 -0
  436. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules/rule_interaction_test.rs +0 -0
  437. {rumdl-0.0.163 → rumdl-0.0.164}/tests/rules_mod_test.rs +0 -0
  438. {rumdl-0.0.163 → rumdl-0.0.164}/tests/schema_validation_test.rs +0 -0
  439. {rumdl-0.0.163 → rumdl-0.0.164}/tests/sentence_per_line_test.rs +0 -0
  440. {rumdl-0.0.163 → rumdl-0.0.164}/tests/skip_context_tests.rs +0 -0
  441. {rumdl-0.0.163 → rumdl-0.0.164}/tests/test_ast_code_block_issue.rs +0 -0
  442. {rumdl-0.0.163 → rumdl-0.0.164}/tests/test_gfm_vs_default_parsing.rs +0 -0
  443. {rumdl-0.0.163 → rumdl-0.0.164}/tests/test_lint_context_flow.rs +0 -0
  444. {rumdl-0.0.163 → rumdl-0.0.164}/tests/test_list_ast_structure.rs +0 -0
  445. {rumdl-0.0.163 → rumdl-0.0.164}/tests/test_multiline_ast.rs +0 -0
  446. {rumdl-0.0.163 → rumdl-0.0.164}/tests/test_underscore_edge_cases.rs +0 -0
  447. {rumdl-0.0.163 → rumdl-0.0.164}/tests/thread_safety_tests.rs +0 -0
  448. {rumdl-0.0.163 → rumdl-0.0.164}/tests/unfixable_rules_test.rs +0 -0
  449. {rumdl-0.0.163 → rumdl-0.0.164}/tests/unicode_edge_case_tests.rs +0 -0
  450. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utf8_boundary_tests.rs +0 -0
  451. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils/blockquote_utils_test.rs +0 -0
  452. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils/code_block_utils_extended_test.rs +0 -0
  453. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils/code_block_utils_test.rs +0 -0
  454. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils/core_utils_test.rs +0 -0
  455. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils/front_matter_utils_test.rs +0 -0
  456. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils/line_index_test.rs +0 -0
  457. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils/mod.rs +0 -0
  458. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils_markdown_edge_cases.rs +0 -0
  459. {rumdl-0.0.163 → rumdl-0.0.164}/tests/utils_tests.rs +0 -0
  460. {rumdl-0.0.163 → rumdl-0.0.164}/tests/vscode_extension_fixes.rs +0 -0
  461. {rumdl-0.0.163 → rumdl-0.0.164}/tests/vscode_test.rs +0 -0
  462. {rumdl-0.0.163 → rumdl-0.0.164}/tests/vscode_tests.rs +0 -0
  463. {rumdl-0.0.163 → rumdl-0.0.164}/tests/vscode_windows_comprehensive_test.rs +0 -0
  464. {rumdl-0.0.163 → rumdl-0.0.164}/tests/vscode_windows_test.rs +0 -0
@@ -7,6 +7,76 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.164] - 2025-10-21
11
+
12
+ ### Added
13
+
14
+ - **File-Level Caching (Ruff-inspired)**: Dramatic performance improvements for repeat runs
15
+ - Blake3-based content hashing for fast cache lookups
16
+ - Automatic cache invalidation on content, config, or version changes
17
+ - Cache stored in `.rumdl-cache/{version}/{hash}.json`
18
+ - CLI flags: `--no-cache` to disable, `--cache-dir` to customize location
19
+ - Enabled by default for instant subsequent runs
20
+
21
+ - **Thread-Safe Parallel Caching**: Best of both worlds - parallelization AND caching
22
+ - Implemented Arc<Mutex<LintCache>> for safe cache sharing across threads
23
+ - Mutex locked ONLY for brief cache get/set operations
24
+ - Full parallelization during expensive linting operations
25
+ - Matches Ruff's architecture for optimal performance
26
+
27
+ - **Convergence Detection**: Added hash-based detection to identify when fixes have stabilized
28
+ - Stops iteration when content hash remains unchanged
29
+ - More efficient than counting rule applications
30
+ - Returns convergence status in fix results
31
+
32
+ - **Convergence Failure Warnings**: Report when auto-fix doesn't converge (Ruff-style)
33
+ - Warns if 100 iteration limit reached without convergence
34
+ - Shows rule codes involved in potential infinite loop
35
+ - Encourages bug reports for convergence failures
36
+ - Available via `RUMDL_DEBUG_FIX_PERF` environment variable
37
+
38
+ ### Changed
39
+
40
+ - **Auto-fix Iteration**: Automatic iteration until convergence (fixes #88)
41
+ - `--fix` now automatically iterates up to 100 passes until content stabilizes (same as Ruff)
42
+ - No need to manually re-run `rumdl check --fix` multiple times
43
+ - Hash-based convergence detection prevents unnecessary iterations
44
+ - Significantly improves user experience for multi-pass fix scenarios
45
+
46
+ - **Unified Linting Architecture**: Removed ~60 lines of duplicate linting logic
47
+ - Refactored `process_file_collect_warnings` to use `process_file_inner`
48
+ - Single code path for all file processing
49
+ - Cache works for ALL output formats (text, JSON, GitLab, SARIF, JUnit)
50
+
51
+ - **Parallel File Processing for Fix Mode**: 4.8x speedup on multi-file fixes
52
+ - Previously fix mode was always sequential
53
+ - Now uses parallel processing when safe (multiple independent files)
54
+ - Each file processes all its fix iterations independently
55
+
56
+ ### Fixed
57
+
58
+ - **Multi-pass Fixes**: No longer require manual re-runs to apply all possible fixes
59
+ - Previously users had to run `rumdl check --fix` multiple times
60
+ - Now automatically handles dependent rule fixes in single command
61
+ - Examples: MD010 (tabs) before MD007 (list indent), MD013 (line length) before MD009 (trailing spaces)
62
+
63
+ - **Cache Correctness**: Include enabled rules in cache key (Ruff-style)
64
+ - Cache now respects `--enable`/`--disable` CLI flags
65
+ - Different rule configurations create separate cache entries
66
+ - Prevents incorrect cached results when switching rule sets
67
+ - Changed `LintWarning.rule_name` from `Option<&'static str>` to `Option<String>` for proper serialization
68
+
69
+ - **Cache Parallelization**: Cache now works correctly with parallel processing
70
+ - No mutex contention during parallel file processing
71
+ - All output formats benefit from caching (previously only JSON/GitLab/SARIF/JUnit)
72
+
73
+ ### Performance
74
+
75
+ - **Single file with cache**: 943ms → 7ms (135x faster)
76
+ - **Multi-file (21 files) cold cache**: 14.4s → 4s (parallel processing)
77
+ - **Multi-file (21 files) warm cache**: 14.4s → 0.019s (757x faster!)
78
+ - **JSON format (17 files) with cache**: 13.9s → 60ms (231x faster)
79
+
10
80
  ## [0.0.163] - 2025-10-20
11
81
 
12
82
  ### Changed
@@ -111,6 +111,18 @@ version = "1.0.100"
111
111
  source = "registry+https://github.com/rust-lang/crates.io-index"
112
112
  checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
113
113
 
114
+ [[package]]
115
+ name = "arrayref"
116
+ version = "0.3.9"
117
+ source = "registry+https://github.com/rust-lang/crates.io-index"
118
+ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
119
+
120
+ [[package]]
121
+ name = "arrayvec"
122
+ version = "0.7.6"
123
+ source = "registry+https://github.com/rust-lang/crates.io-index"
124
+ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
125
+
114
126
  [[package]]
115
127
  name = "assert_cmd"
116
128
  version = "2.0.17"
@@ -224,6 +236,19 @@ version = "2.9.4"
224
236
  source = "registry+https://github.com/rust-lang/crates.io-index"
225
237
  checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
226
238
 
239
+ [[package]]
240
+ name = "blake3"
241
+ version = "1.8.2"
242
+ source = "registry+https://github.com/rust-lang/crates.io-index"
243
+ checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0"
244
+ dependencies = [
245
+ "arrayref",
246
+ "arrayvec",
247
+ "cc",
248
+ "cfg-if",
249
+ "constant_time_eq",
250
+ ]
251
+
227
252
  [[package]]
228
253
  name = "borrow-or-share"
229
254
  version = "0.2.2"
@@ -377,6 +402,12 @@ dependencies = [
377
402
  "windows-sys 0.59.0",
378
403
  ]
379
404
 
405
+ [[package]]
406
+ name = "constant_time_eq"
407
+ version = "0.3.1"
408
+ source = "registry+https://github.com/rust-lang/crates.io-index"
409
+ checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
410
+
380
411
  [[package]]
381
412
  name = "core-foundation-sys"
382
413
  version = "0.8.7"
@@ -1952,10 +1983,11 @@ dependencies = [
1952
1983
 
1953
1984
  [[package]]
1954
1985
  name = "rumdl"
1955
- version = "0.0.163"
1986
+ version = "0.0.164"
1956
1987
  dependencies = [
1957
1988
  "anyhow",
1958
1989
  "assert_cmd",
1990
+ "blake3",
1959
1991
  "chrono",
1960
1992
  "clap",
1961
1993
  "colored",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.163"
3
+ version = "0.0.164"
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)"
@@ -87,6 +87,7 @@ num_cpus = "1.16"
87
87
  chrono = { version = "0.4", features = ["serde"] }
88
88
  notify = "6.1"
89
89
  etcetera = "0.8"
90
+ blake3 = "1.5"
90
91
 
91
92
  [features]
92
93
  default = ["parallel"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.163
3
+ Version: 0.0.164
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -0,0 +1,394 @@
1
+ //! File-level caching for lint results
2
+ //!
3
+ //! Inspired by Ruff's caching implementation, this module provides fast caching
4
+ //! of lint results to avoid re-checking unchanged files.
5
+ //!
6
+ //! Cache key: (file_content_hash, config_hash, rumdl_version)
7
+ //! Cache value: Vec<LintWarning>
8
+ //! Storage: .rumdl-cache/{version}/{hash}.json
9
+
10
+ use rumdl_lib::rule::LintWarning;
11
+ use serde::{Deserialize, Serialize};
12
+ use std::fs;
13
+ use std::path::PathBuf;
14
+
15
+ const VERSION: &str = env!("CARGO_PKG_VERSION");
16
+
17
+ /// Cache statistics for reporting
18
+ #[derive(Debug, Default, Clone)]
19
+ pub struct CacheStats {
20
+ pub hits: usize,
21
+ pub misses: usize,
22
+ pub writes: usize,
23
+ }
24
+
25
+ impl CacheStats {
26
+ #[allow(dead_code)]
27
+ pub fn hit_rate(&self) -> f64 {
28
+ let total = self.hits + self.misses;
29
+ if total == 0 {
30
+ 0.0
31
+ } else {
32
+ (self.hits as f64 / total as f64) * 100.0
33
+ }
34
+ }
35
+ }
36
+
37
+ /// A cache entry stored on disk
38
+ #[derive(Debug, Serialize, Deserialize)]
39
+ struct CacheEntry {
40
+ /// Blake3 hash of file content
41
+ file_hash: String,
42
+ /// Blake3 hash of config
43
+ config_hash: String,
44
+ /// Blake3 hash of enabled rules (sorted rule names)
45
+ rules_hash: String,
46
+ /// rumdl version
47
+ version: String,
48
+ /// Cached lint warnings
49
+ warnings: Vec<LintWarning>,
50
+ /// Timestamp when cached (Unix timestamp)
51
+ timestamp: i64,
52
+ }
53
+
54
+ /// File-level cache for lint results
55
+ pub struct LintCache {
56
+ /// Base cache directory (e.g., .rumdl-cache/)
57
+ cache_dir: PathBuf,
58
+ /// Whether caching is enabled
59
+ enabled: bool,
60
+ /// Cache statistics
61
+ stats: CacheStats,
62
+ }
63
+
64
+ impl LintCache {
65
+ /// Create a new cache instance
66
+ ///
67
+ /// # Arguments
68
+ /// * `cache_dir` - Base directory for cache (e.g., ".rumdl-cache")
69
+ /// * `enabled` - Whether caching is enabled
70
+ #[allow(dead_code)]
71
+ pub fn new(cache_dir: PathBuf, enabled: bool) -> Self {
72
+ Self {
73
+ cache_dir,
74
+ enabled,
75
+ stats: CacheStats::default(),
76
+ }
77
+ }
78
+
79
+ /// Get default cache directory for a project
80
+ #[allow(dead_code)]
81
+ pub fn default_cache_dir() -> PathBuf {
82
+ PathBuf::from(".rumdl-cache")
83
+ }
84
+
85
+ /// Compute Blake3 hash of content
86
+ fn hash_content(content: &str) -> String {
87
+ blake3::hash(content.as_bytes()).to_hex().to_string()
88
+ }
89
+
90
+ /// Compute hash of config
91
+ /// This is a public function that can be called from file_processor
92
+ pub fn hash_config(config: &rumdl_lib::config::Config) -> String {
93
+ // Serialize config to JSON and hash it
94
+ // If serialization fails, return a default hash
95
+ let config_json = serde_json::to_string(config).unwrap_or_default();
96
+ blake3::hash(config_json.as_bytes()).to_hex().to_string()
97
+ }
98
+
99
+ /// Compute hash of enabled rules (Ruff-style)
100
+ /// This ensures different rule configurations get different cache entries
101
+ pub fn hash_rules(rules: &[Box<dyn rumdl_lib::rule::Rule>]) -> String {
102
+ // Sort rule names for deterministic hashing
103
+ let mut rule_names: Vec<&str> = rules.iter().map(|r| r.name()).collect();
104
+ rule_names.sort_unstable();
105
+
106
+ // Hash the sorted rule names
107
+ let rules_str = rule_names.join(",");
108
+ blake3::hash(rules_str.as_bytes()).to_hex().to_string()
109
+ }
110
+
111
+ /// Get the cache file path for a given content and config hash
112
+ /// Includes rules_hash in filename to separate different rule configurations
113
+ fn cache_file_path(&self, file_hash: &str, rules_hash: &str) -> PathBuf {
114
+ // Include first 8 chars of rules_hash to keep filenames reasonable
115
+ let short_rules_hash = &rules_hash[..8];
116
+ self.cache_dir
117
+ .join(VERSION)
118
+ .join(format!("{file_hash}_{short_rules_hash}.json"))
119
+ }
120
+
121
+ /// Try to get cached results for a file
122
+ ///
123
+ /// Returns Some(warnings) if cache hit, None if cache miss
124
+ pub fn get(&mut self, content: &str, config_hash: &str, rules_hash: &str) -> Option<Vec<LintWarning>> {
125
+ if !self.enabled {
126
+ return None;
127
+ }
128
+
129
+ let file_hash = Self::hash_content(content);
130
+ let cache_path = self.cache_file_path(&file_hash, rules_hash);
131
+
132
+ // Try to read cache file
133
+ let cache_data = match fs::read_to_string(&cache_path) {
134
+ Ok(data) => data,
135
+ Err(_) => {
136
+ self.stats.misses += 1;
137
+ return None;
138
+ }
139
+ };
140
+
141
+ // Try to parse cache entry
142
+ let entry: CacheEntry = match serde_json::from_str(&cache_data) {
143
+ Ok(entry) => entry,
144
+ Err(_) => {
145
+ self.stats.misses += 1;
146
+ return None;
147
+ }
148
+ };
149
+
150
+ // Validate cache entry (Ruff-style: file content + config + enabled rules)
151
+ if entry.file_hash != file_hash
152
+ || entry.config_hash != config_hash
153
+ || entry.rules_hash != rules_hash
154
+ || entry.version != VERSION
155
+ {
156
+ self.stats.misses += 1;
157
+ return None;
158
+ }
159
+
160
+ // Cache hit!
161
+ self.stats.hits += 1;
162
+ Some(entry.warnings)
163
+ }
164
+
165
+ /// Store lint results in cache
166
+ pub fn set(&mut self, content: &str, config_hash: &str, rules_hash: &str, warnings: Vec<LintWarning>) {
167
+ if !self.enabled {
168
+ return;
169
+ }
170
+
171
+ let file_hash = Self::hash_content(content);
172
+ let cache_path = self.cache_file_path(&file_hash, rules_hash);
173
+
174
+ // Create cache directory if it doesn't exist
175
+ if let Some(parent) = cache_path.parent() {
176
+ let _ = fs::create_dir_all(parent);
177
+ }
178
+
179
+ // Create cache entry
180
+ let entry = CacheEntry {
181
+ file_hash,
182
+ config_hash: config_hash.to_string(),
183
+ rules_hash: rules_hash.to_string(),
184
+ version: VERSION.to_string(),
185
+ warnings,
186
+ timestamp: chrono::Utc::now().timestamp(),
187
+ };
188
+
189
+ // Write to cache (ignore errors - cache is optional)
190
+ if let Ok(json) = serde_json::to_string_pretty(&entry) {
191
+ let _ = fs::write(&cache_path, json);
192
+ self.stats.writes += 1;
193
+ }
194
+ }
195
+
196
+ /// Clear the entire cache
197
+ #[allow(dead_code)]
198
+ pub fn clear(&self) -> std::io::Result<()> {
199
+ if self.cache_dir.exists() {
200
+ fs::remove_dir_all(&self.cache_dir)?;
201
+ }
202
+ Ok(())
203
+ }
204
+
205
+ /// Initialize cache directory structure
206
+ #[allow(dead_code)]
207
+ pub fn init(&self) -> std::io::Result<()> {
208
+ if !self.enabled {
209
+ return Ok(());
210
+ }
211
+
212
+ // Create version-specific directory
213
+ let version_dir = self.cache_dir.join(VERSION);
214
+ fs::create_dir_all(&version_dir)?;
215
+
216
+ // Create .gitignore if it doesn't exist
217
+ let gitignore_path = self.cache_dir.join(".gitignore");
218
+ if !gitignore_path.exists() {
219
+ fs::write(gitignore_path, "# Automatically created by rumdl.\n*\n")?;
220
+ }
221
+
222
+ // Create CACHEDIR.TAG file (standard cache directory marker)
223
+ let cachedir_tag = self.cache_dir.join("CACHEDIR.TAG");
224
+ if !cachedir_tag.exists() {
225
+ fs::write(
226
+ cachedir_tag,
227
+ "Signature: 8a477f597d28d172789f06886806bc55\n# This file is a cache directory tag created by rumdl.\n",
228
+ )?;
229
+ }
230
+
231
+ Ok(())
232
+ }
233
+
234
+ /// Get cache statistics
235
+ #[allow(dead_code)]
236
+ pub fn stats(&self) -> &CacheStats {
237
+ &self.stats
238
+ }
239
+
240
+ /// Check if caching is enabled
241
+ #[allow(dead_code)]
242
+ pub fn is_enabled(&self) -> bool {
243
+ self.enabled
244
+ }
245
+ }
246
+
247
+ #[cfg(test)]
248
+ mod tests {
249
+ use super::*;
250
+ use tempfile::TempDir;
251
+
252
+ #[test]
253
+ fn test_cache_disabled() {
254
+ let temp_dir = TempDir::new().unwrap();
255
+ let mut cache = LintCache::new(temp_dir.path().to_path_buf(), false);
256
+
257
+ let content = "# Test";
258
+ let config_hash = "abc123";
259
+
260
+ // Should return None when disabled
261
+ assert!(cache.get(content, config_hash, "test_rules_hash").is_none());
262
+
263
+ // Set should be no-op when disabled
264
+ cache.set(content, config_hash, "test_rules_hash", vec![]);
265
+ assert_eq!(cache.stats().writes, 0);
266
+ }
267
+
268
+ #[test]
269
+ fn test_cache_miss() {
270
+ let temp_dir = TempDir::new().unwrap();
271
+ let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
272
+
273
+ let content = "# Test";
274
+ let config_hash = "abc123";
275
+
276
+ // First access should be a miss
277
+ assert!(cache.get(content, config_hash, "test_rules_hash").is_none());
278
+ assert_eq!(cache.stats().misses, 1);
279
+ assert_eq!(cache.stats().hits, 0);
280
+ }
281
+
282
+ #[test]
283
+ fn test_cache_hit() {
284
+ let temp_dir = TempDir::new().unwrap();
285
+ let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
286
+ cache.init().unwrap();
287
+
288
+ let content = "# Test";
289
+ let config_hash = "abc123";
290
+ let warnings = vec![];
291
+
292
+ // Store in cache
293
+ cache.set(content, config_hash, "test_rules_hash", warnings.clone());
294
+
295
+ // Should hit cache
296
+ let cached = cache.get(content, config_hash, "test_rules_hash");
297
+ assert!(cached.is_some());
298
+ assert_eq!(cached.unwrap(), warnings);
299
+ assert_eq!(cache.stats().hits, 1);
300
+ }
301
+
302
+ #[test]
303
+ fn test_cache_invalidation_on_content_change() {
304
+ let temp_dir = TempDir::new().unwrap();
305
+ let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
306
+ cache.init().unwrap();
307
+
308
+ let content1 = "# Test 1";
309
+ let content2 = "# Test 2";
310
+ let config_hash = "abc123";
311
+
312
+ // Cache content1
313
+ cache.set(content1, config_hash, "test_rules_hash", vec![]);
314
+
315
+ // content2 should miss (different content)
316
+ assert!(cache.get(content2, config_hash, "test_rules_hash").is_none());
317
+ }
318
+
319
+ #[test]
320
+ fn test_cache_invalidation_on_config_change() {
321
+ let temp_dir = TempDir::new().unwrap();
322
+ let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
323
+ cache.init().unwrap();
324
+
325
+ let content = "# Test";
326
+ let config_hash1 = "abc123";
327
+ let config_hash2 = "def456";
328
+
329
+ // Cache with config1
330
+ cache.set(content, config_hash1, "test_rules_hash", vec![]);
331
+
332
+ // Should miss with config2 (different config)
333
+ assert!(cache.get(content, config_hash2, "test_rules_hash").is_none());
334
+ }
335
+
336
+ #[test]
337
+ fn test_hash_content() {
338
+ let content1 = "# Test";
339
+ let content2 = "# Test";
340
+ let content3 = "# Different";
341
+
342
+ let hash1 = LintCache::hash_content(content1);
343
+ let hash2 = LintCache::hash_content(content2);
344
+ let hash3 = LintCache::hash_content(content3);
345
+
346
+ // Same content should produce same hash
347
+ assert_eq!(hash1, hash2);
348
+
349
+ // Different content should produce different hash
350
+ assert_ne!(hash1, hash3);
351
+ }
352
+
353
+ #[test]
354
+ fn test_cache_stats() {
355
+ let temp_dir = TempDir::new().unwrap();
356
+ let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
357
+ cache.init().unwrap();
358
+
359
+ let content = "# Test";
360
+ let config_hash = "abc123";
361
+
362
+ // Miss
363
+ cache.get(content, config_hash, "test_rules_hash");
364
+ assert_eq!(cache.stats().misses, 1);
365
+ assert_eq!(cache.stats().hits, 0);
366
+
367
+ // Write
368
+ cache.set(content, config_hash, "test_rules_hash", vec![]);
369
+ assert_eq!(cache.stats().writes, 1);
370
+
371
+ // Hit
372
+ cache.get(content, config_hash, "test_rules_hash");
373
+ assert_eq!(cache.stats().hits, 1);
374
+
375
+ // Hit rate
376
+ assert_eq!(cache.stats().hit_rate(), 50.0); // 1 hit out of 2 total
377
+ }
378
+
379
+ #[test]
380
+ fn test_cache_clear() {
381
+ let temp_dir = TempDir::new().unwrap();
382
+ let mut cache = LintCache::new(temp_dir.path().to_path_buf(), true);
383
+ cache.init().unwrap();
384
+
385
+ // Add something to cache
386
+ cache.set("# Test", "abc", "test_rules_hash", vec![]);
387
+
388
+ // Clear cache
389
+ cache.clear().unwrap();
390
+
391
+ // Cache directory should be gone
392
+ assert!(!cache.cache_dir.exists());
393
+ }
394
+ }