sorbet-rails 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +13 -1
  3. data/.travis.yml +2 -2
  4. data/Gemfile +1 -1
  5. data/README.md +79 -3
  6. data/lib/sorbet-rails.rb +5 -1
  7. data/lib/sorbet-rails/activerecord.rbi +27 -0
  8. data/lib/sorbet-rails/custom_finder_methods.rb +11 -0
  9. data/lib/sorbet-rails/helper_rbi_formatter.rb +33 -0
  10. data/lib/sorbet-rails/model_plugins/active_record_assoc.rb +91 -0
  11. data/lib/sorbet-rails/model_plugins/active_record_attribute.rb +111 -0
  12. data/lib/sorbet-rails/model_plugins/active_record_enum.rb +43 -0
  13. data/lib/sorbet-rails/model_plugins/active_record_finder_methods.rb +80 -0
  14. data/lib/sorbet-rails/model_plugins/active_record_named_scope.rb +28 -0
  15. data/lib/sorbet-rails/model_plugins/active_record_querying.rb +42 -0
  16. data/lib/sorbet-rails/model_plugins/active_relation_where_not.rb +28 -0
  17. data/lib/sorbet-rails/model_plugins/base.rb +33 -0
  18. data/lib/sorbet-rails/model_plugins/custom_finder_methods.rb +54 -0
  19. data/lib/sorbet-rails/model_plugins/enumerable_collections.rb +49 -0
  20. data/lib/sorbet-rails/model_plugins/plugins.rb +45 -0
  21. data/lib/sorbet-rails/model_rbi_formatter.rb +108 -362
  22. data/lib/sorbet-rails/model_utils.rb +45 -0
  23. data/lib/sorbet-rails/railtie.rb +1 -0
  24. data/lib/sorbet-rails/routes_rbi_formatter.rb +12 -3
  25. data/lib/sorbet-rails/tasks/rails_rbi.rake +36 -15
  26. data/lib/sorbet-rails/utils.rb +4 -0
  27. data/sorbet-rails.gemspec +4 -2
  28. data/spec/helper_rbi_formatter_spec.rb +13 -0
  29. data/spec/model_plugins_spec.rb +31 -0
  30. data/spec/model_rbi_formatter_spec.rb +5 -5
  31. data/spec/rake_rails_rbi_helpers_spec.rb +14 -0
  32. data/spec/routes_rbi_formatter_spec.rb +3 -3
  33. data/spec/sorbet_spec.rb +12 -16
  34. data/spec/support/rails_shared/app/controllers/application_controller.rb +1 -1
  35. data/spec/support/rails_shared/app/helpers/bar_helper.rb +2 -0
  36. data/spec/support/rails_shared/app/helpers/baz_helper.rb +2 -0
  37. data/spec/support/rails_shared/app/helpers/foo_helper.rb +2 -0
  38. data/spec/support/rails_shared/app/models/concerns/mythical.rb +10 -0
  39. data/spec/support/rails_shared/app/models/wand.rb +1 -0
  40. data/spec/support/rails_shared/config/initializers/sorbet_rails.rb +3 -0
  41. data/spec/support/rails_shared/lib/mythical_rbi_plugin.rb +16 -0
  42. data/spec/support/rails_shared/sorbet_test_cases.rb +5 -2
  43. data/spec/support/rails_shared/typed-override.yaml +2 -0
  44. data/spec/support/rails_symlinks/app/helpers +1 -0
  45. data/spec/support/rails_symlinks/config/initializers/sorbet_rails.rb +1 -0
  46. data/spec/support/rails_symlinks/lib/mythical_rbi_plugin.rb +1 -0
  47. data/spec/support/rails_symlinks/typed-override.yaml +1 -0
  48. data/spec/support/v4.2/Gemfile.lock +5 -0
  49. data/spec/support/v4.2/app/helpers +1 -0
  50. data/spec/support/v4.2/config/initializers/sorbet_rails.rb +1 -0
  51. data/spec/support/v4.2/config/routes.rb +0 -1
  52. data/spec/support/v4.2/lib/mythical_rbi_plugin.rb +1 -0
  53. data/spec/support/v4.2/sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi +1 -1
  54. data/spec/support/v4.2/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1 -1
  55. data/spec/support/v4.2/typed-override.yaml +1 -0
  56. data/spec/support/v5.0/Gemfile.lock +5 -0
  57. data/spec/support/v5.0/app/helpers +1 -0
  58. data/spec/support/v5.0/config/initializers/sorbet_rails.rb +1 -0
  59. data/spec/support/v5.0/config/routes.rb +0 -1
  60. data/spec/support/v5.0/lib/mythical_rbi_plugin.rb +1 -0
  61. data/spec/support/v5.0/sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi +1 -1
  62. data/spec/support/v5.0/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1 -1
  63. data/spec/support/v5.0/typed-override.yaml +1 -0
  64. data/spec/support/v5.1/Gemfile.lock +5 -0
  65. data/spec/support/v5.1/app/helpers +1 -0
  66. data/spec/support/v5.1/config/initializers/sorbet_rails.rb +1 -0
  67. data/spec/support/v5.1/lib/mythical_rbi_plugin.rb +1 -0
  68. data/spec/support/v5.1/sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi +1 -1
  69. data/spec/support/v5.1/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1 -1
  70. data/spec/support/v5.1/typed-override.yaml +1 -0
  71. data/spec/support/v5.2-no-sorbet/Gemfile +0 -2
  72. data/spec/support/v5.2-no-sorbet/Gemfile.lock +7 -5
  73. data/spec/support/v5.2-no-sorbet/app/helpers +1 -0
  74. data/spec/support/v5.2-no-sorbet/config/initializers/sorbet_rails.rb +1 -0
  75. data/spec/support/v5.2-no-sorbet/lib/mythical_rbi_plugin.rb +1 -0
  76. data/spec/support/v5.2-no-sorbet/sorbet_test_cases.rb +1 -0
  77. data/spec/support/v5.2-no-sorbet/typed-override.yaml +1 -0
  78. data/spec/support/v5.2/Gemfile +0 -2
  79. data/spec/support/v5.2/Gemfile.lock +7 -5
  80. data/spec/support/v5.2/app/helpers +1 -0
  81. data/spec/support/v5.2/config/initializers/sorbet_rails.rb +1 -0
  82. data/spec/support/v5.2/lib/mythical_rbi_plugin.rb +1 -0
  83. data/spec/support/v5.2/sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi +1 -1
  84. data/spec/support/v5.2/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1 -1
  85. data/spec/support/v5.2/typed-override.yaml +1 -0
  86. data/spec/support/v6.0/Gemfile +1 -3
  87. data/spec/support/v6.0/Gemfile.lock +61 -59
  88. data/spec/support/v6.0/app/helpers +1 -0
  89. data/spec/support/v6.0/config/initializers/sorbet_rails.rb +1 -0
  90. data/spec/support/v6.0/config/routes.rb +0 -1
  91. data/spec/support/v6.0/lib/mythical_rbi_plugin.rb +1 -0
  92. data/spec/support/v6.0/sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi +1 -1
  93. data/spec/support/v6.0/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1 -1
  94. data/spec/support/v6.0/typed-override.yaml +1 -0
  95. data/spec/test_data/v4.2/expected_helpers.rbi +17 -0
  96. data/spec/test_data/v4.2/expected_potion.rbi +259 -28
  97. data/spec/test_data/v4.2/expected_spell_book.rbi +278 -37
  98. data/spec/test_data/v4.2/expected_srb_tc_output.txt +1 -99
  99. data/spec/test_data/v4.2/expected_wand.rbi +345 -96
  100. data/spec/test_data/v4.2/expected_wizard.rbi +322 -76
  101. data/spec/test_data/v4.2/expected_wizard_wo_spellbook.rbi +322 -76
  102. data/spec/test_data/v5.0/expected_helpers.rbi +17 -0
  103. data/spec/test_data/v5.0/expected_internal_metadata.rbi +273 -37
  104. data/spec/test_data/v5.0/expected_potion.rbi +259 -28
  105. data/spec/test_data/v5.0/expected_schema_migration.rbi +264 -28
  106. data/spec/test_data/v5.0/expected_spell_book.rbi +278 -37
  107. data/spec/test_data/v5.0/expected_srb_tc_output.txt +1 -81
  108. data/spec/test_data/v5.0/expected_wand.rbi +341 -92
  109. data/spec/test_data/v5.0/expected_wizard.rbi +318 -72
  110. data/spec/test_data/v5.0/expected_wizard_wo_spellbook.rbi +318 -72
  111. data/spec/test_data/v5.1/expected_helpers.rbi +17 -0
  112. data/spec/test_data/v5.1/expected_internal_metadata.rbi +273 -37
  113. data/spec/test_data/v5.1/expected_potion.rbi +259 -28
  114. data/spec/test_data/v5.1/expected_schema_migration.rbi +264 -28
  115. data/spec/test_data/v5.1/expected_spell_book.rbi +278 -37
  116. data/spec/test_data/v5.1/expected_srb_tc_output.txt +1 -81
  117. data/spec/test_data/v5.1/expected_wand.rbi +341 -92
  118. data/spec/test_data/v5.1/expected_wizard.rbi +318 -72
  119. data/spec/test_data/v5.1/expected_wizard_wo_spellbook.rbi +318 -72
  120. data/spec/test_data/v5.2-no-sorbet/expected_attachment.rbi +265 -29
  121. data/spec/test_data/v5.2-no-sorbet/expected_blob.rbi +271 -35
  122. data/spec/test_data/v5.2-no-sorbet/expected_helpers.rbi +17 -0
  123. data/spec/test_data/v5.2-no-sorbet/expected_internal_metadata.rbi +273 -37
  124. data/spec/test_data/v5.2-no-sorbet/expected_potion.rbi +259 -28
  125. data/spec/test_data/v5.2-no-sorbet/expected_schema_migration.rbi +264 -28
  126. data/spec/test_data/v5.2-no-sorbet/expected_spell_book.rbi +278 -37
  127. data/spec/test_data/v5.2-no-sorbet/expected_srb_tc_output.txt +1 -81
  128. data/spec/test_data/v5.2-no-sorbet/expected_wand.rbi +351 -102
  129. data/spec/test_data/v5.2-no-sorbet/expected_wizard.rbi +318 -72
  130. data/spec/test_data/v5.2-no-sorbet/expected_wizard_wo_spellbook.rbi +318 -72
  131. data/spec/test_data/v5.2/expected_attachment.rbi +265 -29
  132. data/spec/test_data/v5.2/expected_blob.rbi +271 -35
  133. data/spec/test_data/v5.2/expected_helpers.rbi +17 -0
  134. data/spec/test_data/v5.2/expected_internal_metadata.rbi +273 -37
  135. data/spec/test_data/v5.2/expected_potion.rbi +259 -28
  136. data/spec/test_data/v5.2/expected_schema_migration.rbi +264 -28
  137. data/spec/test_data/v5.2/expected_spell_book.rbi +278 -37
  138. data/spec/test_data/v5.2/expected_srb_tc_output.txt +1 -81
  139. data/spec/test_data/v5.2/expected_wand.rbi +351 -102
  140. data/spec/test_data/v5.2/expected_wizard.rbi +318 -72
  141. data/spec/test_data/v5.2/expected_wizard_wo_spellbook.rbi +318 -72
  142. data/spec/test_data/v6.0/expected_attachment.rbi +265 -29
  143. data/spec/test_data/v6.0/expected_blob.rbi +271 -35
  144. data/spec/test_data/v6.0/expected_helpers.rbi +17 -0
  145. data/spec/test_data/v6.0/expected_internal_metadata.rbi +273 -37
  146. data/spec/test_data/v6.0/expected_potion.rbi +259 -28
  147. data/spec/test_data/v6.0/expected_schema_migration.rbi +264 -28
  148. data/spec/test_data/v6.0/expected_spell_book.rbi +278 -37
  149. data/spec/test_data/v6.0/expected_srb_tc_output.txt +1 -81
  150. data/spec/test_data/v6.0/expected_wand.rbi +351 -102
  151. data/spec/test_data/v6.0/expected_wizard.rbi +318 -72
  152. data/spec/test_data/v6.0/expected_wizard_wo_spellbook.rbi +318 -72
  153. metadata +120 -37
  154. data/lib/sorbet-rails/rbi/activerecord.rbi +0 -207
  155. data/spec/support/v4.2/app/helpers/application_helper.rb +0 -3
  156. data/spec/support/v4.2/sorbet/rbi/gems/sorbet-runtime.rbi +0 -647
  157. data/spec/support/v4.2/sorbet/rbi/hidden-definitions/errors.txt +0 -11998
  158. data/spec/support/v4.2/sorbet/rbi/hidden-definitions/hidden.rbi +0 -27774
  159. data/spec/support/v5.0/sorbet/rbi/gems/sorbet-runtime.rbi +0 -647
  160. data/spec/support/v5.0/sorbet/rbi/hidden-definitions/errors.txt +0 -10523
  161. data/spec/support/v5.0/sorbet/rbi/hidden-definitions/hidden.rbi +0 -24969
  162. data/spec/support/v5.1/sorbet/rbi/gems/sorbet-runtime.rbi +0 -647
  163. data/spec/support/v5.1/sorbet/rbi/hidden-definitions/errors.txt +0 -10226
  164. data/spec/support/v5.1/sorbet/rbi/hidden-definitions/hidden.rbi +0 -24635
  165. data/spec/support/v5.2/.ruby-version +0 -1
  166. data/spec/support/v5.2/sorbet/rbi/gems/sorbet-runtime.rbi +0 -644
  167. data/spec/support/v5.2/sorbet/rbi/hidden-definitions/errors.txt +0 -10046
  168. data/spec/support/v5.2/sorbet/rbi/hidden-definitions/hidden.rbi +0 -24424
  169. data/spec/support/v6.0/sorbet/rbi/gems/sorbet-runtime.rbi +0 -647
  170. data/spec/support/v6.0/sorbet/rbi/hidden-definitions/errors.txt +0 -12074
  171. data/spec/support/v6.0/sorbet/rbi/hidden-definitions/hidden.rbi +0 -28231
