mr_darcy 0.4.1 → 0.4.2
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 +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.
|