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 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: []