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,26 +1,31 @@
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
-
6
- include_paths:
7
- - '*.rjs'
8
- - '*.rhtml'
9
-
1
+ include_paths: '*.rjs'
10
2
  precompile:
11
- - paths:
12
- - '*.rjs'
13
- - '*.rhtml'
3
+ - paths: '*.rjs'
14
4
  format: erb
15
5
 
6
+ gems:
7
+ - activesupport
8
+ - actionview
9
+
10
+
16
11
  keep:
17
- - ssl_configured? # ApplicationController
18
- - default_url_options # called by url_for
19
- - matches? # called by route constraints
12
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-constraints
13
+ - matches?
14
+
15
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Concerns.html#method-i-concern
16
+ - call
17
+
18
+ # https://edgeapi.rubyonrails.org/classes/AbstractController/Rendering.html#method-i-view_assigns
19
+ - view_assigns
20
+
21
+ # https://edgeapi.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#method-i-protect_from_forgery
22
+ - handle_unverified_request
23
+
20
24
  - has_suffix: Helper
21
25
  path: /app/helpers
22
26
 
23
27
  dynamic:
28
+ # https://edgeapi.rubyonrails.org/classes/AbstractController/Callbacks.html
24
29
  - names:
25
30
  - after_action
26
31
  - append_after_action
@@ -31,11 +36,41 @@ dynamic:
31
36
  - prepend_after_action
32
37
  - prepend_around_action
33
38
  - prepend_before_action
34
- - skip_before_action
35
- - skip_after_action
36
- - skip_around_action
37
39
  calls:
38
40
  - arguments: ['*', if, unless]
41
+
42
+ - names:
43
+ - skip_after_action
44
+ - skip_around_action
45
+ - skip_before_action
46
+ calls: [if, unless]
47
+
48
+ - names: protect_from_forgery
49
+ calls: [if, unless]
50
+
51
+
52
+ # https://edgeapi.rubyonrails.org/classes/ActionController/Logging/ClassMethods.html#method-i-log_at
53
+ - names: log_at
54
+ calls: [if, unless]
55
+
56
+
57
+ - name: helper
58
+ calls:
59
+ - arguments: '*'
60
+ camelize: true
61
+
62
+ # https://edgeapi.rubyonrails.org/classes/ActionController/TestCase/Behavior.html
63
+ - names: [delete, get, head, patch, put, post]
64
+ unless:
65
+ has_argument: 1
66
+ calls: 0
67
+
68
+ - names: process
69
+ calls: 0
70
+ unless:
71
+ has_argument: 1
72
+
73
+ # https://edgeapi.rubyonrails.org/classes/AbstractController/Helpers/ClassMethods.html
39
74
  - name: scope
40
75
  unless:
41
76
  has_argument:
@@ -46,32 +81,77 @@ dynamic:
46
81
  argument: module # routes
47
82
  camelize: true
48
83
  split: '::'
49
- - name: namespace
50
- calls:
51
- - argument: 0
52
- camelize: true
53
- split: '::'
54
- - name:
55
- - rescue_from
56
- calls:
57
- - argument: [1, with]
84
+
58
85
  - name:
86
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Base.html#method-i-match
59
87
  - match
88
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/HttpHelpers.html
60
89
  - delete
61
90
  - get
91
+ - options
62
92
  - patch
63
93
  - post
64
94
  - put
95
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-namespace
65
96
  - root
66
97
  calls:
67
- - arguments: [0, action]
68
- - argument: '**'
98
+ - argument: action
99
+ - argument: controller
100
+ camelize: true
101
+ add_suffix: Controller
102
+ split: '::'
103
+ - argument: 'to'
69
104
  delete_before: '#'
70
- - argument: '**'
105
+ - argument: 'to'
71
106
  delete_after: '#'
72
107
  camelize: true
73
108
  add_suffix: Controller
74
109
  split: '::'
