iopromise 0.1.4 → 0.1.5

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: 1189b2ad73f76eff39b347922c03e2e40fc188ff95b7a6771da921d193c88ed5
4
- data.tar.gz: 169d59659740616c94508bdd3fabfd8fd1850c2a593dade86fda7267efa03eb7
3
+ metadata.gz: 566685c55c8c71504647196e5cc9edcb96cde013c316a9b5a8b2ad771afde67e
4
+ data.tar.gz: 4928d07726ea8b3df4a79fa056fd3b0ce3c6e5b2493f166b5ea0d7261346b8c6
5
5
  SHA512:
6
- metadata.gz: 11f75193659f6f37295faf3d0ecea8166aa446da826da462cfc8ea5631eae2f107a65c1d093f1c082ae1e2690166f124244ea2ddf9bcc837ae3c6763e13ae063
7
- data.tar.gz: d16beca1753c4c31994801787925b25713ac315599cc246dc19a92169fab7afe5948717454e9511be59735e542e8eea4805660c86c6c8de7a906a4e376848dc4
6
+ metadata.gz: 9b849e9d40682cda87bf901c734a65a7db10f27c9bcfa22f9760a06943c386c617dccc7f1f186fd92da6fa42956ac8b56384b7be0e4f081bd4e78e5cfd7ecf1f
7
+ data.tar.gz: 174b5ab72c8a3ef1c6de7a412bcaa35f2a1165066494b7b9e4cbe22d8b858ea57ed0fb274a20a34020dcaffdbd4e998ddd067512ac031174fb4b3ff9c069420a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- iopromise (0.1.4)
4
+ iopromise (0.1.5)
5
5
  nio4r
6
6
  promise.rb (~> 0.7.4)
7
7
 
@@ -3,17 +3,23 @@
3
3
  module IOPromise
4
4
  module DataLoader
5
5
  module ClassMethods
6
- def attr_promised_data(*args)
7
- @promised_data_keys ||= []
8
- @promised_data_keys.concat(args)
6
+ def attr_async(attr_name, build_func = nil)
7
+ self.attr_async_names << attr_name
9
8
 
10
- args.each do |arg|
11
- self.class_eval("def #{arg};@#{arg}.sync;end")
9
+ if build_func.nil?
10
+ self.class_eval("def async_#{attr_name};@#{attr_name};end")
11
+ else
12
+ self.define_method("async_#{attr_name}") do
13
+ @attr_async_memo ||= {}
14
+ @attr_async_memo[attr_name] ||= self.instance_exec(&build_func)
15
+ end
12
16
  end
17
+
18
+ self.class_eval("def #{attr_name};async_#{attr_name}.sync;end")
13
19
  end
14
20
 
15
- def promised_data_keys
16
- @promised_data_keys ||= []
21
+ def attr_async_names
22
+ @attr_async_names ||= []
17
23
  end
18
24
  end
19
25
 
@@ -21,19 +27,29 @@ module IOPromise
21
27
  base.extend(ClassMethods)
22
28
  end
23
29
 
24
- def data_promises
25
- self.class.promised_data_keys.flat_map do |k|
26
- p = instance_variable_get('@' + k.to_s)
30
+ def async_attributes
31
+ @async_attributes ||= Promise.all(attr_async_promises)
32
+ end
33
+
34
+ def sync
35
+ async_attributes.sync
36
+ self
37
+ end
38
+
39
+ protected
40
+ def attr_async_promises
41
+ self.class.attr_async_names.flat_map do |k|
42
+ p = send("async_#{k}")
27
43
  case p
28
44
  when ::IOPromise::DataLoader
29
45
  # greedily, recursively preload all nested data that we know about immediately
30
- p.data_promises
46
+ p.attr_async_promises
31
47
  when ::Promise
32
48
  # allow nesting of dataloaders chained behind other promises
33
49
  resolved = p.then do |result|
34
50
  if result.is_a?(::IOPromise::DataLoader)
35
51
  # likewise, if we resolved a promise that we can recurse, load that data too.
36
- result.data_as_promise
52
+ result.async_attributes
37
53
  else
38
54
  result
39
55
  end
@@ -41,18 +57,9 @@ module IOPromise
41
57
 
42
58
  [resolved]
43
59
  else
44
- raise TypeError.new("Instance variable #{k.to_s} used with attr_promised_data but was not a promise or a IOPromise::DataLoader.")
60
+ raise TypeError.new("Instance variable #{k.to_s} used with attr_async but was not a promise or a IOPromise::DataLoader.")
45
61
  end
46
62
  end
47
63
  end
48
-
49
- def data_as_promise
50
- @data_as_promise ||= Promise.all(data_promises)
51
- end
52
-
53
- def sync
54
- data_as_promise.sync
55
- self
56
- end
57
64
  end
58
65
  end
@@ -5,13 +5,13 @@ require_relative 'executor_pool'
5
5
  module IOPromise
6
6
  module Deferred
7
7
  class DeferredPromise < ::IOPromise::Base
8
- def initialize(timeout: nil, &block)
8
+ def initialize(delay: nil, &block)
9
9
  super()
10
10
 
11
11
  @block = block
12
12
 
13
- unless timeout.nil?
14
- @defer_until = Process.clock_gettime(Process::CLOCK_MONOTONIC) + timeout
13
+ unless delay.nil?
14
+ @defer_until = Process.clock_gettime(Process::CLOCK_MONOTONIC) + delay
15
15
  end
16
16
 
17
17
  ::IOPromise::ExecutorContext.current.register(self) unless @block.nil?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IOPromise
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iopromise
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo Julienne
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-28 00:00:00.000000000 Z
11
+ date: 2021-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: promise.rb