sorbet-runtime 0.5.5213 → 0.5.5226

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: bd7c2c5d45d883ad4e220fc3203d9ef80dc3e8107f9871335db7aaa4c9a9a40f
4
- data.tar.gz: 4966f2a48e6c729c45030c5f375ad5f835709349dcc1c8ea7e69a5c242d06293
3
+ metadata.gz: ce5d31efe70f4a4a9fedee60cddc4545cce308285d1a92e9b75f7c6c5cfd0ead
4
+ data.tar.gz: 8ff1cb8a2b9a7c0f1987925899bfcf674c27b594156c9dd8e60ee27ec51d1dd1
5
5
  SHA512:
6
- metadata.gz: d73323f743b97181769e7973f3ad3942dec32822ea7e5e04870a5a3639f800cf3a21dd0a34f88ded31a1d22acae114b0e24987110a6cf781c56676cd63a9ee48
7
- data.tar.gz: f0a09a571797e982ee13316799c1886824a97a47efc1c795d843740ab1c8990c4af3fe746e22918e24beb7675eab0f09c62f358e0f199cbbc6884e8a5975c238
6
+ metadata.gz: bc94cf76fd49747ab049a66bfbd30dc4a0b037ac0f8988a4c6f6a5e6421abf92f209c14a8fe42c0268ca34d8fa5e77cc4fcddc24f08bd8cc6e7175068cc0285e
7
+ data.tar.gz: 38dc583fc54332f763cb1982bce24e5c23e2d2125a0dfd451354eb16f5adc8bab07ee2c4cfda1642b83795bc1539d153b7063df2ffd367faa4d1798ca856cd13
data/lib/types/_types.rb CHANGED
@@ -65,12 +65,8 @@ module T
65
65
  T::Types::SelfType.new
66
66
  end
67
67
 
68
- # TODO(jez) Matches the instance type in a singleton-class context
69
- def self.attached_class
70
- T::Types::AttachedClassType.new
71
- end
72
68
  # Matches the instance type in a singleton-class context
73
- def self.experimental_attached_class
69
+ def self.attached_class
74
70
  T::Types::AttachedClassType.new
75
71
  end
76
72
 
data/lib/types/enum.rb CHANGED
@@ -48,7 +48,7 @@ class T::Enum
48
48
  private_constant :SerializedVal
49
49
 
50
50
  ## Enum class methods ##
51
- sig {returns(T::Array[T.experimental_attached_class])}
51
+ sig {returns(T::Array[T.attached_class])}
52
52
  def self.values
53
53
  if @values.nil?
54
54
  raise "Attempting to access values of #{self.class} before it has been initialized." \
@@ -61,7 +61,7 @@ class T::Enum
61
61
  #
62
62
  # Note: It would have been nice to make this method final before people started overriding it.
63
63
  # Note: Failed CriticalMethodsNoRuntimeTypingTest
64
- sig {params(serialized_val: SerializedVal).returns(T.nilable(T.experimental_attached_class)).checked(:never)}
64
+ sig {params(serialized_val: SerializedVal).returns(T.nilable(T.attached_class)).checked(:never)}
65
65
  def self.try_deserialize(serialized_val)
66
66
  if @mapping.nil?
67
67
  raise "Attempting to access serialization map of #{self.class} before it has been initialized." \
@@ -77,7 +77,7 @@ class T::Enum
77
77
  #
78
78
  # @return [self]
79
79
  # @raise [KeyError] if serialized value does not match any instance.
80
- sig {overridable.params(serialized_val: SerializedVal).returns(T.experimental_attached_class).checked(:never)}
80
+ sig {overridable.params(serialized_val: SerializedVal).returns(T.attached_class).checked(:never)}
81
81
  def self.from_serialized(serialized_val)
82
82
  res = try_deserialize(serialized_val)
83
83
  if res.nil?
@@ -124,7 +124,7 @@ class T::Enum
124
124
  end
125
125
 
126
126
  # Note: Failed CriticalMethodsNoRuntimeTypingTest
127
- sig {params(mongo_value: SerializedVal).returns(T.experimental_attached_class).checked(:never)}
127
+ sig {params(mongo_value: SerializedVal).returns(T.attached_class).checked(:never)}
128
128
  def self.deserialize(mongo_value)
