fibre 0.10.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fibre.gemspec +13 -13
- data/lib/fibre.rb +17 -18
- data/lib/fibre/core_ext/fiber.rb +8 -8
- data/lib/fibre/core_ext/synchrony.rb +14 -14
- data/lib/fibre/fiber_pool.rb +11 -17
- data/lib/fibre/scope.rb +3 -3
- data/lib/fibre/version.rb +1 -1
- data/spec/fiber_pool_spec.rb +59 -0
- data/spec/synchrony_spec.rb +107 -0
- metadata +30 -28
- data/spec/fibre_spec.rb +0 -170
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db1d530ae64a23f807393667c363468029793a08
|
4
|
+
data.tar.gz: 1e3beff3e7217e7d0342ed286a26d8582bd2f83e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9aeeb9131aa92c7e6b9dc635ff9febc58e8aef886efb7f4b193f2fcab9af56307cec183c516d5ebfc26cac33f5a9d39eac3cd029fecc723f85bee22a0230cff
|
7
|
+
data.tar.gz: 900961fecc9cf43a44e09bec69d66d9dc4eae5293765e51bdd314aa4e89ef99a601acc44ab48f5ca923a2ec96431d38c9701da942f51c3a93f9f92b84843343e
|
data/fibre.gemspec
CHANGED
@@ -4,27 +4,27 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'fibre/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'fibre'
|
8
8
|
spec.version = Fibre::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
12
|
-
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
9
|
+
spec.authors = ['inre']
|
10
|
+
spec.email = ['inre.storm@gmail.com']
|
11
|
+
spec.summary = 'Fiber pool for Ruby'
|
12
|
+
spec.description = spec.summary
|
13
|
+
spec.homepage = ''
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.required_ruby_version = '>= 2.1.0'
|
22
22
|
spec.required_rubygems_version = '>= 2.3.0'
|
23
23
|
|
24
|
-
spec.
|
25
|
-
spec.add_development_dependency "bundler", "~> 1.6"
|
26
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
-
spec.add_development_dependency "rspec", "~> 3"
|
24
|
+
spec.add_dependency 'event_object', '~> 1'
|
28
25
|
|
29
|
-
spec.
|
26
|
+
spec.add_development_dependency 'eventmachine', '~> 1.2'
|
27
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
28
|
+
spec.add_development_dependency 'rake', '~> 10'
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3'
|
30
30
|
end
|
data/lib/fibre.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
1
|
+
require 'event_object'
|
2
|
+
require 'fibre/version'
|
3
|
+
require 'fibre/core_ext/fiber'
|
4
|
+
require 'fibre/core_ext/synchrony'
|
5
|
+
require 'fibre/fiber_error'
|
6
|
+
require 'fibre/fiber_pool'
|
7
7
|
|
8
8
|
module Fibre
|
9
|
-
autoload :Mock,
|
10
|
-
autoload :Scope,
|
9
|
+
autoload :Mock, 'fibre/mock'
|
10
|
+
autoload :Scope, 'fibre/scope'
|
11
11
|
|
12
12
|
module Rack
|
13
|
-
autoload :FiberPool,
|
13
|
+
autoload :FiberPool, 'fibre/rack/fiber_pool'
|
14
14
|
end
|
15
15
|
|
16
16
|
extend self
|
@@ -19,22 +19,21 @@ module Fibre
|
|
19
19
|
attr_accessor :root
|
20
20
|
self.root = Fiber.current
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
DEFAULT_POOL_SIZE = 50
|
23
|
+
DEFAULT_POOL_QUEUE_SIZE = 1000
|
24
|
+
FIBER_POOL_THREADED = '__fiber_pool'
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
def make_pool(pool_size: DEFAULT_POOL_SIZE, pool_queue_size: DEFAULT_POOL_QUEUE_SIZE)
|
27
|
+
FiberPool.new(pool_size: pool_size, pool_queue_size: pool_queue_size)
|
28
|
+
end
|
29
29
|
|
30
30
|
# Auto-initialize at first call and each thread has own fiber pool
|
31
|
-
attr_writer :pool
|
32
31
|
def pool
|
33
|
-
Thread.current[
|
32
|
+
Thread.current[FIBER_POOL_THREADED] ||= make_pool
|
34
33
|
end
|
35
34
|
|
36
35
|
def reset
|
37
|
-
Thread.current[
|
36
|
+
Thread.current[FIBER_POOL_THREADED] = nil
|
38
37
|
pool
|
39
38
|
end
|
40
39
|
end
|
data/lib/fibre/core_ext/fiber.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Outline,
|
4
4
|
#
|
5
|
-
# Fiber.
|
5
|
+
# Fiber.await do |fiber|
|
6
6
|
# fiber.resume response
|
7
7
|
# fiber.leave StandardError, "Something"
|
8
8
|
# end
|
@@ -26,14 +26,18 @@ class Fiber
|
|
26
26
|
attributes[key] = value
|
27
27
|
end
|
28
28
|
|
29
|
+
def leave(exception, message=nil)
|
30
|
+
resume exception.is_a?(Class) ? exception.new(message) : exception
|
31
|
+
end
|
32
|
+
|
29
33
|
class <<self
|
30
34
|
|
31
35
|
def scope(*a, &b)
|
32
36
|
Fibre::Scope.scope(*a, &b)
|
33
37
|
end
|
34
38
|
|
35
|
-
def
|
36
|
-
Fibre::Scope.
|
39
|
+
def await(*a, &b)
|
40
|
+
Fibre::Scope.in_scope? ? Fibre::Scope.await(*a, &b) : await_only(*a, &b)
|
37
41
|
end
|
38
42
|
|
39
43
|
# raise exception if we catch exception
|
@@ -43,13 +47,9 @@ class Fiber
|
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
46
|
-
def
|
50
|
+
def await_only
|
47
51
|
yield(Fiber.current) if block_given?
|
48
52
|
Fiber.yield!
|
49
53
|
end
|
50
54
|
end
|
51
|
-
|
52
|
-
def leave(exception, message=nil)
|
53
|
-
resume exception.is_a?(Class) ? exception.new(message) : exception
|
54
|
-
end
|
55
55
|
end
|
@@ -9,14 +9,14 @@
|
|
9
9
|
module Fibre::Synchrony
|
10
10
|
|
11
11
|
refine Array do
|
12
|
-
def
|
13
|
-
res = Fiber.scope { collect(&:
|
12
|
+
def await
|
13
|
+
res = Fiber.scope { collect(&:await) }
|
14
14
|
res.collect(&:result)
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def await!
|
18
18
|
res = Fiber.scope do
|
19
|
-
|
19
|
+
await_deep_scoped
|
20
20
|
end
|
21
21
|
|
22
22
|
res.each do |mock|
|
@@ -30,15 +30,15 @@ module Fibre::Synchrony
|
|
30
30
|
self
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
33
|
+
def await_deep_scoped(path: [])
|
34
34
|
each_with_index do |item, index|
|
35
35
|
# deeeep
|
36
36
|
if item.is_a?(Array) || item.is_a?(Hash) # item.respond_to?(:deep_sync_scoped) not works in ruby 2.1.2
|
37
|
-
item.
|
37
|
+
item.await_deep_scoped(path: path + [index])
|
38
38
|
next
|
39
39
|
end
|
40
40
|
|
41
|
-
item.
|
41
|
+
item.await.tap do |mock|
|
42
42
|
mock.path = path + [index]
|
43
43
|
end
|
44
44
|
end
|
@@ -46,8 +46,8 @@ module Fibre::Synchrony
|
|
46
46
|
end
|
47
47
|
|
48
48
|
refine Hash do
|
49
|
-
def
|
50
|
-
res = Fiber.scope { values.collect(&:
|
49
|
+
def await
|
50
|
+
res = Fiber.scope { values.collect(&:await) }
|
51
51
|
hash = {}
|
52
52
|
res.each_with_index do |mock, index|
|
53
53
|
hash[keys[index]] = mock.result
|
@@ -55,9 +55,9 @@ module Fibre::Synchrony
|
|
55
55
|
hash
|
56
56
|
end
|
57
57
|
|
58
|
-
def
|
58
|
+
def await!
|
59
59
|
res = Fiber.scope do
|
60
|
-
|
60
|
+
await_deep_scoped
|
61
61
|
end
|
62
62
|
|
63
63
|
res.each do |mock|
|
@@ -71,14 +71,14 @@ module Fibre::Synchrony
|
|
71
71
|
self
|
72
72
|
end
|
73
73
|
|
74
|
-
def
|
74
|
+
def await_deep_scoped(path: [])
|
75
75
|
each do |key, item|
|
76
76
|
# deeeep
|
77
77
|
if item.is_a?(Array) || item.is_a?(Hash) # item.respond_to?(:deep_sync_scoped) not works in ruby 2.1.2
|
78
|
-
item.
|
78
|
+
item.await_deep_scoped(path: path + [key])
|
79
79
|
next
|
80
80
|
end
|
81
|
-
item.
|
81
|
+
item.await.tap do |mock|
|
82
82
|
mock.path = path + [key]
|
83
83
|
end
|
84
84
|
end
|
data/lib/fibre/fiber_pool.rb
CHANGED
@@ -13,11 +13,18 @@ module Fibre
|
|
13
13
|
class FiberPool
|
14
14
|
events :error, :before, :after
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
attr_reader :pool_size
|
17
|
+
attr_reader :pool_queue_size
|
18
|
+
attr_reader :reserved
|
19
|
+
attr_reader :queue
|
20
|
+
|
21
|
+
# Initialize fiber's pool
|
22
|
+
def initialize(pool_size: DEFAULT_POOL_SIZE, pool_queue_size: DEFAULT_POOL_QUEUE_SIZE)
|
23
|
+
@pool_size = pool_size
|
24
|
+
@pool_queue_size = pool_queue_size
|
19
25
|
@reserved = {}
|
20
26
|
@queue = []
|
27
|
+
@pool = @pool_size.times.collect { ::Fiber.new(&self.method(:fiber_entry)) }
|
21
28
|
end
|
22
29
|
|
23
30
|
# Borrow fiber from the pool and call the block inside
|
@@ -25,7 +32,7 @@ module Fibre
|
|
25
32
|
spec = { block: b, parent: ::Fiber.current }
|
26
33
|
|
27
34
|
if @pool.empty?
|
28
|
-
raise "The fiber queue has been overflowed" if @queue.size >
|
35
|
+
raise "The fiber queue has been overflowed" if @queue.size > @pool_queue_size
|
29
36
|
@queue.push spec
|
30
37
|
return
|
31
38
|
end
|
@@ -38,19 +45,6 @@ module Fibre
|
|
38
45
|
self
|
39
46
|
end
|
40
47
|
|
41
|
-
# The size of pool
|
42
|
-
def size
|
43
|
-
@pool.size
|
44
|
-
end
|
45
|
-
|
46
|
-
def reserved
|
47
|
-
@reserved
|
48
|
-
end
|
49
|
-
|
50
|
-
def queue
|
51
|
-
@queue
|
52
|
-
end
|
53
|
-
|
54
48
|
private
|
55
49
|
|
56
50
|
# There is entrypoint running fibers
|
data/lib/fibre/scope.rb
CHANGED
@@ -6,7 +6,7 @@ module Fibre
|
|
6
6
|
class <<self
|
7
7
|
|
8
8
|
def scope
|
9
|
-
raise
|
9
|
+
raise 'nested scopes' if Fiber.current[:scope]
|
10
10
|
scope = self.new(Fiber.current)
|
11
11
|
Fiber.current[:scope] = scope
|
12
12
|
yield
|
@@ -15,11 +15,11 @@ module Fibre
|
|
15
15
|
scope.mocks
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def in_scope?
|
19
19
|
!!Fiber.current[:scope]
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def await
|
23
23
|
scope = Fiber.current[:scope]
|
24
24
|
mock = Fibre::Mock.new(scope)
|
25
25
|
scope.mocks << mock
|
data/lib/fibre/version.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Fibre do
|
4
|
+
using EventObject
|
5
|
+
using Fibre::Synchrony
|
6
|
+
|
7
|
+
before { Fibre.reset }
|
8
|
+
let(:probe) { lambda {} }
|
9
|
+
let(:pool) { Fibre.make_pool }
|
10
|
+
|
11
|
+
it "creates fiber's pool" do
|
12
|
+
expect(Fibre.pool.pool_size).to be(50)
|
13
|
+
expect(Fibre.pool.pool_queue_size).to be(1000)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has the root fiber" do
|
17
|
+
expect(Fibre.root).to equal(Fiber.current)
|
18
|
+
expect(Fiber.current.root?).to be true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "checks out the fiber" do
|
22
|
+
expect(probe).to receive(:call)
|
23
|
+
pool.checkout(&probe)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "calls in scope" do
|
27
|
+
expect(probe).to receive(:call)
|
28
|
+
pool.checkout do
|
29
|
+
Fiber.scope do
|
30
|
+
probe.call
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def raise_method
|
36
|
+
raise "test exception"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "raises an exception in the fiber" do
|
40
|
+
expect {
|
41
|
+
pool.checkout do
|
42
|
+
raise_method
|
43
|
+
end
|
44
|
+
}.to raise_error(Fibre::FiberError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "catches up an exception with `error` event" do
|
48
|
+
expect(probe).to receive(:call)
|
49
|
+
pool.on :error do |error|
|
50
|
+
probe.call
|
51
|
+
end
|
52
|
+
|
53
|
+
expect {
|
54
|
+
pool.checkout do
|
55
|
+
raise
|
56
|
+
end
|
57
|
+
}.to_not raise_error
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Fibre do
|
4
|
+
using EventObject
|
5
|
+
using Fibre::Synchrony
|
6
|
+
|
7
|
+
before { Fibre.reset }
|
8
|
+
let(:probe) { lambda {} }
|
9
|
+
let(:pool) { Fibre.make_pool }
|
10
|
+
|
11
|
+
around do |examples|
|
12
|
+
EventMachine.run_block do
|
13
|
+
pool.checkout(&examples)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class FibreTestOperation
|
18
|
+
def initialize(number)
|
19
|
+
@number = number
|
20
|
+
end
|
21
|
+
|
22
|
+
def await
|
23
|
+
Fiber.await do |fiber|
|
24
|
+
EM.next_tick do
|
25
|
+
fiber.resume @number
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class FibreTestOperationWithException
|
32
|
+
def initialize(number)
|
33
|
+
@number = number
|
34
|
+
end
|
35
|
+
|
36
|
+
def await
|
37
|
+
Fiber.await { |f|
|
38
|
+
Fibre.pool.checkout do
|
39
|
+
raise "test"
|
40
|
+
end
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it "waits a successful answer" do
|
46
|
+
result = Fiber.await do |fiber|
|
47
|
+
EM.next_tick do
|
48
|
+
fiber.resume :success
|
49
|
+
end
|
50
|
+
end
|
51
|
+
expect(result).to be :success
|
52
|
+
end
|
53
|
+
|
54
|
+
it "raises an expcetion and catches Fibre error" do
|
55
|
+
expect {
|
56
|
+
pool.checkout do
|
57
|
+
raise "test"
|
58
|
+
end
|
59
|
+
}.to raise_error Fibre::FiberError
|
60
|
+
end
|
61
|
+
|
62
|
+
it "raises an exception during await" do
|
63
|
+
expect {
|
64
|
+
op = FibreTestOperationWithException.new(4)
|
65
|
+
op.await
|
66
|
+
}.to raise_error Fibre::FiberError
|
67
|
+
end
|
68
|
+
|
69
|
+
it "waits couple async requests wrapped up with Array" do
|
70
|
+
op1 = FibreTestOperation.new(4)
|
71
|
+
op2 = FibreTestOperation.new(7)
|
72
|
+
res = [op1, op2].await
|
73
|
+
expect(res[0]).to be(4)
|
74
|
+
expect(res[1]).to be(7)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "waits three async requests wrapped up with Hash" do
|
78
|
+
op1 = FibreTestOperation.new(3)
|
79
|
+
op2 = FibreTestOperation.new(13)
|
80
|
+
op3 = FibreTestOperation.new(5)
|
81
|
+
res = {op1: op1, op2: op2, op3: op3}.await
|
82
|
+
expect(res).to include(op1: 3, op2: 13, op3: 5)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "runs a lot of asynchronous operations" do
|
86
|
+
op1 = FibreTestOperation.new(3)
|
87
|
+
op2 = FibreTestOperation.new(13)
|
88
|
+
op3 = FibreTestOperation.new(5)
|
89
|
+
op4 = FibreTestOperation.new(8)
|
90
|
+
op5 = FibreTestOperation.new(9)
|
91
|
+
res = {
|
92
|
+
ops: [op1, op2],
|
93
|
+
op3: op3,
|
94
|
+
child: {
|
95
|
+
op45: [op4, { op5: op5 }]
|
96
|
+
}
|
97
|
+
}.await!
|
98
|
+
|
99
|
+
expect(res).to include(
|
100
|
+
op3: 5,
|
101
|
+
ops: match_array([3,13]),
|
102
|
+
child: include(
|
103
|
+
op45: match_array([8, include(op5: 9)])
|
104
|
+
)
|
105
|
+
)
|
106
|
+
end
|
107
|
+
end
|
metadata
CHANGED
@@ -1,86 +1,86 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fibre
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- inre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: event_object
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1
|
20
|
-
type: :
|
19
|
+
version: '1'
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1
|
26
|
+
version: '1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: eventmachine
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.2'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '1.12'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '1.12'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '10'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '10'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
76
|
-
type: :
|
75
|
+
version: '3'
|
76
|
+
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
83
|
-
description:
|
82
|
+
version: '3'
|
83
|
+
description: Fiber pool for Ruby
|
84
84
|
email:
|
85
85
|
- inre.storm@gmail.com
|
86
86
|
executables: []
|
@@ -102,8 +102,9 @@ files:
|
|
102
102
|
- lib/fibre/rack/fiber_pool.rb
|
103
103
|
- lib/fibre/scope.rb
|
104
104
|
- lib/fibre/version.rb
|
105
|
-
- spec/
|
105
|
+
- spec/fiber_pool_spec.rb
|
106
106
|
- spec/spec_helper.rb
|
107
|
+
- spec/synchrony_spec.rb
|
107
108
|
homepage: ''
|
108
109
|
licenses:
|
109
110
|
- MIT
|
@@ -124,10 +125,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
125
|
version: 2.3.0
|
125
126
|
requirements: []
|
126
127
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
128
|
+
rubygems_version: 2.6.6
|
128
129
|
signing_key:
|
129
130
|
specification_version: 4
|
130
|
-
summary:
|
131
|
+
summary: Fiber pool for Ruby
|
131
132
|
test_files:
|
132
|
-
- spec/
|
133
|
+
- spec/fiber_pool_spec.rb
|
133
134
|
- spec/spec_helper.rb
|
135
|
+
- spec/synchrony_spec.rb
|
data/spec/fibre_spec.rb
DELETED
@@ -1,170 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Fibre do
|
4
|
-
using EventObject
|
5
|
-
using Fibre::Synchrony
|
6
|
-
|
7
|
-
before { Fibre.reset }
|
8
|
-
let(:probe) { lambda {} }
|
9
|
-
|
10
|
-
it "should create default pool with default size" do
|
11
|
-
expect(Fibre.pool.size).to be(20)
|
12
|
-
expect(Fibre.max_pool_queue_size).to be(1000)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should have right root fiber" do
|
16
|
-
expect(Fibre.root).to equal(Fiber.current)
|
17
|
-
expect(Fiber.current.root?).to be true
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
it "should checkout fiber" do
|
22
|
-
expect(probe).to receive(:call)
|
23
|
-
Fibre.pool.checkout(&probe)
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should rescue error in fiber" do
|
27
|
-
expect(probe).to receive(:call)
|
28
|
-
Fibre.pool.on(:error) do |error|
|
29
|
-
probe.call
|
30
|
-
end
|
31
|
-
|
32
|
-
Fibre.pool.checkout do
|
33
|
-
raise
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
it "should scope" do
|
39
|
-
expect(probe).to receive(:call)
|
40
|
-
Fibre.pool.checkout do
|
41
|
-
Fiber.scope do
|
42
|
-
probe.call
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def raise_method
|
48
|
-
raise "test exception"
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should raise uncatched exceptions" do
|
52
|
-
expect {
|
53
|
-
Fibre.pool.checkout do
|
54
|
-
raise_method
|
55
|
-
end
|
56
|
-
}.to raise_error(Fibre::FiberError)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should catch exception" do
|
60
|
-
Fibre.pool.on :error do |error|
|
61
|
-
# catch exception here
|
62
|
-
end
|
63
|
-
|
64
|
-
expect {
|
65
|
-
Fibre.pool.checkout do
|
66
|
-
raise
|
67
|
-
end
|
68
|
-
}.to_not raise_error
|
69
|
-
end
|
70
|
-
|
71
|
-
describe "in fiber specs" do
|
72
|
-
|
73
|
-
around do |examples|
|
74
|
-
EventMachine.run_block do
|
75
|
-
Fibre.pool.checkout(&examples)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
class FibreTestOperation
|
80
|
-
def initialize(number)
|
81
|
-
@number = number
|
82
|
-
end
|
83
|
-
|
84
|
-
def sync
|
85
|
-
Fiber.sync do |fiber|
|
86
|
-
EM.next_tick do
|
87
|
-
fiber.resume @number
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
class FibreTestOperationWithException
|
94
|
-
def initialize(number)
|
95
|
-
@number = number
|
96
|
-
end
|
97
|
-
|
98
|
-
def sync
|
99
|
-
Fiber.sync do |f|
|
100
|
-
Fibre.pool.checkout do
|
101
|
-
raise "test"
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
it "should Fiber.sync works well" do
|
108
|
-
result = Fiber.sync do |fiber|
|
109
|
-
EM.next_tick do
|
110
|
-
fiber.resume :success
|
111
|
-
end
|
112
|
-
end
|
113
|
-
expect(result).to be :success
|
114
|
-
end
|
115
|
-
|
116
|
-
it "should raise exception in fiber" do
|
117
|
-
expect {
|
118
|
-
Fibre.pool.checkout do
|
119
|
-
raise "test"
|
120
|
-
end
|
121
|
-
}.to raise_error Fibre::FiberError
|
122
|
-
end
|
123
|
-
|
124
|
-
it "should sync with exception" do
|
125
|
-
expect {
|
126
|
-
op = FibreTestOperationWithException.new(4)
|
127
|
-
op.sync
|
128
|
-
}.to raise_error Fibre::FiberError
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should sync array (scoping test)" do
|
132
|
-
op1 = FibreTestOperation.new(4)
|
133
|
-
op2 = FibreTestOperation.new(7)
|
134
|
-
res = [op1, op2].sync
|
135
|
-
expect(res[0]).to be(4)
|
136
|
-
expect(res[1]).to be(7)
|
137
|
-
end
|
138
|
-
|
139
|
-
it "should sync hash" do
|
140
|
-
op1 = FibreTestOperation.new(3)
|
141
|
-
op2 = FibreTestOperation.new(13)
|
142
|
-
op3 = FibreTestOperation.new(5)
|
143
|
-
res = {op1: op1, op2: op2, op3: op3}.sync
|
144
|
-
expect(res).to include(op1: 3, op2: 13, op3: 5)
|
145
|
-
end
|
146
|
-
|
147
|
-
it "should deep sync and sync! method (two in one)" do
|
148
|
-
op1 = FibreTestOperation.new(3)
|
149
|
-
op2 = FibreTestOperation.new(13)
|
150
|
-
op3 = FibreTestOperation.new(5)
|
151
|
-
op4 = FibreTestOperation.new(8)
|
152
|
-
op5 = FibreTestOperation.new(9)
|
153
|
-
res = {
|
154
|
-
ops: [op1, op2],
|
155
|
-
op3: op3,
|
156
|
-
child: {
|
157
|
-
op45: [op4, { op5: op5 }]
|
158
|
-
}
|
159
|
-
}.sync!
|
160
|
-
|
161
|
-
expect(res).to include(
|
162
|
-
op3: 5,
|
163
|
-
ops: match_array([3,13]),
|
164
|
-
child: include(
|
165
|
-
op45: match_array([8, include(op5: 9)])
|
166
|
-
)
|
167
|
-
)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|