sorbet-runtime 0.5.5576 → 0.5.5579

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4597a9465352354d6c9500c16f55a3ab0370d472dd88efaa3ead9a1566094628
4
- data.tar.gz: 7edc121b16f8622fa77bfc5cc50ccaadac729f648a5f01af824b8ae4c3391ed2
3
+ metadata.gz: 64118c41b03c7b4d993275e0ff71f853fa8ffa2078fbaf769ca6755564fb0ef8
4
+ data.tar.gz: ae794f0928f3b8fbf95e154afccb21b3fc206a3c096eb9b9bdaa159638fe6599
5
5
  SHA512:
6
- metadata.gz: 03ae7012e856f3cdbbc07a3017b97dfed7521f9328acfb3e3f0377f2f741b541c67c12976cabe72df8629ebedc0f52f2dbbf38dfdebf4155152ab7dcde4df058
7
- data.tar.gz: 5577c156d4b817f0b58ff480fbba30dc3ed22afa55e5a0213e340b172f5ff48d18ac6e6ea3c86fbdfea9b5f6baa2a98d34132c079ee1a4b779bd95590318114e
6
+ metadata.gz: 27ebb20c813c95d0d3b4e354d72f4cae80297050fbf3697fd9fa9512fed0c9cc04f9fc7a315e25aad267c222fc2e0fc05bb2e2436877d0e0b8ad97ebe87a5a18
7
+ data.tar.gz: c0b048e1a48b5481ad65b81d1a0cdeeab956b4aa3edf61f2e7381cfc077996ce459899cc680ac1948fe68a4e892c05f8b9c7510ac3412f4cb3f9db623ef131e7
@@ -97,17 +97,8 @@ class T::Enum
97
97
  @mapping.include?(serialized_val)
98
98
  end
99
99
 
100
-
101
- ## T::Props::CustomType
102
-
103
- # Note: Failed CriticalMethodsNoRuntimeTypingTest
104
- sig {params(value: T.untyped).returns(T::Boolean).checked(:never)}
105
- def self.instance?(value)
106
- value.is_a?(self)
107
- end
108
-
109
100
  # Note: Failed CriticalMethodsNoRuntimeTypingTest
110
- sig {params(instance: T.nilable(T::Enum)).returns(SerializedVal).checked(:never)}
101
+ sig {override.params(instance: T.nilable(T::Enum)).returns(SerializedVal).checked(:never)}
111
102
  def self.serialize(instance)
112
103
  # This is needed otherwise if a Chalk::ODM::Document with a property of the shape
113
104
  # T::Hash[T.nilable(MyEnum), Integer] and a value that looks like {nil => 0} is
@@ -124,7 +115,7 @@ class T::Enum
124
115
  end
125
116
 
126
117
  # Note: Failed CriticalMethodsNoRuntimeTypingTest
127
- sig {params(mongo_value: SerializedVal).returns(T.attached_class).checked(:never)}
118
+ sig {override.params(mongo_value: SerializedVal).returns(T.attached_class).checked(:never)}
128
119
  def self.deserialize(mongo_value)
129
120
  if self == T::Enum
130
121
  raise "Cannot call T::Enum.deserialize directly. You must call on a specific child class."
@@ -39,7 +39,7 @@ module T::Props
39
39
  # a document class.
40
40
  #
41
41
  # @param name [Symbol] The name of this property
42
- # @param cls [Class,T::Props::CustomType] (String) The type of this
42
+ # @param cls [Class,T::Types::Base] The type of this
43
43
  # property. If the type is itself a {Document} subclass, this
44
44
  # property will be recursively serialized/deserialized.
45
45
  # @param rules [Hash] Options to control this property's behavior.
@@ -90,10 +90,6 @@ module T::Props
90
90
  # none is provided.
91
91
  # @option rules [T::Boolean] :immutable If true, this prop cannot be
92
92
  # modified after an instance is created or loaded from a hash.
93
- # @option rules [Class,T::Props::CustomType] :array If set, specifies the
94
- # type of individual members of a prop with `type` `Array`. This
95
- # allows for typechecking of arrays, and also for recursive
96
- # serialization of arrays of sub-{Document}s.
97
93
  # @option rules [T::Boolean] :override It is an error to redeclare a
98
94
  # `prop` that has already been declared (including on a
99
95
  # superclass), unless `:override` is set to `true`.
@@ -1,20 +1,35 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
2
+ # typed: strict
3
3
 
4
4
  module T::Props
5
5
  module CustomType
6
+ extend T::Sig
7
+ extend T::Helpers
8
+
9
+ abstract!
10
+
6
11
  include Kernel # for `is_a?`
