mr_darcy 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -1
- data/lib/mr_darcy.rb +46 -0
- data/lib/mr_darcy/context.rb +29 -7
- data/lib/mr_darcy/deferred.rb +18 -7
- data/lib/mr_darcy/drivers.rb +1 -1
- data/lib/mr_darcy/drivers/celluloid.rb +6 -0
- data/lib/mr_darcy/drivers/synchronous.rb +5 -0
- data/lib/mr_darcy/drivers/thread.rb +6 -0
- data/lib/mr_darcy/promise.rb +1 -0
- data/lib/mr_darcy/promise/base.rb +19 -6
- data/lib/mr_darcy/promise/celluloid.rb +7 -0
- data/lib/mr_darcy/promise/child_promise.rb +4 -0
- data/lib/mr_darcy/promise/collection.rb +15 -8
- data/lib/mr_darcy/promise/dsl.rb +6 -18
- data/lib/mr_darcy/promise/em.rb +3 -0
- data/lib/mr_darcy/promise/state.rb +3 -0
- data/lib/mr_darcy/promise/state/base.rb +4 -3
- data/lib/mr_darcy/promise/state/rejected.rb +1 -0
- data/lib/mr_darcy/promise/state/resolved.rb +1 -0
- data/lib/mr_darcy/promise/state/unresolved.rb +3 -0
- data/lib/mr_darcy/promise/synchronous.rb +2 -0
- data/lib/mr_darcy/promise/thread.rb +3 -0
- data/lib/mr_darcy/version.rb +1 -1
- data/spec/lib/mr_darcy/promise/dsl_spec.rb +0 -4
- data/spec/lib/mr_darcy/promise/state/base_spec.rb +0 -2
- metadata +29 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc7f7a39633960c2c25aaa833c6c32a1436682f6
|
4
|
+
data.tar.gz: 2879b88de3cbc354b378fff40dcb3f052ebe5054
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9644421cf5314ee7618b5d01762dbd5f5c56515335910e9275f03f02c1c40d49375184a2e48ac966b8ff784140fa3f8df1e9b373dafb72dcb33562878e511c90
|
7
|
+
data.tar.gz: 5062de2330f134e2af6ad98914184cfc1f69c973bad12654ec84159e0fc9b7d7cd808fac177b904063bb1d2af5e21cfd799060d1771cbdd694ef89dcbb0b604a
|
data/README.md
CHANGED
@@ -24,6 +24,10 @@ Or install it yourself as:
|
|
24
24
|
gem install mr_darcy
|
25
25
|
```
|
26
26
|
|
27
|
+
## Documentation
|
28
|
+
|
29
|
+
API Documentation is available on [rdoc.info](http://rdoc.info/gems/mr_darcy/)
|
30
|
+
|
27
31
|
## Usage
|
28
32
|
|
29
33
|
### WARNING
|
@@ -306,7 +310,7 @@ context.transfer(20).fail do
|
|
306
310
|
# Oh no, Marty doesn't have enough money, let's borrow some from Doc.
|
307
311
|
BankTransfer.new(money_source: doc_brown, money_destination: marty) \
|
308
312
|
.transfer(20).then
|
309
|
-
#
|
313
|
+
# Try transferring again.
|
310
314
|
context.transfer(20)
|
311
315
|
end
|
312
316
|
end
|
data/lib/mr_darcy.rb
CHANGED
@@ -8,14 +8,24 @@ module MrDarcy
|
|
8
8
|
|
9
9
|
module_function
|
10
10
|
|
11
|
+
# Set the driver to use for asynchronicity.
|
12
|
+
# See #all_drivers for a list of available
|
13
|
+
# drivers on your platform.
|
11
14
|
def driver=(driver)
|
12
15
|
@driver=driver
|
13
16
|
end
|
14
17
|
|
18
|
+
# The current driver in use for asynchronicity.
|
19
|
+
# Defaults to :Thread
|
15
20
|
def driver
|
16
21
|
@driver ||= :Thread
|
17
22
|
end
|
18
23
|
|
24
|
+
# The available drivers for your combination of Ruby implementation
|
25
|
+
# and operating system.
|
26
|
+
# Note that this is possible drivers, not that you have the necessary
|
27
|
+
# dependencies installed - ie it doesn't check that you have required
|
28
|
+
# celluloid before it tries to use it.
|
19
29
|
def all_drivers
|
20
30
|
return @drivers if @drivers && !@drivers.empty?
|
21
31
|
drivers ||= %w| synchronous thread celluloid em |.map(&:to_sym)
|
@@ -23,11 +33,47 @@ module MrDarcy
|
|
23
33
|
@drivers = drivers
|
24
34
|
end
|
25
35
|
|
36
|
+
# Generate a new promise with the provided block.
|
37
|
+
# Accepts the following options:
|
38
|
+
#
|
39
|
+
# * driver: override the default driver.
|
40
|
+
#
|
41
|
+
# :yields: promise
|
42
|
+
#
|
43
|
+
# Yields a promise into the block as the first
|
44
|
+
# argument so that you can resolve or reject from
|
45
|
+
# within the block.
|
46
|
+
#
|
47
|
+
# MrDarcy.promise do |p|
|
48
|
+
# r = rand(10)
|
49
|
+
# if r > 5
|
50
|
+
# p.resolve r
|
51
|
+
# else
|
52
|
+
# p.reject r
|
53
|
+
# end
|
54
|
+
# end
|
26
55
|
def promise opts={}, &block
|
27
56
|
driver = opts[:driver] || self.driver
|
28
57
|
MrDarcy::Promise.new driver: driver, &block
|
29
58
|
end
|
30
59
|
|
60
|
+
# Generate a new promise representing a collection
|
61
|
+
# of promises.
|
62
|
+
# The collection promise resolves once all the
|
63
|
+
# collected promises are resolved and rejects
|
64
|
+
# as soon as the first promise rejects.
|
65
|
+
#
|
66
|
+
# This method collects all promises returned
|
67
|
+
# from a provided block:
|
68
|
+
#
|
69
|
+
# MrDarcy.all_promises do
|
70
|
+
# 10.times.map do |i|
|
71
|
+
# MrDarcy.promise do |p|
|
72
|
+
# sleep 1
|
73
|
+
# p.resolve i
|
74
|
+
# end
|
75
|
+
# end
|
76
|
+
# end
|
31
77
|
def all_promises opts={}
|
32
78
|
MrDarcy::Promise::Collection.new yield, opts
|
33
79
|
end
|
data/lib/mr_darcy/context.rb
CHANGED
@@ -1,11 +1,28 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
# This class defines the abstract ability to create DCI roles in MrDarcy.
|
4
|
+
# Start by subclassing and adding some roles and actions and away you go.
|
1
5
|
module MrDarcy
|
2
6
|
class Context
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegators :deferred, :result, :rejected?, :resolved?, :unresolved?
|
3
10
|
|
4
11
|
class << self
|
12
|
+
# Defines a role to be mixed into the roll-player
|
13
|
+
# when this context is initialized.
|
14
|
+
#
|
15
|
+
# See MrDarcy::Role#initialize for argument definitions.
|
5
16
|
def role role_name, options={}, &block
|
6
17
|
self.roles[role_name] = Role.new(role_name, options, &block)
|
7
18
|
end
|
8
19
|
|
20
|
+
# Defines an action that can be performed in this
|
21
|
+
# context.
|
22
|
+
#
|
23
|
+
# * action_name: essentially the name of the method defined in this class.
|
24
|
+
#
|
25
|
+
# Takes a block with which to define the action.
|
9
26
|
def action action_name, &block
|
10
27
|
define_method action_name do |*args|
|
11
28
|
self.then do |value|
|
@@ -15,14 +32,22 @@ module MrDarcy
|
|
15
32
|
end
|
16
33
|
end
|
17
34
|
|
35
|
+
# A list of available roles in this context.
|
18
36
|
def roles
|
19
37
|
@roles ||= {}
|
20
38
|
end
|
21
39
|
end
|
22
40
|
|
41
|
+
# Create an instance of the context. You must pass in role-players
|
42
|
+
# for all roles defined in this context using a single hash argument
|
43
|
+
# of role names (as symbols) to objects.
|
44
|
+
#
|
45
|
+
# eg:
|
46
|
+
#
|
47
|
+
# BankTransfer.new money_source: account1, money_destination: account2
|
23
48
|
def initialize role_players={}
|
24
49
|
@driver = role_players.delete(:driver) || MrDarcy.driver
|
25
|
-
@deferred = Deferred.new(driver: driver)
|
50
|
+
@deferred = Deferred.new(driver: driver)
|
26
51
|
deferred.resolve nil
|
27
52
|
|
28
53
|
roles = self.class.roles
|
@@ -38,6 +63,7 @@ module MrDarcy
|
|
38
63
|
end
|
39
64
|
end
|
40
65
|
|
66
|
+
# See MrDarcy::Promise::Base#then
|
41
67
|
def then &block
|
42
68
|
deferred.then do |value|
|
43
69
|
self.instance_exec(value, &block)
|
@@ -45,6 +71,7 @@ module MrDarcy
|
|
45
71
|
self
|
46
72
|
end
|
47
73
|
|
74
|
+
# See MrDarcy::Promise::Base#fail
|
48
75
|
def fail &block
|
49
76
|
deferred.fail do |value|
|
50
77
|
self.instance_exec(value, &block)
|
@@ -52,12 +79,7 @@ module MrDarcy
|
|
52
79
|
self
|
53
80
|
end
|
54
81
|
|
55
|
-
|
56
|
-
define_method method do
|
57
|
-
deferred.public_send method
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
82
|
+
# See MrDarcy::Promise::Base#final
|
61
83
|
def final
|
62
84
|
deferred.final
|
63
85
|
self
|
data/lib/mr_darcy/deferred.rb
CHANGED
@@ -1,26 +1,37 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module MrDarcy
|
4
|
+
|
5
|
+
# A wrapper around promises that can be externally resolved.
|
2
6
|
class Deferred
|
7
|
+
extend Forwardable
|
3
8
|
|
4
|
-
|
9
|
+
def_delegators :last_promise, :resolved?, :rejected?, :unresolved?, :resolve, :reject, :final, :result, :raise
|
5
10
|
|
6
|
-
|
7
|
-
define_method method do |*args|
|
8
|
-
last_promise.public_send method, *args
|
9
|
-
end
|
10
|
-
end
|
11
|
+
attr_reader :promise, :last_promise
|
11
12
|
|
13
|
+
# See MrDarcy::Promise::Base#then
|
12
14
|
def then &block
|
13
15
|
self.last_promise = last_promise.then(&block)
|
14
16
|
end
|
15
17
|
|
18
|
+
# See MrDarcy::Promise::Base#fail
|
16
19
|
def fail &block
|
17
20
|
self.last_promise = last_promise.fail(&block)
|
18
21
|
end
|
19
22
|
|
20
|
-
|
23
|
+
# Create a new deferred.
|
24
|
+
# Takes the following options:
|
25
|
+
#
|
26
|
+
# * driver: override the default driver for this promise.
|
27
|
+
def initialize opts={}
|
21
28
|
driver = opts[:driver] || MrDarcy.driver
|
22
29
|
self.promise = MrDarcy::Promise.new(driver: driver) {}
|
23
30
|
self.last_promise = promise
|
24
31
|
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_writer :promise, :last_promise
|
25
36
|
end
|
26
37
|
end
|
data/lib/mr_darcy/drivers.rb
CHANGED
@@ -1,20 +1,26 @@
|
|
1
1
|
require 'celluloid/autostart'
|
2
2
|
|
3
|
+
# The backend abstracting for scheduling blocks asynchronously
|
4
|
+
# with Celluloid.
|
5
|
+
|
3
6
|
module MrDarcy
|
4
7
|
module Drivers
|
5
8
|
module Celluloid
|
6
9
|
module_function
|
7
10
|
|
11
|
+
# Create a new future, and add it to the future stack.
|
8
12
|
def dispatch(&block)
|
9
13
|
futures << ::Celluloid::Future.new(&block)
|
10
14
|
end
|
11
15
|
|
16
|
+
# Iterate the future stack and wait for each to resolve.
|
12
17
|
def wait
|
13
18
|
futures.each do |future|
|
14
19
|
future.value
|
15
20
|
end
|
16
21
|
end
|
17
22
|
|
23
|
+
# Returns the future stack.
|
18
24
|
def futures
|
19
25
|
@futures ||= []
|
20
26
|
end
|
@@ -1,12 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Driver used for testing synchronously.
|
3
|
+
|
1
4
|
module MrDarcy
|
2
5
|
module Drivers
|
3
6
|
module Synchronous
|
4
7
|
module_function
|
5
8
|
|
9
|
+
# Immediately yields whatever block is passed into it.
|
6
10
|
def dispatch
|
7
11
|
yield
|
8
12
|
end
|
9
13
|
|
14
|
+
# Immediately yields whatever block is passed into it.
|
10
15
|
def wait
|
11
16
|
yield
|
12
17
|
end
|
@@ -1,15 +1,21 @@
|
|
1
1
|
require 'thread'
|
2
2
|
|
3
|
+
# Backend abstraction for scheduling blocks into threads.
|
4
|
+
|
3
5
|
module MrDarcy
|
4
6
|
module Drivers
|
5
7
|
module Thread
|
6
8
|
module_function
|
7
9
|
|
10
|
+
# Create a new thread with the supplied block and store it
|
11
|
+
# on the thread stack.
|
8
12
|
def dispatch(&block)
|
9
13
|
@threads ||= []
|
10
14
|
@threads << ::Thread.new(&block)
|
11
15
|
end
|
12
16
|
|
17
|
+
# Iterate through all threads in the thread stack and wait
|
18
|
+
# until they are complete.
|
13
19
|
def wait
|
14
20
|
@threads ||= []
|
15
21
|
@threads.each do |thread|
|
data/lib/mr_darcy/promise.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module MrDarcy
|
2
4
|
module Promise
|
5
|
+
|
6
|
+
# An abstract superclass for all promise implementations.
|
3
7
|
class Base
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
def_delegators :state_machine, :resolved?, :unresolved?, :rejected?
|
4
11
|
|
12
|
+
# Create a new promise and schedule it for execution.
|
5
13
|
def initialize block
|
6
14
|
state
|
7
15
|
schedule_promise do
|
@@ -10,6 +18,8 @@ module MrDarcy
|
|
10
18
|
did_initialize
|
11
19
|
end
|
12
20
|
|
21
|
+
# Create a new promise that resolves and calls the supplied
|
22
|
+
# block when this promise is resolved.
|
13
23
|
def then &block
|
14
24
|
ensure_child_promise
|
15
25
|
child_promise.resolve_block = block
|
@@ -17,6 +27,8 @@ module MrDarcy
|
|
17
27
|
child_promise.promise
|
18
28
|
end
|
19
29
|
|
30
|
+
# Create a new promise that rejects and calls the supplied
|
31
|
+
# block when this promise is rejected.
|
20
32
|
def fail &block
|
21
33
|
ensure_child_promise
|
22
34
|
child_promise.reject_block = block
|
@@ -24,14 +36,19 @@ module MrDarcy
|
|
24
36
|
child_promise.promise
|
25
37
|
end
|
26
38
|
|
39
|
+
# Wait until the promise is resolved or rejected and return it's
|
40
|
+
# result value.
|
27
41
|
def result
|
28
42
|
Kernel::raise "Subclasses must implement me"
|
29
43
|
end
|
30
44
|
|
45
|
+
# Wait until the promise is resolved or rejected and return self.
|
31
46
|
def final
|
32
47
|
Kernel::raise "Subclasses must implement me"
|
33
48
|
end
|
34
49
|
|
50
|
+
# Wait until the promise is resolver or rejected, and if rejected
|
51
|
+
# raise the error value in this context.
|
35
52
|
def raise
|
36
53
|
r = result
|
37
54
|
if rejected?
|
@@ -43,17 +60,13 @@ module MrDarcy
|
|
43
60
|
end
|
44
61
|
end
|
45
62
|
|
46
|
-
|
47
|
-
define_method method do |*args|
|
48
|
-
state_machine.public_send(method, *args)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
63
|
+
# Resolve this promise with the provided value.
|
52
64
|
def resolve value
|
53
65
|
do_resolve value
|
54
66
|
self
|
55
67
|
end
|
56
68
|
|
69
|
+
# Reject this promise with the provided error/value.
|
57
70
|
def reject exception
|
58
71
|
do_reject exception
|
59
72
|
self
|
@@ -2,7 +2,14 @@ require 'celluloid/autostart'
|
|
2
2
|
|
3
3
|
module MrDarcy
|
4
4
|
module Promise
|
5
|
+
|
6
|
+
# A specialisation of MrDarcy::Promise::Base to work with
|
7
|
+
# Celluloid.
|
8
|
+
#
|
9
|
+
# See MrDarcy::Promise::Base for method information.
|
5
10
|
class Celluloid < Base
|
11
|
+
# Each promise gets it's own actor thread.
|
12
|
+
# :nodoc:
|
6
13
|
class Actor
|
7
14
|
include ::Celluloid
|
8
15
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module MrDarcy
|
2
2
|
module Promise
|
3
|
+
# A special variety of promise created by Base#then and Base#fail
|
4
|
+
# methods.
|
3
5
|
class ChildPromise
|
4
6
|
|
5
7
|
attr_accessor :resolve_block, :reject_block, :promise
|
@@ -8,6 +10,7 @@ module MrDarcy
|
|
8
10
|
self.promise = MrDarcy.promise(opts) {}
|
9
11
|
end
|
10
12
|
|
13
|
+
# Called by the parent promise when it resolves.
|
11
14
|
def parent_resolved value
|
12
15
|
begin
|
13
16
|
return resolve_with value unless handles_resolve?
|
@@ -20,6 +23,7 @@ module MrDarcy
|
|
20
23
|
end
|
21
24
|
end
|
22
25
|
|
26
|
+
# Called by the parent promise when it rejects.
|
23
27
|
def parent_rejected value
|
24
28
|
begin
|
25
29
|
return reject_with value unless handles_reject?
|
@@ -1,12 +1,20 @@
|
|
1
|
+
require 'forwardable'
|
1
2
|
require 'thread'
|
2
3
|
|
3
4
|
module MrDarcy
|
4
5
|
module Promise
|
5
|
-
class Collection
|
6
|
-
attr_accessor :promises, :size
|
7
6
|
|
7
|
+
# A meta-promise that represents a collection of other promises and their
|
8
|
+
# states.
|
9
|
+
class Collection
|
8
10
|
include Enumerable
|
11
|
+
extend Forwardable
|
12
|
+
|
13
|
+
def_delegators :my_promise, :rejected?, :resolved?, :unresolved?, :raise, :result, :then, :fail
|
9
14
|
|
15
|
+
# Creates a meta-promise based on a collection of promises.
|
16
|
+
# * promises: an array of promises
|
17
|
+
# * opts: options for MrDarcy.promise
|
10
18
|
def initialize promises, opts={}
|
11
19
|
@lock = Mutex.new
|
12
20
|
@promises = []
|
@@ -18,31 +26,30 @@ module MrDarcy
|
|
18
26
|
end
|
19
27
|
end
|
20
28
|
|
21
|
-
|
22
|
-
define_method method do |*args,&block|
|
23
|
-
my_promise.public_send method, *args, &block
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
29
|
+
# See MrDarcy::Promise::Base#final
|
27
30
|
def final
|
28
31
|
my_promise.final
|
29
32
|
self
|
30
33
|
end
|
31
34
|
|
35
|
+
# Allow iteration of promises for Enumerable.
|
32
36
|
def each &block
|
33
37
|
promises.each &block
|
34
38
|
end
|
35
39
|
|
40
|
+
# Add a new promise to our collection.
|
36
41
|
def push promise
|
37
42
|
@lock.synchronize { @size = @size + 1 }
|
38
43
|
add_promise promise
|
39
44
|
end
|
40
45
|
alias << push
|
41
46
|
|
47
|
+
# Return the number of promises in this collection.
|
42
48
|
def size
|
43
49
|
@lock.synchronize { @size }
|
44
50
|
end
|
45
51
|
|
52
|
+
# Return an array of promises in this collection.
|
46
53
|
def promises
|
47
54
|
@lock.synchronize { @promises }
|
48
55
|
end
|
data/lib/mr_darcy/promise/dsl.rb
CHANGED
@@ -1,29 +1,17 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module MrDarcy
|
2
4
|
module Promise
|
5
|
+
# Syntax wrapper around Promise. Can probably be removed now.
|
3
6
|
class DSL
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegators :@promise, :resolve, :reject, :unresolved?, :resolved?, :rejected?, :then, :fail, :result, :final
|
4
10
|
|
5
11
|
def initialize promise
|
6
12
|
@promise = promise
|
7
13
|
end
|
8
14
|
|
9
|
-
def resolve(value)
|
10
|
-
promise.resolve value
|
11
|
-
end
|
12
|
-
|
13
|
-
def reject(exception)
|
14
|
-
promise.reject exception
|
15
|
-
end
|
16
|
-
|
17
|
-
%w| unresolved? resolved? rejected? then fail result final |.map(&:to_sym).each do |method|
|
18
|
-
define_method method do |*args|
|
19
|
-
promise.public_send method, *args
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
attr_accessor :promise
|
26
|
-
|
27
15
|
end
|
28
16
|
end
|
29
17
|
end
|
data/lib/mr_darcy/promise/em.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module MrDarcy
|
2
2
|
module Promise
|
3
|
+
# Implementation of the State Pattern for Promises.
|
3
4
|
module State
|
4
5
|
autoload :Base, File.expand_path('../state/base', __FILE__)
|
5
6
|
autoload :Unresolved, File.expand_path('../state/unresolved', __FILE__)
|
@@ -8,6 +9,8 @@ module MrDarcy
|
|
8
9
|
|
9
10
|
module_function
|
10
11
|
|
12
|
+
# Return an instance of the correct State class based on the state of
|
13
|
+
# the passed in object.
|
11
14
|
def state stateful
|
12
15
|
case stateful.send :state
|
13
16
|
when :unresolved
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module MrDarcy
|
2
2
|
module Promise
|
3
3
|
module State
|
4
|
+
# Abstract base class for all Promise states.
|
4
5
|
class Base
|
5
|
-
attr_accessor :stateful
|
6
|
-
|
7
6
|
def initialize stateful
|
8
|
-
|
7
|
+
@stateful = stateful
|
9
8
|
end
|
10
9
|
|
11
10
|
def unresolved?
|
@@ -30,6 +29,8 @@ module MrDarcy
|
|
30
29
|
|
31
30
|
private
|
32
31
|
|
32
|
+
attr_reader :stateful
|
33
|
+
|
33
34
|
def get_state
|
34
35
|
stateful.send :state
|
35
36
|
end
|
@@ -1,15 +1,18 @@
|
|
1
1
|
module MrDarcy
|
2
2
|
module Promise
|
3
3
|
module State
|
4
|
+
# Represents the unresolved state of a promise.
|
4
5
|
class Unresolved < Base
|
5
6
|
def unresolved?
|
6
7
|
true
|
7
8
|
end
|
8
9
|
|
10
|
+
# Transition into resolved state.
|
9
11
|
def resolve
|
10
12
|
set_state :resolved
|
11
13
|
end
|
12
14
|
|
15
|
+
# Transition into rejected state.
|
13
16
|
def reject
|
14
17
|
set_state :rejected
|
15
18
|
end
|
data/lib/mr_darcy/version.rb
CHANGED
@@ -16,10 +16,6 @@ describe MrDarcy::Promise::DSL do
|
|
16
16
|
it { should respond_to :result }
|
17
17
|
it { should respond_to :final }
|
18
18
|
|
19
|
-
describe '.new' do
|
20
|
-
its(:promise) { should eq promise }
|
21
|
-
end
|
22
|
-
|
23
19
|
describe '#resolve' do
|
24
20
|
subject { dsl.resolve :resolved_value }
|
25
21
|
before { promise.stub :value= => nil, resolve: nil }
|
@@ -6,8 +6,6 @@ describe MrDarcy::Promise::State::Base do
|
|
6
6
|
let(:state) { described_class.new stateful }
|
7
7
|
subject { state }
|
8
8
|
|
9
|
-
it { should respond_to :stateful }
|
10
|
-
it { should respond_to :stateful= }
|
11
9
|
it { should respond_to :unresolved? }
|
12
10
|
it { should respond_to :resolved? }
|
13
11
|
it { should respond_to :rejected? }
|
metadata
CHANGED
@@ -1,167 +1,167 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mr_darcy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
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-
|
11
|
+
date: 2014-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.5'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: guard
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: guard-rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: guard-bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: terminal-notifier-guard
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: pry
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: eventmachine
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: em-http-request
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- -
|
143
|
+
- - ">="
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- -
|
150
|
+
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: celluloid
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- -
|
157
|
+
- - ">="
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: '0'
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
description: |2
|
@@ -173,8 +173,8 @@ executables: []
|
|
173
173
|
extensions: []
|
174
174
|
extra_rdoc_files: []
|
175
175
|
files:
|
176
|
-
- .gitignore
|
177
|
-
- .travis.yml
|
176
|
+
- ".gitignore"
|
177
|
+
- ".travis.yml"
|
178
178
|
- Gemfile
|
179
179
|
- Gemfile.lock
|
180
180
|
- Guardfile
|
@@ -242,17 +242,17 @@ require_paths:
|
|
242
242
|
- lib
|
243
243
|
required_ruby_version: !ruby/object:Gem::Requirement
|
244
244
|
requirements:
|
245
|
-
- -
|
245
|
+
- - ">="
|
246
246
|
- !ruby/object:Gem::Version
|
247
247
|
version: '0'
|
248
248
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
249
249
|
requirements:
|
250
|
-
- -
|
250
|
+
- - ">="
|
251
251
|
- !ruby/object:Gem::Version
|
252
252
|
version: '0'
|
253
253
|
requirements: []
|
254
254
|
rubyforge_project:
|
255
|
-
rubygems_version: 2.
|
255
|
+
rubygems_version: 2.2.2
|
256
256
|
signing_key:
|
257
257
|
specification_version: 4
|
258
258
|
summary: A mashup of async Promises and DCI in Ruby.
|