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 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