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.
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+
6
+ script: "rspec"
7
+
8
+ notifications:
9
+ irc: "irc.freenode.org#ndlib"
10
+
11
+ before_install:
12
+ - gem install bundler
data/Gemfile CHANGED
@@ -2,3 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in hydra-remote_identifier.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'guard-rspec'
8
+ gem 'ruby_gntp'
9
+ end
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Hydra::RemoteIdentifier
2
2
 
3
- TODO: Write a gem description
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
- TODO: Write usage instructions here
22
+ In your `./config/initializers` add a file that registers remote identification
23
+ services for a list of models.
22
24
 
23
- ## Contributing
24
-
25
- 1. Fork it
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
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
- def register(remote_service, target_class, &block)
7
- Registration.new(remote_service, target_class, &block)
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 :service_class, :mapper
6
- def initialize(service_class, mapper_builder = Mapper, &map_config)
7
- @service_class = service_class
8
- @mapper = mapper_builder.new(service_class, &map_config)
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(service_class.new, wrap(target))
18
+ minter.call(remote_service, wrap(target))
16
19
  end
17
20
 
18
21
  private
@@ -1,4 +1,5 @@
1
1
  require 'active_support/core_ext/class/attribute'
2
+ require File.expand_path('../minting_coordinator', __FILE__)
2
3
 
3
4
  module Hydra::RemoteIdentifier
4
5
 
@@ -7,8 +7,9 @@ module Hydra::RemoteIdentifier
7
7
  # payload.
8
8
  class RemoteService
9
9
 
10
- def self.valid_attribute?(attribute_name)
11
- true
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)
@@ -0,0 +1,5 @@
1
+ module Hydra::RemoteIdentifier
2
+ module RemoteServices
3
+ # For namespace
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  module Hydra
2
2
  module RemoteIdentifier
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -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(:service_class) { Class.new { def self.valid_attribute?(*); true; end } }
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(service_class, mapper_builder, &map) }
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(kind_of(service_class), :wrapped_target)
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(remote_service, target_class, minting_coordinator) }.to raise_error(RuntimeError)
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(remote_service, target_class, minting_coordinator, &map)
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(remote_service, target_class, minting_coordinator, &map)
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(remote_service, target_class, minting_coordinator, &map)
22
+ Registration.new(:my_remote_service, target_class, minting_coordinator, &map)
24
23
  end
25
24
  end
26
25
  end
@@ -7,6 +7,7 @@ module Hydra::RemoteIdentifier
7
7
  subject { RemoteService.new }
8
8
 
9
9
  it { expect { subject.call(payload) }.to raise_error NotImplementedError }
10
+ it { expect { subject.valid_attribute?(:attribute_name) }.to raise_error NotImplementedError }
10
11
 
11
12
  end
12
13
 
@@ -1,39 +1,63 @@
1
1
  require File.expand_path('../../../../lib/hydra/remote_identifier', __FILE__)
2
2
  module Hydra::RemoteIdentifier
3
3
 
4
- describe '.register' do
5
- let(:remote_service) {
6
- Class.new(RemoteService) {
7
- def self.valid_attribute?(*)
8
- true
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
- def call(payload)
11
- :remote_service_response
12
- end
13
- }
14
- }
15
- let(:target_class) {
16
- Class.new {
17
- attr_reader :identifier
18
- def title; 'a special title'; end
19
- def update_identifier(value); @identifier = value; end
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
- let(:target) { target_class.new }
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
- expect {
31
- target_class.registered_remote_identifier_minters.each do |minter|
32
- minter.call(target)
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
- }.to change(target, :identifier).from(nil).to(:remote_service_response)
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
@@ -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.2
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-09-27 00:00:00.000000000 Z
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: 2.0.3
176
+ rubygems_version: 1.8.25
126
177
  signing_key:
127
- specification_version: 4
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