tapioca 0.17.8 → 0.17.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 489bd75ab0b8322c633ee51dbdb7f0bf4701fbca5cf64401c418d8a7fb454418
4
- data.tar.gz: 62e4137c4fb603186d93b2f470148f5a8b7baa73bcfb6ed8b000a519dc1f106a
3
+ metadata.gz: 3668f1f1916b284b762a3ed370a2f658b2edd25d1c0c44be37fd7ca321be9200
4
+ data.tar.gz: ce3540ff4aaebab9b9e506c4192ffdee93ef17c09b2399fb114d2b735fbf0b0e
5
5
  SHA512:
6
- metadata.gz: ef5107149d789dda2d5c426a14b611ab1062f8aaa919ec179805c95bf7ad7d22eaae368ac9e0ed86b61cfac38b5bbbfc2fa65fa262837ce22ff4ee054b5cbf31
7
- data.tar.gz: e568320ce79f3e9afa07d1ea1fc58aa7aef422f782b77c4b93707016b680bd2e3c2c971b136016dbf754ed82199e461178467195166f2c7738dec40632ac5de1
6
+ metadata.gz: 648c2bd8e7ef7f14c0bce4736ea47636c043a5ee1e529e676569c85f398b1380838631fab7146439162491523446ac40c112fb8247ca55402947d372b235f5c7
7
+ data.tar.gz: 11370dc255bf5e5508139480e4e9def8a51f145de3574c1f4dd17ad72572f1b64b30d0d876244426542b35d1e639d18662719f47137049d5aaac1fb6bdc7d5c6
@@ -70,7 +70,7 @@ module Tapioca
70
70
  reason: "types exported from the `#{gem.name}` gem",
71
71
  ) if @file_header
72
72
 
73
- rbi.root = Tapioca.with_disabled_exits do
73
+ rbi.root = Runtime.with_disabled_exits do
74
74
  Tapioca::Gem::Pipeline.new(
75
75
  gem,
76
76
  include_doc: @include_doc,
@@ -21,7 +21,7 @@ module Tapioca
21
21
  # @final
22
22
  #: -> void
23
23
  def run
24
- Tapioca.silence_warnings do
24
+ Runtime.silence_warnings do
25
25
  execute
26
26
  end
27
27
  end
@@ -95,6 +95,12 @@ module Tapioca
95
95
  # @override
96
96
  #: -> T::Enumerable[Module]
97
97
  def gather_constants
98
+ # In some versions of Rails 8.1, `ActiveModel::SecurePassword` uses `Numeric#minutes`
99
+ # which isn't explicitly required in the gem, and it might not be loaded already.
100
+ # We might need to require it before referencing the constant to avoid a NoMethodError when
101
+ # the constant is autoloaded.
102
+ require "active_support/core_ext/numeric/time" unless defined?(1.minutes)
103
+
98
104
  # This selects all classes that are `ActiveModel::SecurePassword::ClassMethods === klass`.
99
105
  # In other words, we select all classes that have `ActiveModel::SecurePassword::ClassMethods`
100
106
  # as an ancestor of its singleton class, i.e. all classes that have extended the
@@ -13,7 +13,7 @@ module Tapioca
13
13
  #
14
14
  # ~~~rb
15
15
  # class Post < ApplicationRecord
16
- # enum title_type: %i(book all web), _suffix: :title
16
+ # enum :title_type, %i(book all web), suffix: :title
17
17
  # end
18
18
  # ~~~
19
19
  #
@@ -229,15 +229,7 @@ module Tapioca
229
229
  use_ranges: ["T.untyped", "nil"],
230
230
  } #: Hash[Symbol, [String, String]]
231
231
  CALCULATION_METHODS = ActiveRecord::Calculations.instance_methods(false) #: Array[Symbol]
232
- ENUMERABLE_QUERY_METHODS = [:any?, :many?, :none?, :one?] #: Array[Symbol]
233
- FIND_OR_CREATE_METHODS = [
234
- :find_or_create_by,
235
- :find_or_create_by!,
236
- :find_or_initialize_by,
237
- :create_or_find_by,
238
- :create_or_find_by!,
239
- ] #: Array[Symbol]
240
- BUILDER_METHODS = [:new, :create, :create!, :build] #: Array[Symbol]
232
+ RELATION_METHODS = ActiveRecord::Relation.instance_methods(false) #: Array[Symbol]
241
233
  TO_ARRAY_METHODS = [:to_ary, :to_a] #: Array[Symbol]
