tapioca 0.6.4 → 0.7.2
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.
- checksums.yaml +4 -4
- data/Gemfile +8 -2
- data/README.md +27 -15
- data/Rakefile +10 -14
- data/lib/tapioca/cli.rb +65 -80
- data/lib/tapioca/{generators/base.rb → commands/command.rb} +16 -9
- data/lib/tapioca/{generators → commands}/dsl.rb +59 -45
- data/lib/tapioca/{generators → commands}/gem.rb +93 -30
- data/lib/tapioca/{generators → commands}/init.rb +9 -13
- data/lib/tapioca/{generators → commands}/require.rb +8 -10
- data/lib/tapioca/commands/todo.rb +86 -0
- data/lib/tapioca/commands.rb +13 -0
- data/lib/tapioca/dsl/compiler.rb +185 -0
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/aasm.rb +12 -9
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/action_controller_helpers.rb +13 -20
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/action_mailer.rb +10 -8
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_job.rb +11 -9
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_model_attributes.rb +13 -11
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_model_secure_password.rb +10 -12
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_record_associations.rb +28 -34
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_record_columns.rb +18 -16
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_record_enum.rb +14 -12
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_record_fixtures.rb +12 -8
- data/lib/tapioca/dsl/compilers/active_record_relations.rb +712 -0
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_record_scope.rb +21 -20
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_record_typed_store.rb +11 -16
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_resource.rb +10 -8
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_storage.rb +14 -10
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_support_concern.rb +19 -14
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/active_support_current_attributes.rb +16 -21
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/config.rb +11 -9
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/frozen_record.rb +13 -11
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/identity_cache.rb +23 -22
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/mixed_in_class_attributes.rb +12 -10
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/protobuf.rb +22 -10
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/rails_generators.rb +12 -13
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/sidekiq_worker.rb +14 -13
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/smart_properties.rb +11 -9
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/state_machines.rb +12 -10
- data/lib/tapioca/{compilers/dsl → dsl/compilers}/url_helpers.rb +20 -15
- data/lib/tapioca/dsl/compilers.rb +31 -0
- data/lib/tapioca/{compilers/dsl → dsl}/extensions/frozen_record.rb +2 -2
- data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +114 -0
- data/lib/tapioca/dsl/helpers/active_record_constants_helper.rb +29 -0
- data/lib/tapioca/{compilers/dsl → dsl/helpers}/param_helper.rb +6 -3
- data/lib/tapioca/dsl/pipeline.rb +169 -0
- data/lib/tapioca/gem/events.rb +120 -0
- data/lib/tapioca/gem/listeners/base.rb +48 -0
- data/lib/tapioca/gem/listeners/dynamic_mixins.rb +32 -0
- data/lib/tapioca/gem/listeners/methods.rb +183 -0
- data/lib/tapioca/gem/listeners/mixins.rb +101 -0
- data/lib/tapioca/gem/listeners/remove_empty_payload_scopes.rb +21 -0
- data/lib/tapioca/gem/listeners/sorbet_enums.rb +26 -0
- data/lib/tapioca/gem/listeners/sorbet_helpers.rb +29 -0
- data/lib/tapioca/gem/listeners/sorbet_props.rb +33 -0
- data/lib/tapioca/gem/listeners/sorbet_required_ancestors.rb +23 -0
- data/lib/tapioca/gem/listeners/sorbet_signatures.rb +79 -0
- data/lib/tapioca/gem/listeners/sorbet_type_variables.rb +51 -0
- data/lib/tapioca/gem/listeners/subconstants.rb +37 -0
- data/lib/tapioca/gem/listeners/yard_doc.rb +96 -0
- data/lib/tapioca/gem/listeners.rb +16 -0
- data/lib/tapioca/gem/pipeline.rb +365 -0
- data/lib/tapioca/helpers/cli_helper.rb +7 -0
- data/lib/tapioca/helpers/config_helper.rb +5 -8
- data/lib/tapioca/helpers/shims_helper.rb +87 -0
- data/lib/tapioca/helpers/signatures_helper.rb +17 -0
- data/lib/tapioca/helpers/sorbet_helper.rb +57 -0
- data/lib/tapioca/helpers/test/dsl_compiler.rb +118 -0
- data/lib/tapioca/helpers/test/isolation.rb +1 -1
- data/lib/tapioca/helpers/test/template.rb +13 -2
- data/lib/tapioca/helpers/type_variable_helper.rb +43 -0
- data/lib/tapioca/internal.rb +18 -10
- data/lib/tapioca/rbi_ext/model.rb +14 -50
- data/lib/tapioca/rbi_formatter.rb +37 -0
- data/lib/tapioca/runtime/dynamic_mixin_compiler.rb +227 -0
- data/lib/tapioca/runtime/generic_type_registry.rb +168 -0
- data/lib/tapioca/runtime/loader.rb +123 -0
- data/lib/tapioca/runtime/reflection.rb +157 -0
- data/lib/tapioca/runtime/trackers/autoload.rb +72 -0
- data/lib/tapioca/runtime/trackers/constant_definition.rb +44 -0
- data/lib/tapioca/runtime/trackers/mixin.rb +80 -0
- data/lib/tapioca/runtime/trackers/required_ancestor.rb +50 -0
- data/lib/tapioca/{trackers.rb → runtime/trackers.rb} +4 -3
- data/lib/tapioca/sorbet_ext/generic_name_patch.rb +69 -34
- data/lib/tapioca/sorbet_ext/name_patch.rb +7 -1
- data/lib/tapioca/{compilers → static}/requires_compiler.rb +2 -2
- data/lib/tapioca/static/symbol_loader.rb +83 -0
- data/lib/tapioca/static/symbol_table_parser.rb +63 -0
- data/lib/tapioca/version.rb +1 -1
- data/lib/tapioca.rb +2 -7
- metadata +83 -62
- data/lib/tapioca/compilers/dsl/active_record_relations.rb +0 -720
- data/lib/tapioca/compilers/dsl/base.rb +0 -195
- data/lib/tapioca/compilers/dsl/helper/active_record_constants.rb +0 -27
- data/lib/tapioca/compilers/dsl_compiler.rb +0 -134
- data/lib/tapioca/compilers/dynamic_mixin_compiler.rb +0 -223
- data/lib/tapioca/compilers/sorbet.rb +0 -59
- data/lib/tapioca/compilers/symbol_table/symbol_generator.rb +0 -780
- data/lib/tapioca/compilers/symbol_table/symbol_loader.rb +0 -90
- data/lib/tapioca/compilers/symbol_table_compiler.rb +0 -17
- data/lib/tapioca/compilers/todos_compiler.rb +0 -32
- data/lib/tapioca/generators/todo.rb +0 -76
- data/lib/tapioca/generators.rb +0 -9
- data/lib/tapioca/generic_type_registry.rb +0 -164
- data/lib/tapioca/helpers/active_record_column_type_helper.rb +0 -108
- data/lib/tapioca/loader.rb +0 -119
- data/lib/tapioca/reflection.rb +0 -151
- data/lib/tapioca/trackers/autoload.rb +0 -70
- data/lib/tapioca/trackers/constant_definition.rb +0 -42
- data/lib/tapioca/trackers/mixin.rb +0 -78
|
@@ -7,14 +7,14 @@ rescue LoadError
|
|
|
7
7
|
return
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
require "tapioca/
|
|
10
|
+
require "tapioca/dsl/helpers/active_record_constants_helper"
|
|
11
11
|
|
|
12
12
|
module Tapioca
|
|
13
|
-
module
|
|
14
|
-
module
|
|
15
|
-
# `Tapioca::Compilers::
|
|
13
|
+
module Dsl
|
|
14
|
+
module Compilers
|
|
15
|
+
# `Tapioca::Dsl::Compilers::ActiveRecordAssociations` refines RBI files for subclasses of
|
|
16
16
|
# [`ActiveRecord::Base`](https://api.rubyonrails.org/classes/ActiveRecord/Base.html).
|
|
17
|
-
# This
|
|
17
|
+
# This compiler is only responsible for defining the methods that would be created for the associations that
|
|
18
18
|
# are defined in the Active Record model.
|
|
19
19
|
#
|
|
20
20
|
# For example, with the following model class:
|
|
@@ -29,7 +29,7 @@ module Tapioca
|
|
|
29
29
|
# end
|
|
30
30
|
# ~~~
|
|
31
31
|
#
|
|
32
|
-
# this
|
|
32
|
+
# this compiler will produce the following methods in the RBI file
|
|
33
33
|
# `post.rbi`:
|
|
34
34
|
#
|
|
35
35
|
# ~~~rbi
|
|
@@ -99,9 +99,9 @@ module Tapioca
|
|
|
99
99
|
# end
|
|
100
100
|
# end
|
|
101
101
|
# ~~~
|
|
102
|
-
class ActiveRecordAssociations <
|
|
102
|
+
class ActiveRecordAssociations < Compiler
|
|
103
103
|
extend T::Sig
|
|
104
|
-
include
|
|
104
|
+
include Helpers::ActiveRecordConstantsHelper
|
|
105
105
|
|
|
106
106
|
class SourceReflectionError < StandardError
|
|
107
107
|
end
|
|
@@ -119,18 +119,16 @@ module Tapioca
|
|
|
119
119
|
end
|
|
120
120
|
end
|
|
121
121
|
|
|
122
|
-
|
|
123
|
-
T.any(::ActiveRecord::Reflection::ThroughReflection, ::ActiveRecord::Reflection::AssociationReflection)
|
|
124
|
-
end
|
|
122
|
+
ConstantType = type_member { { fixed: T.class_of(ActiveRecord::Base) } }
|
|
125
123
|
|
|
126
|
-
sig { override.
|
|
127
|
-
def decorate
|
|
124
|
+
sig { override.void }
|
|
125
|
+
def decorate
|
|
128
126
|
return if constant.reflections.empty?
|
|
129
127
|
|
|
130
128
|
root.create_path(constant) do |model|
|
|
131
129
|
model.create_module(AssociationMethodsModuleName) do |mod|
|
|
132
|
-
populate_nested_attribute_writers(mod
|
|
133
|
-
populate_associations(mod
|
|
130
|
+
populate_nested_attribute_writers(mod)
|
|
131
|
+
populate_associations(mod)
|
|
134
132
|
end
|
|
135
133
|
|
|
136
134
|
model.create_include(AssociationMethodsModuleName)
|
|
@@ -138,14 +136,14 @@ module Tapioca
|
|
|
138
136
|
end
|
|
139
137
|
|
|
140
138
|
sig { override.returns(T::Enumerable[Module]) }
|
|
141
|
-
def gather_constants
|
|
139
|
+
def self.gather_constants
|
|
142
140
|
descendants_of(::ActiveRecord::Base).reject(&:abstract_class?)
|
|
143
141
|
end
|
|
144
142
|
|
|
145
143
|
private
|
|
146
144
|
|
|
147
|
-
sig { params(mod: RBI::Scope
|
|
148
|
-
def populate_nested_attribute_writers(mod
|
|
145
|
+
sig { params(mod: RBI::Scope).void }
|
|
146
|
+
def populate_nested_attribute_writers(mod)
|
|
149
147
|
constant.nested_attributes_options.keys.each do |association_name|
|
|
150
148
|
mod.create_method(
|
|
151
149
|
"#{association_name}_attributes=",
|
|
@@ -155,13 +153,13 @@ module Tapioca
|
|
|
155
153
|
end
|
|
156
154
|
end
|
|
157
155
|
|
|
158
|
-
sig { params(mod: RBI::Scope
|
|
159
|
-
def populate_associations(mod
|
|
156
|
+
sig { params(mod: RBI::Scope).void }
|
|
157
|
+
def populate_associations(mod)
|
|
160
158
|
constant.reflections.each do |association_name, reflection|
|
|
161
159
|
if reflection.collection?
|
|
162
|
-
populate_collection_assoc_getter_setter(mod,
|
|
160
|
+
populate_collection_assoc_getter_setter(mod, association_name, reflection)
|
|
163
161
|
else
|
|
164
|
-
populate_single_assoc_getter_setter(mod,
|
|
162
|
+
populate_single_assoc_getter_setter(mod, association_name, reflection)
|
|
165
163
|
end
|
|
166
164
|
rescue SourceReflectionError
|
|
167
165
|
add_error(<<~MSG.strip)
|
|
@@ -177,13 +175,12 @@ module Tapioca
|
|
|
177
175
|
sig do
|
|
178
176
|
params(
|
|
179
177
|
klass: RBI::Scope,
|
|
180
|
-
constant: T.class_of(ActiveRecord::Base),
|
|
181
178
|
association_name: T.any(String, Symbol),
|
|
182
179
|
reflection: ReflectionType
|
|
183
180
|
).void
|
|
184
181
|
end
|
|
185
|
-
def populate_single_assoc_getter_setter(klass,
|
|
186
|
-
association_class = type_for(
|
|
182
|
+
def populate_single_assoc_getter_setter(klass, association_name, reflection)
|
|
183
|
+
association_class = type_for(reflection)
|
|
187
184
|
association_type = as_nilable_type(association_class)
|
|
188
185
|
|
|
189
186
|
klass.create_method(
|
|
@@ -230,14 +227,13 @@ module Tapioca
|
|
|
230
227
|
sig do
|
|
231
228
|
params(
|
|
232
229
|
klass: RBI::Scope,
|
|
233
|
-
constant: T.class_of(ActiveRecord::Base),
|
|
234
230
|
association_name: T.any(String, Symbol),
|
|
235
231
|
reflection: ReflectionType
|
|
236
232
|
).void
|
|
237
233
|
end
|
|
238
|
-
def populate_collection_assoc_getter_setter(klass,
|
|
239
|
-
association_class = type_for(
|
|
240
|
-
relation_class = relation_type_for(
|
|
234
|
+
def populate_collection_assoc_getter_setter(klass, association_name, reflection)
|
|
235
|
+
association_class = type_for(reflection)
|
|
236
|
+
relation_class = relation_type_for(reflection)
|
|
241
237
|
|
|
242
238
|
klass.create_method(
|
|
243
239
|
association_name.to_s,
|
|
@@ -261,11 +257,10 @@ module Tapioca
|
|
|
261
257
|
|
|
262
258
|
sig do
|
|
263
259
|
params(
|
|
264
|
-
constant: T.class_of(ActiveRecord::Base),
|
|
265
260
|
reflection: ReflectionType
|
|
266
261
|
).returns(String)
|
|
267
262
|
end
|
|
268
|
-
def type_for(
|
|
263
|
+
def type_for(reflection)
|
|
269
264
|
validate_reflection!(reflection)
|
|
270
265
|
|
|
271
266
|
return "T.untyped" if !constant.table_exists? || polymorphic_association?(reflection)
|
|
@@ -323,14 +318,13 @@ module Tapioca
|
|
|
323
318
|
|
|
324
319
|
sig do
|
|
325
320
|
params(
|
|
326
|
-
constant: T.class_of(ActiveRecord::Base),
|
|
327
321
|
reflection: ReflectionType
|
|
328
322
|
).returns(String)
|
|
329
323
|
end
|
|
330
|
-
def relation_type_for(
|
|
324
|
+
def relation_type_for(reflection)
|
|
331
325
|
validate_reflection!(reflection)
|
|
332
326
|
|
|
333
|
-
relations_enabled =
|
|
327
|
+
relations_enabled = compiler_enabled?("ActiveRecordRelations")
|
|
334
328
|
polymorphic_association = !constant.table_exists? || polymorphic_association?(reflection)
|
|
335
329
|
|
|
336
330
|
if relations_enabled
|
|
@@ -7,14 +7,15 @@ rescue LoadError
|
|
|
7
7
|
return
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
require "tapioca/
|
|
10
|
+
require "tapioca/dsl/helpers/active_record_column_type_helper"
|
|
11
|
+
require "tapioca/dsl/helpers/active_record_constants_helper"
|
|
11
12
|
|
|
12
13
|
module Tapioca
|
|
13
|
-
module
|
|
14
|
-
module
|
|
15
|
-
# `Tapioca::Compilers::
|
|
14
|
+
module Dsl
|
|
15
|
+
module Compilers
|
|
16
|
+
# `Tapioca::Dsl::Compilers::ActiveRecordColumns` refines RBI files for subclasses of
|
|
16
17
|
# [`ActiveRecord::Base`](https://api.rubyonrails.org/classes/ActiveRecord/Base.html).
|
|
17
|
-
# This
|
|
18
|
+
# This compiler is only responsible for defining the attribute methods that would be
|
|
18
19
|
# created for the columns that are defined in the Active Record model.
|
|
19
20
|
#
|
|
20
21
|
# For example, with the following model class:
|
|
@@ -35,7 +36,7 @@ module Tapioca
|
|
|
35
36
|
# end
|
|
36
37
|
# ~~~
|
|
37
38
|
#
|
|
38
|
-
# this
|
|
39
|
+
# this compiler will produce the following methods in the RBI file
|
|
39
40
|
# `post.rbi`:
|
|
40
41
|
#
|
|
41
42
|
# ~~~rbi
|
|
@@ -96,19 +97,21 @@ module Tapioca
|
|
|
96
97
|
# end
|
|
97
98
|
# end
|
|
98
99
|
# ~~~
|
|
99
|
-
class ActiveRecordColumns <
|
|
100
|
+
class ActiveRecordColumns < Compiler
|
|
100
101
|
extend T::Sig
|
|
101
|
-
include
|
|
102
|
+
include Helpers::ActiveRecordConstantsHelper
|
|
102
103
|
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
ConstantType = type_member { { fixed: T.class_of(ActiveRecord::Base) } }
|
|
105
|
+
|
|
106
|
+
sig { override.void }
|
|
107
|
+
def decorate
|
|
105
108
|
return unless constant.table_exists?
|
|
106
109
|
|
|
107
110
|
root.create_path(constant) do |model|
|
|
108
111
|
model.create_module(AttributeMethodsModuleName) do |mod|
|
|
109
112
|
constant.columns_hash.each_key do |column_name|
|
|
110
113
|
column_name = column_name.to_s
|
|
111
|
-
add_methods_for_attribute(mod,
|
|
114
|
+
add_methods_for_attribute(mod, column_name)
|
|
112
115
|
end
|
|
113
116
|
|
|
114
117
|
constant.attribute_aliases.each do |attribute_name, column_name|
|
|
@@ -124,7 +127,7 @@ module Tapioca
|
|
|
124
127
|
old_method_names = patterns.map { |m| m.method_name(column_name) }
|
|
125
128
|
methods_to_add = new_method_names - old_method_names
|
|
126
129
|
|
|
127
|
-
add_methods_for_attribute(mod,
|
|
130
|
+
add_methods_for_attribute(mod, column_name, attribute_name, methods_to_add)
|
|
128
131
|
end
|
|
129
132
|
end
|
|
130
133
|
|
|
@@ -133,7 +136,7 @@ module Tapioca
|
|
|
133
136
|
end
|
|
134
137
|
|
|
135
138
|
sig { override.returns(T::Enumerable[Module]) }
|
|
136
|
-
def gather_constants
|
|
139
|
+
def self.gather_constants
|
|
137
140
|
descendants_of(::ActiveRecord::Base).reject(&:abstract_class?)
|
|
138
141
|
end
|
|
139
142
|
|
|
@@ -159,14 +162,13 @@ module Tapioca
|
|
|
159
162
|
sig do
|
|
160
163
|
params(
|
|
161
164
|
klass: RBI::Scope,
|
|
162
|
-
constant: T.class_of(ActiveRecord::Base),
|
|
163
165
|
column_name: String,
|
|
164
166
|
attribute_name: String,
|
|
165
167
|
methods_to_add: T.nilable(T::Array[String])
|
|
166
168
|
).void
|
|
167
169
|
end
|
|
168
|
-
def add_methods_for_attribute(klass,
|
|
169
|
-
getter_type, setter_type = ActiveRecordColumnTypeHelper.new(constant).type_for(column_name)
|
|
170
|
+
def add_methods_for_attribute(klass, column_name, attribute_name = column_name, methods_to_add = nil)
|
|
171
|
+
getter_type, setter_type = Helpers::ActiveRecordColumnTypeHelper.new(constant).type_for(column_name)
|
|
170
172
|
|
|
171
173
|
# Added by ActiveRecord::AttributeMethods::Read
|
|
172
174
|
#
|
|
@@ -5,14 +5,14 @@ begin
|
|
|
5
5
|
require "active_record"
|
|
6
6
|
rescue LoadError
|
|
7
7
|
# means ActiveRecord is not installed,
|
|
8
|
-
# so let's not even define the
|
|
8
|
+
# so let's not even define the compiler.
|
|
9
9
|
return
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
module Tapioca
|
|
13
|
-
module
|
|
14
|
-
module
|
|
15
|
-
# `Tapioca::Compilers::
|
|
13
|
+
module Dsl
|
|
14
|
+
module Compilers
|
|
15
|
+
# `Tapioca::Dsl::Compilers::ActiveRecordEnum` decorates RBI files for subclasses of
|
|
16
16
|
# `ActiveRecord::Base` which declare [`enum` fields](https://api.rubyonrails.org/classes/ActiveRecord/Enum.html).
|
|
17
17
|
#
|
|
18
18
|
# For example, with the following `ActiveRecord::Base` subclass:
|
|
@@ -23,7 +23,7 @@ module Tapioca
|
|
|
23
23
|
# end
|
|
24
24
|
# ~~~
|
|
25
25
|
#
|
|
26
|
-
# this
|
|
26
|
+
# this compiler will produce the RBI file `post.rbi` with the following content:
|
|
27
27
|
#
|
|
28
28
|
# ~~~rbi
|
|
29
29
|
# # post.rbi
|
|
@@ -55,18 +55,20 @@ module Tapioca
|
|
|
55
55
|
# end
|
|
56
56
|
# end
|
|
57
57
|
# ~~~
|
|
58
|
-
class ActiveRecordEnum <
|
|
58
|
+
class ActiveRecordEnum < Compiler
|
|
59
59
|
extend T::Sig
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
ConstantType = type_member { { fixed: T.class_of(::ActiveRecord::Base) } }
|
|
62
|
+
|
|
63
|
+
sig { override.void }
|
|
64
|
+
def decorate
|
|
63
65
|
return if constant.defined_enums.empty?
|
|
64
66
|
|
|
65
67
|
root.create_path(constant) do |model|
|
|
66
68
|
module_name = "EnumMethodsModule"
|
|
67
69
|
|
|
68
70
|
model.create_module(module_name) do |mod|
|
|
69
|
-
generate_instance_methods(
|
|
71
|
+
generate_instance_methods(mod)
|
|
70
72
|
end
|
|
71
73
|
|
|
72
74
|
model.create_include(module_name)
|
|
@@ -79,7 +81,7 @@ module Tapioca
|
|
|
79
81
|
end
|
|
80
82
|
|
|
81
83
|
sig { override.returns(T::Enumerable[Module]) }
|
|
82
|
-
def gather_constants
|
|
84
|
+
def self.gather_constants
|
|
83
85
|
descendants_of(::ActiveRecord::Base)
|
|
84
86
|
end
|
|
85
87
|
|
|
@@ -97,8 +99,8 @@ module Tapioca
|
|
|
97
99
|
"T::Hash[T.any(String, Symbol), #{value_type}]"
|
|
98
100
|
end
|
|
99
101
|
|
|
100
|
-
sig { params(
|
|
101
|
-
def generate_instance_methods(
|
|
102
|
+
sig { params(klass: RBI::Scope).void }
|
|
103
|
+
def generate_instance_methods(klass)
|
|
102
104
|
methods = constant.send(:_enum_methods_module).instance_methods
|
|
103
105
|
|
|
104
106
|
methods.each do |method|
|
|
@@ -11,9 +11,9 @@ rescue LoadError
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
module Tapioca
|
|
14
|
-
module
|
|
15
|
-
module
|
|
16
|
-
# `Tapioca::Compilers::
|
|
14
|
+
module Dsl
|
|
15
|
+
module Compilers
|
|
16
|
+
# `Tapioca::Dsl::Compilers::ActiveRecordFixtures` decorates RBIs for test fixture methods
|
|
17
17
|
# that are created dynamically by Rails.
|
|
18
18
|
#
|
|
19
19
|
# For example, given an application with a posts table, we can have a fixture file
|
|
@@ -25,7 +25,7 @@ module Tapioca
|
|
|
25
25
|
# ~~~
|
|
26
26
|
#
|
|
27
27
|
# Rails will allow us to invoke `posts(:first_post)` in tests to get the fixture record.
|
|
28
|
-
# The generated RBI by this
|
|
28
|
+
# The generated RBI by this compiler will produce the following
|
|
29
29
|
#
|
|
30
30
|
# ~~~rbi
|
|
31
31
|
# # test_case.rbi
|
|
@@ -35,11 +35,13 @@ module Tapioca
|
|
|
35
35
|
# def posts(*fixture_names); end
|
|
36
36
|
# end
|
|
37
37
|
# ~~~
|
|
38
|
-
class ActiveRecordFixtures <
|
|
38
|
+
class ActiveRecordFixtures < Compiler
|
|
39
39
|
extend T::Sig
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
ConstantType = type_member { { fixed: T.class_of(ActiveSupport::TestCase) } }
|
|
42
|
+
|
|
43
|
+
sig { override.void }
|
|
44
|
+
def decorate
|
|
43
45
|
method_names = fixture_loader.ancestors # get all ancestors from class that includes AR fixtures
|
|
44
46
|
.drop(1) # drop the anonymous class itself from the array
|
|
45
47
|
.reject(&:name) # only collect anonymous ancestors because fixture methods are always on an anonymous module
|
|
@@ -57,7 +59,9 @@ module Tapioca
|
|
|
57
59
|
end
|
|
58
60
|
|
|
59
61
|
sig { override.returns(T::Enumerable[Module]) }
|
|
60
|
-
def gather_constants
|
|
62
|
+
def self.gather_constants
|
|
63
|
+
return [] unless Rails.application
|
|
64
|
+
|
|
61
65
|
[ActiveSupport::TestCase]
|
|
62
66
|
end
|
|
63
67
|
|