ezid-client 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile +2 -1
- data/README.md +6 -1
- data/VERSION +1 -1
- data/ezid-client.gemspec +1 -1
- data/lib/ezid/identifier.rb +37 -11
- data/lib/ezid/metadata.rb +3 -26
- data/lib/ezid/metadata_elements.rb +80 -24
- data/spec/integration/client_spec.rb +66 -0
- data/spec/integration/identifier_spec.rb +21 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/{lib/ezid → unit}/client_spec.rb +4 -62
- data/spec/{lib/ezid → unit}/identifier_spec.rb +4 -20
- data/spec/unit/metadata_elements_spec.rb +43 -0
- data/spec/unit/metadata_spec.rb +141 -0
- metadata +28 -22
- data/spec/lib/ezid/metadata_spec.rb +0 -288
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0b9d3dc7c1df7191bb249e09e448ef6a5f55957
|
4
|
+
data.tar.gz: 18456cea4f31aa57fe04e7aa8f2c60c9d05eb1a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a97573030689afb7beef02c8cc3d38a3b0efd830537ff780f51a20211a3cb1dd19cf78a06d17aa87bcf59664d3062bdbfc40f039f3ce6b4c85874887e898b944
|
7
|
+
data.tar.gz: 49ead39cafe8695052078fa86c92f17f21679240cc83d78f010bf9a95c88126024fb380b3ec1b37584723a67938e663559900357988db15a5248526846f65c12
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
EZID API Version 2 bindings. See http://ezid.cdlib.org/doc/apidoc.html.
|
4
4
|
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/ezid-client.svg)](http://badge.fury.io/rb/ezid-client)
|
6
|
+
[![Build Status](https://travis-ci.org/duke-libraries/ezid-client.svg?branch=master)](https://travis-ci.org/duke-libraries/ezid-client)
|
7
|
+
|
5
8
|
## Installation
|
6
9
|
|
7
10
|
Add this line to your application's Gemfile:
|
@@ -16,7 +19,9 @@ Or install it yourself as:
|
|
16
19
|
|
17
20
|
$ gem install ezid-client
|
18
21
|
|
19
|
-
## Resource-oriented Usage (CRUD)
|
22
|
+
## Basic Resource-oriented Usage (CRUD)
|
23
|
+
|
24
|
+
See the test suite for more examples.
|
20
25
|
|
21
26
|
Create (Mint)
|
22
27
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
data/ezid-client.gemspec
CHANGED
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "ezid-client"
|
7
7
|
spec.version = File.read(File.expand_path("../VERSION", __FILE__)).chomp
|
8
|
-
spec.authors = ["
|
8
|
+
spec.authors = ["David Chandek-Stark"]
|
9
9
|
spec.email = ["dchandekstark@gmail.com"]
|
10
10
|
spec.summary = "Ruby client for EZID API Version 2"
|
11
11
|
spec.description = "Ruby client for EZID API Version 2 (http://ezid.cdlib.org/doc/apidoc.html)"
|
data/lib/ezid/identifier.rb
CHANGED
@@ -1,16 +1,25 @@
|
|
1
1
|
module Ezid
|
2
|
+
#
|
3
|
+
# Represents an EZID identifier as a resource.
|
4
|
+
#
|
5
|
+
# @api public
|
6
|
+
#
|
2
7
|
class Identifier
|
3
8
|
|
4
9
|
attr_reader :id, :client
|
5
10
|
attr_accessor :shoulder, :metadata
|
6
11
|
|
12
|
+
# Attributes to display on inspect
|
7
13
|
INSPECT_ATTRS = %w( id status target created )
|
8
14
|
|
15
|
+
# EZID status terms
|
9
16
|
PUBLIC = "public"
|
10
17
|
RESERVED = "reserved"
|
11
18
|
UNAVAILABLE = "unavailable"
|
12
19
|
|
13
20
|
class << self
|
21
|
+
# Creates or mints an identifier (depending on arguments)
|
22
|
+
# @see #save
|
14
23
|
# @return [Ezid::Identifier] the new identifier
|
15
24
|
# @raise [Ezid::Error]
|
16
25
|
def create(attrs = {})
|
@@ -18,6 +27,7 @@ module Ezid
|
|
18
27
|
identifier.save
|
19
28
|
end
|
20
29
|
|
30
|
+
# Retrieves an identifier
|
21
31
|
# @return [Ezid::Identifier] the identifier
|
22
32
|
# @raise [Ezid::Error] if the identifier does not exist in EZID
|
23
33
|
def find(id)
|
@@ -31,7 +41,7 @@ module Ezid
|
|
31
41
|
@id = args.delete(:id)
|
32
42
|
@shoulder = args.delete(:shoulder)
|
33
43
|
@metadata = Metadata.new(args.delete(:metadata))
|
34
|
-
|
44
|
+
update_metadata(args)
|
35
45
|
@deleted = false
|
36
46
|
end
|
37
47
|
|
@@ -65,8 +75,12 @@ module Ezid
|
|
65
75
|
reload
|
66
76
|
end
|
67
77
|
|
68
|
-
|
78
|
+
# Updates the metadata
|
79
|
+
# @param attrs [Hash] the metadata
|
80
|
+
# @return [Ezid::Identifier] the identifier
|
81
|
+
def update_metadata(attrs={})
|
69
82
|
attrs.each { |k, v| send("#{k}=", v) }
|
83
|
+
self
|
70
84
|
end
|
71
85
|
|
72
86
|
# Is the identifier persisted?
|
@@ -82,13 +96,16 @@ module Ezid
|
|
82
96
|
@deleted
|
83
97
|
end
|
84
98
|
|
99
|
+
# Updates the metadata and saves the identifier
|
100
|
+
# @param data [Hash] a hash of metadata
|
85
101
|
# @return [Ezid::Identifier] the identifier
|
86
102
|
# @raise [Ezid::Error]
|
87
|
-
def update(data)
|
88
|
-
|
103
|
+
def update(data={})
|
104
|
+
update_metadata(data)
|
89
105
|
save
|
90
106
|
end
|
91
107
|
|
108
|
+
# Reloads the metadata from EZID (local changes will be lost!)
|
92
109
|
# @return [Ezid::Identifier] the identifier
|
93
110
|
# @raise [Ezid::Error]
|
94
111
|
def reload
|
@@ -96,13 +113,14 @@ module Ezid
|
|
96
113
|
self
|
97
114
|
end
|
98
115
|
|
99
|
-
# Empties the (local) metadata
|
116
|
+
# Empties the (local) metadata (changes will be lost!)
|
100
117
|
# @return [Ezid::Identifier] the identifier
|
101
118
|
def reset
|
102
119
|
clear_metadata
|
103
120
|
self
|
104
121
|
end
|
105
122
|
|
123
|
+
# Deletes the identifier from EZID
|
106
124
|
# @return [Ezid::Identifier] the identifier
|
107
125
|
# @raise [Ezid::Error]
|
108
126
|
def delete
|
@@ -112,28 +130,36 @@ module Ezid
|
|
112
130
|
reset
|
113
131
|
end
|
114
132
|
|
115
|
-
|
116
|
-
|
117
|
-
super
|
118
|
-
end
|
119
|
-
|
133
|
+
# Is the identifier reserved?
|
134
|
+
# @return [Boolean]
|
120
135
|
def reserved?
|
121
136
|
status == RESERVED
|
122
137
|
end
|
123
138
|
|
139
|
+
# Is the identifier public?
|
140
|
+
# @return [Boolean]
|
124
141
|
def public?
|
125
142
|
status == PUBLIC
|
126
143
|
end
|
127
144
|
|
145
|
+
# Is the identifier unavailable?
|
146
|
+
# @return [Boolean]
|
128
147
|
def unavailable?
|
129
148
|
status == UNAVAILABLE
|
130
149
|
end
|
131
150
|
|
151
|
+
protected
|
152
|
+
|
153
|
+
def method_missing(name, *args)
|
154
|
+
return metadata.send(name, *args) if metadata.respond_to?(name)
|
155
|
+
super
|
156
|
+
end
|
157
|
+
|
132
158
|
private
|
133
159
|
|
134
160
|
def refresh_metadata
|
135
161
|
response = client.get_identifier_metadata(id)
|
136
|
-
@metadata.
|
162
|
+
@metadata = Metadata.new(response.metadata)
|
137
163
|
end
|
138
164
|
|
139
165
|
def clear_metadata
|
data/lib/ezid/metadata.rb
CHANGED
@@ -54,36 +54,13 @@ module Ezid
|
|
54
54
|
to_anvl
|
55
55
|
end
|
56
56
|
|
57
|
-
# Adds metadata to the collection
|
58
|
-
# @param data [String, Hash, Ezid::Metadata] the data to add
|
59
|
-
# @return [Ezid::Metadata] the updated metadata
|
60
|
-
def update(data)
|
61
|
-
__getobj__.update(coerce(data))
|
62
|
-
self
|
63
|
-
end
|
64
|
-
|
65
|
-
# Replaces the collection with new metadata
|
66
|
-
# @param data [String, Hash, Ezid::Metadata] the metadata replacing the current metadata
|
67
|
-
# @return [Ezid::Metadata] the replaced metadata
|
68
|
-
def replace(data)
|
69
|
-
__getobj__.replace(coerce(data))
|
70
|
-
self
|
71
|
-
end
|
72
|
-
|
73
57
|
private
|
74
58
|
|
75
59
|
# Coerce data into a Hash of elements
|
76
60
|
def coerce(data)
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
coerce_string(data)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# Coerce hash keys to strings
|
85
|
-
def stringify_keys(hsh)
|
86
|
-
hsh.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v }
|
61
|
+
data.to_h
|
62
|
+
rescue NoMethodError
|
63
|
+
coerce_string(data)
|
87
64
|
end
|
88
65
|
|
89
66
|
# Escape elements hash keys and values
|
@@ -1,43 +1,85 @@
|
|
1
1
|
require "active_support"
|
2
2
|
|
3
3
|
module Ezid
|
4
|
+
#
|
5
|
+
# EZID metadata elements
|
6
|
+
#
|
7
|
+
# @note Intended to be used only as included in Ezid::Metadata.
|
8
|
+
#
|
4
9
|
module MetadataElements
|
5
10
|
extend ActiveSupport::Concern
|
6
11
|
|
7
|
-
|
8
|
-
|
9
|
-
|
12
|
+
# Metadata profiles
|
13
|
+
PROFILES = {
|
14
|
+
"dc" => %w( creator title publisher date type ).freeze,
|
15
|
+
"datacite" => %w( creator title publisher publicationyear resourcetype ).freeze,
|
16
|
+
"erc" => %w( who what when ).freeze,
|
17
|
+
"crossref" => [].freeze
|
18
|
+
}
|
10
19
|
|
20
|
+
# Elements for metadata profiles (values may include multiple elements)
|
21
|
+
PROFILE_ELEMENTS = PROFILES.keys - ["dc"]
|
22
|
+
|
23
|
+
# EZID reserved metadata elements that have time values
|
24
|
+
# @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
|
11
25
|
RESERVED_TIME_ELEMENTS = %w( _created _updated )
|
26
|
+
|
27
|
+
# EZID reserved metadata elements that are read-only
|
28
|
+
# @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
|
12
29
|
RESERVED_READONLY_ELEMENTS = %w( _owner _ownergroup _shadows _shadowedby _datacenter _created _updated )
|
30
|
+
|
31
|
+
# EZID reserved metadata elements that may be set by clients
|
32
|
+
# @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
|
13
33
|
RESERVED_READWRITE_ELEMENTS = %w( _coowners _target _profile _status _export _crossref )
|
34
|
+
|
35
|
+
# All EZID reserved metadata elements
|
36
|
+
# @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
|
14
37
|
RESERVED_ELEMENTS = RESERVED_READONLY_ELEMENTS + RESERVED_READWRITE_ELEMENTS + RESERVED_TIME_ELEMENTS
|
15
38
|
|
16
39
|
included do
|
17
|
-
|
18
|
-
|
19
|
-
|
40
|
+
# "_crossref" does not get a reserved accessor because of the "crossref" element.
|
41
|
+
reserved_element_accessor *(RESERVED_READWRITE_ELEMENTS - ["_crossref"])
|
42
|
+
reserved_element_reader *(RESERVED_READONLY_ELEMENTS - RESERVED_TIME_ELEMENTS)
|
43
|
+
reserved_element_time_reader *RESERVED_TIME_ELEMENTS
|
20
44
|
|
21
|
-
|
22
|
-
profile_accessor :datacite, *DATACITE_ELEMENTS
|
23
|
-
profile_accessor :erc, *ERC_ELEMENTS
|
45
|
+
profile_element_accessors
|
24
46
|
|
25
|
-
element_accessor
|
47
|
+
element_accessor *PROFILE_ELEMENTS
|
48
|
+
|
49
|
+
# "_crossref" does not get a reserved accessor because of the "crossref" element.
|
50
|
+
element_accessor "_crossref"
|
26
51
|
end
|
27
52
|
|
28
53
|
module ClassMethods
|
29
|
-
|
30
|
-
|
31
|
-
|
54
|
+
# Creates an accessor for each reserved element
|
55
|
+
# @see .reserved_element_reader
|
56
|
+
# @see .reserved_element_writer
|
57
|
+
# @param elements [Array<String>] a list of elements
|
58
|
+
def reserved_element_accessor(*elements)
|
59
|
+
reserved_element_reader(*elements)
|
60
|
+
reserved_element_writer(*elements)
|
32
61
|
end
|
33
62
|
|
34
|
-
|
63
|
+
# Creates a reader for each reserved element
|
64
|
+
# The leading underscore of the element is removed from the reader name
|
65
|
+
# -- e.g.
|
66
|
+
#
|
67
|
+
# def status
|
68
|
+
# reader("_status")
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# @param elements [Array<String>] a list of elements
|
72
|
+
def reserved_element_reader(*elements)
|
35
73
|
elements.each do |element|
|
36
74
|
define_method(element.sub("_", "")) { reader(element) }
|
37
75
|
end
|
38
76
|
end
|
39
77
|
|
40
|
-
|
78
|
+
# Creates a reader for each time-based reserved element
|
79
|
+
# The reader will return a Time instance for the value (or nil if not present)
|
80
|
+
# @see .reserved_element_reader
|
81
|
+
# @param elements [Array<String>] a list of elements
|
82
|
+
def reserved_element_time_reader(*elements)
|
41
83
|
elements.each do |element|
|
42
84
|
define_method(element.sub("_", "")) do
|
43
85
|
time = reader(element).to_i
|
@@ -47,7 +89,16 @@ module Ezid
|
|
47
89
|
end
|
48
90
|
end
|
49
91
|
|
50
|
-
|
92
|
+
# Creates a writer for each reserved element
|
93
|
+
# The leading underscore of the element is removed from the reader name
|
94
|
+
# -- e.g.
|
95
|
+
#
|
96
|
+
# def status=(value)
|
97
|
+
# writer("_status", value)
|
98
|
+
# end
|
99
|
+
#
|
100
|
+
# @param elements [Array<String>] a list of elements
|
101
|
+
def reserved_element_writer(*elements)
|
51
102
|
elements.each do |element|
|
52
103
|
define_method("#{element.sub('_', '')}=") do |value|
|
53
104
|
writer(element, value)
|
@@ -55,18 +106,23 @@ module Ezid
|
|
55
106
|
end
|
56
107
|
end
|
57
108
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
109
|
+
# Creates a accessors for all metadata profile elements
|
110
|
+
def profile_element_accessors
|
111
|
+
PROFILES.each do |profile, elements|
|
112
|
+
elements.each do |element|
|
113
|
+
define_method("#{profile}_#{element}") do
|
114
|
+
reader("#{profile}.#{element}")
|
115
|
+
end
|
63
116
|
|
64
|
-
|
65
|
-
|
66
|
-
|
117
|
+
define_method("#{profile}_#{element}=") do |value|
|
118
|
+
writer("#{profile}.#{element}", value)
|
119
|
+
end
|
120
|
+
end
|
67
121
|
end
|
68
122
|
end
|
69
123
|
|
124
|
+
# Creates an accessor for each element
|
125
|
+
# @param elements [Array<String>] a list of elements
|
70
126
|
def element_accessor(*elements)
|
71
127
|
elements.each do |element|
|
72
128
|
define_method(element) { reader(element) }
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Ezid
|
2
|
+
RSpec.describe Client, type: :integration do
|
3
|
+
|
4
|
+
shared_examples "an EZID client" do |client|
|
5
|
+
it "should mint and modify" do
|
6
|
+
minted = client.mint_identifier(ARK_SHOULDER, "_status: reserved")
|
7
|
+
expect(minted).to be_success
|
8
|
+
@id = minted.id
|
9
|
+
modified = client.modify_identifier(@id, "dc.title" => "Test")
|
10
|
+
expect(modified).to be_success
|
11
|
+
retrieved = client.get_identifier_metadata(@id)
|
12
|
+
expect(retrieved).to be_success
|
13
|
+
expect(retrieved.metadata).to match(/dc.title: Test/)
|
14
|
+
deleted = client.delete_identifier(@id)
|
15
|
+
expect(deleted).to be_success
|
16
|
+
expect { client.get_identifier_metadata(@id) }.to raise_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "initialization with a block" do
|
21
|
+
it "should wrap the block in a session" do
|
22
|
+
expect_any_instance_of(described_class).to receive(:login).and_call_original
|
23
|
+
expect_any_instance_of(described_class).to receive(:logout).and_call_original
|
24
|
+
described_class.new do |client|
|
25
|
+
expect(client.session).to be_open
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "authentication" do
|
31
|
+
describe "#login" do
|
32
|
+
it "should open a session" do
|
33
|
+
expect(subject.session).to be_closed
|
34
|
+
subject.login
|
35
|
+
expect(subject.session).to be_open
|
36
|
+
end
|
37
|
+
end
|
38
|
+
describe "#logout" do
|
39
|
+
before { subject.login }
|
40
|
+
it "should close the session" do
|
41
|
+
expect(subject.session).to be_open
|
42
|
+
subject.logout
|
43
|
+
expect(subject.session).to be_closed
|
44
|
+
end
|
45
|
+
end
|
46
|
+
describe "without a session" do
|
47
|
+
it "should send the user name and password" do
|
48
|
+
expect_any_instance_of(Net::HTTP::Post).to receive(:basic_auth).with(subject.user, subject.password).and_call_original
|
49
|
+
subject.mint_identifier(ARK_SHOULDER)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "identifier lifecycle management" do
|
55
|
+
describe "with a session" do
|
56
|
+
Client.new do |client|
|
57
|
+
it_behaves_like "an EZID client", client
|
58
|
+
end
|
59
|
+
end
|
60
|
+
describe "without a session" do
|
61
|
+
it_behaves_like "an EZID client", Client.new
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Ezid
|
2
|
+
RSpec.describe Identifier do
|
3
|
+
|
4
|
+
it "should handle CRUD operations", type: :integration do
|
5
|
+
# create (mint)
|
6
|
+
identifier = described_class.create(shoulder: ARK_SHOULDER)
|
7
|
+
expect(identifier.status).to eq("public")
|
8
|
+
# update
|
9
|
+
identifier.target = "http://example.com"
|
10
|
+
identifier.save
|
11
|
+
# retrieve
|
12
|
+
identifier = described_class.find(identifier.id)
|
13
|
+
expect(identifier.target).to eq("http://example.com")
|
14
|
+
# delete
|
15
|
+
identifier = described_class.create(shoulder: ARK_SHOULDER, status: "reserved")
|
16
|
+
identifier.delete
|
17
|
+
expect { described_class.find(identifier.id) }.to raise_error
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,48 +1,13 @@
|
|
1
1
|
module Ezid
|
2
2
|
RSpec.describe Client do
|
3
3
|
|
4
|
-
describe "initialization" do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
described_class.new
|
9
|
-
end
|
10
|
-
end
|
11
|
-
describe "with a block", type: :feature do
|
12
|
-
it "should wrap the block in a session" do
|
13
|
-
expect_any_instance_of(described_class).to receive(:login).and_call_original
|
14
|
-
expect_any_instance_of(described_class).to receive(:logout).and_call_original
|
15
|
-
described_class.new do |client|
|
16
|
-
expect(client.session).to be_open
|
17
|
-
end
|
18
|
-
end
|
4
|
+
describe "initialization without a block" do
|
5
|
+
it "should not login" do
|
6
|
+
expect_any_instance_of(described_class).not_to receive(:login)
|
7
|
+
described_class.new
|
19
8
|
end
|
20
9
|
end
|
21
10
|
|
22
|
-
describe "authentication", type: :feature do
|
23
|
-
describe "#login" do
|
24
|
-
it "should open a session" do
|
25
|
-
expect(subject.session).to be_closed
|
26
|
-
subject.login
|
27
|
-
expect(subject.session).to be_open
|
28
|
-
end
|
29
|
-
end
|
30
|
-
describe "#logout" do
|
31
|
-
before { subject.login }
|
32
|
-
it "should close the session" do
|
33
|
-
expect(subject.session).to be_open
|
34
|
-
subject.logout
|
35
|
-
expect(subject.session).to be_closed
|
36
|
-
end
|
37
|
-
end
|
38
|
-
describe "without a session" do
|
39
|
-
it "should send the user name and password" do
|
40
|
-
expect_any_instance_of(Net::HTTP::Post).to receive(:basic_auth).with(subject.user, subject.password).and_call_original
|
41
|
-
subject.mint_identifier(ARK_SHOULDER)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
11
|
describe "#create_identifier" do
|
47
12
|
let(:id) { "ark:/99999/fk4fn19h88" }
|
48
13
|
let(:http_response) { double(body: "success: ark:/99999/fk4fn19h88") }
|
@@ -121,29 +86,6 @@ EOS
|
|
121
86
|
end
|
122
87
|
end
|
123
88
|
|
124
|
-
describe "#modify_identifier", type: :feature do
|
125
|
-
before do
|
126
|
-
@id = described_class.new.mint_identifier(ARK_SHOULDER).id
|
127
|
-
end
|
128
|
-
subject { described_class.new.modify_identifier(@id, "dc.title" => "Test") }
|
129
|
-
it "should update the metadata" do
|
130
|
-
expect(subject).to be_success
|
131
|
-
response = described_class.new.get_identifier_metadata(@id)
|
132
|
-
expect(response.metadata).to match(/dc.title: Test/)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe "#delete_identifier", type: :feature do
|
137
|
-
before do
|
138
|
-
@id = described_class.new.mint_identifier(ARK_SHOULDER, "_status" => "reserved").id
|
139
|
-
end
|
140
|
-
subject { described_class.new.delete_identifier(@id) }
|
141
|
-
it "should delete the identifier" do
|
142
|
-
expect(subject).to be_success
|
143
|
-
expect { described_class.new.get_identifier_metadata(@id) }.to raise_error
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
89
|
describe "server status" do
|
148
90
|
let(:http_response) do
|
149
91
|
double(body: <<-EOS
|
@@ -61,7 +61,7 @@ module Ezid
|
|
61
61
|
|
62
62
|
describe "#update" do
|
63
63
|
let(:id) { "ark:/99999/fk4fn19h88" }
|
64
|
-
let(:metadata) { {"
|
64
|
+
let(:metadata) { {"status" => "unavailable"} }
|
65
65
|
subject { described_class.new(id: id) }
|
66
66
|
before do
|
67
67
|
allow(subject).to receive(:persisted?) { true }
|
@@ -70,7 +70,7 @@ module Ezid
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
it "should update the metadata" do
|
73
|
-
expect(subject
|
73
|
+
expect(subject).to receive(:update_metadata).with(metadata)
|
74
74
|
subject.update(metadata)
|
75
75
|
end
|
76
76
|
it "should save the identifier" do
|
@@ -86,8 +86,8 @@ module Ezid
|
|
86
86
|
before do
|
87
87
|
allow(subject.client).to receive(:get_identifier_metadata).with(id) { double(metadata: metadata) }
|
88
88
|
end
|
89
|
-
it "should
|
90
|
-
expect(
|
89
|
+
it "should reinitialize the metadata from EZID" do
|
90
|
+
expect(Metadata).to receive(:new).with(metadata)
|
91
91
|
subject.reload
|
92
92
|
end
|
93
93
|
end
|
@@ -183,21 +183,5 @@ module Ezid
|
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
-
it "should handle CRUD operations", type: :feature do
|
187
|
-
# create (mint)
|
188
|
-
identifier = Ezid::Identifier.create(shoulder: ARK_SHOULDER)
|
189
|
-
expect(identifier.status).to eq("public")
|
190
|
-
# update
|
191
|
-
identifier.target = "http://example.com"
|
192
|
-
identifier.save
|
193
|
-
# retrieve
|
194
|
-
identifier = Ezid::Identifier.find(identifier.id)
|
195
|
-
expect(identifier.target).to eq("http://example.com")
|
196
|
-
# delete
|
197
|
-
identifier = Ezid::Identifier.create(shoulder: ARK_SHOULDER, status: "reserved")
|
198
|
-
identifier.delete
|
199
|
-
expect { Ezid::Identifier.find(identifier.id) }.to raise_error
|
200
|
-
end
|
201
|
-
|
202
186
|
end
|
203
187
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "delegate"
|
2
|
+
|
3
|
+
module Ezid
|
4
|
+
RSpec.describe MetadataElements do
|
5
|
+
|
6
|
+
before do
|
7
|
+
class TestMetadata < SimpleDelegator
|
8
|
+
def initialize
|
9
|
+
super(Hash.new)
|
10
|
+
end
|
11
|
+
include MetadataElements
|
12
|
+
end
|
13
|
+
end
|
14
|
+
after do
|
15
|
+
Ezid.remove_const(:TestMetadata)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "reserved reader" do
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "reserved writer" do
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "reserved time reader" do
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "reserved accessor" do
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "profile accessor" do
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "element accessor" do
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module Ezid
|
2
|
+
RSpec.describe Metadata do
|
3
|
+
|
4
|
+
describe "reserved elements" do
|
5
|
+
describe "readers" do
|
6
|
+
Metadata::RESERVED_ELEMENTS.each do |element|
|
7
|
+
next if element == "_crossref"
|
8
|
+
it "should have a reader for '#{element}'" do
|
9
|
+
expect(subject).to receive(:reader).with(element)
|
10
|
+
subject.send(element.sub("_", ""))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
describe "for time-based elements" do
|
14
|
+
Metadata::RESERVED_TIME_ELEMENTS.each do |element|
|
15
|
+
context "\"#{element}\"" do
|
16
|
+
before { subject[element] = "1416507086" }
|
17
|
+
it "should have a reader than returns a Time instance" do
|
18
|
+
expect(subject).to receive(:reader).with(element).and_call_original
|
19
|
+
expect(subject.send(element.sub("_", ""))).to eq(Time.parse("2014-11-20 13:11:26 -0500"))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
describe "writers" do
|
26
|
+
Metadata::RESERVED_READWRITE_ELEMENTS.each do |element|
|
27
|
+
next if element == "_crossref"
|
28
|
+
it "should have a writer for '#{element}'" do
|
29
|
+
expect(subject).to receive(:writer).with(element, "value")
|
30
|
+
subject.send("#{element.sub('_', '')}=", "value")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
describe "metadata profiles" do
|
36
|
+
Metadata::PROFILES.each do |profile, elements|
|
37
|
+
describe "the '#{profile}' metadata profile" do
|
38
|
+
describe "readers" do
|
39
|
+
elements.each do |element|
|
40
|
+
it "should have a reader for '#{profile}.#{element}'" do
|
41
|
+
expect(subject).to receive(:reader).with("#{profile}.#{element}")
|
42
|
+
subject.send("#{profile}_#{element}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
describe "writers" do
|
47
|
+
elements.each do |element|
|
48
|
+
it "should have a writer for '#{profile}.#{element}'" do
|
49
|
+
expect(subject).to receive(:writer).with("#{profile}.#{element}", "value")
|
50
|
+
subject.send("#{profile}_#{element}=", "value")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "ANVL output" do
|
59
|
+
let(:elements) do
|
60
|
+
{ "_target" => "http://example.com/path%20with%20spaces",
|
61
|
+
"_erc" => "who: Proust, Marcel\nwhat: Remembrance of Things Past",
|
62
|
+
"_status" => "public" }
|
63
|
+
end
|
64
|
+
subject { described_class.new(elements) }
|
65
|
+
it "should output the proper format and escape" do
|
66
|
+
expect(subject.to_anvl).to eq("\
|
67
|
+
_target: http://example.com/path%2520with%2520spaces
|
68
|
+
_erc: who: Proust, Marcel%0Awhat: Remembrance of Things Past
|
69
|
+
_status: public")
|
70
|
+
end
|
71
|
+
describe "encoding" do
|
72
|
+
before do
|
73
|
+
subject.each_key { |k| subject[k] = subject[k].force_encoding(Encoding::US_ASCII) }
|
74
|
+
end
|
75
|
+
it "should be encoded in UTF-8" do
|
76
|
+
expect(subject.to_anvl.encoding).to eq(Encoding::UTF_8)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "coercion" do
|
82
|
+
subject { described_class.new(data) }
|
83
|
+
context "of nil" do
|
84
|
+
let(:data) { nil }
|
85
|
+
it "should create an empty hash" do
|
86
|
+
expect(subject).to eq({})
|
87
|
+
end
|
88
|
+
end
|
89
|
+
context "of a string" do
|
90
|
+
let(:data) do <<-EOS
|
91
|
+
_updated: 1416507086
|
92
|
+
_target: http://example.com/path%2520with%2520spaces
|
93
|
+
_profile: erc
|
94
|
+
_erc: who: Proust, Marcel%0Awhat: Remembrance of Things Past
|
95
|
+
_ownergroup: apitest
|
96
|
+
_owner: apitest
|
97
|
+
_export: yes
|
98
|
+
_created: 1416507086
|
99
|
+
_status: public
|
100
|
+
EOS
|
101
|
+
end
|
102
|
+
it "should treat the string as an ANVL document, splitting into keys and values and unescaping" do
|
103
|
+
expect(subject).to eq({ "_updated" => "1416507086",
|
104
|
+
"_target" => "http://example.com/path%20with%20spaces",
|
105
|
+
"_profile" => "erc",
|
106
|
+
"_erc" => "who: Proust, Marcel\nwhat: Remembrance of Things Past",
|
107
|
+
"_ownergroup" => "apitest",
|
108
|
+
"_owner" => "apitest",
|
109
|
+
"_export" => "yes",
|
110
|
+
"_created" => "1416507086",
|
111
|
+
"_status" => "public" })
|
112
|
+
end
|
113
|
+
end
|
114
|
+
context "of a hash-like object" do
|
115
|
+
let(:hsh) do
|
116
|
+
{ "_updated" => "1416507086",
|
117
|
+
"_target" => "http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87",
|
118
|
+
"_profile" => "erc",
|
119
|
+
"_ownergroup" => "apitest",
|
120
|
+
"_owner" => "apitest",
|
121
|
+
"_export" => "yes",
|
122
|
+
"_created" => "1416507086",
|
123
|
+
"_status" => "public" }
|
124
|
+
end
|
125
|
+
context "which is a normal Hash" do
|
126
|
+
let(:data) { hsh }
|
127
|
+
it "should set the metadata to the hash" do
|
128
|
+
expect(subject).to eq(hsh)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
context "which is a Metadata instance" do
|
132
|
+
let(:data) { Metadata.new(hsh) }
|
133
|
+
it "should set the metadata to the hash" do
|
134
|
+
expect(subject).to eq(hsh)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ezid-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- David Chandek-Stark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.6'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '3.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.0'
|
69
69
|
description: Ruby client for EZID API Version 2 (http://ezid.cdlib.org/doc/apidoc.html)
|
@@ -73,9 +73,9 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
|
-
- .rspec
|
78
|
-
- .travis.yml
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
|
+
- ".travis.yml"
|
79
79
|
- Gemfile
|
80
80
|
- LICENSE.txt
|
81
81
|
- README.md
|
@@ -93,10 +93,13 @@ files:
|
|
93
93
|
- lib/ezid/response.rb
|
94
94
|
- lib/ezid/session.rb
|
95
95
|
- lib/ezid/status.rb
|
96
|
-
- spec/
|
97
|
-
- spec/
|
98
|
-
- spec/lib/ezid/metadata_spec.rb
|
96
|
+
- spec/integration/client_spec.rb
|
97
|
+
- spec/integration/identifier_spec.rb
|
99
98
|
- spec/spec_helper.rb
|
99
|
+
- spec/unit/client_spec.rb
|
100
|
+
- spec/unit/identifier_spec.rb
|
101
|
+
- spec/unit/metadata_elements_spec.rb
|
102
|
+
- spec/unit/metadata_spec.rb
|
100
103
|
homepage: https://github.com/duke-libraries/ezid-client
|
101
104
|
licenses:
|
102
105
|
- BSD-3-Clause
|
@@ -107,12 +110,12 @@ require_paths:
|
|
107
110
|
- lib
|
108
111
|
required_ruby_version: !ruby/object:Gem::Requirement
|
109
112
|
requirements:
|
110
|
-
- - ~>
|
113
|
+
- - "~>"
|
111
114
|
- !ruby/object:Gem::Version
|
112
115
|
version: '2.0'
|
113
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
117
|
requirements:
|
115
|
-
- -
|
118
|
+
- - ">="
|
116
119
|
- !ruby/object:Gem::Version
|
117
120
|
version: '0'
|
118
121
|
requirements: []
|
@@ -122,7 +125,10 @@ signing_key:
|
|
122
125
|
specification_version: 4
|
123
126
|
summary: Ruby client for EZID API Version 2
|
124
127
|
test_files:
|
125
|
-
- spec/
|
126
|
-
- spec/
|
127
|
-
- spec/lib/ezid/metadata_spec.rb
|
128
|
+
- spec/integration/client_spec.rb
|
129
|
+
- spec/integration/identifier_spec.rb
|
128
130
|
- spec/spec_helper.rb
|
131
|
+
- spec/unit/client_spec.rb
|
132
|
+
- spec/unit/identifier_spec.rb
|
133
|
+
- spec/unit/metadata_elements_spec.rb
|
134
|
+
- spec/unit/metadata_spec.rb
|
@@ -1,288 +0,0 @@
|
|
1
|
-
module Ezid
|
2
|
-
RSpec.describe Metadata do
|
3
|
-
|
4
|
-
let(:elements) do
|
5
|
-
{ "_updated" => "1416507086",
|
6
|
-
"_target" => "http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87",
|
7
|
-
"_profile" => "erc",
|
8
|
-
"_ownergroup" => "apitest",
|
9
|
-
"_owner" => "apitest",
|
10
|
-
"_export" => "yes",
|
11
|
-
"_created" => "1416507086",
|
12
|
-
"_status" => "public" }
|
13
|
-
end
|
14
|
-
subject { described_class.new(elements) }
|
15
|
-
|
16
|
-
it "should have a non-leading-underscore reader for each reserved element, except '_crossref'" do
|
17
|
-
Metadata::RESERVED_ELEMENTS.each do |element|
|
18
|
-
next if element == "_crossref"
|
19
|
-
expect(subject).to respond_to(element.sub("_", ""))
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "element reader aliases for datetime elements" do
|
24
|
-
it "should return Time values" do
|
25
|
-
expect(subject.created).to eq Time.parse("2014-11-20 13:11:26 -0500")
|
26
|
-
expect(subject.updated).to eq Time.parse("2014-11-20 13:11:26 -0500")
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should have a non-leading-underscore writer for each writable reserved element, except '_crossref'" do
|
31
|
-
Metadata::RESERVED_READWRITE_ELEMENTS.each do |element|
|
32
|
-
next if element == "_crossref"
|
33
|
-
expect(subject).to respond_to("#{element.sub('_', '')}=")
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "#update" do
|
38
|
-
it "should coerce the data"
|
39
|
-
it "should update the delegated hash"
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "#replace" do
|
43
|
-
it "should coerce the data"
|
44
|
-
it "should call `replace' on the delegated hash"
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "ANVL output" do
|
48
|
-
it "should output the proper format" do
|
49
|
-
expect(subject.to_anvl).to eq("\
|
50
|
-
_updated: 1416507086
|
51
|
-
_target: http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87
|
52
|
-
_profile: erc
|
53
|
-
_ownergroup: apitest
|
54
|
-
_owner: apitest
|
55
|
-
_export: yes
|
56
|
-
_created: 1416507086
|
57
|
-
_status: public")
|
58
|
-
end
|
59
|
-
describe "encoding" do
|
60
|
-
before do
|
61
|
-
subject.each_key { |k| subject[k] = subject[k].force_encoding(Encoding::US_ASCII) }
|
62
|
-
end
|
63
|
-
it "should be encoded in UTF-8" do
|
64
|
-
expect(subject.to_anvl.encoding).to eq(Encoding::UTF_8)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
describe "escaping" do
|
68
|
-
before do
|
69
|
-
subject["_target"] = "http://example.com/path%20with%20spaces"
|
70
|
-
subject["dc.title"] = "A really long title\nneeds a line feed"
|
71
|
-
subject["dc.creator"] = "David Chandek-Stark\r\nJim Coble"
|
72
|
-
end
|
73
|
-
it "should escape a line feed" do
|
74
|
-
expect(subject.to_anvl).to match(/dc.title: A really long title%0Aneeds a line feed/)
|
75
|
-
end
|
76
|
-
it "should escape a carriage return" do
|
77
|
-
expect(subject.to_anvl).to match(/dc.creator: David Chandek-Stark%0D%0AJim Coble/)
|
78
|
-
end
|
79
|
-
it "should escape a percent sign" do
|
80
|
-
expect(subject.to_anvl).to match(/_target: http:\/\/example.com\/path%2520with%2520spaces/)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe "coercion" do
|
86
|
-
subject { described_class.new(data) }
|
87
|
-
context "of nil" do
|
88
|
-
let(:data) { nil }
|
89
|
-
it "should return an empty hash" do
|
90
|
-
expect(subject).to eq({})
|
91
|
-
end
|
92
|
-
end
|
93
|
-
context "of a string" do
|
94
|
-
let(:data) do <<-EOS
|
95
|
-
_updated: 1416507086
|
96
|
-
_target: http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87
|
97
|
-
_profile: erc
|
98
|
-
_ownergroup: apitest
|
99
|
-
_owner: apitest
|
100
|
-
_export: yes
|
101
|
-
_created: 1416507086
|
102
|
-
_status: public
|
103
|
-
EOS
|
104
|
-
end
|
105
|
-
it "should coerce the data into a hash" do
|
106
|
-
expect(subject).to eq({"_updated" => "1416507086",
|
107
|
-
"_target" => "http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87",
|
108
|
-
"_profile" => "erc",
|
109
|
-
"_ownergroup" => "apitest",
|
110
|
-
"_owner" => "apitest",
|
111
|
-
"_export" => "yes",
|
112
|
-
"_created" => "1416507086",
|
113
|
-
"_status" => "public"})
|
114
|
-
end
|
115
|
-
end
|
116
|
-
context "of a hash" do
|
117
|
-
let(:data) do
|
118
|
-
{ _updated: "1416507086",
|
119
|
-
_target: "http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87",
|
120
|
-
_profile: "erc",
|
121
|
-
_ownergroup: "apitest",
|
122
|
-
_owner: "apitest",
|
123
|
-
_export: "yes",
|
124
|
-
_created: "1416507086",
|
125
|
-
_status: "public" }
|
126
|
-
end
|
127
|
-
it "should stringify the keys" do
|
128
|
-
expect(subject).to eq({"_updated" => "1416507086",
|
129
|
-
"_target" => "http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87",
|
130
|
-
"_profile" => "erc",
|
131
|
-
"_ownergroup" => "apitest",
|
132
|
-
"_owner" => "apitest",
|
133
|
-
"_export" => "yes",
|
134
|
-
"_created" => "1416507086",
|
135
|
-
"_status" => "public"})
|
136
|
-
end
|
137
|
-
end
|
138
|
-
context "of a Metadata instance" do
|
139
|
-
let(:hsh) do
|
140
|
-
{ "_updated" => "1416507086",
|
141
|
-
"_target" => "http://ezid.cdlib.org/id/ark:/99999/fk4fn19h87",
|
142
|
-
"_profile" => "erc",
|
143
|
-
"_ownergroup" => "apitest",
|
144
|
-
"_owner" => "apitest",
|
145
|
-
"_export" => "yes",
|
146
|
-
"_created" => "1416507086",
|
147
|
-
"_status" => "public" }
|
148
|
-
end
|
149
|
-
let(:data) { Metadata.new(hsh) }
|
150
|
-
it "should have the same hash" do
|
151
|
-
expect(subject).to eq(hsh)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
describe "profiles" do
|
157
|
-
describe "dc" do
|
158
|
-
describe "readers" do
|
159
|
-
before do
|
160
|
-
subject.update("dc.title" => "Testing Profiles",
|
161
|
-
"dc.creator" => "Kermit the Frog",
|
162
|
-
"dc.publisher" => "Duke University",
|
163
|
-
"dc.date" => "2004",
|
164
|
-
"dc.type" => "Text")
|
165
|
-
end
|
166
|
-
it "should have a reader for each element" do
|
167
|
-
expect(subject.dc_title).to eq("Testing Profiles")
|
168
|
-
expect(subject.dc_creator).to eq("Kermit the Frog")
|
169
|
-
expect(subject.dc_publisher).to eq("Duke University")
|
170
|
-
expect(subject.dc_date).to eq("2004")
|
171
|
-
expect(subject.dc_type).to eq("Text")
|
172
|
-
end
|
173
|
-
end
|
174
|
-
describe "writers" do
|
175
|
-
before do
|
176
|
-
subject.dc_title = "Run of the Mill"
|
177
|
-
subject.dc_creator = "Jack Bean"
|
178
|
-
subject.dc_publisher = "Random Housing"
|
179
|
-
subject.dc_date = "1967"
|
180
|
-
subject.dc_type = "Physical Object"
|
181
|
-
end
|
182
|
-
it "should have a writer for each element" do
|
183
|
-
expect(subject["dc.title"]).to eq "Run of the Mill"
|
184
|
-
expect(subject["dc.creator"]).to eq "Jack Bean"
|
185
|
-
expect(subject["dc.publisher"]).to eq "Random Housing"
|
186
|
-
expect(subject["dc.date"]).to eq "1967"
|
187
|
-
expect(subject["dc.type"]).to eq "Physical Object"
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
describe "erc" do
|
192
|
-
describe "readers" do
|
193
|
-
before do
|
194
|
-
subject.update("erc.what" => "Testing Profiles",
|
195
|
-
"erc.who" => "Kermit the Frog",
|
196
|
-
"erc.when" => "2004")
|
197
|
-
end
|
198
|
-
it "should have a reader for each element" do
|
199
|
-
expect(subject.erc_what).to eq("Testing Profiles")
|
200
|
-
expect(subject.erc_who).to eq("Kermit the Frog")
|
201
|
-
expect(subject.erc_when).to eq("2004")
|
202
|
-
end
|
203
|
-
end
|
204
|
-
describe "writers" do
|
205
|
-
before do
|
206
|
-
subject.erc_what = "Run of the Mill"
|
207
|
-
subject.erc_who = "Jack Bean"
|
208
|
-
subject.erc_when = "1967"
|
209
|
-
end
|
210
|
-
it "should have a writer for each element" do
|
211
|
-
expect(subject["erc.what"]).to eq "Run of the Mill"
|
212
|
-
expect(subject["erc.who"]).to eq "Jack Bean"
|
213
|
-
expect(subject["erc.when"]).to eq "1967"
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
describe "crossref" do
|
218
|
-
describe "xml document reader" do
|
219
|
-
before do
|
220
|
-
subject["crossref"] = "<xml/>"
|
221
|
-
end
|
222
|
-
it "should return the xml" do
|
223
|
-
expect(subject.crossref).to eq "<xml/>"
|
224
|
-
end
|
225
|
-
end
|
226
|
-
describe "xml document writer" do
|
227
|
-
before do
|
228
|
-
subject.crossref = "<yml/>"
|
229
|
-
end
|
230
|
-
it "should set the 'crossref' metadata element" do
|
231
|
-
expect(subject["crossref"]).to eq "<yml/>"
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|
235
|
-
describe "datacite" do
|
236
|
-
describe "element readers" do
|
237
|
-
before do
|
238
|
-
subject.update("datacite.title" => "Testing Profiles",
|
239
|
-
"datacite.creator" => "Kermit the Frog",
|
240
|
-
"datacite.publisher" => "Duke University",
|
241
|
-
"datacite.publicationyear" => "2004",
|
242
|
-
"datacite.resourcetype" => "Text")
|
243
|
-
end
|
244
|
-
it "should have a reader for each element" do
|
245
|
-
expect(subject.datacite_title).to eq("Testing Profiles")
|
246
|
-
expect(subject.datacite_creator).to eq("Kermit the Frog")
|
247
|
-
expect(subject.datacite_publisher).to eq("Duke University")
|
248
|
-
expect(subject.datacite_publicationyear).to eq("2004")
|
249
|
-
expect(subject.datacite_resourcetype).to eq("Text")
|
250
|
-
end
|
251
|
-
end
|
252
|
-
describe "element writers" do
|
253
|
-
before do
|
254
|
-
subject.datacite_title = "Run of the Mill"
|
255
|
-
subject.datacite_creator = "Jack Bean"
|
256
|
-
subject.datacite_publisher = "Random Housing"
|
257
|
-
subject.datacite_publicationyear = "1967"
|
258
|
-
subject.datacite_resourcetype = "Physical Object"
|
259
|
-
end
|
260
|
-
it "should have a writer for each element" do
|
261
|
-
expect(subject["datacite.title"]).to eq "Run of the Mill"
|
262
|
-
expect(subject["datacite.creator"]).to eq "Jack Bean"
|
263
|
-
expect(subject["datacite.publisher"]).to eq "Random Housing"
|
264
|
-
expect(subject["datacite.publicationyear"]).to eq "1967"
|
265
|
-
expect(subject["datacite.resourcetype"]).to eq "Physical Object"
|
266
|
-
end
|
267
|
-
end
|
268
|
-
describe "xml document reader" do
|
269
|
-
before do
|
270
|
-
subject["datacite"] = "<xml/>"
|
271
|
-
end
|
272
|
-
it "should return the xml" do
|
273
|
-
expect(subject.datacite).to eq "<xml/>"
|
274
|
-
end
|
275
|
-
end
|
276
|
-
describe "xml document writer" do
|
277
|
-
before do
|
278
|
-
subject.datacite = "<yml/>"
|
279
|
-
end
|
280
|
-
it "should set the 'datacite' metadata element" do
|
281
|
-
expect(subject["datacite"]).to eq "<yml/>"
|
282
|
-
end
|
283
|
-
end
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
end
|
288
|
-
end
|