noid-rails 3.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.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +36 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +24 -0
  5. data/.rubocop_todo.yml +107 -0
  6. data/.travis.yml +11 -0
  7. data/CONTRIBUTING.md +159 -0
  8. data/Gemfile +39 -0
  9. data/LICENSE +15 -0
  10. data/README.md +214 -0
  11. data/Rakefile +23 -0
  12. data/app/models/minter_state.rb +16 -0
  13. data/db/migrate/20160610010003_create_minter_states.rb +16 -0
  14. data/db/migrate/20161021203429_rename_minter_state_random_to_rand.rb +7 -0
  15. data/lib/generators/noid/rails/install_generator.rb +22 -0
  16. data/lib/generators/noid/rails/seed_generator.rb +37 -0
  17. data/lib/noid/rails/config.rb +35 -0
  18. data/lib/noid/rails/engine.rb +10 -0
  19. data/lib/noid/rails/minter/base.rb +65 -0
  20. data/lib/noid/rails/minter/db.rb +82 -0
  21. data/lib/noid/rails/minter/file.rb +65 -0
  22. data/lib/noid/rails/minter.rb +5 -0
  23. data/lib/noid/rails/rspec.rb +67 -0
  24. data/lib/noid/rails/service.rb +26 -0
  25. data/lib/noid/rails/version.rb +7 -0
  26. data/lib/noid-rails.rb +29 -0
  27. data/lib/tasks/noid_tasks.rake +59 -0
  28. data/noid-rails.gemspec +31 -0
  29. data/spec/models/minter_state_spec.rb +41 -0
  30. data/spec/spec_helper.rb +40 -0
  31. data/spec/support/minterstate_table.rb +13 -0
  32. data/spec/support/shared_examples/minter.rb +39 -0
  33. data/spec/test_app_templates/lib/generators/test_app_generator.rb +16 -0
  34. data/spec/unit/config_spec.rb +45 -0
  35. data/spec/unit/db_minter_spec.rb +88 -0
  36. data/spec/unit/file_minter_spec.rb +54 -0
  37. data/spec/unit/noid_spec.rb +43 -0
  38. data/spec/unit/rspec_spec.rb +90 -0
  39. data/spec/unit/service_spec.rb +32 -0
  40. metadata +225 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples 'a minter' do
4
+ describe '#mint' do
5
+ subject { minter.mint }
6
+
7
+ it { is_expected.not_to be_empty }
8
+
9
+ it 'does not mint the same ID twice in a row' do
10
+ expect(subject).not_to eq described_class.new.mint
11
+ end
12
+
13
+ it 'is valid' do
14
+ expect(minter.valid?(subject)).to be true
15
+ expect(described_class.new.valid?(subject)).to be true
16
+ end
17
+
18
+ context 'with a different template' do
19
+ it 'is invalid' do
20
+ expect(described_class.new('.reedddk').valid?(subject)).to be false
21
+ end
22
+ end
23
+ end
24
+
25
+ context 'when the id already exists' do
26
+ let(:existing_id) { 'ef12ef12f' }
27
+ let(:unique_id) { 'bb22bb22b' }
28
+
29
+ before do
30
+ expect(subject).to receive(:next_id).and_return(existing_id, unique_id)
31
+ allow(subject).to receive(:identifier_in_use?).with(existing_id).and_return(true)
32
+ allow(subject).to receive(:identifier_in_use?).with(unique_id).and_return(false)
33
+ end
34
+
35
+ it 'skips the existing id' do
36
+ expect(subject.mint).to eq unique_id
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+
5
+ class TestAppGenerator < Rails::Generators::Base
6
+ source_root './spec/test_app_templates'
7
+
8
+ # if you need to generate any additional configuration
9
+ # into the test app, this generator will be run immediately
10
+ # after setting up the application
11
+
12
+ def install_engine
13
+ generate 'noid:rails:install'
14
+ rake 'db:migrate'
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Noid::Rails::Config do
4
+ subject { described_class.new }
5
+
6
+ it { is_expected.to respond_to(:template) }
7
+ it { is_expected.to respond_to(:statefile) }
8
+ it { is_expected.to respond_to(:namespace) }
9
+ it { is_expected.to respond_to(:minter_class) }
10
+
11
+ describe '#template' do
12
+ let(:default) { '.reeddeeddk' }
13
+
14
+ it 'has a default' do
15
+ expect(subject.template).to eq default
16
+ end
17
+
18
+ describe 'overriding' do
19
+ before { subject.template = custom_template }
20
+
21
+ let(:custom_template) { '.dddddd' }
22
+
23
+ it 'allows setting a custom template' do
24
+ expect(subject.template).to eq custom_template
25
+ end
26
+ end
27
+ end
28
+
29
+ describe '#minter_class' do
30
+ let(:default) { Noid::Rails::Minter::File }
31
+
32
+ it 'has a default' do
33
+ expect(subject.minter_class).to eq default
34
+ end
35
+
36
+ context 'when overridden' do
37
+ before { subject.minter_class = different_minter }
38
+ let(:different_minter) { Noid::Rails::Minter::File }
39
+
40
+ it 'uses the different minter' do
41
+ expect(subject.minter_class).to eq different_minter
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Noid::Rails::Minter::Db do
4
+ include MinterStateHelper
5
+
6
+ after { reset_minter_state_table }
7
+ subject(:db_minter) { described_class.new }
8
+
9
+ before do
10
+ reset_minter_state_table
11
+ end
12
+
13
+ it_behaves_like 'a minter' do
14
+ let(:minter) { db_minter }
15
+ end
16
+
17
+ describe '#initialize' do
18
+ it 'raises on bad templates' do
19
+ expect { described_class.new('reeddeeddk') }.to raise_error(Noid::TemplateError)
20
+ expect { described_class.new('') }.to raise_error(Noid::TemplateError)
21
+ end
22
+ it 'returns object w/ default template' do
23
+ expect(db_minter).to be_instance_of described_class
24
+ expect(db_minter).to be_a Noid::Minter
25
+ expect(db_minter.template).to be_instance_of Noid::Template
26
+ expect(db_minter.template.to_s).to eq Noid::Rails.config.template
27
+ end
28
+ context 'with a user provided template' do
29
+ let(:db_minter) { described_class.new('.reedddk') }
30
+
31
+ it 'accepts valid template arg' do
32
+ expect(db_minter).to be_instance_of described_class
33
+ expect(db_minter).to be_a Noid::Minter
34
+ expect(db_minter.template).to be_instance_of Noid::Template
35
+ expect(db_minter.template.to_s).to eq '.reedddk'
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#read' do
41
+ subject { db_minter.read }
42
+
43
+ context 'when the database has been initialized' do
44
+ it 'has the expected namespace and template' do
45
+ expect(subject).to include(namespace: Noid::Rails.config.namespace,
46
+ template: Noid::Rails.config.template)
47
+ end
48
+ end
49
+
50
+ context 'when the database has not been initialized' do
51
+ before do
52
+ MinterState.destroy_all
53
+ end
54
+ it 'has the expected namespace and template' do
55
+ expect(subject).to include(namespace: Noid::Rails.config.namespace,
56
+ template: Noid::Rails.config.template)
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#write!' do
62
+ let(:starting_state) { db_minter.read }
63
+ let(:minter) { Noid::Minter.new(starting_state) }
64
+
65
+ before { minter.mint }
66
+
67
+ it 'changes the state of the minter' do
68
+ expect { db_minter.write!(minter) }
69
+ .to change { db_minter.read[:seq] }
70
+ .from(starting_state[:seq]).to(minter.seq)
71
+ .and change { db_minter.read[:counters] }
72
+ .from(starting_state[:counters]).to(minter.counters)
73
+ .and change { db_minter.read[:rand] }
74
+ .from(starting_state[:rand]).to(Marshal.dump(minter.instance_variable_get(:@rand)))
75
+ end
76
+ end
77
+
78
+ describe '#next_id' do
79
+ let(:stub_minter) { described_class.new }
80
+ let(:locked) { MinterState }
81
+
82
+ it 'locks DB row and does not query twice' do
83
+ expect(MinterState).to receive(:lock).and_return(locked).once
84
+ expect(locked).to receive(:find_by!).once.and_return(MinterState.first)
85
+ stub_minter.send(:next_id)
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Noid::Rails::Minter::File do
4
+ it { is_expected.to respond_to(:mint) }
5
+
6
+ it 'has a default statefile' do
7
+ expect(subject.statefile).to eq Noid::Rails.config.statefile
8
+ end
9
+ it 'has a default template' do
10
+ expect(subject.template.to_s).to eq Noid::Rails.config.template
11
+ end
12
+
13
+ it_behaves_like 'a minter' do
14
+ let(:minter) { described_class.new }
15
+ end
16
+
17
+ describe '#initialize' do
18
+ let(:template) { '.rededk' }
19
+ let(:statefile) { '/tmp/foobar' }
20
+
21
+ subject { described_class.new(template, statefile) }
22
+
23
+ it 'respects the custom template' do
24
+ expect(subject.template.to_s).to eq template
25
+ end
26
+ it 'respects the custom statefile' do
27
+ expect(subject.statefile).to eq statefile
28
+ end
29
+ end
30
+
31
+ describe '#read' do
32
+ it 'returns a hash' do
33
+ expect(subject.read).to be_a(Hash)
34
+ end
35
+ it 'has the expected template' do
36
+ expect(subject.read[:template]).to eq Noid::Rails.config.template
37
+ end
38
+ end
39
+
40
+ describe '#write!' do
41
+ let(:starting_state) { subject.read }
42
+ let(:minter) { Noid::Minter.new(starting_state) }
43
+
44
+ before { minter.mint }
45
+ it 'changes the state of the minter' do
46
+ expect { subject.write!(minter) }.to change { subject.read[:seq] }
47
+ .from(starting_state[:seq]).to(minter.seq)
48
+ .and change { subject.read[:rand] }
49
+ .from(starting_state[:rand]).to(Marshal.dump(minter.instance_variable_get(:@rand)))
50
+ .and change { subject.read[:counters] }
51
+ .to(minter.counters)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Noid::Rails do
4
+ describe '#configure' do
5
+ it { is_expected.to respond_to(:configure) }
6
+ end
7
+
8
+ describe '#config' do
9
+ it 'returns a config object' do
10
+ expect(subject.config).to be_instance_of Noid::Rails::Config
11
+ end
12
+ end
13
+
14
+ describe '#treeify' do
15
+ subject { described_class.treeify(id) }
16
+
17
+ let(:id) { 'abc123def45' }
18
+
19
+ it { is_expected.to eq 'ab/c1/23/de/abc123def45' }
20
+
21
+ context 'with a seven-digit identifier' do
22
+ let(:id) { 'abc123z' }
23
+
24
+ it { is_expected.to eq 'ab/c1/23/z/abc123z' }
25
+ end
26
+
27
+ context 'with an empty string' do
28
+ let(:id) { '' }
29
+
30
+ it 'raises ArgumentError' do
31
+ expect { subject }.to raise_error(ArgumentError)
32
+ end
33
+ end
34
+
35
+ context 'with a nil' do
36
+ let(:id) { nil }
37
+
38
+ it 'raises ArgumentError' do
39
+ expect { subject }.to raise_error(ArgumentError)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'noid/rails/rspec'
4
+
5
+ RSpec.describe Noid::Rails::RSpec do
6
+ include described_class
7
+
8
+ let(:configured_minter) { @configured_minter }
9
+ let(:var_name) { :@original_minter }
10
+
11
+ before do
12
+ @configured_minter = Class.new(Noid::Rails::Minter::Base)
13
+ @reset_minter = Noid::Rails.config.minter_class
14
+
15
+ Noid::Rails.configure do |noid_config|
16
+ noid_config.minter_class = @configured_minter
17
+ end
18
+ end
19
+
20
+ after do
21
+ Noid::Rails.configure do |noid_config|
22
+ noid_config.minter_class = @reset_minter
23
+ end
24
+ end
25
+
26
+ describe '#disable_production_minter!' do
27
+ it 'changes the configured minter' do
28
+ expect { disable_production_minter! }
29
+ .to change { Noid::Rails.config.minter_class }
30
+ .from(configured_minter)
31
+ .to described_class::DEFAULT_TEST_MINTER
32
+ end
33
+
34
+ it 'accepts custom test minter at call time' do
35
+ my_minter = Class.new(Noid::Rails::Minter::Base)
36
+
37
+ expect { disable_production_minter!(test_minter: my_minter) }
38
+ .to change { Noid::Rails.config.minter_class }
39
+ .from(configured_minter)
40
+ .to my_minter
41
+ end
42
+
43
+ it 'does not overwrite stored minter on second call' do
44
+ disable_production_minter!
45
+
46
+ expect { disable_production_minter! }.not_to change { described_class.instance_variable_get(var_name) }
47
+ end
48
+
49
+ it 'still reenables after second call' do
50
+ 2.times { disable_production_minter! }
51
+ expect { enable_production_minter! }
52
+ .to change { Noid::Rails.config.minter_class }
53
+ .from(described_class::DEFAULT_TEST_MINTER).to configured_minter
54
+ end
55
+
56
+ it 'disables after reenable' do
57
+ disable_production_minter!
58
+ enable_production_minter!
59
+ expect { disable_production_minter! }
60
+ .to change { Noid::Rails.config.minter_class }
61
+ .from(configured_minter).to described_class::DEFAULT_TEST_MINTER
62
+ end
63
+ end
64
+
65
+ describe '#enable_production_minter!' do
66
+ it 'does nothing when already enabled' do
67
+ expect { enable_production_minter! }
68
+ .not_to change { Noid::Rails.config.minter_class }
69
+ end
70
+
71
+ context 'with minter disabled' do
72
+ before { disable_production_minter! }
73
+
74
+ it 'reenables the originally configured minter' do
75
+ expect { enable_production_minter! }
76
+ .to change { Noid::Rails.config.minter_class }
77
+ .from(described_class::DEFAULT_TEST_MINTER)
78
+ .to configured_minter
79
+ end
80
+
81
+ it 'enables after re-disable' do
82
+ enable_production_minter!
83
+ disable_production_minter!
84
+ expect { enable_production_minter! }
85
+ .to change { Noid::Rails.config.minter_class }
86
+ .from(described_class::DEFAULT_TEST_MINTER).to configured_minter
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Noid::Rails::Service do
4
+ describe 'public API' do
5
+ it { is_expected.to respond_to(:valid?) }
6
+ it { is_expected.to respond_to(:mint) }
7
+ end
8
+
9
+ it 'has a default minter' do
10
+ expect(subject.minter).to be_instance_of Noid::Rails::Minter::File
11
+ end
12
+
13
+ context 'with a custom minter' do
14
+ let(:minter) { double('minter') }
15
+ let(:identifier) { 'abc123' }
16
+ let(:new_service) { described_class.new(minter) }
17
+
18
+ it 'allows injecting a custom minter' do
19
+ expect(new_service.minter).to eq minter
20
+ end
21
+
22
+ it 'delegates validity checking to the minter' do
23
+ expect(minter).to receive(:valid?).with(identifier).once
24
+ new_service.valid? identifier
25
+ end
26
+
27
+ it 'delegates minting to the minter' do
28
+ expect(minter).to receive(:mint).once
29
+ new_service.mint
30
+ end
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,225 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: noid-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael J. Giarlo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-12-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.0.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 5.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6'
33
+ - !ruby/object:Gem::Dependency
34
+ name: noid
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.9'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.9'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.7'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.7'
61
+ - !ruby/object:Gem::Dependency
62
+ name: engine_cart
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '11'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '11'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.2'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.2'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rubocop
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 0.52.0
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 0.52.0
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop-rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 1.20.1
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: 1.20.1
131
+ - !ruby/object:Gem::Dependency
132
+ name: sqlite3
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ description: Noid identifier services for Rails-based applications.
146
+ email:
147
+ - leftwing@alumni.rutgers.edu
148
+ executables: []
149
+ extensions: []
150
+ extra_rdoc_files: []
151
+ files:
152
+ - ".gitignore"
153
+ - ".rspec"
154
+ - ".rubocop.yml"
155
+ - ".rubocop_todo.yml"
156
+ - ".travis.yml"
157
+ - CONTRIBUTING.md
158
+ - Gemfile
159
+ - LICENSE
160
+ - README.md
161
+ - Rakefile
162
+ - app/models/minter_state.rb
163
+ - db/migrate/20160610010003_create_minter_states.rb
164
+ - db/migrate/20161021203429_rename_minter_state_random_to_rand.rb
165
+ - lib/generators/noid/rails/install_generator.rb
166
+ - lib/generators/noid/rails/seed_generator.rb
167
+ - lib/noid-rails.rb
168
+ - lib/noid/rails/config.rb
169
+ - lib/noid/rails/engine.rb
170
+ - lib/noid/rails/minter.rb
171
+ - lib/noid/rails/minter/base.rb
172
+ - lib/noid/rails/minter/db.rb
173
+ - lib/noid/rails/minter/file.rb
174
+ - lib/noid/rails/rspec.rb
175
+ - lib/noid/rails/service.rb
176
+ - lib/noid/rails/version.rb
177
+ - lib/tasks/noid_tasks.rake
178
+ - noid-rails.gemspec
179
+ - spec/models/minter_state_spec.rb
180
+ - spec/spec_helper.rb
181
+ - spec/support/minterstate_table.rb
182
+ - spec/support/shared_examples/minter.rb
183
+ - spec/test_app_templates/lib/generators/test_app_generator.rb
184
+ - spec/unit/config_spec.rb
185
+ - spec/unit/db_minter_spec.rb
186
+ - spec/unit/file_minter_spec.rb
187
+ - spec/unit/noid_spec.rb
188
+ - spec/unit/rspec_spec.rb
189
+ - spec/unit/service_spec.rb
190
+ homepage: https://github.com/samvera/noid-rails
191
+ licenses:
192
+ - Apache2
193
+ metadata: {}
194
+ post_install_message:
195
+ rdoc_options: []
196
+ require_paths:
197
+ - lib
198
+ required_ruby_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ requirements: []
209
+ rubyforge_project:
210
+ rubygems_version: 2.7.1
211
+ signing_key:
212
+ specification_version: 4
213
+ summary: Noid identifier services for Rails-based applications
214
+ test_files:
215
+ - spec/models/minter_state_spec.rb
216
+ - spec/spec_helper.rb
217
+ - spec/support/minterstate_table.rb
218
+ - spec/support/shared_examples/minter.rb
219
+ - spec/test_app_templates/lib/generators/test_app_generator.rb
220
+ - spec/unit/config_spec.rb
221
+ - spec/unit/db_minter_spec.rb
222
+ - spec/unit/file_minter_spec.rb
223
+ - spec/unit/noid_spec.rb
224
+ - spec/unit/rspec_spec.rb
225
+ - spec/unit/service_spec.rb