110
+ - argument: module
111
+ camelize: true
112
+ split: '::'
113
+ # these might not make sense for root
114
+ - argument: { type: String }
115
+ delete_before: '#'
116
+ - argument: { type: String }
117
+ delete_after: '#'
118
+ camelize: true
119
+ add_suffix: Controller
120
+ split: '::'
121
+
122
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Base.html#method-i-match
123
+ # defines:
124
+ # my logic is, `as:` generates a method you chose, everything else you might just be setting up the routes to be whatever.
125
+ # argument: as
126
+ # add_suffix: [_path, _url]
127
+
128
+ # unfortunately we can't do this as the method generated by as: depends on scope/namespace and we can't look up yet
129
+
130
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-root
131
+ # in addition to the above nonsense, root can also have the to: as the first positional argument
132
+ - name: root
133
+ calls:
134
+ - argument: 0
135
+ delete_before: '#'
136
+ - argument: 0
137
+ delete_after: '#'
138
+ camelize: true
139
+ add_suffix: Controller
140
+ split: '::'
141
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-direct
142
+ - name: direct
143
+ defines:
144
+ argument: 0
145
+ add_suffix: [_path, _url]
146
+
147
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-resolve
148
+ - name: resolve
149
+ calls:
150
+ argument: 0
151
+ split: '::'
152
+
153
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-resources
154
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-resource
75
155
  - name:
76
156
  - resource
77
157
  - resources
@@ -178,8 +258,8 @@ dynamic:
178
258
  - name:
179
259
  - resources
180
260
  - resource
261
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-controller
181
262
  - controller
182
- - namespace
183
263
  calls:
184
264
  - argument: 0
185
265
  camelize: true
@@ -192,12 +272,28 @@ dynamic:
192
272
  pluralize: true
193
273
  add_suffix: Controller
194
274
  split: '::'
275
+
276
+ # https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-namespace
277
+ - name: namespace
278
+ has_argument: module
279
+ calls:
280
+ argument: module
281
+ camelize: true
282
+ split: '::'
283
+ - name: namespace
284
+ unless:
285
+ has_argument: module
286
+ calls:
287
+ argument: 0
288
+ camelize: true
289
+ split: '::'
290
+
291
+ # this is not technically calling these,
292
+ # but it feels useful nonetheless as permit will (generally) be used to process
293
+ # before calling AR or AM #create or #update
195
294
  - name: permit
196
295
  calls:
197
296
  arguments: ['*', '**']
198
297
  keywords: '**'
199
298
  add_suffix: "="
200
299
  recursive: true
201
- - name: layout
202
- calls:
203
- argument: 0
@@ -0,0 +1,56 @@
1
+ # https://edgeguides.rubyonrails.org/action_text_overview.html
2
+
3
+ gems:
4
+ - activesupport
5
+ - activerecord
6
+ - activestorage
7
+ - actionpack
8
+
9
+ keep:
10
+ # https://edgeguides.rubyonrails.org/action_text_overview.html#rendering-attachments
11
+ - to_attachable_partial_path
12
+
13
+ dynamic:
14
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-rich_text_area
15
+ - name: rich_text_area
16
+ has_receiver: true
17
+ calls:
18
+ argument: 0
19
+ transforms:
20
+ - original
21
+ - add_suffix: '='
22
+
23
+ - name: rich_text_area
24
+ unless:
25
+ has_receiver: true
26
+ calls:
27
+ - argument: 1
28
+ transforms:
29
+ - original
30
+ - add_suffix: '='
31
+ - argument: 0
32
+ add_prefix: '@'
33
+
34
+ # https://edgeapi.rubyonrails.org/classes/ActionText/Attribute.html#method-i-has_rich_text
35
+ - name: has_rich_text
36
+ defines:
37
+ argument: 0
38
+ transforms:
39
+ # defines its own methods
40
+ - original
41
+ - add_suffix: '?'
42
+ - add_suffix: '='
43
+ # some scopes
44
+ - add_prefix: with_rich_text_
45
+ - { add_prefix: with_rich_text_, add_suffix: _and_embeds }
46
+ # and has_one with this prefix
47
+ - add_prefix: rich_text_
48
+ transforms:
49
+ # these are copied from has_one
50
+ - original
51
+ - add_suffix: '='
52
+ - add_prefix: build_
53
+ - add_prefix: create_
54
+ - { add_prefix: create_, add_suffix: '!' }
55
+ - add_prefix: reload_
56
+
@@ -1,64 +1,214 @@
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
- - has_suffix: Helper
7
- path: /app/helpers
2
+ # https://guides.rubyonrails.org/layouts_and_rendering.html#rendering-objects
3
+ - render_in
8
4
 