7
12
 
8
- # Returns true if the given Ruby value can be assigned to a T::Props field
9
- # of this type.
10
- #
11
- # @param [Object] _value
12
- # @return T::Boolean
13
- def instance?(_value)
14
- raise NotImplementedError.new('Must override in included class')
13
+ # Alias for backwards compatibility
14
+ sig(:final) do
15
+ params(
16
+ value: BasicObject,
17
+ )
18
+ .returns(T::Boolean)
19
+ .checked(:never)
20
+ end
21
+ def instance?(value)
22
+ self.===(value)
15
23
  end
16
24
 
17
- # Alias for consistent interface with T::Types::Base
25
+ # Alias for backwards compatibility
26
+ sig(:final) do
27
+ params(
28
+ value: BasicObject,
29
+ )
30
+ .returns(T::Boolean)
31
+ .checked(:never)
32
+ end
18
33
  def valid?(value)
19
34
  instance?(value)
20
35
  end
@@ -24,30 +39,30 @@ module T::Props
24
39
  #
25
40
  # @param [Object] _instance
26
41
  # @return An instance of one of T::Configuration.scalar_types
27
- def serialize(_instance)
28
- raise NotImplementedError.new('Must override in included class')
29
- end
42
+ sig {abstract.params(instance: T.untyped).returns(T.untyped).checked(:never)}
43
+ def serialize(instance); end
30
44
 
31
45
  # Given the serialized form of your type, this returns an instance
32
46
  # of that custom type representing that value.
33
47
  #
34
- # @param _mongo_scalar One of T::Configuration.scalar_types
48
+ # @param scalar One of T::Configuration.scalar_types
35
49
  # @return Object
36
- def deserialize(_mongo_scalar)
37
- raise NotImplementedError.new('Must override in included class')
38
- end
50
+ sig {abstract.params(scalar: T.untyped).returns(T.untyped).checked(:never)}
51
+ def deserialize(scalar); end
39
52
 
53
+ sig {override.params(_base: Module).void}
40
54
  def self.included(_base)
41
55
  super
42
56
 
43
57
  raise 'Please use "extend", not "include" to attach this module'
44
58
  end
45
59
 
60
+ sig(:final) {params(val: Object).returns(T::Boolean).checked(:never)}
46
61
  def self.scalar_type?(val)
47
62
  # We don't need to check for val's included modules in
48
63
  # T::Configuration.scalar_types, because T::Configuration.scalar_types
49
64
  # are all classes.
50
- klass = val.class
65
+ klass = T.let(val.class, T.nilable(Class))
51
66
  until klass.nil?
52
67
  return true if T::Configuration.scalar_types.include?(klass.to_s)
53
68
  klass = klass.superclass
@@ -59,16 +74,8 @@ module T::Props
59
74
  # implement set-like fields that store a unique-array, but forbid
60
75
  # hashes; Custom hash types should be implemented via an emebdded
61
76
  # T::Struct (or a subclass like Chalk::ODM::Document) or via T.
62
- def self.valid_serialization?(val, type=nil)
63
- if type&.name == 'Chalk::ODM::BsonTypes::BsonObject'
64
- # Special case we allow for backwards compatibility with props formerly
65
- # typed as "Object" or "Hash", which contain arbitrarily-nested BSON
66
- # data (e.g. parsed API request bodies). In general, we aren't pushing
67
- # to convert these to Chalk::ODM::BsonTypes - we'd rather delurk them -
68
- # but this lets us convert events with these types to Proto.
69
- return true
70
- end
71
-
77
+ sig(:final) {params(val: Object).returns(T::Boolean).checked(:never)}
78
+ def self.valid_serialization?(val)
72
79
  case val
73
80
  when Array
74
81
  val.each do |v|
@@ -81,10 +88,15 @@ module T::Props
81
88
  end
82
89
  end
83
90
 
84
- def self.checked_serialize(type, instance)
85
- val = type.serialize(instance)
86
- unless valid_serialization?(val, type)
87
- msg = "#{type} did not serialize to a valid scalar type. It became a: #{val.class}"
91
+ sig(:final) do
92
+ params(instance: Object)
93
+ .returns(T.untyped)
94
+ .checked(:never)
95
+ end
96
+ def self.checked_serialize(instance)
97
+ val = T.cast(instance.class, T::Props::CustomType).serialize(instance)
98
+ unless valid_serialization?(val)
99
+ msg = "#{instance.class} did not serialize to a valid scalar type. It became a: #{val.class}"
88
100
  if val.is_a?(Hash)
89
101
  msg += "\nIf you want to store a structured Hash, consider using a T::Struct as your type."
90
102
  end
@@ -12,7 +12,7 @@ class T::Props::Decorator
12
12
 
13
13
  Rules = T.type_alias {T::Hash[Symbol, T.untyped]}
14
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.any(T::Types::Base, T::Props::CustomType)}
15
+ PropType = T.type_alias {T::Types::Base}
16
16
  PropTypeOrClass = T.type_alias {T.any(PropType, Module)}
17
17
 
18
18
  class NoRulesError < StandardError; end
@@ -335,10 +335,7 @@ class T::Props::Decorator
335
335
  if !cls.is_a?(Module)
336
336
  cls = convert_type_to_class(cls)
337
337
  end
338
- type_object = type
339
- if !(type_object.singleton_class < T::Props::CustomType)
340
- type_object = smart_coerce(type_object, array: rules[:array], enum: rules[:enum])
341
- end
338
+ type_object = smart_coerce(type, array: rules[:array], enum: rules[:enum])
342
339
 
343
340
  prop_validate_definition!(name, cls, rules, type_object)
344
341
 
@@ -128,8 +128,7 @@ module T::Props
128
128
  private_class_method def self.handle_custom_type(varname, type, mode)
129
129
  case mode
130
130
  when Serialize
131
- type_name = T.must(module_name(type))
132
- "T::Props::CustomType.checked_serialize(#{type_name}, #{varname})"
131
+ "T::Props::CustomType.checked_serialize(#{varname})"
133
132
  when Deserialize
134
133
  type_name = T.must(module_name(type))
135
134
  "#{type_name}.deserialize(#{varname})"
@@ -20,17 +20,10 @@ module T::Props
20
20
  end
21
21
  def self.build_setter_proc(klass, prop, rules)
22
22
  # Our nil check works differently than a simple T.nilable for various
23
- # reasons (including the `raise_on_nil_write` setting, the existence
24
- # of defaults & factories, and the fact that we allow `T.nilable(Foo)`
25
- # where Foo < T::Props::CustomType as a prop type even though calling
26
- # `valid?` on it won't work as expected), so unwrap any T.nilable and
27
- # do a check manually. (Note this hack does not fix custom types as
28
- # collection elements.)
23
+ # reasons (including the `raise_on_nil_write` setting and the existence
24
+ # of defaults & factories), so unwrap any T.nilable and do a check
25
+ # manually.
29
26
  non_nil_type = T::Utils::Nilable.get_underlying_type_object(rules.fetch(:type_object))
30
- if non_nil_type.is_a?(T::Types::Simple) && non_nil_type.raw_type.singleton_class < T::Props::CustomType
31
- non_nil_type = non_nil_type.raw_type
32
- end
33
-
34
27
  accessor_key = rules.fetch(:accessor_key)
35
28
  validate = rules[:setter_validate]
36
29
 
@@ -51,7 +44,7 @@ module T::Props
51
44
  params(
52
45
  prop: Symbol,
53
46
  accessor_key: Symbol,
54
- non_nil_type: T.any(T::Types::Base, T.all(T::Props::CustomType, Module)),
47
+ non_nil_type: T::Types::Base,
55
48
  klass: T.all(Module, T::Props::ClassMethods),
56
49
  validate: T.nilable(ValidateProc)
57
50
  )
@@ -80,7 +73,7 @@ module T::Props
80
73
  params(
81
74
  prop: Symbol,
82
75
  accessor_key: Symbol,
83
- non_nil_type: T.any(T::Types::Base, T.all(T::Props::CustomType, Module)),
76
+ non_nil_type: T::Types::Base,
84
77
  klass: T.all(Module, T::Props::ClassMethods),
85
78
  validate: T.nilable(ValidateProc),
86
79
  )
@@ -28,7 +28,7 @@ module T::Props::TypeValidation
28
28
  def prop_validate_definition!(name, _cls, rules, type)
29
29
  super
30
30
 
31
- if !rules[:DEPRECATED_underspecified_type] && !(type.singleton_class <= T::Props::CustomType)
31
+ if !rules[:DEPRECATED_underspecified_type]
32
32
  validate_type(type, field_name: name)
33
33
  elsif rules[:DEPRECATED_underspecified_type] && find_invalid_subtype(type).nil?
34
34
  raise ArgumentError.new("DEPRECATED_underspecified_type set unnecessarily for #{@class.name}.#{name} - #{type} is a valid type")
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.5576
4
+ version: 0.5.5579
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-04 00:00:00.000000000 Z
11
+ date: 2020-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest