quack_pool 0.0.0 → 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 +4 -4
- data/lib/quack_pool.rb +31 -12
- data/lib/quack_pool/error.rb +4 -0
- data/spec/quack_pool_spec.rb +60 -2
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6251b9300303dfa23b3d17b3ae8a692f1b3726f8
|
4
|
+
data.tar.gz: f50cc41da67d8ca9dc5b210589d1b99c8dfdbb62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cf28ec57b7f24a43d23ea9549d905291f326dfa178f64499c355eb340df32848646f8ebbd1d334d082e89841ad3c1b24aa7069da3fa171029c485d08e9dc2df
|
7
|
+
data.tar.gz: 26e735a2154ec0dee52fa476174f9e9a068c576414449fc2550e205f2abdd0f7edac9b82a09c715ed4480711251687de445474c0f4a7c922e188edf65ce75155
|
data/lib/quack_pool.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'reentrant_mutex'
|
2
|
+
|
3
|
+
require 'quack_pool/error'
|
4
|
+
|
5
|
+
|
1
6
|
class QuackPool
|
2
7
|
|
3
8
|
def initialize(resource_class: , size: Float::INFINITY)
|
@@ -7,10 +12,27 @@ class QuackPool
|
|
7
12
|
@max_size = size
|
8
13
|
@resources = []
|
9
14
|
@available_resources = []
|
10
|
-
@mutex =
|
15
|
+
@mutex = ReentrantMutex.new
|
11
16
|
@condition_variable = ConditionVariable.new
|
12
17
|
end
|
13
18
|
|
19
|
+
def absorb_resource(resource)
|
20
|
+
@mutex.synchronize do
|
21
|
+
raise Error, "resource does not belong to this pool" unless has_resource?(resource)
|
22
|
+
raise Error, "resource already in pool" if resource_available?(resource)
|
23
|
+
@available_resources.push(resource)
|
24
|
+
@condition_variable.signal
|
25
|
+
end
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def has_resource?(resource)
|
30
|
+
@mutex.synchronize do
|
31
|
+
raise Error, "resource is not an instance of 'resource_class'" unless resource.is_a?(@resource_class)
|
32
|
+
@resources.include?(resource)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
14
36
|
def release_resource
|
15
37
|
@mutex.synchronize do
|
16
38
|
if @available_resources.any?
|
@@ -23,29 +45,26 @@ class QuackPool
|
|
23
45
|
end
|
24
46
|
end
|
25
47
|
|
26
|
-
def
|
48
|
+
def resource_available?(resource)
|
27
49
|
@mutex.synchronize do
|
28
|
-
raise
|
29
|
-
|
30
|
-
@available_resources.push(resource)
|
31
|
-
@condition_variable.signal
|
50
|
+
raise Error, "resource does not belong to this pool" unless has_resource?(resource)
|
51
|
+
@available_resources.include?(resource)
|
32
52
|
end
|
33
|
-
nil
|
34
53
|
end
|
35
54
|
|
36
55
|
private
|
37
56
|
|
38
|
-
def release_available_resource
|
39
|
-
@available_resources.pop
|
40
|
-
end
|
41
|
-
|
42
57
|
def build_new_resource
|
43
58
|
new_resource = @resource_class.new
|
44
|
-
raise "'new_resource' must be unique" if
|
59
|
+
raise Error, "'new_resource' must be unique" if has_resource?(new_resource)
|
45
60
|
@resources << new_resource
|
46
61
|
new_resource
|
47
62
|
end
|
48
63
|
|
64
|
+
def release_available_resource
|
65
|
+
@available_resources.pop
|
66
|
+
end
|
67
|
+
|
49
68
|
def release_next_available_resource
|
50
69
|
@condition_variable.wait(@mutex)
|
51
70
|
release_available_resource
|
data/spec/quack_pool_spec.rb
CHANGED
@@ -47,7 +47,7 @@ RSpec.describe QuackPool do
|
|
47
47
|
it "should raise error" do
|
48
48
|
resource = pool.release_resource
|
49
49
|
pool.absorb_resource(resource)
|
50
|
-
expect { pool.absorb_resource(resource) }.to raise_error
|
50
|
+
expect { pool.absorb_resource(resource) }.to raise_error QuackPool::Error
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -55,12 +55,70 @@ RSpec.describe QuackPool do
|
|
55
55
|
it "should raise error" do
|
56
56
|
resource = pool.release_resource
|
57
57
|
pool2 = QuackPool.new(resource_class: resource_class)
|
58
|
-
expect { pool2.absorb_resource(resource) }.to raise_error
|
58
|
+
expect { pool2.absorb_resource(resource) }.to raise_error QuackPool::Error
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
63
63
|
|
64
|
+
describe "#has_resource?" do
|
65
|
+
|
66
|
+
context "after releasing a new resource" do
|
67
|
+
it "should reutrn true" do
|
68
|
+
resource = pool.release_resource
|
69
|
+
expect(pool.has_resource?(resource)).to eql true
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "after absorbing a resource" do
|
74
|
+
it "should reutrn true" do
|
75
|
+
resource = pool.release_resource
|
76
|
+
pool.absorb_resource(resource)
|
77
|
+
expect(pool.has_resource?(resource)).to eql true
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when passed a non resource object" do
|
82
|
+
it "should raise error" do
|
83
|
+
expect { pool.has_resource?(1) }.to raise_error QuackPool::Error
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "#resource_available?" do
|
90
|
+
|
91
|
+
context "after releasing a new resource" do
|
92
|
+
it "should reutrn false" do
|
93
|
+
resource = pool.release_resource
|
94
|
+
expect(pool.resource_available?(resource)).to eql false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "after absorbing the resource" do
|
99
|
+
it "should reutrn true" do
|
100
|
+
resource = pool.release_resource
|
101
|
+
pool.absorb_resource(resource)
|
102
|
+
expect(pool.resource_available?(resource)).to eql true
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "when passed a non resource object" do
|
107
|
+
it "should raise error" do
|
108
|
+
expect { pool.resource_available?(1) }.to raise_error QuackPool::Error
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when resource is from other pool" do
|
113
|
+
it "should raise error" do
|
114
|
+
pool2 = QuackPool.new(resource_class: resource_class)
|
115
|
+
resource = pool2.release_resource
|
116
|
+
expect { pool.resource_available?(resource) }.to raise_error QuackPool::Error
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
64
122
|
end
|
65
123
|
|
66
124
|
context "when size is specified" do
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quack_pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Fors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
12
|
-
dependencies:
|
11
|
+
date: 2018-04-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: reentrant_mutex
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1'
|
13
27
|
description: A simple resource pool that accepts a resource class to build the pool's
|
14
28
|
resources from.
|
15
29
|
email: mail@robfors.com
|
@@ -21,6 +35,7 @@ files:
|
|
21
35
|
- README.md
|
22
36
|
- Rakefile
|
23
37
|
- lib/quack_pool.rb
|
38
|
+
- lib/quack_pool/error.rb
|
24
39
|
- spec/quack_pool_spec.rb
|
25
40
|
- spec/spec_helper.rb
|
26
41
|
homepage: https://github.com/robfors/quack_pool
|