iopromise 0.1.4 → 0.1.5

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: 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