tapioca 0.10.1 → 0.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -3
  3. data/lib/tapioca/cli.rb +24 -12
  4. data/lib/tapioca/commands/annotations.rb +2 -2
  5. data/lib/tapioca/commands/check_shims.rb +13 -21
  6. data/lib/tapioca/commands/command.rb +2 -2
  7. data/lib/tapioca/commands/command_without_tracker.rb +18 -0
  8. data/lib/tapioca/commands/configure.rb +3 -3
  9. data/lib/tapioca/commands/dsl.rb +16 -11
  10. data/lib/tapioca/commands/gem.rb +5 -5
  11. data/lib/tapioca/commands/require.rb +2 -2
  12. data/lib/tapioca/commands/todo.rb +2 -2
  13. data/lib/tapioca/commands.rb +1 -0
  14. data/lib/tapioca/dsl/compiler.rb +3 -3
  15. data/lib/tapioca/dsl/compilers/aasm.rb +4 -4
  16. data/lib/tapioca/dsl/compilers/action_controller_helpers.rb +1 -1
  17. data/lib/tapioca/dsl/compilers/action_mailer.rb +1 -1
  18. data/lib/tapioca/dsl/compilers/active_job.rb +2 -2
  19. data/lib/tapioca/dsl/compilers/active_model_attributes.rb +1 -1
  20. data/lib/tapioca/dsl/compilers/active_record_associations.rb +48 -13
  21. data/lib/tapioca/dsl/compilers/active_record_columns.rb +22 -22
  22. data/lib/tapioca/dsl/compilers/active_record_fixtures.rb +1 -1
  23. data/lib/tapioca/dsl/compilers/active_record_relations.rb +52 -48
  24. data/lib/tapioca/dsl/compilers/active_record_scope.rb +3 -3
  25. data/lib/tapioca/dsl/compilers/active_record_typed_store.rb +2 -2
  26. data/lib/tapioca/dsl/compilers/active_storage.rb +2 -2
  27. data/lib/tapioca/dsl/compilers/active_support_current_attributes.rb +1 -1
  28. data/lib/tapioca/dsl/compilers/config.rb +2 -2
  29. data/lib/tapioca/dsl/compilers/graphql_input_object.rb +1 -0
  30. data/lib/tapioca/dsl/compilers/graphql_mutation.rb +1 -0
  31. data/lib/tapioca/dsl/compilers/identity_cache.rb +12 -12
  32. data/lib/tapioca/dsl/compilers/protobuf.rb +21 -10
  33. data/lib/tapioca/dsl/compilers/rails_generators.rb +2 -2
  34. data/lib/tapioca/dsl/compilers/sidekiq_worker.rb +1 -1
  35. data/lib/tapioca/dsl/compilers/smart_properties.rb +2 -2
  36. data/lib/tapioca/dsl/compilers/state_machines.rb +24 -24
  37. data/lib/tapioca/dsl/compilers/url_helpers.rb +1 -1
  38. data/lib/tapioca/dsl/compilers.rb +1 -1
  39. data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +19 -0
  40. data/lib/tapioca/dsl/helpers/graphql_type_helper.rb +1 -1
  41. data/lib/tapioca/dsl/pipeline.rb +5 -4
  42. data/lib/tapioca/executor.rb +2 -2
  43. data/lib/tapioca/gem/events.rb +1 -1
  44. data/lib/tapioca/gem/listeners/foreign_constants.rb +3 -2
  45. data/lib/tapioca/gem/listeners/methods.rb +3 -3
  46. data/lib/tapioca/gem/listeners/mixins.rb +3 -7
  47. data/lib/tapioca/gem/listeners/source_location.rb +1 -1
  48. data/lib/tapioca/gem/listeners/subconstants.rb +1 -1
  49. data/lib/tapioca/gem/listeners/yard_doc.rb +1 -1
  50. data/lib/tapioca/gem/pipeline.rb +11 -9
  51. data/lib/tapioca/gemfile.rb +4 -4
  52. data/lib/tapioca/helpers/config_helper.rb +4 -4
  53. data/lib/tapioca/helpers/env_helper.rb +1 -0
  54. data/lib/tapioca/helpers/gem_helper.rb +17 -5
  55. data/lib/tapioca/helpers/rbi_files_helper.rb +3 -3
  56. data/lib/tapioca/helpers/rbi_helper.rb +5 -13
  57. data/lib/tapioca/helpers/sorbet_helper.rb +3 -5
  58. data/lib/tapioca/helpers/source_uri.rb +1 -1
  59. data/lib/tapioca/helpers/test/dsl_compiler.rb +1 -1
  60. data/lib/tapioca/loaders/dsl.rb +9 -7
  61. data/lib/tapioca/loaders/gem.rb +2 -2
  62. data/lib/tapioca/loaders/loader.rb +6 -6
  63. data/lib/tapioca/rbi_ext/model.rb +8 -5
  64. data/lib/tapioca/rbi_formatter.rb +2 -2
  65. data/lib/tapioca/runtime/generic_type_registry.rb +22 -2
  66. data/lib/tapioca/runtime/reflection.rb +63 -2
  67. data/lib/tapioca/runtime/trackers/autoload.rb +3 -0
  68. data/lib/tapioca/runtime/trackers/constant_definition.rb +13 -5
  69. data/lib/tapioca/runtime/trackers/mixin.rb +37 -36
  70. data/lib/tapioca/runtime/trackers/required_ancestor.rb +17 -4
  71. data/lib/tapioca/runtime/trackers/tracker.rb +45 -0
  72. data/lib/tapioca/runtime/trackers.rb +27 -1
  73. data/lib/tapioca/sorbet_ext/generic_name_patch.rb +17 -6
  74. data/lib/tapioca/static/symbol_loader.rb +3 -3
  75. data/lib/tapioca/static/symbol_table_parser.rb +6 -0
  76. data/lib/tapioca/version.rb +1 -1
  77. data/lib/tapioca.rb +0 -10
  78. metadata +8 -20