9
5
  dynamic:
6
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Base.html
7
+ - name: render
8
+ has_argument: 0
9
+ defines:
10
+ keywords:
11
+ unless:
12
+ # https://guides.rubyonrails.org/layouts_and_rendering.html#options-for-render
13
+ - content_type
14
+ - layout
15
+ - location
16
+ - status
17
+ - formats
18
+ - variants
19
+
20
+ # https://edgeapi.rubyonrails.org/classes/ActionView/PartialRenderer.html
21
+ - name: render
22
+ has_argument: [object, collection]
23
+ unless:
24
+ has_argument: as
25
+ defines:
26
+ argument: partial
27
+ delete_before_last: '/'
28
+
29
+ - name: render
30
+ all:
31
+ - has_argument: [object, collection]
32
+ - has_argument: as
33
+ defines: as
34
+
35
+ - name: render
36
+ defines:
37
+ argument: locals
38
+ nested:
39
+ keywords: '**'
40
+
41
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Template.html#method-i-local_assigns
42
+ - name: '[]'
43
+ has_receiver: local_assigns
44
+ calls: 0
45
+
46
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html
10
47
  - name:
11
- - check_box
12
- - date_select
13
- - datetime_select
14
- - file_field
15
- - hidden_field
16
- - label
17
- - radio_button
18
- - select
19
- - time_select
20
- - time_zone_select
21
- - color_field
22
- - date_field
23
- - datetime_field
24
- - datetime_local_field
25
- - email_field
26
- - month_field
27
- - number_field
28
- - password_field
29
- - phone_field
30
- - range_field
31
- - search_field
32
- - telephone_field
33
- - text_area
34
- - text_field
35
- - time_field
36
- - url_field
37
- - week_field
48
+ - check_box
49
+ - color_field
50
+ - date_field
51
+ - date_select
52
+ - datetime_field
53
+ - datetime_local_field
54
+ - datetime_select
55
+ - email_field
56
+ - file_field
57
+ - hidden_field
58
+ - month_field
59
+ - number_field
60
+ - password_field
61
+ - phone_field
62
+ - radio_button
63
+ - range_field
64
+ - search_field
65
+ - select
66
+ - telephone_field
67
+ - text_area
68
+ - text_field
69
+ - time_field
70
+ - time_select
71
+ - time_zone_select
72
+ - url_field
73
+ - week_field
74
+ - weekday_select
75
+ has_receiver: true
38
76
  calls:
39
- - arguments: [0,1] # 0: with a receiver, 1: with no receiver
40
- - arguments: [0,1]
41
- add_suffix: '='
77
+ - argument: 0
78
+ transforms:
79
+ - original
80
+ - add_suffix: '='
81
+
82
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-fields_for
83
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for
42
84
  - name: fields_for
85
+ has_receiver: true
43
86
  calls:
44
- argument: 1
45
- add_suffix: _attributes
46
- - name: options_from_collection_for_select
87
+ argument: 0
88
+ transforms:
89
+ add_suffix: _attributes=
90
+
91
+ - name: fields_for
92
+ unless:
93
+ any:
94
+ - has_receiver: true
95
+ - has_argument: 1
47
96
  calls:
48
- - arguments: [1,2]
97
+ argument: 0
98
+ add_prefix: '@'
99
+
100
+ - name: form_for
101
+ has_argument:
102
+ at: 0
103
+ has_value:
104
+ type: [String, Symbol]
105
+ calls:
106
+ argument: 0
107
+ add_prefix: '@'
108
+
109
+
110
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html
111
+ - name:
112
+ - check_box
113
+ - color_field
114
+ - date_field
115
+ - date_select
116
+ - datetime_field
117
+ - datetime_local_field
118
+ - datetime_select
119
+ - email_field
120
+ - file_field
121
+ - hidden_field
122
+ - month_field
123
+ - number_field
124
+ - password_field
125
+ - phone_field
126
+ - radio_button
127
+ - range_field
128
+ - search_field
129
+ - select
130
+ - telephone_field
131
+ - text_area
132
+ - text_field
133
+ - time_field
134
+ - time_select
135
+ - time_zone_select
136
+ - url_field
137
+ - week_field
138
+ - weekday_select
139
+ unless:
140
+ has_receiver: true
141
+ calls:
142
+ - argument: 1
143
+ transforms:
144
+ - original
145
+ - add_suffix: '='
146
+ - argument: 0
147
+ add_prefix: '@'
148
+
149
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-collection_check_boxes
49
150
  - name:
