mr_darcy 0.3.0 → 0.4.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/README.md +57 -18
- data/lib/mr_darcy/promise/base.rb +1 -2
- data/lib/mr_darcy/promise/collection.rb +2 -4
- data/lib/mr_darcy/version.rb +1 -1
- data/spec/lib/mr_darcy/promise/collection_spec.rb +5 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a30f4cd28db6fa9241372a6ba419149e78acb95f
|
4
|
+
data.tar.gz: 14599ca6b1ef196eb134e82eebecf9c1a9b3da4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11879372c631def455d5b15453be331adef2187f0d0076c8cfab6297f8703feffec4e394f123f05fd110b2ebcfefc37df2a0fc7ca02755517206d49043af77e8
|
7
|
+
data.tar.gz: da5f40370e5d5d484ab29d9d29100d658742c2134bf82d743da90f92d8f9a0d21ed1f1c4184115b0f8b505847c23c048e8eaca3e89fbde021b13b944d0f8393d
|
data/README.md
CHANGED
@@ -33,6 +33,45 @@ MrDarcy is definitely experimental, and was mostly built over the weekend of
|
|
33
33
|
amazing and sexy [@breccan](https://twitter.com/breccan) and
|
34
34
|
[@eoinkelly](https://twitter.com/eoinkelly).
|
35
35
|
|
36
|
+
### API Changes (0.4.0 and above)
|
37
|
+
|
38
|
+
As of version `0.4.0` the `instance_exec` of promise blocks has been removed
|
39
|
+
(meaning that you can't call `resolve` or `reject` from directly inside your
|
40
|
+
promise blocks). This is becuase `instance_exec` changes the binding of
|
41
|
+
`self` inside the promise, and will cause calls to enclosed methods to fail.
|
42
|
+
|
43
|
+
For example:
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
class InstanceExecExample
|
47
|
+
|
48
|
+
def example_method
|
49
|
+
puts "I did a thing"
|
50
|
+
end
|
51
|
+
|
52
|
+
def make_promise
|
53
|
+
MrDarcy.promise { resolve example_method }.raise
|
54
|
+
end
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
Will raise:
|
59
|
+
|
60
|
+
```
|
61
|
+
NameError in `block in make_promise': undefined local variable or method `example_method' for #<MrDarcy::Promise::DSL:0x007fcc542d75d0>
|
62
|
+
```
|
63
|
+
|
64
|
+
As of `0.4.0` the DSL object wll be passed to the promise block as an argument,
|
65
|
+
therefore:
|
66
|
+
|
67
|
+
```
|
68
|
+
def make_promise
|
69
|
+
MrDarcy.promise { |promise| promise.resolve example_method }.raise
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
73
|
+
will not raise an exception.
|
74
|
+
|
36
75
|
#### Should I use MrDarcy in Production?
|
37
76
|
|
38
77
|
No.
|
@@ -51,15 +90,15 @@ Here's an example:
|
|
51
90
|
```ruby
|
52
91
|
# We're going to wrap an asynchronous web request using EventMachine
|
53
92
|
# in a promise:
|
54
|
-
data = MrDarcy.promise do
|
93
|
+
data = MrDarcy.promise do |promise|
|
55
94
|
EM.run do
|
56
95
|
http = EM.HttpRequest.new('http://camp.ruby.org.nz/').get
|
57
96
|
http.errback do
|
58
|
-
reject http.error
|
97
|
+
promise.reject http.error
|
59
98
|
EM.stop
|
60
99
|
end
|
61
100
|
http.callback do
|
62
|
-
resolve http.response
|
101
|
+
promise.resolve http.response
|
63
102
|
EM.stop
|
64
103
|
end
|
65
104
|
end
|
@@ -86,12 +125,12 @@ doing async ruby:
|
|
86
125
|
or reject the promise.
|
87
126
|
|
88
127
|
```ruby
|
89
|
-
MrDarcy.promise do
|
128
|
+
MrDarcy.promise do |promise|
|
90
129
|
accellerate_the_delorean
|
91
130
|
if speed >= 88
|
92
|
-
resolve :time_flux_initiated
|
131
|
+
promise.resolve :time_flux_initiated
|
93
132
|
else
|
94
|
-
reject :engage_service_brake
|
133
|
+
promise.reject :engage_service_brake
|
95
134
|
end
|
96
135
|
end
|
97
136
|
```
|
@@ -102,9 +141,9 @@ doing async ruby:
|
|
102
141
|
`fail` calls.
|
103
142
|
|
104
143
|
```ruby
|
105
|
-
MrDarcy.promise do
|
144
|
+
MrDarcy.promise do |promise|
|
106
145
|
i = rand
|
107
|
-
i > 0.5 ? resolve i : reject i
|
146
|
+
i > 0.5 ? promise.resolve i : promise.reject i
|
108
147
|
end.then |value|
|
109
148
|
# success
|
110
149
|
end.fail |value|
|
@@ -118,8 +157,8 @@ doing async ruby:
|
|
118
157
|
within the `fail` block to pass it along to the next `fail` block.
|
119
158
|
|
120
159
|
```ruby
|
121
|
-
MrDarcy.promise do
|
122
|
-
reject 2
|
160
|
+
MrDarcy.promise do |promise|
|
161
|
+
promise.reject 2
|
123
162
|
end.fail |value|
|
124
163
|
value * value
|
125
164
|
end.then |value|
|
@@ -130,8 +169,8 @@ doing async ruby:
|
|
130
169
|
4. Failures cascade until they're caught:
|
131
170
|
|
132
171
|
```ruby
|
133
|
-
MrDarcy.promise do
|
134
|
-
reject :fail
|
172
|
+
MrDarcy.promise do |promise|
|
173
|
+
promise.reject :fail
|
135
174
|
end.then
|
136
175
|
# I am skipped
|
137
176
|
end.then
|
@@ -145,11 +184,11 @@ doing async ruby:
|
|
145
184
|
their resolution until the new promise is resolved:
|
146
185
|
|
147
186
|
```ruby
|
148
|
-
MrDarcy.promise do
|
149
|
-
resolve 1
|
187
|
+
MrDarcy.promise do |promise|
|
188
|
+
promise.resolve 1
|
150
189
|
end.then do |value|
|
151
|
-
MrDarcy.promise do
|
152
|
-
resolve value * 2
|
190
|
+
MrDarcy.promise do |p|
|
191
|
+
p.resolve value * 2
|
153
192
|
end
|
154
193
|
end.then |value|
|
155
194
|
# I will be called with 2
|
@@ -163,7 +202,7 @@ complete then you can use the `MrDarcy.all_promises` method:
|
|
163
202
|
|
164
203
|
```ruby
|
165
204
|
MrDarcy.all_promises do
|
166
|
-
10.times.map { |i| MrDarcy.promise { sleep 1; resolve i } }
|
205
|
+
10.times.map { |i| MrDarcy.promise { |p| sleep 1; p.resolve i } }
|
167
206
|
end.then do |values|
|
168
207
|
puts "All done."
|
169
208
|
end
|
@@ -278,7 +317,7 @@ just work.
|
|
278
317
|
|
279
318
|
## Contributing
|
280
319
|
|
281
|
-
1. Fork it ( http://github.com
|
320
|
+
1. Fork it ( http://github.com/jamesotron/mr_darcy/fork )
|
282
321
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
283
322
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
284
323
|
4. Push to the branch (`git push origin my-new-feature`)
|
@@ -8,14 +8,12 @@ module MrDarcy
|
|
8
8
|
include Enumerable
|
9
9
|
|
10
10
|
def initialize promises, opts={}
|
11
|
-
@lock
|
12
|
-
this = self
|
13
|
-
|
11
|
+
@lock = Mutex.new
|
14
12
|
@promises = []
|
15
13
|
@size = promises.size
|
16
14
|
@promise = MrDarcy.promise opts do
|
17
15
|
promises.each do |p|
|
18
|
-
|
16
|
+
add_promise p
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
data/lib/mr_darcy/version.rb
CHANGED
@@ -5,9 +5,9 @@ describe MrDarcy::Promise::Collection do
|
|
5
5
|
describe "with driver #{driver}" do
|
6
6
|
next if driver == :synchronous
|
7
7
|
|
8
|
-
let(:first_promise) { MrDarcy.promise(driver: driver) { resolve 1 } }
|
9
|
-
let(:second_promise) { MrDarcy.promise(driver: driver) { resolve 2 } }
|
10
|
-
let(:third_promise) { MrDarcy.promise(driver: driver) { resolve 3 } }
|
8
|
+
let(:first_promise) { MrDarcy.promise(driver: driver) { |p| p.resolve 1 } }
|
9
|
+
let(:second_promise) { MrDarcy.promise(driver: driver) { |p| p.resolve 2 } }
|
10
|
+
let(:third_promise) { MrDarcy.promise(driver: driver) { |p| p.resolve 3 } }
|
11
11
|
let(:three_promises) { [ first_promise, second_promise, third_promise ] }
|
12
12
|
let(:collection) { described_class.new three_promises, driver: driver }
|
13
13
|
subject { collection }
|
@@ -21,12 +21,12 @@ describe MrDarcy::Promise::Collection do
|
|
21
21
|
its(:final) { should respond_to :raise }
|
22
22
|
|
23
23
|
When 'all the promises resolve' do
|
24
|
-
its(:final) { should be_resolved }
|
25
24
|
its(:result) { should eq [1,2,3] }
|
25
|
+
its(:final) { should be_resolved }
|
26
26
|
end
|
27
27
|
|
28
28
|
When 'any of the promises reject' do
|
29
|
-
let(:second_promise) { MrDarcy.promise(driver: driver) { reject 2 } }
|
29
|
+
let(:second_promise) { MrDarcy.promise(driver: driver) { |p| p.reject 2 } }
|
30
30
|
its(:final) { should be_rejected }
|
31
31
|
its(:result) { should eq 2 }
|
32
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mr_darcy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Harton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|