leftovers 0.6.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -3
  3. data/README.md +8 -7
  4. data/docs/Configuration.md +241 -105
  5. data/docs/Custom-Precompilers.md +44 -0
  6. data/leftovers.gemspec +3 -2
  7. data/lib/config/actioncable.yml +36 -4
  8. data/lib/config/actionmailbox.yml +28 -0
  9. data/lib/config/actionmailer.yml +92 -16
  10. data/lib/config/actionpack.yml +130 -32
  11. data/lib/config/actiontext.yml +56 -0
  12. data/lib/config/actionview.yml +194 -44
  13. data/lib/config/activejob.yml +15 -8
  14. data/lib/config/activemodel.yml +175 -18
  15. data/lib/config/activerecord.yml +397 -86
  16. data/lib/config/activestorage.yml +26 -0
  17. data/lib/config/activesupport.yml +168 -25
  18. data/lib/config/haml.yml +4 -2
  19. data/lib/config/leftovers.yml +48 -0
  20. data/lib/config/rails.yml +8 -4
  21. data/lib/config/railties.yml +18 -0
  22. data/lib/config/ruby.yml +473 -57
  23. data/lib/config/slim.yml +4 -2
  24. data/lib/config/test-unit.yml +8 -0
  25. data/lib/leftovers/ast/array_node.rb +12 -0
  26. data/lib/leftovers/ast/block_node.rb +12 -0
  27. data/lib/leftovers/ast/builder.rb +24 -5
  28. data/lib/leftovers/ast/casgn_node.rb +20 -0
  29. data/lib/leftovers/ast/const_node.rb +15 -0
  30. data/lib/leftovers/ast/def_node.rb +15 -0
  31. data/lib/leftovers/ast/defs_node.rb +15 -0
  32. data/lib/leftovers/ast/false_node.rb +24 -0
  33. data/lib/leftovers/ast/has_arguments.rb +31 -0
  34. data/lib/leftovers/ast/hash_node.rb +17 -0
  35. data/lib/leftovers/ast/module_node.rb +16 -0
  36. data/lib/leftovers/ast/nil_node.rb +23 -0
  37. data/lib/leftovers/ast/node.rb +39 -91
  38. data/lib/leftovers/ast/numeric_node.rb +22 -0
  39. data/lib/leftovers/ast/send_node.rb +25 -0
  40. data/lib/leftovers/ast/str_node.rb +24 -0
  41. data/lib/leftovers/ast/sym_node.rb +25 -0
  42. data/lib/leftovers/ast/true_node.rb +24 -0
  43. data/lib/leftovers/ast/var_node.rb +14 -0
  44. data/lib/leftovers/ast/vasgn_node.rb +20 -0
  45. data/lib/leftovers/ast.rb +18 -0
  46. data/lib/leftovers/cli.rb +12 -1
  47. data/lib/leftovers/collector.rb +2 -1
  48. data/lib/leftovers/comparable_instance.rb +18 -0
  49. data/lib/leftovers/config.rb +3 -42
  50. data/lib/leftovers/config_loader/argument_position_schema.rb +13 -0
  51. data/lib/leftovers/config_loader/argumentless_transform_schema.rb +21 -0
  52. data/lib/leftovers/config_loader/array_schema.rb +53 -0
  53. data/lib/leftovers/config_loader/attribute.rb +56 -0
  54. data/lib/leftovers/config_loader/built_in_precompiler_schema.rb +13 -0
  55. data/lib/leftovers/config_loader/document_schema.rb +49 -0
  56. data/lib/leftovers/config_loader/dynamic_schema.rb +18 -0
  57. data/lib/leftovers/config_loader/has_argument_schema.rb +13 -0
  58. data/lib/leftovers/config_loader/has_value_schema.rb +22 -0
  59. data/lib/leftovers/config_loader/inherit_schema_attributes.rb +22 -0
  60. data/lib/leftovers/config_loader/keep_test_only_schema.rb +13 -0
  61. data/lib/leftovers/config_loader/keyword_argument_schema.rb +13 -0
  62. data/lib/leftovers/config_loader/node.rb +106 -0
  63. data/lib/leftovers/config_loader/object_schema.rb +117 -0
  64. data/lib/leftovers/config_loader/precompile_schema.rb +12 -0
  65. data/lib/leftovers/config_loader/precompiler_schema.rb +11 -0
  66. data/lib/leftovers/config_loader/privacy_processor_schema.rb +10 -0
  67. data/lib/leftovers/config_loader/privacy_schema.rb +15 -0
  68. data/lib/leftovers/config_loader/regexp_schema.rb +27 -0
  69. data/lib/leftovers/config_loader/require_schema.rb +11 -0
  70. data/lib/leftovers/config_loader/rule_pattern_schema.rb +20 -0
  71. data/lib/leftovers/config_loader/scalar_argument_schema.rb +14 -0
  72. data/lib/leftovers/config_loader/scalar_value_schema.rb +22 -0
  73. data/lib/leftovers/config_loader/schema.rb +33 -0
  74. data/lib/leftovers/config_loader/string_enum_schema.rb +62 -0
  75. data/lib/leftovers/config_loader/string_pattern_schema.rb +14 -0
  76. data/lib/leftovers/config_loader/string_schema.rb +14 -0
  77. data/lib/leftovers/config_loader/string_value_processor_schema.rb +11 -0
  78. data/lib/leftovers/config_loader/suggester.rb +22 -0
  79. data/lib/leftovers/config_loader/transform_schema.rb +32 -0
  80. data/lib/leftovers/config_loader/true_schema.rb +18 -0
  81. data/lib/leftovers/config_loader/value_matcher_condition_schema.rb +13 -0
  82. data/lib/leftovers/config_loader/value_matcher_schema.rb +21 -0
  83. data/lib/leftovers/config_loader/value_or_array_schema.rb +34 -0
  84. data/lib/leftovers/config_loader/value_or_object_schema.rb +40 -0
  85. data/lib/leftovers/config_loader/value_processor_schema.rb +14 -0
  86. data/lib/leftovers/config_loader/value_type_schema.rb +17 -0
  87. data/lib/leftovers/config_loader.rb +93 -0
  88. data/lib/leftovers/definition_collection.rb +37 -0
  89. data/lib/leftovers/definition_node.rb +6 -17
  90. data/lib/leftovers/definition_node_set.rb +19 -0
  91. data/lib/leftovers/definition_to_add.rb +31 -0
  92. data/lib/leftovers/file.rb +13 -55
  93. data/lib/leftovers/file_collector/comments_processor.rb +57 -0
  94. data/lib/leftovers/file_collector/node_processor.rb +131 -0
  95. data/lib/leftovers/file_collector.rb +62 -202
  96. data/lib/leftovers/file_list.rb +3 -2
  97. data/lib/leftovers/matcher_builders/and.rb +26 -9
  98. data/lib/leftovers/matcher_builders/and_not.rb +7 -5
  99. data/lib/leftovers/matcher_builders/name.rb +18 -17
  100. data/lib/leftovers/matcher_builders/node.rb +60 -30
  101. data/lib/leftovers/matcher_builders/node_has_argument.rb +48 -52
  102. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +16 -11
  103. data/lib/leftovers/matcher_builders/node_has_positional_argument.rb +29 -15
  104. data/lib/leftovers/matcher_builders/node_pair_key.rb +16 -0
  105. data/lib/leftovers/matcher_builders/node_privacy.rb +13 -0
  106. data/lib/leftovers/matcher_builders/node_type.rb +11 -11
  107. data/lib/leftovers/matcher_builders/node_value.rb +44 -25
  108. data/lib/leftovers/matcher_builders/or.rb +64 -49
  109. data/lib/leftovers/matcher_builders/path.rb +3 -1
  110. data/lib/leftovers/matcher_builders/string_pattern.rb +14 -5
  111. data/lib/leftovers/matcher_builders.rb +2 -1
  112. data/lib/leftovers/matchers/all.rb +4 -0
  113. data/lib/leftovers/matchers/and.rb +4 -0
  114. data/lib/leftovers/matchers/any.rb +2 -0
  115. data/lib/leftovers/matchers/node_has_any_keyword_argument.rb +7 -4
  116. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +5 -4
  117. data/lib/leftovers/matchers/node_has_positional_argument.rb +5 -1
  118. data/lib/leftovers/matchers/node_has_positional_argument_with_value.rb +6 -1
  119. data/lib/leftovers/matchers/node_has_receiver.rb +4 -0
  120. data/lib/leftovers/matchers/node_is_proc.rb +13 -0
  121. data/lib/leftovers/matchers/node_name.rb +9 -3
  122. data/lib/leftovers/matchers/node_pair_key.rb +23 -0
  123. data/lib/leftovers/matchers/node_pair_value.rb +7 -3
  124. data/lib/leftovers/matchers/node_path.rb +7 -3
  125. data/lib/leftovers/matchers/node_privacy.rb +23 -0
  126. data/lib/leftovers/matchers/node_scalar_value.rb +6 -1
  127. data/lib/leftovers/matchers/node_type.rb +7 -3
  128. data/lib/leftovers/matchers/not.rb +2 -0
  129. data/lib/leftovers/matchers/or.rb +2 -0
  130. data/lib/leftovers/matchers/path.rb +21 -0
  131. data/lib/leftovers/matchers.rb +4 -1
  132. data/lib/leftovers/merged_config.rb +40 -75
  133. data/lib/leftovers/parser.rb +7 -4
  134. data/lib/leftovers/precompilers/erb.rb +22 -0
  135. data/lib/leftovers/precompilers/haml.rb +15 -0
  136. data/lib/leftovers/precompilers/json.rb +27 -0
  137. data/lib/leftovers/precompilers/precompiler.rb +28 -0
  138. data/lib/leftovers/precompilers/slim.rb +15 -0
  139. data/lib/leftovers/precompilers/yaml.rb +75 -0
  140. data/lib/leftovers/precompilers.rb +50 -0
  141. data/lib/leftovers/processor_builders/action.rb +69 -42
  142. data/lib/leftovers/processor_builders/add_prefix.rb +18 -10
  143. data/lib/leftovers/processor_builders/add_suffix.rb +18 -10
  144. data/lib/leftovers/processor_builders/argument.rb +28 -14
  145. data/lib/leftovers/processor_builders/dynamic.rb +57 -17
  146. data/lib/leftovers/processor_builders/each.rb +83 -11
  147. data/lib/leftovers/processor_builders/itself.rb +2 -2
  148. data/lib/leftovers/processor_builders/keyword.rb +9 -9
  149. data/lib/leftovers/processor_builders/keyword_argument.rb +4 -2
  150. data/lib/leftovers/processor_builders/receiver.rb +13 -0
  151. data/lib/leftovers/processor_builders/transform.rb +55 -44
  152. data/lib/leftovers/processor_builders/transform_chain.rb +16 -8
  153. data/lib/leftovers/processor_builders/transform_set.rb +16 -32
  154. data/lib/leftovers/processor_builders/value.rb +4 -4
  155. data/lib/leftovers/processor_builders.rb +1 -3
  156. data/lib/leftovers/processors/add_call.rb +14 -0
  157. data/lib/leftovers/processors/add_definition_node.rb +16 -0
  158. data/lib/leftovers/processors/add_dynamic_prefix.rb +29 -0
  159. data/lib/leftovers/processors/add_dynamic_suffix.rb +29 -0
  160. data/lib/leftovers/{value_processors → processors}/add_prefix.rb +7 -3
  161. data/lib/leftovers/{value_processors → processors}/add_suffix.rb +7 -3
  162. data/lib/leftovers/processors/append_sym.rb +13 -0
  163. data/lib/leftovers/{value_processors → processors}/camelize.rb +7 -3
  164. data/lib/leftovers/{value_processors → processors}/capitalize.rb +7 -3
  165. data/lib/leftovers/{value_processors → processors}/deconstantize.rb +7 -3
  166. data/lib/leftovers/{value_processors → processors}/delete_after.rb +9 -5
  167. data/lib/leftovers/processors/delete_after_last.rb +26 -0
  168. data/lib/leftovers/processors/delete_before.rb +27 -0
  169. data/lib/leftovers/processors/delete_before_last.rb +27 -0
  170. data/lib/leftovers/{value_processors → processors}/delete_prefix.rb +7 -3
  171. data/lib/leftovers/{value_processors → processors}/delete_suffix.rb +7 -3
  172. data/lib/leftovers/{value_processors → processors}/demodulize.rb +7 -3
  173. data/lib/leftovers/{value_processors → processors}/downcase.rb +7 -3
  174. data/lib/leftovers/processors/each.rb +25 -0
  175. data/lib/leftovers/processors/each_for_definition_set.rb +33 -0
  176. data/lib/leftovers/processors/each_keyword.rb +29 -0
  177. data/lib/leftovers/processors/each_keyword_argument.rb +29 -0
  178. data/lib/leftovers/processors/each_positional_argument.rb +27 -0
  179. data/lib/leftovers/processors/each_positional_argument_from.rb +30 -0
  180. data/lib/leftovers/processors/eval.rb +16 -0
  181. data/lib/leftovers/processors/itself.rb +21 -0
  182. data/lib/leftovers/{value_processors → processors}/keyword_argument.rb +9 -11
  183. data/lib/leftovers/processors/match_current_node.rb +26 -0
  184. data/lib/leftovers/processors/match_matched_node.rb +26 -0
  185. data/lib/leftovers/{value_processors → processors}/parameterize.rb +7 -3
  186. data/lib/leftovers/{value_processors → processors}/placeholder.rb +5 -4
  187. data/lib/leftovers/{value_processors → processors}/pluralize.rb +7 -3
  188. data/lib/leftovers/{value_processors → processors}/positional_argument.rb +8 -6
  189. data/lib/leftovers/processors/receiver.rb +24 -0
  190. data/lib/leftovers/{value_processors → processors}/replace_value.rb +7 -3
  191. data/lib/leftovers/processors/set_default_privacy.rb +21 -0
  192. data/lib/leftovers/processors/set_privacy.rb +23 -0
  193. data/lib/leftovers/{value_processors → processors}/singularize.rb +7 -3
  194. data/lib/leftovers/{value_processors → processors}/split.rb +8 -4
  195. data/lib/leftovers/{value_processors → processors}/swapcase.rb +7 -3
  196. data/lib/leftovers/{value_processors → processors}/titleize.rb +7 -3
  197. data/lib/leftovers/{value_processors → processors}/underscore.rb +7 -3
  198. data/lib/leftovers/{value_processors → processors}/upcase.rb +7 -3
  199. data/lib/leftovers/processors.rb +49 -0
  200. data/lib/leftovers/rake_task.rb +1 -1
  201. data/lib/leftovers/version.rb +1 -1
  202. data/lib/leftovers.rb +55 -20
  203. metadata +159 -72
  204. data/lib/leftovers/config_validator/error_processor.rb +0 -196
  205. data/lib/leftovers/config_validator/schema_hash.rb +0 -551
  206. data/lib/leftovers/config_validator.rb +0 -61
  207. data/lib/leftovers/dynamic_processors/call.rb +0 -21
  208. data/lib/leftovers/dynamic_processors/call_definition.rb +0 -27
  209. data/lib/leftovers/dynamic_processors/definition.rb +0 -22
  210. data/lib/leftovers/dynamic_processors/each.rb +0 -19
  211. data/lib/leftovers/dynamic_processors/null.rb +0 -9
  212. data/lib/leftovers/dynamic_processors.rb +0 -11
  213. data/lib/leftovers/erb.rb +0 -20
  214. data/lib/leftovers/haml.rb +0 -21
  215. data/lib/leftovers/json.rb +0 -28
  216. data/lib/leftovers/matcher_builders/node_pair_name.rb +0 -18
  217. data/lib/leftovers/matchers/predicate.rb +0 -19
  218. data/lib/leftovers/processor_builders/each_action.rb +0 -51
  219. data/lib/leftovers/processor_builders/each_dynamic.rb +0 -54
  220. data/lib/leftovers/processor_builders/each_for_definition_set.rb +0 -36
  221. data/lib/leftovers/slim.rb +0 -21
  222. data/lib/leftovers/value_processors/add_dynamic_prefix.rb +0 -31
  223. data/lib/leftovers/value_processors/add_dynamic_suffix.rb +0 -31
  224. data/lib/leftovers/value_processors/delete_before.rb +0 -22
  225. data/lib/leftovers/value_processors/each.rb +0 -21
  226. data/lib/leftovers/value_processors/each_for_definition_set.rb +0 -29
  227. data/lib/leftovers/value_processors/each_keyword.rb +0 -27
  228. data/lib/leftovers/value_processors/each_keyword_argument.rb +0 -27
  229. data/lib/leftovers/value_processors/each_positional_argument.rb +0 -24
  230. data/lib/leftovers/value_processors/itself.rb +0 -17
  231. data/lib/leftovers/value_processors/keyword.rb +0 -32
  232. data/lib/leftovers/value_processors/return_definition.rb +0 -22
  233. data/lib/leftovers/value_processors/return_string.rb +0 -14
  234. data/lib/leftovers/value_processors.rb +0 -40
  235. data/lib/leftovers/yaml.rb +0 -73
@@ -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,21 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module DynamicProcessors
5
- class Call
6
- def initialize(matcher, processor)
7
- @matcher = matcher
8
- @processor = processor
9
- end
10
-
11
- def process(node, file)
12
- return unless @matcher === node
13
-
14
- call = @processor.process(nil, node, node)
15
- return unless call
16
-
17
- file.calls << call
18
- end
19
- end
20
- end
21
- end
@@ -1,27 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module DynamicProcessors
5
- class CallDefinition
6
- def initialize(matcher, call_processor, definition_processor)
7
- @matcher = matcher
8
- @call_processor = call_processor
9
- @definition_processor = definition_processor
10
- end
11
-
12
- def process(node, file)
13
- return unless @matcher === node
14
-
15
- call = @call_processor.process(nil, node, node)
16
- (file.calls << call) if call
17
-
18
- return if node.keep_line?
19
-
20
- definition = @definition_processor.process(nil, node, node)
21
- return unless definition
22
-
23
- file.definitions << definition
24
- end
25
- end
26
- end
27
- end