@@ -64,7 +64,7 @@ module Tapioca
64
64
  generate_scope_method(
65
65
  relation_methods_module,
66
66
  scope_method.to_s,
67
- relations_enabled ? RelationClassName : "T.untyped"
67
+ relations_enabled ? RelationClassName : "T.untyped",
68
68
  )
69
69
 
70
70
  next unless relations_enabled
@@ -72,7 +72,7 @@ module Tapioca
72
72
  generate_scope_method(
73
73
  assoc_relation_methods_mod,
74
74
  scope_method.to_s,
75
- AssociationRelationClassName
75
+ AssociationRelationClassName,
76
76
  )
77
77
  end
78
78
 
@@ -112,7 +112,7 @@ module Tapioca
112
112
  params(
113
113
  mod: RBI::Scope,
114
114
  scope_method: String,
115
- return_type: String
115
+ return_type: String,
116
116
  ).void
117
117
  end
118
118
  def generate_scope_method(mod, scope_method, return_type)
@@ -147,7 +147,7 @@ module Tapioca
147
147
  params(
148
148
  klass: RBI::Scope,
149
149
  name: String,
150
- type: String
150
+ type: String,
151
151
  )
152
152
  .void
153
153
  end
@@ -155,7 +155,7 @@ module Tapioca
155
155
  klass.create_method(
156
156
  "#{name}=",
157
157
  parameters: [create_param(name, type: type)],
158
- return_type: type
158
+ return_type: type,
159
159
  )
160
160
  klass.create_method(name, return_type: type)
161
161
  klass.create_method("#{name}?", return_type: "T::Boolean")
@@ -63,12 +63,12 @@ module Tapioca
63
63
  name = reflection.name.to_s
64
64
  scope.create_method(
65
65
  name,
66
- return_type: type
66
+ return_type: type,
67
67
  )