242
234
 
243
235
  private
@@ -907,61 +899,132 @@ module Tapioca
907
899
  end
908
900
  end
909
901
 
910
- ENUMERABLE_QUERY_METHODS.each do |method_name|
911
- block_type = "T.nilable(T.proc.params(record: #{constant_name}).returns(T.untyped))"
912
- create_common_method(
913
- method_name,
914
- parameters: [
915
- create_block_param("block", type: block_type),
916
- ],
917
- return_type: "T::Boolean",
918
- )
919
- end
902
+ RELATION_METHODS.each do |method_name|
903
+ case method_name
904
+ when :any?, :many?, :none?, :one? # enumerable query methods
905
+ block_type = "T.nilable(T.proc.params(record: #{constant_name}).returns(T.untyped))"
906
+ create_common_method(
907
+ method_name,
908
+ parameters: [
909
+ create_block_param("block", type: block_type),
910
+ ],
911
+ return_type: "T::Boolean",
912
+ )
913
+ when :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, :create_or_find_by, :create_or_find_by! # find or create methods
914
+ common_relation_methods_module.create_method(method_name.to_s) do |method|
915
+ method.add_param("attributes")
916
+ method.add_block_param("block")
920
917
 
921
- FIND_OR_CREATE_METHODS.each do |method_name|
922
- common_relation_methods_module.create_method(method_name.to_s) do |method|
923
- method.add_param("attributes")
924
- method.add_block_param("block")
918
+ # `T.untyped` matches `T::Array[T.untyped]` so the array signature
919
+ # must be defined first for Sorbet to pick it, if valid.
920
+ method.add_sig do |sig|
921
+ sig.add_param("attributes", "T::Array[T.untyped]")
922
+ sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
923
+ sig.return_type = "T::Array[#{constant_name}]"
924
+ end
925
925
 
926
- # `T.untyped` matches `T::Array[T.untyped]` so the array signature
927
- # must be defined first for Sorbet to pick it, if valid.
928
- method.add_sig do |sig|
929
- sig.add_param("attributes", "T::Array[T.untyped]")
930
- sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
931
- sig.return_type = "T::Array[#{constant_name}]"
926
+ method.add_sig do |sig|
927
+ sig.add_param("attributes", "T.untyped")
928
+ sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
929
+ sig.return_type = constant_name
930
+ end
932
931
  end
932
+ when :new, :create, :create!, :build # builder methods
933
+ common_relation_methods_module.create_method(method_name.to_s) do |method|
934
+ method.add_opt_param("attributes", "nil")
935
+ method.add_block_param("block")
933
936
 
934
- method.add_sig do |sig|
935
- sig.add_param("attributes", "T.untyped")
936
- sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
937
- sig.return_type = constant_name
938
- end
939
- end
940
- end
937
+ method.add_sig do |sig|
938
+ sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
939
+ sig.return_type = constant_name
940
+ end
941
941
 
942
- BUILDER_METHODS.each do |method_name|
943
- common_relation_methods_module.create_method(method_name.to_s) do |method|
944
- method.add_opt_param("attributes", "nil")
945
- method.add_block_param("block")
942
+ # `T.untyped` matches `T::Array[T.untyped]` so the array signature
943
+ # must be defined first for Sorbet to pick it, if valid.
944
+ method.add_sig do |sig|
945
+ sig.add_param("attributes", "T::Array[T.untyped]")
946
+ sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
947
+ sig.return_type = "T::Array[#{constant_name}]"
948
+ end
946
949
 
947
- method.add_sig do |sig|
948
- sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
949
- sig.return_type = constant_name
950
+ method.add_sig do |sig|
951
+ sig.add_param("attributes", "T.untyped")
952
+ sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
953
+ sig.return_type = constant_name
954
+ end
950
955
  end
956
+ when :insert_all, :insert_all!, :upsert_all # insert all methods
957
+ returning_type = "T.nilable(T.any(T::Array[Symbol], FalseClass))"
958
+ unique_by_type = "T.nilable(T.any(T::Array[Symbol], Symbol))"
951
959
 
952
- # `T.untyped` matches `T::Array[T.untyped]` so the array signature
953
- # must be defined first for Sorbet to pick it, if valid.
954
- method.add_sig do |sig|
955
- sig.add_param("attributes", "T::Array[T.untyped]")
956
- sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
957
- sig.return_type = "T::Array[#{constant_name}]"
960
+ parameters = [
961
+ create_param("attributes", type: "T::Array[Hash]"),
962
+ create_kw_opt_param("returning", type: returning_type, default: "nil"),
963
+ ]
964
+
965
+ # Bang methods don't have the `unique_by` parameter
966
+ unless bang_method?(method_name)
967
+ parameters << create_kw_opt_param("unique_by", type: unique_by_type, default: "nil")
958
968
  end
959
969
 
960
- method.add_sig do |sig|
961
- sig.add_param("attributes", "T.untyped")
962
- sig.add_param("block", "T.nilable(T.proc.params(object: #{constant_name}).void)")
963
- sig.return_type = constant_name
970
+ common_relation_methods_module.create_method(
971
+ method_name.to_s,
972
+ parameters: parameters,
973
+ return_type: "ActiveRecord::Result",
974
+ )
975
+ when :insert, :insert!, :upsert # insert methods
976
+ returning_type = "T.nilable(T.any(T::Array[Symbol], FalseClass))"
977
+ unique_by_type = "T.nilable(T.any(T::Array[Symbol], Symbol))"
978
+
979
+ parameters = [
980
+ create_param("attributes", type: "Hash"),
981
+ create_kw_opt_param("returning", type: returning_type, default: "nil"),
982
+ ]
983
+
984
+ # Bang methods don't have the `unique_by` parameter
985
+ unless bang_method?(method_name)
986
+ parameters << create_kw_opt_param("unique_by", type: unique_by_type, default: "nil")
964
987
  end
988
+
989
+ common_relation_methods_module.create_method(
990
+ method_name.to_s,
991
+ parameters: parameters,
992
+ return_type: "ActiveRecord::Result",
993
+ )
994
+ when :delete, :destroy
995
+ # For these cases, it is valid to pass the above kind of things, but also:
996
+ # - a model identifier, which can be:
997
+ # - a numeric id, thus `Integer`
998
+ # - a string id, thus `String`
999
+ # - a collection of identifiers
1000
+ # - a collection of identifiers, thus `T::Enumerable[T.any(Integer, String)]`
1001
+ # which, coupled with the above case, gives us:
1002
+ # `T.any(Model, Integer, String, T::Enumerable[T.any(Model, Integer, String, T::Enumerable[Model])])`
1003
+
1004
+ common_relation_methods_module.create_method(
1005
+ method_name.to_s,
1006
+ parameters: [
1007
+ create_rest_param(
1008
+ "records",
1009
+ type: "T.any(#{constant_name}, Integer, String" \
1010
+ ", T::Enumerable[T.any(#{constant_name}, Integer, String, T::Enumerable[#{constant_name}])])",
1011
+ ),
1012
+ ],
1013
+ return_type: method_name == :delete ? "Integer" : "T::Array[#{constant_name}]",
1014
+ )
1015
+ when :delete_all, :destroy_all
1016
+ common_relation_methods_module.create_method(
1017
+ method_name.to_s,
1018
+ return_type: method_name == :delete_all ? "Integer" : "T::Array[#{constant_name}]",
1019
+ )
1020
+ when :delete_by, :destroy_by
1021
+ common_relation_methods_module.create_method(
1022
+ method_name.to_s,
1023
+ parameters: [
1024
+ create_param("args", type: "T.untyped"),
1025
+ ],
1026
+ return_type: method_name == :delete_by ? "Integer" : "T::Array[#{constant_name}]",
1027
+ )
965
1028
  end
966
1029
  end
967
1030
 
