hydra-remote_identifier 0.0.2 → 0.0.3
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.
- data/.travis.yml +12 -0
- data/Gemfile +5 -0
- data/Guardfile +8 -0
- data/README.md +9 -9
- data/hydra-remote_identifier.gemspec +2 -0
- data/lib/hydra/remote_identifier.rb +44 -3
- data/lib/hydra/remote_identifier/minting_coordinator.rb +8 -5
- data/lib/hydra/remote_identifier/registration.rb +1 -0
- data/lib/hydra/remote_identifier/remote_service.rb +3 -2
- data/lib/hydra/remote_identifier/remote_services.rb +5 -0
- data/lib/hydra/remote_identifier/version.rb +1 -1
- data/spec/lib/hydra/remote_identifier/minting_coordinator_spec.rb +3 -3
- data/spec/lib/hydra/remote_identifier/registration_spec.rb +4 -5
- data/spec/lib/hydra/remote_identifier/remote_service_spec.rb +1 -0
- data/spec/lib/hydra/remote_identifier_spec.rb +50 -26
- data/spec/spec_helper.rb +3 -0
- metadata +65 -13
- checksums.yaml +0 -7
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Guardfile
ADDED
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Hydra::RemoteIdentifier
|
2
2
|
|
3
|
-
|
3
|
+
Coordinate the registration and minting of remote identifiers for persisted
|
4
|
+
objects.
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
@@ -18,12 +19,11 @@ Or install it yourself as:
|
|
18
19
|
|
19
20
|
## Usage
|
20
21
|
|
21
|
-
|
22
|
+
In your `./config/initializers` add a file that registers remote identification
|
23
|
+
services for a list of models.
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
25
|
+
Hydra::RemoteIdentifier.register(:doi, Book) do |map|
|
26
|
+
map.what {|book| book.title + ": " book.subtitle }
|
27
|
+
map.who :author_name
|
28
|
+
map.set_identifier {|book, value| book.set_doi!(value)}
|
29
|
+
end
|
@@ -23,4 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
24
|
spec.add_development_dependency "rake"
|
25
25
|
spec.add_development_dependency 'rspec'
|
26
|
+
spec.add_development_dependency 'yard'
|
27
|
+
spec.add_development_dependency 'redcarpet'
|
26
28
|
end
|
@@ -1,11 +1,52 @@
|
|
1
1
|
require "hydra/remote_identifier/version"
|
2
2
|
require 'hydra/remote_identifier/registration'
|
3
|
+
require 'hydra/remote_identifier/remote_service'
|
4
|
+
require 'hydra/remote_identifier/remote_services'
|
3
5
|
|
4
6
|
module Hydra::RemoteIdentifier
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
class << self
|
9
|
+
|
10
|
+
# For the given :remote_service_name and :target_classes register the Map
|
11
|
+
# to use for minting a remote identifier for instances of the
|
12
|
+
# :target_classes
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# Hydra::RemoteIdentifier.register(:doi, Book) do |map|
|
16
|
+
# map.what {|book| book.title + ": " book.subtitle }
|
17
|
+
# map.who :author_name
|
18
|
+
# map.set_identifier {|book, value| book.set_doi!(value)}
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# @param remote_service_name [#to_s] the name of a remote service we will
|
22
|
+
# use to mint the corresponding remote identifier
|
23
|
+
# @param target_classes [Array<Class>] a collection of classes who's
|
24
|
+
# instances to which we will assign a remote identifier
|
25
|
+
# @yieldparam map [Map] defines what attributes are required by the
|
26
|
+
# :remote_service as well as what the callback for what the
|
27
|
+
# :remote_resource should do (see Mapper::Wrapper)
|
28
|
+
def register(remote_service_name, *target_classes, &map)
|
29
|
+
Array(target_classes).flatten.compact.each do |target_class|
|
30
|
+
Registration.new(remote_service(remote_service_name), target_class, &map)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
# Given a string retrieve an instance of the corresponding RemoteService.
|
36
|
+
# @param string [#to_s]
|
37
|
+
# @return [RemoteService]
|
38
|
+
def remote_service(string)
|
39
|
+
namespace_for_lookup = RemoteServices
|
40
|
+
remote_service_class_name = string.to_s.gsub(/(?:^|_)([a-z])/) { $1.upcase }
|
41
|
+
if namespace_for_lookup.const_defined?(remote_service_class_name)
|
42
|
+
namespace_for_lookup.const_get(remote_service_class_name).new
|
43
|
+
else
|
44
|
+
raise NotImplementedError.new(
|
45
|
+
"Unable to find #{self} remote_service '#{string}'. Consider creating #{namespace_for_lookup}::#{remote_service_class_name}"
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
8
50
|
end
|
9
|
-
module_function :register
|
10
51
|
|
11
52
|
end
|
@@ -1,18 +1,21 @@
|
|
1
|
+
require File.expand_path('../mapper', __FILE__)
|
2
|
+
require File.expand_path('../minter', __FILE__)
|
3
|
+
|
1
4
|
module Hydra::RemoteIdentifier
|
2
5
|
|
3
6
|
# The Minting
|
4
7
|
class MintingCoordinator
|
5
|
-
attr_reader :
|
6
|
-
def initialize(
|
7
|
-
@
|
8
|
-
@mapper = mapper_builder.new(
|
8
|
+
attr_reader :remote_service, :mapper
|
9
|
+
def initialize(remote_service, mapper_builder = Mapper, &map_config)
|
10
|
+
@remote_service = remote_service
|
11
|
+
@mapper = mapper_builder.new(remote_service, &map_config)
|
9
12
|
end
|
10
13
|
|
11
14
|
# Responsible for passing attributes from the target, as per the map, to
|
12
15
|
# the service and assigning the result of the service to the target, as per
|
13
16
|
# the map.
|
14
17
|
def call(target, minter = Minter)
|
15
|
-
minter.call(
|
18
|
+
minter.call(remote_service, wrap(target))
|
16
19
|
end
|
17
20
|
|
18
21
|
private
|
@@ -7,8 +7,9 @@ module Hydra::RemoteIdentifier
|
|
7
7
|
# payload.
|
8
8
|
class RemoteService
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def valid_attribute?(attribute_name)
|
11
|
+
raise NotImplementedError,
|
12
|
+
"You must implement #{self.class}#valid_attribute?"
|
12
13
|
end
|
13
14
|
|
14
15
|
def call(payload)
|
@@ -2,14 +2,14 @@ require File.expand_path('../../../../../lib/hydra/remote_identifier/minting_coo
|
|
2
2
|
|
3
3
|
module Hydra::RemoteIdentifier
|
4
4
|
describe MintingCoordinator do
|
5
|
-
let(:
|
5
|
+
let(:remote_service) { Class.new { def self.valid_attribute?(*); true; end } }
|
6
6
|
let(:mapper_builder) { double(new: double(call: :wrapped_target)) }
|
7
7
|
let(:target) { double }
|
8
8
|
let(:map) { lambda {|*|} }
|
9
|
-
subject { MintingCoordinator.new(
|
9
|
+
subject { MintingCoordinator.new(remote_service, mapper_builder, &map) }
|
10
10
|
it 'forward delegates call to the minter' do
|
11
11
|
minter = double
|
12
|
-
minter.should_receive(:call).with(
|
12
|
+
minter.should_receive(:call).with(remote_service, :wrapped_target)
|
13
13
|
subject.call(target, minter)
|
14
14
|
end
|
15
15
|
end
|
@@ -3,24 +3,23 @@ module Hydra::RemoteIdentifier
|
|
3
3
|
|
4
4
|
describe Registration do
|
5
5
|
let(:minting_coordinator) { double(new: :minting_coordinator) }
|
6
|
-
let(:remote_service) { RemoteService }
|
7
6
|
let(:target_class) { Class.new }
|
8
7
|
let(:map) { lambda {|m| m.title :title } }
|
9
8
|
it 'requires a map' do
|
10
|
-
expect { Registration.new(
|
9
|
+
expect { Registration.new(:my_remote_service, target_class, minting_coordinator) }.to raise_error(RuntimeError)
|
11
10
|
end
|
12
11
|
it 'adds a .registered_remote_identifier_minters method' do
|
13
12
|
expect {
|
14
|
-
Registration.new(
|
13
|
+
Registration.new(:my_remote_service, target_class, minting_coordinator, &map)
|
15
14
|
}.to change{ target_class.respond_to?(:registered_remote_identifier_minters) }.from(false).to(true)
|
16
15
|
end
|
17
16
|
it 'adds a .registered_remote_identifier_minters method' do
|
18
|
-
Registration.new(
|
17
|
+
Registration.new(:my_remote_service, target_class, minting_coordinator, &map)
|
19
18
|
expect(target_class.registered_remote_identifier_minters).to eq [:minting_coordinator]
|
20
19
|
end
|
21
20
|
|
22
21
|
it 'should yield a map' do
|
23
|
-
Registration.new(
|
22
|
+
Registration.new(:my_remote_service, target_class, minting_coordinator, &map)
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
@@ -1,39 +1,63 @@
|
|
1
1
|
require File.expand_path('../../../../lib/hydra/remote_identifier', __FILE__)
|
2
2
|
module Hydra::RemoteIdentifier
|
3
3
|
|
4
|
-
describe '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
describe 'with custom remote service' do
|
5
|
+
around do |example|
|
6
|
+
module RemoteServices
|
7
|
+
class MyRemoteService < ::Hydra::RemoteIdentifier::RemoteService
|
8
|
+
def valid_attribute?(*)
|
9
|
+
true
|
10
|
+
end
|
11
|
+
def call(payload)
|
12
|
+
:remote_service_response
|
13
|
+
end
|
9
14
|
end
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
end
|
16
|
+
example.run
|
17
|
+
RemoteServices.send(:remove_const, :MyRemoteService)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.register' do
|
21
|
+
|
22
|
+
let(:target_class) {
|
23
|
+
Class.new {
|
24
|
+
attr_reader :identifier
|
25
|
+
def title; 'a special title'; end
|
26
|
+
def update_identifier(value); @identifier = value; end
|
27
|
+
}
|
20
28
|
}
|
21
|
-
|
22
|
-
|
29
|
+
let(:target) { target_class.new }
|
30
|
+
|
31
|
+
it 'should update the registered identifier based on the registered attributes' do
|
32
|
+
Hydra::RemoteIdentifier.register(:my_remote_service, target_class) do |config|
|
33
|
+
config.title :title
|
34
|
+
config.set_identifier :update_identifier
|
35
|
+
end
|
36
|
+
|
37
|
+
expect {
|
38
|
+
target_class.registered_remote_identifier_minters.each do |minter|
|
39
|
+
minter.call(target)
|
40
|
+
end
|
41
|
+
}.to change(target, :identifier).from(nil).to(:remote_service_response)
|
23
42
|
|
24
|
-
it 'should update the registered identifier based on the registered attributes' do
|
25
|
-
Hydra::RemoteIdentifier.register(remote_service, target_class) do |config|
|
26
|
-
config.title :title
|
27
|
-
config.set_identifier :update_identifier
|
28
43
|
end
|
44
|
+
end
|
29
45
|
|
30
|
-
|
31
|
-
|
32
|
-
|
46
|
+
describe '.remote_service' do
|
47
|
+
context 'with valid remote service' do
|
48
|
+
subject { Hydra::RemoteIdentifier.remote_service(:my_remote_service) }
|
49
|
+
it 'should return an instance of that service' do
|
50
|
+
expect(subject).to be_instance_of RemoteServices::MyRemoteService
|
33
51
|
end
|
34
|
-
|
35
|
-
|
52
|
+
end
|
53
|
+
context 'with invalid remote service' do
|
54
|
+
subject { Hydra::RemoteIdentifier.remote_service(:undefined_service) }
|
55
|
+
it 'should raise a NotImplementedError' do
|
56
|
+
expect { subject }.to raise_error NotImplementedError
|
57
|
+
end
|
58
|
+
end
|
36
59
|
end
|
60
|
+
|
37
61
|
end
|
38
62
|
|
39
63
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
GEM_ROOT = File.expand_path("../../", __FILE__)
|
2
|
+
$:.unshift File.join(GEM_ROOT, "lib")
|
3
|
+
|
1
4
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
5
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
6
|
# Require this file using `require "spec_helper"` to ensure that it is only
|
metadata
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hydra-remote_identifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Jeremy Friesen
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
+
date: 2013-10-02 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: activesupport
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: 3.2.13
|
20
22
|
- - <
|
@@ -23,8 +25,9 @@ dependencies:
|
|
23
25
|
type: :runtime
|
24
26
|
prerelease: false
|
25
27
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
26
29
|
requirements:
|
27
|
-
- - '>='
|
30
|
+
- - ! '>='
|
28
31
|
- !ruby/object:Gem::Version
|
29
32
|
version: 3.2.13
|
30
33
|
- - <
|
@@ -33,6 +36,7 @@ dependencies:
|
|
33
36
|
- !ruby/object:Gem::Dependency
|
34
37
|
name: bundler
|
35
38
|
requirement: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
36
40
|
requirements:
|
37
41
|
- - ~>
|
38
42
|
- !ruby/object:Gem::Version
|
@@ -40,6 +44,7 @@ dependencies:
|
|
40
44
|
type: :development
|
41
45
|
prerelease: false
|
42
46
|
version_requirements: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
43
48
|
requirements:
|
44
49
|
- - ~>
|
45
50
|
- !ruby/object:Gem::Version
|
@@ -47,29 +52,65 @@ dependencies:
|
|
47
52
|
- !ruby/object:Gem::Dependency
|
48
53
|
name: rake
|
49
54
|
requirement: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
50
56
|
requirements:
|
51
|
-
- - '>='
|
57
|
+
- - ! '>='
|
52
58
|
- !ruby/object:Gem::Version
|
53
59
|
version: '0'
|
54
60
|
type: :development
|
55
61
|
prerelease: false
|
56
62
|
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
57
64
|
requirements:
|
58
|
-
- - '>='
|
65
|
+
- - ! '>='
|
59
66
|
- !ruby/object:Gem::Version
|
60
67
|
version: '0'
|
61
68
|
- !ruby/object:Gem::Dependency
|
62
69
|
name: rspec
|
63
70
|
requirement: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
64
72
|
requirements:
|
65
|
-
- - '>='
|
73
|
+
- - ! '>='
|
66
74
|
- !ruby/object:Gem::Version
|
67
75
|
version: '0'
|
68
76
|
type: :development
|
69
77
|
prerelease: false
|
70
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
71
80
|
requirements:
|
72
|
-
- - '>='
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: yard
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: redcarpet
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ! '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
type: :development
|
109
|
+
prerelease: false
|
110
|
+
version_requirements: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ! '>='
|
73
114
|
- !ruby/object:Gem::Version
|
74
115
|
version: '0'
|
75
116
|
description: Handles the registration and minting of remote identifiers (i.e. DOI,
|
@@ -82,7 +123,9 @@ extra_rdoc_files: []
|
|
82
123
|
files:
|
83
124
|
- .gitignore
|
84
125
|
- .rspec
|
126
|
+
- .travis.yml
|
85
127
|
- Gemfile
|
128
|
+
- Guardfile
|
86
129
|
- LICENSE
|
87
130
|
- README.md
|
88
131
|
- Rakefile
|
@@ -94,6 +137,7 @@ files:
|
|
94
137
|
- lib/hydra/remote_identifier/minting_coordinator.rb
|
95
138
|
- lib/hydra/remote_identifier/registration.rb
|
96
139
|
- lib/hydra/remote_identifier/remote_service.rb
|
140
|
+
- lib/hydra/remote_identifier/remote_services.rb
|
97
141
|
- lib/hydra/remote_identifier/version.rb
|
98
142
|
- spec/lib/hydra/remote_identifier/mapper_spec.rb
|
99
143
|
- spec/lib/hydra/remote_identifier/minter_spec.rb
|
@@ -105,26 +149,33 @@ files:
|
|
105
149
|
homepage: https://github.com/jeremyf/hydra-remote_identifier
|
106
150
|
licenses:
|
107
151
|
- APACHE2
|
108
|
-
metadata: {}
|
109
152
|
post_install_message:
|
110
153
|
rdoc_options: []
|
111
154
|
require_paths:
|
112
155
|
- lib
|
113
156
|
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
none: false
|
114
158
|
requirements:
|
115
|
-
- - '>='
|
159
|
+
- - ! '>='
|
116
160
|
- !ruby/object:Gem::Version
|
117
161
|
version: '0'
|
162
|
+
segments:
|
163
|
+
- 0
|
164
|
+
hash: 1218886598798334275
|
118
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
|
+
none: false
|
119
167
|
requirements:
|
120
|
-
- - '>='
|
168
|
+
- - ! '>='
|
121
169
|
- !ruby/object:Gem::Version
|
122
170
|
version: '0'
|
171
|
+
segments:
|
172
|
+
- 0
|
173
|
+
hash: 1218886598798334275
|
123
174
|
requirements: []
|
124
175
|
rubyforge_project:
|
125
|
-
rubygems_version:
|
176
|
+
rubygems_version: 1.8.25
|
126
177
|
signing_key:
|
127
|
-
specification_version:
|
178
|
+
specification_version: 3
|
128
179
|
summary: Handles the registration and minting of remote identifiers (i.e. DOI, ARK,
|
129
180
|
ORCID)
|
130
181
|
test_files:
|
@@ -135,3 +186,4 @@ test_files:
|
|
135
186
|
- spec/lib/hydra/remote_identifier/remote_service_spec.rb
|
136
187
|
- spec/lib/hydra/remote_identifier_spec.rb
|
137
188
|
- spec/spec_helper.rb
|
189
|
+
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: c212f0c8fbb12faf3510a14674d470e79475cc28
|
4
|
-
data.tar.gz: 28b81cd39c16f2c191c79ce226bfc7f333718c82
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: ef7b1d1f3f40c22b6169a456814ae2dce2925a1f66fba6fb51a7ae0ad92891a8ad3cb212db376312420ea9209b34663210a6f224d2041d1a07df2cd8e944b4c0
|
7
|
-
data.tar.gz: 38c365ad04bea7a1452900aea09090441bb309757254b5024a223533302ce473766911be6d41e15e7ec07a012768f4095ed4dcdc496172618c1abc1c7b925490
|