@@ -1,11 +1,3 @@
1
- sorbet_test_cases.rb:14: Argument does not have asserted type `ActiveRecord::Associations::CollectionProxy` https://srb.help/7007
2
- 14 |T.assert_type!(wizard.spell_books, ActiveRecord::Associations::CollectionProxy)
3
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4
- Got SpellBook::ActiveRecord_Associations_CollectionProxy originating from:
5
- sorbet_test_cases.rb:14:
6
- 14 |T.assert_type!(wizard.spell_books, ActiveRecord::Associations::CollectionProxy)
7
- ^^^^^^^^^^^^^^^^^^
8
-
9
1
  sorbet_test_cases.rb:15: Revealed type: `SpellBook::ActiveRecord_Associations_CollectionProxy` https://srb.help/7014
10
2
  15 |T.reveal_type(wizard.spell_books) # SpellBook::CollectionProxy
11
3
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -14,14 +6,6 @@ sorbet_test_cases.rb:15: Revealed type: `SpellBook::ActiveRecord_Associations_Co
14
6
  15 |T.reveal_type(wizard.spell_books) # SpellBook::CollectionProxy
15
7
  ^^^^^^^^^^^^^^^^^^
16
8
 
17
- sorbet_test_cases.rb:19: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
18
- 19 |T.assert_type!(Wizard.all, ActiveRecord::Relation)
19
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
20
- Got Wizard::ActiveRecord_Relation originating from:
21
- sorbet_test_cases.rb:19:
22
- 19 |T.assert_type!(Wizard.all, ActiveRecord::Relation)
23
- ^^^^^^^^^^
24
-
25
9
  sorbet_test_cases.rb:20: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
26
10
  20 |T.reveal_type(Wizard.all) # Wizard::ActiveRecord_Relation
27
11
  ^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -30,14 +14,6 @@ sorbet_test_cases.rb:20: Revealed type: `Wizard::ActiveRecord_Relation` https://
30
14
  20 |T.reveal_type(Wizard.all) # Wizard::ActiveRecord_Relation
31
15
  ^^^^^^^^^^
32
16
 
33
- sorbet_test_cases.rb:23: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
34
- 23 |T.assert_type!(Wizard.recent, ActiveRecord::Relation)
35
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
36
- Got Wizard::ActiveRecord_Relation originating from:
37
- sorbet_test_cases.rb:23:
38
- 23 |T.assert_type!(Wizard.recent, ActiveRecord::Relation)
39
- ^^^^^^^^^^^^^
40
-
41
17
  sorbet_test_cases.rb:24: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
42
18
  24 |T.reveal_type(Wizard.recent)
43
19
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -46,14 +22,6 @@ sorbet_test_cases.rb:24: Revealed type: `Wizard::ActiveRecord_Relation` https://
46
22
  24 |T.reveal_type(Wizard.recent)
47
23
  ^^^^^^^^^^^^^
48
24
 
49
- sorbet_test_cases.rb:27: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
50
- 27 |T.assert_type!(Wizard.Gryffindor, ActiveRecord::Relation)
51
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
52
- Got Wizard::ActiveRecord_Relation originating from:
53
- sorbet_test_cases.rb:27:
54
- 27 |T.assert_type!(Wizard.Gryffindor, ActiveRecord::Relation)
55
- ^^^^^^^^^^^^^^^^^
56
-
57
25
  sorbet_test_cases.rb:28: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
58
26
  28 |T.reveal_type(Wizard.Gryffindor)
59
27
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -62,14 +30,6 @@ sorbet_test_cases.rb:28: Revealed type: `Wizard::ActiveRecord_Relation` https://
62
30
  28 |T.reveal_type(Wizard.Gryffindor)
63
31
  ^^^^^^^^^^^^^^^^^
64
32
 
65
- sorbet_test_cases.rb:31: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
66
- 31 |T.assert_type!(Wizard.Gryffindor.recent, ActiveRecord::Relation)
67
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
68
- Got Wizard::ActiveRecord_Relation originating from:
69
- sorbet_test_cases.rb:31:
70
- 31 |T.assert_type!(Wizard.Gryffindor.recent, ActiveRecord::Relation)
71
- ^^^^^^^^^^^^^^^^^^^^^^^^
72
-
73
33
  sorbet_test_cases.rb:32: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
74
34
  32 |T.reveal_type(Wizard.Gryffindor.recent)
75
35
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -78,14 +38,6 @@ sorbet_test_cases.rb:32: Revealed type: `Wizard::ActiveRecord_Relation` https://
78
38
  32 |T.reveal_type(Wizard.Gryffindor.recent)
79
39
  ^^^^^^^^^^^^^^^^^^^^^^^^
80
40
 
81
- sorbet_test_cases.rb:33: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
82
- 33 |T.assert_type!(Wizard.Gryffindor.recent.unscoped, ActiveRecord::Relation)
83
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
84
- Got Wizard::ActiveRecord_Relation originating from:
85
- sorbet_test_cases.rb:33:
86
- 33 |T.assert_type!(Wizard.Gryffindor.recent.unscoped, ActiveRecord::Relation)
87
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
88
-
89
41
  sorbet_test_cases.rb:34: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
90
42
  34 |T.reveal_type(Wizard.Gryffindor.recent.unscoped)
91
43
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -94,14 +46,6 @@ sorbet_test_cases.rb:34: Revealed type: `Wizard::ActiveRecord_Relation` https://
94
46
  34 |T.reveal_type(Wizard.Gryffindor.recent.unscoped)
95
47
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
96
48
 
97
- sorbet_test_cases.rb:37: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
98
- 37 |T.assert_type!(Wizard.where(id: 1), ActiveRecord::Relation)
99
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
100
- Got Wizard::ActiveRecord_Relation originating from:
101
- sorbet_test_cases.rb:37:
102
- 37 |T.assert_type!(Wizard.where(id: 1), ActiveRecord::Relation)
103
- ^^^^^^^^^^^^^^^^^^^
104
-
105
49
  sorbet_test_cases.rb:38: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
106
50
  38 |T.reveal_type(Wizard.where(id: 1)) # Wizard::Relation
107
51
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -110,14 +54,6 @@ sorbet_test_cases.rb:38: Revealed type: `Wizard::ActiveRecord_Relation` https://
110
54
  38 |T.reveal_type(Wizard.where(id: 1)) # Wizard::Relation
111
55
  ^^^^^^^^^^^^^^^^^^^
112
56
 
113
- sorbet_test_cases.rb:39: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
114
- 39 |T.assert_type!(Wizard.preload(:spell_books), ActiveRecord::Relation)
115
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
116
- Got Wizard::ActiveRecord_Relation originating from:
117
- sorbet_test_cases.rb:39:
118
- 39 |T.assert_type!(Wizard.preload(:spell_books), ActiveRecord::Relation)
119
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
120
-
121
57
  sorbet_test_cases.rb:40: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
122
58
  40 |T.reveal_type(Wizard.preload(:spell_books)) # Wizard::Relation
123
59
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -126,14 +62,6 @@ sorbet_test_cases.rb:40: Revealed type: `Wizard::ActiveRecord_Relation` https://
126
62
  40 |T.reveal_type(Wizard.preload(:spell_books)) # Wizard::Relation
127
63
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
128
64
 
129
- sorbet_test_cases.rb:41: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
130
- 41 |T.assert_type!(Wizard.eager_load(:spell_books), ActiveRecord::Relation)
131
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
132
- Got Wizard::ActiveRecord_Relation originating from:
133
- sorbet_test_cases.rb:41:
134
- 41 |T.assert_type!(Wizard.eager_load(:spell_books), ActiveRecord::Relation)
135
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
136
-
137
65
  sorbet_test_cases.rb:42: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
138
66
  42 |T.reveal_type(Wizard.eager_load(:spell_books)) # Wizard::Relation
139
67
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -142,14 +70,6 @@ sorbet_test_cases.rb:42: Revealed type: `Wizard::ActiveRecord_Relation` https://
142
70
  42 |T.reveal_type(Wizard.eager_load(:spell_books)) # Wizard::Relation
143
71
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
144
72
 
145
- sorbet_test_cases.rb:43: Argument does not have asserted type `ActiveRecord::Relation` https://srb.help/7007
146
- 43 |T.assert_type!(Wizard.order(:id), ActiveRecord::Relation)
147
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
148
- Got Wizard::ActiveRecord_Relation originating from:
149
- sorbet_test_cases.rb:43:
150
- 43 |T.assert_type!(Wizard.order(:id), ActiveRecord::Relation)
151
- ^^^^^^^^^^^^^^^^^
152
-
153
73
  sorbet_test_cases.rb:44: Revealed type: `Wizard::ActiveRecord_Relation` https://srb.help/7014
154
74
  44 |T.reveal_type(Wizard.order(:id)) # Wizard::Relation
155
75
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -157,4 +77,4 @@ sorbet_test_cases.rb:44: Revealed type: `Wizard::ActiveRecord_Relation` https://
157
77
  sorbet_test_cases.rb:44:
158
78
  44 |T.reveal_type(Wizard.order(:id)) # Wizard::Relation
159
79
  ^^^^^^^^^^^^^^^^^
160
- Errors: 20
80
+ Errors: 10
@@ -1,216 +1,288 @@
1
1
  # This is an autogenerated file for dynamic methods in Wand
2
- # Please rerun rake rails_rbi:models to regenerate.
2
+ # Please rerun rake rails_rbi:models[Wand] to regenerate.
3
+
3
4
  # typed: strong
5
+ module Wand::EnumInstanceMethods
6
+ extend T::Sig
4
7
 
5
- class Wand::ActiveRecord_Relation < ActiveRecord::Relation
6
- include Wand::ModelRelationShared
7
- extend T::Generic
8
- Elem = type_member(fixed: Wand)
9
- end
8
+ sig { returns(T::Boolean) }
9
+ def phoenix_feather?; end
10
10
 
11
- class Wand::ActiveRecord_Associations_CollectionProxy < ActiveRecord::Associations::CollectionProxy
12
- include Wand::ModelRelationShared
13
- extend T::Generic
14
- Elem = type_member(fixed: Wand)
15
- end
11
+ sig { void }
12
+ def phoenix_feather!; end
16
13
 
17
- class Wand < ApplicationRecord
18
- extend T::Sig
19
- extend T::Generic
20
- extend Wand::ModelRelationShared
21
- include Wand::InstanceMethods
22
- Elem = type_template(fixed: Wand)
23
- end
14
+ sig { returns(T::Boolean) }
15
+ def dragon_heartstring?; end
24
16
 
25
- module Wand::InstanceMethods
26
- extend T::Sig
17
+ sig { void }
18
+ def dragon_heartstring!; end
19
+
20
+ sig { returns(T::Boolean) }
21
+ def unicorn_tail_hair?; end
27
22
 
28
23
  sig { void }
29
- def basilisk_horn!(); end
24
+ def unicorn_tail_hair!; end
30
25
 
31
26
  sig { returns(T::Boolean) }
32
- def basilisk_horn?(); end
27
+ def basilisk_horn?; end
28
+
29
+ sig { void }
30
+ def basilisk_horn!; end
31
+ end
32
+
33
+ module Wand::ActiveRelation_WhereNot
34
+ sig { params(opts: T.untyped, rest: T.untyped).returns(T.self_type) }
35
+ def not(opts, *rest); end
36
+ end
37
+
38
+ module Wand::GeneratedAttributeMethods
39
+ extend T::Sig
33
40
 
34
41
  sig { returns(T::Boolean) }
35
- def broken(); end
42
+ def broken; end
36
43
 
37
44
  sig { params(value: T::Boolean).void }
38
45
  def broken=(value); end
39
46
 
40
- sig { params(args: T.untyped).returns(T::Boolean) }
41
- def broken?(*args); end
47
+ sig { returns(T::Boolean) }
48
+ def broken?; end
42
49
 
43
50
  sig { returns(T.nilable(Date)) }
44
- def chosen_at_date(); end
51
+ def chosen_at_date; end
45
52
 
46
53
  sig { params(value: T.nilable(Date)).void }
47
54
  def chosen_at_date=(value); end
48
55
 
49
- sig { params(args: T.untyped).returns(T::Boolean) }
50
- def chosen_at_date?(*args); end
56
+ sig { returns(T::Boolean) }
57
+ def chosen_at_date?; end
51
58
 
52
59
  sig { returns(T.nilable(Time)) }
53
- def chosen_at_time(); end
60
+ def chosen_at_time; end
54
61
 
55
62
  sig { params(value: T.nilable(Time)).void }
56
63
  def chosen_at_time=(value); end
57
64
 
58
- sig { params(args: T.untyped).returns(T::Boolean) }
59
- def chosen_at_time?(*args); end
65
+ sig { returns(T::Boolean) }
66
+ def chosen_at_time?; end
60
67
 
61
- sig { returns(String) }
62
- def core_type(); end
68
+ sig { returns(T.nilable(String)) }
69
+ def core_type; end
63
70
 
64
71
  sig { params(value: T.nilable(T.any(Integer, String, Symbol))).void }
65
72
  def core_type=(value); end
66
73
 
67
- sig { params(args: T.untyped).returns(T::Boolean) }
68
- def core_type?(*args); end
74
+ sig { returns(T::Boolean) }
75
+ def core_type?; end
69
76
 
70
77
  sig { returns(DateTime) }
71
- def created_at(); end
78
+ def created_at; end
72
79
 
73
80
  sig { params(value: DateTime).void }
74
81
  def created_at=(value); end
75
82
 
76
- sig { params(args: T.untyped).returns(T::Boolean) }
77
- def created_at?(*args); end
78
-
79
- sig { void }
80
- def dragon_heartstring!(); end
81
-
82
83
  sig { returns(T::Boolean) }
83
- def dragon_heartstring?(); end
84
+ def created_at?; end
84
85
 
85
86
  sig { returns(Float) }
86
- def flexibility(); end
87
+ def flexibility; end
87
88
 
88
89
  sig { params(value: Float).void }
89
90
  def flexibility=(value); end
90
91
 
91
- sig { params(args: T.untyped).returns(T::Boolean) }
92
- def flexibility?(*args); end
92
+ sig { returns(T::Boolean) }
93
+ def flexibility?; end
93
94
 
94
95
  sig { returns(BigDecimal) }
95
- def hardness(); end
96
+ def hardness; end
96
97
 
97
98
  sig { params(value: BigDecimal).void }
98
99
  def hardness=(value); end
99
100
 
100
- sig { params(args: T.untyped).returns(T::Boolean) }
101
- def hardness?(*args); end
101
+ sig { returns(T::Boolean) }
102
+ def hardness?; end
102
103
 
103
104
  sig { returns(Integer) }
104
- def id(); end
105
+ def id; end
105
106
 
106
107
  sig { params(value: Integer).void }
107
108
  def id=(value); end
108
109
 
109
- sig { params(args: T.untyped).returns(T::Boolean) }
110
- def id?(*args); end
110
+ sig { returns(T::Boolean) }
111
+ def id?; end
111
112
 
112
- sig { returns(T.any(Array, T::Boolean, Float, Hash, Integer, String)) }
113
- def maker_info(); end
113
+ sig { returns(T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[T.untyped, T.untyped], Integer, String)) }
114
+ def maker_info; end
114
115
 
115
- sig { params(value: T.any(Array, T::Boolean, Float, Hash, Integer, String)).void }
116
+ sig { params(value: T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[T.untyped, T.untyped], Integer, String)).void }
116
117
  def maker_info=(value); end
117
118
 
118
- sig { params(args: T.untyped).returns(T::Boolean) }
119
- def maker_info?(*args); end
120
-
121
- sig { void }
122
- def phoenix_feather!(); end
123
-
124
119
  sig { returns(T::Boolean) }
125
- def phoenix_feather?(); end
120
+ def maker_info?; end
126
121
 
127
122
  sig { returns(Integer) }
128
- def reflectance(); end
123
+ def reflectance; end
129
124
 
130
125
  sig { params(value: Integer).void }
131
126
  def reflectance=(value); end
132
127
 
133
- sig { params(args: T.untyped).returns(T::Boolean) }
134
- def reflectance?(*args); end
128
+ sig { returns(T::Boolean) }
129
+ def reflectance?; end
135
130
 
136
- sig { returns(T.nilable(T.any(Array, T::Boolean, Float, Hash, Integer, String))) }
137
- def spell_history(); end
131
+ sig { returns(T.nilable(T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[T.untyped, T.untyped], Integer, String))) }
132
+ def spell_history; end
138
133
 
139
- sig { params(value: T.nilable(T.any(Array, T::Boolean, Float, Hash, Integer, String))).void }
134
+ sig { params(value: T.nilable(T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[T.untyped, T.untyped], Integer, String))).void }
140
135
  def spell_history=(value); end
141
136
 
142
- sig { params(args: T.untyped).returns(T::Boolean) }
143
- def spell_history?(*args); end
144
-
145
- sig { void }
146
- def unicorn_tail_hair!(); end
147
-
148
137
  sig { returns(T::Boolean) }
149
- def unicorn_tail_hair?(); end
138
+ def spell_history?; end
150
139
 
151
140
  sig { returns(DateTime) }
152
- def updated_at(); end
141
+ def updated_at; end
153
142
 
154
143
  sig { params(value: DateTime).void }
155
144
  def updated_at=(value); end
156
145
 
157
- sig { params(args: T.untyped).returns(T::Boolean) }
158
- def updated_at?(*args); end
146
+ sig { returns(T::Boolean) }
147
+ def updated_at?; end
159
148
 
160
149
  sig { returns(Integer) }
161
- def wizard_id(); end
150
+ def wizard_id; end
162
151
 
163
152
  sig { params(value: Integer).void }
164
153
  def wizard_id=(value); end
165
154
 
166
- sig { params(args: T.untyped).returns(T::Boolean) }
167
- def wizard_id?(*args); end
155
+ sig { returns(T::Boolean) }
156
+ def wizard_id?; end
168
157
 
169
158
  sig { returns(T.nilable(String)) }
170
- def wood_type(); end
159
+ def wood_type; end
171
160
 
172
161
  sig { params(value: T.nilable(String)).void }
173
162
  def wood_type=(value); end
174
163
 
175
- sig { params(args: T.untyped).returns(T::Boolean) }
176
- def wood_type?(*args); end
177
-
164
+ sig { returns(T::Boolean) }
165
+ def wood_type?; end
178
166
  end
179
167
 
180
- class Wand
168
+ module Wand::GeneratedAssociationMethods
181
169
  extend T::Sig
182
170
 
183
171
  sig { returns(::Wizard) }
184
- def wizard(); end
172
+ def wizard; end
185
173
 
186
174
  sig { params(value: ::Wizard).void }
187
175
  def wizard=(value); end
176
+ end
188
177
 
189
- sig { params(args: T.untyped).returns(Wand::ActiveRecord_Relation) }
190
- def self.basilisk_horn(*args); end
191
-
192
- sig { returns(T::Hash[T.any(String, Symbol), Integer]) }
193
- def self.core_types(); end
178
+ module Wand::CustomFinderMethods
179
+ sig { params(limit: Integer).returns(T::Array[Wand]) }
180
+ def first_n(limit); end
194
181
 
195
- sig { params(args: T.untyped).returns(Wand::ActiveRecord_Relation) }
196
- def self.dragon_heartstring(*args); end
182
+ sig { params(limit: Integer).returns(T::Array[Wand]) }
183
+ def last_n(limit); end
197
184
 
198
- sig { params(args: T.untyped).returns(Wand::ActiveRecord_Relation) }
199
- def self.phoenix_feather(*args); end
185
+ sig { params(args: T::Array[T.any(Integer, String)]).returns(T::Array[Wand]) }
186
+ def find_n(*args); end
200
187
 
201
- sig { params(args: T.untyped).returns(Wand::ActiveRecord_Relation) }
202
- def self.unicorn_tail_hair(*args); end
188
+ sig { params(id: Integer).returns(T.nilable(Wand)) }
189
+ def find_by_id(id); end
203
190
 
191
+ sig { params(id: Integer).returns(Wand) }
192
+ def find_by_id!(id); end
204
193
  end
205
194
 
206
- module Wand::ModelRelationShared
195
+ class Wand < ApplicationRecord
196
+ include Wand::EnumInstanceMethods
197
+ include Wand::GeneratedAttributeMethods
198
+ include Wand::GeneratedAssociationMethods
199
+ extend SorbetRails::CustomFinderMethods
200
+ extend Wand::CustomFinderMethods
207
201
  extend T::Sig
202
+ extend T::Generic
203
+ extend Wand::ModelRelationShared
204
+
205
+ sig { returns(T::Hash[T.any(String, Symbol), Integer]) }
206
+ def self.core_types; end
208
207
 
209
208
  sig { returns(Wand::ActiveRecord_Relation) }
210
- def all(); end
209
+ def self.phoenix_feather; end
211
210
 
212
- sig { params(block: T.nilable(T.proc.void)).returns(Wand::ActiveRecord_Relation) }
213
- def unscoped(&block); end
211
+ sig { returns(Wand::ActiveRecord_Relation) }
212
+ def self.dragon_heartstring; end
213
+
214
+ sig { returns(Wand::ActiveRecord_Relation) }
215
+ def self.unicorn_tail_hair; end
216
+
217
+ sig { returns(Wand::ActiveRecord_Relation) }
218
+ def self.basilisk_horn; end
219
+
220
+ sig { params(args: T.untyped).returns(Wand) }
221
+ def self.find(*args); end
222
+
223
+ sig { params(args: T.untyped).returns(T.nilable(Wand)) }
224
+ def self.find_by(*args); end
225
+
226
+ sig { params(args: T.untyped).returns(Wand) }
227
+ def self.find_by!(*args); end
228
+
229
+ sig { returns(T.nilable(Wand)) }
230
+ def self.first; end
231
+
232
+ sig { returns(Wand) }
233
+ def self.first!; end
234
+
235
+ sig { returns(T.nilable(Wand)) }
236
+ def self.second; end
237
+
238
+ sig { returns(Wand) }
239
+ def self.second!; end
240
+
241
+ sig { returns(T.nilable(Wand)) }
242
+ def self.third; end
243
+
244
+ sig { returns(Wand) }
245
+ def self.third!; end
246
+
247
+ sig { returns(T.nilable(Wand)) }
248
+ def self.third_to_last; end
249
+
250
+ sig { returns(Wand) }
251
+ def self.third_to_last!; end
252
+
253
+ sig { returns(T.nilable(Wand)) }
254
+ def self.second_to_last; end
255
+
256
+ sig { returns(Wand) }
257
+ def self.second_to_last!; end
258
+
259
+ sig { returns(T.nilable(Wand)) }
260
+ def self.last; end
261
+
262
+ sig { returns(Wand) }
263
+ def self.last!; end
264
+
265
+ sig { params(conditions: T.untyped).returns(T::Boolean) }
266
+ def self.exists?(conditions = nil); end
267
+
268
+ sig { params(args: T.untyped).returns(T::Boolean) }
269
+ def self.any?(*args); end
270
+
271
+ sig { params(args: T.untyped).returns(T::Boolean) }
272
+ def self.many?(*args); end
273
+
274
+ sig { params(args: T.untyped).returns(T::Boolean) }
275
+ def self.none?(*args); end
276
+
277
+ sig { params(args: T.untyped).returns(T::Boolean) }
278
+ def self.one?(*args); end
279
+
280
+ sig { returns(T::Array[Wand]) }
281
+ def self.mythicals; end
282
+ end
283
+
284
+ module Wand::ModelRelationShared
285
+ extend T::Sig
214
286
 
215
287
  sig { params(args: T.untyped).returns(Wand::ActiveRecord_Relation) }
216
288
  def basilisk_horn(*args); end
@@ -227,6 +299,12 @@ module Wand::ModelRelationShared
227
299
  sig { params(args: T.untyped).returns(Wand::ActiveRecord_Relation) }
228
300
  def unicorn_tail_hair(*args); end
229
301
 
302
+ sig { returns(Wand::ActiveRecord_Relation) }
303
+ def all; end
304
+
305
+ sig { params(block: T.nilable(T.proc.void)).returns(Wand::ActiveRecord_Relation) }
306
+ def unscoped(&block); end
307
+
230
308
  sig { params(args: T.untyped, block: T.nilable(T.proc.void)).returns(Wand::ActiveRecord_Relation) }
231
309
  def select(*args, &block); end
232
310
 
@@ -307,5 +385,176 @@ module Wand::ModelRelationShared
307
385
 
308
386
  sig { params(args: T.untyped, block: T.nilable(T.proc.void)).returns(Wand::ActiveRecord_Relation) }
309
387
  def except(*args, &block); end
388
+ end
389
+
390
+ class Wand::ActiveRecord_Relation < ActiveRecord::Relation
391
+ include Wand::ActiveRelation_WhereNot
392
+ include SorbetRails::CustomFinderMethods
393
+ include Wand::CustomFinderMethods
394
+ include Enumerable
395
+ include Wand::ModelRelationShared
396
+ extend T::Sig
397
+ extend T::Generic
398
+ Elem = type_member(fixed: Wand)
399
+
400
+ sig { params(args: T.untyped).returns(Wand) }
401
+ def find(*args); end
402
+
403
+ sig { params(args: T.untyped).returns(T.nilable(Wand)) }
404
+ def find_by(*args); end
405
+
406
+ sig { params(args: T.untyped).returns(Wand) }
407
+ def find_by!(*args); end
408
+
409
+ sig { returns(T.nilable(Wand)) }
410
+ def first; end
411
+
412
+ sig { returns(Wand) }
413
+ def first!; end
414
+
415
+ sig { returns(T.nilable(Wand)) }
416
+ def second; end
417
+
418
+ sig { returns(Wand) }
419
+ def second!; end
420
+
421
+ sig { returns(T.nilable(Wand)) }
422
+ def third; end
423
+
424
+ sig { returns(Wand) }
425
+ def third!; end
426
+
427
+ sig { returns(T.nilable(Wand)) }
428
+ def third_to_last; end
429
+
430
+ sig { returns(Wand) }
431
+ def third_to_last!; end
432
+
433
+ sig { returns(T.nilable(Wand)) }
434
+ def second_to_last; end
435
+
436
+ sig { returns(Wand) }
437
+ def second_to_last!; end
438
+
439
+ sig { returns(T.nilable(Wand)) }
440
+ def last; end
441
+
442
+ sig { returns(Wand) }
443
+ def last!; end
444
+
445
+ sig { params(conditions: T.untyped).returns(T::Boolean) }
446
+ def exists?(conditions = nil); end
447
+
448
+ sig { params(args: T.untyped).returns(T::Boolean) }
449
+ def any?(*args); end
450
+
451
+ sig { params(args: T.untyped).returns(T::Boolean) }
452
+ def many?(*args); end
453
+
454
+ sig { params(args: T.untyped).returns(T::Boolean) }
455
+ def none?(*args); end
456
+
457
+ sig { params(args: T.untyped).returns(T::Boolean) }
458
+ def one?(*args); end
459
+
460
+ sig { implementation.params(block: T.proc.params(e: Wand).void).void }
461
+ def each(&block); end
462
+
463
+ sig { params(level: T.nilable(Integer)).returns(T::Array[Wand]) }
464
+ def flatten(level); end
465
+
466
+ sig { returns(T::Array[Wand]) }
467
+ def to_a; end
468
+ end
469
+
470
+ class Wand::ActiveRecord_Associations_CollectionProxy < ActiveRecord::Associations::CollectionProxy
471
+ include Wand::ActiveRelation_WhereNot
472
+ include SorbetRails::CustomFinderMethods
473
+ include Wand::CustomFinderMethods
474
+ include Enumerable
475
+ include Wand::ModelRelationShared
476
+ extend T::Sig
477
+ extend T::Generic
478
+ Elem = type_member(fixed: Wand)
479
+
480
+ sig { params(args: T.untyped).returns(Wand) }
481
+ def find(*args); end
482
+
483
+ sig { params(args: T.untyped).returns(T.nilable(Wand)) }
484
+ def find_by(*args); end
485
+
486
+ sig { params(args: T.untyped).returns(Wand) }
487
+ def find_by!(*args); end
488
+
489
+ sig { returns(T.nilable(Wand)) }
490
+ def first; end
491
+
492
+ sig { returns(Wand) }
493
+ def first!; end
494
+
495
+ sig { returns(T.nilable(Wand)) }
496
+ def second; end
497
+
498
+ sig { returns(Wand) }
499
+ def second!; end
500
+
501
+ sig { returns(T.nilable(Wand)) }
502
+ def third; end
503
+
504
+ sig { returns(Wand) }
505
+ def third!; end
506
+
507
+ sig { returns(T.nilable(Wand)) }
508
+ def third_to_last; end
509
+
510
+ sig { returns(Wand) }
511
+ def third_to_last!; end
512
+
513
+ sig { returns(T.nilable(Wand)) }
514
+ def second_to_last; end
515
+
516
+ sig { returns(Wand) }
517
+ def second_to_last!; end
518
+
519
+ sig { returns(T.nilable(Wand)) }
520
+ def last; end
521
+
522
+ sig { returns(Wand) }
523
+ def last!; end
524
+
525
+ sig { params(conditions: T.untyped).returns(T::Boolean) }
526
+ def exists?(conditions = nil); end
527
+
528
+ sig { params(args: T.untyped).returns(T::Boolean) }
529
+ def any?(*args); end
530
+
531
+ sig { params(args: T.untyped).returns(T::Boolean) }
532
+ def many?(*args); end
533
+
534
+ sig { params(args: T.untyped).returns(T::Boolean) }
535
+ def none?(*args); end
536
+
537
+ sig { params(args: T.untyped).returns(T::Boolean) }
538
+ def one?(*args); end
539
+
540
+ sig { implementation.params(block: T.proc.params(e: Wand).void).void }
541
+ def each(&block); end
542
+
543
+ sig { params(level: T.nilable(Integer)).returns(T::Array[Wand]) }
544
+ def flatten(level); end
545
+
546
+ sig { returns(T::Array[Wand]) }
547
+ def to_a; end
548
+
549
+ sig { params(records: T.any(Wand, T::Array[Wand])).returns(T.self_type) }
550
+ def <<(*records); end
551
+
552
+ sig { params(records: T.any(Wand, T::Array[Wand])).returns(T.self_type) }
553
+ def append(*records); end
554
+
555
+ sig { params(records: T.any(Wand, T::Array[Wand])).returns(T.self_type) }
556
+ def push(*records); end
310
557
 
558
+ sig { params(records: T.any(Wand, T::Array[Wand])).returns(T.self_type) }
559
+ def concat(*records); end
311
560
  end