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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/iopromise/data_loader.rb +29 -22
- data/lib/iopromise/deferred/promise.rb +3 -3
- data/lib/iopromise/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 566685c55c8c71504647196e5cc9edcb96cde013c316a9b5a8b2ad771afde67e
|
4
|
+
data.tar.gz: 4928d07726ea8b3df4a79fa056fd3b0ce3c6e5b2493f166b5ea0d7261346b8c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b849e9d40682cda87bf901c734a65a7db10f27c9bcfa22f9760a06943c386c617dccc7f1f186fd92da6fa42956ac8b56384b7be0e4f081bd4e78e5cfd7ecf1f
|
7
|
+
data.tar.gz: 174b5ab72c8a3ef1c6de7a412bcaa35f2a1165066494b7b9e4cbe22d8b858ea57ed0fb274a20a34020dcaffdbd4e998ddd067512ac031174fb4b3ff9c069420a
|
data/Gemfile.lock
CHANGED
@@ -3,17 +3,23 @@
|
|
3
3
|
module IOPromise
|
4
4
|
module DataLoader
|
5
5
|
module ClassMethods
|
6
|
-
def
|
7
|
-
|
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
|
-
|
11
|
-
self.class_eval("def #{
|
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
|
16
|
-
@
|
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
|
25
|
-
|
26
|
-
|
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.
|
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.
|
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
|
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(
|
8
|
+
def initialize(delay: nil, &block)
|
9
9
|
super()
|
10
10
|
|
11
11
|
@block = block
|
12
12
|
|
13
|
-
unless
|
14
|
-
@defer_until = Process.clock_gettime(Process::CLOCK_MONOTONIC) +
|
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?
|
data/lib/iopromise/version.rb
CHANGED
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
|
+
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-
|
11
|
+
date: 2021-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: promise.rb
|