active_fedora-noid 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -3
- data/active_fedora-noid.gemspec +1 -1
- data/lib/active_fedora/noid/minter/base.rb +3 -6
- data/lib/active_fedora/noid/minter/db.rb +23 -9
- data/lib/active_fedora/noid/version.rb +1 -1
- data/lib/generators/active_fedora/noid/install_generator.rb +0 -5
- data/spec/spec_helper.rb +1 -0
- data/spec/support/shared_examples/minter.rb +2 -7
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -0
- data/spec/unit/db_minter_spec.rb +16 -6
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e58687a86fa490783729234d0a1db375c494faed
|
4
|
+
data.tar.gz: c37de3f330b5cc4c0a0f429ff1c6225422d5f4e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7454c2ca35895fbb2adebeddde58876e910e885705a633ffc322397c7b2d80dc3e48978b5cd9c10c85954f4c43d6c4b05441b7bee71f0de98c3d414567764206
|
7
|
+
data.tar.gz: 29039bd1d5da0854797832c3761f5ccbe1aebc46922625c27c9167b213d764c1c8bf4b244369eca286e6c83de3fa34bea62d7d1d68cf359e3fb52b4f8b0fa46f
|
data/README.md
CHANGED
@@ -99,7 +99,7 @@ This will make sure your objects have Noid-like identifiers (e.g. `bb22bb22b`) t
|
|
99
99
|
|
100
100
|
## Overriding default behavior
|
101
101
|
|
102
|
-
The default minter in ActiveFedora::Noid 2.
|
102
|
+
The default minter in ActiveFedora::Noid 2.x is the file-backed minter to preserve default behavior.
|
103
103
|
|
104
104
|
To better support multi-host production installations that expect a shared database but not necessarily a shared filesystem (e.g., between load-balanced Rails applications), we highly recommend swapping in the database-backed minter.
|
105
105
|
|
@@ -111,7 +111,11 @@ The database-based minter stores minter state information in your application's
|
|
111
111
|
$ rails generate active_fedora:noid:install
|
112
112
|
```
|
113
113
|
|
114
|
-
This will create the necessary database
|
114
|
+
This will create the necessary database migrations.
|
115
|
+
|
116
|
+
Then run `rake db:migrate`
|
117
|
+
|
118
|
+
To start minting identifiers with the new minter, override the AF::Noid configuration in e.g. `config/initializers/active_fedora-noid.rb`:
|
115
119
|
|
116
120
|
```ruby
|
117
121
|
require 'active_fedora/noid'
|
@@ -134,7 +138,7 @@ RSpec.configure do |config|
|
|
134
138
|
end
|
135
139
|
```
|
136
140
|
|
137
|
-
If you switch to the new database-backed minter and want to include in that minter the state of your current file-backed minter, AF::Noid 2.
|
141
|
+
If you switch to the new database-backed minter and want to include in that minter the state of your current file-backed minter, AF::Noid 2.x provides a new rake task that will copy your minter's state from the filesystem to the database:
|
138
142
|
|
139
143
|
```bash
|
140
144
|
# For migrating minter state from a file to a database
|
data/active_fedora-noid.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency 'rails', '>= 4.2.7.1', '< 6'
|
24
24
|
|
25
25
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
26
|
-
spec.add_development_dependency 'rake', '
|
26
|
+
spec.add_development_dependency 'rake', '>= 11'
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.2'
|
28
28
|
spec.add_development_dependency 'sqlite3'
|
29
29
|
spec.add_development_dependency 'rubocop', '~> 0.42.0'
|
@@ -8,15 +8,13 @@ module ActiveFedora
|
|
8
8
|
class Base < ::Noid::Minter
|
9
9
|
##
|
10
10
|
# @param template [#to_s] a NOID template
|
11
|
-
#
|
12
11
|
# @see Noid::Template
|
13
12
|
def initialize(template = default_template)
|
14
13
|
super(template: template.to_s)
|
15
14
|
end
|
16
15
|
|
17
16
|
##
|
18
|
-
# Sychronously mint a new identifier. Guarantees the ID is not
|
19
|
-
# already reserved in ActiveFedora.
|
17
|
+
# Sychronously mint a new identifier. Guarantees the ID is not already reserved in ActiveFedora.
|
20
18
|
#
|
21
19
|
# @return [String] the minted identifier
|
22
20
|
def mint
|
@@ -29,7 +27,7 @@ module ActiveFedora
|
|
29
27
|
end
|
30
28
|
|
31
29
|
##
|
32
|
-
# @return [Hash]
|
30
|
+
# @return [Hash{Symbol => String, Object}] representation of the current minter state
|
33
31
|
def read
|
34
32
|
raise NotImplementedError, 'Implement #read in child class'
|
35
33
|
end
|
@@ -38,7 +36,6 @@ module ActiveFedora
|
|
38
36
|
# Updates the minter state to that of the `minter` parameter.
|
39
37
|
#
|
40
38
|
# @param minter [Minter::Base]
|
41
|
-
#
|
42
39
|
# @return [void]
|
43
40
|
def write!(_)
|
44
41
|
raise NotImplementedError, 'Implement #write! in child class'
|
@@ -53,7 +50,7 @@ module ActiveFedora
|
|
53
50
|
end
|
54
51
|
|
55
52
|
##
|
56
|
-
# @return [String] a new identifier
|
53
|
+
# @return [String] a new identifier
|
57
54
|
def next_id
|
58
55
|
raise NotImplementedError, 'Implement #next_id in child class'
|
59
56
|
end
|
@@ -6,27 +6,40 @@ module ActiveFedora
|
|
6
6
|
module Minter
|
7
7
|
class Db < Base
|
8
8
|
def read
|
9
|
-
|
9
|
+
deserialize(instance)
|
10
|
+
end
|
11
|
+
|
12
|
+
def write!(minter)
|
13
|
+
serialize(instance, minter)
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
# @param [MinterState] inst minter state to be converted
|
19
|
+
# @return [Hash{Symbol => String, Object}] minter state as a Hash, like #read
|
20
|
+
# @see #read, ActiveFedora::Noid::Minter::Base#read
|
21
|
+
def deserialize(inst)
|
22
|
+
filtered_hash = inst.as_json.slice(*%w(template counters seq rand namespace))
|
10
23
|
filtered_hash['counters'] = JSON.parse(filtered_hash['counters'], symbolize_names: true) if filtered_hash['counters']
|
11
24
|
filtered_hash.symbolize_keys
|
12
25
|
end
|
13
26
|
|
14
|
-
|
27
|
+
# @param [MinterState] inst a locked row/object to be updated
|
28
|
+
# @param [::Noid::Minter] minter state containing the updates
|
29
|
+
def serialize(inst, minter)
|
15
30
|
# namespace and template are the same, now update the other attributes
|
16
|
-
|
31
|
+
inst.update_attributes!(
|
17
32
|
seq: minter.seq,
|
18
33
|
counters: JSON.generate(minter.counters),
|
19
34
|
rand: Marshal.dump(minter.instance_variable_get(:@rand))
|
20
35
|
)
|
21
36
|
end
|
22
37
|
|
23
|
-
protected
|
24
|
-
|
25
38
|
# Uses pessimistic lock to ensure the record fetched is the same one updated.
|
26
39
|
# Should be fast enough to avoid terrible deadlock.
|
27
40
|
# Must lock because of multi-connection context! (transaction is per connection -- not enough)
|
28
41
|
# The DB table will only ever have at most one row per namespace.
|
29
|
-
# The 'default' namespace row is inserted by `rails generate active_fedora:noid:seed
|
42
|
+
# The 'default' namespace row is inserted by `rails generate active_fedora:noid:seed` or autofilled by instance below.
|
30
43
|
# If you want another namespace, edit your config initialzer to something like:
|
31
44
|
# ActiveFedora::Noid.config.namespace = 'druid'
|
32
45
|
# ActiveFedora::Noid.config.template = '.reeedek'
|
@@ -35,14 +48,15 @@ module ActiveFedora
|
|
35
48
|
def next_id
|
36
49
|
id = nil
|
37
50
|
MinterState.transaction do
|
38
|
-
|
39
|
-
minter = ::Noid::Minter.new(
|
51
|
+
locked = instance
|
52
|
+
minter = ::Noid::Minter.new(deserialize(locked))
|
40
53
|
id = minter.mint
|
41
|
-
|
54
|
+
serialize(locked, minter)
|
42
55
|
end # transaction
|
43
56
|
id
|
44
57
|
end
|
45
58
|
|
59
|
+
# @return [MinterState]
|
46
60
|
def instance
|
47
61
|
MinterState.lock.find_by!(
|
48
62
|
namespace: ActiveFedora::Noid.config.namespace,
|
data/spec/spec_helper.rb
CHANGED
@@ -14,14 +14,9 @@ shared_examples 'a minter' do
|
|
14
14
|
expect(described_class.new.valid?(subject)).to be true
|
15
15
|
end
|
16
16
|
|
17
|
-
it 'is invalid under a different template' do
|
18
|
-
expect(described_class.new('.reedddk').valid?(subject)).to be false
|
19
|
-
end
|
20
|
-
|
21
17
|
context 'with a different template' do
|
22
|
-
|
23
|
-
|
24
|
-
expect(other).not_to be_valid(minter.mint)
|
18
|
+
it 'is invalid' do
|
19
|
+
expect(described_class.new('.reedddk').valid?(subject)).to be false
|
25
20
|
end
|
26
21
|
end
|
27
22
|
end
|
data/spec/unit/db_minter_spec.rb
CHANGED
@@ -64,13 +64,23 @@ describe ActiveFedora::Noid::Minter::Db do
|
|
64
64
|
let(:starting_state) { db_minter.read }
|
65
65
|
let(:minter) { Noid::Minter.new(starting_state) }
|
66
66
|
before { minter.mint }
|
67
|
+
|
67
68
|
it 'changes the state of the minter' do
|
68
|
-
expect { db_minter.write!(minter) }
|
69
|
-
.from(starting_state[:seq]).to(minter.seq)
|
70
|
-
.and change { db_minter.read[:counters] }
|
71
|
-
.from(starting_state[:
|
72
|
-
|
73
|
-
|
69
|
+
expect { db_minter.write!(minter) }
|
70
|
+
.to change { db_minter.read[:seq] }.from(starting_state[:seq]).to(minter.seq)
|
71
|
+
.and change { db_minter.read[:counters] }.from(starting_state[:counters]).to(minter.counters)
|
72
|
+
.and change { db_minter.read[:rand] }.from(starting_state[:rand]).to(Marshal.dump(minter.instance_variable_get(:@rand)))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#next_id' do
|
77
|
+
let(:stub_minter) { described_class.new }
|
78
|
+
let(:locked) { MinterState }
|
79
|
+
|
80
|
+
it 'locks DB row and does not query twice' do
|
81
|
+
expect(MinterState).to receive(:lock).and_return(locked).once
|
82
|
+
expect(locked).to receive(:find_by!).once.and_return(MinterState.first)
|
83
|
+
stub_minter.send(:next_id)
|
74
84
|
end
|
75
85
|
end
|
76
86
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_fedora-noid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael J. Giarlo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01
|
11
|
+
date: 2017-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active-fedora
|
@@ -82,16 +82,16 @@ dependencies:
|
|
82
82
|
name: rake
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- - "
|
85
|
+
- - ">="
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version: '11
|
87
|
+
version: '11'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
|
-
- - "
|
92
|
+
- - ">="
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version: '11
|
94
|
+
version: '11'
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
name: rspec
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -227,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
227
|
version: '0'
|
228
228
|
requirements: []
|
229
229
|
rubyforge_project:
|
230
|
-
rubygems_version: 2.
|
230
|
+
rubygems_version: 2.5.1
|
231
231
|
signing_key:
|
232
232
|
specification_version: 4
|
233
233
|
summary: Noid identifier services for ActiveFedora-based applications
|