noids_client 0.0.1 → 0.0.2

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
- SHA1:
3
- metadata.gz: f84c41e5fda4436621de5c0dadb9939753f4a804
4
- data.tar.gz: e43be3ae32af0efebd19f9086717ae313d95067c
2
+ SHA256:
3
+ metadata.gz: d4e277f7ca5cb6bb3a0eba3670ee692b602b81e4bcdda3d3af6dff21d9c4337b
4
+ data.tar.gz: 6485dcabc35930a63069f921bdad1737ce4c909fb8254e0c74fccf352976932d
5
5
  SHA512:
6
- metadata.gz: 9b2bb7f767b7568e7acabeadce6f245e435a9ddc568ad1791c007a74fcb9ccf4c5e7f0a155c4e7784f681edc6f6588a4dfec990c7a4591cf832f169c53539f23
7
- data.tar.gz: 0babfde7d9a137eefa87b2b1c44f62022ac9a2dacbce3e91aa1e683e9de454c9fc4260b8b0600d351555365784dcef84db625b59ae43060bab8c284c6b640cf6
6
+ metadata.gz: 7ab807c004ef88ff8b5d07837b23b6d51907f986ef7da6b59e50d67469721f26eec679eebd2834ca3beca8ad99d6d63f42582c9c89b152aab54703db0106ad1a
7
+ data.tar.gz: 478760ee3bb0ae3459bd477d811dd0ef7de27d858f3be5c6b72bb26c149f4622b273a66f2a91683b1e9c6adff63d481128f1e3087f29fc063302dac128afcded
@@ -0,0 +1 @@
1
+ 2.6.0
@@ -0,0 +1,69 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ noids_client (0.0.1)
5
+ json (~> 1.8)
6
+ rest-client (~> 2.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ addressable (2.7.0)
12
+ public_suffix (>= 2.0.2, < 5.0)
13
+ byebug (11.1.3)
14
+ crack (0.4.4)
15
+ diff-lcs (1.4.4)
16
+ domain_name (0.5.20190701)
17
+ unf (>= 0.0.5, < 1.0.0)
18
+ hashdiff (1.0.1)
19
+ http-accept (1.7.0)
20
+ http-cookie (1.0.3)
21
+ domain_name (~> 0.5)
22
+ json (1.8.6)
23
+ mime-types (3.3.1)
24
+ mime-types-data (~> 3.2015)
25
+ mime-types-data (3.2020.1104)
26
+ netrc (0.11.0)
27
+ public_suffix (4.0.6)
28
+ rake (10.5.0)
29
+ rest-client (2.1.0)
30
+ http-accept (>= 1.7.0, < 2.0)
31
+ http-cookie (>= 1.0.2, < 2.0)
32
+ mime-types (>= 1.16, < 4.0)
33
+ netrc (~> 0.8)
34
+ rspec (3.10.0)
35
+ rspec-core (~> 3.10.0)
36
+ rspec-expectations (~> 3.10.0)
37
+ rspec-mocks (~> 3.10.0)
38
+ rspec-core (3.10.0)
39
+ rspec-support (~> 3.10.0)
40
+ rspec-expectations (3.10.0)
41
+ diff-lcs (>= 1.2.0, < 2.0)
42
+ rspec-support (~> 3.10.0)
43
+ rspec-mocks (3.10.0)
44
+ diff-lcs (>= 1.2.0, < 2.0)
45
+ rspec-support (~> 3.10.0)
46
+ rspec-support (3.10.0)
47
+ unf (0.1.4)
48
+ unf_ext
49
+ unf_ext (0.0.7.7)
50
+ vcr (2.9.3)
51
+ webmock (3.10.0)
52
+ addressable (>= 2.3.6)
53
+ crack (>= 0.3.2)
54
+ hashdiff (>= 0.4.0, < 2.0.0)
55
+
56
+ PLATFORMS
57
+ ruby
58
+
59
+ DEPENDENCIES
60
+ bundler (~> 1.3)
61
+ byebug
62
+ noids_client!
63
+ rake (~> 10.3)
64
+ rspec (~> 3.0)
65
+ vcr (~> 2.8)
66
+ webmock (~> 3.0)
67
+
68
+ BUNDLED WITH
69
+ 1.17.2
data/README.md CHANGED
@@ -38,47 +38,28 @@ This limitation is imposed by the server.
38
38
 
39
39
  # Setting up a noids server
40
40
 
41
- A noids server is not provided by this repository.
42
- However, for testing or experimentation it is convinent to set up a noids server, which is not difficult.
41
+ Follow the instructions at https://github.com/ndlib/noids
43
42
 
44
- ## On a Mac with homebrew
43
+ # Running tests
45
44
 
46
- First install a golang environment.
45
+ You can run the test suite by `bundle exec rspec`. This will not hit a live noid
46
+ server. The specs instead rely on recorded HTTP request/response pairs.
47
47
 
48
- brew install go
49
- mkdir ~/gocode
50
- export GOPATH=~/gocode
51
- export PATH=$GOPATH/bin:$PATH
48
+ ## Testing Noids::Client against a live noid server
52
49
 
53
- Install the noids server:
50
+ First, you'll want to ensure that you've installed a noids server. Follow the
51
+ directions over at https://github.com/ndlib/noids.
54
52
 
55
- go get https://github.com/dbrower/noids
53
+ Then run `bundle exec rake test_client_against_server`.
56
54
 
57
- Start it, and have it keep pools in memory.
55
+ ## Upstream Integrations
58
56
 
59
- noids
60
-
61
- These pools will be lost when the server is restarted.
62
- To save the pools to disk use
63
-
64
- noids -storage directory/to/use
65
-
66
- There are other options, including saving the pools to a database.
67
- See the documentation on the [noids server](https://github.com/dbrower/noids) page.
68
-
69
- You can test the server using `curl`.
70
- Note that the default port for the server to listen on is 13001.
71
- These commands will create a pool named 'test' which will generate ids using the template `.sddd`.
72
- Then 50 ids are minted, and the pool is advanced past the id `432`, so that `432` will never be minted by this pool.
73
-
74
- curl 'http://localhost:13001/pools' -F 'name=test' -F 'template=.sddd'
75
- curl 'http://localhost:13001/pools/test/mint' -F 'n=50'
76
- curl 'http://localhost:13001/pools/test/advancePast' -F 'id=432'
77
-
78
-
79
- ## On Linux
80
-
81
- Install a golang envrionment. This should be done using your package management system.
82
- e.g. `yum install golang`.
83
- Then follow the remaining steps above.
57
+ You can incorporate a live yet local noid server in your upstream suite.
84
58
 
59
+ ```ruby
60
+ require 'noids_client/integration_test'
61
+ # Note: the block will be yielded after the server has had a chance
62
+ # to spin up
63
+ NoidsClient::IntegrationTest::NoidServerRunner.new.run do
64
+ # Code to run that requires a noid server
65
+ end
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ desc "Test the current client against a NOIDs server (see https://github.com/ndlib/noids)"
4
+ task :test_client_against_server do
5
+ require 'noids_client/integration_test'
6
+ NoidsClient::IntegrationTest.run(spawn_noids_server: true)
7
+ end
@@ -5,3 +5,5 @@ require 'noids_client/pool'
5
5
  require 'noids_client/connection'
6
6
  require 'noids_client/version'
7
7
 
8
+ # NOTE: Do not require 'noids_client/integration_test' as that is
9
+ # intended for upstream systems to leverage
@@ -0,0 +1,197 @@
1
+ require 'noids_client'
2
+
3
+ module NoidsClient
4
+ # A helper class that allows for downstream implementers of the noids_clients
5
+ # gem to run against a "live" noids server
6
+ #
7
+ # @example
8
+ # require 'noids_client/integration_test'
9
+ # NoidsClient::IntegrationTest.run
10
+ #
11
+ # @see #initialize for .run parameters
12
+ module IntegrationTest
13
+ class AssertionFailedError < RuntimeError
14
+ end
15
+ def self.default_logger
16
+ require 'logger'
17
+ Logger.new(STDOUT)
18
+ end
19
+
20
+ # @params spawn_noids_server [Boolean] rely on this script (and a configured
21
+ # machine) to launch a new noids server
22
+ # @params logger [Logger] to report all the details
23
+ #
24
+ # @see TestRunner#initialize for kwargs options
25
+ # @see NoidServerRunner#initialize for kwargs options
26
+ #
27
+ # @raises AssertionFailedError if any of the integration tests fail
28
+ # @return true if all integration tests pass
29
+ def self.run(spawn_noids_server: false, logger: default_logger, **kwargs)
30
+ if spawn_noids_server
31
+ NoidServerRunner.new(logger: logger, **kwargs).run do
32
+ TestRunner.new(logger: logger, **kwargs).run
33
+ end
34
+ else
35
+ TestRunner.new(logger: logger, **kwargs).run
36
+ end
37
+ end
38
+
39
+
40
+ # A utility class to help running a NOIDs server within the context
41
+ #
42
+ # @example
43
+ # require 'noids_client/integration_test'
44
+ # NoidsClient::IntegrationTest::NoidServerRunner.new do
45
+ # # thing that requires a noids server
46
+ # end
47
+ #
48
+ class NoidServerRunner
49
+ # @param kwargs [Hash] the configuration options for the NoidsServer. Note,
50
+ # you shouldn't need to pass parameters if you follow the noids
51
+ # documentation
52
+ # @option logger [#debug, #info]
53
+ # @option storage_dir [String]
54
+ # @option file_utils [#mkdir_p, #rm_rf] the object that will manage cleaning
55
+ # the storage_dir
56
+ # @option noids_command [String] the fully expanded to the noids command
57
+ # @option seconds_to_wait [Integer] how long to wait for the noids server to
58
+ # fully boot
59
+ def initialize(**kwargs)
60
+ @logger = kwargs.fetch(:logger) { IntegrationTest.default_logger }
61
+ logger.debug("logger: #{logger.inspect}")
62
+ @storage_dir = kwargs.fetch(:storage_dir) { default_storage_dir }
63
+ logger.debug("storage_dir: #{storage_dir.inspect}")
64
+ @file_utils = kwargs.fetch(:file_utils) { default_file_utils }
65
+ logger.debug("file_utils: #{file_utils.inspect}")
66
+ @noids_command = kwargs.fetch(:noids_command) { default_noids_command }
67
+ logger.debug("noids_command: #{noids_command.inspect}")
68
+ @seconds_to_wait = kwargs.fetch(:seconds_to_wait) { SECONDS_TO_WAIT }
69
+ logger.debug("seconds_to_wait: #{seconds_to_wait}")
70
+ end
71
+
72
+ attr_reader :storage_dir, :noids_command, :logger, :file_utils, :seconds_to_wait
73
+
74
+ private
75
+
76
+ def default_storage_dir
77
+ File.join(ENV.fetch("HOME"), "noids_pool")
78
+ end
79
+
80
+ def default_noids_command
81
+ File.join(ENV.fetch("GOPATH"), "bin/noids")
82
+ end
83
+
84
+ def default_file_utils
85
+ require 'fileutils'
86
+ FileUtils
87
+ end
88
+
89
+ public
90
+
91
+ SECONDS_TO_WAIT = 5
92
+ def run
93
+ clean_storage!
94
+ process_id = Process.spawn("#{noids_command} --storage #{storage_dir}")
95
+ Process.detach(process_id)
96
+ logger.debug("Waiting #{seconds_to_wait} seconds for noids to start")
97
+ sleep(seconds_to_wait)
98
+ yield if block_given?
99
+ ensure
100
+ stop_noids!(process_id: process_id)
101
+ end
102
+
103
+ private
104
+
105
+ def clean_storage!
106
+ logger.info("Cleaning noids: #{storage_dir}")
107
+ file_utils.rm_rf(storage_dir)
108
+ file_utils.mkdir_p(storage_dir)
109
+ end
110
+
111
+ def start_noids!
112
+ # `$GOPATH/bin/noids --storage ~/noids_pool`
113
+ logger.info("Starting noids server…")
114
+ IO.popen("#{noids_command} --storage #{storage_dir}", err: [:child, :out])
115
+ end
116
+
117
+ def stop_noids!(process_id:)
118
+ logger.info("Shutting down server…")
119
+ Process.kill(:SIGINT, process_id)
120
+ return true
121
+ end
122
+ end
123
+
124
+
125
+ class TestRunner
126
+ # @param kwargs [Hash] the configuration options for the NoidsServer. Note,
127
+ # you shouldn't need to pass parameters if you follow the noids
128
+ # documentation
129
+ # @option logger [#debug, #info]
130
+ # @option noids_url [String]
131
+ # @option connection_class [#new] a connection class that implements the
132
+ # NoidsClient::Connection object interface
133
+ def initialize(**kwargs)
134
+ @logger = kwargs.fetch(:logger) { IntegrationTest.default_logger }
135
+ logger.debug("logger: #{logger.inspect}")
136
+ @noids_url = kwargs.fetch(:noids_url) { default_noids_url }
137
+ @connection_class = kwargs.fetch(:connection_class) { default_connection_class }
138
+ connect!
139
+ end
140
+ attr_reader :noids_url, :logger, :connection, :connection_class
141
+
142
+ private
143
+
144
+ def connect!
145
+ logger.debug "Using #{noids_url} to connect via #{connection_class}"
146
+ @connection = connection_class.new(noids_url)
147
+ end
148
+
149
+ def default_noids_url
150
+ default_noids_url = "http://localhost:13001"
151
+ ENV.fetch("NOIDS_URL") do
152
+ default_noids_url
153
+ end
154
+ end
155
+
156
+ def default_logger
157
+ require 'logger'
158
+ Logger.new(STDOUT)
159
+ end
160
+
161
+ def default_connection_class
162
+ require 'noids_client'
163
+ NoidsClient::Connection
164
+ end
165
+
166
+ public
167
+
168
+ def run
169
+ assert(connection.pool_list.empty?, "Expected connection.pool_list to be empty")
170
+ new_pool = connection.new_pool("test", ".sddd")
171
+ assert(new_pool, "Expected to be able to create a pool")
172
+ assert(connection.pool_list.include?("test"), "Expected connection.pool_list to include test")
173
+ pool = connection.get_pool("test")
174
+ assert(pool.name == "test", "Expected pool to be named 'test'")
175
+ assert(pool.ids_used == 0, "Expected pool to have no used IDs")
176
+ ids = pool.mint(2)
177
+ assert(ids.size == 2, "Expected to mint 2 ids with `pool.mint(2)`")
178
+ assert(pool.close, "Expected close to be successful")
179
+ assert(pool.open, "Expected to be able to re-open the pool")
180
+ assert(pool.ids_used == 2, "Expected the previously minted ids to register as used")
181
+ return true
182
+ end
183
+
184
+ private
185
+
186
+ def assert(boolean_test, expectation_message)
187
+ if boolean_test # The test passed
188
+ logger.info expectation_message
189
+ return true
190
+ else
191
+ logger.fatal "FAILED EXPECTATION: #{expectation_message}"
192
+ raise AssertionFailedError, "FAILED EXPECTATION: #{expectation_message}"
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
@@ -1,3 +1,3 @@
1
1
  module NoidsClient
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -8,23 +8,22 @@ Gem::Specification.new do |spec|
8
8
  spec.version = NoidsClient::VERSION
9
9
  spec.summary = 'Ruby client for a NOIDS server'
10
10
  spec.description = %q{Provides an idiomatic interface to the REST API of a noids server (see https://github.com/dbrower/noids)}
11
- spec.authors = ['Don Brower']
12
- spec.email = ['dbrower@nd.edu']
11
+ spec.authors = ['Don Brower', "Jeremy Friesen"]
12
+ spec.email = ['dbrower@nd.edu', "jeremy.n.friesen@gmail.com"]
13
13
  spec.license = 'APACHE2'
14
- spec.homepage = 'https://github.com/ndlib/noids_client'
15
14
 
16
15
  spec.files = `git ls-files`.split($/)
17
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
18
  spec.require_paths = ["lib"]
20
19
 
21
- spec.add_dependency 'rest-client', '~> 1.6'
20
+ spec.add_dependency 'rest-client', '~> 2.0'
22
21
  spec.add_dependency 'json', '~> 1.8'
23
22
 
24
23
  spec.add_development_dependency 'bundler', '~> 1.3'
25
24
  spec.add_development_dependency 'rake', '~> 10.3'
26
25
  spec.add_development_dependency 'rspec', '~> 3.0'
27
26
  spec.add_development_dependency 'vcr', '~> 2.8'
28
- spec.add_development_dependency 'webmock', '~> 1.17'
27
+ spec.add_development_dependency 'webmock', '~> 3.0'
28
+ spec.add_development_dependency 'byebug'
29
29
  end
30
-
@@ -4,6 +4,9 @@ require 'vcr'
4
4
 
5
5
  require 'noids_client'
6
6
 
7
+ require 'webmock'
8
+ WebMock.enable!
9
+
7
10
  VCR.configure do |c|
8
11
  c.cassette_library_dir = 'spec/cassettes'
9
12
  c.hook_into :webmock
metadata CHANGED
@@ -1,127 +1,146 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noids_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Don Brower
8
+ - Jeremy Friesen
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-08-20 00:00:00.000000000 Z
12
+ date: 2020-12-03 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rest-client
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - ~>
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '1.6'
20
+ version: '2.0'
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - ~>
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '1.6'
27
+ version: '2.0'
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: json
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - ~>
32
+ - - "~>"
32
33
  - !ruby/object:Gem::Version
33
34
  version: '1.8'
34
35
  type: :runtime
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - ~>
39
+ - - "~>"
39
40
  - !ruby/object:Gem::Version
40
41
  version: '1.8'
41
42
  - !ruby/object:Gem::Dependency
42
43
  name: bundler
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
- - - ~>
46
+ - - "~>"
46
47
  - !ruby/object:Gem::Version
47
48
  version: '1.3'
48
49
  type: :development
49
50
  prerelease: false
50
51
  version_requirements: !ruby/object:Gem::Requirement
51
52
  requirements:
52
- - - ~>
53
+ - - "~>"
53
54
  - !ruby/object:Gem::Version
54
55
  version: '1.3'
55
56
  - !ruby/object:Gem::Dependency
56
57
  name: rake
57
58
  requirement: !ruby/object:Gem::Requirement
58
59
  requirements:
59
- - - ~>
60
+ - - "~>"
60
61
  - !ruby/object:Gem::Version
61
62
  version: '10.3'
62
63
  type: :development
63
64
  prerelease: false
64
65
  version_requirements: !ruby/object:Gem::Requirement
65
66
  requirements:
66
- - - ~>
67
+ - - "~>"
67
68
  - !ruby/object:Gem::Version
68
69
  version: '10.3'
69
70
  - !ruby/object:Gem::Dependency
70
71
  name: rspec
71
72
  requirement: !ruby/object:Gem::Requirement
72
73
  requirements:
73
- - - ~>
74
+ - - "~>"
74
75
  - !ruby/object:Gem::Version
75
76
  version: '3.0'
76
77
  type: :development
77
78
  prerelease: false
78
79
  version_requirements: !ruby/object:Gem::Requirement
79
80
  requirements:
80
- - - ~>
81
+ - - "~>"
81
82
  - !ruby/object:Gem::Version
82
83
  version: '3.0'
83
84
  - !ruby/object:Gem::Dependency
84
85
  name: vcr
85
86
  requirement: !ruby/object:Gem::Requirement
86
87
  requirements:
87
- - - ~>
88
+ - - "~>"
88
89
  - !ruby/object:Gem::Version
89
90
  version: '2.8'
90
91
  type: :development
91
92
  prerelease: false
92
93
  version_requirements: !ruby/object:Gem::Requirement
93
94
  requirements:
94
- - - ~>
95
+ - - "~>"
95
96
  - !ruby/object:Gem::Version
96
97
  version: '2.8'
97
98
  - !ruby/object:Gem::Dependency
98
99
  name: webmock
99
100
  requirement: !ruby/object:Gem::Requirement
100
101
  requirements:
101
- - - ~>
102
+ - - "~>"
102
103
  - !ruby/object:Gem::Version
103
- version: '1.17'
104
+ version: '3.0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '3.0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: byebug
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
104
119
  type: :development
105
120
  prerelease: false
106
121
  version_requirements: !ruby/object:Gem::Requirement
107
122
  requirements:
108
- - - ~>
123
+ - - ">="
109
124
  - !ruby/object:Gem::Version
110
- version: '1.17'
125
+ version: '0'
111
126
  description: Provides an idiomatic interface to the REST API of a noids server (see
112
127
  https://github.com/dbrower/noids)
113
128
  email:
114
129
  - dbrower@nd.edu
130
+ - jeremy.n.friesen@gmail.com
115
131
  executables: []
116
132
  extensions: []
117
133
  extra_rdoc_files: []
118
134
  files:
135
+ - ".ruby-version"
119
136
  - Gemfile
137
+ - Gemfile.lock
120
138
  - LICENSE
121
139
  - README.md
122
140
  - Rakefile
123
141
  - lib/noids_client.rb
124
142
  - lib/noids_client/connection.rb
143
+ - lib/noids_client/integration_test.rb
125
144
  - lib/noids_client/pool.rb
126
145
  - lib/noids_client/version.rb
127
146
  - noids_client.gemspec
@@ -129,7 +148,7 @@ files:
129
148
  - spec/lib/integration_spec.rb
130
149
  - spec/lib/pool_spec.rb
131
150
  - spec/spec_helper.rb
132
- homepage: https://github.com/ndlib/noids_client
151
+ homepage:
133
152
  licenses:
134
153
  - APACHE2
135
154
  metadata: {}
@@ -139,17 +158,16 @@ require_paths:
139
158
  - lib
140
159
  required_ruby_version: !ruby/object:Gem::Requirement
141
160
  requirements:
142
- - - '>='
161
+ - - ">="
143
162
  - !ruby/object:Gem::Version
144
163
  version: '0'
145
164
  required_rubygems_version: !ruby/object:Gem::Requirement
146
165
  requirements:
147
- - - '>='
166
+ - - ">="
148
167
  - !ruby/object:Gem::Version
149
168
  version: '0'
150
169
  requirements: []
151
- rubyforge_project:
152
- rubygems_version: 2.1.11
170
+ rubygems_version: 3.0.1
153
171
  signing_key:
154
172
  specification_version: 4
155
173
  summary: Ruby client for a NOIDS server
@@ -158,4 +176,3 @@ test_files:
158
176
  - spec/lib/integration_spec.rb
159
177
  - spec/lib/pool_spec.rb
160
178
  - spec/spec_helper.rb
161
- has_rdoc: