eventkit-promise 0.1.0 → 1.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 +7 -0
- data/README.md +57 -27
- data/Rakefile +0 -1
- data/eventkit-promise.gemspec +2 -1
- data/lib/eventkit/promise.rb +15 -11
- data/lib/eventkit/task_scheduler.rb +10 -0
- metadata +30 -21
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 659dd4ed9bf579230b17ccab2f135bfcb4c4b33e
|
4
|
+
data.tar.gz: 8b936ff5b6a06c0f4617282b56ae47ab1794ff2a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9e87f5e6c01f52b7713c52f632587c8410639c1b9a92f375046c9c357c185f687b72f32ab7d091af1bf6d6f924ee38852039f060832cd82eae8f21261eebbd86
|
7
|
+
data.tar.gz: 10dac44cfb149504499de52d0e6e8d95a50a1b1fbd038f2662b624bec5c03359e873ec59340904c2cb8ecd79b166c5069850eb8173377fe9591216c1f85f9a2c
|
data/README.md
CHANGED
@@ -14,6 +14,55 @@ Add this line to your application's Gemfile:
|
|
14
14
|
gem 'eventkit-promise'
|
15
15
|
```
|
16
16
|
|
17
|
+
## Configuration
|
18
|
+
|
19
|
+
On fullfiled and on rejected handlers should execute asynchronously
|
20
|
+
according to the [Promises\A+ spec]
|
21
|
+
(https://promisesaplus.com/#point-67). So, the main dependency
|
22
|
+
for an `Eventkit::Promise` is the object that provides the execution
|
23
|
+
context for handlers, which we will be calling the `TaskScheduler`.
|
24
|
+
|
25
|
+
In your project, you will need to define an implementation for a
|
26
|
+
`TaskScheduler`, which sould have a `#schedule_execution` method that
|
27
|
+
takes a block.
|
28
|
+
|
29
|
+
If you're using something like Event Machine, then you could do
|
30
|
+
something like this:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
require 'eventkit/task_scheduler'
|
34
|
+
|
35
|
+
class EMTaskScheduler < EventKit::TaskScheduler
|
36
|
+
def schedule_execution(&block)
|
37
|
+
EM::next_tick(&block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task_scheduler = EMTaskScheduler.new
|
42
|
+
|
43
|
+
Eventkit::Promise.new(task_scheduler)
|
44
|
+
```
|
45
|
+
|
46
|
+
If you're using `Eventkit::Eventloop`, then you could do:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
require 'eventkit/task_scheduler'
|
50
|
+
|
51
|
+
class NextTickScheduler < Eventkit::TaskScheduler
|
52
|
+
def initialize(event_loop)
|
53
|
+
@event_loop = event_loop
|
54
|
+
end
|
55
|
+
|
56
|
+
def schedule_execution(&block)
|
57
|
+
@event_loop.on_next_tick(&block)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
task_scheduler = NextTickScheduler.new
|
62
|
+
|
63
|
+
Eventkit::Promise.new(task_scheduler)
|
64
|
+
```
|
65
|
+
|
17
66
|
## Usage
|
18
67
|
|
19
68
|
```ruby
|
@@ -21,17 +70,15 @@ require 'eventkit/promise'
|
|
21
70
|
|
22
71
|
# Resolving a promise
|
23
72
|
|
24
|
-
promise = Eventkit::Promise.new
|
73
|
+
promise = Eventkit::Promise.new(task_scheduler)
|
25
74
|
|
26
75
|
promise.then(->(value) { value + 1 })
|
27
76
|
|
28
77
|
promise.resolve(1)
|
29
78
|
|
30
|
-
promise.value # => 1
|
31
|
-
|
32
79
|
# Rejecting a promise
|
33
80
|
|
34
|
-
promise = Eventkit::Promise.new
|
81
|
+
promise = Eventkit::Promise.new(task_scheduler)
|
35
82
|
|
36
83
|
promise.then(
|
37
84
|
->(value) {
|
@@ -44,11 +91,9 @@ promise.then(
|
|
44
91
|
|
45
92
|
promise.reject(NoMethodError.new('Undefined method #call'))
|
46
93
|
|
47
|
-
promise.reason # => <NoMethodError: undefined method #call>
|
48
|
-
|
49
94
|
# Chaining promises
|
50
95
|
|
51
|
-
promise_a = Eventkit::Promise.new
|
96
|
+
promise_a = Eventkit::Promise.new(task_scheduler)
|
52
97
|
|
53
98
|
promise_b = promise_a
|
54
99
|
.then(->(v) { v + 1 })
|
@@ -61,47 +106,32 @@ promise_b.catch { |error|
|
|
61
106
|
|
62
107
|
promise_a.resolve(1)
|
63
108
|
|
64
|
-
promise_a.value # => 1
|
65
|
-
promise_b.value # => 4
|
66
|
-
|
67
109
|
# Resolving and fullfiling with another promise
|
68
110
|
|
69
|
-
promise_a = Eventkit::Promise.new
|
70
|
-
promise_b = Eventkit::Promise.new
|
111
|
+
promise_a = Eventkit::Promise.new(task_scheduler)
|
112
|
+
promise_b = Eventkit::Promise.new(task_scheduler)
|
71
113
|
|
72
114
|
promise_a.resolve(promise_b)
|
73
115
|
|
74
116
|
promise_b.resolve('foobar')
|
75
117
|
|
76
|
-
promise_a.value # => foobar
|
77
|
-
|
78
118
|
# Resolving and rejecting with another promise
|
79
119
|
|
80
|
-
promise_a = Eventkit::Promise.new
|
81
|
-
promise_b = Eventkit::Promise.new
|
120
|
+
promise_a = Eventkit::Promise.new(task_scheduler)
|
121
|
+
promise_b = Eventkit::Promise.new(task_scheduler)
|
82
122
|
|
83
123
|
promise_a.resolve(promise_b)
|
84
124
|
|
85
125
|
promise_b.reject('Ooops can not continue')
|
86
126
|
|
87
|
-
promise_a.reason # => 'Ooops can not continue'
|
88
|
-
|
89
127
|
# Initializing with a block
|
90
128
|
|
91
|
-
promise = Promise.new do |p|
|
129
|
+
promise = Promise.new(task_scheduler) do |p|
|
92
130
|
p.resolve('foobar')
|
93
131
|
end
|
94
132
|
|
95
|
-
promise.value # => 'foobar'
|
96
|
-
|
97
133
|
```
|
98
134
|
|
99
|
-
## Development
|
100
|
-
|
101
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
102
|
-
|
103
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
104
|
-
|
105
135
|
## Contributing
|
106
136
|
|
107
137
|
1. Fork it ( https://github.com/[my-github-username]/eventkit-promise/fork )
|
data/Rakefile
CHANGED
data/eventkit-promise.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["oliver.martell@gmail.com"]
|
11
11
|
|
12
12
|
spec.summary = "Promises/A+ for Ruby"
|
13
|
-
spec.description = "Ruby implementation of https://promisesaplus.com/"
|
13
|
+
spec.description = "Ruby implementation of Promises/A+ https://promisesaplus.com/"
|
14
14
|
spec.homepage = "http://github.com/omartell/eventkit-promise"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -20,4 +20,5 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "rake", "~> 10.0"
|
22
22
|
spec.add_development_dependency "rspec", "~> 3.2.0"
|
23
|
+
spec.add_development_dependency "eventkit-eventloop", "~> 0.1.0"
|
23
24
|
end
|
data/lib/eventkit/promise.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
module Eventkit
|
2
2
|
class Promise
|
3
|
-
VERSION =
|
4
|
-
attr_reader :value
|
5
|
-
|
3
|
+
VERSION = '1.0'
|
4
|
+
attr_reader :value, :task_scheduler
|
5
|
+
private :value
|
6
6
|
|
7
|
-
def initialize
|
7
|
+
def initialize(task_scheduler)
|
8
8
|
@on_fullfiled = []
|
9
9
|
@on_rejected = []
|
10
10
|
@state = :pending
|
11
|
+
@task_scheduler = task_scheduler
|
11
12
|
@resolved_with_promise = false
|
12
|
-
yield
|
13
|
+
yield self if block_given?
|
13
14
|
end
|
14
15
|
|
15
16
|
def pending?
|
@@ -25,7 +26,7 @@ module Eventkit
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def then(on_fullfiled_handler = nil, on_rejected_handler = nil)
|
28
|
-
promise = Promise.new
|
29
|
+
promise = Promise.new(task_scheduler)
|
29
30
|
|
30
31
|
add_on_fullfiled { |value|
|
31
32
|
begin
|
@@ -86,7 +87,7 @@ module Eventkit
|
|
86
87
|
|
87
88
|
def add_on_fullfiled(&handler)
|
88
89
|
if resolved?
|
89
|
-
handler
|
90
|
+
schedule_execution(handler)
|
90
91
|
else
|
91
92
|
@on_fullfiled << handler
|
92
93
|
end
|
@@ -94,7 +95,7 @@ module Eventkit
|
|
94
95
|
|
95
96
|
def add_on_rejected(&handler)
|
96
97
|
if rejected?
|
97
|
-
handler
|
98
|
+
schedule_execution(handler)
|
98
99
|
else
|
99
100
|
@on_rejected << handler
|
100
101
|
end
|
@@ -112,15 +113,18 @@ module Eventkit
|
|
112
113
|
else
|
113
114
|
@state = :resolved
|
114
115
|
@value = value
|
115
|
-
@on_fullfiled.each
|
116
|
+
@on_fullfiled.each(&method(:schedule_execution))
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
119
120
|
def run_rejection(value)
|
120
121
|
@value = value
|
121
|
-
@on_rejected.each
|
122
|
+
@on_rejected.each(&method(:schedule_execution))
|
122
123
|
@state = :rejected
|
123
124
|
end
|
125
|
+
|
126
|
+
def schedule_execution(handler)
|
127
|
+
task_scheduler.schedule_execution { handler.call(value) }
|
128
|
+
end
|
124
129
|
end
|
125
130
|
end
|
126
|
-
|
metadata
CHANGED
@@ -1,58 +1,67 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventkit-promise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: '1.0'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Oliver Martell
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '10.0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '10.0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 3.2.0
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 3.2.0
|
46
|
-
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: eventkit-eventloop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.1.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.0
|
55
|
+
description: Ruby implementation of Promises/A+ https://promisesaplus.com/
|
47
56
|
email:
|
48
57
|
- oliver.martell@gmail.com
|
49
58
|
executables: []
|
50
59
|
extensions: []
|
51
60
|
extra_rdoc_files: []
|
52
61
|
files:
|
53
|
-
- .gitignore
|
54
|
-
- .rspec
|
55
|
-
- .travis.yml
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
56
65
|
- CODE_OF_CONDUCT.md
|
57
66
|
- Gemfile
|
58
67
|
- LICENSE.txt
|
@@ -60,29 +69,29 @@ files:
|
|
60
69
|
- Rakefile
|
61
70
|
- eventkit-promise.gemspec
|
62
71
|
- lib/eventkit/promise.rb
|
72
|
+
- lib/eventkit/task_scheduler.rb
|
63
73
|
homepage: http://github.com/omartell/eventkit-promise
|
64
74
|
licenses:
|
65
75
|
- MIT
|
76
|
+
metadata: {}
|
66
77
|
post_install_message:
|
67
78
|
rdoc_options: []
|
68
79
|
require_paths:
|
69
80
|
- lib
|
70
81
|
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
82
|
requirements:
|
73
|
-
- -
|
83
|
+
- - ">="
|
74
84
|
- !ruby/object:Gem::Version
|
75
85
|
version: '0'
|
76
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
-
none: false
|
78
87
|
requirements:
|
79
|
-
- -
|
88
|
+
- - ">="
|
80
89
|
- !ruby/object:Gem::Version
|
81
90
|
version: '0'
|
82
91
|
requirements: []
|
83
92
|
rubyforge_project:
|
84
|
-
rubygems_version:
|
93
|
+
rubygems_version: 2.4.5
|
85
94
|
signing_key:
|
86
|
-
specification_version:
|
95
|
+
specification_version: 4
|
87
96
|
summary: Promises/A+ for Ruby
|
88
97
|
test_files: []
|