quack_pool 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e99542e0d54f7d86d03719c0cdd3caed78da2dc5
4
- data.tar.gz: 696ec9dedffd4e8d5a4bad879efc5b1a60db6c0a
3
+ metadata.gz: 6251b9300303dfa23b3d17b3ae8a692f1b3726f8
4
+ data.tar.gz: f50cc41da67d8ca9dc5b210589d1b99c8dfdbb62
5
5
  SHA512:
6
- metadata.gz: 7ee146d9ed9182397ba63a8a2c9b8e5868486ea21a4581ab47369ca1abf02af809f0d45b69410c2d4fe0db529624270d9fe0728dcb5b74cb321e59c3140dcbc7
7
- data.tar.gz: 54c20fa04f7dff1f3bf759289bf3166d231a35735aca1e5fdf31323a6df9be1396936d314f4d3c9421a9ec76836cbb558b0991d7282e0b45b3ba532f802bbbc4
6
+ metadata.gz: 3cf28ec57b7f24a43d23ea9549d905291f326dfa178f64499c355eb340df32848646f8ebbd1d334d082e89841ad3c1b24aa7069da3fa171029c485d08e9dc2df
7
+ data.tar.gz: 26e735a2154ec0dee52fa476174f9e9a068c576414449fc2550e205f2abdd0f7edac9b82a09c715ed4480711251687de445474c0f4a7c922e188edf65ce75155
@@ -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 = Mutex.new
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 absorb_resource(resource)
48
+ def resource_available?(resource)
27
49
  @mutex.synchronize do
28
- raise ArgumentError, "'resource' does not belong to this pool" unless @resources.include?(resource)
29
- raise ArgumentError, "'resource' already in pool" if @available_resources.include?(resource)
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 @resources.include?(new_resource)
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
@@ -0,0 +1,4 @@
1
+ class QuackPool
2
+ class Error < StandardError
3
+ end
4
+ end
@@ -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 ArgumentError
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 ArgumentError
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.0.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-03 00:00:00.000000000 Z
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