eventkit-promise 0.1.0 → 1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -2,4 +2,3 @@ require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
  RSpec::Core::RakeTask.new(:spec)
4
4
  task :default => :spec
5
-
@@ -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
@@ -1,15 +1,16 @@
1
1
  module Eventkit
2
2
  class Promise
3
- VERSION = "0.1.0"
4
- attr_reader :value
5
- alias_method :reason, :value
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(self) if block_given?
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.call(value)
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.call(value)
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 { |handler| handler.call(value) }
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 { |handler| handler.call(value) }
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
-
@@ -0,0 +1,10 @@
1
+ module Eventkit
2
+ class TaskScheduler
3
+ def schedule_execution(&handler)
4
+ fail NotImplementedError, <<-DOC
5
+ Implement #schedule_execution in your class to schedule
6
+ the execution of on_fullfiled and on_rejected handlers
7
+ DOC
8
+ end
9
+ end
10
+ end
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: 0.1.0
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-16 00:00:00.000000000 Z
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
- description: Ruby implementation of https://promisesaplus.com/
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: 1.8.23.2
93
+ rubygems_version: 2.4.5
85
94
  signing_key:
86
- specification_version: 3
95
+ specification_version: 4
87
96
  summary: Promises/A+ for Ruby
88
97
  test_files: []