sorbet-runtime 0.5.5207 → 0.5.5213

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/types/props/decorator.rb +28 -11
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d08a775098ed6f7c1b9f0f9e55646a42cbe887ff207a5f6611ecbe4b50cc0f4
4
- data.tar.gz: 22747dc67dfe8060b4d8539b628599236bcc88f94f47852316fd35510f4d37a5
3
+ metadata.gz: bd7c2c5d45d883ad4e220fc3203d9ef80dc3e8107f9871335db7aaa4c9a9a40f
4
+ data.tar.gz: 4966f2a48e6c729c45030c5f375ad5f835709349dcc1c8ea7e69a5c242d06293
5
5
  SHA512:
6
- metadata.gz: c0a09c3e6522b1d41d8d721eb7926ba3e59d27519ffd9507c4d4d0320f5f6d8b2c7f6612e1a487a881362be4e81c16f28af648c1e1dc267fb72ba4c4b0e1c341
7
- data.tar.gz: 7eb1be39c4d7363c601fcd69cdc40e01aa800df6330dd39dad7ad960d9dc9bcea73d029e23574dfb4fb7d620c1a4746bb5a7e9ac56cd7877df7bb0693f82387a
6
+ metadata.gz: d73323f743b97181769e7973f3ad3942dec32822ea7e5e04870a5a3639f800cf3a21dd0a34f88ded31a1d22acae114b0e24987110a6cf781c56676cd63a9ee48
7
+ data.tar.gz: f0a09a571797e982ee13316799c1886824a97a47efc1c795d843740ab1c8990c4af3fe746e22918e24beb7675eab0f09c62f358e0f199cbbc6884e8a5975c238
@@ -201,6 +201,9 @@ class T::Props::Decorator
201
201
 
202
202
  # For performance, don't use named params here.
203
203
  # Passing in rules here is purely a performance optimization.
204
+ #
205
+ # Note this path is NOT used by generated getters on instances,
206
+ # unless `ifunset` is used on the prop, or `prop_get` is overridden.
204
207
  sig do
205
208
  params(
206
209
  instance: DecoratedInstance,
@@ -213,15 +216,7 @@ class T::Props::Decorator
213
216
  def prop_get(instance, prop, rules=props[prop.to_sym])
214
217
  val = get(instance, prop, rules)
215
218
 
216
- # NB: Do NOT change this to check `val.nil?` instead. BSON::ByteBuffer overrides `==` such
217
- # that `== nil` can return true while `.nil?` returns false. Tests will break in mysterious
218
- # ways. A special thanks to Ruby for enabling this type of bug.
219
- #
220
- # One side effect here is that _if_ a class (like BSON::ByteBuffer) defines ==
221
- # in such a way that instances which are not `nil`, ie are not NilClass, nevertheless
222
- # are `== nil`, then we will transparently convert such instances to `nil` on read.
223
- # Yes, our code relies on this behavior (as of writing). :thisisfine:
224
- if val != nil # rubocop:disable Style/NonNilCheck
219
+ if !val.nil?
225
220
  val
226
221
  else
227
222
  raise NoRulesError.new if !rules
@@ -510,8 +505,13 @@ class T::Props::Decorator
510
505
  end
511
506
  end
512
507
 
513
- @class.send(:define_method, name) do
514
- self.class.decorator.prop_get(self, name, rules)
508
+ if method(:prop_get).owner != T::Props::Decorator || rules.key?(:ifunset)
509
+ @class.send(:define_method, name) do
510
+ self.class.decorator.prop_get(self, name, rules)
511
+ end
512
+ else
513
+ # Fast path (~30x faster as of Ruby 2.6)
514
+ @class.attr_reader(name)
515
515
  end
516
516
  end
517
517
  end
@@ -811,6 +811,23 @@ class T::Props::Decorator
811
811
  # time. Any class that defines props and also overrides the `decorator_class` method is going
812
812
  # to reach this line before its override take effect, turning it into a no-op.
813
813
  child.decorator.add_prop_definition(name, copied_rules)
814
+
815
+ # It's a bit tricky to support `prop_get` hooks added by plugins without
816
+ # sacrificing the `attr_reader` fast path or clobbering customized getters
817
+ # defined manually on a child.
818
+ #
819
+ # To make this work, we _do_ clobber getters defined on the child, but only if:
820
+ # (a) it's needed in order to support a `prop_get` hook, and
821
+ # (b) it's safe because the getter was defined by this file.
822
+ #
823
+ unless rules[:without_accessors]
824
+ if child.decorator.method(:prop_get).owner != method(:prop_get).owner &&
825
+ child.instance_method(name).source_location.first == __FILE__
826
+ child.send(:define_method, name) do
827
+ self.class.decorator.prop_get(self, name, rules)
828
+ end
829
+ end
830
+ end
814
831
  end
815
832
  end
816
833
 
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.5207
4
+ version: 0.5.5213
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-07 00:00:00.000000000 Z
11
+ date: 2020-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest