leftovers 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -3
  3. data/docs/Configuration.md +82 -18
  4. data/leftovers.gemspec +1 -1
  5. data/lib/config/actionmailer.yml +11 -11
  6. data/lib/config/activesupport.yml +1 -1
  7. data/lib/config/rails.yml +1 -1
  8. data/lib/config/railties.yml +11 -0
  9. data/lib/config/ruby.yml +72 -0
  10. data/lib/leftovers/ast/node.rb +16 -11
  11. data/lib/leftovers/config.rb +1 -24
  12. data/lib/leftovers/config_loader/argument_position_schema.rb +11 -0
  13. data/lib/leftovers/config_loader/argumentless_transform_schema.rb +21 -0
  14. data/lib/leftovers/config_loader/attribute.rb +30 -0
  15. data/lib/leftovers/config_loader/document_schema.rb +21 -0
  16. data/lib/leftovers/config_loader/dynamic_schema.rb +17 -0
  17. data/lib/leftovers/config_loader/has_argument_schema.rb +13 -0
  18. data/lib/leftovers/config_loader/has_value_schema.rb +18 -0
  19. data/lib/leftovers/config_loader/keep_test_only_schema.rb +13 -0
  20. data/lib/leftovers/config_loader/node.rb +106 -0
  21. data/lib/leftovers/config_loader/object_schema.rb +189 -0
  22. data/lib/leftovers/config_loader/privacy_processor_schema.rb +12 -0
  23. data/lib/leftovers/config_loader/privacy_schema.rb +15 -0
  24. data/lib/leftovers/config_loader/require_schema.rb +11 -0
  25. data/lib/leftovers/config_loader/rule_pattern_schema.rb +18 -0
  26. data/lib/leftovers/config_loader/scalar_argument_schema.rb +14 -0
  27. data/lib/leftovers/config_loader/scalar_value_schema.rb +14 -0
  28. data/lib/leftovers/config_loader/schema.rb +21 -0
  29. data/lib/leftovers/config_loader/string_enum_schema.rb +62 -0
  30. data/lib/leftovers/config_loader/string_pattern_schema.rb +14 -0
  31. data/lib/leftovers/config_loader/string_schema.rb +14 -0
  32. data/lib/leftovers/config_loader/string_value_processor_schema.rb +11 -0
  33. data/lib/leftovers/config_loader/suggester.rb +22 -0
  34. data/lib/leftovers/config_loader/transform_schema.rb +28 -0
  35. data/lib/leftovers/config_loader/true_schema.rb +18 -0
  36. data/lib/leftovers/config_loader/value_matcher_schema.rb +18 -0
  37. data/lib/leftovers/config_loader/value_or_array_schema.rb +64 -0
  38. data/lib/leftovers/config_loader/value_processor_schema.rb +14 -0
  39. data/lib/leftovers/config_loader/value_type_schema.rb +17 -0
  40. data/lib/leftovers/config_loader.rb +82 -0
  41. data/lib/leftovers/definition_node.rb +6 -17
  42. data/lib/leftovers/definition_node_set.rb +11 -0
  43. data/lib/leftovers/definition_to_add.rb +31 -0
  44. data/lib/leftovers/dynamic_processors/call.rb +4 -3
  45. data/lib/leftovers/dynamic_processors/call_definition.rb +14 -7
  46. data/lib/leftovers/dynamic_processors/definition.rb +8 -3
  47. data/lib/leftovers/dynamic_processors/set_default_privacy.rb +18 -0
  48. data/lib/leftovers/dynamic_processors/set_privacy.rb +23 -0
  49. data/lib/leftovers/dynamic_processors.rb +2 -0
  50. data/lib/leftovers/file.rb +5 -1
  51. data/lib/leftovers/file_collector.rb +44 -17
  52. data/lib/leftovers/matcher_builders/node.rb +4 -0
  53. data/lib/leftovers/matcher_builders/node_privacy.rb +13 -0
  54. data/lib/leftovers/matcher_builders/node_type.rb +4 -4
  55. data/lib/leftovers/matcher_builders/node_value.rb +1 -1
  56. data/lib/leftovers/matcher_builders/string_pattern.rb +14 -5
  57. data/lib/leftovers/matcher_builders.rb +1 -0
  58. data/lib/leftovers/matchers/node_privacy.rb +19 -0
  59. data/lib/leftovers/matchers.rb +1 -0
  60. data/lib/leftovers/merged_config.rb +18 -34
  61. data/lib/leftovers/processor_builders/add_prefix.rb +1 -1
  62. data/lib/leftovers/processor_builders/add_suffix.rb +1 -1
  63. data/lib/leftovers/processor_builders/dynamic.rb +50 -16
  64. data/lib/leftovers/processor_builders/transform.rb +2 -2
  65. data/lib/leftovers/processor_builders/transform_set.rb +8 -8
  66. data/lib/leftovers/value_processors/each_for_definition_set.rb +2 -5
  67. data/lib/leftovers/value_processors/each_positional_argument.rb +1 -1
  68. data/lib/leftovers/value_processors/return_definition_node.rb +14 -0
  69. data/lib/leftovers/value_processors/{return_string.rb → return_sym.rb} +1 -1
  70. data/lib/leftovers/value_processors.rb +2 -2
  71. data/lib/leftovers/version.rb +1 -1
  72. data/lib/leftovers.rb +23 -14
  73. metadata +54 -22
  74. data/lib/config/actioncable.yml +0 -4
  75. data/lib/leftovers/config_validator/error_processor.rb +0 -196
  76. data/lib/leftovers/config_validator/schema_hash.rb +0 -551
  77. data/lib/leftovers/config_validator.rb +0 -61
  78. data/lib/leftovers/value_processors/return_definition.rb +0 -22
@@ -1,551 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module ConfigValidator # rubocop:disable Metrics/ModuleLength
5
- SCHEMA_HASH = {
6
- '$schema' => 'http://json-schema.org/draft-06/schema#',
7
- 'type' => 'object',
8
- 'definitions' => {
9
- 'true' => { 'enum' => [true, 'true'] },
10
- 'string' => {
11
- 'type' => 'string',
12
- 'minLength' => 1
13
- },
14
- 'stringPattern' => {
15
- 'type' => 'object',
16
- 'properties' => {
17
- 'match' => { '$ref' => '#/definitions/string' },
18
- 'matches' => { '$ref' => '#/definitions/string' },
19
- 'has_prefix' => { '$ref' => '#/definitions/string' },
20
- 'has_suffix' => { '$ref' => '#/definitions/string' }
21
- },
22
- 'minProperties' => 0,
23
- 'additionalProperties' => true,
24
- 'allOf' => [
25
- # synonyms
26
- { 'not' => { 'required' => %w{match matches} } },
27
- # incompatible groups
28
- { 'not' => { 'required' => %w{match has_prefix} } },
29
- { 'not' => { 'required' => %w{match has_suffix} } },
30
- { 'not' => { 'required' => %w{matches has_prefix} } },
31
- { 'not' => { 'required' => %w{matches has_suffix} } }
32
- ]
33
- },
34
- 'stringList' => {
35
- 'anyOf' => [
36
- {
37
- 'type' => 'array',
38
- 'items' => { '$ref' => '#/definitions/string' },
39
- 'minItems' => 1
40
- },
41
- { '$ref' => '#/definitions/string' }
42
- ]
43
- },
44
- 'name' => {
45
- 'anyOf' => [
46
- { '$ref' => '#/definitions/string' },
47
- {
48
- 'allOf' => [
49
- { '$ref' => '#/definitions/stringPattern' },
50
- {
51
- 'type' => 'object',
52
- 'properties' => {
53
- 'match' => true, 'matches' => true,
54
- 'has_prefix' => true, 'has_suffix' => true,
55
- 'unless' => { '$ref' => '#/definitions/nameList' }
56
- },
57
- 'minProperties' => 1,
58
- 'additionalProperties' => false
59
- }
60
- ]
61
- }
62
- ]
63
- },
64
- 'nameList' => {
65
- 'anyOf' => [
66
- {
67
- 'type' => 'array',
68
- 'items' => { '$ref' => '#/definitions/name' },
69
- 'minItems' => 1
70
- },
71
- { '$ref' => '#/definitions/name' }
72
- ]
73
- },
74
- 'argumentPosition' => {
75
- 'anyOf' => [
76
- { '$ref' => '#/definitions/string' },
77
- { 'type' => 'integer', 'minimum' => 0 },
78
- { '$ref' => '#/definitions/name' }
79
- ]
80
- },
81
- 'argumentPositionList' => {
82
- 'anyOf' => [
83
- { '$ref' => '#/definitions/argumentPosition' },
84
- {
85
- 'type' => 'array',
86
- 'items' => { '$ref' => '#/definitions/argumentPosition' },
87
- 'minItems' => 1
88
- }
89
- ]
90
- },
91
- 'valueType' => {
92
- 'type' => 'string',
93
- 'enum' => %w{String Symbol Integer Float Array Hash Proc}
94
- },
95
- 'valueTypeList' => {
96
- 'anyOf' => [
97
- { '$ref' => '#/definitions/valueType' },
98
- {
99
- 'type' => 'array',
100
- 'items' => { '$ref' => '#/definitions/valueType' },
101
- 'minItems' => 1
102
- }
103
- ]
104
- },
105
- 'hasValue' => {
106
- 'anyOf' => [
107
- { 'type' => 'string' },
108
- { 'type' => 'integer' },
109
- { 'type' => 'number' },
110
- { 'type' => 'boolean' },
111
- { 'type' => 'null' },
112
- {
113
- 'allOf' => [
114
- { '$ref' => '#/definitions/stringPattern' },
115
- {
116
- 'type' => 'object',
117
- 'properties' => {
118
- 'match' => true, 'matches' => true,
119
- 'has_prefix' => true, 'has_suffix' => true,
120
- 'at' => { '$ref' => '#/definitions/argumentPositionList' },
121
- 'has_value' => { '$ref' => '#/definitions/hasValueList' },
122
- 'has_receiver' => { '$ref' => '#/definitions/hasValueList' },
123
- 'type' => { '$ref' => '#/definitions/valueTypeList' },
124
- 'unless' => { '$ref' => '#/definitions/hasValueList' }
125
- },
126
- 'minProperties' => 1,
127
- 'additionalProperties' => false,
128
- 'allOf' => [
129
- # incompatible groups
130
- { 'not' => { 'required' => %w{match at} } },
131
- { 'not' => { 'required' => %w{match has_value} } },
132
- { 'not' => { 'required' => %w{match type} } },
133
- { 'not' => { 'required' => %w{matches at} } },
134
- { 'not' => { 'required' => %w{matches has_value} } },
135
- { 'not' => { 'required' => %w{matches type} } },
136
- { 'not' => { 'required' => %w{has_prefix at} } },
137
- { 'not' => { 'required' => %w{has_prefix has_value} } },
138
- { 'not' => { 'required' => %w{has_prefix type} } },
139
- { 'not' => { 'required' => %w{has_suffix at} } },
140
- { 'not' => { 'required' => %w{has_suffix has_value} } },
141
- { 'not' => { 'required' => %w{has_suffix type} } },
142
- { 'not' => { 'required' => %w{at type} } },
143
- { 'not' => { 'required' => %w{has_value type} } }
144
- ]
145
- }
146
- ]
147
- }
148
- ]
149
- },
150
- 'hasValueList' => {
151
- 'anyOf' => [
152
- { '$ref' => '#/definitions/hasValue' },
153
- {
154
- 'type' => 'array',
155
- 'items' => { '$ref' => '#/definitions/hasValue' },
156
- 'minItems' => 1
157
- }
158
- ]
159
- },
160
- 'hasArgument' => {
161
- 'anyOf' => [
162
- { '$ref' => '#/definitions/string' },
163
- { 'type' => 'integer', 'minimum' => 0 },
164
- {
165
- 'type' => 'object',
166
- 'properties' => {
167
- 'at' => { '$ref' => '#/definitions/argumentPositionList' },
168
- 'has_value' => { '$ref' => '#/definitions/hasValueList' },
169
- 'unless' => { '$ref' => '#/definitions/hasArgumentList' }
170
- },
171
- 'minProperties' => 1,
172
- 'additionalProperties' => false,
173
- 'allOf' => [
174
- # synonyms
175
- { 'not' => { 'required' => %w{has_argument has_arguments} } }
176
- ]
177
- }
178
- ]
179
- },
180
- 'hasArgumentList' => {
181
- 'anyOf' => [
182
- { '$ref' => '#/definitions/hasArgument' },
183
- {
184
- 'type' => 'array',
185
- 'items' => { '$ref' => '#/definitions/hasArgument' },
186
- 'minItems' => 1
187
- }
188
- ]
189
- },
190
- 'rulePattern' => {
191
- 'type' => 'object',
192
- 'properties' => {
193
- 'name' => { '$ref' => '#/definitions/nameList' },
194
- 'document' => { '$ref' => '#/definitions/true' },
195
- 'names' => { '$ref' => '#/definitions/nameList' },
196
- 'path' => { '$ref' => '#/definitions/stringList' },
197
- 'paths' => { '$ref' => '#/definitions/stringList' },
198
- 'has_argument' => { '$ref' => '#/definitions/hasArgumentList' },
199
- 'has_arguments' => { '$ref' => '#/definitions/hasArgumentList' },
200
- 'has_receiver' => { '$ref' => '#/definitions/hasValueList' }
201
- },
202
- 'minProperties' => 1,
203
- 'allOf' => [
204
- # synonyms
205
- { 'not' => { 'required' => %w{name names} } },
206
- { 'not' => { 'required' => %w{path paths} } },
207
- { 'not' => { 'required' => %w{has_argument has_arguments} } }
208
- ]
209
- },
210
- 'transformProperties' => {
211
- 'type' => 'object',
212
- 'properties' => {
213
- 'original' => { '$ref' => '#/definitions/true' },
214
- 'pluralize' => { '$ref' => '#/definitions/true' },
215
- 'singularize' => { '$ref' => '#/definitions/true' },
216
- 'camelize' => { '$ref' => '#/definitions/true' },
217
- 'camelcase' => { '$ref' => '#/definitions/true' },
218
- 'underscore' => { '$ref' => '#/definitions/true' },
219
- 'titleize' => { '$ref' => '#/definitions/true' },
220
- 'titlecase' => { '$ref' => '#/definitions/true' },
221
- 'demodulize' => { '$ref' => '#/definitions/true' },
222
- 'deconstantize' => { '$ref' => '#/definitions/true' },
223
- 'parameterize' => { '$ref' => '#/definitions/true' },
224
- 'downcase' => { '$ref' => '#/definitions/true' },
225
- 'upcase' => { '$ref' => '#/definitions/true' },
226
- 'capitalize' => { '$ref' => '#/definitions/true' },
227
- 'swapcase' => { '$ref' => '#/definitions/true' },
228
-
229
- 'add_prefix' => { '$ref' => '#/definitions/actionList' },
230
- 'add_suffix' => { '$ref' => '#/definitions/actionList' },
231
-
232
- 'split' => { '$ref' => '#/definitions/string' },
233
- 'delete_prefix' => { '$ref' => '#/definitions/string' },
234
- 'delete_suffix' => { '$ref' => '#/definitions/string' },
235
- 'delete_before' => { '$ref' => '#/definitions/string' },
236
- 'delete_after' => { '$ref' => '#/definitions/string' }
237
- }
238
- },
239
- 'transform' => {
240
- 'anyOf' => [
241
- {
242
- 'type' => 'string',
243
- 'enum' => %w{
244
- original
245
- pluralize
246
- singularize
247
- camelize
248
- camelcase
249
- underscore
250
- titleize
251
- titlecase
252
- demodulize
253
- deconstantize
254
- parameterize
255
- downcase
256
- upcase
257
- capitalize
258
- swapcase
259
- }
260
- },
261
- {
262
- 'allOf' => [
263
- { '$ref' => '#/definitions/transformProperties' },
264
- {
265
- 'type' => 'object',
266
- 'properties' => {
267
- 'original' => true,
268
- 'pluralize' => true,
269
- 'singularize' => true,
270
- 'camelize' => true,
271
- 'camelcase' => true,
272
- 'underscore' => true,
273
- 'titleize' => true,
274
- 'titlecase' => true,
275
- 'demodulize' => true,
276
- 'deconstantize' => true,
277
- 'parameterize' => true,
278
- 'downcase' => true,
279
- 'upcase' => true,
280
- 'capitalize' => true,
281
- 'swapcase' => true,
282
- 'add_prefix' => true,
283
- 'add_suffix' => true,
284
- 'split' => true,
285
- 'delete_prefix' => true,
286
- 'delete_suffix' => true,
287
- 'delete_before' => true,
288
- 'delete_after' => true
289
- },
290
- 'additionalProperties' => false
291
- }
292
- ]
293
- }
294
- ]
295
- },
296
- 'transformList' => {
297
- 'anyOf' => [
298
- { '$ref' => '#/definitions/transform' },
299
- {
300
- 'type' => 'array',
301
- 'items' => { '$ref' => '#/definitions/transform' },
302
- 'minItems' => 1
303
- }
304
- ]
305
- },
306
- 'keyword' => {
307
- 'anyOf' => [
308
- { '$ref' => '#/definitions/name' }
309
- ]
310
- },
311
- 'keywordList' => {
312
- 'anyOf' => [
313
- { '$ref' => '#/definitions/keyword' },
314
- {
315
- 'type' => 'array',
316
- 'items' => { '$ref' => '#/definitions/keyword' },
317
- 'minItems' => 1
318
- }
319
- ]
320
- },
321
- 'action' => {
322
- 'anyOf' => [
323
- { '$ref' => '#/definitions/string' },
324
- { 'type' => 'integer', 'minimum' => 0 },
325
- {
326
- 'allOf' => [
327
- { '$ref' => '#/definitions/transformProperties' },
328
- {
329
- 'type' => 'object',
330
- 'properties' => {
331
- 'argument' => { '$ref' => '#/definitions/argumentPositionList' },
332
- 'arguments' => { '$ref' => '#/definitions/argumentPositionList' },
333
- 'keyword' => { '$ref' => '#/definitions/keywordList' },
334
- 'keywords' => { '$ref' => '#/definitions/keywordList' },
335
- 'itself' => { '$ref' => '#/definitions/true' },
336
- 'value' => { '$ref' => '#/definitions/string' },
337
- 'nested' => { '$ref' => '#/definitions/actionList' },
338
- 'recursive' => { '$ref' => '#/definitions/true' },
339
- 'transforms' => { '$ref' => '#/definitions/transformList' },
340
- 'pluralize' => true,
341
- 'singularize' => true,
342
- 'camelize' => true,
343
- 'camelcase' => true,
344
- 'underscore' => true,
345
- 'titleize' => true,
346
- 'titlecase' => true,
347
- 'demodulize' => true,
348
- 'deconstantize' => true,
349
- 'parameterize' => true,
350
- 'downcase' => true,
351
- 'upcase' => true,
352
- 'capitalize' => true,
353
- 'swapcase' => true,
354
- 'add_prefix' => true,
355
- 'add_suffix' => true,
356
- 'split' => true,
357
- 'delete_prefix' => true,
358
- 'delete_suffix' => true,
359
- 'delete_before' => true,
360
- 'delete_after' => true
361
- },
362
- 'additionalProperties' => false,
363
- 'allOf' => [
364
- # synonyms
365
- { 'not' => { 'required' => %w{keyword keywords} } },
366
- { 'not' => { 'required' => %w{argument arguments} } },
367
- # any of
368
- {
369
- 'anyOf' => [
370
- { 'required' => ['argument'] },
371
- { 'required' => ['arguments'] },
372
- { 'required' => ['keyword'] },
373
- { 'required' => ['keywords'] },
374
- { 'required' => ['itself'] },
375
- { 'required' => ['value'] }
376
- ]
377
- }
378
- ]
379
- }
380
- ]
381
- }
382
- ]
383
- },
384
- 'actionList' => {
385
- 'anyOf' => [
386
- { '$ref' => '#/definitions/action' },
387
- {
388
- 'type' => 'array',
389
- 'items' => { '$ref' => '#/definitions/action' },
390
- 'minItems' => 1
391
- }
392
- ]
393
- },
394
- 'dynamicAction' => {
395
- 'type' => 'object',
396
- 'properties' => {
397
- 'call' => { '$ref' => '#/definitions/actionList' },
398
- 'calls' => { '$ref' => '#/definitions/actionList' },
399
- 'define' => { '$ref' => '#/definitions/actionList' },
400
- 'defines' => { '$ref' => '#/definitions/actionList' }
401
- },
402
- 'additionalProperties' => true,
403
- 'minProperties' => 1,
404
- 'allOf' => [
405
- # synonyms
406
- { 'not' => { 'required' => %w{call calls} } },
407
- { 'not' => { 'required' => %w{define defines} } },
408
- # At least one of
409
- {
410
- 'anyOf' => [
411
- { 'required' => ['call'] }, { 'required' => ['calls'] },
412
- { 'required' => ['define'] }, { 'required' => ['defines'] }
413
- ]
414
- }
415
- ]
416
- },
417
- 'ruleMatcherList' => {
418
- 'anyOf' => [
419
- {
420
- 'type' => 'array',
421
- 'items' => { '$ref' => '#/definitions/ruleMatcher' },
422
- 'minItems' => 1
423
- },
424
- { '$ref' => '#/definitions/ruleMatcher' }
425
- ]
426
- },
427
- 'ruleMatcher' => {
428
- 'allOf' => [
429
- { '$ref' => '#/definitions/rulePattern' },
430
- {
431
- 'anyOf' => [
432
- { 'required' => ['name'] }, { 'required' => ['names'] },
433
- { 'required' => ['path'] }, { 'required' => ['paths'] },
434
- { 'required' => ['has_argument'] }, { 'required' => ['has_arguments'] },
435
- { 'required' => ['has_receiver'] },
436
- { 'required' => ['unless'] }
437
- ]
438
- },
439
- {
440
- 'type' => 'object',
441
- 'properties' => {
442
- # unfortunately this repetition is necessary to use additionalProperties: false
443
- 'name' => true, 'names' => true,
444
- 'path' => true, 'paths' => true,
445
- 'has_argument' => true, 'has_arguments' => true,
446
- 'has_receiver' => true,
447
- 'unless' => { '$ref' => '#/definitions/ruleMatcherList' }
448
-
449
- },
450
- 'additionalProperties' => false,
451
- 'minProperties' => 1
452
- }
453
- ]
454
- },
455
- 'dynamic' => {
456
- 'allOf' => [
457
- { '$ref' => '#/definitions/rulePattern' },
458
- { '$ref' => '#/definitions/dynamicAction' },
459
- {
460
- 'anyOf' => [
461
- { 'required' => ['name'] }, { 'required' => ['names'] },
462
- { 'required' => ['document'] },
463
- { 'required' => ['path'] }, { 'required' => ['paths'] },
464
- { 'required' => ['has_argument'] }, { 'required' => ['has_arguments'] },
465
- { 'required' => ['has_receiver'] },
466
- { 'required' => ['unless'] }
467
- ]
468
- },
469
- {
470
- 'type' => 'object',
471
- 'properties' => {
472
- # unfortunately this repetition is necessary to use additionalProperties: false
473
- 'name' => true, 'names' => true,
474
- 'path' => true, 'paths' => true,
475
- 'document' => true,
476
- 'has_argument' => true, 'has_arguments' => true,
477
- 'has_receiver' => true,
478
- 'unless' => { '$ref' => '#/definitions/ruleMatcherList' },
479
-
480
- 'call' => true, 'calls' => true,
481
- 'define' => true, 'defines' => true
482
- },
483
- 'additionalProperties' => false,
484
- 'minProperties' => 1
485
- }
486
- ]
487
- },
488
- 'dynamicList' => {
489
- 'anyOf' => [
490
- {
491
- 'type' => 'array',
492
- 'items' => { '$ref' => '#/definitions/dynamic' },
493
- 'minItems' => 1
494
- },
495
- { '$ref' => '#/definitions/dynamic' }
496
- ]
497
- },
498
- 'keepTestOnly' => {
499
- 'anyOf' => [
500
- { '$ref' => '#/definitions/string' },
501
- {
502
- 'allOf' => [
503
- { '$ref' => '#/definitions/stringPattern' },
504
- { '$ref' => '#/definitions/rulePattern' },
505
- {
506
- 'type' => 'object',
507
- 'properties' => {
508
- # unfortunately this repetition is necessary to use additionalProperties: false
509
- 'name' => true, 'names' => true,
510
- 'has_prefix' => true, 'has_suffix' => true, 'matches' => true,
511
- 'path' => true, 'paths' => true,
512
- 'has_argument' => true, 'has_arguments' => true,
513
- 'has_receiver' => true,
514
- 'unless' => { '$ref' => '#/definitions/keepTestOnlyList' }
515
- },
516
- 'additionalProperties' => false,
517
- 'minProperties' => 1
518
- }
519
- ]
520
- }
521
- ]
522
- },
523
- 'keepTestOnlyList' => {
524
- 'anyOf' => [
525
- {
526
- 'type' => 'array',
527
- 'items' => { '$ref' => '#/definitions/keepTestOnly' },
528
- 'minItems' => 1
529
- },
530
- { '$ref' => '#/definitions/keepTestOnly' }
531
- ]
532
- }
533
- },
534
- 'properties' => {
535
- 'include_paths' => { '$ref' => '#/definitions/stringList' },
536
- 'exclude_paths' => { '$ref' => '#/definitions/stringList' },
537
- 'test_paths' => { '$ref' => '#/definitions/stringList' },
538
- 'haml_paths' => { '$ref' => '#/definitions/stringList' },
539
- 'slim_paths' => { '$ref' => '#/definitions/stringList' },
540
- 'yaml_paths' => { '$ref' => '#/definitions/stringList' },
541
- 'json_paths' => { '$ref' => '#/definitions/stringList' },
542
- 'erb_paths' => { '$ref' => '#/definitions/stringList' },
543
- 'requires' => { '$ref' => '#/definitions/stringList' },
544
- 'gems' => { '$ref' => '#/definitions/stringList' },
545
- 'keep' => { '$ref' => '#/definitions/keepTestOnlyList' },
546
- 'test_only' => { '$ref' => '#/definitions/keepTestOnlyList' },
547
- 'dynamic' => { '$ref' => '#/definitions/dynamicList' }
548
- }
549
- }.freeze
550
- end
551
- end
@@ -1,61 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- require 'set'
4
- require 'json_schemer'
5
-
6
- module Leftovers
7
- module ConfigValidator
8
- autoload(:ErrorProcessor, "#{__dir__}/config_validator/error_processor")
9
- autoload(:SCHEMA_HASH, "#{__dir__}/config_validator/schema_hash")
10
-
11
- def self.default_schema
12
- @default_schema ||= ::JSONSchemer.schema(::Leftovers::ConfigValidator::SCHEMA_HASH)
13
- end
14
-
15
- def self.validate(obj, validator = default_schema)
16
- validator.validate(obj)
17
- end
18
-
19
- def self.validate_and_process!(yaml, path)
20
- errors = validate(yaml)
21
- print_validation_errors_and_exit(errors, path) unless errors.first.nil?
22
- post_process!(yaml)
23
- end
24
-
25
- def self.print_validation_errors_and_exit(errors, path)
26
- ::Leftovers::ConfigValidator::ErrorProcessor.process(errors).each do |message|
27
- warn "\e[31mConfig SchemaError: (#{path}): #{message}\e[0m"
28
- end
29
-
30
- ::Leftovers.exit 1
31
- end
32
-
33
- def self.post_process!(obj)
34
- case obj
35
- when Hash
36
- obj.keys.each do |key| # rubocop:disable Style/HashEachMethods # each_key never finishes.
37
- obj[symbolize_name(key)] = post_process!(obj.delete(key))
38
- end
39
- when Array
40
- obj.map! { |ea| post_process!(ea) }
41
- end
42
- obj
43
- end
44
-
45
- def self.symbolize_name(name) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
46
- case name
47
- when 'matches' then :match
48
- when 'defines' then :define
49
- when 'calls' then :call
50
- when 'name' then :names
51
- when 'keyword' then :keywords
52
- when 'argument' then :arguments
53
- when 'has_argument' then :has_arguments
54
- when 'path' then :paths
55
- when 'unless' then :unless_arg
56
- when 'require' then :requires
57
- else name.to_sym
58
- end
59
- end
60
- end
61
- end
@@ -1,22 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- module ReturnDefinition
6
- def self.process(str, node, method_node)
7
- return unless str
8
- return if str.empty?
9
-
10
- str_node = Leftovers::DefinitionNode.new(str.to_sym, method_node.path)
11
-
12
- return :keep if ::Leftovers.config.keep === str_node
13
-
14
- Leftovers::Definition.new(
15
- str_node.name,
16
- location: node.loc.expression,
17
- test: method_node.test_line? || ::Leftovers.config.test_only === str_node
18
- )
19
- end
20
- end
21
- end
22
- end