sorbet-runtime 0.5.6386 → 0.5.6395

Sign up to get free protection for your applications and to get access to all the features.
@@ -162,7 +162,16 @@ module T::Props
162
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
- validate_lack_of_side_effects(handler, whitelisted_methods_for_deserialize)
165
+
166
+ deserialization_error, val_return = handler.children
167
+
168
+ assert_equal(:send, deserialization_error.type)
169
+ receiver, method, *args = deserialization_error.children
170
+ assert_equal(nil, receiver)
171
+ assert_equal(:raise_deserialization_error, method)
172
+ args.each {|a| validate_lack_of_side_effects(a, whitelisted_methods_for_deserialize)}
173
+
174
+ validate_lack_of_side_effects(val_return, whitelisted_methods_for_deserialize)
166
175
  else
167
176
  validate_lack_of_side_effects(else_body, whitelisted_methods_for_deserialize)
168
177
  end
@@ -261,7 +270,7 @@ module T::Props
261
270
  private_class_method def self.whitelisted_methods_for_deserialize
262
271
  @whitelisted_methods_for_deserialize ||= {
263
272
  lvar: %i{dup map transform_values transform_keys each_with_object nil? []= to_f},
264
- const: %i[deserialize from_hash deep_clone_object soft_assert_handler],
273
+ const: %i[deserialize from_hash deep_clone_object],
265
274
  }
266
275
  end
267
276
  end
@@ -48,6 +48,11 @@ module T::Props
48
48
  @lazily_defined_methods ||= {}
49
49
  end
50
50
 
51
+ sig {returns(T::Hash[Symbol, T.untyped]).checked(:never)}
52
+ private def lazily_defined_vm_methods
53
+ @lazily_defined_vm_methods ||= {}
54
+ end
55
+
51
56
  sig {params(name: Symbol).void}
52
57
  private def eval_lazily_defined_method!(name)
53
58
  if !HasLazilySpecializedMethods.lazy_evaluation_enabled?
@@ -61,6 +66,18 @@ module T::Props
61
66
  cls.send(:private, name)
62
67
  end
63
68
 
69
+ sig {params(name: Symbol).void}
70
+ private def eval_lazily_defined_vm_method!(name)
71
+ if !HasLazilySpecializedMethods.lazy_evaluation_enabled?
72
+ raise SourceEvaluationDisabled.new
73
+ end
74
+
75
+ lazily_defined_vm_methods.fetch(name).call
76
+
77
+ cls = decorated_class
78
+ cls.send(:private, name)
79
+ end
80
+
64
81
  sig {params(name: Symbol, blk: T.proc.returns(String)).void}
65
82
  private def enqueue_lazy_method_definition!(name, &blk)
66
83
  lazily_defined_methods[name] = blk
@@ -76,6 +93,21 @@ module T::Props
76
93
  cls.send(:private, name)
77
94
  end
78
95
 
96
+ sig {params(name: Symbol, blk: T.untyped).void}
97
+ private def enqueue_lazy_vm_method_definition!(name, &blk)
98
+ lazily_defined_vm_methods[name] = blk
99
+
100
+ cls = decorated_class
101
+ cls.send(:define_method, name) do |*args|
102
+ self.class.decorator.send(:eval_lazily_defined_vm_method!, name)
103
+ send(name, *args)
104
+ end
105
+ if cls.respond_to?(:ruby2_keywords, true)
106
+ cls.send(:ruby2_keywords, name)
107
+ end
108
+ cls.send(:private, name)
109
+ end
110
+
79
111
  sig {void}
80
112
  def eagerly_define_lazy_methods!
81
113
  return if lazily_defined_methods.empty?
@@ -87,6 +119,17 @@ module T::Props
87
119
  lazily_defined_methods.each_key {|name| cls.send(:private, name)}
88
120
  lazily_defined_methods.clear
89
121
  end
122
+
123
+ sig {void}
124
+ def eagerly_define_lazy_vm_methods!
125
+ return if lazily_defined_vm_methods.empty?
126
+
127
+ lazily_defined_vm_methods.values.map(&:call)
128
+
129
+ cls = decorated_class
130
+ lazily_defined_vm_methods.each_key {|name| cls.send(:private, name)}
131
+ lazily_defined_vm_methods.clear
132
+ end
90
133
  end
91
134
  end
92
135
  end
@@ -57,15 +57,10 @@ module T::Props
57
57
  begin
58
58
  #{transformation}
59
59
  rescue NoMethodError => e
