rumdl 0.0.69__tar.gz → 0.0.71__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 (262) hide show
  1. {rumdl-0.0.69 → rumdl-0.0.71}/Cargo.lock +1 -1
  2. {rumdl-0.0.69 → rumdl-0.0.71}/Cargo.toml +1 -1
  3. {rumdl-0.0.69 → rumdl-0.0.71}/PKG-INFO +1 -1
  4. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md006_start_bullets.rs +55 -35
  5. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md012_no_multiple_blanks.rs +55 -0
  6. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md030_list_marker_space.rs +10 -2
  7. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md012_test.rs +92 -0
  8. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md030_test.rs +35 -7
  9. {rumdl-0.0.69 → rumdl-0.0.71}/.rumdl.toml +0 -0
  10. {rumdl-0.0.69 → rumdl-0.0.71}/MANIFEST.in +0 -0
  11. {rumdl-0.0.69 → rumdl-0.0.71}/Makefile +0 -0
  12. {rumdl-0.0.69 → rumdl-0.0.71}/README.md +0 -0
  13. {rumdl-0.0.69 → rumdl-0.0.71}/assets/logo.png +0 -0
  14. {rumdl-0.0.69 → rumdl-0.0.71}/benches/fix_performance.rs +0 -0
  15. {rumdl-0.0.69 → rumdl-0.0.71}/benches/range_performance.rs +0 -0
  16. {rumdl-0.0.69 → rumdl-0.0.71}/benches/range_utils_benchmark.rs +0 -0
  17. {rumdl-0.0.69 → rumdl-0.0.71}/benches/rule_performance.rs +0 -0
  18. {rumdl-0.0.69 → rumdl-0.0.71}/benches/simple_fix_bench.rs +0 -0
  19. {rumdl-0.0.69 → rumdl-0.0.71}/docs/RULES.md +0 -0
  20. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md001.md +0 -0
  21. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md002.md +0 -0
  22. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md003.md +0 -0
  23. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md004.md +0 -0
  24. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md005.md +0 -0
  25. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md006.md +0 -0
  26. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md007.md +0 -0
  27. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md009.md +0 -0
  28. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md010.md +0 -0
  29. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md011.md +0 -0
  30. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md012.md +0 -0
  31. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md013.md +0 -0
  32. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md014.md +0 -0
  33. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md018.md +0 -0
  34. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md019.md +0 -0
  35. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md020.md +0 -0
  36. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md021.md +0 -0
  37. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md022.md +0 -0
  38. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md023.md +0 -0
  39. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md024.md +0 -0
  40. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md025.md +0 -0
  41. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md026.md +0 -0
  42. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md027.md +0 -0
  43. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md028.md +0 -0
  44. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md029.md +0 -0
  45. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md030.md +0 -0
  46. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md031.md +0 -0
  47. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md032.md +0 -0
  48. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md033.md +0 -0
  49. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md034.md +0 -0
  50. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md035.md +0 -0
  51. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md036.md +0 -0
  52. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md037.md +0 -0
  53. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md038.md +0 -0
  54. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md039.md +0 -0
  55. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md040.md +0 -0
  56. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md041.md +0 -0
  57. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md042.md +0 -0
  58. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md043.md +0 -0
  59. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md044.md +0 -0
  60. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md045.md +0 -0
  61. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md046.md +0 -0
  62. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md047.md +0 -0
  63. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md048.md +0 -0
  64. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md049.md +0 -0
  65. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md050.md +0 -0
  66. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md051.md +0 -0
  67. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md052.md +0 -0
  68. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md053.md +0 -0
  69. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md054.md +0 -0
  70. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md055.md +0 -0
  71. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md056.md +0 -0
  72. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md057.md +0 -0
  73. {rumdl-0.0.69 → rumdl-0.0.71}/docs/md058.md +0 -0
  74. {rumdl-0.0.69 → rumdl-0.0.71}/issues/plan-rule-parity-with-markdownlint.md +0 -0
  75. {rumdl-0.0.69 → rumdl-0.0.71}/parity_check.py +0 -0
  76. {rumdl-0.0.69 → rumdl-0.0.71}/pyproject.toml +0 -0
  77. {rumdl-0.0.69 → rumdl-0.0.71}/python/MANIFEST.in +0 -0
  78. {rumdl-0.0.69 → rumdl-0.0.71}/python/PYTHON-README.md +0 -0
  79. {rumdl-0.0.69 → rumdl-0.0.71}/python/rumdl/__init__.py +0 -0
  80. {rumdl-0.0.69 → rumdl-0.0.71}/python/rumdl/__main__.py +0 -0
  81. {rumdl-0.0.69 → rumdl-0.0.71}/python/rumdl/py.typed +0 -0
  82. {rumdl-0.0.69 → rumdl-0.0.71}/rumdl.toml.example +0 -0
  83. {rumdl-0.0.69 → rumdl-0.0.71}/src/config.rs +0 -0
  84. {rumdl-0.0.69 → rumdl-0.0.71}/src/init.rs +0 -0
  85. {rumdl-0.0.69 → rumdl-0.0.71}/src/lib.rs +0 -0
  86. {rumdl-0.0.69 → rumdl-0.0.71}/src/lint_context.rs +0 -0
  87. {rumdl-0.0.69 → rumdl-0.0.71}/src/lsp/mod.rs +0 -0
  88. {rumdl-0.0.69 → rumdl-0.0.71}/src/lsp/server.rs +0 -0
  89. {rumdl-0.0.69 → rumdl-0.0.71}/src/lsp/types.rs +0 -0
  90. {rumdl-0.0.69 → rumdl-0.0.71}/src/main.rs +0 -0
  91. {rumdl-0.0.69 → rumdl-0.0.71}/src/markdownlint_config.rs +0 -0
  92. {rumdl-0.0.69 → rumdl-0.0.71}/src/parallel.rs +0 -0
  93. {rumdl-0.0.69 → rumdl-0.0.71}/src/performance.rs +0 -0
  94. {rumdl-0.0.69 → rumdl-0.0.71}/src/profiling.rs +0 -0
  95. {rumdl-0.0.69 → rumdl-0.0.71}/src/python.rs +0 -0
  96. {rumdl-0.0.69 → rumdl-0.0.71}/src/rule.rs +0 -0
  97. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/blockquote_utils.rs +0 -0
  98. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/code_block_utils.rs +0 -0
  99. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/code_fence_utils.rs +0 -0
  100. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/emphasis_style.rs +0 -0
  101. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/front_matter_utils.rs +0 -0
  102. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/heading_utils.rs +0 -0
  103. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/list_utils.rs +0 -0
  104. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md001_heading_increment.rs +0 -0
  105. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md002_first_heading_h1.rs +0 -0
  106. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md003_heading_style.rs +0 -0
  107. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md004_unordered_list_style.rs +0 -0
  108. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md005_list_indent.rs +0 -0
  109. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md007_ul_indent.rs +0 -0
  110. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md009_trailing_spaces.rs +0 -0
  111. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md010_no_hard_tabs.rs +0 -0
  112. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md011_no_reversed_links.rs +0 -0
  113. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md013_line_length.rs +0 -0
  114. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md014_commands_show_output.rs +0 -0
  115. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md018_no_missing_space_atx.rs +0 -0
  116. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  117. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  118. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  119. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md022_blanks_around_headings.rs +0 -0
  120. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md023_heading_start_left.rs +0 -0
  121. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md024_no_duplicate_heading.rs +0 -0
  122. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md025_single_title.rs +0 -0
  123. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  124. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  125. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  126. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md029_ordered_list_prefix.rs +0 -0
  127. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md031_blanks_around_fences.rs +0 -0
  128. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md032_blanks_around_lists.rs +0 -0
  129. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md033_no_inline_html.rs +0 -0
  130. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md034_no_bare_urls.rs +0 -0
  131. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md035_hr_style.rs +0 -0
  132. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  133. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  134. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md038_no_space_in_code.rs +0 -0
  135. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md039_no_space_in_links.rs +0 -0
  136. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md040_fenced_code_language.rs +0 -0
  137. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md041_first_line_heading.rs +0 -0
  138. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md042_no_empty_links.rs +0 -0
  139. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md043_required_headings.rs +0 -0
  140. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md044_proper_names.rs +0 -0
  141. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md045_no_alt_text.rs +0 -0
  142. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md046_code_block_style.rs +0 -0
  143. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md047_single_trailing_newline.rs +0 -0
  144. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md048_code_fence_style.rs +0 -0
  145. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md049_emphasis_style.rs +0 -0
  146. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md050_strong_style.rs +0 -0
  147. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md051_link_fragments.rs +0 -0
  148. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md052_reference_links_images.rs +0 -0
  149. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  150. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md054_link_image_style.rs +0 -0
  151. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md055_table_pipe_style.rs +0 -0
  152. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md056_table_column_count.rs +0 -0
  153. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md057_existing_relative_links.rs +0 -0
  154. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/md058_blanks_around_tables.rs +0 -0
  155. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/mod.rs +0 -0
  156. {rumdl-0.0.69 → rumdl-0.0.71}/src/rules/strong_style.rs +0 -0
  157. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/ast_utils.rs +0 -0
  158. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/code_block_utils.rs +0 -0
  159. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/document_structure.rs +0 -0
  160. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/early_returns.rs +0 -0
  161. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/element_cache.rs +0 -0
  162. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/markdown_elements.rs +0 -0
  163. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/mod.rs +0 -0
  164. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/range_utils.rs +0 -0
  165. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/regex_cache.rs +0 -0
  166. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/string_interner.rs +0 -0
  167. {rumdl-0.0.69 → rumdl-0.0.71}/src/utils/table_utils.rs +0 -0
  168. {rumdl-0.0.69 → rumdl-0.0.71}/tests/advanced_integration_tests.rs +0 -0
  169. {rumdl-0.0.69 → rumdl-0.0.71}/tests/character_ranges/additional_tests.rs +0 -0
  170. {rumdl-0.0.69 → rumdl-0.0.71}/tests/character_ranges/basic_tests.rs +0 -0
  171. {rumdl-0.0.69 → rumdl-0.0.71}/tests/character_ranges/comprehensive_tests.rs +0 -0
  172. {rumdl-0.0.69 → rumdl-0.0.71}/tests/character_ranges/extended_tests.rs +0 -0
  173. {rumdl-0.0.69 → rumdl-0.0.71}/tests/character_ranges/mod.rs +0 -0
  174. {rumdl-0.0.69 → rumdl-0.0.71}/tests/character_ranges/unicode_utils.rs +0 -0
  175. {rumdl-0.0.69 → rumdl-0.0.71}/tests/cli_duplication_test.rs +0 -0
  176. {rumdl-0.0.69 → rumdl-0.0.71}/tests/cli_integration_tests.rs +0 -0
  177. {rumdl-0.0.69 → rumdl-0.0.71}/tests/commonmark_compliance_tests.rs +0 -0
  178. {rumdl-0.0.69 → rumdl-0.0.71}/tests/comprehensive_integration_tests.rs +0 -0
  179. {rumdl-0.0.69 → rumdl-0.0.71}/tests/config_application_tests.rs +0 -0
  180. {rumdl-0.0.69 → rumdl-0.0.71}/tests/config_tests.rs +0 -0
  181. {rumdl-0.0.69 → rumdl-0.0.71}/tests/init_command_test.rs +0 -0
  182. {rumdl-0.0.69 → rumdl-0.0.71}/tests/init_tests.rs +0 -0
  183. {rumdl-0.0.69 → rumdl-0.0.71}/tests/integration_tests.rs +0 -0
  184. {rumdl-0.0.69 → rumdl-0.0.71}/tests/json_output_test.rs +0 -0
  185. {rumdl-0.0.69 → rumdl-0.0.71}/tests/lib.rs +0 -0
  186. {rumdl-0.0.69 → rumdl-0.0.71}/tests/lsp_integration_tests.rs +0 -0
  187. {rumdl-0.0.69 → rumdl-0.0.71}/tests/lsp_tests.rs +0 -0
  188. {rumdl-0.0.69 → rumdl-0.0.71}/tests/markdownlint_cli_integration.rs +0 -0
  189. {rumdl-0.0.69 → rumdl-0.0.71}/tests/markdownlint_config_test.rs +0 -0
  190. {rumdl-0.0.69 → rumdl-0.0.71}/tests/md030_edge_cases.md +0 -0
  191. {rumdl-0.0.69 → rumdl-0.0.71}/tests/output_format_tests.rs +0 -0
  192. {rumdl-0.0.69 → rumdl-0.0.71}/tests/perf_check.rs +0 -0
  193. {rumdl-0.0.69 → rumdl-0.0.71}/tests/pyproject_config_tests.rs +0 -0
  194. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md001_test.rs +0 -0
  195. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md001_unicode_test.rs +0 -0
  196. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md002_test.rs +0 -0
  197. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md003_test.rs +0 -0
  198. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md004_test.rs +0 -0
  199. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md005_test.rs +0 -0
  200. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md006_test.rs +0 -0
  201. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md006_unicode_test.rs +0 -0
  202. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md007_test.rs +0 -0
  203. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md009_test.rs +0 -0
  204. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md010_test.rs +0 -0
  205. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md011_test.rs +0 -0
  206. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md013_test.rs +0 -0
  207. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md014_test.rs +0 -0
  208. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md018_test.rs +0 -0
  209. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md019_test.rs +0 -0
  210. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md020_test.rs +0 -0
  211. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md021_test.rs +0 -0
  212. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md022_test.rs +0 -0
  213. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md023_extended_test.rs +0 -0
  214. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md023_test.rs +0 -0
  215. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md024_test.rs +0 -0
  216. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md025_test.rs +0 -0
  217. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md026_test.rs +0 -0
  218. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md027_test.rs +0 -0
  219. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md028_test.rs +0 -0
  220. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md029_test.rs +0 -0
  221. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md031_test.rs +0 -0
  222. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md032_test.rs +0 -0
  223. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md033_extended_test.rs +0 -0
  224. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md033_test.rs +0 -0
  225. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md034_test.rs +0 -0
  226. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md035_test.rs +0 -0
  227. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md036_test.rs +0 -0
  228. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md037_test.rs +0 -0
  229. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md038_test.rs +0 -0
  230. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md039_test.rs +0 -0
  231. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md040_test.rs +0 -0
  232. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md041_test.rs +0 -0
  233. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md042_test.rs +0 -0
  234. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md043_test.rs +0 -0
  235. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md044_test.rs +0 -0
  236. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md045_test.rs +0 -0
  237. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md046_test.rs +0 -0
  238. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md047_test.rs +0 -0
  239. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md048_test.rs +0 -0
  240. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md049_test.rs +0 -0
  241. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md050_test.rs +0 -0
  242. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md051_test.rs +0 -0
  243. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md052_test.rs +0 -0
  244. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md053_additional_test.rs +0 -0
  245. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md053_proptest.rs +0 -0
  246. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md053_test.rs +0 -0
  247. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md054_test.rs +0 -0
  248. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md054_unicode_test.rs +0 -0
  249. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md055_test.rs +0 -0
  250. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md056_test.rs +0 -0
  251. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md057_test.rs +0 -0
  252. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/md058_test.rs +0 -0
  253. {rumdl-0.0.69 → rumdl-0.0.71}/tests/rules/mod.rs +0 -0
  254. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils/blockquote_utils_test.rs +0 -0
  255. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils/code_block_utils_extended_test.rs +0 -0
  256. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils/code_block_utils_test.rs +0 -0
  257. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils/core_utils_test.rs +0 -0
  258. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils/front_matter_utils_test.rs +0 -0
  259. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils/line_index_test.rs +0 -0
  260. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils/mod.rs +0 -0
  261. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils_markdown_edge_cases.rs +0 -0
  262. {rumdl-0.0.69 → rumdl-0.0.71}/tests/utils_tests.rs +0 -0
