@owenlamont/ryl 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/.github/CODEOWNERS +1 -0
  2. package/.github/dependabot.yml +13 -0
  3. package/.github/workflows/ci.yml +107 -0
  4. package/.github/workflows/release.yml +613 -0
  5. package/.github/workflows/update_dependencies.yml +61 -0
  6. package/.github/workflows/update_linters.yml +56 -0
  7. package/.pre-commit-config.yaml +87 -0
  8. package/.yamllint +4 -0
  9. package/AGENTS.md +200 -0
  10. package/Cargo.lock +908 -0
  11. package/Cargo.toml +32 -0
  12. package/LICENSE +21 -0
  13. package/README.md +230 -0
  14. package/bin/ryl.js +1 -0
  15. package/clippy.toml +1 -0
  16. package/docs/config-presets.md +100 -0
  17. package/img/benchmark-5x5-5runs.svg +2176 -0
  18. package/package.json +28 -0
  19. package/pyproject.toml +42 -0
  20. package/ruff.toml +107 -0
  21. package/rumdl.toml +20 -0
  22. package/rust-toolchain.toml +3 -0
  23. package/rustfmt.toml +3 -0
  24. package/scripts/benchmark_perf_vs_yamllint.py +400 -0
  25. package/scripts/coverage-missing.ps1 +80 -0
  26. package/scripts/coverage-missing.sh +60 -0
  27. package/src/bin/discover_config_bin.rs +24 -0
  28. package/src/cli_support.rs +33 -0
  29. package/src/conf/mod.rs +85 -0
  30. package/src/config.rs +2099 -0
  31. package/src/decoder.rs +326 -0
  32. package/src/discover.rs +31 -0
  33. package/src/lib.rs +19 -0
  34. package/src/lint.rs +558 -0
  35. package/src/main.rs +535 -0
  36. package/src/migrate.rs +233 -0
  37. package/src/rules/anchors.rs +517 -0
  38. package/src/rules/braces.rs +77 -0
  39. package/src/rules/brackets.rs +77 -0
  40. package/src/rules/colons.rs +475 -0
  41. package/src/rules/commas.rs +372 -0
  42. package/src/rules/comments.rs +299 -0
  43. package/src/rules/comments_indentation.rs +243 -0
  44. package/src/rules/document_end.rs +175 -0
  45. package/src/rules/document_start.rs +84 -0
  46. package/src/rules/empty_lines.rs +152 -0
  47. package/src/rules/empty_values.rs +255 -0
  48. package/src/rules/float_values.rs +259 -0
  49. package/src/rules/flow_collection.rs +562 -0
  50. package/src/rules/hyphens.rs +104 -0
  51. package/src/rules/indentation.rs +803 -0
  52. package/src/rules/key_duplicates.rs +218 -0
  53. package/src/rules/key_ordering.rs +303 -0
  54. package/src/rules/line_length.rs +326 -0
  55. package/src/rules/mod.rs +25 -0
  56. package/src/rules/new_line_at_end_of_file.rs +23 -0
  57. package/src/rules/new_lines.rs +95 -0
  58. package/src/rules/octal_values.rs +121 -0
  59. package/src/rules/quoted_strings.rs +577 -0
  60. package/src/rules/span_utils.rs +37 -0
  61. package/src/rules/trailing_spaces.rs +65 -0
  62. package/src/rules/truthy.rs +420 -0
  63. package/tests/brackets_carriage_return.rs +114 -0
  64. package/tests/build_global_cfg_error.rs +23 -0
  65. package/tests/cli_anchors_rule.rs +143 -0
  66. package/tests/cli_braces_rule.rs +104 -0
  67. package/tests/cli_brackets_rule.rs +104 -0
  68. package/tests/cli_colons_rule.rs +65 -0
  69. package/tests/cli_commas_rule.rs +104 -0
  70. package/tests/cli_comments_indentation_rule.rs +61 -0
  71. package/tests/cli_comments_rule.rs +67 -0
  72. package/tests/cli_config_data_error.rs +30 -0
  73. package/tests/cli_config_flags.rs +66 -0
  74. package/tests/cli_config_migrate.rs +229 -0
  75. package/tests/cli_document_end_rule.rs +92 -0
  76. package/tests/cli_document_start_rule.rs +92 -0
  77. package/tests/cli_empty_lines_rule.rs +87 -0
  78. package/tests/cli_empty_values_rule.rs +68 -0
  79. package/tests/cli_env_config.rs +34 -0
  80. package/tests/cli_exit_and_errors.rs +41 -0
  81. package/tests/cli_file_encoding.rs +203 -0
  82. package/tests/cli_float_values_rule.rs +64 -0
  83. package/tests/cli_format_options.rs +316 -0
  84. package/tests/cli_global_cfg_relaxed.rs +20 -0
  85. package/tests/cli_hyphens_rule.rs +104 -0
  86. package/tests/cli_indentation_rule.rs +65 -0
  87. package/tests/cli_invalid_project_config.rs +39 -0
  88. package/tests/cli_key_duplicates_rule.rs +104 -0
  89. package/tests/cli_key_ordering_rule.rs +59 -0
  90. package/tests/cli_line_length_rule.rs +85 -0
  91. package/tests/cli_list_files.rs +29 -0
  92. package/tests/cli_new_line_rule.rs +141 -0
  93. package/tests/cli_new_lines_rule.rs +119 -0
  94. package/tests/cli_octal_values_rule.rs +60 -0
  95. package/tests/cli_quoted_strings_rule.rs +47 -0
  96. package/tests/cli_toml_config.rs +119 -0
  97. package/tests/cli_trailing_spaces_rule.rs +77 -0
  98. package/tests/cli_truthy_rule.rs +83 -0
  99. package/tests/cli_yaml_files_negation.rs +45 -0
  100. package/tests/colons_rule.rs +303 -0
  101. package/tests/common/compat.rs +114 -0
  102. package/tests/common/fake_env.rs +93 -0
  103. package/tests/common/mod.rs +1 -0
  104. package/tests/conf_builtin.rs +9 -0
  105. package/tests/config_anchors.rs +84 -0
  106. package/tests/config_braces.rs +121 -0
  107. package/tests/config_brackets.rs +127 -0
  108. package/tests/config_commas.rs +79 -0
  109. package/tests/config_comments.rs +65 -0
  110. package/tests/config_comments_indentation.rs +20 -0
  111. package/tests/config_deep_merge_nonstring_key.rs +24 -0
  112. package/tests/config_document_end.rs +54 -0
  113. package/tests/config_document_start.rs +55 -0
  114. package/tests/config_empty_lines.rs +48 -0
  115. package/tests/config_empty_values.rs +35 -0
  116. package/tests/config_env_errors.rs +23 -0
  117. package/tests/config_env_invalid_inline.rs +15 -0
  118. package/tests/config_env_missing.rs +63 -0
  119. package/tests/config_env_shim.rs +301 -0
  120. package/tests/config_explicit_file_parse_error.rs +55 -0
  121. package/tests/config_extended_features.rs +225 -0
  122. package/tests/config_extends_inline.rs +185 -0
  123. package/tests/config_extends_sequence.rs +18 -0
  124. package/tests/config_find_project_home_boundary.rs +54 -0
  125. package/tests/config_find_project_two_files_in_cwd.rs +47 -0
  126. package/tests/config_float_values.rs +34 -0
  127. package/tests/config_from_yaml_paths.rs +32 -0
  128. package/tests/config_hyphens.rs +51 -0
  129. package/tests/config_ignore_errors.rs +243 -0
  130. package/tests/config_ignore_overrides.rs +83 -0
  131. package/tests/config_indentation.rs +65 -0
  132. package/tests/config_invalid_globs.rs +16 -0
  133. package/tests/config_invalid_types.rs +19 -0
  134. package/tests/config_key_duplicates.rs +34 -0
  135. package/tests/config_key_ordering.rs +70 -0
  136. package/tests/config_line_length.rs +65 -0
  137. package/tests/config_locale.rs +111 -0
  138. package/tests/config_merge.rs +26 -0
  139. package/tests/config_new_lines.rs +89 -0
  140. package/tests/config_octal_values.rs +33 -0
  141. package/tests/config_quoted_strings.rs +195 -0
  142. package/tests/config_rule_level.rs +147 -0
  143. package/tests/config_rules_non_string_keys.rs +23 -0
  144. package/tests/config_scalar_overrides.rs +27 -0
  145. package/tests/config_to_toml.rs +110 -0
  146. package/tests/config_toml_coverage.rs +80 -0
  147. package/tests/config_toml_discovery.rs +304 -0
  148. package/tests/config_trailing_spaces.rs +152 -0
  149. package/tests/config_truthy.rs +77 -0
  150. package/tests/config_yaml_files.rs +62 -0
  151. package/tests/config_yaml_files_all_non_string.rs +15 -0
  152. package/tests/config_yaml_files_empty.rs +30 -0
  153. package/tests/coverage_commas.rs +46 -0
  154. package/tests/decoder_decode.rs +338 -0
  155. package/tests/discover_config_bin_all.rs +66 -0
  156. package/tests/discover_config_bin_env_invalid_yaml.rs +26 -0
  157. package/tests/discover_config_bin_project_config_parse_error.rs +24 -0
  158. package/tests/discover_config_bin_user_global_error.rs +26 -0
  159. package/tests/discover_module.rs +30 -0
  160. package/tests/discover_per_file_dir.rs +10 -0
  161. package/tests/discover_per_file_project_config_error.rs +21 -0
  162. package/tests/float_values.rs +43 -0
  163. package/tests/lint_multi_errors.rs +32 -0
  164. package/tests/main_yaml_ok_filtering.rs +30 -0
  165. package/tests/migrate_module.rs +259 -0
  166. package/tests/resolve_ctx_empty_parent.rs +16 -0
  167. package/tests/rule_anchors.rs +442 -0
  168. package/tests/rule_braces.rs +258 -0
  169. package/tests/rule_brackets.rs +217 -0
  170. package/tests/rule_commas.rs +205 -0
  171. package/tests/rule_comments.rs +197 -0
  172. package/tests/rule_comments_indentation.rs +127 -0
  173. package/tests/rule_document_end.rs +118 -0
  174. package/tests/rule_document_start.rs +60 -0
  175. package/tests/rule_empty_lines.rs +96 -0
  176. package/tests/rule_empty_values.rs +102 -0
  177. package/tests/rule_float_values.rs +109 -0
  178. package/tests/rule_hyphens.rs +65 -0
  179. package/tests/rule_indentation.rs +455 -0
  180. package/tests/rule_key_duplicates.rs +76 -0
  181. package/tests/rule_key_ordering.rs +207 -0
  182. package/tests/rule_line_length.rs +200 -0
  183. package/tests/rule_new_lines.rs +51 -0
  184. package/tests/rule_octal_values.rs +53 -0
  185. package/tests/rule_quoted_strings.rs +290 -0
  186. package/tests/rule_trailing_spaces.rs +41 -0
  187. package/tests/rule_truthy.rs +236 -0
  188. package/tests/user_global_invalid_yaml.rs +32 -0
  189. package/tests/yamllint_compat_anchors.rs +280 -0
  190. package/tests/yamllint_compat_braces.rs +411 -0
  191. package/tests/yamllint_compat_brackets.rs +364 -0
  192. package/tests/yamllint_compat_colons.rs +298 -0
  193. package/tests/yamllint_compat_colors.rs +80 -0
  194. package/tests/yamllint_compat_commas.rs +375 -0
  195. package/tests/yamllint_compat_comments.rs +167 -0
  196. package/tests/yamllint_compat_comments_indentation.rs +281 -0
  197. package/tests/yamllint_compat_config.rs +170 -0
  198. package/tests/yamllint_compat_document_end.rs +243 -0
  199. package/tests/yamllint_compat_document_start.rs +136 -0
  200. package/tests/yamllint_compat_empty_lines.rs +117 -0
  201. package/tests/yamllint_compat_empty_values.rs +179 -0
  202. package/tests/yamllint_compat_float_values.rs +216 -0
  203. package/tests/yamllint_compat_hyphens.rs +223 -0
  204. package/tests/yamllint_compat_indentation.rs +398 -0
  205. package/tests/yamllint_compat_key_duplicates.rs +139 -0
  206. package/tests/yamllint_compat_key_ordering.rs +170 -0
  207. package/tests/yamllint_compat_line_length.rs +375 -0
  208. package/tests/yamllint_compat_list.rs +127 -0
  209. package/tests/yamllint_compat_new_line.rs +133 -0
  210. package/tests/yamllint_compat_newline_types.rs +185 -0
  211. package/tests/yamllint_compat_octal_values.rs +172 -0
  212. package/tests/yamllint_compat_quoted_strings.rs +154 -0
  213. package/tests/yamllint_compat_syntax.rs +200 -0
  214. package/tests/yamllint_compat_trailing_spaces.rs +162 -0
  215. package/tests/yamllint_compat_truthy.rs +130 -0
  216. package/tests/yamllint_compat_yaml_files.rs +81 -0
  217. package/typos.toml +2 -0
