leftovers 0.8.0 → 0.9.0

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +7 -7
  4. data/docs/Configuration.md +141 -32
  5. data/docs/Custom-Precompilers.md +6 -0
  6. data/leftovers.gemspec +2 -1
  7. data/lib/config/actioncable.yml +36 -0
  8. data/lib/config/actionmailbox.yml +28 -0
  9. data/lib/config/actionmailer.yml +87 -11
  10. data/lib/config/actionpack.yml +130 -34
  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 +167 -24
  18. data/lib/config/leftovers.yml +48 -0
  19. data/lib/config/rails.yml +7 -3
  20. data/lib/config/railties.yml +7 -0
  21. data/lib/config/ruby.yml +438 -83
  22. data/lib/config/test-unit.yml +8 -0
  23. data/lib/leftovers/ast/array_node.rb +12 -0
  24. data/lib/leftovers/ast/block_node.rb +12 -0
  25. data/lib/leftovers/ast/builder.rb +24 -5
  26. data/lib/leftovers/ast/casgn_node.rb +20 -0
  27. data/lib/leftovers/ast/const_node.rb +15 -0
  28. data/lib/leftovers/ast/def_node.rb +15 -0
  29. data/lib/leftovers/ast/defs_node.rb +15 -0
  30. data/lib/leftovers/ast/false_node.rb +24 -0
  31. data/lib/leftovers/ast/has_arguments.rb +31 -0
  32. data/lib/leftovers/ast/hash_node.rb +17 -0
  33. data/lib/leftovers/ast/module_node.rb +16 -0
  34. data/lib/leftovers/ast/nil_node.rb +23 -0
  35. data/lib/leftovers/ast/node.rb +33 -90
  36. data/lib/leftovers/ast/numeric_node.rb +22 -0
  37. data/lib/leftovers/ast/send_node.rb +25 -0
  38. data/lib/leftovers/ast/str_node.rb +24 -0
  39. data/lib/leftovers/ast/sym_node.rb +25 -0
  40. data/lib/leftovers/ast/true_node.rb +24 -0
  41. data/lib/leftovers/ast/var_node.rb +14 -0
  42. data/lib/leftovers/ast/vasgn_node.rb +20 -0
  43. data/lib/leftovers/ast.rb +18 -0
  44. data/lib/leftovers/cli.rb +7 -1
  45. data/lib/leftovers/comparable_instance.rb +18 -0
  46. data/lib/leftovers/config_loader/argument_position_schema.rb +3 -1
  47. data/lib/leftovers/config_loader/array_schema.rb +53 -0
  48. data/lib/leftovers/config_loader/document_schema.rb +3 -2
  49. data/lib/leftovers/config_loader/dynamic_schema.rb +1 -0
  50. data/lib/leftovers/config_loader/has_value_schema.rb +4 -0
  51. data/lib/leftovers/config_loader/keyword_argument_schema.rb +13 -0
  52. data/lib/leftovers/config_loader/regexp_schema.rb +27 -0
  53. data/lib/leftovers/config_loader/rule_pattern_schema.rb +2 -0
  54. data/lib/leftovers/config_loader/scalar_value_schema.rb +8 -0
  55. data/lib/leftovers/config_loader/schema.rb +10 -0
  56. data/lib/leftovers/config_loader/string_enum_schema.rb +1 -1
  57. data/lib/leftovers/config_loader/string_pattern_schema.rb +1 -1
  58. data/lib/leftovers/config_loader/transform_schema.rb +12 -6
  59. data/lib/leftovers/config_loader/value_matcher_condition_schema.rb +13 -0
  60. data/lib/leftovers/config_loader/value_matcher_schema.rb +4 -1
  61. data/lib/leftovers/config_loader/value_or_array_schema.rb +2 -34
  62. data/lib/leftovers/config_loader/value_processor_schema.rb +2 -2
  63. data/lib/leftovers/config_loader.rb +11 -4
  64. data/lib/leftovers/definition_collection.rb +37 -0
  65. data/lib/leftovers/definition_node_set.rb +10 -2
  66. data/lib/leftovers/file.rb +1 -1
  67. data/lib/leftovers/file_collector/comments_processor.rb +1 -1
  68. data/lib/leftovers/file_collector/node_processor.rb +7 -7
  69. data/lib/leftovers/file_collector.rb +26 -32
  70. data/lib/leftovers/file_list.rb +3 -2
  71. data/lib/leftovers/matcher_builders/and.rb +26 -9
  72. data/lib/leftovers/matcher_builders/node.rb +32 -20
  73. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +3 -1
  74. data/lib/leftovers/matcher_builders/node_pair_key.rb +16 -0
  75. data/lib/leftovers/matcher_builders/node_type.rb +9 -9
  76. data/lib/leftovers/matcher_builders/node_value.rb +23 -9
  77. data/lib/leftovers/matcher_builders/or.rb +22 -7
  78. data/lib/leftovers/matcher_builders/path.rb +3 -1
  79. data/lib/leftovers/matcher_builders.rb +1 -1
  80. data/lib/leftovers/matchers/all.rb +4 -0
  81. data/lib/leftovers/matchers/and.rb +4 -0
  82. data/lib/leftovers/matchers/any.rb +2 -0
  83. data/lib/leftovers/matchers/node_has_any_keyword_argument.rb +7 -4
  84. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +5 -4
  85. data/lib/leftovers/matchers/node_has_positional_argument.rb +5 -1
  86. data/lib/leftovers/matchers/node_has_positional_argument_with_value.rb +6 -1
  87. data/lib/leftovers/matchers/node_has_receiver.rb +4 -0
  88. data/lib/leftovers/matchers/node_is_proc.rb +13 -0
  89. data/lib/leftovers/matchers/node_name.rb +9 -3
  90. data/lib/leftovers/matchers/node_pair_key.rb +23 -0
  91. data/lib/leftovers/matchers/node_pair_value.rb +7 -3
  92. data/lib/leftovers/matchers/node_path.rb +7 -3
  93. data/lib/leftovers/matchers/node_privacy.rb +7 -3
  94. data/lib/leftovers/matchers/node_scalar_value.rb +6 -1
  95. data/lib/leftovers/matchers/node_type.rb +7 -3
  96. data/lib/leftovers/matchers/not.rb +2 -0
  97. data/lib/leftovers/matchers/or.rb +2 -0
  98. data/lib/leftovers/matchers/path.rb +21 -0
  99. data/lib/leftovers/matchers.rb +3 -1
  100. data/lib/leftovers/merged_config.rb +26 -25
  101. data/lib/leftovers/parser.rb +7 -4
  102. data/lib/leftovers/precompilers.rb +5 -5
  103. data/lib/leftovers/processor_builders/action.rb +55 -37
  104. data/lib/leftovers/processor_builders/add_prefix.rb +18 -10
  105. data/lib/leftovers/processor_builders/add_suffix.rb +18 -10
  106. data/lib/leftovers/processor_builders/argument.rb +28 -11
  107. data/lib/leftovers/processor_builders/dynamic.rb +37 -31
  108. data/lib/leftovers/processor_builders/each.rb +82 -10
  109. data/lib/leftovers/processor_builders/itself.rb +2 -2
  110. data/lib/leftovers/processor_builders/keyword.rb +7 -6
  111. data/lib/leftovers/processor_builders/keyword_argument.rb +4 -2
  112. data/lib/leftovers/processor_builders/receiver.rb +13 -0
  113. data/lib/leftovers/processor_builders/transform.rb +55 -44
  114. data/lib/leftovers/processor_builders/transform_chain.rb +1 -1
  115. data/lib/leftovers/processor_builders/transform_set.rb +9 -29
  116. data/lib/leftovers/processor_builders/value.rb +4 -4
  117. data/lib/leftovers/processor_builders.rb +1 -3
  118. data/lib/leftovers/processors/add_call.rb +14 -0
  119. data/lib/leftovers/processors/add_definition_node.rb +16 -0
  120. data/lib/leftovers/processors/add_dynamic_prefix.rb +29 -0
  121. data/lib/leftovers/processors/add_dynamic_suffix.rb +29 -0
  122. data/lib/leftovers/{value_processors → processors}/add_prefix.rb +7 -3
  123. data/lib/leftovers/{value_processors → processors}/add_suffix.rb +7 -3
  124. data/lib/leftovers/processors/append_sym.rb +13 -0
  125. data/lib/leftovers/{value_processors → processors}/camelize.rb +7 -3
  126. data/lib/leftovers/{value_processors → processors}/capitalize.rb +7 -3
  127. data/lib/leftovers/{value_processors → processors}/deconstantize.rb +7 -3
  128. data/lib/leftovers/{value_processors → processors}/delete_after.rb +9 -5
  129. data/lib/leftovers/processors/delete_after_last.rb +26 -0
  130. data/lib/leftovers/processors/delete_before.rb +27 -0
  131. data/lib/leftovers/processors/delete_before_last.rb +27 -0
  132. data/lib/leftovers/{value_processors → processors}/delete_prefix.rb +7 -3
  133. data/lib/leftovers/{value_processors → processors}/delete_suffix.rb +7 -3
  134. data/lib/leftovers/{value_processors → processors}/demodulize.rb +7 -3
  135. data/lib/leftovers/{value_processors → processors}/downcase.rb +7 -3
  136. data/lib/leftovers/processors/each.rb +25 -0
  137. data/lib/leftovers/processors/each_for_definition_set.rb +33 -0
  138. data/lib/leftovers/processors/each_keyword.rb +29 -0
  139. data/lib/leftovers/processors/each_keyword_argument.rb +29 -0
  140. data/lib/leftovers/processors/each_positional_argument.rb +27 -0
  141. data/lib/leftovers/processors/each_positional_argument_from.rb +30 -0
  142. data/lib/leftovers/processors/eval.rb +16 -0
  143. data/lib/leftovers/processors/itself.rb +21 -0
  144. data/lib/leftovers/processors/keyword_argument.rb +30 -0
  145. data/lib/leftovers/processors/match_current_node.rb +26 -0
  146. data/lib/leftovers/processors/match_matched_node.rb +26 -0
  147. data/lib/leftovers/{value_processors → processors}/parameterize.rb +7 -3
  148. data/lib/leftovers/{value_processors → processors}/placeholder.rb +5 -4
  149. data/lib/leftovers/{value_processors → processors}/pluralize.rb +7 -3
  150. data/lib/leftovers/{value_processors → processors}/positional_argument.rb +8 -6
  151. data/lib/leftovers/processors/receiver.rb +24 -0
  152. data/lib/leftovers/{value_processors → processors}/replace_value.rb +7 -3
  153. data/lib/leftovers/processors/set_default_privacy.rb +21 -0
  154. data/lib/leftovers/processors/set_privacy.rb +23 -0
  155. data/lib/leftovers/{value_processors → processors}/singularize.rb +7 -3
  156. data/lib/leftovers/{value_processors → processors}/split.rb +8 -4
  157. data/lib/leftovers/{value_processors → processors}/swapcase.rb +7 -3
  158. data/lib/leftovers/{value_processors → processors}/titleize.rb +7 -3
  159. data/lib/leftovers/{value_processors → processors}/underscore.rb +7 -3
  160. data/lib/leftovers/{value_processors → processors}/upcase.rb +7 -3
  161. data/lib/leftovers/processors.rb +49 -0
  162. data/lib/leftovers/version.rb +1 -1
  163. data/lib/leftovers.rb +3 -12
  164. metadata +97 -52
  165. data/lib/leftovers/dynamic_processors/call.rb +0 -22
  166. data/lib/leftovers/dynamic_processors/call_definition.rb +0 -34
  167. data/lib/leftovers/dynamic_processors/definition.rb +0 -27
  168. data/lib/leftovers/dynamic_processors/each.rb +0 -19
  169. data/lib/leftovers/dynamic_processors/null.rb +0 -9
  170. data/lib/leftovers/dynamic_processors/set_default_privacy.rb +0 -18
  171. data/lib/leftovers/dynamic_processors/set_privacy.rb +0 -23
  172. data/lib/leftovers/dynamic_processors.rb +0 -13
  173. data/lib/leftovers/matcher_builders/node_pair_name.rb +0 -18
  174. data/lib/leftovers/matchers/predicate.rb +0 -19
  175. data/lib/leftovers/processor_builders/each_action.rb +0 -51
  176. data/lib/leftovers/processor_builders/each_dynamic.rb +0 -50
  177. data/lib/leftovers/processor_builders/each_for_definition_set.rb +0 -40
  178. data/lib/leftovers/value_processors/add_dynamic_prefix.rb +0 -24
  179. data/lib/leftovers/value_processors/add_dynamic_suffix.rb +0 -24
  180. data/lib/leftovers/value_processors/delete_before.rb +0 -22
  181. data/lib/leftovers/value_processors/each.rb +0 -21
  182. data/lib/leftovers/value_processors/each_for_definition_set.rb +0 -23
  183. data/lib/leftovers/value_processors/each_keyword.rb +0 -27
  184. data/lib/leftovers/value_processors/each_keyword_argument.rb +0 -27
  185. data/lib/leftovers/value_processors/each_positional_argument.rb +0 -25
  186. data/lib/leftovers/value_processors/itself.rb +0 -17
  187. data/lib/leftovers/value_processors/keyword.rb +0 -28
  188. data/lib/leftovers/value_processors/keyword_argument.rb +0 -28
  189. data/lib/leftovers/value_processors/return_definition_node.rb +0 -14
  190. data/lib/leftovers/value_processors/return_sym.rb +0 -14
  191. data/lib/leftovers/value_processors.rb +0 -40
