sorbet-runtime 0.0.1.pre.prealpha → 0.4.4253

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +5 -5
  2. data/lib/sorbet-runtime.rb +100 -0
  3. data/lib/types/_types.rb +245 -0
  4. data/lib/types/abstract_utils.rb +50 -0
  5. data/lib/types/boolean.rb +8 -0
  6. data/lib/types/compatibility_patches.rb +37 -0
  7. data/lib/types/configuration.rb +368 -0
  8. data/lib/types/generic.rb +23 -0
  9. data/lib/types/helpers.rb +31 -0
  10. data/lib/types/interface_wrapper.rb +158 -0
  11. data/lib/types/private/abstract/data.rb +36 -0
  12. data/lib/types/private/abstract/declare.rb +39 -0
  13. data/lib/types/private/abstract/hooks.rb +43 -0
  14. data/lib/types/private/abstract/validate.rb +128 -0
  15. data/lib/types/private/casts.rb +22 -0
  16. data/lib/types/private/class_utils.rb +102 -0
  17. data/lib/types/private/decl_state.rb +18 -0
  18. data/lib/types/private/error_handler.rb +37 -0
  19. data/lib/types/private/methods/_methods.rb +344 -0
  20. data/lib/types/private/methods/call_validation.rb +1177 -0
  21. data/lib/types/private/methods/decl_builder.rb +275 -0
  22. data/lib/types/private/methods/modes.rb +18 -0
  23. data/lib/types/private/methods/signature.rb +196 -0
  24. data/lib/types/private/methods/signature_validation.rb +232 -0
  25. data/lib/types/private/mixins/mixins.rb +27 -0
  26. data/lib/types/private/runtime_levels.rb +41 -0
  27. data/lib/types/private/types/not_typed.rb +23 -0
  28. data/lib/types/private/types/string_holder.rb +26 -0
  29. data/lib/types/private/types/void.rb +33 -0
  30. data/lib/types/profile.rb +27 -0
  31. data/lib/types/props/_props.rb +165 -0
  32. data/lib/types/props/constructor.rb +20 -0
  33. data/lib/types/props/custom_type.rb +84 -0
  34. data/lib/types/props/decorator.rb +826 -0
  35. data/lib/types/props/errors.rb +8 -0
  36. data/lib/types/props/optional.rb +73 -0
  37. data/lib/types/props/plugin.rb +15 -0
  38. data/lib/types/props/pretty_printable.rb +106 -0
  39. data/lib/types/props/serializable.rb +376 -0
  40. data/lib/types/props/type_validation.rb +98 -0
  41. data/lib/types/props/utils.rb +49 -0
  42. data/lib/types/props/weak_constructor.rb +30 -0
  43. data/lib/types/runtime_profiled.rb +36 -0
  44. data/lib/types/sig.rb +28 -0
  45. data/lib/types/struct.rb +8 -0
  46. data/lib/types/types/base.rb +141 -0
  47. data/lib/types/types/class_of.rb +38 -0
  48. data/lib/types/types/enum.rb +42 -0
  49. data/lib/types/types/fixed_array.rb +60 -0
  50. data/lib/types/types/fixed_hash.rb +59 -0
  51. data/lib/types/types/intersection.rb +36 -0
  52. data/lib/types/types/noreturn.rb +25 -0
  53. data/lib/types/types/proc.rb +51 -0
  54. data/lib/types/types/self_type.rb +31 -0
  55. data/lib/types/types/simple.rb +33 -0
  56. data/lib/types/types/type_member.rb +7 -0
  57. data/lib/types/types/type_parameter.rb +23 -0
  58. data/lib/types/types/type_template.rb +7 -0
  59. data/lib/types/types/type_variable.rb +31 -0
  60. data/lib/types/types/typed_array.rb +20 -0
  61. data/lib/types/types/typed_enumerable.rb +141 -0
  62. data/lib/types/types/typed_enumerator.rb +22 -0
  63. data/lib/types/types/typed_hash.rb +29 -0
  64. data/lib/types/types/typed_range.rb +22 -0
  65. data/lib/types/types/typed_set.rb +22 -0
  66. data/lib/types/types/union.rb +59 -0
  67. data/lib/types/types/untyped.rb +25 -0
  68. data/lib/types/utils.rb +223 -0
  69. metadata +122 -15
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Types
5
+ class TypedEnumerator < TypedEnumerable
6
+ attr_reader :type
7
+
8
+ # @override Base
9
+ def name
10
+ "T::Enumerator[#{@type.name}]"
11
+ end
12
+
13
+ # @override Base
14
+ def valid?(obj)
15
+ obj.is_a?(Enumerator) && super
16
+ end
17
+
18
+ def new(*args, &blk) # rubocop:disable PrisonGuard/BanBuiltinMethodOverride
19
+ T.unsafe(Enumerator).new(*args, &blk)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Types
5
+ class TypedHash < TypedEnumerable
6
+ # Technically we don't need these, but they are a nice api
7
+ attr_reader :keys, :values
8
+
9
+ def initialize(keys:, values:)
10
+ @keys = T::Utils.coerce(keys)
11
+ @values = T::Utils.coerce(values)
12
+ @type = T::Utils.coerce([keys, values])
13
+ end
14
+
15
+ # @override Base
16
+ def name
17
+ "T::Hash[#{@keys.name}, #{@values.name}]"
18
+ end
19
+
20
+ # @override Base
21
+ def valid?(obj)
22
+ obj.is_a?(Hash) && super
23
+ end
24
+
25
+ def new(*args, &blk) # rubocop:disable PrisonGuard/BanBuiltinMethodOverride
26
+ Hash.new(*T.unsafe(args), &blk) # rubocop:disable PrisonGuard/RestrictHashDefaults
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Types
5
+ class TypedRange < TypedEnumerable
6
+ attr_reader :type
7
+
8
+ # @override Base
9
+ def name
10
+ "T::Range[#{@type.name}]"
11
+ end
12
+
13
+ # @override Base
14
+ def valid?(obj)
15
+ obj.is_a?(Range) && super
16
+ end
17
+
18
+ def new(*args) # rubocop:disable PrisonGuard/BanBuiltinMethodOverride
19
+ T.unsafe(Range).new(*args)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Types
5
+ class TypedSet < TypedEnumerable
6
+ attr_reader :type
7
+
8
+ # @override Base
9
+ def name
10
+ "T::Set[#{@type.name}]"
11
+ end
12
+
13
+ # @override Base
14
+ def valid?(obj)
15
+ obj.is_a?(Set) && super
16
+ end
17
+
18
+ def new(*args) # rubocop:disable PrisonGuard/BanBuiltinMethodOverride
19
+ Set.new(*T.unsafe(args))
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Types
5
+ # Takes a list of types. Validates that an object matches at least one of the types.
6
+ class Union < Base
7
+ attr_reader :types
8
+
9
+ def initialize(types)
10
+ @types = types.flat_map do |type|
11
+ if type.is_a?(Union)
12
+ # Simplify nested unions (mostly so `name` returns a nicer value)
13
+ type.types
14
+ else
15
+ T::Utils.coerce(type)
16
+ end
17
+ end.uniq
18
+ end
19
+
20
+ # @override Base
21
+ def name
22
+ type_shortcuts(@types)
23
+ end
24
+
25
+ private def type_shortcuts(types)
26
+ if types.size == 1
27
+ return types[0].name
28
+ end
29
+ nilable = T::Utils.coerce(NilClass)
30
+ trueclass = T::Utils.coerce(TrueClass)
31
+ falseclass = T::Utils.coerce(FalseClass)
32
+ if types.any? {|t| t == nilable}
33
+ remaining_types = types.reject {|t| t == nilable}
34
+ "T.nilable(#{type_shortcuts(remaining_types)})"
35
+ elsif types.any? {|t| t == trueclass} && types.any? {|t| t == falseclass}
36
+ remaining_types = types.reject {|t| t == trueclass || t == falseclass}
37
+ type_shortcuts([T::Private::Types::StringHolder.new("T::Boolean")] + remaining_types)
38
+ else
39
+ names = types.map(&:name).compact.sort
40
+ "T.any(#{names.join(', ')})"
41
+ end
42
+ end
43
+
44
+ # @override Base
45
+ def valid?(obj)
46
+ @types.each do |type|
47
+ return true if type.valid?(obj)
48
+ end
49
+
50
+ false
51
+ end
52
+
53
+ # @override Base
54
+ private def subtype_of_single?(other)
55
+ raise "This should never be reached if you're going through `subtype_of?` (and you should be)"
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Types
5
+ # A dynamic type, which permits whatever
6
+ class Untyped < Base
7
+
8
+ def initialize; end
9
+
10
+ # @override Base
11
+ def name
12
+ "T.untyped"
13
+ end
14
+
15
+ # @override Base
16
+ def valid?(obj)
17
+ true
18
+ end
19
+
20
+ # @override Base
21
+ private def subtype_of_single?(other)
22
+ true
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ module T::Utils
5
+ # Used to convert from a type specification to a `T::Types::Base`.
6
+ def self.coerce(val)
7
+ if val.is_a?(T::Types::Base)
8
+ val
9
+ elsif val == ::Array
10
+ T::Array[T.untyped]
11
+ elsif val == ::Set
12
+ T::Set[T.untyped]
13
+ elsif val == ::Hash
14
+ T::Hash[T.untyped, T.untyped]
15
+ elsif val == ::Enumerable
16
+ T::Enumerable[T.untyped]
17
+ elsif val == ::Enumerator
18
+ T::Enumerator[T.untyped]
19
+ elsif val == ::Range
20
+ T::Range[T.untyped]
21
+ elsif val.is_a?(Module)
22
+ T::Types::Simple.new(val) # rubocop:disable PrisonGuard/UseOpusTypesShortcut
23
+ elsif val.is_a?(::Array)
24
+ T::Types::FixedArray.new(val) # rubocop:disable PrisonGuard/UseOpusTypesShortcut
25
+ elsif val.is_a?(::Hash)
26
+ T::Types::FixedHash.new(val) # rubocop:disable PrisonGuard/UseOpusTypesShortcut
27
+ elsif val.is_a?(T::Private::Methods::DeclBuilder)
28
+ T::Private::Methods.finalize_proc(val.decl)
29
+ else
30
+ raise "Invalid value for type constraint. Must be an #{T::Types::Base}, a " \
31
+ "class/module, or an array. Got a `#{val.class}`."
32
+ end
33
+ end
34
+
35
+ # Returns the set of all methods (public, protected, private) defined on a module or its
36
+ # ancestors, excluding Object and its ancestors. Overrides of methods from Object (and its
37
+ # ancestors) are included.
38
+ def self.methods_excluding_object(mod)
39
+ # We can't just do mod.instance_methods - Object.instance_methods, because that would leave out
40
+ # any methods from Object that are overridden in mod.
41
+ mod.ancestors.flat_map do |ancestor|
42
+ # equivalent to checking Object.ancestors.include?(ancestor)
43
+ next [] if Object <= ancestor
44
+ ancestor.instance_methods(false) + ancestor.private_instance_methods(false)
45
+ end.uniq
46
+ end
47
+
48
+ # Associates a signature with a forwarder method that matches the signature of the method it
49
+ # forwards to. This is necessary because forwarder methods are often declared with catch-all
50
+ # splat parameters, rather than the exact set of parameters ultimately used by the target method,
51
+ # so they cannot be validated as strictly.
52
+ #
53
+ # The caller of this method must ensure that the forwarder method properly forwards all parameters
54
+ # such that the signature is accurate.
55
+ def self.register_forwarder(from_method, to_method, remove_first_param: false)
56
+ T::Private::Methods.register_forwarder(
57
+ from_method, to_method, remove_first_param: remove_first_param
58
+ )
59
+ end
60
+
61
+ # Returns the signature for the instance method on the supplied module, or nil if it's not found or not typed.
62
+ #
63
+ # @example T::Utils.signature_for_instance_method(MyClass, :my_method)
64
+ def self.signature_for_instance_method(mod, method_name)
65
+ T::Private::Methods.signature_for_method(mod.instance_method(method_name))
66
+ end
67
+
68
+ def self.wrap_method_with_call_validation_if_needed(mod, method_sig, original_method)
69
+ T::Private::Methods::CallValidation.wrap_method_if_needed(mod, method_sig, original_method)
70
+ end
71
+
72
+ # Unwraps all the sigs.
73
+ def self.run_all_sig_blocks
74
+ T::Private::Methods.run_all_sig_blocks
75
+ end
76
+
77
+ # This can be called in a wholesome test to make sure all the `sig`s are well
78
+ # formed.
79
+ def self.validate_sigs
80
+ exceptions = []
81
+ run_all_sig_blocks
82
+ ObjectSpace.each_object(Module) do |mod| # rubocop:disable PrisonGuard/NoDynamicConstAccess
83
+ begin
84
+ T::Private::Abstract::Validate.validate_subclass(mod)
85
+ if T::AbstractUtils.abstract_module?(mod)
86
+ T::Private::Abstract::Validate.validate_abstract_module(mod)
87
+ end
88
+ rescue => e
89
+ exceptions << e
90
+ end
91
+ end
92
+ if !exceptions.empty?
93
+ raise "#{exceptions.count} exception thrown during validation:\n\n#{exceptions.map(&:message).sort.join("\n\n")}"
94
+ end
95
+ end
96
+
97
+ # Give a type which is a subclass of T::Types::Base, determines if the type is a simple nilable type (union of NilClass and something else).
98
+ # If so, returns the T::Types::Base of the something else. Otherwise, returns nil.
99
+ def self.unwrap_nilable(type)
100
+ case type
101
+ when T::Types::Union
102
+ non_nil_types = type.types.reject {|t| t == T::Utils.coerce(NilClass)}
103
+ if non_nil_types.length == 1
104
+ non_nil_types.first
105
+ else
106
+ nil
107
+ end
108
+ else
109
+ nil
110
+ end
111
+ end
112
+
113
+ def self.DANGER_enable_checking_in_tests
114
+ T::Private::RuntimeLevels.enable_checking_in_tests
115
+ end
116
+
117
+ # Returns the arity of a method, unwrapping the sig if needed
118
+ def self.arity(method)
119
+ arity = method.arity # rubocop:disable PrisonGuard/NoArity
120
+ return arity if arity != -1 || method.is_a?(Proc)
121
+ sig = T::Private::Methods.signature_for_method(method)
122
+ sig ? sig.method.arity : arity # rubocop:disable PrisonGuard/NoArity
123
+ end
124
+
125
+ # Elide the middle of a string as needed and replace it with an ellipsis.
126
+ # Keep the given number of characters at the start and end of the string.
127
+ #
128
+ # This method operates on string length, not byte length.
129
+ #
130
+ # If the string is shorter than the requested truncation length, return it
131
+ # without adding an ellipsis. This method may return a longer string than
132
+ # the original if the characters removed are shorter than the ellipsis.
133
+ #
134
+ # @param [String] str
135
+ #
136
+ # @param [Fixnum] start_len The length of string before the ellipsis
137
+ # @param [Fixnum] end_len The length of string after the ellipsis
138
+ #
139
+ # @param [String] ellipsis The string to add in place of the elided text
140
+ #
141
+ # @return [String]
142
+ #
143
+ def self.string_truncate_middle(str, start_len, end_len, ellipsis='...')
144
+ return unless str
145
+
146
+ raise ArgumentError.new('must provide start_len') unless start_len
147
+ raise ArgumentError.new('must provide end_len') unless end_len
148
+
149
+ raise ArgumentError.new('start_len must be >= 0') if start_len < 0
150
+ raise ArgumentError.new('end_len must be >= 0') if end_len < 0
151
+
152
+ str = str.to_s
153
+ return str if str.length <= start_len + end_len
154
+
155
+ start_part = str[0...start_len - ellipsis.length]
156
+ end_part = end_len == 0 ? '' : str[-end_len..-1]
157
+
158
+ "#{start_part}#{ellipsis}#{end_part}"
159
+ end
160
+
161
+ module Props
162
+ def self.required_prop?(prop_rules)
163
+ # Clients should never reference :_tnilable as the implementation can change.
164
+ !prop_rules[:_tnilable]
165
+ end
166
+
167
+ def self.optional_prop?(prop_rules)
168
+ # Clients should never reference :_tnilable as the implementation can change.
169
+ !!prop_rules[:_tnilable]
170
+ end
171
+
172
+ def self.merge_serialized_optional_rule(prop_rules)
173
+ {'_tnilable' => true}.merge(prop_rules.merge('_tnilable' => true))
174
+ end
175
+ end
176
+
177
+ module Nilable
178
+ # :is_union_type, T::Boolean: whether the type is an T::Types::Union type
179
+ # :non_nilable_type, Class: if it is an T.nilable type, the corresponding underlying type; otherwise, nil.
180
+ TypeInfo = Struct.new(:is_union_type, :non_nilable_type)
181
+
182
+ def self.get_type_info(prop_type)
183
+ if prop_type.is_a?(T::Types::Union)
184
+ non_nilable_type = T::Utils.unwrap_nilable(prop_type)
185
+ if non_nilable_type && non_nilable_type.is_a?(T::Types::Simple)
186
+ non_nilable_type = non_nilable_type.raw_type
187
+ end
188
+ TypeInfo.new(true, non_nilable_type)
189
+ else
190
+ TypeInfo.new(false, nil)
191
+ end
192
+ end
193
+
194
+ # Get the underlying type inside prop_type:
195
+ # - if the type is A, the function returns A
196
+ # - if the type is T.nilable(A), the function returns A
197
+ def self.get_underlying_type(prop_type)
198
+ type_info = get_type_info(prop_type)
199
+ if type_info.is_union_type
200
+ type_info.non_nilable_type || prop_type
201
+ elsif prop_type.is_a?(T::Types::Simple)
202
+ prop_type.raw_type
203
+ else
204
+ prop_type
205
+ end
206
+ end
207
+
208
+ # The difference between this function and the above function is that the Sorbet type, like T::Types::Simple
209
+ # is preserved.
210
+ def self.get_underlying_type_object(prop_type)
211
+ T::Utils.unwrap_nilable(prop_type) || prop_type
212
+ end
213
+
214
+ def self.is_union_with_nilclass(prop_type)
215
+ case prop_type
216
+ when T::Types::Union
217
+ prop_type.types.any? {|t| t == T::Utils.coerce(NilClass)}
218
+ else
219
+ false
220
+ end
221
+ end
222
+ end
223
+ end
metadata CHANGED
@@ -1,27 +1,133 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorbet-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.pre.prealpha
4
+ version: 0.4.4253
5
5
  platform: ruby
