abstractivator 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/abstractivator/fiber_defer.rb +37 -0
- data/lib/abstractivator/version.rb +1 -1
- data/spec/lib/abstractivator/fiber_defer_spec.rb +74 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6544ed986ae721bbafe6a7ca12bd302808b64497
|
4
|
+
data.tar.gz: 826dbb6f5c26ef72f77c9117d6bc26c10492ad31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69486ac9eb226283b82b1bbdfcd1dc296a73d50079a3da84fc7a601220dc688eabe12b23980ef702aa644da18bc3b8ebb3cd9feae8c8263decdc557514641271
|
7
|
+
data.tar.gz: 7e921ab9be7d6cc07effa8e5b9311494f4d266ee10f8d02f658026a66762b80caec81db52256b8ce496bcdc0e019941aeaa52821080c5da6b452321d6731c3d5
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'fiber'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'eventmachine'
|
5
|
+
rescue => e
|
6
|
+
raise 'Abstractivator::FiberDefer requires eventmachine but it is unavailable.'
|
7
|
+
end
|
8
|
+
|
9
|
+
module Abstractivator
|
10
|
+
module FiberDefer
|
11
|
+
ROOT_FIBER = Fiber.current
|
12
|
+
|
13
|
+
def with_fiber_defer(&block)
|
14
|
+
raise 'this method requires an eventmachine reactor to be running' unless EM.reactor_running?
|
15
|
+
Fiber.new{block.call}.resume if block
|
16
|
+
end
|
17
|
+
|
18
|
+
def fiber_defer(&action)
|
19
|
+
f = Fiber.current
|
20
|
+
raise 'fiber_defer must be passed an action to defer (the block)' unless action
|
21
|
+
raise 'fiber_defer must be called within a with_fiber_defer block' if f == ROOT_FIBER
|
22
|
+
|
23
|
+
safe_action = proc do
|
24
|
+
begin
|
25
|
+
[action.call, nil]
|
26
|
+
rescue Exception => e
|
27
|
+
[nil, e]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
EM.defer(safe_action, proc { |result, error| f.resume([result, error]) })
|
32
|
+
result, error = Fiber.yield
|
33
|
+
raise error if error
|
34
|
+
result
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'abstractivator/fiber_defer'
|
3
|
+
require 'eventmachine'
|
4
|
+
|
5
|
+
describe Abstractivator::FiberDefer do
|
6
|
+
include Abstractivator::FiberDefer
|
7
|
+
|
8
|
+
describe '#with_fiber_defer' do
|
9
|
+
context 'when an eventmachine reactor is not running' do
|
10
|
+
it 'raises an error' do
|
11
|
+
expect{with_fiber_defer}.to raise_error /reactor/
|
12
|
+
end
|
13
|
+
end
|
14
|
+
context 'when an eventmachine reactor is running' do
|
15
|
+
it 'calls the block' do
|
16
|
+
EM.run do
|
17
|
+
expect{|b| with_fiber_defer(&b)}.to yield_control
|
18
|
+
EM.stop
|
19
|
+
end
|
20
|
+
end
|
21
|
+
context 'when no block is provided' do
|
22
|
+
it 'does nothing' do
|
23
|
+
EM.run do
|
24
|
+
with_fiber_defer
|
25
|
+
EM.stop
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#fiber_defer' do
|
33
|
+
context 'when it is called outside a with_fiber_defer block' do
|
34
|
+
it 'raises an error' do
|
35
|
+
expect{fiber_defer{}}.to raise_error /with_fiber_defer/
|
36
|
+
end
|
37
|
+
end
|
38
|
+
context 'when it is not passed a block' do
|
39
|
+
it 'raises an error' do
|
40
|
+
expect{fiber_defer}.to raise_error /must be passed an action/
|
41
|
+
end
|
42
|
+
end
|
43
|
+
it 'executes the block on a background thread' do
|
44
|
+
EM.run do
|
45
|
+
with_fiber_defer do
|
46
|
+
main_thread = Thread.current
|
47
|
+
executed = false
|
48
|
+
fiber_defer do
|
49
|
+
expect(Thread.current).to_not eql main_thread
|
50
|
+
executed = true
|
51
|
+
end
|
52
|
+
expect(executed).to be true
|
53
|
+
EM.stop
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
it 'returns the value of its block' do
|
58
|
+
EM.run do
|
59
|
+
with_fiber_defer do
|
60
|
+
expect(fiber_defer{42}).to eql 42
|
61
|
+
EM.stop
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
it 'raises an error raised by its block' do
|
66
|
+
EM.run do
|
67
|
+
with_fiber_defer do
|
68
|
+
expect{fiber_defer{raise 'oops'}}.to raise_error 'oops'
|
69
|
+
EM.stop
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abstractivator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Winton
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- lib/abstractivator/enum.rb
|
102
102
|
- lib/abstractivator/enumerable_ext.rb
|
103
103
|
- lib/abstractivator/event.rb
|
104
|
+
- lib/abstractivator/fiber_defer.rb
|
104
105
|
- lib/abstractivator/proc_ext.rb
|
105
106
|
- lib/abstractivator/schedule.rb
|
106
107
|
- lib/abstractivator/schedule/schedule.rb
|
@@ -118,6 +119,7 @@ files:
|
|
118
119
|
- spec/lib/abstractivator/enum_spec.rb
|
119
120
|
- spec/lib/abstractivator/enumerable_ext_spec.rb
|
120
121
|
- spec/lib/abstractivator/event_spec.rb
|
122
|
+
- spec/lib/abstractivator/fiber_defer_spec.rb
|
121
123
|
- spec/lib/abstractivator/proc_ext_spec.rb
|
122
124
|
- spec/lib/abstractivator/schedule/em_util.rb
|
123
125
|
- spec/lib/abstractivator/schedule/schedule_runner_spec.rb
|
@@ -157,6 +159,7 @@ test_files:
|
|
157
159
|
- spec/lib/abstractivator/enum_spec.rb
|
158
160
|
- spec/lib/abstractivator/enumerable_ext_spec.rb
|
159
161
|
- spec/lib/abstractivator/event_spec.rb
|
162
|
+
- spec/lib/abstractivator/fiber_defer_spec.rb
|
160
163
|
- spec/lib/abstractivator/proc_ext_spec.rb
|
161
164
|
- spec/lib/abstractivator/schedule/em_util.rb
|
162
165
|
- spec/lib/abstractivator/schedule/schedule_runner_spec.rb
|