@@ -1,11 +1,82 @@
1
- # THIS IS INCOMPLETE (you can help by expanding it)
2
- # rails is _really complicated_ and has a lot of magic which calls methods for you.
3
- # some is currently impossible to handle (with_options).
4
- # Some is just corners of rails I haven't hit yet.
5
1
  keep:
6
- - validate_each # ActiveModel::EachValidator
2
+ # https://api.rubyonrails.org/classes/ActiveModel/EachValidator.html#method-i-validate_each
3
+ - validate_each
4
+
5
+ # https://api.rubyonrails.org/classes/ActiveModel/Validator.html#method-i-validate
6
+ - validate
7
+
8
+ # https://api.rubyonrails.org/classes/ActiveModel/API.html
9
+ # ActiveModel::API implements persisted? to return false, which is the most common case. You may want to override it in your class
10
+ - persisted?
11
+
12
+ # https://edgeapi.rubyonrails.org/classes/ActiveModel/Type/Value.html
13
+ - cast
14
+ - serialize
15
+ - deserialize
16
+ - serializable?
17
+ - type
18
+ - changed_in_place?
19
+
20
+ gems:
21
+ - activesupport
7
22
 
8
23
  dynamic:
24
+
25
+ # https://api.rubyonrails.org/classes/ActiveModel/API.html#method-c-new
26
+ # https://api.rubyonrails.org/classes/ActiveModel/AttributeAssignment.html#method-i-assign_attributes
27
+ - name: [new, assign_attributes, attributes=]
28
+ unless:
29
+ has_argument: 0
30
+ calls:
31
+ keyword: '**'
32
+ add_suffix: '='
33
+
34
+ # https://api.rubyonrails.org/classes/ActiveModel/Callbacks.html#method-i-define_model_callbacks
35
+ - name: define_model_callbacks
36
+ has_argument: only
37
+ defines:
38
+ argument: '*'
39
+ add_prefix:
40
+ - value: 'before_'
41
+ any:
42
+ - has_argument:
43
+ at: only
44
+ has_value: before
45
+ - has_argument:
46
+ at: only
47
+ has_value:
48
+ has_argument:
49
+ at: '*'
50
+ has_value: before
51
+ - unless:
52
+ has_argument: only
53
+ - value: 'after_'
54
+ any:
55
+ - has_argument:
56
+ at: only
57
+ has_value: after
58
+ - has_argument:
59
+ at: only
60
+ has_value:
61
+ has_argument:
62
+ at: '*'
63
+ has_value: after
64
+ - unless:
65
+ has_argument: only
66
+ - value: 'around_'
67
+ any:
68
+ - has_argument:
69
+ at: only
70
+ has_value: around
71
+ - has_argument:
72
+ at: only
73
+ has_value:
74
+ has_argument:
75
+ at: '*'
76
+ has_value: around
77
+ - unless:
78
+ has_argument: only
79
+
9
80
  - names:
10
81
  - after_initialize
11
82
  - before_validation
@@ -19,45 +90,131 @@ dynamic:
19
90
  - validates_associated
20
91
  calls:
21
92
  - arguments: ['*', if, unless]
22
- - name: validates
93
+ # https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates
94
+ - name: [validates, validates!]
23
95
  calls:
24
96
  - arguments:
25
97
  - '*'
26
98
  - within
27
99
  - inclusion
100
+ - exclusion
28
101
  - scope
29
102
  - if
30
103
  - unless
31
- - arguments: inclusion
104
+ - arguments: [if, unless]
105
+ nested: '*'
106
+ - arguments: [inclusion, exclusion]
107
+ nested:
108
+ arguments:
109
+ - 'in'
110
+ - within
111
+ - arguments: [comparison, numericality]
32
112
  nested:
33
- arguments: 'in'
113
+ arguments:
114
+ - greater_than
115
+ - greater_than_or_equal_to
116
+ - equal_to
117
+ - less_than
118
+ - less_than_or_equal_to
119
+ - other_than
34
120
  - keywords:
35
121
  unless: [if, unless]
36
122
  camelize: true
37
123
  add_suffix: Validator
38
124
  split: '::'
125
+ eval:
126
+ - arguments: [if, unless]
127
+ - arguments: [if, unless]
128
+ nested: '*'
129
+
130
+ - name: validates_confirmation_of
131
+ calls:
132
+ argument: '*'
133
+ transforms:
134
+ - original
135
+ - add_suffix: '_confirmation'
136
+ - name: [validates, validates!]
137
+ has_argument: confirmation
138
+ calls:
139
+ argument: '*'
140
+ add_suffix: _confirmation
141
+
142
+ - name: validates_comparison_of
143
+ calls:
144
+ argument:
145
+ - '*'
146
+ - greater_than
147
+ - greater_than_or_equal_to
148
+ - equal_to
149
+ - less_than
150
+ - less_than_or_equal_to
151
+ - other_than
152
+
153
+ - name: [validates_exclusion_of, validates_inclusion_of]
154
+ calls:
155
+ argument:
156
+ - '*'
157
+ - 'in'
158
+ - within
159
+
160
+ - name:
161
+ - validates_absence_of
162
+ - validates_acceptance_of
163
+ - validates_comparison_of
164
+ - validates_confirmation_of
165
+ - validates_exclusion_of
166
+ - validates_format_of
167
+ - validates_inclusion_of
168
+ - validates_length_of
169
+ - validates_numericality_of
170
+ - validates_presence_of
171
+ - validates_size_of
172
+ calls:
173
+ - arguments: ['*', if, unless]
174
+ eval:
175
+ - arguments: [if, unless]
176
+ - arguments: [if, unless]
177
+ nested: '*'
178
+
39
179
  - names:
180
+ # https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate
181
+ # https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates_each
40
182
  - validate
41
183
  - validate_associated
184
+ - validates_each
42
185
  calls:
43
186
  - arguments: ['*', if, unless]
44
- - name:
45
- - attribute
46
- - alias_attribute
47
- path: app/models/*
187
+ eval:
188
+ - arguments: [if, unless]
189
+ - arguments: [if, unless]
190
+ nested: '*'
191
+
192
+ # https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates_with
193
+ - name: validates_with
194
+ calls:
195
+ arguments: [if, unless]
196
+ eval:
197
+ - arguments: [if, unless]
198
+ - arguments: [if, unless]
199
+ nested: '*'
200
+
201
+ # https://api.rubyonrails.org/classes/ActiveModel/AttributeMethods/ClassMethods.html#method-i-alias_attribute
202
+ # https://api.rubyonrails.org/classes/ActiveModel/Dirty.html
203
+ - name: [attribute, alias_attribute]
48
204
  defines:
49
205
  argument: 0
50
206
  transforms:
51
207
  - original
52
- - add_suffix: '?'
53
208
  - add_suffix: '='
209
+ - add_suffix: '?'
210
+ - add_suffix: _was
211
+ - add_suffix: _changed?
212
+ - add_suffix: _previously_changed?
213
+ - add_suffix: _previously_was
214
+ - add_suffix: _will_change!
54
215
  - name: alias_attribute
55
216
  calls:
56
- - argument: 1
57
- - argument: 1
58
- add_suffix: '?'
59
- - argument: 1
60
- add_suffix: '='
217
+ argument: 1
61
218
  - name: resource
62
219
  calls:
63
220
  - argument: 0