connection_pool 1.2.0 → 2.0.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: eead858733d8dbd69d9ce236f18977ea847b3a83
4
- data.tar.gz: a686e2981051d33b6b170d2f7aac5709a78bb0cc
3
+ metadata.gz: b24f806aed835d638868cfeee4d30cd53b32c561
4
+ data.tar.gz: eeb809403e4ae18c350800712b97d9b65cff0194
5
5
  SHA512:
6
- metadata.gz: 268fe355fb087c14e1820ae8e3f5d903ddf6d2bc9b762091df9e14daa4a20ebf162766f54185c03857ca752f6f15e31a60b4e18c434798950c563a9b17865a73
7
- data.tar.gz: 9cc05e0c0b554dd131add7a31b328a85d768141be6e250d34472dc8db7bdd1a46f7fca30cf71fc5edb4b33d1d24403a98bc71a3696dec896918f8af05d8e0653
6
+ metadata.gz: f815103822aaced056e316cf955a3d6a35fbb07b9e87d6f646e83a324e8c28aba570c55f0561ef94bcd76134670320f441c1141bcc2103f82843aa17d0ab42a2
7
+ data.tar.gz: d5883346fa243b8d0de199288722d4ec84092dbe4a8c984c33c4c48c3deb4f4ce0d11187be0a83941bac1231341b4a98f7f2d5968c6d4f5c159df6a15eddc365
@@ -0,0 +1,10 @@
1
+ ---
2
+ language: ruby
3
+ notifications:
4
+ email:
5
+ - drbrain@segment7.net
6
+ rvm:
7
+ - 1.9.3
8
+ - 2.0.0
9
+ - 2.1.0
10
+ script: rake test
data/Changes.md CHANGED
@@ -1,3 +1,9 @@
1
+ 2.0.0
2
+ -----
3
+
4
+ - The connection pool is now lazy. Connections are created as needed
5
+ and retained until the pool is shut down. [drbrain, #52]
6
+
1
7
  1.2.0
2
8
  -----
3
9
 
@@ -16,7 +22,7 @@ end
16
22
  This method accepts a block and calls the block for each
17
23
  connection in the pool. After calling this method, trying to get a
18
24
  connection from the pool raises `PoolShuttingDownError`.
19
-
25
+
20
26
  1.0.0
21
27
  -----
22
28
 
data/README.md CHANGED
@@ -1,40 +1,28 @@
1
- connection_pool
2
- ======================
1
+ connection\_pool
2
+ =================
3
3
 
4
4
  Generic connection pooling for Ruby.
5
5
 
6
- MongoDB has its own connection pool. ActiveRecord has its own connection pool. This is a generic connection pool that can be used with anything, e.g. Redis, Dalli and other Ruby network clients.
7
-
8
-
9
- Install
10
- ------------
11
-
12
- gem install connection_pool
13
-
14
-
15
- Notes
16
- ------------
17
-
18
- - Connections are eager created when the pool is created.
19
- - There is no provision for repairing or checking the health of a
20
- connection; connections should be self-repairing. This is
21
- true of the dalli and redis clients.
6
+ MongoDB has its own connection pool. ActiveRecord has its own connection pool.
7
+ This is a generic connection pool that can be used with anything, e.g. Redis,
8
+ Dalli and other Ruby network clients.
22
9
 
23
10
 
24
11
  Usage
25
- ------------
12
+ -----
26
13
 
27
- Create a pool of objects to share amongst the fibers or threads in your Ruby application:
14
+ Create a pool of objects to share amongst the fibers or threads in your Ruby
15
+ application:
28
16
 
29
17
  ``` ruby
30
- @memcached = ConnectionPool.new(:size => 5, :timeout => 5) { Dalli::Client.new }
18
+ $memcached = ConnectionPool.new(size: 5, timeout: 5) { Dalli::Client.new }
31
19
  ```
32
20
 
33
21
  Then use the pool in your application:
34
22
 
35
23
  ``` ruby
36
- @memcached.with do |dalli|
37
- dalli.get('some-count')
24
+ $memcached.with do |conn|
25
+ conn.get('some-count')
38
26
  end
39
27
  ```
40
28
 
@@ -45,29 +33,30 @@ until one becomes available. If no object is available within `:timeout` second
45
33
  Optionally, you can specify a timeout override using the with-block semantics:
46
34
 
47
35
  ``` ruby
48
- @memcached.with(:timeout => 2.0) do |dalli|
49
- dalli.get('some-count')
36
+ $memcached.with(timeout: 2.0) do |conn|
37
+ conn.get('some-count')
50
38
  end
51
39
  ```
52
40
 
53
- This will only modify the resource-get timeout for this particular invocation. This
54
- is useful if you want to fail-fast on certain non critical sections when a resource
55
- is not available, or conversely if you are comfortable blocking longer on a particular
56
- resource. This is not implemented in the below `ConnectionPool::Wrapper` class.
41
+ This will only modify the resource-get timeout for this particular
42
+ invocation. This is useful if you want to fail-fast on certain non critical
43
+ sections when a resource is not available, or conversely if you are comfortable
44
+ blocking longer on a particular resource. This is not implemented in the below
45
+ `ConnectionPool::Wrapper` class.
57
46
 
58
- You can use `ConnectionPool::Wrapper` to wrap a single global connection, making
59
- it easier to port your connection code over time:
47
+ You can use `ConnectionPool::Wrapper` to wrap a single global connection,
48
+ making it easier to port your connection code over time:
60
49
 
61
50
  ``` ruby
62
- $redis = ConnectionPool::Wrapper.new(:size => 5, :timeout => 3) { Redis.connect }
51
+ $redis = ConnectionPool::Wrapper.new(size: 5, timeout: 3) { Redis.connect }
63
52
  $redis.sadd('foo', 1)
64
53
  $redis.smembers('foo')
65
54
  ```
66
55
 
67
- The Wrapper uses `method_missing` to checkout a connection, run the
68
- requested method and then immediately check the connection back into the
69
- pool. It's **not** high-performance so you'll want to port your
70
- performance sensitive code to use `with` as soon as possible.
56
+ The wrapper uses `method_missing` to checkout a connection, run the requested
57
+ method and then immediately check the connection back into the pool. It's
58
+ **not** high-performance so you'll want to port your performance sensitive code
59
+ to use `with` as soon as possible.
71
60
 
72
61
  ``` ruby
73
62
  $redis.with do |conn|
@@ -76,10 +65,28 @@ $redis.with do |conn|
76
65
  end
77
66
  ```
78
67
 
79
- Once you've ported your entire system to use `with`, you can simply
80
- remove ::Wrapper and use a simple, fast ConnectionPool.
68
+ Once you've ported your entire system to use `with`, you can simply remove
69
+ `Wrapper` and use the simpler and faster `ConnectionPool`.
70
+
71
+
72
+ Notes
73
+ -----
74
+
75
+ - Connections are lazily created as needed.
76
+ - There is no provision for repairing or checking the health of a connection;
77
+ connections should be self-repairing. This is true of the Dalli and Redis
78
+ clients.
79
+
80
+
81
+ Install
82
+ -------
83
+
84
+ ```
85
+ $ gem install connection_pool
86
+ ```
87
+
81
88
 
82
89
  Author
83
- --------------
90
+ ------
84
91
 
85
92
  Mike Perham, [@mperham](https://twitter.com/mperham), <http://mikeperham.com>
@@ -1,5 +1,5 @@
1
- require 'connection_pool/version'
2
- require 'connection_pool/timed_stack'
1
+ require_relative 'connection_pool/version'
2
+ require_relative 'connection_pool/timed_stack'
3
3
 
4
4
  # Generic connection pool class for e.g. sharing a limited number of network connections
5
5
  # among many threads. Note: Connections are eager created.
@@ -33,6 +33,9 @@ require 'connection_pool/timed_stack'
33
33
  class ConnectionPool
34
34
  DEFAULTS = {size: 5, timeout: 5}
35
35
 
36
+ class Error < RuntimeError
37
+ end
38
+
36
39
  def self.wrap(options, &block)
37
40
  Wrapper.new(options, &block)
38
41
  end
@@ -74,6 +77,9 @@ class ConnectionPool
74
77
 
75
78
  def checkin
76
79
  stack = ::Thread.current[@key]
80
+ raise ConnectionPool::Error, 'no connections are checked out' if
81
+ !stack || stack.empty?
82
+
77
83
  conn = stack.pop
78
84
  if stack.empty?
79
85
  @available << conn
@@ -93,9 +99,12 @@ class ConnectionPool
93
99
  end
94
100
 
95
101
  def with
96
- yield @pool.checkout
97
- ensure
98
- @pool.checkin
102
+ conn = @pool.checkout
103
+ begin
104
+ yield conn
105
+ ensure
106
+ @pool.checkin
107
+ end
99
108
  end
100
109
 
101
110
  def pool_shutdown(&block)
@@ -5,8 +5,11 @@ class ConnectionPool::PoolShuttingDownError < RuntimeError; end
5
5
 
6
6
  class ConnectionPool::TimedStack
7
7
 
8
- def initialize(size = 0)
9
- @que = Array.new(size) { yield }
8
+ def initialize(size = 0, &block)
9
+ @create_block = block
10
+ @created = 0
11
+ @que = []
12
+ @max = size
10
13
  @mutex = Mutex.new
11
14
  @resource = ConditionVariable.new
12
15
  @shutdown_block = nil
@@ -31,6 +34,10 @@ class ConnectionPool::TimedStack
31
34
  loop do
32
35
  raise ConnectionPool::PoolShuttingDownError if @shutdown_block
33
36
  return @que.pop unless @que.empty?
37
+ unless @created == @max
38
+ @created += 1
39
+ return @create_block.call
40
+ end
34
41
  to_wait = deadline - Time.now
35
42
  raise Timeout::Error, "Waited #{timeout} sec" if to_wait <= 0
36
43
  @resource.wait(@mutex, to_wait)
@@ -53,10 +60,10 @@ class ConnectionPool::TimedStack
53
60
  end
54
61
 
55
62
  def empty?
56
- @que.empty?
63
+ (@created - @que.length) >= @max
57
64
  end
58
65
 
59
66
  def length
60
- @que.length
67
+ @max - @created + @que.length
61
68
  end
62
69
  end
@@ -1,3 +1,3 @@
1
1
  class ConnectionPool
2
- VERSION = "1.2.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -1,6 +1,10 @@
1
+ gem 'minitest'
2
+
1
3
  require 'minitest/pride'
2
4
  require 'minitest/autorun'
3
5
 
6
+ Thread.abort_on_exception = true
7
+
4
8
  $VERBOSE = 1
5
9
 
6
10
  require_relative '../lib/connection_pool'
@@ -1,5 +1,4 @@
1
- Thread.abort_on_exception = true
2
- require 'helper'
1
+ require_relative 'helper'
3
2
 
4
3
  class TestConnectionPool < Minitest::Test
5
4
 
@@ -41,11 +40,24 @@ class TestConnectionPool < Minitest::Test
41
40
  end
42
41
  end
43
42
 
43
+ def use_pool(pool, size)
44
+ Array.new(size) do
45
+ Thread.new do
46
+ pool.with do sleep end
47
+ end
48
+ end.each do |thread|
49
+ Thread.pass until thread.status == 'sleep'
50
+ end.map do |thread|
51
+ thread.kill
52
+ Thread.pass while thread.alive?
53
+ end
54
+ end
55
+
44
56
  def test_basic_multithreaded_usage
45
57
  pool = ConnectionPool.new(:size => 5) { NetworkConnection.new }
46
- threads = []
47
- 15.times do
48
- threads << Thread.new do
58
+
59
+ threads = Array.new(15) do
60
+ Thread.new do
49
61
  pool.with do |net|
50
62
  net.do_something
51
63
  end
@@ -60,56 +72,169 @@ class TestConnectionPool < Minitest::Test
60
72
  end
61
73
 
62
74
  def test_timeout
63
- pool = ConnectionPool.new(:timeout => 0.05, :size => 1) { NetworkConnection.new }
64
- Thread.new do
75
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { NetworkConnection.new }
76
+ thread = Thread.new do
65
77
  pool.with do |net|
66
78
  net.do_something
67
- sleep 0.1
79
+ sleep 0.01
68
80
  end
69
81
  end
70
- sleep 0.05
82
+
83
+ Thread.pass while thread.status == 'run'
84
+
71
85
  assert_raises Timeout::Error do
72
86
  pool.with { |net| net.do_something }
73
87
  end
74
88
 
75
- sleep 0.05
89
+ thread.join
90
+
76
91
  pool.with do |conn|
77
92
  refute_nil conn
78
93
  end
79
94
  end
80
-
81
- def test_with_timeout_override
82
- pool = ConnectionPool.new(:timeout => 0.05, :size => 1) { NetworkConnection.new }
83
- Thread.new do
95
+
96
+ def test_with
97
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { Object.new }
98
+
99
+ pool.with do
100
+ assert_raises Timeout::Error do
101
+ Thread.new { pool.checkout }.join
102
+ end
103
+ end
104
+
105
+ assert Thread.new { pool.checkout }.join
106
+ end
107
+
108
+ def test_with_timeout_override
109
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { NetworkConnection.new }
110
+
111
+ t = Thread.new do
84
112
  pool.with do |net|
85
113
  net.do_something
86
- sleep 0.3
114
+ sleep 0.01
87
115
  end
88
116
  end
89
- sleep 0.05
117
+
118
+ Thread.pass while t.status == 'run'
119
+
90
120
  assert_raises Timeout::Error do
91
121
  pool.with { |net| net.do_something }
92
- end
93
- pool.with(:timeout => 0.4) do |conn|
122
+ end
123
+
124
+ pool.with(:timeout => 0.1) do |conn|
94
125
  refute_nil conn
95
- end
126
+ end
127
+ end
128
+
129
+ def test_checkin
130
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { NetworkConnection.new }
131
+ conn = pool.checkout
132
+
133
+ t1 = Thread.new do
134
+ pool.checkout
135
+ end
136
+
137
+ assert_raises Timeout::Error do
138
+ t1.join
139
+ end
140
+
141
+ pool.checkin
142
+
143
+ t2 = Thread.new do
144
+ pool.checkout
145
+ end
146
+
147
+ assert_same conn, t2.value
148
+ end
149
+
150
+ def test_checkin_never_checkout
151
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { Object.new }
152
+
153
+ e = assert_raises ConnectionPool::Error do
154
+ pool.checkin
155
+ end
156
+
157
+ assert_equal 'no connections are checked out', e.message
158
+ end
159
+
160
+ def test_checkin_no_current_checkout
161
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { Object.new }
162
+
163
+ pool.checkout
164
+ pool.checkin
165
+
166
+ assert_raises ConnectionPool::Error do
167
+ pool.checkin
168
+ end
169
+ end
170
+
171
+ def test_checkin_twice
172
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { Object.new }
173
+
174
+ pool.checkout
175
+ pool.checkout
176
+
177
+ pool.checkin
178
+
179
+ assert_raises Timeout::Error do
180
+ Thread.new do
181
+ pool.checkout
182
+ end.join
183
+ end
184
+
185
+ pool.checkin
186
+
187
+ assert Thread.new { pool.checkout }.join
188
+ end
189
+
190
+ def test_checkout
191
+ pool = ConnectionPool.new(:size => 1) { NetworkConnection.new }
192
+
193
+ conn = pool.checkout
194
+
195
+ assert_kind_of NetworkConnection, conn
196
+
197
+ assert_same conn, pool.checkout
198
+ end
199
+
200
+ def test_checkout_multithread
201
+ pool = ConnectionPool.new(:size => 2) { NetworkConnection.new }
202
+ conn = pool.checkout
203
+
204
+ t = Thread.new do
205
+ pool.checkout
206
+ end
207
+
208
+ refute_same conn, t.value
209
+ end
210
+
211
+ def test_checkout_timeout
212
+ pool = ConnectionPool.new(:timeout => 0, :size => 0) { Object.new }
213
+
214
+ assert_raises Timeout::Error do
215
+ pool.checkout
216
+ end
96
217
  end
97
218
 
98
219
  def test_checkout_timeout_override
99
- pool = ConnectionPool.new(:timeout => 0.05, :size => 1) { NetworkConnection.new }
100
- Thread.new do
220
+ pool = ConnectionPool.new(:timeout => 0, :size => 1) { NetworkConnection.new }
221
+
222
+ thread = Thread.new do
101
223
  pool.with do |net|
102
224
  net.do_something
103
- sleep 0.2
225
+ sleep 0.01
104
226
  end
105
- end
106
- sleep 0.05
227
+ end
228
+
229
+ Thread.pass while thread.status == 'run'
230
+
107
231
  assert_raises Timeout::Error do
108
- pool.checkout
232
+ pool.checkout
109
233
  end
110
- assert pool.checkout :timeout => 0.3
234
+
235
+ assert pool.checkout :timeout => 0.1
111
236
  end
112
-
237
+
113
238
  def test_passthru
114
239
  pool = ConnectionPool.wrap(:timeout => 0.1, :size => 1) { NetworkConnection.new }
115
240
  assert_equal 1, pool.do_something
@@ -136,14 +261,16 @@ class TestConnectionPool < Minitest::Test
136
261
 
137
262
  def test_heavy_threading
138
263
  pool = ConnectionPool.new(:timeout => 0.5, :size => 3) { NetworkConnection.new }
139
- 20.times do
264
+
265
+ threads = Array.new(20) do
140
266
  Thread.new do
141
267
  pool.with do |net|
142
- sleep 0.05
268
+ sleep 0.01
143
269
  end
144
270
  end
145
271
  end
146
- sleep 0.5
272
+
273
+ threads.map { |thread| thread.join }
147
274
  end
148
275
 
149
276
  def test_reuses_objects_when_pool_not_saturated
@@ -170,7 +297,7 @@ class TestConnectionPool < Minitest::Test
170
297
  r_inner.do_work('inner')
171
298
  end
172
299
 
173
- sleep 0.1
300
+ Thread.pass
174
301
 
175
302
  r_outer.do_work('outer')
176
303
  end
@@ -187,6 +314,8 @@ class TestConnectionPool < Minitest::Test
187
314
  Recorder.new.tap { |r| recorders << r }
188
315
  end
189
316
 
317
+ use_pool pool, 3
318
+
190
319
  pool.shutdown do |recorder|
191
320
  recorder.do_work("shutdown")
192
321
  end
@@ -211,13 +340,15 @@ class TestConnectionPool < Minitest::Test
211
340
  Recorder.new.tap { |r| recorders << r }
212
341
  end
213
342
 
343
+ use_pool pool, 3
344
+
214
345
  pool.checkout
215
346
 
216
347
  pool.shutdown do |recorder|
217
348
  recorder.do_work("shutdown")
218
349
  end
219
350
 
220
- assert_equal [["shutdown"], ["shutdown"], []], recorders.map { |r| r.calls }
351
+ assert_equal [[], ["shutdown"], ["shutdown"]], recorders.map { |r| r.calls }.sort
221
352
 
222
353
  pool.checkin
223
354
 
@@ -239,10 +370,54 @@ class TestConnectionPool < Minitest::Test
239
370
  Recorder.new.tap { |r| recorders << r }
240
371
  end
241
372
 
373
+ use_pool wrapper, 3
374
+
242
375
  wrapper.pool_shutdown do |recorder|
243
376
  recorder.do_work("shutdown")
244
377
  end
245
378
 
246
379
  assert_equal [["shutdown"]] * 3, recorders.map { |r| r.calls }
247
380
  end
381
+
382
+ def test_wrapper_method_missing
383
+ wrapper = ConnectionPool::Wrapper.new { NetworkConnection.new }
384
+
385
+ assert_equal 1, wrapper.fast
386
+ end
387
+
388
+ def test_wrapper_respond_to_eh
389
+ wrapper = ConnectionPool::Wrapper.new { NetworkConnection.new }
390
+
391
+ assert_respond_to wrapper, :with
392
+
393
+ assert_respond_to wrapper, :fast
394
+ refute_respond_to wrapper, :"nonexistent method"
395
+ end
396
+
397
+ def test_wrapper_with
398
+ wrapper = ConnectionPool::Wrapper.new(:timeout => 0, :size => 1) { Object.new }
399
+
400
+ wrapper.with do
401
+ assert_raises Timeout::Error do
402
+ Thread.new do
403
+ wrapper.with { flunk 'connection checked out :(' }
404
+ end.join
405
+ end
406
+ end
407
+
408
+ assert Thread.new { wrapper.with { } }.join
409
+ end
410
+
411
+ class ConnWithEval
412
+ def eval(arg)
413
+ "eval'ed #{arg}"
414
+ end
415
+ end
416
+
417
+ def test_wrapper_kernel_methods
418
+ wrapper = ConnectionPool::Wrapper.new(timeout: 0, size: 1) { ConnWithEval.new }
419
+
420
+ assert_equal "eval'ed 1", wrapper.eval(1)
421
+ end
422
+
248
423
  end
@@ -0,0 +1,122 @@
1
+ require_relative 'helper'
2
+
3
+ class TestConnectionPoolTimedStack < Minitest::Test
4
+
5
+ def setup
6
+ @stack = ConnectionPool::TimedStack.new { Object.new }
7
+ end
8
+
9
+ def test_empty_eh
10
+ stack = ConnectionPool::TimedStack.new(1) { Object.new }
11
+
12
+ refute_empty stack
13
+
14
+ popped = stack.pop
15
+
16
+ assert_empty stack
17
+
18
+ stack.push popped
19
+
20
+ refute_empty stack
21
+ end
22
+
23
+ def test_length
24
+ stack = ConnectionPool::TimedStack.new(1) { Object.new }
25
+
26
+ assert_equal 1, stack.length
27
+
28
+ popped = stack.pop
29
+
30
+ assert_equal 0, stack.length
31
+
32
+ stack.push popped
33
+
34
+ assert_equal 1, stack.length
35
+ end
36
+
37
+ def test_pop
38
+ object = Object.new
39
+ @stack.push object
40
+
41
+ popped = @stack.pop
42
+
43
+ assert_same object, popped
44
+ end
45
+
46
+ def test_pop_empty
47
+ e = assert_raises Timeout::Error do
48
+ @stack.pop 0
49
+ end
50
+
51
+ assert_equal 'Waited 0 sec', e.message
52
+ end
53
+
54
+ def test_pop_full
55
+ stack = ConnectionPool::TimedStack.new(1) { Object.new }
56
+
57
+ popped = stack.pop
58
+
59
+ refute_nil popped
60
+ assert_empty stack
61
+ end
62
+
63
+ def test_pop_wait
64
+ thread = Thread.start do
65
+ @stack.pop
66
+ end
67
+
68
+ Thread.pass while thread.status == 'run'
69
+
70
+ object = Object.new
71
+
72
+ @stack.push object
73
+
74
+ assert_same object, thread.value
75
+ end
76
+
77
+ def test_pop_shutdown
78
+ @stack.shutdown { }
79
+
80
+ assert_raises ConnectionPool::PoolShuttingDownError do
81
+ @stack.pop
82
+ end
83
+ end
84
+
85
+ def test_push
86
+ stack = ConnectionPool::TimedStack.new(1) { Object.new }
87
+
88
+ conn = stack.pop
89
+
90
+ stack.push conn
91
+
92
+ refute_empty stack
93
+ end
94
+
95
+ def test_push_shutdown
96
+ called = []
97
+
98
+ @stack.shutdown do |object|
99
+ called << object
100
+ end
101
+
102
+ @stack.push Object.new
103
+
104
+ refute_empty called
105
+ assert_empty @stack
106
+ end
107
+
108
+ def test_shutdown
109
+ @stack.push Object.new
110
+
111
+ called = []
112
+
113
+ @stack.shutdown do |object|
114
+ called << object
115
+ end
116
+
117
+ refute_empty called
118
+ assert_empty @stack
119
+ end
120
+
121
+ end
122
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: connection_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-26 00:00:00.000000000 Z
12
+ date: 2014-03-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -48,6 +48,7 @@ extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
50
  - .gitignore
51
+ - .travis.yml
51
52
  - Changes.md
52
53
  - Gemfile
53
54
  - LICENSE
@@ -59,6 +60,7 @@ files:
59
60
  - lib/connection_pool/version.rb
60
61
  - test/helper.rb
61
62
  - test/test_connection_pool.rb
63
+ - test/test_connection_pool_timed_stack.rb
62
64
  homepage: https://github.com/mperham/connection_pool
63
65
  licenses:
64
66
  - MIT
@@ -79,10 +81,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
81
  version: '0'
80
82
  requirements: []
81
83
  rubyforge_project:
82
- rubygems_version: 2.1.9
84
+ rubygems_version: 2.0.14
83
85
  signing_key:
84
86
  specification_version: 4
85
87
  summary: Generic connection pool for Ruby
86
88
  test_files:
87
89
  - test/helper.rb
88
90
  - test/test_connection_pool.rb
91
+ - test/test_connection_pool_timed_stack.rb