whenner 0.1.1 → 0.2.0
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/.travis.yml +0 -1
- data/Gemfile.lock +1 -1
- data/README.md +5 -3
- data/lib/whenner.rb +1 -0
- data/lib/whenner/deferred.rb +20 -0
- data/lib/whenner/deferred_proxy.rb +20 -0
- data/lib/whenner/promise.rb +5 -1
- data/lib/whenner/version.rb +1 -1
- data/spec/whenner/deferred_spec.rb +36 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 057edf524df43fcf2575d69704ceb7d3769e6cf9
|
4
|
+
data.tar.gz: 3a953414e1303df0a425969e6c74b82f3dde12c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98308e1cc56deaabef70fe14e47144cdc8f25593e90b919d9e265f608eb03bd13c45cade3d38b31cf9d340b330743471c0d1098922b74b0f7dd045fe4ed25bbb
|
7
|
+
data.tar.gz: ed5835d5fdf2e2243b3c27eb22061ae0804cbe76d1ec4cb6f4f5c52c02da2efa9d089cd5933339d6b4eff071a4c89c5fa25d773bed08b5e698321dc4e30cb701
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -70,9 +70,8 @@ end.done do |titles|
|
|
70
70
|
end
|
71
71
|
```
|
72
72
|
|
73
|
-
As methods in Ruby can only take a single block, Whenner
|
74
|
-
|
75
|
-
be implementing in the future using something like this:
|
73
|
+
As methods in Ruby can only take a single block, Whenner has a special block
|
74
|
+
syntax for setting both `done` and `fail` callbacks:
|
76
75
|
|
77
76
|
```ruby
|
78
77
|
defer { async_get('http://google.com') }.then do |on|
|
@@ -81,6 +80,9 @@ defer { async_get('http://google.com') }.then do |on|
|
|
81
80
|
end
|
82
81
|
```
|
83
82
|
|
83
|
+
The result of `Deferred#then` is a new promise for the value of the callback
|
84
|
+
that will be run.
|
85
|
+
|
84
86
|
### Documentation
|
85
87
|
|
86
88
|
See the inline [API
|
data/lib/whenner.rb
CHANGED
data/lib/whenner/deferred.rb
CHANGED
@@ -105,6 +105,26 @@ module Whenner
|
|
105
105
|
promise
|
106
106
|
end
|
107
107
|
|
108
|
+
|
109
|
+
# Register a callback to be run when the deferred is fulfilled.
|
110
|
+
#
|
111
|
+
# @yieldparam [DeferredProxy] proxy
|
112
|
+
# @return [Promise] a new promise representing the return value
|
113
|
+
# of the deferred, or -- when that return value is a promise itself
|
114
|
+
# -- a promise mimicking that promise.
|
115
|
+
def then
|
116
|
+
Whenner.defer do |d|
|
117
|
+
proxy = DeferredProxy.new(self)
|
118
|
+
yield proxy
|
119
|
+
pdone = done(&proxy.done)
|
120
|
+
pfail = fail(&proxy.fail)
|
121
|
+
pdone.done { |v| d.fulfill(v) }
|
122
|
+
pdone.fail { |v| d.reject(v) }
|
123
|
+
pfail.done { |v| d.reject(v) }
|
124
|
+
pfail.fail { |v| d.reject(v) }
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
108
128
|
# Register a callback to be run when the deferred is fulfilled.
|
109
129
|
#
|
110
130
|
# @yieldparam [Object] value
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Whenner
|
2
|
+
|
3
|
+
# Proxy object yielded by the {Deferred#then} method to set both `fail` and
|
4
|
+
# `done` callbacks.
|
5
|
+
class DeferredProxy
|
6
|
+
def initialize(deferred)
|
7
|
+
@deferred = deferred
|
8
|
+
end
|
9
|
+
|
10
|
+
def done(&block)
|
11
|
+
@done = block if block_given?
|
12
|
+
@done
|
13
|
+
end
|
14
|
+
|
15
|
+
def fail(&block)
|
16
|
+
@fail = block if block_given?
|
17
|
+
@fail
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/whenner/promise.rb
CHANGED
@@ -29,8 +29,12 @@ module Whenner
|
|
29
29
|
# @!method always(&block)
|
30
30
|
# Register a callback to fire when the deferred is resolved.
|
31
31
|
# @return [Promise] a new promise for the return value of the block.
|
32
|
+
# @!method then(&block)
|
33
|
+
# Register both done and fail callbacks
|
34
|
+
# @return [Promise] a new promise for the return value the deferred
|
32
35
|
def_delegators :@deferred, *%i[
|
33
|
-
reason value pending? fulfilled? resolved? rejected?
|
36
|
+
reason value pending? fulfilled? resolved? rejected?
|
37
|
+
fail done always then
|
34
38
|
]
|
35
39
|
|
36
40
|
def initialize(deferred)
|
data/lib/whenner/version.rb
CHANGED
@@ -114,6 +114,14 @@ module Whenner
|
|
114
114
|
expect(new_promise).to be_fulfilled
|
115
115
|
end
|
116
116
|
|
117
|
+
it 'returns a ne promise for a value using #then' do
|
118
|
+
new_promise = subject.then do |on|
|
119
|
+
on.done { 'foo' }
|
120
|
+
end
|
121
|
+
subject.fulfill
|
122
|
+
expect(new_promise.value).to eql('foo')
|
123
|
+
end
|
124
|
+
|
117
125
|
it 'returns a new promise that rejects to the reason' do
|
118
126
|
new_promise = subject.fail { 'foo' }
|
119
127
|
subject.reject
|
@@ -121,6 +129,14 @@ module Whenner
|
|
121
129
|
expect(new_promise).to be_fulfilled
|
122
130
|
end
|
123
131
|
|
132
|
+
it 'returns a new promise that rejects to the reason using #then' do
|
133
|
+
new_promise = subject.then do |on|
|
134
|
+
on.fail { 'foo' }
|
135
|
+
end
|
136
|
+
subject.reject
|
137
|
+
expect(new_promise.reason).to eql('foo')
|
138
|
+
end
|
139
|
+
|
124
140
|
it 'returns a new promise that mimics a promise value' do
|
125
141
|
d = Deferred.new
|
126
142
|
new_promise = subject.done { d.promise }
|
@@ -129,6 +145,16 @@ module Whenner
|
|
129
145
|
expect(new_promise.value).to eql(:a)
|
130
146
|
end
|
131
147
|
|
148
|
+
it 'returns a new promise that mimics a promise value using #then' do
|
149
|
+
d = Deferred.new
|
150
|
+
new_promise = subject.then do |on|
|
151
|
+
on.done { d.promise }
|
152
|
+
end
|
153
|
+
subject.fulfill(:b)
|
154
|
+
d.fulfill(:a)
|
155
|
+
expect(new_promise.value).to eql(:a)
|
156
|
+
end
|
157
|
+
|
132
158
|
it 'is rejected on exception' do
|
133
159
|
called = false
|
134
160
|
promise = subject.done { raise 'arg' }
|
@@ -136,6 +162,16 @@ module Whenner
|
|
136
162
|
subject.fulfill
|
137
163
|
expect(called).to be_a(RuntimeError)
|
138
164
|
end
|
165
|
+
|
166
|
+
it 'is rejected on exception using #then' do
|
167
|
+
called = false
|
168
|
+
promise = subject.then do |on|
|
169
|
+
on.done { raise 'arg' }
|
170
|
+
end
|
171
|
+
promise.fail { |e| called = e }
|
172
|
+
subject.fulfill
|
173
|
+
expect(called).to be_a(RuntimeError)
|
174
|
+
end
|
139
175
|
end
|
140
176
|
end
|
141
177
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: whenner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arjan van der Gaag
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- lib/whenner/callback.rb
|
90
90
|
- lib/whenner/conversions.rb
|
91
91
|
- lib/whenner/deferred.rb
|
92
|
+
- lib/whenner/deferred_proxy.rb
|
92
93
|
- lib/whenner/promise.rb
|
93
94
|
- lib/whenner/version.rb
|
94
95
|
- spec/whenner/conversions_spec.rb
|