@@ -269,7 +269,11 @@ module Tapioca
269
269
  Field.new(
270
270
  name: descriptor.name,
271
271
  type: type,
272
- init_type: "T.nilable(T.any(#{type}, T::Array[#{elem_type}]))",
272
+ # The FFI implementation accepts Enumerables:
273
+ # https://github.com/protocolbuffers/protobuf/blob/fc0eda1fd4eff075f1fb2e9249fa4209f0227e33/ruby/lib/google/protobuf/ffi/repeated_field.rb#L361-L366
274
+ # However the C implementation of the initializer specifically checks for Arrays:
275
+ # https://github.com/protocolbuffers/protobuf/blob/fc0eda1fd4eff075f1fb2e9249fa4209f0227e33/ruby/ext/google/protobuf_c/message.c#L568-L573
276
+ init_type: "T.nilable(T::Array[#{elem_type}])",
273
277
  default: "T.unsafe(nil)",
274
278
  )
275
279
  end
@@ -152,8 +152,10 @@ module Tapioca
152
152
  when ActiveRecord::Type::Serialized
153
153
  serialized_column_type(column_type)
154
154
  when ->(type) {
155
- defined?(ActiveRecord::Normalization::NormalizedValueType) &&
156
- ActiveRecord::Normalization::NormalizedValueType === type
155
+ (defined?(ActiveRecord::Normalization::NormalizedValueType) &&
156
+ ActiveRecord::Normalization::NormalizedValueType === type) ||
157
+ (defined?(ActiveModel::Attributes::Normalization::NormalizedValueType) &&
158
+ ActiveModel::Attributes::Normalization::NormalizedValueType === type)
157
159
  }
158
160
  type_for_activerecord_value(column_type.cast_type, column_nullability:)
159
161
  when ->(type) {
@@ -28,7 +28,7 @@ module Tapioca
28
28
  #: (String name, String content, ?require_file: bool) -> String
29
29
  def add_ruby_file(name, content, require_file: true)
30
30
  add_content_file(name, content).tap do |file_name|
31
- Tapioca.silence_warnings { require(file_name) } if require_file
31
+ Runtime.silence_warnings { require(file_name) } if require_file
32
32
  end
33
33
  end
34
34
 
@@ -4,6 +4,7 @@
4
4
  require "set"
5
5
 
6
6
  require "tapioca"
7
+ require "tapioca/runtime/helpers"
7
8
  require "tapioca/runtime/reflection"
8
9
  require "tapioca/runtime/trackers"
9
10
 
@@ -47,7 +47,7 @@ module Tapioca
47
47
 
48
48
  bundle_loaded = true #: bool
49
49
 
50
- Tapioca.with_disabled_exits do
50
+ Runtime.with_disabled_exits do
51
51
  load_bundle(@bundle, @prerequire, @postrequire, @halt_upon_load_error)
52
52
  rescue LoadError => e
53
53
  bundle_loaded = false
@@ -0,0 +1,40 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Tapioca
5
+ module Runtime
6
+ NOOP_METHOD = ->(*_args, **_kwargs, &_block) {} #: ^() -> void
7
+ private_constant :NOOP_METHOD
8
+
9
+ class << self
10
+ #: [Result] { -> Result } -> Result
11
+ def silence_warnings(&blk)
12
+ original_verbosity = $VERBOSE
13
+ $VERBOSE = nil
14
+ ::Gem::DefaultUserInteraction.use_ui(::Gem::SilentUI.new) do
15
+ blk.call
16
+ end
17
+ ensure
18
+ $VERBOSE = original_verbosity
19
+ end
20
+
21
+ #: [Result] { -> Result } -> Result
22
+ def with_disabled_exits(&block)
23
+ original_abort = Kernel.instance_method(:abort)
24
+ original_exit = Kernel.instance_method(:exit)
25
+
26
+ begin
27
+ Kernel.define_method(:abort, NOOP_METHOD)
28
+ Kernel.define_method(:exit, NOOP_METHOD)
29
+
30
+ silence_warnings do
31
+ block.call
32
+ end
33
+ ensure
34
+ Kernel.define_method(:exit, original_exit)
35
+ Kernel.define_method(:abort, original_abort)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -15,7 +15,7 @@ module Tapioca
15
15
 
16
16
  #: -> void
17
17
  def eager_load_all!
18
- Tapioca.with_disabled_exits do
18
+ Runtime.with_disabled_exits do
19
19
  until @constant_names_registered_for_autoload.empty?
20
20
  # Grab the next constant name
21
21
  constant_name = T.must(@constant_names_registered_for_autoload.shift)
@@ -52,7 +52,7 @@ end
52
52
 
53
53
  module T
54
54
  module Helpers
55
- prepend(Module.new do
55
+ prepend(::Module.new do
56
56
  def requires_ancestor(&block)
57
57
  # We can't directly call the block since the ancestor might not be loaded yet.
58
58
  # We save the block in the map and will resolve it later.
@@ -22,7 +22,7 @@ module T
22
22
  # `T::Generic#type_member` just instantiates a `T::Type::TypeMember` instance and returns it.
23
23
  # We use that when registering the type member and then later return it from this method.
24
24
  Tapioca::TypeVariableModule.new(
25
- T.cast(self, Module),
25
+ T.cast(self, ::Module),
26
26
  Tapioca::TypeVariableModule::Type::Member,
27
27
  variance,
28
28
  bounds_proc,
@@ -35,7 +35,7 @@ module T
35
35
  # `T::Generic#type_template` just instantiates a `T::Type::TypeTemplate` instance and returns it.
36
36
  # We use that when registering the type template and then later return it from this method.
37
37
  Tapioca::TypeVariableModule.new(
38
- T.cast(self, Module),
38
+ T.cast(self, ::Module),
39
39
  Tapioca::TypeVariableModule::Type::Template,
40
40
  variance,
41
41
  bounds_proc,
@@ -48,7 +48,7 @@ module T
48
48
  Tapioca::Runtime::GenericTypeRegistry.register_type_variable(
49
49
  self,
50
50
  Tapioca::TypeVariableModule.new(
51
- T.cast(self, Module),
51
+ T.cast(self, ::Module),
52
52
  Tapioca::TypeVariableModule::Type::HasAttachedClass,
53
53
  variance,
54
54
  bounds_proc,
@@ -5,24 +5,13 @@ module T
5
5
  module Types
6
6
  class Simple
7
7
  module NamePatch
8
- NAME_METHOD = Module.instance_method(:name) #: UnboundMethod
9
-
10
8
  def name
11
9
  # Sorbet memoizes this method into the `@name` instance variable but
12
10
  # doing so means that types get memoized before this patch is applied
13
- qualified_name_of(@raw_type)
14
- end
15
-
16
- def qualified_name_of(constant)
17
- name = NAME_METHOD.bind_call(constant)
18
- name = nil if name&.start_with?("#<")
19
- return "::T.untyped" if name.nil?
11
+ name = Tapioca::Runtime::Reflection.qualified_name_of(@raw_type)
12
+ name = "::T.untyped" if name.nil?
20
13
 
21
- if name.start_with?("::")
22
- name
23
- else
24
- "::#{name}"
25
- end
14
+ name
26
15
  end
27
16
  end
28
17
 
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.17.8"
5
+ VERSION = "0.17.9"
6
6
  end
data/lib/tapioca.rb CHANGED
@@ -9,42 +9,6 @@ module Tapioca
9
9
 
10
10
  @traces = [] #: Array[TracePoint]
11
11
 
12
- NOOP_METHOD = ->(*_args, **_kwargs, &_block) {} #: ^() -> void
13
- private_constant :NOOP_METHOD
14
-
15
- class << self
16
- extend T::Sig
17
-
18
- #: [Result] { -> Result } -> Result
19
- def silence_warnings(&blk)
20
- original_verbosity = $VERBOSE
21
- $VERBOSE = nil
22
- ::Gem::DefaultUserInteraction.use_ui(::Gem::SilentUI.new) do
23
- blk.call
24
- end
25
- ensure
26
- $VERBOSE = original_verbosity
27
- end
28
-
29
- #: [Result] { -> Result } -> Result
30
- def with_disabled_exits(&block)
31
- original_abort = Kernel.instance_method(:abort)
32
- original_exit = Kernel.instance_method(:exit)
33
-
34
- begin
35
- Kernel.define_method(:abort, NOOP_METHOD)
36
- Kernel.define_method(:exit, NOOP_METHOD)
37
-
38
- Tapioca.silence_warnings do
39
- block.call
40
- end
41
- ensure
42
- Kernel.define_method(:exit, original_exit)
43
- Kernel.define_method(:abort, original_abort)
44
- end
45
- end
46
- end
47
-
48
12
  class Error < StandardError; end
49
13
 
50
14
  LIB_ROOT_DIR = T.must(__dir__) #: String
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tapioca
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.8
4
+ version: 0.17.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ufuk Kayserilioglu
@@ -69,89 +69,89 @@ dependencies:
69
69
  - !ruby/object:Gem::Version
70
70
  version: 1.21.0
71
71
  - !ruby/object:Gem::Dependency
72
- name: rbi
72
+ name: require-hooks
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: 0.3.1
77
+ version: 0.2.2
78
78
  type: :runtime
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 0.3.1
84
+ version: 0.2.2
85
85
  - !ruby/object:Gem::Dependency
86
- name: require-hooks
86
+ name: sorbet-static-and-runtime
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - ">="
90
90
  - !ruby/object:Gem::Version
91
- version: 0.2.2
91
+ version: 0.5.11087
92
92
  type: :runtime
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - ">="
97
97
  - !ruby/object:Gem::Version
98
- version: 0.2.2
98
+ version: 0.5.11087
99
99
  - !ruby/object:Gem::Dependency
100
- name: sorbet-static-and-runtime
100
+ name: thor
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - ">="
104
104
  - !ruby/object:Gem::Version
105
- version: 0.5.11087
105
+ version: 1.2.0
106
106
  type: :runtime
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
- version: 0.5.11087
112
+ version: 1.2.0
113
113
  - !ruby/object:Gem::Dependency
114
- name: spoom
114
+ name: yard-sorbet
115
115
  requirement: !ruby/object:Gem::Requirement
116
116
  requirements:
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
- version: 1.7.0
119
+ version: '0'
120
120
  type: :runtime
121
121
  prerelease: false
122
122
  version_requirements: !ruby/object:Gem::Requirement
123
123
  requirements:
124
124
  - - ">="
125
125
  - !ruby/object:Gem::Version
126
- version: 1.7.0
126
+ version: '0'
127
127
  - !ruby/object:Gem::Dependency
128
- name: thor
128
+ name: rbi
129
129
  requirement: !ruby/object:Gem::Requirement
130
130
  requirements:
131
131
  - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: 1.2.0
133
+ version: 0.3.7
134
134
  type: :runtime
135
135
  prerelease: false
136
136
  version_requirements: !ruby/object:Gem::Requirement
137
137
  requirements:
138
138
  - - ">="
139
139
  - !ruby/object:Gem::Version
140
- version: 1.2.0
140
+ version: 0.3.7
141
141
  - !ruby/object:Gem::Dependency
142
- name: yard-sorbet
142
+ name: spoom
143
143
  requirement: !ruby/object:Gem::Requirement
144
144
  requirements:
145
145
  - - ">="
146
146
  - !ruby/object:Gem::Version
147
- version: '0'
147
+ version: 1.7.9
148
148
  type: :runtime
149
149
  prerelease: false
150
150
  version_requirements: !ruby/object:Gem::Requirement
151
151
  requirements:
152
152
  - - ">="
153
153
  - !ruby/object:Gem::Version
154
- version: '0'
154
+ version: 1.7.9
155
155
  email:
156
156
  - ruby@shopify.com
157
157
  executables:
@@ -280,6 +280,7 @@ files:
280
280
  - lib/tapioca/runtime/attached_class_of_legacy.rb
281
281
  - lib/tapioca/runtime/dynamic_mixin_compiler.rb
282
282
  - lib/tapioca/runtime/generic_type_registry.rb
283
+ - lib/tapioca/runtime/helpers.rb
283
284
  - lib/tapioca/runtime/reflection.rb
284
285
  - lib/tapioca/runtime/source_location.rb
285
286
  - lib/tapioca/runtime/trackers.rb