68
68
  scope.create_method(
69
69
  "#{name}=",
70
70
  parameters: [create_param("attachable", type: "T.untyped")],
71
- return_type: "T.untyped"
71
+ return_type: "T.untyped",
72
72
  )
73
73
  end
74
74
  end
@@ -117,7 +117,7 @@ module Tapioca
117
117
  method,
118
118
  class_method: class_method,
119
119
  parameters: [parameter],
120
- return_type: "T.untyped"
120
+ return_type: "T.untyped",
121
121
  )
122
122
  else
123
123
  klass.create_method(method, class_method: class_method, return_type: "T.untyped")
@@ -83,14 +83,14 @@ module Tapioca
83
83
  # Create getter method
84
84
  mod.create_method(
85
85
  method_name.to_s,
86
- return_type: "T.untyped"
86
+ return_type: "T.untyped",
87
87
  )
88
88
 
89
89
  # Create setter method
90
90
  mod.create_method(
91
91
  "#{method_name}=",
92
92
  parameters: [create_param("value", type: "T.untyped")],
93
- return_type: "T.untyped"
93
+ return_type: "T.untyped",
94
94
  )
95
95
  end
96
96
  end
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  begin
5
+ gem("graphql", ">= 1.13")
5
6
  require "graphql"
6
7
  rescue LoadError
7
8
  return
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  begin
5
+ gem("graphql", ">= 1.13")
5
6
  require "graphql"
6
7
  rescue LoadError
7
8
  return
@@ -66,7 +66,7 @@ module Tapioca
66
66
 
67
67
  COLLECTION_TYPE = T.let(
68
68
  ->(type) { "T::Array[::#{type}]" },
69
- T.proc.params(type: T.any(Module, String)).returns(String)
69
+ T.proc.params(type: T.any(Module, String)).returns(String),
70
70
  )
71
71
 
72
72
  ConstantType = type_member { { fixed: T.class_of(::ActiveRecord::Base) } }
@@ -116,7 +116,7 @@ module Tapioca
116
116
  sig do
117
117
  params(
118
118
  field: T.untyped,
119
- returns_collection: T::Boolean
119
+ returns_collection: T::Boolean,
120
120
  ).returns(String)
121
121
  end
122
122
  def type_for_field(field, returns_collection:)
@@ -134,7 +134,7 @@ module Tapioca
134
134
  params(
135
135
  field: T.untyped,
136
136
  klass: RBI::Scope,
137
- returns_collection: T::Boolean
137
+ returns_collection: T::Boolean,
138
138
  ).void
139
139
  end
140
140
  def create_fetch_field_methods(field, klass, returns_collection:)
@@ -152,7 +152,7 @@ module Tapioca
152
152
  sig do
153
153
  params(
154
154
  field: T.untyped,
155
- klass: RBI::Scope
155
+ klass: RBI::Scope,
156
156
  ).void
157
157
  end
158
158
  def create_fetch_by_methods(field, klass)
@@ -168,7 +168,7 @@ module Tapioca
168
168
  sig do
169
169
  params(
170
170
  field: T.untyped,
171
- klass: RBI::Scope
171
+ klass: RBI::Scope,
172
172
  ).void
173
173
  end
174
174
  def create_index_fetch_by_methods(field, klass)
@@ -187,21 +187,21 @@ module Tapioca
187
187
  "#{name}!",
188
188
  class_method: true,
189
189
  parameters: parameters,
190
- return_type: type
190
+ return_type: type,
191
191
  )
192
192
 
193
193
  klass.create_method(
194
194
  name,
195
195
  class_method: true,
196
196
  parameters: parameters,
197
- return_type: as_nilable_type(type)
197
+ return_type: as_nilable_type(type),
198
198
  )
199
199
  else
200
200
  klass.create_method(
201
201
  name,
202
202
  class_method: true,
203
203
  parameters: parameters,
204
- return_type: COLLECTION_TYPE.call(constant)
204
+ return_type: COLLECTION_TYPE.call(constant),
205
205
  )
206
206
  end
207
207
 
@@ -213,7 +213,7 @@ module Tapioca
213
213
  create_param("index_values", type: "T::Enumerable[T.untyped]"),
214
214
  create_kw_opt_param("includes", default: "nil", type: "T.untyped"),
215
215
  ],
216
- return_type: COLLECTION_TYPE.call(constant)
216
+ return_type: COLLECTION_TYPE.call(constant),
217
217
  )
218
218
  end
219
219
  end
@@ -221,7 +221,7 @@ module Tapioca
221
221
  sig do
222
222
  params(
223
223
  field: T.untyped,
224
- klass: RBI::Scope
224
+ klass: RBI::Scope,
225
225
  ).void
226
226
  end
227
227
  def create_aliased_fetch_by_methods(field, klass)
@@ -238,7 +238,7 @@ module Tapioca
238
238
  "fetch_#{suffix}",
239
239
  class_method: true,
240
240
  parameters: parameters,
241
- return_type: type
241
+ return_type: type,
242
242
  )
243
243
 
244
244
  if length == 1
@@ -246,7 +246,7 @@ module Tapioca
246
246
  "fetch_multi_#{suffix}",
247
247
  class_method: true,
248
248
  parameters: [create_param("keys", type: "T::Enumerable[T.untyped]")],
249
- return_type: COLLECTION_TYPE.call(multi_type)
249
+ return_type: COLLECTION_TYPE.call(multi_type),
250
250
  )
251
251
  end
252
252
  end
@@ -37,7 +37,7 @@ module Tapioca
37
37
  # sig { returns(Integer) }
38
38
  # def customer_id; end
39
39
  #
40
- # sig { params(month: Integer).returns(Integer) }
40
+ # sig { params(value: Integer).returns(Integer) }
41
41
  # def customer_id=(value); end
42
42
  #
43
43
  # sig { returns(Integer) }
@@ -95,7 +95,18 @@ module Tapioca
95
95
  case descriptor
96
96
  when Google::Protobuf::EnumDescriptor
97
97
  descriptor.to_h.each do |sym, val|
98
- klass.create_constant(sym.to_s, value: val.to_s)
98
+ # For each enum value, create a namespaced constant on the root rather than an un-namespaced
99
+ # constant within the class. This is because un-namespaced constants might conflict with reserved
100
+ # Ruby words, such as "BEGIN." By namespacing them, we avoid this problem.
101
+ #
102
+ # Invalid syntax:
103
+ # class Foo
104
+ # BEGIN = 3
105
+ # end
106
+ #
107
+ # Valid syntax:
108
+ # Foo::BEGIN = 3
109
+ root.create_constant("#{constant}::#{sym}", value: val.to_s)
99
110
  end
100
111
 
101
112
  klass.create_method(
@@ -169,7 +180,7 @@ module Tapioca
169
180
 
170
181
  sig do
171
182
  params(
172
- descriptor: Google::Protobuf::FieldDescriptor
183
+ descriptor: Google::Protobuf::FieldDescriptor,
173
184
  ).returns(String)
174
185
  end
175
186
  def type_of(descriptor)
@@ -223,7 +234,7 @@ module Tapioca
223
234
  name: descriptor.name,
224
235
  type: type,
225
236
  init_type: "T.nilable(T.any(#{type}, T::Hash[#{key_type}, #{value_type}]))",
226
- default: "Google::Protobuf::Map.new(#{default_args.join(", ")})"
237
+ default: "Google::Protobuf::Map.new(#{default_args.join(", ")})",
227
238
  )
228
239
  else
229
240
  elem_type = type_of(descriptor)
@@ -236,7 +247,7 @@ module Tapioca
236
247
  name: descriptor.name,
237
248
  type: type,
238
249
  init_type: "T.nilable(T.any(#{type}, T::Array[#{elem_type}]))",
239
- default: "Google::Protobuf::RepeatedField.new(#{default_args.join(", ")})"
250
+ default: "Google::Protobuf::RepeatedField.new(#{default_args.join(", ")})",
240
251
  )
