rpromise 0.0.1

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: 0a8a350d39dec81fe3fd41c33e4beaea1ed4dac7
4
+ data.tar.gz: 55ace20e012ffe601841896039efe17571fbd6e2
5
+ SHA512:
6
+ metadata.gz: 0a0a673a3b8d03fd33f168d05f65ebb28907b798836bc859341fbbe78c1342d6df370f5e2d375b136f59f87f3b58ac1869817b94f6926f54a8ea288405f3b51f
7
+ data.tar.gz: 84ef8570bc2d710e1ea2bae5b99e6560168f68b5614dff3f0386f3d3530c9c8cfb7cb90ea2ed6044b348053a6791f3d469f3cf833fd3f925fb2cae5ba64dbaae
data/.README.md.swp ADDED
Binary file
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ *.swp
4
+ *.swo
5
+ *~
6
+ .bundle
7
+ .config
8
+ .yardoc
9
+ Gemfile.lock
10
+ InstalledFiles
11
+ _yardoc
12
+ coverage
13
+ doc/
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.5
8
+
9
+ script: 'bundle exec rake'
10
+
11
+ notifications:
12
+ email:
13
+ recipients:
14
+ - samuel@molinari.me
15
+ on_failure: change
16
+ on_success: never
data/.travis.yml.swp ADDED
Binary file
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rpromise.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard :rspec, cmd: 'bundle exec rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Samuel Molinari
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # Rpromise
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ gem 'rpromise'
8
+
9
+ And then execute:
10
+
11
+ $ bundle
12
+
13
+ Or install it yourself as:
14
+
15
+ $ gem install rpromise
16
+
17
+ ## Usage
18
+
19
+ ```ruby
20
+
21
+ class Task
22
+
23
+ def async
24
+ return ::Rpromise::Promise.new do |resolve, reject|
25
+ sleep(1)
26
+ value = Random.rand * 10
27
+
28
+ if value > 5
29
+ resolve.call(value)
30
+ else
31
+ reject.call('Oh boy, what have you done')
32
+ end
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ on_resolve = lambda do |value|
39
+ puts value
40
+ return ::Rpromise::Promise.new do |resolve, reject|
41
+ sleep(1)
42
+ # Do an async task
43
+ resolve.call(value + 10)
44
+ end
45
+ end
46
+
47
+ on_reject = lambda do |error|
48
+ puts error
49
+ end
50
+
51
+ Task.new.async
52
+ .then(on_resolve, on_reject)
53
+ .then(Proc.new do |value_plus_10|
54
+ puts value_plus_10 # Returned value from the previous ``then`` promise resolved value
55
+ end)
56
+
57
+ ```
58
+
59
+ ## Contributing
60
+
61
+ 1. Fork it
62
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
63
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
64
+ 4. Push to the branch (`git push origin my-new-feature`)
65
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
Binary file
@@ -0,0 +1,7 @@
1
+ require 'rpromise'
2
+
3
+ class ::Rpromise::Future
4
+
5
+
6
+ end
7
+
@@ -0,0 +1,101 @@
1
+ require 'rpromise'
2
+ require 'pry'
3
+
4
+ class ::Rpromise::Promise
5
+
6
+ module State
7
+ PENDING = :pending
8
+ RESOLVED = :resolved
9
+ REJECTED = :rejected
10
+ end
11
+
12
+ Handler = Struct.new(:on_resolved, :on_rejected, :resolve, :reject)
13
+
14
+ attr_reader :state
15
+
16
+ def initialize()
17
+ @state = State::PENDING
18
+ @defered = nil
19
+ yield(method(:resolve!), method(:reject!),self)
20
+ rescue Exception => e
21
+ reject!(e)
22
+ end
23
+
24
+ def then(on_resolved = nil, on_rejected = nil)
25
+ raise ArgumentError unless is_valid_block?(on_resolved)
26
+ raise ArgumentError unless is_valid_block?(on_rejected)
27
+ return self if on_resolved.nil? && on_rejected.nil?
28
+ return ::Rpromise::Promise.new do |resolve, reject, promise|
29
+ handler = Handler.new(on_resolved, on_rejected, resolve, reject)
30
+ self.handle(handler)
31
+ end
32
+ end
33
+
34
+ def pending?
35
+ return @state == State::PENDING
36
+ end
37
+
38
+ def resolved?
39
+ return @state == State::RESOLVED
40
+ end
41
+
42
+ def rejected?
43
+ return @state == State::REJECTED
44
+ end
45
+
46
+ def resolve!(value = nil)
47
+ if value.is_a?(::Rpromise::Promise)
48
+ value.then(method(:resolve!), method(:reject!))
49
+ return
50
+ end
51
+
52
+ @state = State::RESOLVED
53
+ @value = value
54
+
55
+ unless @defered.nil?
56
+ handle(@defered)
57
+ end
58
+
59
+ rescue
60
+ reject!(nil)
61
+ end
62
+
63
+ def reject!(value = nil)
64
+ @state = State::REJECTED
65
+ @value = value
66
+
67
+ unless @defered.nil?
68
+ handle(@defered)
69
+ end
70
+ end
71
+
72
+ protected
73
+
74
+ def is_valid_block?(arg)
75
+ return arg.nil? || arg.is_a?(Proc) || arg.is_a?(Method)
76
+ end
77
+
78
+ def handle(handler)
79
+ if pending?
80
+ @defered = handler
81
+ return nil
82
+ end
83
+
84
+ callback = nil
85
+
86
+ if resolved?
87
+ callback = handler.on_resolved
88
+ else
89
+ callback = handler.on_rejected
90
+ end
91
+
92
+ unless callback.nil?
93
+ output = nil
94
+ output = callback.call(@value)
95
+ handler.resolve.call(output) unless handler.resolve.nil?
96
+ end
97
+ rescue
98
+ handler.reject.call(nil) unless handler.reject.nil?
99
+ end
100
+
101
+ end
@@ -0,0 +1,3 @@
1
+ module Rpromise
2
+ VERSION = "0.0.1"
3
+ end
data/lib/rpromise.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "rpromise/version"
2
+ require "rpromise/promise"
3
+ require "rpromise/future"
4
+
5
+ module Rpromise
6
+ end
data/rpromise.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rpromise/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rpromise"
8
+ spec.version = Rpromise::VERSION
9
+ spec.authors = ["Samuel Molinari"]
10
+ spec.email = ["samuel@molinari.me"]
11
+ spec.description = %q{Handle async method easily}
12
+ spec.summary = %q{Handle async method easily}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "guard"
25
+ spec.add_development_dependency "guard-rspec"
26
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Rpromise::Future do
4
+
5
+ end
@@ -0,0 +1,271 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Rpromise::Promise do
4
+
5
+ let(:n) { 0 }
6
+ subject(:promise) do
7
+ described_class.new do |resolve, reject|
8
+ end
9
+ end
10
+
11
+ it { is_expected.to have_attributes( :state => described_class::State::PENDING ) }
12
+
13
+ describe '#initialize' do
14
+ it 'uses the resolve! method as callback' do
15
+ t = nil
16
+ p = ::Rpromise::Promise.new do |resolve, reject|
17
+ t = Thread.new do
18
+ resolve.call('hi')
19
+ end
20
+ end
21
+ t.join
22
+ expect(p).to be_resolved
23
+ end
24
+
25
+ it 'uses the reject! method as callback' do
26
+ t = nil
27
+ p = ::Rpromise::Promise.new do |resolve, reject|
28
+ t = Thread.new do
29
+ reject.call('hi')
30
+ end
31
+ end
32
+ t.join
33
+ expect(p).to be_rejected
34
+ end
35
+ end
36
+
37
+ describe '#then' do
38
+
39
+ it 'returns a new promise' do
40
+ expect(promise.then).to be_kind_of ::Rpromise::Promise
41
+ end
42
+
43
+ it 'takes an optional block as first argument' do
44
+ expect { promise.then(nil,lambda {}) }.not_to raise_error
45
+ expect { promise.then(nil, promise.method(:reject!)) }.not_to raise_error
46
+ expect { promise.then(nil, "test") }.to raise_error ArgumentError
47
+ end
48
+
49
+ it 'takes an optional block as second argument' do
50
+ expect { promise.then(lambda {}, nil) }.not_to raise_error
51
+ expect { promise.then(promise.method(:resolve!), nil) }.not_to raise_error
52
+ expect { promise.then("test", nil) }.to raise_error ArgumentError
53
+ end
54
+
55
+ context 'when promise is resolved' do
56
+
57
+ let(:value) { Random.rand }
58
+ let(:value2) { Random.rand + value }
59
+ let(:value3) { Random.rand + value + value2 }
60
+
61
+ context 'with async task' do
62
+ before(:each) do
63
+ @thread = nil
64
+ @promise = ::Rpromise::Promise.new do |resolve, reject|
65
+ @thread = Thread.new do
66
+ sleep(0.5)
67
+ resolve.call(value)
68
+ end
69
+ end
70
+ end
71
+
72
+ it 'returns the resolved value' do
73
+ lambda_value = nil
74
+ @promise.then(lambda do |v|
75
+ lambda_value = v
76
+ end)
77
+ expect(lambda_value).to be_nil
78
+ expect(@promise).to be_pending
79
+ @thread.join
80
+ expect(@promise).to be_resolved
81
+ expect(lambda_value).to eq value
82
+ end
83
+ context 'when multiple then are chained together' do
84
+ it 'passes its returned value to the next then' do
85
+ lambda_value_1 = nil
86
+ lambda_value_2 = nil
87
+ lambda_value_3 = nil
88
+ @promise.then(lambda do |v1|
89
+ lambda_value_1 = v1
90
+ return value2
91
+ end).then(lambda do |v2|
92
+ lambda_value_2 = v2
93
+ return value3
94
+ end).then(lambda do |v3|
95
+ lambda_value_3 = v3
96
+ end)
97
+ @thread.join
98
+ expect(lambda_value_1).to eq value
99
+ expect(lambda_value_2).to eq value2
100
+ expect(lambda_value_3).to eq value3
101
+ end
102
+ end
103
+ context 'when then resolve callback returns a promise' do
104
+ it 'uses the next then as handler' do
105
+ thread2 = nil
106
+ lambda_value = nil
107
+ lock = true
108
+ @promise.then(lambda do |v|
109
+ return ::Rpromise::Promise.new do |resolve, reject|
110
+ thread2 = Thread.new do
111
+ sleep(0)
112
+ resolve.call('Hello world!')
113
+ end
114
+ end
115
+ end).then(lambda do |hello_world|
116
+ lambda_value = hello_world
117
+ lock = false
118
+ end)
119
+ loop { break unless lock }
120
+ expect(lambda_value).to eq 'Hello world!'
121
+ end
122
+ end
123
+ context 'when no callback is passed' do
124
+ it 'passes original returned value to the next then' do
125
+ lambda_value = nil
126
+ @promise.then.then(lambda do |v|
127
+ lambda_value = v
128
+ end)
129
+ @thread.join
130
+ expect(lambda_value).to eq value
131
+ end
132
+ end
133
+ end
134
+
135
+ context 'with non-async task' do
136
+ let(:promise) do
137
+ ::Rpromise::Promise.new do |resolve, reject|
138
+ resolve.call(value)
139
+ end
140
+ end
141
+
142
+ it 'returns the resolved value' do
143
+ lambda_value = nil
144
+ promise.then(lambda do |v|
145
+ lambda_value = v
146
+ end)
147
+ expect(lambda_value).to be value
148
+ end
149
+
150
+ context 'when multiple then are chained together' do
151
+ it 'passes its returned value to the next then' do
152
+ lambda_value_1 = nil
153
+ lambda_value_2 = nil
154
+ lambda_value_3 = nil
155
+ promise.then(lambda do |v1|
156
+ lambda_value_1 = v1
157
+ return value2
158
+ end).then(lambda do |v2|
159
+ lambda_value_2 = v2
160
+ return value3
161
+ end).then(lambda do |v3|
162
+ lambda_value_3 = v3
163
+ end)
164
+ expect(lambda_value_1).to eq value
165
+ expect(lambda_value_2).to eq value2
166
+ expect(lambda_value_3).to eq value3
167
+ end
168
+ end
169
+
170
+ context 'when no callback is passed' do
171
+ it 'does not raise any error' do
172
+ expect { promise.then }.not_to raise_error
173
+ end
174
+
175
+ it 'passes original returned value to the next then' do
176
+ lambda_value = nil
177
+ promise.then.then(lambda do |v|
178
+ lambda_value = v
179
+ end)
180
+ expect(lambda_value).to eq value
181
+ end
182
+ end
183
+ end
184
+ end
185
+
186
+ context 'when promise is rejected' do
187
+ context 'with non-async task' do
188
+ let(:error) { Random.rand }
189
+ let(:promise) do
190
+ ::Rpromise::Promise.new do |resolve, reject|
191
+ reject.call(error)
192
+ end
193
+ end
194
+ it 'returns exception' do
195
+ lambda_error = nil
196
+ promise.then(nil, lambda do |e|
197
+ lambda_error = e
198
+ end)
199
+ expect(lambda_error).to eq error
200
+ end
201
+ it 'handles raised exceptions within the promise' do
202
+ lambda_error = nil
203
+ promise = ::Rpromise::Promise.new do |resolve, reject|
204
+ raise 'Oops'
205
+ end
206
+ promise.then(nil, lambda do |e|
207
+ lambda_error = e
208
+ end)
209
+ expect(lambda_error).to be_kind_of RuntimeError
210
+ expect(lambda_error.message).to eq 'Oops'
211
+ end
212
+ end
213
+ end
214
+ end
215
+
216
+ context 'when it is pending' do
217
+ before(:each) { promise.instance_variable_set(:@state, described_class::State::PENDING) }
218
+ describe '#pending?' do
219
+ it 'returns true' do
220
+ expect(promise).to be_pending
221
+ end
222
+ end
223
+ describe '#rejected?' do
224
+ it 'returns false' do
225
+ expect(promise).not_to be_rejected
226
+ end
227
+ end
228
+ describe '#resolved?' do
229
+ it 'returns false' do
230
+ expect(promise).not_to be_resolved
231
+ end
232
+ end
233
+ end
234
+ context 'when it is rejected' do
235
+ before(:each) { promise.instance_variable_set(:@state, described_class::State::REJECTED) }
236
+ describe '#pending?' do
237
+ it 'returns false' do
238
+ expect(promise).not_to be_pending
239
+ end
240
+ end
241
+ describe '#rejected?' do
242
+ it 'returns true' do
243
+ expect(promise).to be_rejected
244
+ end
245
+ end
246
+ describe '#resolved?' do
247
+ it 'returns false' do
248
+ expect(promise).not_to be_resolved
249
+ end
250
+ end
251
+ end
252
+ context 'when it is resolved' do
253
+ before(:each) { promise.instance_variable_set(:@state, described_class::State::RESOLVED) }
254
+ describe '#pending?' do
255
+ it 'returns false' do
256
+ expect(promise).not_to be_pending
257
+ end
258
+ end
259
+ describe '#rejected?' do
260
+ it 'returns false' do
261
+ expect(promise).not_to be_rejected
262
+ end
263
+ end
264
+ describe '#resolved?' do
265
+ it 'returns true' do
266
+ expect(promise).to be_resolved
267
+ end
268
+ end
269
+ end
270
+
271
+ end
@@ -0,0 +1,7 @@
1
+ require 'rpromise'
2
+
3
+ RSpec.configure do |config|
4
+ config.mock_with :rspec do |mocks|
5
+ mocks.syntax = :should
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rpromise
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Samuel Molinari
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Handle async method easily
84
+ email:
85
+ - samuel@molinari.me
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .README.md.swp
91
+ - .gitignore
92
+ - .rspec
93
+ - .travis.yml
94
+ - .travis.yml.swp
95
+ - Gemfile
96
+ - Guardfile
97
+ - LICENSE.txt
98
+ - README.md
99
+ - Rakefile
100
+ - lib/rpromise.rb
101
+ - lib/rpromise/.promise.rb.swp
102
+ - lib/rpromise/future.rb
103
+ - lib/rpromise/promise.rb
104
+ - lib/rpromise/version.rb
105
+ - rpromise.gemspec
106
+ - spec/lib/rpromise/.promise_spec.rb.swp
107
+ - spec/lib/rpromise/future_spec.rb
108
+ - spec/lib/rpromise/promise_spec.rb
109
+ - spec/spec_helper.rb
110
+ homepage: ''
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.0.6
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: Handle async method easily
134
+ test_files:
135
+ - spec/lib/rpromise/.promise_spec.rb.swp
136
+ - spec/lib/rpromise/future_spec.rb
137
+ - spec/lib/rpromise/promise_spec.rb
138
+ - spec/spec_helper.rb