50
151
  - collection_select
51
152
  - collection_check_boxes
52
153
  - collection_radio_buttons
154
+ has_receiver: true
155
+ calls:
156
+ - argument: 0
157
+ transforms:
158
+ - original
159
+ - add_suffix: '='
160
+ - arguments: [2,3]
161
+
162
+ - name:
163
+ - collection_select
164
+ - collection_check_boxes
165
+ - collection_radio_buttons
166
+ unless:
167
+ has_receiver: true
53
168
  calls:
54
169
  - argument: 1
55
- add_suffix: '='
170
+ transforms:
171
+ - original
172
+ - add_suffix: '='
56
173
  - arguments: [3,4]
174
+ - argument: 0
175
+ add_prefix: '@'
176
+
177
+ - name: grouped_collection_select
178
+ has_receiver: true
179
+ calls:
180
+ - argument: 0
181
+ transforms:
182
+ - original
183
+ - add_suffix: '='
184
+ - arguments: [2,3,4,5]
185
+
57
186
  - name: grouped_collection_select
187
+ unless:
188
+ has_receiver: true
58
189
  calls:
59
190
  - argument: 1
60
- add_suffix: '='
191
+ transforms:
192
+ - original
193
+ - add_suffix: '='
61
194
  - arguments: [3,4,5,6]
195
+ - argument: 0
196
+ add_prefix: '@'
197
+
198
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-option_groups_from_collection_for_select
62
199
  - name: option_groups_from_collection_for_select
63
- calls:
64
- - arguments: [0,1,2,3]
200
+ calls: [1,2,3,4]
201
+
202
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_from_collection_for_select
203
+ - name: options_from_collection_for_select
204
+ calls: [1,2]
205
+
206
+
207
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Layouts.html
208
+ # https://edgeapi.rubyonrails.org/classes/ActionView/Layouts/ClassMethods.html#method-i-layout
209
+ - name: layout
210
+ has_argument:
211
+ at: 0
212
+ has_value:
213
+ type: Symbol
214
+ calls: 0
@@ -1,17 +1,20 @@
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.
1
+ gem:
2
+ - activesupport
3
+
5
4
  keep:
5
+ # https://guides.rubyonrails.org/active_job_basics.html#serializers
6
6
  - serialize?
7
7
  - serialize
8
8
  - deserialize
9
9
  dynamic:
10
+ # https://guides.rubyonrails.org/active_job_basics.html#enqueue-the-job
10
11
  - name:
11
12
  - perform_later
12
- - perform
13
+ - perform_now
13
14
  calls:
14
15
  - value: perform
16
+ # https://api.rubyonrails.org/v7.0.2.2/classes/ActiveJob/Callbacks/ClassMethods.html
17
+ # These all use if/unless because they call set_callback, though this isn't documented
15
18
  - names:
16
19
  - before_enqueue
17
20
  - around_enqueue
@@ -20,10 +23,14 @@ dynamic:
20
23
  - around_perform
21
24
  - after_perform
22
25
  calls:
23
- - arguments: 1
26
+ - arguments: 0
24
27
  - arguments: [if, unless]
25
28
  nested:
26
29
  arguments: '*'
27
- - name: rescue_from
30
+
31
+ # https://api.rubyonrails.org/v7.0.2.2/classes/ActiveJob/Exceptions/ClassMethods.html#method-i-discard_on
32
+ # https://api.rubyonrails.org/v7.0.2.2/classes/ActiveJob/Exceptions/ClassMethods.html#method-i-retry_on
33
+ - names: [discard_on, retry_on]
28
34
  calls:
29
- - arguments: 1
35
+ - argument: '*'
36
+ split: '::'