60
- T::Configuration.soft_assert_handler(
61
- 'Deserialization error (probably unexpected stored type)',
62
- storytime: {
63
- klass: self.class,
64
- prop: #{prop.inspect},
65
- value: val,
66
- error: e.message,
67
- notify: 'djudd'
68
- }
60
+ raise_deserialization_error(
61
+ #{prop.inspect},
62
+ val,
63
+ e,
69
64
  )
70
65
  val
71
66
  end
@@ -156,6 +156,19 @@ module T::Props::Serializable
156
156
  @_required_props_missing_from_deserialize << prop
157
157
  nil
158
158
  end
159
+
160
+ private def raise_deserialization_error(prop_name, value, orig_error)
161
+ T::Configuration.soft_assert_handler(
162
+ 'Deserialization error (probably unexpected stored type)',
163
+ storytime: {
164
+ klass: self.class,
165
+ prop: prop_name,
166
+ value: value,
167
+ error: orig_error.message,
168
+ notify: 'djudd'
169
+ }
170
+ )
171
+ end
159
172
  end
160
173
 
161
174
 
@@ -201,8 +214,13 @@ module T::Props::Serializable::DecoratorMethods
201
214
  rules[:serialized_form] = rules.fetch(:name, prop.to_s)
202
215
  res = super
203
216
  prop_by_serialized_forms[rules[:serialized_form]] = prop
204
- enqueue_lazy_method_definition!(:__t_props_generated_serialize) {generate_serialize_source}
205
- enqueue_lazy_method_definition!(:__t_props_generated_deserialize) {generate_deserialize_source}
217
+ if T::Configuration.use_vm_prop_serde?
218
+ enqueue_lazy_vm_method_definition!(:__t_props_generated_serialize) {generate_serialize2}
219
+ enqueue_lazy_vm_method_definition!(:__t_props_generated_deserialize) {generate_deserialize2}
220
+ else
221
+ enqueue_lazy_method_definition!(:__t_props_generated_serialize) {generate_serialize_source}
222
+ enqueue_lazy_method_definition!(:__t_props_generated_deserialize) {generate_deserialize_source}
223
+ end
206
224
  res
207
225
  end
208
226
 
@@ -217,6 +235,18 @@ module T::Props::Serializable::DecoratorMethods
217
235
  )
218
236
  end
219
237
 
238
+ private def generate_serialize2
239
+ T::Props::Private::SerializerGenerator.generate2(decorated_class, props)
240
+ end
241
+
242
+ private def generate_deserialize2
243
+ T::Props::Private::DeserializerGenerator.generate2(
244
+ decorated_class,
245
+ props,
246
+ props_with_defaults || {},
247
+ )
248
+ end
249
+
220
250
  def message_with_generated_source_context(error, generated_method, generate_source_method)
221
251
  line_label = error.backtrace.find {|l| l.end_with?("in `#{generated_method}'")}
222
252
  return unless line_label
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.6386
4
+ version: 0.5.6395
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-22 00:00:00.000000000 Z
11
+ date: 2021-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -191,7 +191,6 @@ files:
191
191
  - lib/types/private/types/string_holder.rb
192
192
  - lib/types/private/types/type_alias.rb
193
193
  - lib/types/private/types/void.rb
194
- - lib/types/profile.rb
195
194
  - lib/types/props/_props.rb
196
195
  - lib/types/props/constructor.rb
197
196
  - lib/types/props/custom_type.rb
data/lib/types/profile.rb DELETED
@@ -1,31 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module T::Profile
5
- SAMPLE_RATE = 101 # 1 out of that many typechecks will be measured
6
- class <<self
7
- attr_accessor :typecheck_duration
8
- attr_accessor :typecheck_samples
9
- attr_accessor :typecheck_sample_attempts
10
- def typecheck_duration_estimate
11
- total_typechecks = typecheck_samples * SAMPLE_RATE + (SAMPLE_RATE - typecheck_sample_attempts)
12
- typechecks_measured = typecheck_samples * SAMPLE_RATE
13
- if typechecks_measured.positive?
14
- typecheck_duration * SAMPLE_RATE * 1.0 * total_typechecks / typechecks_measured
15
- else
16
- 0.0
17
- end
18
- end
19
-
20
- def typecheck_count_estimate
21
- typecheck_samples * SAMPLE_RATE
22
- end
23
-
24
- def reset
25
- @typecheck_duration = 0
26
- @typecheck_samples = 0
27
- @typecheck_sample_attempts = SAMPLE_RATE
28
- end
29
- end
30
- self.reset
31
- end