sorbet-runtime 0.5.11144 → 0.5.11663

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sorbet-runtime.rb +1 -4
  3. data/lib/types/compatibility_patches.rb +1 -1
  4. data/lib/types/configuration.rb +3 -2
  5. data/lib/types/enum.rb +63 -39
  6. data/lib/types/non_forcing_constants.rb +4 -14
  7. data/lib/types/private/abstract/declare.rb +4 -5
  8. data/lib/types/private/caller_utils.rb +27 -0
  9. data/lib/types/private/class_utils.rb +1 -1
  10. data/lib/types/private/methods/_methods.rb +35 -30
  11. data/lib/types/private/methods/call_validation.rb +48 -16
  12. data/lib/types/private/methods/call_validation_2_6.rb +518 -0
  13. data/lib/types/private/methods/call_validation_2_7.rb +518 -0
  14. data/lib/types/private/methods/decl_builder.rb +4 -4
  15. data/lib/types/private/methods/signature.rb +10 -2
  16. data/lib/types/private/methods/signature_validation.rb +13 -7
  17. data/lib/types/private/runtime_levels.rb +0 -3
  18. data/lib/types/private/sealed.rb +8 -8
  19. data/lib/types/private/types/not_typed.rb +4 -0
  20. data/lib/types/private/types/string_holder.rb +4 -0
  21. data/lib/types/private/types/type_alias.rb +4 -0
  22. data/lib/types/private/types/void.rb +4 -0
  23. data/lib/types/props/_props.rb +3 -3
  24. data/lib/types/props/decorator.rb +9 -8
  25. data/lib/types/props/has_lazily_specialized_methods.rb +5 -1
  26. data/lib/types/props/pretty_printable.rb +7 -7
  27. data/lib/types/props/private/deserializer_generator.rb +4 -1
  28. data/lib/types/props/private/setter_factory.rb +129 -69
  29. data/lib/types/props/serializable.rb +24 -3
  30. data/lib/types/struct.rb +1 -1
  31. data/lib/types/types/anything.rb +4 -0
  32. data/lib/types/types/attached_class.rb +4 -0
  33. data/lib/types/types/base.rb +8 -2
  34. data/lib/types/types/class_of.rb +6 -2
  35. data/lib/types/types/enum.rb +5 -1
  36. data/lib/types/types/fixed_array.rb +19 -12
  37. data/lib/types/types/fixed_hash.rb +16 -9
  38. data/lib/types/types/intersection.rb +13 -6
  39. data/lib/types/types/noreturn.rb +4 -0
  40. data/lib/types/types/proc.rb +19 -9
  41. data/lib/types/types/self_type.rb +4 -0
  42. data/lib/types/types/simple.rb +9 -0
  43. data/lib/types/types/t_enum.rb +4 -0
  44. data/lib/types/types/type_parameter.rb +4 -0
  45. data/lib/types/types/type_variable.rb +4 -0
  46. data/lib/types/types/typed_array.rb +7 -2
  47. data/lib/types/types/typed_class.rb +22 -5
  48. data/lib/types/types/typed_enumerable.rb +22 -16
  49. data/lib/types/types/typed_enumerator.rb +2 -4
  50. data/lib/types/types/typed_enumerator_chain.rb +2 -4
  51. data/lib/types/types/typed_enumerator_lazy.rb +2 -4
  52. data/lib/types/types/typed_hash.rb +17 -7
  53. data/lib/types/types/typed_range.rb +2 -4
  54. data/lib/types/types/typed_set.rb +3 -5
  55. data/lib/types/types/union.rb +12 -5
  56. data/lib/types/types/untyped.rb +4 -0
  57. data/lib/types/utils.rb +7 -5
  58. metadata +23 -24
  59. data/lib/types/interface_wrapper.rb +0 -162
  60. data/lib/types/private/compiler.rb +0 -24
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorbet-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.11144
4
+ version: 0.5.11663
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-01 00:00:00.000000000 Z
11
+ date: 2024-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -56,30 +56,30 @@ dependencies:
56
56
  name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.90.0
61
+ version: 1.57.1
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 0.90.0
68
+ version: 1.57.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rubocop-performance
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: 1.8.0
75
+ version: 1.13.2
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 1.8.0
82
+ version: 1.13.2
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: concurrent-ruby
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: 1.1.5
97
97
  - !ruby/object:Gem::Dependency
98
- name: pry
98
+ name: debug
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: pry-byebug
112
+ name: pry
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,19 +123,19 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: parser
126
+ name: pry-byebug
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 2.7.1
131
+ version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: 2.7.1
138
+ version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: subprocess
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -151,7 +151,7 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: 1.5.3
153
153
  description: Sorbet's runtime type checking component
154
- email:
154
+ email:
155
155
  executables: []
156
156
  extensions: []
157
157
  extra_rdoc_files: []
@@ -165,15 +165,14 @@ files:
165
165
  - lib/types/enum.rb
166
166
  - lib/types/generic.rb
167
167
  - lib/types/helpers.rb
168
- - lib/types/interface_wrapper.rb
169
168
  - lib/types/non_forcing_constants.rb
170
169
  - lib/types/private/abstract/data.rb
171
170
  - lib/types/private/abstract/declare.rb
172
171
  - lib/types/private/abstract/hooks.rb
173
172
  - lib/types/private/abstract/validate.rb
173
+ - lib/types/private/caller_utils.rb
174
174
  - lib/types/private/casts.rb
175
175
  - lib/types/private/class_utils.rb
176
- - lib/types/private/compiler.rb
177
176
  - lib/types/private/decl_state.rb
178
177
  - lib/types/private/final.rb
179
178
  - lib/types/private/methods/_methods.rb
@@ -249,7 +248,7 @@ licenses:
249
248
  - Apache-2.0
250
249
  metadata:
251
250
  source_code_uri: https://github.com/sorbet/sorbet
252
- post_install_message:
251
+ post_install_message:
253
252
  rdoc_options: []
254
253
  require_paths:
255
254
  - lib
@@ -264,8 +263,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
263
  - !ruby/object:Gem::Version
265
264
  version: '0'
266
265
  requirements: []
267
- rubygems_version: 3.3.7
268
- signing_key:
266
+ rubygems_version: 3.5.3
267
+ signing_key:
269
268
  specification_version: 4
270
269
  summary: Sorbet runtime
271
270
  test_files: []
@@ -1,162 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: false
3
-
4
- # Wraps an object, exposing only the methods defined on a given class/module. The idea is that, in
5
- # the absence of a static type checker that would prevent you from calling non-Bar methods on a
6
- # variable of type Bar, we can use these wrappers as a way of enforcing it at runtime.
7
- #
8
- # Once we ship static type checking, we should get rid of this entirely.
9
- class T::InterfaceWrapper
10
- extend T::Sig
11
-
12
- module Helpers
13
- def wrap_instance(obj)
14
- T::InterfaceWrapper.wrap_instance(obj, self)
15
- end
16
-
17
- def wrap_instances(arr)
18
- T::InterfaceWrapper.wrap_instances(arr, self)
19
- end
20
- end
21
-
22
- private_class_method :new # use `wrap_instance`
23
-
24
- def self.wrap_instance(obj, interface_mod)
25
- wrapper = wrapped_dynamic_cast(obj, interface_mod)
26
- if wrapper.nil?
27
- raise "#{obj.class} cannot be cast to #{interface_mod}"
28
- end
29
- wrapper
30
- end
31
-
32
- sig do
33
- params(
34
- arr: Array,
35
- interface_mod: T.untyped
36
- )
37
- .returns(Array)
38
- end
39
- def self.wrap_instances(arr, interface_mod)
40
- arr.map {|instance| self.wrap_instance(instance, interface_mod)}
41
- end
42
-
43
- def initialize(target_obj, interface_mod)
44
- if target_obj.is_a?(T::InterfaceWrapper)
45
- # wrapped_dynamic_cast should guarantee this never happens.
46
- raise "Unexpected: wrapping a wrapper. Please report this bug at https://github.com/sorbet/sorbet/issues"
47
- end
48
-
49
- if !target_obj.is_a?(interface_mod)
50
- # wrapped_dynamic_cast should guarantee this never happens.
51
- raise "Unexpected: `is_a?` failed. Please report this bug at https://github.com/sorbet/sorbet/issues"
52
- end
53
-
54
- if target_obj.class == interface_mod
55
- # wrapped_dynamic_cast should guarantee this never happens.
56
- raise "Unexpected: exact class match. Please report this bug at https://github.com/sorbet/sorbet/issues"
57
- end
58
-
59
- @target_obj = target_obj
60
- @interface_mod = interface_mod
61
- self_methods = self.class.self_methods
62
-
63
- # If perf becomes an issue, we can define these on an anonymous subclass, and keep a cache
64
- # so we only need to do it once per unique `interface_mod`
65
- T::Utils.methods_excluding_object(interface_mod).each do |method_name|
66
- if self_methods.include?(method_name)
67
- raise "interface_mod has a method that conflicts with #{self.class}: #{method_name}"
68
- end
69
-
70
- define_singleton_method(method_name) do |*args, &blk|
71
- target_obj.send(method_name, *args, &blk)
72
- end
73
-
74
- if singleton_class.respond_to?(:ruby2_keywords, true)
75
- singleton_class.send(:ruby2_keywords, method_name)
76
- end
77
-
78
- if target_obj.singleton_class.public_method_defined?(method_name)
79
- # no-op, it's already public
80
- elsif target_obj.singleton_class.protected_method_defined?(method_name)
81
- singleton_class.send(:protected, method_name)
82
- elsif target_obj.singleton_class.private_method_defined?(method_name)
83
- singleton_class.send(:private, method_name)
84
- else
85
- raise "This should never happen. Report this bug at https://github.com/sorbet/sorbet/issues"
86
- end
87
- end
88
- end
89
-
90
- def kind_of?(other)
91
- is_a?(other)
92
- end
93
-
94
- def is_a?(other)
95
- if !other.is_a?(Module)
96
- raise TypeError.new("class or module required")
97
- end
98
-
99
- # This makes is_a? return true for T::InterfaceWrapper (and its ancestors),
100
- # as well as for @interface_mod and its ancestors.
101
- self.class <= other || @interface_mod <= other
102
- end
103
-
104
- # Prefixed because we're polluting the namespace of the interface we're wrapping, and we don't
105
- # want anyone else (besides dynamic_cast) calling it.
106
- def __target_obj_DO_NOT_USE # rubocop:disable Naming/MethodName
107
- @target_obj
108
- end
109
-
110
- # Prefixed because we're polluting the namespace of the interface we're wrapping, and we don't
111
- # want anyone else (besides wrapped_dynamic_cast) calling it.
112
- def __interface_mod_DO_NOT_USE # rubocop:disable Naming/MethodName
113
- @interface_mod
114
- end
115
-
116
- # "Cast" an object to another type. If `obj` is an InterfaceWrapper, returns the the wrapped
117
- # object if that matches `type`. Otherwise, returns `obj` if it matches `type`. Otherwise,
118
- # returns nil.
119
- #
120
- # @param obj [Object] object to cast
121
- # @param mod [Module] type to cast `obj` to
122
- #
123
- # @example
124
- # if (impl = T::InterfaceWrapper.dynamic_cast(iface, MyImplementation))
125
- # impl.do_things
126
- # end
127
- def self.dynamic_cast(obj, mod)
128
- if obj.is_a?(T::InterfaceWrapper)
129
- target_obj = obj.__target_obj_DO_NOT_USE
130
- target_obj.is_a?(mod) ? target_obj : nil
131
- elsif obj.is_a?(mod)
132
- obj
133
- else
134
- nil
135
- end
136
- end
137
-
138
- # Like dynamic_cast, but puts the result in its own wrapper if necessary.
139
- #
140
- # @param obj [Object] object to cast
141
- # @param mod [Module] type to cast `obj` to
142
- def self.wrapped_dynamic_cast(obj, mod)
143
- # Avoid unwrapping and creating an equivalent wrapper.
144
- if obj.is_a?(T::InterfaceWrapper) && obj.__interface_mod_DO_NOT_USE == mod
145
- return obj
146
- end
147
-
148
- cast_obj = dynamic_cast(obj, mod)
149
- if cast_obj.nil?
150
- nil
151
- elsif cast_obj.class == mod
152
- # Nothing to wrap, they want the full class
153
- cast_obj
154
- else
155
- new(cast_obj, mod)
156
- end
157
- end
158
-
159
- def self.self_methods
160
- @self_methods ||= self.instance_methods(false).to_set
161
- end
162
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: true
3
-
4
- module T::Private
5
- module Compiler
6
- # If this code ever runs, the caller is running interpreted (or the
7
- # compiler didn't see the call to `running_compiled?` statically.)
8
- #
9
- # The Sorbet Compiler replaces calls to this method unconditionally (no
10
- # runtime guards) to return `true` when compiling a file.
11
- def self.running_compiled?
12
- false
13
- end
14
-
15
- # Returns `nil` because the compiler isn't running.
16
- #
17
- # The Sorbet Compiler replaces calls to this method unconditionally (no
18
- # runtime guards) to return a String showing the Sorbet Compiler's version
19
- # string.
20
- def self.compiler_version
21
- nil
22
- end
23
- end
24
- end