@@ -1789,7 +1789,7 @@ dependencies = [
1789
1789
 
1790
1790
  [[package]]
1791
1791
  name = "rumdl"
1792
- version = "0.0.69"
1792
+ version = "0.0.71"
1793
1793
  dependencies = [
1794
1794
  "anyhow",
1795
1795
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.69"
3
+ version = "0.0.71"
4
4
  edition = "2021"
5
5
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
6
6
  authors = ["Ruben J. Jongejan <ruben.jongejan@gmail.com>"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.69
3
+ Version: 0.0.71
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -25,14 +25,14 @@ lazy_static! {
25
25
  }
26
26
 
27
27
  impl MD006StartBullets {
28
- /// Check if a line is a bullet list item and return the indentation level
28
+ /// Checks if a line is a bullet list item and returns its indentation level
29
29
  fn is_bullet_list_item(line: &str) -> Option<usize> {
30
- if let Some(caps) = BULLET_PATTERN.captures(line) {
31
- let indent = caps.get(1).unwrap().as_str().len();
32
- Some(indent)
33
- } else {
34
- None
30
+ if let Some(captures) = BULLET_PATTERN.captures(line) {
31
+ if let Some(indent) = captures.get(1) {
32
+ return Some(indent.as_str().len());
33
+ }
35
34
  }
35
+ None
36
36
  }
37
37
 
38
38
  /// Checks if a line is blank (empty or whitespace only)
@@ -46,7 +46,9 @@ impl MD006StartBullets {
46
46
  Some(indent) => indent,
47
47
  None => return None, // Should not happen if called on a bullet item
48
48
  };
49
+
49
50
  let mut i = line_idx;
51
+
50
52
  while i > 0 {
51
53
  i -= 1;
52
54
  if Self::is_blank_line(lines[i]) {
@@ -54,13 +56,36 @@ impl MD006StartBullets {
54
56
  }
55
57
  if let Some(prev_indent) = Self::is_bullet_list_item(lines[i]) {
56
58
  if prev_indent <= current_indent {
57
- return Some((i, prev_indent));
59
+ // Found a potential parent or sibling
60
+ // Check if there's any non-list content between this potential parent and current item
61
+ let mut has_breaking_content = false;
62
+ for check_idx in (i + 1)..line_idx {
63
+ if Self::is_blank_line(lines[check_idx]) {
64
+ continue;
65
+ }
66
+ if Self::is_bullet_list_item(lines[check_idx]).is_none() {
67
+ // Found non-list content - check if it breaks the list structure
68
+ let content_indent = lines[check_idx].len() - lines[check_idx].trim_start().len();
69
+ // Content is only acceptable if it's indented at least as much as current item
70
+ // AND we have a true parent relationship (prev_indent < current_indent)
71
+ if content_indent < current_indent || prev_indent >= current_indent {
72
+ has_breaking_content = true;
73
+ break;
74
+ }
75
+ }
76
+ }
77
+
78
+ if !has_breaking_content {
79
+ return Some((i, prev_indent));
80
+ } else {
81
+ // Content breaks the list structure
82
+ return None;
83
+ }
58
84
  }
59
85
  // If prev_indent > current_indent, it's a child of a sibling, ignore it and keep searching.
60
- }
61
- // If we hit non-list content, stop searching
62
- if Self::is_bullet_list_item(lines[i]).is_none() {
63
- break;
86
+ } else {
87
+ // Found non-list content - this breaks the search
88
+ return None;
64
89
  }
65
90
  }
66
91
  None
@@ -156,36 +181,25 @@ impl Rule for MD006StartBullets {
156
181
  doc_structure: &DocumentStructure,
157
182
  ) -> LintResult {
158
183
  let content = _ctx.content;
159
-
160
- // Early returns for performance
161
- if content.is_empty() || doc_structure.list_lines.is_empty() {
184
+ if doc_structure.list_lines.is_empty() {
162
185
  return Ok(Vec::new());
163
186
  }
164
-
165
- // Quick check for any list markers before processing
166
187
  if !content.contains('*') && !content.contains('-') && !content.contains('+') {
167
188
  return Ok(Vec::new());
168
189
  }
169
-
170
- // Pre-compute LineIndex once for all operations
171
190
  let line_index = LineIndex::new(content.to_string());
172
191
  let mut result = Vec::new();
173
192
  let lines: Vec<&str> = content.lines().collect();
174
193
  let mut valid_bullet_lines = vec![false; lines.len()];
175
-
176
- // Process list lines in order for better cache locality
177
194
  for &line_num in &doc_structure.list_lines {
178
195
  let line_idx = line_num - 1;
179
196
  if line_idx >= lines.len() {
180
197
  continue;
181
198
  }
182
199
  let line = lines[line_idx];
183
-
184
- // Skip lines in code blocks
185
200
  if doc_structure.is_in_code_block(line_num) {
186
201
  continue;
187
202
  }
188
-
189
203
  if let Some(indent) = Self::is_bullet_list_item(line) {
190
204
  let mut is_valid = false; // Assume invalid initially
191
205
  if indent == 0 {
@@ -220,19 +234,25 @@ impl Rule for MD006StartBullets {
220
234
  } else {
221
235
  fixed_line.to_string()
222
236
  };
237
+
238
+ // Calculate the range to highlight: from first indentation character to end of list marker
239
+ let start_col = if indent > 0 { 2 } else { 1 }; // Start from first indentation space if indented
240
+ let marker_pos = line.find(|c: char| c == '*' || c == '-' || c == '+').unwrap_or(0);
241
+ let end_col = marker_pos + 3; // +1 for the marker itself, +1 for 1-based indexing, +1 for space after marker
242
+
223
243
  result.push(LintWarning {
224
- rule_name: Some(self.name()),
225
- severity: Severity::Warning,
226
- line: line_num,
227
- column: indent,
228
- end_line: line_num,
229
- end_column: indent + 3,
230
- message: "Consider starting bulleted lists at the beginning of the line"
231
- .to_string(),
232
- fix: Some(Fix {
233
- range: line_index.line_col_to_byte_range(line_num, 1),
234
- replacement,
235
- }),
244
+ rule_name: Some(self.name()),
245
+ severity: Severity::Warning,
246
+ line: line_num,
247
+ column: start_col,
248
+ end_line: line_num,
249
+ end_column: end_col,
250
+ message: "List item should start at the beginning of the line (remove indentation)"
251
+ .to_string(),
252
+ fix: Some(Fix {
253
+ range: line_index.line_col_to_byte_range(line_num, 1),
254
+ replacement,
255
+ }),
236
256
  });
237
257
  }
238
258
  }
@@ -23,6 +23,19 @@ impl MD012NoMultipleBlanks {
23
23
  Self { maximum }
24
24
  }
25
25
 
26
+ #[cfg(test)]
27
+ pub fn debug_regions(lines: &[&str]) -> (Vec<(usize, usize)>, Vec<(usize, usize)>) {
28
+ let code_regions = Self::compute_code_block_regions(lines);
29
+ let front_matter_regions = Self::compute_front_matter_regions(lines);
30
+ println!("Lines:");
31
+ for (i, line) in lines.iter().enumerate() {
32
+ println!(" {}: {:?}", i, line);
33
+ }
34
+ println!("Code block regions: {:?}", code_regions);
35
+ println!("Front matter regions: {:?}", front_matter_regions);
36
+ (code_regions, front_matter_regions)
37
+ }
38
+
26
39
  /// Pre-compute code block regions for efficient lookup
27
40
  fn compute_code_block_regions(lines: &[&str]) -> Vec<(usize, usize)> {
28
41
  let mut regions = Vec::new();
@@ -48,6 +61,43 @@ impl MD012NoMultipleBlanks {
48
61
  regions.push((start_line, lines.len() - 1));
49
62
  }
50
63
 
64
+ // Second pass: detect indented code blocks (4+ spaces)
65
+ let mut in_indented_block = false;
66
+ let mut indented_start = 0;
67
+
68
+ for (i, line) in lines.iter().enumerate() {
69
+ // Skip lines that are already in fenced code blocks
70
+ if Self::is_in_regions(i, &regions) {
71
+ continue;
72
+ }
73
+
74
+ let is_indented_code = line.len() >= 4 && line.starts_with(" ") && !line.trim().is_empty();
75
+ let is_blank = line.trim().is_empty();
76
+
77
+ if is_indented_code {
78
+ if !in_indented_block {
79
+ // Start of indented code block
80
+ indented_start = i;
81
+ in_indented_block = true;
82
+ }
83
+ } else if !is_blank {
84
+ // Non-blank, non-indented line ends the indented code block
85
+ if in_indented_block {
86
+ regions.push((indented_start, i - 1));
87
+ in_indented_block = false;
88
+ }
89
+ }
90
+ // Blank lines don't end indented code blocks, they're part of them
91
+ }
92
+
93
+ // Handle indented code block at end of file
94
+ if in_indented_block {
95
+ regions.push((indented_start, lines.len() - 1));
96
+ }
97
+
98
+ // Sort regions by start position
99
+ regions.sort_by(|a, b| a.0.cmp(&b.0));
100
+
51
101
  regions
52
102
  }
53
103
 
@@ -130,6 +180,11 @@ impl Rule for MD012NoMultipleBlanks {
130
180
  if Self::is_in_regions(line_num, &code_block_regions)
131
181
  || Self::is_in_regions(line_num, &front_matter_regions)
132
182
  {
183
+ // Reset blank line counting when entering a code block or front matter
184
+ // to prevent counting blank lines across block boundaries
185
+ if blank_count > 0 {
186
+ blank_count = 0;
187
+ }
133
188
  continue;
134
189
  }
135
190
 
@@ -149,7 +149,11 @@ impl Rule for MD030ListMarkerSpace {
149
149
  column: start_col,
150
150
  end_line,
151
151
  end_column: end_col,
152
- message: "Spaces after list markers".to_string(),
152
+ message: format!(
153
+ "Spaces after list markers (Expected: {}; Actual: {})",
154
+ expected_spaces,
155
+ whitespace.len()
156
+ ),
153
157
  fix,
154
158
  });
155
159
  }
@@ -420,7 +424,11 @@ mod tests {
420
424
  "Should flag lines with too many spaces after list marker"
421
425
  );
422
426
  for warning in result {
423
- assert_eq!(warning.message, "Spaces after list markers");
427
+ assert!(
428
+ warning.message.starts_with("Spaces after list markers (Expected:") && warning.message.contains("Actual:"),
429
+ "Warning message should include expected and actual values, got: '{}'",
430
+ warning.message
431
+ );
424
432
  }
425
433
  }
426
434
  }
@@ -131,3 +131,95 @@ fn test_md012_whitespace_lines() {
131
131
  "Multiple consecutive blank lines between content (Expected: 1; Actual: 2)"
132
132
  );
133
133
  }
134
+
135
+ #[test]
136
+ fn test_md012_indented_code_blocks() {
137
+ let rule = MD012NoMultipleBlanks::default();
138
+ let content = "Line 1\n\n code block\n\n more code\n\nLine 2\n";
139
+ let ctx = LintContext::new(content);
140
+ let result = rule.check(&ctx).unwrap();
141
+ assert!(result.is_empty()); // Multiple blank lines in indented code blocks are allowed
142
+ }
143
+
144
+ #[test]
145
+ fn test_md012_indented_fenced_code_blocks() {
146
+ let rule = MD012NoMultipleBlanks::default();
147
+ let content = "Text\n\n ```bash\n code\n ```\n\nMore text\n";
148
+ let ctx = LintContext::new(content);
149
+ let result = rule.check(&ctx).unwrap();
150
+ assert!(result.is_empty()); // Should not flag blank lines around indented fenced code blocks
151
+ }
152
+
153
+ #[test]
154
+ fn test_md012_debug_indented_fenced() {
155
+ let content = "Text\n\n ```bash\n code\n ```\n\nMore text\n";
156
+ let lines: Vec<&str> = content.lines().collect();
157
+
158
+ // Debug the regions
159
+ println!("Lines:");
160
+ for (i, line) in lines.iter().enumerate() {
161
+ println!(" {}: {:?}", i, line);
162
+ }
163
+
164
+ // Test the rule
165
+ let rule = MD012NoMultipleBlanks::default();
166
+ let ctx = LintContext::new(content);
167
+ let result = rule.check(&ctx).unwrap();
168
+
169
+ println!("Warnings: {:?}", result);
170
+ for warning in &result {
171
+ println!(" Line {}: {}", warning.line, warning.message);
172
+ }
173
+
174
+ // This should pass but currently fails
175
+ assert!(result.is_empty(), "Expected no warnings, got: {:?}", result);
176
+ }
177
+
178
+ #[test]
179
+ fn test_md012_contributing_pattern() {
180
+ // This reproduces the exact pattern from the CONTRIBUTING file that's causing false positives
181
+ let content = "To set up the MLflow repository, run the following commands:\n\n ```bash\n # Clone the repository\n git clone --recurse-submodules git@github.com:<username>/mlflow.git\n # The alternative way of cloning through https may cause permission error during branch push\n";
182
+
183
+ let rule = MD012NoMultipleBlanks::default();
184
+ let ctx = LintContext::new(content);
185
+ let result = rule.check(&ctx).unwrap();
186
+
187
+ println!("Content lines:");
188
+ for (i, line) in content.lines().enumerate() {
189
+ println!(" {}: {:?}", i, line);
190
+ }
191
+
192
+ println!("Warnings: {:?}", result);
193
+ for warning in &result {
194
+ println!(" Line {}: {}", warning.line, warning.message);
195
+ }
196
+
197
+ // This should pass - there's only 1 blank line before the indented fenced code block
198
+ assert!(result.is_empty(), "Expected no warnings, got: {:?}", result);
199
+ }
200
+
201
+ #[test]
202
+ fn test_md012_region_calculation() {
203
+ // Test with a simple fenced code block to debug region calculation
204
+ let content = "Text\n\n```bash\ncode\n```\n\nMore text\n";
205
+ let lines: Vec<&str> = content.lines().collect();
206
+
207
+ println!("Lines:");
208
+ for (i, line) in lines.iter().enumerate() {
209
+ println!(" {}: {:?}", i, line);
210
+ }
211
+
212
+ // We need to access the compute_code_block_regions function somehow
213
+ // For now, let's just test the rule behavior
214
+ let rule = MD012NoMultipleBlanks::default();
215
+ let ctx = LintContext::new(content);
216
+ let result = rule.check(&ctx).unwrap();
217
+
218
+ println!("Warnings: {:?}", result);
219
+ for warning in &result {
220
+ println!(" Line {}: {}", warning.line, warning.message);
221
+ }
222
+
223
+ // This should pass - there's only 1 blank line before and after the code block
224
+ assert!(result.is_empty(), "Expected no warnings, got: {:?}", result);
225
+ }
@@ -29,7 +29,11 @@ mod tests {
29
29
  let result = rule.check(&ctx).unwrap();
30
30
  assert_eq!(result.len(), 2);
31
31
  for warning in result {
32
- assert_eq!(warning.message, "Spaces after list markers");
32
+ assert!(
33
+ warning.message.starts_with("Spaces after list markers (Expected:") && warning.message.contains("Actual:"),
34
+ "Warning message should include expected and actual values, got: '{}'",
35
+ warning.message
36
+ );
33
37
  }
34
38
  }
35
39
 
@@ -41,7 +45,11 @@ mod tests {
41
45
  let result = rule.check(&ctx).unwrap();
42
46
  assert_eq!(result.len(), 2);
43
47
  for warning in result {
44
- assert_eq!(warning.message, "Spaces after list markers");
48
+ assert!(
49
+ warning.message.starts_with("Spaces after list markers (Expected:") && warning.message.contains("Actual:"),
50
+ "Warning message should include expected and actual values, got: '{}'",
51
+ warning.message
52
+ );
45
53
  }
46
54
  }
47
55
 
@@ -139,7 +147,11 @@ mod tests {
139
147
  let ctx = LintContext::new(content);
140
148
  let result = rule.check(&ctx).unwrap();
141
149
  assert_eq!(result.len(), 1);
142
- assert_eq!(result[0].message, "Spaces after list markers");
150
+ assert!(
151
+ result[0].message.starts_with("Spaces after list markers (Expected:") && result[0].message.contains("Actual:"),
152
+ "Warning message should include expected and actual values, got: '{}'",
153
+ result[0].message
154
+ );
143
155
  }
144
156
 
145
157
  #[test]
@@ -149,7 +161,11 @@ mod tests {
149
161
  let ctx = LintContext::new(content);
150
162
  let result = rule.check(&ctx).unwrap();
151
163
  assert_eq!(result.len(), 1);
152
- assert_eq!(result[0].message, "Spaces after list markers");
164
+ assert!(
165
+ result[0].message.starts_with("Spaces after list markers (Expected:") && result[0].message.contains("Actual:"),
166
+ "Warning message should include expected and actual values, got: '{}'",
167
+ result[0].message
168
+ );
153
169
  }
154
170
 
155
171
  #[test]
@@ -159,7 +175,11 @@ mod tests {
159
175
  let ctx = LintContext::new(content);
160
176
  let result = rule.check(&ctx).unwrap();
161
177
  assert_eq!(result.len(), 1);
162
- assert_eq!(result[0].message, "Spaces after list markers");
178
+ assert!(
179
+ result[0].message.starts_with("Spaces after list markers (Expected:") && result[0].message.contains("Actual:"),
180
+ "Warning message should include expected and actual values, got: '{}'",
181
+ result[0].message
182
+ );
163
183
  }
164
184
 
165
185
  #[test]
@@ -169,7 +189,11 @@ mod tests {
169
189
  let ctx = LintContext::new(content);
170
190
  let result = rule.check(&ctx).unwrap();
171
191
  assert_eq!(result.len(), 1);
172
- assert_eq!(result[0].message, "Spaces after list markers");
192
+ assert!(
193
+ result[0].message.starts_with("Spaces after list markers (Expected:") && result[0].message.contains("Actual:"),
194
+ "Warning message should include expected and actual values, got: '{}'",
195
+ result[0].message
196
+ );
173
197
  }
174
198
 
175
199
  #[test]
@@ -179,7 +203,11 @@ mod tests {
179
203
  let ctx = LintContext::new(content);
180
204
  let result = rule.check(&ctx).unwrap();
181
205
  assert_eq!(result.len(), 1);
182
- assert_eq!(result[0].message, "Spaces after list markers");
206
+ assert!(
207
+ result[0].message.starts_with("Spaces after list markers (Expected:") && result[0].message.contains("Actual:"),
208
+ "Warning message should include expected and actual values, got: '{}'",
209
+ result[0].message
210
+ );
183
211
  }
184
212
 
185
213
  #[test]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes