noid-rails 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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