sorbet-runtime 0.5.12164 → 0.5.12167
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/lib/types/_types.rb +1 -1
- data/lib/types/boolean.rb +1 -1
- data/lib/types/configuration.rb +4 -4
- data/lib/types/enum.rb +35 -35
- data/lib/types/non_forcing_constants.rb +1 -1
- data/lib/types/private/methods/_methods.rb +3 -3
- data/lib/types/private/methods/call_validation.rb +2 -2
- data/lib/types/private/methods/signature.rb +8 -8
- data/lib/types/private/methods/signature_validation.rb +1 -1
- data/lib/types/private/mixins/mixins.rb +1 -1
- data/lib/types/private/runtime_levels.rb +1 -1
- data/lib/types/private/sealed.rb +4 -4
- data/lib/types/props/_props.rb +2 -2
- data/lib/types/props/constructor.rb +1 -1
- data/lib/types/props/custom_type.rb +5 -5
- data/lib/types/props/decorator.rb +23 -23
- data/lib/types/props/generated_code_validation.rb +4 -4
- data/lib/types/props/has_lazily_specialized_methods.rb +12 -12
- data/lib/types/props/optional.rb +2 -2
- data/lib/types/props/pretty_printable.rb +3 -3
- data/lib/types/props/private/apply_default.rb +15 -15
- data/lib/types/props/private/deserializer_generator.rb +1 -1
- data/lib/types/props/private/serde_transform.rb +8 -8
- data/lib/types/props/private/serializer_generator.rb +1 -1
- data/lib/types/props/private/setter_factory.rb +4 -4
- data/lib/types/props/serializable.rb +10 -10
- data/lib/types/props/type_validation.rb +5 -5
- data/lib/types/props/utils.rb +1 -1
- data/lib/types/props/weak_constructor.rb +3 -3
- data/lib/types/sig.rb +2 -2
- data/lib/types/struct.rb +2 -2
- data/lib/types/types/base.rb +6 -6
- data/lib/types/types/fixed_array.rb +1 -1
- data/lib/types/types/fixed_hash.rb +6 -6
- data/lib/types/types/intersection.rb +2 -2
- data/lib/types/types/union.rb +7 -7
- metadata +2 -2
@@ -10,17 +10,17 @@
|
|
10
10
|
class T::Props::Decorator
|
11
11
|
extend T::Sig
|
12
12
|
|
13
|
-
Rules = T.type_alias {T::Hash[Symbol, T.untyped]}
|
14
|
-
DecoratedInstance = T.type_alias {Object} # Would be T::Props, but that produces circular reference errors in some circumstances
|
15
|
-
PropType = T.type_alias {T::Types::Base}
|
16
|
-
PropTypeOrClass = T.type_alias {T.any(PropType, Module)}
|
13
|
+
Rules = T.type_alias { T::Hash[Symbol, T.untyped] }
|
14
|
+
DecoratedInstance = T.type_alias { Object } # Would be T::Props, but that produces circular reference errors in some circumstances
|
15
|
+
PropType = T.type_alias { T::Types::Base }
|
16
|
+
PropTypeOrClass = T.type_alias { T.any(PropType, Module) }
|
17
17
|
|
18
18
|
class NoRulesError < StandardError; end
|
19
19
|
|
20
20
|
EMPTY_PROPS = T.let({}.freeze, T::Hash[Symbol, Rules], checked: false)
|
21
21
|
private_constant :EMPTY_PROPS
|
22
22
|
|
23
|
-
sig {params(klass: T.untyped).void.checked(:never)}
|
23
|
+
sig { params(klass: T.untyped).void.checked(:never) }
|
24
24
|
def initialize(klass)
|
25
25
|
@class = T.let(klass, T.all(Module, T::Props::ClassMethods))
|
26
26
|
@class.plugins.each do |mod|
|
@@ -30,22 +30,22 @@ class T::Props::Decorator
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# checked(:never) - O(prop accesses)
|
33
|
-
sig {returns(T::Hash[Symbol, Rules]).checked(:never)}
|
33
|
+
sig { returns(T::Hash[Symbol, Rules]).checked(:never) }
|
34
34
|
attr_reader :props
|
35
35
|
|
36
|
-
sig {returns(T::Array[Symbol])}
|
36
|
+
sig { returns(T::Array[Symbol]) }
|
37
37
|
def all_props
|
38
38
|
props.keys
|
39
39
|
end
|
40
40
|
|
41
41
|
# checked(:never) - O(prop accesses)
|
42
|
-
sig {params(prop: T.any(Symbol, String)).returns(Rules).checked(:never)}
|
42
|
+
sig { params(prop: T.any(Symbol, String)).returns(Rules).checked(:never) }
|
43
43
|
def prop_rules(prop)
|
44
44
|
props[prop.to_sym] || raise("No such prop: #{prop.inspect}")
|
45
45
|
end
|
46
46
|
|
47
47
|
# checked(:never) - Rules hash is expensive to check
|
48
|
-
sig {params(prop: Symbol, rules: Rules).void.checked(:never)}
|
48
|
+
sig { params(prop: Symbol, rules: Rules).void.checked(:never) }
|
49
49
|
def add_prop_definition(prop, rules)
|
50
50
|
override = rules.delete(:override)
|
51
51
|
|
@@ -79,16 +79,16 @@ class T::Props::Decorator
|
|
79
79
|
extra
|
80
80
|
setter_validate
|
81
81
|
_tnilable
|
82
|
-
].to_h {|k| [k, true]}.freeze, T::Hash[Symbol, T::Boolean], checked: false)
|
82
|
+
].to_h { |k| [k, true] }.freeze, T::Hash[Symbol, T::Boolean], checked: false)
|
83
83
|
private_constant :VALID_RULE_KEYS
|
84
84
|
|
85
|
-
sig {params(key: Symbol).returns(T::Boolean).checked(:never)}
|
85
|
+
sig { params(key: Symbol).returns(T::Boolean).checked(:never) }
|
86
86
|
def valid_rule_key?(key)
|
87
87
|
!!VALID_RULE_KEYS[key]
|
88
88
|
end
|
89
89
|
|
90
90
|
# checked(:never) - O(prop accesses)
|
91
|
-
sig {returns(T.all(Module, T::Props::ClassMethods)).checked(:never)}
|
91
|
+
sig { returns(T.all(Module, T::Props::ClassMethods)).checked(:never) }
|
92
92
|
def decorated_class
|
93
93
|
@class
|
94
94
|
end
|
@@ -98,7 +98,7 @@ class T::Props::Decorator
|
|
98
98
|
# Use this to validate that a value will validate for a given prop. Useful for knowing whether a value can be set on a model without setting it.
|
99
99
|
#
|
100
100
|
# checked(:never) - potentially O(prop accesses) depending on usage pattern
|
101
|
-
sig {params(prop: Symbol, val: T.untyped).void.checked(:never)}
|
101
|
+
sig { params(prop: Symbol, val: T.untyped).void.checked(:never) }
|
102
102
|
def validate_prop_value(prop, val)
|
103
103
|
prop_rules(prop).fetch(:value_validate_proc).call(val)
|
104
104
|
end
|
@@ -202,7 +202,7 @@ class T::Props::Decorator
|
|
202
202
|
end
|
203
203
|
|
204
204
|
# TODO: we should really be checking all the methods on `cls`, not just Object
|
205
|
-
BANNED_METHOD_NAMES = T.let(Object.instance_methods.each_with_object({}) {|x, acc| acc[x] = true}.freeze, T::Hash[Symbol, TrueClass], checked: false)
|
205
|
+
BANNED_METHOD_NAMES = T.let(Object.instance_methods.each_with_object({}) { |x, acc| acc[x] = true }.freeze, T::Hash[Symbol, TrueClass], checked: false)
|
206
206
|
|
207
207
|
# checked(:never) - Rules hash is expensive to check
|
208
208
|
sig do
|
@@ -223,7 +223,7 @@ class T::Props::Decorator
|
|
223
223
|
"to 'sensitivity:' (in prop #{@class.name}.#{name})")
|
224
224
|
end
|
225
225
|
|
226
|
-
if rules.keys.any? {|k| !valid_rule_key?(k)}
|
226
|
+
if rules.keys.any? { |k| !valid_rule_key?(k) }
|
227
227
|
raise ArgumentError.new("At least one invalid prop arg supplied in #{self}: #{rules.keys.inspect}")
|
228
228
|
end
|
229
229
|
|
@@ -247,7 +247,7 @@ class T::Props::Decorator
|
|
247
247
|
SAFE_NAME = T.let(/\A[A-Za-z_][A-Za-z0-9_-]*\z/.freeze, Regexp, checked: false)
|
248
248
|
|
249
249
|
# Used to validate both prop names and serialized forms
|
250
|
-
sig {params(name: T.any(Symbol, String)).void.checked(:never)}
|
250
|
+
sig { params(name: T.any(Symbol, String)).void.checked(:never) }
|
251
251
|
private def validate_prop_name(name)
|
252
252
|
if !name.match?(SAFE_NAME)
|
253
253
|
raise ArgumentError.new("Invalid prop name in #{@class.name}: #{name}")
|
@@ -255,7 +255,7 @@ class T::Props::Decorator
|
|
255
255
|
end
|
256
256
|
|
257
257
|
# This converts the type from a T::Type to a regular old ruby class.
|
258
|
-
sig {params(type: T::Types::Base).returns(Module).checked(:never)}
|
258
|
+
sig { params(type: T::Types::Base).returns(Module).checked(:never) }
|
259
259
|
private def convert_type_to_class(type)
|
260
260
|
case type
|
261
261
|
when T::Types::TypedArray, T::Types::FixedArray
|
@@ -392,7 +392,7 @@ class T::Props::Decorator
|
|
392
392
|
end
|
393
393
|
|
394
394
|
# checked(:never) - Rules hash is expensive to check
|
395
|
-
sig {params(name: Symbol, rules: Rules).void.checked(:never)}
|
395
|
+
sig { params(name: Symbol, rules: Rules).void.checked(:never) }
|
396
396
|
private def define_getter_and_setter(name, rules)
|
397
397
|
T::Configuration.without_ruby_warnings do
|
398
398
|
if !rules[:immutable]
|
@@ -440,7 +440,7 @@ class T::Props::Decorator
|
|
440
440
|
end
|
441
441
|
|
442
442
|
# checked(:never) - Rules hash is expensive to check
|
443
|
-
sig {params(prop_name: Symbol, rules: Rules).void.checked(:never)}
|
443
|
+
sig { params(prop_name: Symbol, rules: Rules).void.checked(:never) }
|
444
444
|
private def validate_not_missing_sensitivity(prop_name, rules)
|
445
445
|
if rules[:sensitivity].nil?
|
446
446
|
if rules[:redaction]
|
@@ -612,7 +612,7 @@ class T::Props::Decorator
|
|
612
612
|
#
|
613
613
|
# This gets called when a module or class that extends T::Props gets included, extended,
|
614
614
|
# prepended, or inherited.
|
615
|
-
sig {params(child: Module).void.checked(:never)}
|
615
|
+
sig { params(child: Module).void.checked(:never) }
|
616
616
|
def model_inherited(child)
|
617
617
|
child.extend(T::Props::ClassMethods)
|
618
618
|
child = T.cast(child, T.all(Module, T::Props::ClassMethods))
|
@@ -656,19 +656,19 @@ class T::Props::Decorator
|
|
656
656
|
end
|
657
657
|
end
|
658
658
|
|
659
|
-
sig {params(child: T.all(Module, T::Props::ClassMethods), prop: Symbol).returns(T::Boolean).checked(:never)}
|
659
|
+
sig { params(child: T.all(Module, T::Props::ClassMethods), prop: Symbol).returns(T::Boolean).checked(:never) }
|
660
660
|
private def clobber_getter?(child, prop)
|
661
661
|
!!(child.decorator.method(:prop_get).owner != method(:prop_get).owner &&
|
662
662
|
child.instance_method(prop).source_location&.first == __FILE__)
|
663
663
|
end
|
664
664
|
|
665
|
-
sig {params(child: T.all(Module, T::Props::ClassMethods), prop: Symbol).returns(T::Boolean).checked(:never)}
|
665
|
+
sig { params(child: T.all(Module, T::Props::ClassMethods), prop: Symbol).returns(T::Boolean).checked(:never) }
|
666
666
|
private def clobber_setter?(child, prop)
|
667
667
|
!!(child.decorator.method(:prop_set).owner != method(:prop_set).owner &&
|
668
668
|
child.instance_method("#{prop}=").source_location&.first == __FILE__)
|
669
669
|
end
|
670
670
|
|
671
|
-
sig {params(mod: Module).void.checked(:never)}
|
671
|
+
sig { params(mod: Module).void.checked(:never) }
|
672
672
|
def plugin(mod)
|
673
673
|
decorated_class.plugins << mod
|
674
674
|
T::Props::Plugin::Private.apply_class_methods(mod, decorated_class)
|
@@ -159,7 +159,7 @@ module T::Props
|
|
159
159
|
assert_equal(:resbody, rescue_body.type)
|
160
160
|
exceptions, assignment, handler = rescue_body.children
|
161
161
|
assert_equal(:array, exceptions.type)
|
162
|
-
exceptions.children.each {|c| assert_equal(:const, c.type)}
|
162
|
+
exceptions.children.each { |c| assert_equal(:const, c.type) }
|
163
163
|
assert_equal(:lvasgn, assignment.type)
|
164
164
|
assert_equal([:e], assignment.children)
|
165
165
|
|
@@ -169,7 +169,7 @@ module T::Props
|
|
169
169
|
receiver, method, *args = deserialization_error.children
|
170
170
|
assert_equal(nil, receiver)
|
171
171
|
assert_equal(:raise_deserialization_error, method)
|
172
|
-
args.each {|a| validate_lack_of_side_effects(a, whitelisted_methods_for_deserialize)}
|
172
|
+
args.each { |a| validate_lack_of_side_effects(a, whitelisted_methods_for_deserialize) }
|
173
173
|
|
174
174
|
validate_lack_of_side_effects(val_return, whitelisted_methods_for_deserialize)
|
175
175
|
else
|
@@ -222,12 +222,12 @@ module T::Props
|
|
222
222
|
# Primitives & self are ok
|
223
223
|
when :lvar, :arg, :ivar
|
224
224
|
# Reading local & instance variables & arguments is ok
|
225
|
-
unless node.children.all? {|c| c.is_a?(Symbol)}
|
225
|
+
unless node.children.all? { |c| c.is_a?(Symbol) }
|
226
226
|
raise ValidationError.new("Unexpected child for #{node.type}: #{node.inspect}")
|
227
227
|
end
|
228
228
|
when :args, :mlhs, :block, :begin, :if
|
229
229
|
# Blocks etc are read-only if their contents are read-only
|
230
|
-
node.children.each {|c| validate_lack_of_side_effects(c, whitelisted_methods_by_receiver_type) if c}
|
230
|
+
node.children.each { |c| validate_lack_of_side_effects(c, whitelisted_methods_by_receiver_type) if c }
|
231
231
|
when :send
|
232
232
|
# Sends are riskier so check a whitelist
|
233
233
|
receiver, method, *args = node.children
|
@@ -30,12 +30,12 @@ module T::Props
|
|
30
30
|
#
|
31
31
|
# Note it does _not_ prevent explicit calls to `eagerly_define_lazy_methods!`
|
32
32
|
# from working.
|
33
|
-
sig {void}
|
33
|
+
sig { void }
|
34
34
|
def self.disable_lazy_evaluation!
|
35
35
|
@lazy_evaluation_disabled ||= true
|
36
36
|
end
|
37
37
|
|
38
|
-
sig {returns(T::Boolean)}
|
38
|
+
sig { returns(T::Boolean) }
|
39
39
|
def self.lazy_evaluation_enabled?
|
40
40
|
!defined?(@lazy_evaluation_disabled) || !@lazy_evaluation_disabled
|
41
41
|
end
|
@@ -43,17 +43,17 @@ module T::Props
|
|
43
43
|
module DecoratorMethods
|
44
44
|
extend T::Sig
|
45
45
|
|
46
|
-
sig {returns(T::Hash[Symbol, T.proc.returns(String)]).checked(:never)}
|
46
|
+
sig { returns(T::Hash[Symbol, T.proc.returns(String)]).checked(:never) }
|
47
47
|
private def lazily_defined_methods
|
48
48
|
@lazily_defined_methods ||= {}
|
49
49
|
end
|
50
50
|
|
51
|
-
sig {returns(T::Hash[Symbol, T.untyped]).checked(:never)}
|
51
|
+
sig { returns(T::Hash[Symbol, T.untyped]).checked(:never) }
|
52
52
|
private def lazily_defined_vm_methods
|
53
53
|
@lazily_defined_vm_methods ||= {}
|
54
54
|
end
|
55
55
|
|
56
|
-
sig {params(name: Symbol).void}
|
56
|
+
sig { params(name: Symbol).void }
|
57
57
|
private def eval_lazily_defined_method!(name)
|
58
58
|
if !HasLazilySpecializedMethods.lazy_evaluation_enabled?
|
59
59
|
raise SourceEvaluationDisabled.new
|
@@ -68,7 +68,7 @@ module T::Props
|
|
68
68
|
cls.send(:private, name)
|
69
69
|
end
|
70
70
|
|
71
|
-
sig {params(name: Symbol).void}
|
71
|
+
sig { params(name: Symbol).void }
|
72
72
|
private def eval_lazily_defined_vm_method!(name)
|
73
73
|
if !HasLazilySpecializedMethods.lazy_evaluation_enabled?
|
74
74
|
raise SourceEvaluationDisabled.new
|
@@ -80,7 +80,7 @@ module T::Props
|
|
80
80
|
cls.send(:private, name)
|
81
81
|
end
|
82
82
|
|
83
|
-
sig {params(name: Symbol, blk: T.proc.returns(String)).void}
|
83
|
+
sig { params(name: Symbol, blk: T.proc.returns(String)).void }
|
84
84
|
private def enqueue_lazy_method_definition!(name, &blk)
|
85
85
|
lazily_defined_methods[name] = blk
|
86
86
|
|
@@ -100,7 +100,7 @@ module T::Props
|
|
100
100
|
cls.send(:private, name)
|
101
101
|
end
|
102
102
|
|
103
|
-
sig {params(name: Symbol, blk: T.untyped).void}
|
103
|
+
sig { params(name: Symbol, blk: T.untyped).void }
|
104
104
|
private def enqueue_lazy_vm_method_definition!(name, &blk)
|
105
105
|
lazily_defined_vm_methods[name] = blk
|
106
106
|
|
@@ -115,7 +115,7 @@ module T::Props
|
|
115
115
|
cls.send(:private, name)
|
116
116
|
end
|
117
117
|
|
118
|
-
sig {void}
|
118
|
+
sig { void }
|
119
119
|
def eagerly_define_lazy_methods!
|
120
120
|
return if lazily_defined_methods.empty?
|
121
121
|
|
@@ -125,18 +125,18 @@ module T::Props
|
|
125
125
|
|
126
126
|
cls = decorated_class
|
127
127
|
cls.class_eval(source)
|
128
|
-
lazily_defined_methods.each_key {|name| cls.send(:private, name)}
|
128
|
+
lazily_defined_methods.each_key { |name| cls.send(:private, name) }
|
129
129
|
lazily_defined_methods.clear
|
130
130
|
end
|
131
131
|
|
132
|
-
sig {void}
|
132
|
+
sig { void }
|
133
133
|
def eagerly_define_lazy_vm_methods!
|
134
134
|
return if lazily_defined_vm_methods.empty?
|
135
135
|
|
136
136
|
lazily_defined_vm_methods.values.map(&:call)
|
137
137
|
|
138
138
|
cls = decorated_class
|
139
|
-
lazily_defined_vm_methods.each_key {|name| cls.send(:private, name)}
|
139
|
+
lazily_defined_vm_methods.each_key { |name| cls.send(:private, name) }
|
140
140
|
lazily_defined_vm_methods.clear
|
141
141
|
end
|
142
142
|
end
|
data/lib/types/props/optional.rb
CHANGED
@@ -43,11 +43,11 @@ module T::Props::Optional::DecoratorMethods
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# checked(:never) - O(runtime object construction)
|
46
|
-
sig {returns(T::Hash[Symbol, T::Props::Private::ApplyDefault]).checked(:never)}
|
46
|
+
sig { returns(T::Hash[Symbol, T::Props::Private::ApplyDefault]).checked(:never) }
|
47
47
|
attr_reader :props_with_defaults
|
48
48
|
|
49
49
|
# checked(:never) - O(runtime object construction)
|
50
|
-
sig {returns(T::Hash[Symbol, T::Props::Private::SetterFactory::SetterProc]).checked(:never)}
|
50
|
+
sig { returns(T::Hash[Symbol, T::Props::Private::SetterFactory::SetterProc]).checked(:never) }
|
51
51
|
attr_reader :props_without_defaults
|
52
52
|
|
53
53
|
def add_prop_definition(prop, rules)
|
@@ -49,21 +49,21 @@ module T::Props::PrettyPrintable
|
|
49
49
|
module DecoratorMethods
|
50
50
|
extend T::Sig
|
51
51
|
|
52
|
-
sig {params(key: Symbol).returns(T::Boolean).checked(:never)}
|
52
|
+
sig { params(key: Symbol).returns(T::Boolean).checked(:never) }
|
53
53
|
def valid_rule_key?(key)
|
54
54
|
super || key == :inspect
|
55
55
|
end
|
56
56
|
|
57
57
|
# Overridable method to specify how the first part of a `pretty_print`d object's class should look like
|
58
58
|
# NOTE: This is just to support Stripe's `PrettyPrintableModel` case, and not recommended to be overridden
|
59
|
-
sig {params(instance: T::Props::PrettyPrintable).returns(String)}
|
59
|
+
sig { params(instance: T::Props::PrettyPrintable).returns(String) }
|
60
60
|
def inspect_class_with_decoration(instance)
|
61
61
|
T.unsafe(instance).class.to_s
|
62
62
|
end
|
63
63
|
|
64
64
|
# Overridable method to add anything that is not a prop
|
65
65
|
# NOTE: This is to support cases like Serializable's `@_extra_props`, and Stripe's `PrettyPrintableModel#@_deleted`
|
66
|
-
sig {params(instance: T::Props::PrettyPrintable, pp: T.any(PrettyPrint, PP::SingleLine)).void}
|
66
|
+
sig { params(instance: T::Props::PrettyPrintable, pp: T.any(PrettyPrint, PP::SingleLine)).void }
|
67
67
|
def pretty_print_extra(instance, pp); end
|
68
68
|
end
|
69
69
|
end
|
@@ -9,28 +9,28 @@ module T::Props
|
|
9
9
|
abstract!
|
10
10
|
|
11
11
|
# checked(:never) - O(object construction x prop count)
|
12
|
-
sig {returns(SetterFactory::SetterProc).checked(:never)}
|
12
|
+
sig { returns(SetterFactory::SetterProc).checked(:never) }
|
13
13
|
attr_reader :setter_proc
|
14
14
|
|
15
15
|
# checked(:never) - We do this with `T.let` instead
|
16
|
-
sig {params(accessor_key: Symbol, setter_proc: SetterFactory::SetterProc).void.checked(:never)}
|
16
|
+
sig { params(accessor_key: Symbol, setter_proc: SetterFactory::SetterProc).void.checked(:never) }
|
17
17
|
def initialize(accessor_key, setter_proc)
|
18
18
|
@accessor_key = T.let(accessor_key, Symbol)
|
19
19
|
@setter_proc = T.let(setter_proc, SetterFactory::SetterProc)
|
20
20
|
end
|
21
21
|
|
22
22
|
# checked(:never) - O(object construction x prop count)
|
23
|
-
sig {abstract.returns(T.untyped).checked(:never)}
|
23
|
+
sig { abstract.returns(T.untyped).checked(:never) }
|
24
24
|
def default; end
|
25
25
|
|
26
26
|
# checked(:never) - O(object construction x prop count)
|
27
|
-
sig {abstract.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never)}
|
27
|
+
sig { abstract.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never) }
|
28
28
|
def set_default(instance); end
|
29
29
|
|
30
30
|
NO_CLONE_TYPES = T.let([TrueClass, FalseClass, NilClass, Symbol, Numeric, T::Enum].freeze, T::Array[Module])
|
31
31
|
|
32
32
|
# checked(:never) - Rules hash is expensive to check
|
33
|
-
sig {params(cls: Module, rules: T::Hash[Symbol, T.untyped]).returns(T.nilable(ApplyDefault)).checked(:never)}
|
33
|
+
sig { params(cls: Module, rules: T::Hash[Symbol, T.untyped]).returns(T.nilable(ApplyDefault)).checked(:never) }
|
34
34
|
def self.for(cls, rules)
|
35
35
|
accessor_key = rules.fetch(:accessor_key)
|
36
36
|
setter = rules.fetch(:setter_proc)
|
@@ -67,7 +67,7 @@ module T::Props
|
|
67
67
|
abstract!
|
68
68
|
|
69
69
|
# checked(:never) - We do this with `T.let` instead
|
70
|
-
sig {params(default: BasicObject, accessor_key: Symbol, setter_proc: SetterFactory::SetterProc).void.checked(:never)}
|
70
|
+
sig { params(default: BasicObject, accessor_key: Symbol, setter_proc: SetterFactory::SetterProc).void.checked(:never) }
|
71
71
|
def initialize(default, accessor_key, setter_proc)
|
72
72
|
# FIXME: Ideally we'd check here that the default is actually a valid
|
73
73
|
# value for this field, but existing code relies on the fact that we don't.
|
@@ -80,7 +80,7 @@ module T::Props
|
|
80
80
|
end
|
81
81
|
|
82
82
|
# checked(:never) - O(object construction x prop count)
|
83
|
-
sig {override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never)}
|
83
|
+
sig { override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never) }
|
84
84
|
def set_default(instance)
|
85
85
|
instance.instance_variable_set(@accessor_key, default)
|
86
86
|
end
|
@@ -88,13 +88,13 @@ module T::Props
|
|
88
88
|
|
89
89
|
class ApplyPrimitiveDefault < ApplyFixedDefault
|
90
90
|
# checked(:never) - O(object construction x prop count)
|
91
|
-
sig {override.returns(T.untyped).checked(:never)}
|
91
|
+
sig { override.returns(T.untyped).checked(:never) }
|
92
92
|
attr_reader :default
|
93
93
|
end
|
94
94
|
|
95
95
|
class ApplyComplexDefault < ApplyFixedDefault
|
96
96
|
# checked(:never) - O(object construction x prop count)
|
97
|
-
sig {override.returns(T.untyped).checked(:never)}
|
97
|
+
sig { override.returns(T.untyped).checked(:never) }
|
98
98
|
def default
|
99
99
|
T::Props::Utils.deep_clone_object(@default)
|
100
100
|
end
|
@@ -105,13 +105,13 @@ module T::Props
|
|
105
105
|
# `some_empty_array.dup`
|
106
106
|
class ApplyEmptyArrayDefault < ApplyDefault
|
107
107
|
# checked(:never) - O(object construction x prop count)
|
108
|
-
sig {override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never)}
|
108
|
+
sig { override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never) }
|
109
109
|
def set_default(instance)
|
110
110
|
instance.instance_variable_set(@accessor_key, [])
|
111
111
|
end
|
112
112
|
|
113
113
|
# checked(:never) - O(object construction x prop count)
|
114
|
-
sig {override.returns(T::Array[T.untyped]).checked(:never)}
|
114
|
+
sig { override.returns(T::Array[T.untyped]).checked(:never) }
|
115
115
|
def default
|
116
116
|
[]
|
117
117
|
end
|
@@ -122,13 +122,13 @@ module T::Props
|
|
122
122
|
# `some_empty_hash.dup`
|
123
123
|
class ApplyEmptyHashDefault < ApplyDefault
|
124
124
|
# checked(:never) - O(object construction x prop count)
|
125
|
-
sig {override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never)}
|
125
|
+
sig { override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never) }
|
126
126
|
def set_default(instance)
|
127
127
|
instance.instance_variable_set(@accessor_key, {})
|
128
128
|
end
|
129
129
|
|
130
130
|
# checked(:never) - O(object construction x prop count)
|
131
|
-
sig {override.returns(T::Hash[T.untyped, T.untyped]).checked(:never)}
|
131
|
+
sig { override.returns(T::Hash[T.untyped, T.untyped]).checked(:never) }
|
132
132
|
def default
|
133
133
|
{}
|
134
134
|
end
|
@@ -153,7 +153,7 @@ module T::Props
|
|
153
153
|
end
|
154
154
|
|
155
155
|
# checked(:never) - O(object construction x prop count)
|
156
|
-
sig {override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never)}
|
156
|
+
sig { override.params(instance: T.all(T::Props::Optional, Object)).void.checked(:never) }
|
157
157
|
def set_default(instance)
|
158
158
|
# Use the actual setter to validate the factory returns a legitimate
|
159
159
|
# value every time
|
@@ -161,7 +161,7 @@ module T::Props
|
|
161
161
|
end
|
162
162
|
|
163
163
|
# checked(:never) - O(object construction x prop count)
|
164
|
-
sig {override.returns(T.untyped).checked(:never)}
|
164
|
+
sig { override.returns(T.untyped).checked(:never) }
|
165
165
|
def default
|
166
166
|
@class.class_exec(&@factory)
|
167
167
|
end
|
@@ -29,7 +29,7 @@ module T::Props
|
|
29
29
|
.checked(:never)
|
30
30
|
end
|
31
31
|
def self.generate(props, defaults)
|
32
|
-
stored_props = props.reject {|_, rules| rules[:dont_store]}
|
32
|
+
stored_props = props.reject { |_, rules| rules[:dont_store] }
|
33
33
|
parts = stored_props.map do |prop, rules|
|
34
34
|
# All of these strings should already be validated (directly or
|
35
35
|
# indirectly) in `validate_prop_name`, so we don't bother with a nice
|
@@ -10,7 +10,7 @@ module T::Props
|
|
10
10
|
private_constant :Serialize
|
11
11
|
class Deserialize; end
|
12
12
|
private_constant :Deserialize
|
13
|
-
ModeType = T.type_alias {T.any(Serialize, Deserialize)}
|
13
|
+
ModeType = T.type_alias { T.any(Serialize, Deserialize) }
|
14
14
|
private_constant :ModeType
|
15
15
|
|
16
16
|
module Mode
|
@@ -63,7 +63,7 @@ module T::Props
|
|
63
63
|
end
|
64
64
|
when T::Types::Simple
|
65
65
|
raw = type.raw_type
|
66
|
-
if NO_TRANSFORM_TYPES.any? {|cls| raw <= cls}
|
66
|
+
if NO_TRANSFORM_TYPES.any? { |cls| raw <= cls }
|
67
67
|
nil
|
68
68
|
elsif raw <= Float
|
69
69
|
case mode
|
@@ -99,7 +99,7 @@ module T::Props
|
|
99
99
|
else
|
100
100
|
"#{varname}.nil? ? nil : #{inner}"
|
101
101
|
end
|
102
|
-
elsif type.types.all? {|t| generate(t, mode, varname).nil?}
|
102
|
+
elsif type.types.all? { |t| generate(t, mode, varname).nil? }
|
103
103
|
# Handle, e.g., T::Boolean
|
104
104
|
nil
|
105
105
|
else
|
@@ -122,8 +122,8 @@ module T::Props
|
|
122
122
|
# NB: This deliberately does include `nil`, which means we know we
|
123
123
|
# don't need to do any transforming.
|
124
124
|
inner_known = type.types
|
125
|
-
.map {|t| generate(t, mode, varname)}
|
126
|
-
.reject {|t| t == dynamic_fallback}
|
125
|
+
.map { |t| generate(t, mode, varname) }
|
126
|
+
.reject { |t| t == dynamic_fallback }
|
127
127
|
.uniq
|
128
128
|
|
129
129
|
if inner_known.size != 1
|
@@ -151,7 +151,7 @@ module T::Props
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
154
|
-
sig {params(varname: String, type: Module, mode: ModeType).returns(String).checked(:never)}
|
154
|
+
sig { params(varname: String, type: Module, mode: ModeType).returns(String).checked(:never) }
|
155
155
|
private_class_method def self.handle_serializable_subtype(varname, type, mode)
|
156
156
|
case mode
|
157
157
|
when Serialize
|
@@ -164,7 +164,7 @@ module T::Props
|
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
167
|
-
sig {params(varname: String, type: Module, mode: ModeType).returns(String).checked(:never)}
|
167
|
+
sig { params(varname: String, type: Module, mode: ModeType).returns(String).checked(:never) }
|
168
168
|
private_class_method def self.handle_custom_type(varname, type, mode)
|
169
169
|
case mode
|
170
170
|
when Serialize
|
@@ -177,7 +177,7 @@ module T::Props
|
|
177
177
|
end
|
178
178
|
end
|
179
179
|
|
180
|
-
sig {params(type: Module).returns(T.nilable(String)).checked(:never)}
|
180
|
+
sig { params(type: Module).returns(T.nilable(String)).checked(:never) }
|
181
181
|
private_class_method def self.module_name(type)
|
182
182
|
T::Configuration.module_name_mangler.call(type)
|
183
183
|
end
|
@@ -24,7 +24,7 @@ module T::Props
|
|
24
24
|
.checked(:never)
|
25
25
|
end
|
26
26
|
def self.generate(props)
|
27
|
-
stored_props = props.reject {|_, rules| rules[:dont_store]}
|
27
|
+
stored_props = props.reject { |_, rules| rules[:dont_store] }
|
28
28
|
parts = stored_props.map do |prop, rules|
|
29
29
|
# All of these strings should already be validated (directly or
|
30
30
|
# indirectly) in `validate_prop_name`, so we don't bother with a nice
|
@@ -6,9 +6,9 @@ module T::Props
|
|
6
6
|
module SetterFactory
|
7
7
|
extend T::Sig
|
8
8
|
|
9
|
-
SetterProc = T.type_alias {T.proc.params(val: T.untyped).void}
|
10
|
-
ValueValidationProc = T.type_alias {T.proc.params(val: T.untyped).void}
|
11
|
-
ValidateProc = T.type_alias {T.proc.params(prop: Symbol, value: T.untyped).void}
|
9
|
+
SetterProc = T.type_alias { T.proc.params(val: T.untyped).void }
|
10
|
+
ValueValidationProc = T.type_alias { T.proc.params(val: T.untyped).void }
|
11
|
+
ValidateProc = T.type_alias { T.proc.params(prop: Symbol, value: T.untyped).void }
|
12
12
|
|
13
13
|
sig do
|
14
14
|
params(
|
@@ -236,7 +236,7 @@ module T::Props
|
|
236
236
|
base_message = "Can't set #{klass.name}.#{prop} to #{val.inspect} (instance of #{val.class}) - need a #{type}"
|
237
237
|
|
238
238
|
pretty_message = "Parameter '#{prop}': #{base_message}\n"
|
239
|
-
caller_loc = caller_locations.find {|l| !l.to_s.include?('sorbet-runtime/lib/types/props')}
|
239
|
+
caller_loc = caller_locations.find { |l| !l.to_s.include?('sorbet-runtime/lib/types/props') }
|
240
240
|
if caller_loc
|
241
241
|
pretty_message += "Caller: #{caller_loc.path}:#{caller_loc.lineno}\n"
|
242
242
|
end
|
@@ -78,7 +78,7 @@ module T::Props::Serializable
|
|
78
78
|
|
79
79
|
if hash.size > hash_keys_matching_props
|
80
80
|
serialized_forms = self.class.decorator.prop_by_serialized_forms
|
81
|
-
extra = hash.reject {|k, _| serialized_forms.key?(k)}
|
81
|
+
extra = hash.reject { |k, _| serialized_forms.key?(k) }
|
82
82
|
|
83
83
|
# `extra` could still be empty here if the input matches a `dont_store` prop;
|
84
84
|
# historically, we just ignore those
|
@@ -111,7 +111,7 @@ module T::Props::Serializable
|
|
111
111
|
new_obj[k.to_s] = recursive_stringify_keys(v)
|
112
112
|
end
|
113
113
|
elsif obj.is_a?(Array)
|
114
|
-
new_obj = obj.map {|v| recursive_stringify_keys(v)}
|
114
|
+
new_obj = obj.map { |v| recursive_stringify_keys(v) }
|
115
115
|
else
|
116
116
|
new_obj = obj
|
117
117
|
end
|
@@ -126,7 +126,7 @@ module T::Props::Serializable
|
|
126
126
|
if old_extra != new_extra
|
127
127
|
difference =
|
128
128
|
if old_extra
|
129
|
-
new_extra.reject {|k, v| old_extra[k] == v}
|
129
|
+
new_extra.reject { |k, v| old_extra[k] == v }
|
130
130
|
else
|
131
131
|
new_extra
|
132
132
|
end
|
@@ -195,7 +195,7 @@ module T::Props::Serializable::DecoratorMethods
|
|
195
195
|
end
|
196
196
|
|
197
197
|
def required_props
|
198
|
-
@class.props.select {|_, v| T::Props::Utils.required_prop?(v)}.keys
|
198
|
+
@class.props.select { |_, v| T::Props::Utils.required_prop?(v) }.keys
|
199
199
|
end
|
200
200
|
|
201
201
|
def prop_dont_store?(prop)
|
@@ -228,11 +228,11 @@ module T::Props::Serializable::DecoratorMethods
|
|
228
228
|
res = super
|
229
229
|
prop_by_serialized_forms[serialized_form] = prop
|
230
230
|
if T::Configuration.use_vm_prop_serde?
|
231
|
-
enqueue_lazy_vm_method_definition!(:__t_props_generated_serialize) {generate_serialize2}
|
232
|
-
enqueue_lazy_vm_method_definition!(:__t_props_generated_deserialize) {generate_deserialize2}
|
231
|
+
enqueue_lazy_vm_method_definition!(:__t_props_generated_serialize) { generate_serialize2 }
|
232
|
+
enqueue_lazy_vm_method_definition!(:__t_props_generated_deserialize) { generate_deserialize2 }
|
233
233
|
else
|
234
|
-
enqueue_lazy_method_definition!(:__t_props_generated_serialize) {generate_serialize_source}
|
235
|
-
enqueue_lazy_method_definition!(:__t_props_generated_deserialize) {generate_deserialize_source}
|
234
|
+
enqueue_lazy_method_definition!(:__t_props_generated_serialize) { generate_serialize_source }
|
235
|
+
enqueue_lazy_method_definition!(:__t_props_generated_deserialize) { generate_deserialize_source }
|
236
236
|
end
|
237
237
|
res
|
238
238
|
end
|
@@ -263,7 +263,7 @@ module T::Props::Serializable::DecoratorMethods
|
|
263
263
|
def message_with_generated_source_context(error, generated_method, generate_source_method)
|
264
264
|
generated_method = generated_method.to_s
|
265
265
|
if error.backtrace_locations
|
266
|
-
line_loc = error.backtrace_locations.find {|l| l.base_label == generated_method}
|
266
|
+
line_loc = error.backtrace_locations.find { |l| l.base_label == generated_method }
|
267
267
|
return unless line_loc
|
268
268
|
|
269
269
|
line_num = line_loc.lineno
|
@@ -275,7 +275,7 @@ module T::Props::Serializable::DecoratorMethods
|
|
275
275
|
# in `__t_props_generated_serialize'"
|
276
276
|
"in `#{generated_method}'"
|
277
277
|
end
|
278
|
-
line_label = error.backtrace.find {|l| l.end_with?(label)}
|
278
|
+
line_label = error.backtrace.find { |l| l.end_with?(label) }
|
279
279
|
return unless line_label
|
280
280
|
|
281
281
|
line_num = if line_label.start_with?("(eval)")
|
@@ -11,7 +11,7 @@ module T::Props::TypeValidation
|
|
11
11
|
module DecoratorMethods
|
12
12
|
extend T::Sig
|
13
13
|
|
14
|
-
sig {params(key: Symbol).returns(T::Boolean).checked(:never)}
|
14
|
+
sig { params(key: Symbol).returns(T::Boolean).checked(:never) }
|
15
15
|
def valid_rule_key?(key)
|
16
16
|
super || key == :DEPRECATED_underspecified_type
|
17
17
|
end
|
@@ -58,19 +58,19 @@ module T::Props::TypeValidation
|
|
58
58
|
# If the type is fully valid, returns nil.
|
59
59
|
#
|
60
60
|
# checked(:never) - called potentially many times recursively
|
61
|
-
sig {params(type: T::Types::Base).returns(T.nilable(T::Types::Base)).checked(:never)}
|
61
|
+
sig { params(type: T::Types::Base).returns(T.nilable(T::Types::Base)).checked(:never) }
|
62
62
|
private def find_invalid_subtype(type)
|
63
63
|
case type
|
64
64
|
when T::Types::TypedEnumerable
|
65
65
|
find_invalid_subtype(type.type)
|
66
66
|
when T::Types::FixedHash
|
67
|
-
type.types.values.map {|subtype| find_invalid_subtype(subtype)}.compact.first
|
67
|
+
type.types.values.map { |subtype| find_invalid_subtype(subtype) }.compact.first
|
68
68
|
when T::Types::Union, T::Types::FixedArray
|
69
69
|
# `T.any` is valid if all of the members are valid
|
70
|
-
type.types.map {|subtype| find_invalid_subtype(subtype)}.compact.first
|
70
|
+
type.types.map { |subtype| find_invalid_subtype(subtype) }.compact.first
|
71
71
|
when T::Types::Intersection
|
72
72
|
# `T.all` is valid if at least one of the members is valid
|
73
|
-
invalid = type.types.map {|subtype| find_invalid_subtype(subtype)}.compact
|
73
|
+
invalid = type.types.map { |subtype| find_invalid_subtype(subtype) }.compact
|
74
74
|
if invalid.length == type.types.length
|
75
75
|
invalid.first
|
76
76
|
else
|
data/lib/types/props/utils.rb
CHANGED