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