@@ -0,0 +1,364 @@
1
+ use std::fs;
2
+
3
+ use tempfile::tempdir;
4
+
5
+ #[path = "common/compat.rs"]
6
+ mod compat;
7
+
8
+ use compat::{
9
+ SCENARIOS, build_ryl_command, build_yamllint_command, capture_with_env,
10
+ ensure_yamllint_installed,
11
+ };
12
+
13
+ #[test]
14
+ fn brackets_rule_matches_yamllint() {
15
+ ensure_yamllint_installed();
16
+
17
+ let dir = tempdir().unwrap();
18
+
19
+ let default_cfg = dir.path().join("brackets-default.yml");
20
+ fs::write(
21
+ &default_cfg,
22
+ "rules:\n document-start: disable\n brackets: enable\n",
23
+ )
24
+ .unwrap();
25
+
26
+ let warning_cfg = dir.path().join("brackets-warning.yml");
27
+ fs::write(
28
+ &warning_cfg,
29
+ "rules:\n document-start: disable\n brackets:\n level: warning\n",
30
+ )
31
+ .unwrap();
32
+
33
+ let min_cfg = dir.path().join("brackets-min.yml");
34
+ fs::write(
35
+ &min_cfg,
36
+ "rules:\n document-start: disable\n brackets:\n min-spaces-inside: 1\n max-spaces-inside: -1\n",
37
+ )
38
+ .unwrap();
39
+
40
+ let max_cfg = dir.path().join("brackets-max.yml");
41
+ fs::write(
42
+ &max_cfg,
43
+ "rules:\n document-start: disable\n brackets:\n max-spaces-inside: 1\n",
44
+ )
45
+ .unwrap();
46
+
47
+ let empty_cfg = dir.path().join("brackets-empty.yml");
48
+ fs::write(
49
+ &empty_cfg,
50
+ "rules:\n document-start: disable\n brackets:\n min-spaces-inside-empty: 1\n max-spaces-inside-empty: 2\n",
51
+ )
52
+ .unwrap();
53
+
54
+ let forbid_cfg = dir.path().join("brackets-forbid.yml");
55
+ fs::write(
56
+ &forbid_cfg,
57
+ "rules:\n document-start: disable\n brackets:\n forbid: true\n",
58
+ )
59
+ .unwrap();
60
+
61
+ let forbid_non_empty_cfg = dir.path().join("brackets-forbid-non-empty.yml");
62
+ fs::write(
63
+ &forbid_non_empty_cfg,
64
+ "rules:\n document-start: disable\n brackets:\n forbid: non-empty\n",
65
+ )
66
+ .unwrap();
67
+
68
+ let default_violation = dir.path().join("default.yaml");
69
+ fs::write(&default_violation, "---\nobject: [ 1, 2 ]\n").unwrap();
70
+
71
+ let min_violation = dir.path().join("min.yaml");
72
+ fs::write(&min_violation, "---\nobject: [1, 2]\n").unwrap();
73
+
74
+ let max_violation = dir.path().join("max.yaml");
75
+ fs::write(&max_violation, "---\nobject: [ 1, 2 ]\n").unwrap();
76
+
77
+ let empty_min_violation = dir.path().join("empty-min.yaml");
78
+ fs::write(&empty_min_violation, "---\nobject: []\n").unwrap();
79
+
80
+ let empty_max_violation = dir.path().join("empty-max.yaml");
81
+ fs::write(&empty_max_violation, "---\nobject: [ ]\n").unwrap();
82
+
83
+ let forbid_violation = dir.path().join("forbid.yaml");
84
+ fs::write(&forbid_violation, "---\nobject: [1, 2]\n").unwrap();
85
+
86
+ let forbid_spaces_violation = dir.path().join("forbid-spaces.yaml");
87
+ fs::write(&forbid_spaces_violation, "---\nobject: [ 1, 2 ]\n").unwrap();
88
+
89
+ let exe = env!("CARGO_BIN_EXE_ryl");
90
+
91
+ for scenario in SCENARIOS {
92
+ let mut ryl_default = build_ryl_command(exe, scenario.ryl_format);
93
+ ryl_default
94
+ .arg("-c")
95
+ .arg(&default_cfg)
96
+ .arg(&default_violation);
97
+ let (ryl_default_code, ryl_default_output) =
98
+ capture_with_env(ryl_default, scenario.envs);
99
+
100
+ let mut yam_default = build_yamllint_command(scenario.yam_format);
101
+ yam_default
102
+ .arg("-c")
103
+ .arg(&default_cfg)
104
+ .arg(&default_violation);
105
+ let (yam_default_code, yam_default_output) =
106
+ capture_with_env(yam_default, scenario.envs);
107
+
108
+ assert_eq!(ryl_default_code, 1, "ryl default exit ({})", scenario.label);
109
+ assert_eq!(
110
+ yam_default_code, 1,
111
+ "yamllint default exit ({})",
112
+ scenario.label
113
+ );
114
+ assert_eq!(
115
+ ryl_default_output, yam_default_output,
116
+ "default diagnostics mismatch ({})",
117
+ scenario.label
118
+ );
119
+
120
+ let mut ryl_warning = build_ryl_command(exe, scenario.ryl_format);
121
+ ryl_warning
122
+ .arg("-c")
123
+ .arg(&warning_cfg)
124
+ .arg(&default_violation);
125
+ let (ryl_warning_code, ryl_warning_output) =
126
+ capture_with_env(ryl_warning, scenario.envs);
127
+
128
+ let mut yam_warning = build_yamllint_command(scenario.yam_format);
129
+ yam_warning
130
+ .arg("-c")
131
+ .arg(&warning_cfg)
132
+ .arg(&default_violation);
133
+ let (yam_warning_code, yam_warning_output) =
134
+ capture_with_env(yam_warning, scenario.envs);
135
+
136
+ assert_eq!(ryl_warning_code, 0, "ryl warning exit ({})", scenario.label);
137
+ assert_eq!(
138
+ yam_warning_code, 0,
139
+ "yamllint warning exit ({})",
140
+ scenario.label
141
+ );
142
+ assert_eq!(
143
+ ryl_warning_output, yam_warning_output,
144
+ "warning diagnostics mismatch ({})",
145
+ scenario.label
146
+ );
147
+
148
+ let mut ryl_min = build_ryl_command(exe, scenario.ryl_format);
149
+ ryl_min.arg("-c").arg(&min_cfg).arg(&min_violation);
150
+ let (ryl_min_code, ryl_min_output) = capture_with_env(ryl_min, scenario.envs);
151
+
152
+ let mut yam_min = build_yamllint_command(scenario.yam_format);
153
+ yam_min.arg("-c").arg(&min_cfg).arg(&min_violation);
154
+ let (yam_min_code, yam_min_output) = capture_with_env(yam_min, scenario.envs);
155
+
156
+ assert_eq!(ryl_min_code, 1, "ryl min exit ({})", scenario.label);
157
+ assert_eq!(yam_min_code, 1, "yamllint min exit ({})", scenario.label);
158
+ assert_eq!(
159
+ ryl_min_output, yam_min_output,
160
+ "min diagnostics mismatch ({})",
161
+ scenario.label
162
+ );
163
+
164
+ let mut ryl_max = build_ryl_command(exe, scenario.ryl_format);
165
+ ryl_max.arg("-c").arg(&max_cfg).arg(&max_violation);
166
+ let (ryl_max_code, ryl_max_output) = capture_with_env(ryl_max, scenario.envs);
167
+
168
+ let mut yam_max = build_yamllint_command(scenario.yam_format);
169
+ yam_max.arg("-c").arg(&max_cfg).arg(&max_violation);
170
+ let (yam_max_code, yam_max_output) = capture_with_env(yam_max, scenario.envs);
171
+
172
+ assert_eq!(ryl_max_code, 1, "ryl max exit ({})", scenario.label);
173
+ assert_eq!(yam_max_code, 1, "yamllint max exit ({})", scenario.label);
174
+ assert_eq!(
175
+ ryl_max_output, yam_max_output,
176
+ "max diagnostics mismatch ({})",
177
+ scenario.label
178
+ );
179
+
180
+ let mut ryl_empty_min = build_ryl_command(exe, scenario.ryl_format);
181
+ ryl_empty_min
182
+ .arg("-c")
183
+ .arg(&empty_cfg)
184
+ .arg(&empty_min_violation);
185
+ let (ryl_empty_min_code, ryl_empty_min_output) =
186
+ capture_with_env(ryl_empty_min, scenario.envs);
187
+
188
+ let mut yam_empty_min = build_yamllint_command(scenario.yam_format);
189
+ yam_empty_min
190
+ .arg("-c")
191
+ .arg(&empty_cfg)
192
+ .arg(&empty_min_violation);
193
+ let (yam_empty_min_code, yam_empty_min_output) =
194
+ capture_with_env(yam_empty_min, scenario.envs);
195
+
196
+ assert_eq!(
197
+ ryl_empty_min_code, 1,
198
+ "ryl empty-min exit ({})",
199
+ scenario.label
200
+ );
201
+ assert_eq!(
202
+ yam_empty_min_code, 1,
203
+ "yamllint empty-min exit ({})",
204
+ scenario.label
205
+ );
206
+ assert_eq!(
207
+ ryl_empty_min_output, yam_empty_min_output,
208
+ "empty-min diagnostics mismatch ({})",
209
+ scenario.label
210
+ );
211
+
212
+ let mut ryl_empty_max = build_ryl_command(exe, scenario.ryl_format);
213
+ ryl_empty_max
214
+ .arg("-c")
215
+ .arg(&empty_cfg)
216
+ .arg(&empty_max_violation);
217
+ let (ryl_empty_max_code, ryl_empty_max_output) =
218
+ capture_with_env(ryl_empty_max, scenario.envs);
219
+
220
+ let mut yam_empty_max = build_yamllint_command(scenario.yam_format);
221
+ yam_empty_max
222
+ .arg("-c")
223
+ .arg(&empty_cfg)
224
+ .arg(&empty_max_violation);
225
+ let (yam_empty_max_code, yam_empty_max_output) =
226
+ capture_with_env(yam_empty_max, scenario.envs);
227
+
228
+ assert_eq!(
229
+ ryl_empty_max_code, 1,
230
+ "ryl empty-max exit ({})",
231
+ scenario.label
232
+ );
233
+ assert_eq!(
234
+ yam_empty_max_code, 1,
235
+ "yamllint empty-max exit ({})",
236
+ scenario.label
237
+ );
238
+ assert_eq!(
239
+ ryl_empty_max_output, yam_empty_max_output,
240
+ "empty-max diagnostics mismatch ({})",
241
+ scenario.label
242
+ );
243
+
244
+ let mut ryl_forbid = build_ryl_command(exe, scenario.ryl_format);
245
+ ryl_forbid.arg("-c").arg(&forbid_cfg).arg(&forbid_violation);
246
+ let (ryl_forbid_code, ryl_forbid_output) =
247
+ capture_with_env(ryl_forbid, scenario.envs);
248
+
249
+ let mut yam_forbid = build_yamllint_command(scenario.yam_format);
250
+ yam_forbid.arg("-c").arg(&forbid_cfg).arg(&forbid_violation);
251
+ let (yam_forbid_code, yam_forbid_output) =
252
+ capture_with_env(yam_forbid, scenario.envs);
253
+
254
+ assert_eq!(ryl_forbid_code, 1, "ryl forbid exit ({})", scenario.label);
255
+ assert_eq!(
256
+ yam_forbid_code, 1,
257
+ "yamllint forbid exit ({})",
258
+ scenario.label
259
+ );
260
+ assert_eq!(
261
+ ryl_forbid_output, yam_forbid_output,
262
+ "forbid diagnostics mismatch ({})",
263
+ scenario.label
264
+ );
265
+
266
+ let mut ryl_forbid_spaces = build_ryl_command(exe, scenario.ryl_format);
267
+ ryl_forbid_spaces
268
+ .arg("-c")
269
+ .arg(&forbid_cfg)
270
+ .arg(&forbid_spaces_violation);
271
+ let (ryl_forbid_spaces_code, ryl_forbid_spaces_output) =
272
+ capture_with_env(ryl_forbid_spaces, scenario.envs);
273
+
274
+ let mut yam_forbid_spaces = build_yamllint_command(scenario.yam_format);
275
+ yam_forbid_spaces
276
+ .arg("-c")
277
+ .arg(&forbid_cfg)
278
+ .arg(&forbid_spaces_violation);
279
+ let (yam_forbid_spaces_code, yam_forbid_spaces_output) =
280
+ capture_with_env(yam_forbid_spaces, scenario.envs);
281
+
282
+ assert_eq!(
283
+ ryl_forbid_spaces_code, 1,
284
+ "ryl forbid-spaces exit ({})",
285
+ scenario.label
286
+ );
287
+ assert_eq!(
288
+ yam_forbid_spaces_code, 1,
289
+ "yamllint forbid-spaces exit ({})",
290
+ scenario.label
291
+ );
292
+ assert_eq!(
293
+ ryl_forbid_spaces_output, yam_forbid_spaces_output,
294
+ "forbid-spaces diagnostics mismatch ({})",
295
+ scenario.label
296
+ );
297
+
298
+ let mut ryl_forbid_non_empty = build_ryl_command(exe, scenario.ryl_format);
299
+ ryl_forbid_non_empty
300
+ .arg("-c")
301
+ .arg(&forbid_non_empty_cfg)
302
+ .arg(&forbid_violation);
303
+ let (ryl_forbid_non_empty_code, ryl_forbid_non_empty_output) =
304
+ capture_with_env(ryl_forbid_non_empty, scenario.envs);
305
+
306
+ let mut yam_forbid_non_empty = build_yamllint_command(scenario.yam_format);
307
+ yam_forbid_non_empty
308
+ .arg("-c")
309
+ .arg(&forbid_non_empty_cfg)
310
+ .arg(&forbid_violation);
311
+ let (yam_forbid_non_empty_code, yam_forbid_non_empty_output) =
312
+ capture_with_env(yam_forbid_non_empty, scenario.envs);
313
+
314
+ assert_eq!(
315
+ ryl_forbid_non_empty_code, 1,
316
+ "ryl forbid-non-empty exit ({})",
317
+ scenario.label
318
+ );
319
+ assert_eq!(
320
+ yam_forbid_non_empty_code, 1,
321
+ "yamllint forbid-non-empty exit ({})",
322
+ scenario.label
323
+ );
324
+ assert_eq!(
325
+ ryl_forbid_non_empty_output, yam_forbid_non_empty_output,
326
+ "forbid-non-empty diagnostics mismatch ({})",
327
+ scenario.label
328
+ );
329
+
330
+ let mut ryl_forbid_non_empty_spaces =
331
+ build_ryl_command(exe, scenario.ryl_format);
332
+ ryl_forbid_non_empty_spaces
333
+ .arg("-c")
334
+ .arg(&forbid_non_empty_cfg)
335
+ .arg(&forbid_spaces_violation);
336
+ let (ryl_forbid_non_empty_spaces_code, ryl_forbid_non_empty_spaces_output) =
337
+ capture_with_env(ryl_forbid_non_empty_spaces, scenario.envs);
338
+
339
+ let mut yam_forbid_non_empty_spaces =
340
+ build_yamllint_command(scenario.yam_format);
341
+ yam_forbid_non_empty_spaces
342
+ .arg("-c")
343
+ .arg(&forbid_non_empty_cfg)
344
+ .arg(&forbid_spaces_violation);
345
+ let (yam_forbid_non_empty_spaces_code, yam_forbid_non_empty_spaces_output) =
346
+ capture_with_env(yam_forbid_non_empty_spaces, scenario.envs);
347
+
348
+ assert_eq!(
349
+ ryl_forbid_non_empty_spaces_code, 1,
350
+ "ryl forbid-non-empty-spaces exit ({})",
351
+ scenario.label
352
+ );
353
+ assert_eq!(
354
+ yam_forbid_non_empty_spaces_code, 1,
355
+ "yamllint forbid-non-empty-spaces exit ({})",
356
+ scenario.label
357
+ );
358
+ assert_eq!(
359
+ ryl_forbid_non_empty_spaces_output, yam_forbid_non_empty_spaces_output,
360
+ "forbid-non-empty-spaces diagnostics mismatch ({})",
361
+ scenario.label
362
+ );
363
+ }
364
+ }
@@ -0,0 +1,298 @@
1
+ use std::fs;
2
+
3
+ use tempfile::tempdir;
4
+
5
+ #[path = "common/compat.rs"]
6
+ mod compat;
7
+
8
+ use compat::{
9
+ SCENARIOS, build_ryl_command, build_yamllint_command, capture_with_env,
10
+ ensure_yamllint_installed,
11
+ };
12
+
13
+ #[test]
14
+ fn colons_rule_matches_yamllint() {
15
+ ensure_yamllint_installed();
16
+
17
+ let dir = tempdir().unwrap();
18
+
19
+ let default_cfg = dir.path().join("colons-default.yml");
20
+ fs::write(
21
+ &default_cfg,
22
+ "rules:\n document-start: disable\n colons: enable\n",
23
+ )
24
+ .unwrap();
25
+
26
+ let warning_cfg = dir.path().join("colons-warning.yml");
27
+ fs::write(
28
+ &warning_cfg,
29
+ "rules:\n document-start: disable\n colons:\n level: warning\n",
30
+ )
31
+ .unwrap();
32
+
33
+ let before_cfg = dir.path().join("colons-before.yml");
34
+ fs::write(
35
+ &before_cfg,
36
+ "rules:\n document-start: disable\n colons:\n max-spaces-before: 2\n",
37
+ )
38
+ .unwrap();
39
+
40
+ let after_cfg = dir.path().join("colons-after.yml");
41
+ fs::write(
42
+ &after_cfg,
43
+ "rules:\n document-start: disable\n colons:\n max-spaces-after: 3\n",
44
+ )
45
+ .unwrap();
46
+
47
+ let default_violation = dir.path().join("default.yaml");
48
+ fs::write(&default_violation, "---\nkey : value\n").unwrap();
49
+
50
+ let warning_violation = dir.path().join("warning.yaml");
51
+ fs::write(&warning_violation, "---\nkey : value\n").unwrap();
52
+
53
+ let before_bad = dir.path().join("before-bad.yaml");
54
+ fs::write(&before_bad, "---\nkey : value\n").unwrap();
55
+
56
+ let before_ok = dir.path().join("before-ok.yaml");
57
+ fs::write(&before_ok, "---\nkey : value\n").unwrap();
58
+
59
+ let after_bad = dir.path().join("after-bad.yaml");
60
+ fs::write(&after_bad, "---\nkey: value\n").unwrap();
61
+
62
+ let after_ok = dir.path().join("after-ok.yaml");
63
+ fs::write(&after_ok, "---\nkey: value\n").unwrap();
64
+
65
+ let question_bad = dir.path().join("question-bad.yaml");
66
+ fs::write(&question_bad, "---\n? key\n: value\n").unwrap();
67
+
68
+ let exe = env!("CARGO_BIN_EXE_ryl");
69
+
70
+ for scenario in SCENARIOS {
71
+ let mut ryl_default = build_ryl_command(exe, scenario.ryl_format);
72
+ ryl_default
73
+ .arg("-c")
74
+ .arg(&default_cfg)
75
+ .arg(&default_violation);
76
+ let (ryl_default_code, ryl_default_output) =
77
+ capture_with_env(ryl_default, scenario.envs);
78
+
79
+ let mut yam_default = build_yamllint_command(scenario.yam_format);
80
+ yam_default
81
+ .arg("-c")
82
+ .arg(&default_cfg)
83
+ .arg(&default_violation);
84
+ let (yam_default_code, yam_default_output) =
85
+ capture_with_env(yam_default, scenario.envs);
86
+
87
+ assert_eq!(ryl_default_code, 1, "ryl default exit ({})", scenario.label);
88
+ assert_eq!(
89
+ yam_default_code, 1,
90
+ "yamllint default exit ({})",
91
+ scenario.label
92
+ );
93
+ assert_eq!(
94
+ ryl_default_output, yam_default_output,
95
+ "default diagnostics mismatch ({})",
96
+ scenario.label
97
+ );
98
+
99
+ let mut ryl_warning = build_ryl_command(exe, scenario.ryl_format);
100
+ ryl_warning
101
+ .arg("-c")
102
+ .arg(&warning_cfg)
103
+ .arg(&warning_violation);
104
+ let (ryl_warning_code, ryl_warning_output) =
105
+ capture_with_env(ryl_warning, scenario.envs);
106
+
107
+ let mut yam_warning = build_yamllint_command(scenario.yam_format);
108
+ yam_warning
109
+ .arg("-c")
110
+ .arg(&warning_cfg)
111
+ .arg(&warning_violation);
112
+ let (yam_warning_code, yam_warning_output) =
113
+ capture_with_env(yam_warning, scenario.envs);
114
+
115
+ assert_eq!(ryl_warning_code, 0, "ryl warning exit ({})", scenario.label);
116
+ assert_eq!(
117
+ yam_warning_code, 0,
118
+ "yamllint warning exit ({})",
119
+ scenario.label
120
+ );
121
+ assert_eq!(
122
+ ryl_warning_output, yam_warning_output,
123
+ "warning diagnostics mismatch ({})",
124
+ scenario.label
125
+ );
126
+
127
+ let mut ryl_before_bad = build_ryl_command(exe, scenario.ryl_format);
128
+ ryl_before_bad.arg("-c").arg(&before_cfg).arg(&before_bad);
129
+ let (ryl_before_bad_code, ryl_before_bad_output) =
130
+ capture_with_env(ryl_before_bad, scenario.envs);
131
+
132
+ let mut yam_before_bad = build_yamllint_command(scenario.yam_format);
133
+ yam_before_bad.arg("-c").arg(&before_cfg).arg(&before_bad);
134
+ let (yam_before_bad_code, yam_before_bad_output) =
135
+ capture_with_env(yam_before_bad, scenario.envs);
136
+
137
+ assert_eq!(
138
+ ryl_before_bad_code, 1,
139
+ "ryl before-bad exit ({})",
140
+ scenario.label
141
+ );
142
+ assert_eq!(
143
+ yam_before_bad_code, 1,
144
+ "yamllint before-bad exit ({})",
145
+ scenario.label
146
+ );
147
+ assert_eq!(
148
+ ryl_before_bad_output, yam_before_bad_output,
149
+ "before-bad diagnostics mismatch ({})",
150
+ scenario.label
151
+ );
152
+
153
+ let mut ryl_before_ok = build_ryl_command(exe, scenario.ryl_format);
154
+ ryl_before_ok.arg("-c").arg(&before_cfg).arg(&before_ok);
155
+ let (ryl_before_ok_code, ryl_before_ok_output) =
156
+ capture_with_env(ryl_before_ok, scenario.envs);
157
+
158
+ let mut yam_before_ok = build_yamllint_command(scenario.yam_format);
159
+ yam_before_ok.arg("-c").arg(&before_cfg).arg(&before_ok);
160
+ let (yam_before_ok_code, yam_before_ok_output) =
161
+ capture_with_env(yam_before_ok, scenario.envs);
162
+
163
+ assert_eq!(
164
+ ryl_before_ok_code, 0,
165
+ "ryl before-ok exit ({})",
166
+ scenario.label
167
+ );
168
+ assert_eq!(
169
+ yam_before_ok_code, 0,
170
+ "yamllint before-ok exit ({})",
171
+ scenario.label
172
+ );
173
+ assert_eq!(
174
+ ryl_before_ok_output, yam_before_ok_output,
175
+ "before-ok diagnostics mismatch ({})",
176
+ scenario.label
177
+ );
178
+
179
+ let mut ryl_after_bad = build_ryl_command(exe, scenario.ryl_format);
180
+ ryl_after_bad.arg("-c").arg(&after_cfg).arg(&after_bad);
181
+ let (ryl_after_bad_code, ryl_after_bad_output) =
182
+ capture_with_env(ryl_after_bad, scenario.envs);
183
+
184
+ let mut yam_after_bad = build_yamllint_command(scenario.yam_format);
185
+ yam_after_bad.arg("-c").arg(&after_cfg).arg(&after_bad);
186
+ let (yam_after_bad_code, yam_after_bad_output) =
187
+ capture_with_env(yam_after_bad, scenario.envs);
188
+
189
+ assert_eq!(
190
+ ryl_after_bad_code, 1,
191
+ "ryl after-bad exit ({})",
192
+ scenario.label
193
+ );
194
+ assert_eq!(
195
+ yam_after_bad_code, 1,
196
+ "yamllint after-bad exit ({})",
197
+ scenario.label
198
+ );
199
+ assert_eq!(
200
+ ryl_after_bad_output, yam_after_bad_output,
201
+ "after-bad diagnostics mismatch ({})",
202
+ scenario.label
203
+ );
204
+
205
+ let mut ryl_after_ok = build_ryl_command(exe, scenario.ryl_format);
206
+ ryl_after_ok.arg("-c").arg(&after_cfg).arg(&after_ok);
207
+ let (ryl_after_ok_code, ryl_after_ok_output) =
208
+ capture_with_env(ryl_after_ok, scenario.envs);
209
+
210
+ let mut yam_after_ok = build_yamllint_command(scenario.yam_format);
211
+ yam_after_ok.arg("-c").arg(&after_cfg).arg(&after_ok);
212
+ let (yam_after_ok_code, yam_after_ok_output) =
213
+ capture_with_env(yam_after_ok, scenario.envs);
214
+
215
+ assert_eq!(
216
+ ryl_after_ok_code, 0,
217
+ "ryl after-ok exit ({})",
218
+ scenario.label
219
+ );
220
+ assert_eq!(
221
+ yam_after_ok_code, 0,
222
+ "yamllint after-ok exit ({})",
223
+ scenario.label
224
+ );
225
+ assert_eq!(
226
+ ryl_after_ok_output, yam_after_ok_output,
227
+ "after-ok diagnostics mismatch ({})",
228
+ scenario.label
229
+ );
230
+
231
+ let mut ryl_question = build_ryl_command(exe, scenario.ryl_format);
232
+ ryl_question.arg("-c").arg(&default_cfg).arg(&question_bad);
233
+ let (ryl_question_code, ryl_question_output) =
234
+ capture_with_env(ryl_question, scenario.envs);
235
+
236
+ let mut yam_question = build_yamllint_command(scenario.yam_format);
237
+ yam_question.arg("-c").arg(&default_cfg).arg(&question_bad);
238
+ let (yam_question_code, yam_question_output) =
239
+ capture_with_env(yam_question, scenario.envs);
240
+
241
+ assert_eq!(
242
+ ryl_question_code, 1,
243
+ "ryl question exit ({})",
244
+ scenario.label
245
+ );
246
+ assert_eq!(
247
+ yam_question_code, 1,
248
+ "yamllint question exit ({})",
249
+ scenario.label
250
+ );
251
+ assert_eq!(
252
+ ryl_question_output, yam_question_output,
253
+ "question diagnostics mismatch ({})",
254
+ scenario.label
255
+ );
256
+ }
257
+ }
258
+
259
+ #[test]
260
+ fn inline_comment_after_value_matches_yamllint() {
261
+ ensure_yamllint_installed();
262
+
263
+ let dir = tempdir().unwrap();
264
+
265
+ let cfg_path = dir.path().join("colons.yaml");
266
+ fs::write(&cfg_path, "rules:\n document-start: disable\n").unwrap();
267
+
268
+ let yaml_path = dir.path().join("inline.yaml");
269
+ fs::write(
270
+ &yaml_path,
271
+ "---\n- debug: # noqa comment\n var: value\n",
272
+ )
273
+ .unwrap();
274
+
275
+ let exe = env!("CARGO_BIN_EXE_ryl");
276
+
277
+ for scenario in SCENARIOS {
278
+ let mut ryl_cmd = build_ryl_command(exe, scenario.ryl_format);
279
+ ryl_cmd.arg("-c").arg(&cfg_path).arg(&yaml_path);
280
+ let (ryl_code, ryl_output) = capture_with_env(ryl_cmd, scenario.envs);
281
+
282
+ let mut yam_cmd = build_yamllint_command(scenario.yam_format);
283
+ yam_cmd.arg("-c").arg(&cfg_path).arg(&yaml_path);
284
+ let (yam_code, yam_output) = capture_with_env(yam_cmd, scenario.envs);
285
+
286
+ assert_eq!(ryl_code, 0, "ryl emitted diagnostics ({})", scenario.label);
287
+ assert_eq!(
288
+ yam_code, 0,
289
+ "yamllint emitted diagnostics ({})",
290
+ scenario.label
291
+ );
292
+ assert_eq!(
293
+ ryl_output, yam_output,
294
+ "output mismatch ({})",
295
+ scenario.label
296
+ );
297
+ }
298
+ }