241
252
  end
242
253
  else
@@ -248,7 +259,7 @@ module Tapioca
248
259
  name: descriptor.name,
249
260
  type: type,
250
261
  init_type: nilable_type,
251
- default: "nil"
262
+ default: "nil",
252
263
  )
253
264
  end
254
265
  end
@@ -264,13 +275,13 @@ module Tapioca
264
275
 
265
276
  klass.create_method(
266
277
  field.name,
267
- return_type: field.type
278
+ return_type: field.type,
268
279
  )
269
280
 
270
281
  klass.create_method(
271
282
  "#{field.name}=",
272
283
  parameters: [create_param("value", type: field.type)],
273
- return_type: "void"
284
+ return_type: "void",
274
285
  )
275
286
 
276
287
  field
@@ -279,13 +290,13 @@ module Tapioca
279
290
  sig do
280
291
  params(
281
292
  klass: RBI::Scope,
282
- desc: Google::Protobuf::OneofDescriptor
293
+ desc: Google::Protobuf::OneofDescriptor,
283
294
  ).void
284
295
  end
285
296
  def create_oneof_method(klass, desc)
286
297
  klass.create_method(
287
298
  desc.name,
288
- return_type: "T.nilable(Symbol)"
299
+ return_type: "T.nilable(Symbol)",
289
300
  )
290
301
  end
291
302
  end
@@ -43,7 +43,7 @@ module Tapioca
43
43
 
44
44
  BUILT_IN_MATCHER = T.let(
45
45
  /::(ActionMailbox|ActionText|ActiveRecord|Rails)::Generators/,
46
- Regexp
46
+ Regexp,
47
47
  )
48
48
 
49
49
  ConstantType = type_member { { fixed: T.class_of(::Rails::Generators::Base) } }
@@ -86,7 +86,7 @@ module Tapioca
86
86
  klass.create_method(
87
87
  argument.name,
88
88
  parameters: [],
89
- return_type: type_for(argument)
89
+ return_type: type_for(argument),
90
90
  )
91
91
  end
92
92
 
@@ -87,7 +87,7 @@ module Tapioca
87
87
  params(
88
88
  worker: RBI::Scope,
89
89
  method_name: String,
90
- parameters: T::Array[RBI::TypedParam]
90
+ parameters: T::Array[RBI::TypedParam],
91
91
  ).void
92
92
  end
93
93
  def generate_perform_method(worker, method_name, parameters)
@@ -69,7 +69,7 @@ module Tapioca
69
69
  def decorate
70
70
  properties = T.let(
71
71
  T.unsafe(constant).properties,
72
- ::SmartProperties::PropertyCollection
72
+ ::SmartProperties::PropertyCollection,
73
73
  )
74
74
  return if properties.keys.empty?
75
75
 
@@ -103,7 +103,7 @@ module Tapioca
103
103
  sig do
104
104
  params(
105
105
  mod: RBI::Scope,
106
- property: ::SmartProperties::Property
106
+ property: ::SmartProperties::Property,
107
107
  ).void
108
108
  end
109
109
  def generate_methods_for_property(mod, property)
@@ -186,7 +186,7 @@ module Tapioca
186
186
  def define_activerecord_methods(instance_module)
187
187
  instance_module.create_method(
188
188
  "changed_for_autosave?",
189
- return_type: "T::Boolean"
189
+ return_type: "T::Boolean",
190
190
  )
191
191
  end
192
192
 
@@ -195,7 +195,7 @@ module Tapioca
195
195
  machine.states.each do |state|
196
196
  instance_module.create_method(
197
197
  "#{state.qualified_name}?",
198
- return_type: "T::Boolean"
198
+ return_type: "T::Boolean",
199
199
  )
200
200
  end
201
201
  end
@@ -205,22 +205,22 @@ module Tapioca
205
205
  machine.events.each do |event|
206
206
  instance_module.create_method(
207
207
  "can_#{event.qualified_name}?",
208
- return_type: "T::Boolean"
208
+ return_type: "T::Boolean",
209
209
  )
210
210
  instance_module.create_method(
211
211
  "#{event.qualified_name}_transition",
212
212
  parameters: [create_rest_param("args", type: "T.untyped")],
213
- return_type: "T.nilable(::StateMachines::Transition)"
213
+ return_type: "T.nilable(::StateMachines::Transition)",
214
214
  )
215
215
  instance_module.create_method(
216
216
  event.qualified_name.to_s,
217
217
  parameters: [create_rest_param("args", type: "T.untyped")],
218
- return_type: "T::Boolean"
218
+ return_type: "T::Boolean",
219
219
  )
220
220
  instance_module.create_method(
221
221
  "#{event.qualified_name}!",
222
222
  parameters: [create_rest_param("args", type: "T.untyped")],
223
- return_type: "T::Boolean"
223
+ return_type: "T::Boolean",
224
224
  )
225
225
  end
226
226
  end
@@ -229,19 +229,19 @@ module Tapioca
229
229
  params(
230
230
  instance_module: RBI::Module,
231
231
  machine: ::StateMachines::Machine,
232
- state_type: String
232
+ state_type: String,
233
233
  ).void
234
234
  end
235
235
  def define_state_accessor(instance_module, machine, state_type)
236
236
  attribute = machine.attribute.to_s
237
237
  instance_module.create_method(
238
238
  attribute,
239
- return_type: state_type
239
+ return_type: state_type,
240
240
  )
241
241
  instance_module.create_method(
242
242
  "#{attribute}=",
243
243
  parameters: [create_param("value", type: state_type)],
244
- return_type: state_type
244
+ return_type: state_type,
245
245
  )
246
246
  end
247
247
 
@@ -250,7 +250,7 @@ module Tapioca
250
250
  instance_module.create_method(
251
251
  "#{machine.name}?",
252
252
  parameters: [create_param("state", type: "T.any(String, Symbol)")],
253
- return_type: "T::Boolean"
253
+ return_type: "T::Boolean",
254
254
  )
255
255
  end
256
256
 
@@ -264,12 +264,12 @@ module Tapioca
264
264
  instance_module.create_method(
265
265
  events_attribute,
266
266
  parameters: [create_rest_param("args", type: "T.untyped")],
267
- return_type: "T::Array[T.any(String, Symbol)]"
267
+ return_type: "T::Array[T.any(String, Symbol)]",
268
268
  )
269
269
  instance_module.create_method(
270
270
  transitions_attribute,
271
271
  parameters: [create_rest_param("args", type: "T.untyped")],
272
- return_type: "T::Array[::StateMachines::Transition]"
272
+ return_type: "T::Array[::StateMachines::Transition]",
273
273
  )
274
274
  instance_module.create_method(
275
275
  "fire_#{event_attribute}",
@@ -277,26 +277,26 @@ module Tapioca
277
277
  create_param("event", type: "T.any(String, Symbol)"),
278
278
  create_rest_param("args", type: "T.untyped"),
279
279
  ],
280
- return_type: "T::Boolean"
280
+ return_type: "T::Boolean",
281
281
  )
282
282
  if machine.action
283
283
  instance_module.create_method(
284
284
  event_attribute,
285
- return_type: "T.nilable(Symbol)"
285
+ return_type: "T.nilable(Symbol)",
286
286
  )
287
287
  instance_module.create_method(
288
288
  "#{event_attribute}=",
289
289
  parameters: [create_param("value", type: "T.any(String, Symbol)")],
290
- return_type: "T.any(String, Symbol)"
290
+ return_type: "T.any(String, Symbol)",
291
291
  )
292
292
  instance_module.create_method(
293
293
  event_transition_attribute,
294
- return_type: "T.nilable(::StateMachines::Transition)"
294
+ return_type: "T.nilable(::StateMachines::Transition)",
295
295
  )
296
296
  instance_module.create_method(
297
297
  "#{event_transition_attribute}=",
298
298
  parameters: [create_param("value", type: "::StateMachines::Transition")],
299
- return_type: "::StateMachines::Transition"
299
+ return_type: "::StateMachines::Transition",
300
300
  )
301
301
  end
302
302
  end
@@ -308,7 +308,7 @@ module Tapioca
308
308
  instance_module.create_method(
309
309
  paths_attribute,
310
310
  parameters: [create_rest_param("args", type: "T.untyped")],
311
- return_type: "T::Array[::StateMachines::Transition]"
311
+ return_type: "T::Array[::StateMachines::Transition]",
312
312
  )
313
313
  end
314
314
 
@@ -316,7 +316,7 @@ module Tapioca
316
316
  params(
317
317
  instance_module: RBI::Module,
318
318
  class_module: RBI::Module,
319
- machine: ::StateMachines::Machine
319
+ machine: ::StateMachines::Machine,
320
320
  ).void
321
321
  end
322
322
  def define_name_helpers(instance_module, class_module, machine)
@@ -326,20 +326,20 @@ module Tapioca
326
326
  class_module.create_method(
327
327
  "human_#{name_attribute}",
328
328
  parameters: [create_param("state", type: "T.any(String, Symbol)")],
329
- return_type: "String"
329
+ return_type: "String",
330
330
  )
331
331
  class_module.create_method(
332
332
  "human_#{event_name_attribute}",
333
333
  parameters: [create_param("event", type: "T.any(String, Symbol)")],
334
- return_type: "String"
334
+ return_type: "String",
335
335
  )
336
336
  instance_module.create_method(
337
337
  name_attribute,
338
- return_type: "T.any(String, Symbol)"
338
+ return_type: "T.any(String, Symbol)",
339
339
  )
340
340
  instance_module.create_method(
341
341
  "human_#{name_attribute}",
342
- return_type: "String"
342
+ return_type: "String",
343
343
  )
344
344
  end
345
345
 
@@ -354,7 +354,7 @@ module Tapioca
354
354
  class_module.create_method(
355
355
  method.to_s,
356
356
  parameters: [create_rest_param("states", type: "T.any(String, Symbol)")],
357
- return_type: "T.untyped"
357
+ return_type: "T.untyped",
358
358
  )
359
359
  end
360
360
  end
@@ -154,7 +154,7 @@ module Tapioca
154
154
  mod.create_method(
155
155
  method.to_s,
156
156
  parameters: [create_rest_param("args", type: "T.untyped")],
157
- return_type: "String"
157
+ return_type: "String",
158
158
  )
159
159
  end
160
160
  end
@@ -15,7 +15,7 @@ module Tapioca
15
15
  "#{name}::", # compilers in this namespace
16
16
  "::", # compilers that need to be fully namespaced
17
17
  ],
18
- T::Array[String]
18
+ T::Array[String],
19
19
  )
20
20
  end
21
21
  end
@@ -41,6 +41,8 @@ module Tapioca
41
41
  "::ActiveSupport::TimeWithZone"
42
42
  when ActiveRecord::Enum::EnumType
43
43
  "::String"
44
+ when ActiveRecord::Type::Serialized
45
+ serialized_column_type(column_type)
44
46
  else
45
47
  handle_unknown_type(column_type)
46
48
  end
@@ -119,6 +121,23 @@ module Tapioca
119
121
  "T.any(::String, ::Symbol)"
120
122
  end
121
123
  end
124
+
125
+ sig { params(column_type: ActiveRecord::Type::Serialized).returns(String) }
126
+ def serialized_column_type(column_type)
127
+ case column_type.coder
128
+ when ActiveRecord::Coders::YAMLColumn
129
+ case column_type.coder.object_class
130
+ when Array.singleton_class
131
+ "T::Array[T.untyped]"
132
+ when Hash.singleton_class
133
+ "T::Hash[T.untyped, T.untyped]"
134
+ else
135
+ "T.untyped"
136
+ end
137
+ else
138
+ "T.untyped"
139
+ end
140
+ end
122
141
  end
123
142
  end
124
143
  end
@@ -25,7 +25,7 @@ module Tapioca
25
25
  when GraphQL::Types::ISO8601Date.singleton_class
26
26
  type_for_constant(Date)
27
27
  when GraphQL::Types::ISO8601DateTime.singleton_class
28
- type_for_constant(DateTime)
28
+ type_for_constant(Time)
29
29
  when GraphQL::Types::JSON.singleton_class
30
30
  "T::Hash[::String, T.untyped]"
31
31
  when GraphQL::Schema::Enum.singleton_class
@@ -36,7 +36,7 @@ module Tapioca
36
36
  )
37
37
  @active_compilers = T.let(
38
38
  gather_active_compilers(requested_compilers, excluded_compilers),
39
- T::Enumerable[T.class_of(Compiler)]
39
+ T::Enumerable[T.class_of(Compiler)],
40
40
  )
41
41
  @requested_constants = requested_constants
42
42
  @error_handler = error_handler
@@ -46,7 +46,7 @@ module Tapioca
46
46
 
47
47
  sig do
48
48
  type_parameters(:T).params(
49
- blk: T.proc.params(constant: Module, rbi: RBI::File).returns(T.type_parameter(:T))
49
+ blk: T.proc.params(constant: Module, rbi: RBI::File).returns(T.type_parameter(:T)),
50
50
  ).returns(T::Array[T.type_parameter(:T)])
51
51
  end
52
52
  def run(&blk)
@@ -63,7 +63,7 @@ module Tapioca
63
63
 
64
64
  result = Executor.new(
65
65
  constants_to_process,
66
- number_of_workers: @number_of_workers
66
+ number_of_workers: @number_of_workers,
67
67
  ).run_in_parallel do |constant|
68
68
  rbi = rbi_for_constant(constant)
69
69
  next if rbi.nil?
@@ -105,7 +105,7 @@ module Tapioca
105
105
  sig do
106
106
  params(
107
107
  requested_compilers: T::Array[T.class_of(Compiler)],
108
- excluded_compilers: T::Array[T.class_of(Compiler)]
108
+ excluded_compilers: T::Array[T.class_of(Compiler)],
109
109
  ).returns(T::Enumerable[T.class_of(Compiler)])
110
110
  end
111
111
  def gather_active_compilers(requested_compilers, excluded_compilers)
@@ -146,6 +146,7 @@ module Tapioca
146
146
  constants_by_name
147
147
  .keys
148
148
  .map { |name| T.cast(Runtime::Reflection.constantize(name), Module) }
149
+ .select { |mod| Runtime::Reflection.constant_defined?(mod) }
149
150
  .to_set
150
151
  end
151
152
 
@@ -16,13 +16,13 @@ module Tapioca
16
16
  # one has at least 4 items to process
17
17
  @number_of_workers = T.let(
18
18
  number_of_workers || [Etc.nprocessors, (queue.length.to_f / MINIMUM_ITEMS_PER_WORKER).ceil].min,
19
- Integer
19
+ Integer,
20
20
  )
21
21
  end
22
22
 
23
23
  sig do
24
24
  type_parameters(:T).params(
25
- block: T.proc.params(item: T.untyped).returns(T.type_parameter(:T))
25
+ block: T.proc.params(item: T.untyped).returns(T.type_parameter(:T)),
26
26
  ).returns(T::Array[T.type_parameter(:T)])
27
27
  end
28
28
  def run_in_parallel(&block)
@@ -124,7 +124,7 @@ module Tapioca
124
124
  method: UnboundMethod,
125
125
  node: RBI::Method,
126
126
  signature: T.untyped,
127
- parameters: T::Array[[Symbol, String]]
127
+ parameters: T::Array[[Symbol, String]],
128
128
  ).void.checked(:never)
129
129
  end
130
130
  def initialize(symbol, constant, method, node, signature, parameters) # rubocop:disable Metrics/ParameterLists