6
6
  authors:
7
- - Dmitry Petrashko
8
- - Nelson Elhage
9
- - Paul Tarjan
7
+ - Stripe
10
8
  autorequire:
11
9
  bindir: bin
12
10
  cert_chain: []
13
- date: 2019-05-17 00:00:00.000000000 Z
14
- dependencies: []
15
- description: '"There will be a description here one day"'
16
- email:
17
- - sorbet@stripe.com
11
+ date: 2019-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Sorbet's runtime type checking component
56
+ email:
18
57
  executables: []
19
58
  extensions: []
20
59
  extra_rdoc_files: []
21
- files: []
60
+ files:
61
+ - lib/sorbet-runtime.rb
62
+ - lib/types/_types.rb
63
+ - lib/types/abstract_utils.rb
64
+ - lib/types/boolean.rb
65
+ - lib/types/compatibility_patches.rb
66
+ - lib/types/configuration.rb
67
+ - lib/types/generic.rb
68
+ - lib/types/helpers.rb
69
+ - lib/types/interface_wrapper.rb
70
+ - lib/types/private/abstract/data.rb
71
+ - lib/types/private/abstract/declare.rb
72
+ - lib/types/private/abstract/hooks.rb
73
+ - lib/types/private/abstract/validate.rb
74
+ - lib/types/private/casts.rb
75
+ - lib/types/private/class_utils.rb
76
+ - lib/types/private/decl_state.rb
77
+ - lib/types/private/error_handler.rb
78
+ - lib/types/private/methods/_methods.rb
79
+ - lib/types/private/methods/call_validation.rb
80
+ - lib/types/private/methods/decl_builder.rb
81
+ - lib/types/private/methods/modes.rb
82
+ - lib/types/private/methods/signature.rb
83
+ - lib/types/private/methods/signature_validation.rb
84
+ - lib/types/private/mixins/mixins.rb
85
+ - lib/types/private/runtime_levels.rb
86
+ - lib/types/private/types/not_typed.rb
87
+ - lib/types/private/types/string_holder.rb
88
+ - lib/types/private/types/void.rb
89
+ - lib/types/profile.rb
90
+ - lib/types/props/_props.rb
91
+ - lib/types/props/constructor.rb
92
+ - lib/types/props/custom_type.rb
93
+ - lib/types/props/decorator.rb
94
+ - lib/types/props/errors.rb
95
+ - lib/types/props/optional.rb
96
+ - lib/types/props/plugin.rb
97
+ - lib/types/props/pretty_printable.rb
98
+ - lib/types/props/serializable.rb
99
+ - lib/types/props/type_validation.rb
100
+ - lib/types/props/utils.rb
101
+ - lib/types/props/weak_constructor.rb
102
+ - lib/types/runtime_profiled.rb
103
+ - lib/types/sig.rb
104
+ - lib/types/struct.rb
105
+ - lib/types/types/base.rb
106
+ - lib/types/types/class_of.rb
107
+ - lib/types/types/enum.rb
108
+ - lib/types/types/fixed_array.rb
109
+ - lib/types/types/fixed_hash.rb
110
+ - lib/types/types/intersection.rb
111
+ - lib/types/types/noreturn.rb
112
+ - lib/types/types/proc.rb
113
+ - lib/types/types/self_type.rb
114
+ - lib/types/types/simple.rb
115
+ - lib/types/types/type_member.rb
116
+ - lib/types/types/type_parameter.rb
117
+ - lib/types/types/type_template.rb
118
+ - lib/types/types/type_variable.rb
119
+ - lib/types/types/typed_array.rb
120
+ - lib/types/types/typed_enumerable.rb
121
+ - lib/types/types/typed_enumerator.rb
122
+ - lib/types/types/typed_hash.rb
123
+ - lib/types/types/typed_range.rb
124
+ - lib/types/types/typed_set.rb
125
+ - lib/types/types/union.rb
126
+ - lib/types/types/untyped.rb
127
+ - lib/types/utils.rb
22
128
  homepage: https://sorbet.run
23
129
  licenses:
24
- - Nonstandard
130
+ - Apache-2.0
25
131
  metadata: {}
26
132
  post_install_message:
27
133
  rdoc_options: []
@@ -34,12 +140,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
34
140
  version: '0'
35
141
  required_rubygems_version: !ruby/object:Gem::Requirement
36
142
  requirements:
37
- - - ">"
143
+ - - ">="
38
144
  - !ruby/object:Gem::Version
39
- version: 1.3.1
145
+ version: '0'
40
146
  requirements: []
41
- rubygems_version: 3.0.3
147
+ rubyforge_project:
148
+ rubygems_version: 2.6.14
42
149
  signing_key:
43
150
  specification_version: 4
44
- summary: '"There will be sorbet typechecker here one day"'
151
+ summary: Sorbet runtime
45
152
  test_files: []