whenner 0.1.1 → 0.2.0

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
  SHA1:
3
- metadata.gz: 9a4aa8af9fb47aa98f75a11bb2433eacf417ae87
4
- data.tar.gz: 69d6cbba0ed8f7549028e185618321b31be8a1a0
3
+ metadata.gz: 057edf524df43fcf2575d69704ceb7d3769e6cf9
4
+ data.tar.gz: 3a953414e1303df0a425969e6c74b82f3dde12c1
5
5
  SHA512:
6
- metadata.gz: 33fe745591cd305f62158756d6de021c3bdb82b1501c73826a9e6a06010db311c4bfbf1f4234ea09680af99d3cea32391a0cfabf0e8b4f33f229ac65601f40b9
7
- data.tar.gz: 97794e75339f30bf8de24b1325d51674fe96ee6a55a0e421ff17a54fdcc1e0b02fd97a21c0e1fa2ac28a0cb0b72dc17712fe55c45a424159043ba35f51708117
6
+ metadata.gz: 98308e1cc56deaabef70fe14e47144cdc8f25593e90b919d9e265f608eb03bd13c45cade3d38b31cf9d340b330743471c0d1098922b74b0f7dd045fe4ed25bbb
7
+ data.tar.gz: ed5835d5fdf2e2243b3c27eb22061ae0804cbe76d1ec4cb6f4f5c52c02da2efa9d089cd5933339d6b4eff071a4c89c5fa25d773bed08b5e698321dc4e30cb701
@@ -1,4 +1,3 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
3
  - 2.0.0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- whenner (0.1.1)
4
+ whenner (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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 does not support a
74
- `then` method yet, that would combine the `done` and `fail` methods. This might
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
@@ -2,6 +2,7 @@ require 'whenner/version'
2
2
  require 'forwardable'
3
3
 
4
4
  require 'whenner/conversions'
5
+ require 'whenner/deferred_proxy'
5
6
  require 'whenner/callback'
6
7
  require 'whenner/deferred'
7
8
  require 'whenner/promise'
@@ -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
@@ -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? fail done always
36
+ reason value pending? fulfilled? resolved? rejected?
37
+ fail done always then
34
38
  ]
35
39
 
36
40
  def initialize(deferred)
@@ -1,3 +1,3 @@
1
1
  module Whenner
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -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.1.1
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