129
129
  if self == T::Enum
130
130
  raise "Cannot call T::Enum.deserialize directly. You must call on a specific child class."
@@ -310,8 +310,8 @@ class T::Enum
310
310
 
311
311
  yield
312
312
 
313
- @values = T.let(nil, T.nilable(T::Array[T.experimental_attached_class]))
314
- @mapping = T.let(nil, T.nilable(T::Hash[SerializedVal, T.experimental_attached_class]))
313
+ @values = T.let(nil, T.nilable(T::Array[T.attached_class]))
314
+ @mapping = T.let(nil, T.nilable(T::Hash[SerializedVal, T.attached_class]))
315
315
 
316
316
  # Freeze the Enum class and bind the constant names into each of the instances.
317
317
  @mapping = {}
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
2
+ # typed: true
3
3
 
4
4
  # A mixin for defining typed properties (attributes).
5
5
  # To get serialization methods (to/from JSON-style hashes), add T::Props::Serializable.
@@ -131,7 +131,7 @@ module T::Props
131
131
  sig {params(name: T.any(Symbol, String), cls_or_args: T.untyped, args: T::Hash[Symbol, T.untyped]).void}
132
132
  def const(name, cls_or_args, args={})
133
133
  if (cls_or_args.is_a?(Hash) && cls_or_args.key?(:immutable)) || args.key?(:immutable)
134
- raise ArgumentError.new("Cannot pass 'immutable' argument when using 'const' keyword to define a prop")
134
+ Kernel.raise ArgumentError.new("Cannot pass 'immutable' argument when using 'const' keyword to define a prop")
135
135
  end
136
136
 
137
137
  if cls_or_args.is_a?(Hash)
@@ -18,7 +18,7 @@ class T::Props::Decorator
18
18
 
19
19
  class NoRulesError < StandardError; end
20
20
 
21
- T::Sig::WithoutRuntime.sig {params(klass: DecoratedClass).void}
21
+ sig {params(klass: DecoratedClass).void.checked(:never)}
22
22
  def initialize(klass)
23
23
  @class = klass
24
24
  klass.plugins.each do |mod|
@@ -26,7 +26,7 @@ class T::Props::Decorator
26
26
  end
27
27
  end
28
28
 
29
- # prop stuff
29
+ # checked(:never) - O(prop accesses)
30
30
  sig {returns(T::Hash[Symbol, Rules]).checked(:never)}
31
31
  def props
32
32
  @props ||= {}.freeze
@@ -44,12 +44,13 @@ class T::Props::Decorator
44
44
  sig {returns(T::Array[Symbol])}
45
45
  def all_props; props.keys; end
46
46
 
47
+ # checked(:never) - O(prop accesses)
47
48
  sig {params(prop: T.any(Symbol, String)).returns(Rules).checked(:never)}
48
49
  def prop_rules(prop); props[prop.to_sym] || raise("No such prop: #{prop.inspect}"); end
49
50
 
50
- sig {params(prop: Symbol, rules: Rules).void}
51
+ # checked(:never) - Rules hash is expensive to check
52
+ sig {params(prop: Symbol, rules: Rules).void.checked(:never)}
51
53
  def add_prop_definition(prop, rules)
52
- prop = prop.to_sym
53
54
  override = rules.delete(:override)
54
55
 
55
56
  if props.include?(prop) && !override
@@ -61,25 +62,36 @@ class T::Props::Decorator
61
62
  @props = @props.merge(prop => rules.freeze).freeze
62
63
  end
63
64
 
64
- sig {returns(T::Array[Symbol])}
65
+ VALID_RULE_KEYS = %i{
66
+ enum
67
+ foreign
68
+ foreign_hint_only
69
+ ifunset
70
+ immutable
71
+ override
72
+ redaction
73
+ sensitivity
74
+ without_accessors
75
+ clobber_existing_method!
76
+ extra
77
+ optional
78
+ _tnilable
79
+ }.to_set.freeze
80
+ private_constant :VALID_RULE_KEYS
81
+
82
+ sig {params(key: Symbol).returns(T::Boolean).checked(:never)}
83
+ def valid_rule_key?(key)
84
+ valid_props.include?(key)
85
+ end
86
+
87
+ # Deprecated, kept temporarily to support overrides in pay-server
88
+ # during the transition to `valid_rule_key?`
89
+ sig {returns(T::Set[Symbol]).checked(:never)}
65
90
  def valid_props
66
- %i{
67
- enum
68
- foreign
69
- foreign_hint_only
70
- ifunset
71
- immutable
72
- override
73
- redaction
74
- sensitivity
75
- without_accessors
76
- clobber_existing_method!
77
- extra
78
- optional
79
- _tnilable
80
- }
91
+ VALID_RULE_KEYS
81
92
  end
82
93
 
94
+ # checked(:never) - O(prop accesses)
83
95
  sig {returns(DecoratedClass).checked(:never)}
84
96
  def decorated_class; @class; end
85
97
 
@@ -87,6 +99,8 @@ class T::Props::Decorator
87
99
 
88
100
  # For performance, don't use named params here.
89
101
  # Passing in rules here is purely a performance optimization.
102
+ #
103
+ # checked(:never) - O(prop accesses)
90
104
  sig do
91
105
  params(
92
106
  instance: DecoratedInstance,
@@ -104,6 +118,8 @@ class T::Props::Decorator
104
118
 
105
119
  # For performance, don't use named params here.
106
120
  # Passing in rules here is purely a performance optimization.
121
+ #
122
+ # checked(:never) - O(prop accesses)
107
123
  sig do
108
124
  params(
109
125
  instance: DecoratedInstance,
@@ -121,6 +137,8 @@ class T::Props::Decorator
121
137
  end
122
138
 
123
139
  # 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.
140
+ #
141
+ # checked(:never) - potentially O(prop accesses) depending on usage pattern
124
142
  sig {params(prop: Symbol, val: T.untyped).void.checked(:never)}
125
143
  def validate_prop_value(prop, val)
126
144
  # This implements a 'public api' on document so that we don't allow callers to pass in rules
@@ -129,6 +147,8 @@ class T::Props::Decorator
129
147
  end
130
148
 
131
149
  # Passing in rules here is purely a performance optimization.
150
+ #
151
+ # checked(:never) - O(prop accesses)
132
152
  sig {params(prop: Symbol, val: T.untyped, rules: Rules).void.checked(:never)}
133
153
  private def check_prop_type(prop, val, rules=prop_rules(prop))
134
154
  type_object = rules.fetch(:type_object)
@@ -184,6 +204,8 @@ class T::Props::Decorator
184
204
  # Unlike the other methods that take rules, this one calls prop_rules for
185
205
  # the default, which raises if the prop doesn't exist (this maintains
186
206
  # preexisting behavior).
207
+ #
208
+ # checked(:never) - O(prop accesses)
187
209
  sig do
188
210
  params(
189
211
  instance: DecoratedInstance,
@@ -204,6 +226,8 @@ class T::Props::Decorator
204
226
  #
205
227
  # Note this path is NOT used by generated getters on instances,
206
228
  # unless `ifunset` is used on the prop, or `prop_get` is overridden.
229
+ #
230
+ # checked(:never) - O(prop accesses)
207
231
  sig do
208
232
  params(
209
233
  instance: DecoratedInstance,
@@ -229,6 +253,7 @@ class T::Props::Decorator
229
253
  end
230
254
  end
231
255
 
256
+ # checked(:never) - O(prop accesses)
232
257
  sig do
233
258
  params(
234
259
  instance: DecoratedInstance,
@@ -245,6 +270,10 @@ class T::Props::Decorator
245
270
  foreign_class.load(value, {}, opts)
246
271
  end
247
272
 
273
+ # TODO: we should really be checking all the methods on `cls`, not just Object
274
+ BANNED_METHOD_NAMES = Object.instance_methods.to_set.freeze
275
+
276
+ # checked(:never) - Rules hash is expensive to check
248
277
  sig do
249
278
  params(
250
279
  name: Symbol,
@@ -253,6 +282,7 @@ class T::Props::Decorator
253
282
  type: PropTypeOrClass
254
283
  )
255
284
  .void
285
+ .checked(:never)
256
286
  end
257
287
  def prop_validate_definition!(name, cls, rules, type)
258
288
  validate_prop_name(name)
@@ -262,7 +292,7 @@ class T::Props::Decorator
262
292
  "to 'sensitivity:' (in prop #{@class.name}.#{name})")
263
293
  end
264
294
 
265
- if !(rules.keys - valid_props).empty?
295
+ if rules.keys.any? {|k| !valid_rule_key?(k)}
266
296
  raise ArgumentError.new("At least one invalid prop arg supplied in #{self}: #{rules.keys.inspect}")
267
297
  end
268
298
 
@@ -273,8 +303,7 @@ class T::Props::Decorator
273
303
  end
274
304
 
275
305
  if !(rules[:clobber_existing_method!]) && !(rules[:without_accessors])
276
- # TODO: we should really be checking all the methods on `cls`, not just Object
277
- if Object.instance_methods.include?(name.to_sym)
306
+ if BANNED_METHOD_NAMES.include?(name.to_sym)
278
307
  raise ArgumentError.new(
279
308
  "#{name} can't be used as a prop in #{@class} because a method with " \
280
309
  "that name already exists (defined by #{@class.instance_method(name).owner} " \
@@ -298,13 +327,6 @@ class T::Props::Decorator
298
327
  end
299
328
  end
300
329
 
301
- # Check if this cls represents a T.nilable(type)
302
- sig {params(type: PropTypeOrClass).returns(T::Boolean)}
303
- private def is_nilable?(type)
304
- return false if !type.is_a?(T::Types::Union)
305
- type.types.any? {|t| t == T::Utils.coerce(NilClass)}
306
- end
307
-
308
330
  # This converts the type from a T::Type to a regular old ruby class.
309
331
  sig {params(type: T::Types::Base).returns(Module)}
310
332
  private def convert_type_to_class(type)
@@ -333,6 +355,7 @@ class T::Props::Decorator
333
355
  end
334
356
  end
335
357
 
358
+ # checked(:never) - Rules hash is expensive to check
336
359
  sig do
337
360
  params(
338
361
  name: T.any(Symbol, String),
@@ -340,6 +363,7 @@ class T::Props::Decorator
340
363
  rules: Rules,
341
364
  )
342
365
  .void
366
+ .checked(:never)
343
367
  end
344
368
  def prop_defined(name, cls, rules={})
345
369
  cls = T::Utils.resolve_alias(cls)
@@ -496,7 +520,8 @@ class T::Props::Decorator
496
520
  handle_redaction_option(name, rules[:redaction]) if rules[:redaction]
497
521
  end
498
522
 
499
- sig {params(name: Symbol, rules: Rules).void}
523
+ # checked(:never) - Rules hash is expensive to check
524
+ sig {params(name: Symbol, rules: Rules).void.checked(:never)}
500
525
  private def define_getter_and_setter(name, rules)
501
526
  T::Configuration.without_ruby_warnings do
502
527
  if !rules[:immutable]
@@ -517,9 +542,12 @@ class T::Props::Decorator
517
542
  end
518
543
 
519
544
  # returns the subdoc of the array type, or nil if it's not a Document type
545
+ #
546
+ # checked(:never) - Typechecks internally
520
547
  sig do
521
548
  params(type: PropType)
522
549
  .returns(T.nilable(Module))
550
+ .checked(:never)
523
551
  end
524
552
  private def array_subdoc_type(type)
525
553
  if type.is_a?(T::Types::TypedArray)
@@ -535,9 +563,12 @@ class T::Props::Decorator
535
563
  end
536
564
 
537
565
  # returns the subdoc of the hash value type, or nil if it's not a Document type
566
+ #
567
+ # checked(:never) - Typechecks internally
538
568
  sig do
539
569
  params(type: PropType)
540
570
  .returns(T.nilable(Module))
571
+ .checked(:never)
541
572
  end
542
573
  private def hash_value_subdoc_type(type)
543
574
  if type.is_a?(T::Types::TypedHash)
@@ -553,9 +584,12 @@ class T::Props::Decorator
553
584
  end
554
585
 
555
586
  # returns the type of the hash key, or nil. Any CustomType could be a key, but we only expect T::Enum right now.
587
+ #
588
+ # checked(:never) - Typechecks internally
556
589
  sig do
557
590
  params(type: PropType)
558
591
  .returns(T.nilable(Module))
592
+ .checked(:never)
559
593
  end
560
594
  private def hash_key_custom_type(type)
561
595
  if type.is_a?(T::Types::TypedHash)
@@ -572,7 +606,8 @@ class T::Props::Decorator
572
606
  # From T::Props::Utils.deep_clone_object, plus String
573
607
  TYPES_NOT_NEEDING_CLONE = [TrueClass, FalseClass, NilClass, Symbol, String, Numeric]
574
608
 
575
- sig {params(type: PropType).returns(T::Boolean)}
609
+ # checked(:never) - Typechecks internally
610
+ sig {params(type: PropType).returns(T::Boolean).checked(:never)}
576
611
  private def shallow_clone_ok(type)
577
612
  inner_type =
578
613
  if type.is_a?(T::Types::TypedArray)
@@ -613,7 +648,8 @@ class T::Props::Decorator
613
648
  end
614
649
  end
615
650
 
616
- sig {params(prop_name: Symbol, rules: Hash).void}
651
+ # checked(:never) - Rules hash is expensive to check
652
+ sig {params(prop_name: Symbol, rules: Hash).void.checked(:never)}
617
653
  private def validate_not_missing_sensitivity(prop_name, rules)
618
654
  if rules[:sensitivity].nil?
619
655
  if rules[:redaction]
@@ -700,6 +736,7 @@ class T::Props::Decorator
700
736
  )
701
737
  end
702
738
 
739
+ # checked(:never) - Rules hash is expensive to check
703
740
  sig do
704
741
  params(
705
742
  prop_name: T.any(String, Symbol),
@@ -707,6 +744,7 @@ class T::Props::Decorator
707
744
  foreign: T.untyped,
708
745
  )
709
746
  .void
747
+ .checked(:never)
710
748
  end
711
749
  private def define_foreign_method(prop_name, rules, foreign)
712
750
  fk_method = "#{prop_name}_"
@@ -758,6 +796,7 @@ class T::Props::Decorator
758
796
  end
759
797
  end
760
798
 
799
+ # checked(:never) - Rules hash is expensive to check
761
800
  sig do
762
801
  params(
763
802
  prop_name: Symbol,
@@ -766,6 +805,7 @@ class T::Props::Decorator
766
805
  foreign: T.untyped,
767
806
  )
768
807
  .void
808
+ .checked(:never)
769
809
  end
770
810
  private def handle_foreign_option(prop_name, prop_cls, rules, foreign)
771
811
  validate_foreign_option(
@@ -793,7 +833,7 @@ class T::Props::Decorator
793
833
  #
794
834
  # This gets called when a module or class that extends T::Props gets included, extended,
795
835
  # prepended, or inherited.
796
- T::Sig::WithoutRuntime.sig {params(child: DecoratedClass).void}
836
+ sig {params(child: DecoratedClass).void.checked(:never)}
797
837
  def model_inherited(child)
798
838
  child.extend(T::Props::ClassMethods)
799
839
  child.plugins.concat(decorated_class.plugins)
@@ -831,7 +871,7 @@ class T::Props::Decorator
831
871
  end
832
872
  end
833
873
 
834
- T::Sig::WithoutRuntime.sig {params(mod: Module).void}
874
+ sig {params(mod: Module).void.checked(:never)}
835
875
  def plugin(mod)
836
876
  decorated_class.plugins << mod
837
877
  Private.apply_class_methods(mod, decorated_class)
@@ -21,12 +21,15 @@ module T::Props::Optional::DecoratorMethods
21
21
  true,
22
22
  ].freeze
23
23
 
24
- def valid_props
25
- super + [
26
- :default,
27
- :factory,
28
- :optional,
29
- ]
24
+ VALID_RULE_KEYS = Set[
25
+ :default,
26
+ :factory,
27
+ :optional,
28
+ ].freeze
29
+ private_constant :VALID_RULE_KEYS
30
+
31
+ def valid_rule_key?(key)
32
+ super || VALID_RULE_KEYS.include?(key)
30
33
  end
31
34
 
32
35
  def prop_optional?(prop); prop_rules(prop)[:fully_optional]; end
@@ -18,9 +18,9 @@ module T::Props::PrettyPrintable
18
18
  module DecoratorMethods
19
19
  extend T::Sig
20
20
 
21
- sig {returns(T::Array[Symbol])}
22
- def valid_props
23
- super + [:inspect]
21
+ sig {params(key: Symbol).returns(T::Boolean).checked(:never)}
22
+ def valid_rule_key?(key)
23
+ super || key == :inspect
24
24
  end
25
25
 
26
26
  sig do
@@ -274,12 +274,12 @@ end
274
274
  # NB: This must stay in the same file where T::Props::Serializable is defined due to
275
275
  # T::Props::Decorator#apply_plugin; see https://git.corp.stripe.com/stripe-internal/pay-server/blob/fc7f15593b49875f2d0499ffecfd19798bac05b3/chalk/odm/lib/chalk-odm/document_decorator.rb#L716-L717
276
276
  module T::Props::Serializable::DecoratorMethods
277
- def valid_props
278
- super + [
279
- :dont_store,
280
- :name,
281
- :raise_on_nil_write,
282
- ]
277
+
278
+ VALID_RULE_KEYS = Set[:dont_store, :name, :raise_on_nil_write].freeze
279
+ private_constant :VALID_RULE_KEYS
280
+
281
+ def valid_rule_key?(key)
282
+ super || VALID_RULE_KEYS.include?(key)
283
283
  end
284
284
 
285
285
  def required_props
@@ -11,9 +11,9 @@ module T::Props::TypeValidation
11
11
  module DecoratorMethods
12
12
  extend T::Sig
13
13
 
14
- sig {returns(T::Array[Symbol])}
15
- def valid_props
16
- super + [:DEPRECATED_underspecified_type]
14
+ sig {params(key: Symbol).returns(T::Boolean).checked(:never)}
15
+ def valid_rule_key?(key)
16
+ super || :DEPRECATED_underspecified_type == key
17
17
  end
18
18
 
19
19
  sig do
@@ -53,7 +53,9 @@ module T::Props::TypeValidation
53
53
  # a subtype like the type of the values of a typed hash.
54
54
  #
55
55
  # If the type is fully valid, returns nil.
56
- sig {params(type: T::Types::Base).returns(T.nilable(T::Types::Base))}
56
+ #
57
+ # checked(:never) - called potentially many times recursively
58
+ sig {params(type: T::Types::Base).returns(T.nilable(T::Types::Base)).checked(:never)}
57
59
  private def find_invalid_subtype(type)
58
60
  case type
59
61
  when T::Types::TypedEnumerable
data/lib/types/utils.rb CHANGED
@@ -96,7 +96,7 @@ module T::Utils
96
96
  def self.unwrap_nilable(type)
97
97
  case type
98
98
  when T::Types::Union
99
- non_nil_types = type.types.reject {|t| t == T::Utils.coerce(NilClass)}
99
+ non_nil_types = type.types.reject {|t| t == Nilable::NIL_TYPE}
100
100
  if non_nil_types.length == 1
101
101
  non_nil_types.first
102
102
  else
@@ -156,6 +156,8 @@ module T::Utils
156
156
  # :non_nilable_type, Class: if it is an T.nilable type, the corresponding underlying type; otherwise, nil.
157
157
  TypeInfo = Struct.new(:is_union_type, :non_nilable_type)
158
158
 
159
+ NIL_TYPE = T::Utils.coerce(NilClass)
160
+
159
161
  def self.get_type_info(prop_type)
160
162
  if prop_type.is_a?(T::Types::Union)
161
163
  non_nilable_type = T::Utils.unwrap_nilable(prop_type)
@@ -191,7 +193,7 @@ module T::Utils
191
193
  def self.is_union_with_nilclass(prop_type)
192
194
  case prop_type
193
195
  when T::Types::Union
194
- prop_type.types.any? {|t| t == T::Utils.coerce(NilClass)}
196
+ prop_type.types.include?(NIL_TYPE)
195
197
  else
196
198
  false
197
199
  end
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.5213
4
+ version: 0.5.5226
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-08 00:00:00.000000000 Z
11
+ date: 2020-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest