ezid-client 0.13.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -13
- data/VERSION +1 -1
- data/lib/ezid/metadata.rb +97 -162
- data/lib/ezid/requests/batch_download_request.rb +0 -6
- data/lib/ezid/requests/request.rb +1 -5
- data/spec/unit/identifier_spec.rb +3 -3
- data/spec/unit/metadata_spec.rb +140 -70
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67d7c521805d41988bf36686a34d9b5fff22564e
|
4
|
+
data.tar.gz: f2d7863a870a77a0c4fd34a434d25813c135ee15
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d10753b4d6bfb1fc31825dd62bc680da20b6772f2313ae5309b3df4c93f98b99ba3b72aca0b323961fbd3c8b09f035843cae73c966619a958a35e1deb6a96dfd
|
7
|
+
data.tar.gz: ef0073723387486a9e531227bc83e4ea7b2998337f5beed74a7bb7b00034ada6bf437b0595142e2ff0797e9b189f54fd26411376f1ef480a35ea654a2ca83818
|
data/README.md
CHANGED
@@ -145,7 +145,7 @@ Accessors are provided to ease the use of EZID [reserved metadata elements](http
|
|
145
145
|
Notes:
|
146
146
|
- `_crossref` is an exception because `crossref` is also the name of a metadata profile and a special element. Use `identifier._crossref` to read and `identifier._crossref = value` to write.
|
147
147
|
- Reserved elements which are not user-writeable do not implement writers.
|
148
|
-
- Special readers are implemented for reserved elements having date/time values
|
148
|
+
- Special readers are implemented for reserved elements having date/time values (`_created` and `_updated`) which convert the string time values of EZID to Ruby `Time` instances.
|
149
149
|
|
150
150
|
**Metadata profile elements** can be read and written using the name of the element, replacing the dot (".") with an underscore:
|
151
151
|
|
@@ -156,18 +156,7 @@ Notes:
|
|
156
156
|
=> "Image"
|
157
157
|
```
|
158
158
|
|
159
|
-
|
160
|
-
|
161
|
-
Custom metadata element accessors can be created by a registration process:
|
162
|
-
|
163
|
-
```ruby
|
164
|
-
Ezid::Client.configure do |config|
|
165
|
-
# register the element "custom"
|
166
|
-
config.metadata.register_element :custom
|
167
|
-
# register the element "dc.identifier" under the accessor :dc_identifier
|
168
|
-
config.metadata.register_element :dc_identifier, name: "dc.identifier"
|
169
|
-
end
|
170
|
-
```
|
159
|
+
Accessors are also implemented for the `crossref`, `datacite`, and `erc` elements as described in the EZID API documentation.
|
171
160
|
|
172
161
|
**Setting default metadata values**
|
173
162
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/lib/ezid/metadata.rb
CHANGED
@@ -7,6 +7,39 @@ module Ezid
|
|
7
7
|
# @api private
|
8
8
|
#
|
9
9
|
class Metadata < SimpleDelegator
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def metadata_reader(method, alias_as=nil)
|
13
|
+
define_method method do
|
14
|
+
self[method.to_s]
|
15
|
+
end
|
16
|
+
if alias_as
|
17
|
+
alias_method alias_as, method
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def metadata_writer(method, alias_as=nil)
|
22
|
+
define_method "#{method}=" do |value|
|
23
|
+
self[method.to_s] = value
|
24
|
+
end
|
25
|
+
if alias_as
|
26
|
+
alias_method "#{alias_as}=".to_sym, "#{method}=".to_sym
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def metadata_accessor(method, alias_as=nil)
|
31
|
+
metadata_reader method, alias_as
|
32
|
+
metadata_writer method, alias_as
|
33
|
+
end
|
34
|
+
|
35
|
+
def metadata_profile(profile, *methods)
|
36
|
+
methods.each do |method|
|
37
|
+
element = [profile, method].join(".")
|
38
|
+
alias_as = [profile, method].join("_")
|
39
|
+
metadata_accessor element, alias_as
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
10
43
|
|
11
44
|
# EZID metadata field/value separator
|
12
45
|
ANVL_SEPARATOR = ": "
|
@@ -34,195 +67,97 @@ module Ezid
|
|
34
67
|
# A line ending
|
35
68
|
LINE_ENDING_RE = /\r?\n/
|
36
69
|
|
37
|
-
# A metadata element
|
38
|
-
Element = Struct.new(:name, :reader, :writer)
|
39
|
-
|
40
|
-
# Metadata profiles
|
41
|
-
PROFILES = {
|
42
|
-
"dc" => %w( creator title publisher date type ).freeze,
|
43
|
-
"datacite" => %w( creator title publisher publicationyear resourcetype ).freeze,
|
44
|
-
"erc" => %w( who what when ).freeze,
|
45
|
-
"crossref" => [].freeze
|
46
|
-
}.freeze
|
47
|
-
|
48
|
-
# EZID reserved metadata elements that have time values
|
49
|
-
# @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
|
50
|
-
RESERVED_TIME_ELEMENTS = %w( _created _updated )
|
51
|
-
|
52
70
|
# EZID reserved metadata elements that are read-only
|
53
71
|
# @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
if element = registered_elements[accessor.to_sym]
|
79
|
-
raise Error, "Element \"#{element.name}\" is registered under the accessor :#{accessor}."
|
80
|
-
end
|
81
|
-
element = Element.new(opts.fetch(:name, accessor.to_s))
|
82
|
-
element.reader = define_reader(accessor, element.name)
|
83
|
-
element.writer = define_writer(accessor, element.name) if opts.fetch(:writer, true)
|
84
|
-
registered_elements[accessor.to_sym] = element
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.unregister_element(accessor)
|
88
|
-
element = registered_elements.delete(accessor)
|
89
|
-
raise Error, "No element is registered under the accessor :#{accessor}." unless element
|
90
|
-
remove_method(element.reader)
|
91
|
-
remove_method(element.writer) if element.writer
|
92
|
-
end
|
93
|
-
|
94
|
-
def self.register_profile_element(profile, element)
|
95
|
-
register_element("#{profile}_#{element}", name: "#{profile}.#{element}")
|
96
|
-
end
|
97
|
-
|
98
|
-
def self.register_profile_elements(profile = nil)
|
99
|
-
if profile
|
100
|
-
PROFILES[profile].each { |element| register_profile_element(profile, element) }
|
101
|
-
else
|
102
|
-
PROFILES.keys.each do |profile|
|
103
|
-
register_profile_elements(profile)
|
104
|
-
register_element(profile) unless profile == "dc"
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
72
|
+
READONLY = %w( _owner _ownergroup _shadows _shadowedby _datacenter _created _updated )
|
73
|
+
|
74
|
+
metadata_accessor :_coowners, :coowners
|
75
|
+
metadata_accessor :_crossref
|
76
|
+
metadata_accessor :_export, :export
|
77
|
+
metadata_accessor :_profile, :profile
|
78
|
+
metadata_accessor :_status, :status
|
79
|
+
metadata_accessor :_target, :target
|
80
|
+
|
81
|
+
metadata_accessor :crossref
|
82
|
+
metadata_accessor :datacite
|
83
|
+
metadata_accessor :erc
|
84
|
+
|
85
|
+
metadata_reader :_created
|
86
|
+
metadata_reader :_datacenter, :datacenter
|
87
|
+
metadata_reader :_owner, :owner
|
88
|
+
metadata_reader :_ownergroup, :ownergroup
|
89
|
+
metadata_reader :_shadowedby, :shadowedby
|
90
|
+
metadata_reader :_shadows, :shadows
|
91
|
+
metadata_reader :_updated
|
92
|
+
|
93
|
+
metadata_profile :dc, :creator, :title, :publisher, :date, :type
|
94
|
+
metadata_profile :datacite, :creator, :title, :publisher, :publicationyear, :resourcetype
|
95
|
+
metadata_profile :erc, :who, :what, :when
|
108
96
|
|
109
|
-
def
|
110
|
-
|
111
|
-
accessor = (element == "_crossref") ? element : element.sub("_", "")
|
112
|
-
register_element(accessor, name: element, writer: RESERVED_READWRITE_ELEMENTS.include?(element))
|
113
|
-
end
|
97
|
+
def initialize(data={})
|
98
|
+
super coerce(data)
|
114
99
|
end
|
115
100
|
|
116
|
-
def
|
117
|
-
|
118
|
-
reader(element)
|
119
|
-
end
|
101
|
+
def created
|
102
|
+
to_time _created
|
120
103
|
end
|
121
104
|
|
122
|
-
def
|
123
|
-
|
124
|
-
writer(element, value)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
private_class_method :register_elements,
|
129
|
-
:register_reserved_elements,
|
130
|
-
:register_profile_elements,
|
131
|
-
:unregister_element,
|
132
|
-
:define_reader,
|
133
|
-
:define_writer
|
134
|
-
|
135
|
-
def initialize(data={})
|
136
|
-
super(coerce(data))
|
105
|
+
def updated
|
106
|
+
to_time _updated
|
137
107
|
end
|
138
108
|
|
139
109
|
# Output metadata in EZID ANVL format
|
140
110
|
# @see http://ezid.cdlib.org/doc/apidoc.html#request-response-bodies
|
141
111
|
# @return [String] the ANVL output
|
142
112
|
def to_anvl(include_readonly = true)
|
143
|
-
|
144
|
-
|
145
|
-
|
113
|
+
hsh = __getobj__.dup
|
114
|
+
hsh.reject! { |k, v| READONLY.include?(k) } unless include_readonly
|
115
|
+
elements = hsh.map do |name, value|
|
116
|
+
element = [escape(ESCAPE_NAMES_RE, name), escape(ESCAPE_VALUES_RE, value)]
|
117
|
+
element.join(ANVL_SEPARATOR)
|
118
|
+
end
|
119
|
+
elements.join("\n").force_encoding(Encoding::UTF_8)
|
146
120
|
end
|
147
121
|
|
148
122
|
def to_s
|
149
123
|
to_anvl
|
150
124
|
end
|
151
125
|
|
152
|
-
def registered_elements
|
153
|
-
self.class.registered_elements
|
154
|
-
end
|
155
|
-
|
156
126
|
private
|
157
127
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
value = (time == 0) ? nil : Time.at(time).utc
|
163
|
-
end
|
164
|
-
value
|
165
|
-
end
|
166
|
-
|
167
|
-
def writer(element, value)
|
168
|
-
self[element] = value
|
169
|
-
end
|
170
|
-
|
171
|
-
# Coerce data into a Hash of elements
|
172
|
-
def coerce(data)
|
173
|
-
data.to_h
|
174
|
-
rescue NoMethodError
|
175
|
-
coerce_string(data)
|
176
|
-
end
|
177
|
-
|
178
|
-
# Escape elements hash keys and values
|
179
|
-
def escape_elements(hsh)
|
180
|
-
hsh.each_with_object({}) do |(n, v), memo|
|
181
|
-
memo[escape_name(n)] = escape_value(v)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
# Escape an element name
|
186
|
-
def escape_name(n)
|
187
|
-
escape(ESCAPE_NAMES_RE, n)
|
188
|
-
end
|
128
|
+
def to_time(value)
|
129
|
+
time = value.to_i
|
130
|
+
(time == 0) ? nil : Time.at(time).utc
|
131
|
+
end
|
189
132
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
133
|
+
# Coerce data into a Hash of elements
|
134
|
+
def coerce(data)
|
135
|
+
data.to_h
|
136
|
+
rescue NoMethodError
|
137
|
+
coerce_string(data)
|
138
|
+
end
|
194
139
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
# @return [String] the escaped string
|
200
|
-
def escape(re, s)
|
201
|
-
s.gsub(re) { |m| URI.encode_www_form_component(m.force_encoding(Encoding::UTF_8)) }
|
202
|
-
end
|
140
|
+
# Escape string for sending to EZID host
|
141
|
+
def escape(regexp, value)
|
142
|
+
value.gsub(regexp) { |m| URI.encode_www_form_component(m.force_encoding(Encoding::UTF_8)) }
|
143
|
+
end
|
203
144
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
def unescape(value)
|
209
|
-
value.gsub(UNESCAPE_RE) { |m| URI.decode_www_form_component(m) }
|
210
|
-
end
|
145
|
+
# Unescape value from EZID host (or other source)
|
146
|
+
def unescape(value)
|
147
|
+
value.gsub(UNESCAPE_RE) { |m| URI.decode_www_form_component(m) }
|
148
|
+
end
|
211
149
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
element, value = line.split(ANVL_SEPARATOR, 2)
|
221
|
-
memo[unescape(element.strip)] = unescape(value.strip)
|
222
|
-
end
|
150
|
+
# Coerce a string of metadata (e.g., from EZID host) into a Hash
|
151
|
+
# @note EZID host does not send comments or line continuations.
|
152
|
+
def coerce_string(data)
|
153
|
+
data.gsub!(COMMENT_RE, "")
|
154
|
+
data.gsub!(LINE_CONTINUATION_RE, " ")
|
155
|
+
data.split(LINE_ENDING_RE).each_with_object({}) do |line, memo|
|
156
|
+
element, value = line.split(ANVL_SEPARATOR, 2)
|
157
|
+
memo[unescape(element.strip)] = unescape(value.strip)
|
223
158
|
end
|
159
|
+
end
|
224
160
|
|
225
161
|
end
|
226
162
|
end
|
227
163
|
|
228
|
-
Ezid::Metadata.initialize!
|
@@ -7,14 +7,8 @@ module Ezid
|
|
7
7
|
self.path = "/download_request"
|
8
8
|
self.response_class = BatchDownloadResponse
|
9
9
|
|
10
|
-
attr_reader :params
|
11
|
-
|
12
10
|
def initialize(client, params={})
|
13
|
-
@params = params
|
14
11
|
super
|
15
|
-
end
|
16
|
-
|
17
|
-
def customize_request
|
18
12
|
set_form_data(params)
|
19
13
|
end
|
20
14
|
|
@@ -42,7 +42,7 @@ module Ezid
|
|
42
42
|
def initialize(client, *args)
|
43
43
|
@client = client
|
44
44
|
super build_request
|
45
|
-
|
45
|
+
set_content_type("text/plain", charset: "UTF-8")
|
46
46
|
end
|
47
47
|
|
48
48
|
# Executes the request and returns the response
|
@@ -97,10 +97,6 @@ module Ezid
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
def customize_request
|
101
|
-
set_content_type("text/plain", charset: "UTF-8")
|
102
|
-
end
|
103
|
-
|
104
100
|
def build_request
|
105
101
|
self.class.http_method.new(uri)
|
106
102
|
end
|
@@ -150,7 +150,7 @@ module Ezid
|
|
150
150
|
allow(subject).to receive(:persisted?) { true }
|
151
151
|
end
|
152
152
|
it "should modify the identifier" do
|
153
|
-
expect(subject.client).to receive(:modify_identifier).with("id",
|
153
|
+
expect(subject.client).to receive(:modify_identifier).with("id", subject.metadata) { double(id: "id") }
|
154
154
|
subject.save
|
155
155
|
end
|
156
156
|
end
|
@@ -161,7 +161,7 @@ module Ezid
|
|
161
161
|
context "and `id' is present" do
|
162
162
|
before { allow(subject).to receive(:id) { "id" } }
|
163
163
|
it "should create the identifier" do
|
164
|
-
expect(subject.client).to receive(:create_identifier).with("id",
|
164
|
+
expect(subject.client).to receive(:create_identifier).with("id", subject.metadata) { double(id: "id") }
|
165
165
|
subject.save
|
166
166
|
end
|
167
167
|
end
|
@@ -169,7 +169,7 @@ module Ezid
|
|
169
169
|
context "and `shoulder' is present" do
|
170
170
|
before { allow(subject).to receive(:shoulder) { TEST_ARK_SHOULDER } }
|
171
171
|
it "should mint the identifier" do
|
172
|
-
expect(subject.client).to receive(:mint_identifier).with(TEST_ARK_SHOULDER,
|
172
|
+
expect(subject.client).to receive(:mint_identifier).with(TEST_ARK_SHOULDER, subject.metadata) { double(id: "id") }
|
173
173
|
subject.save
|
174
174
|
end
|
175
175
|
end
|
data/spec/unit/metadata_spec.rb
CHANGED
@@ -1,82 +1,152 @@
|
|
1
1
|
module Ezid
|
2
2
|
RSpec.describe Metadata do
|
3
3
|
|
4
|
-
describe "
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
reader = (element == "_crossref") ? element : element.sub("_", "")
|
10
|
-
subject.send(reader)
|
11
|
-
end
|
4
|
+
describe "metadata accessors and aliases" do
|
5
|
+
shared_examples "a metadata writer" do |writer|
|
6
|
+
it "writes the \"#{writer}\" element" do
|
7
|
+
subject.send("#{writer}=", "value")
|
8
|
+
expect(subject[writer.to_s]).to eq("value")
|
12
9
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
expect(subject.send(element.sub("_", ""))).to eq(Time.parse("2014-11-20 13:11:26 -0500"))
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
10
|
+
end
|
11
|
+
|
12
|
+
shared_examples "a metadata reader" do |reader|
|
13
|
+
it "reads the \"#{reader}\" element" do
|
14
|
+
subject[reader.to_s] = "value"
|
15
|
+
expect(subject.send(reader)).to eq("value")
|
23
16
|
end
|
24
17
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
18
|
+
|
19
|
+
shared_examples "a metadata reader with an alias" do |reader, aliased_as|
|
20
|
+
it_behaves_like "a metadata reader", reader
|
21
|
+
it "has a reader alias \"#{aliased_as}\"" do
|
22
|
+
subject[reader.to_s] = "value"
|
23
|
+
expect(subject.send(aliased_as)).to eq("value")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
shared_examples "a metadata writer with an alias" do |writer, aliased_as|
|
28
|
+
it_behaves_like "a metadata writer", writer
|
29
|
+
it "has a writer alias \"#{aliased_as}\"" do
|
30
|
+
subject.send("#{aliased_as}=", "value")
|
31
|
+
expect(subject.send(writer)).to eq("value")
|
33
32
|
end
|
34
33
|
end
|
35
|
-
end
|
36
34
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
expect(subject).to receive(:writer).with("#{profile}.#{element}", "value")
|
52
|
-
subject.send("#{profile}_#{element}=", "value")
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
next if profile == "dc"
|
57
|
-
it "should have a reader for '#{profile}'" do
|
58
|
-
expect(subject).to receive(:reader).with(profile)
|
59
|
-
subject.send(profile)
|
60
|
-
end
|
61
|
-
it "should have a writer for '#{profile}'" do
|
62
|
-
expect(subject).to receive(:writer).with(profile, "value")
|
63
|
-
subject.send("#{profile}=", "value")
|
64
|
-
end
|
35
|
+
shared_examples "a metadata accessor" do |accessor|
|
36
|
+
it_behaves_like "a metadata reader", accessor
|
37
|
+
it_behaves_like "a metadata writer", accessor
|
38
|
+
end
|
39
|
+
|
40
|
+
shared_examples "a metadata accessor with an alias" do |accessor, aliased_as|
|
41
|
+
it_behaves_like "a metadata reader with an alias", accessor, aliased_as
|
42
|
+
it_behaves_like "a metadata writer with an alias", accessor, aliased_as
|
43
|
+
end
|
44
|
+
|
45
|
+
shared_examples "a time reader alias" do |element, aliased_as|
|
46
|
+
before { subject[element.to_s] = "1416507086" }
|
47
|
+
it "should return the Time value for the element" do
|
48
|
+
expect(subject.send(aliased_as)).to eq(Time.parse("2014-11-20 13:11:26 -0500"))
|
65
49
|
end
|
66
50
|
end
|
67
|
-
end
|
68
51
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
52
|
+
shared_examples "a metadata profile accessor with an alias" do |profile, accessor|
|
53
|
+
it_behaves_like "a metadata accessor with an alias", [profile, accessor].join("."), [profile, accessor].join("_")
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "_owner" do
|
57
|
+
it_behaves_like "a metadata reader with an alias", :_owner, :owner
|
58
|
+
end
|
59
|
+
describe "_ownergroup" do
|
60
|
+
it_behaves_like "a metadata reader with an alias", :_ownergroup, :ownergroup
|
61
|
+
end
|
62
|
+
describe "_shadows" do
|
63
|
+
it_behaves_like "a metadata reader with an alias", :_shadows, :shadows
|
64
|
+
end
|
65
|
+
describe "_shadowedby" do
|
66
|
+
it_behaves_like "a metadata reader with an alias", :_shadowedby, :shadowedby
|
67
|
+
end
|
68
|
+
describe "_datacenter" do
|
69
|
+
it_behaves_like "a metadata reader with an alias", :_datacenter, :datacenter
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "_coowners" do
|
73
|
+
it_behaves_like "a metadata accessor with an alias", :_coowners, :coowners
|
74
|
+
end
|
75
|
+
describe "_target" do
|
76
|
+
it_behaves_like "a metadata accessor with an alias", :_target, :target
|
77
|
+
end
|
78
|
+
describe "_profile" do
|
79
|
+
it_behaves_like "a metadata accessor with an alias", :_profile, :profile
|
80
|
+
end
|
81
|
+
describe "_status" do
|
82
|
+
it_behaves_like "a metadata accessor with an alias", :_status, :status
|
83
|
+
end
|
84
|
+
describe "_export" do
|
85
|
+
it_behaves_like "a metadata accessor with an alias", :_export, :export
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "_created" do
|
89
|
+
it_behaves_like "a metadata reader", :_created
|
90
|
+
it_behaves_like "a time reader alias", :_created, :created
|
91
|
+
end
|
92
|
+
describe "_updated" do
|
93
|
+
it_behaves_like "a metadata reader", :_updated
|
94
|
+
it_behaves_like "a time reader alias", :_updated, :updated
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "erc" do
|
98
|
+
it_behaves_like "a metadata accessor", :erc
|
99
|
+
end
|
100
|
+
describe "datacite" do
|
101
|
+
it_behaves_like "a metadata accessor", :datacite
|
102
|
+
end
|
103
|
+
describe "_crossref" do
|
104
|
+
it_behaves_like "a metadata accessor", :_crossref
|
105
|
+
end
|
106
|
+
describe "crossref" do
|
107
|
+
it_behaves_like "a metadata accessor", :crossref
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "dc.creator" do
|
111
|
+
it_behaves_like "a metadata profile accessor with an alias", :dc, :creator
|
112
|
+
end
|
113
|
+
describe "dc.title" do
|
114
|
+
it_behaves_like "a metadata profile accessor with an alias", :dc, :title
|
115
|
+
end
|
116
|
+
describe "dc.publisher" do
|
117
|
+
it_behaves_like "a metadata profile accessor with an alias", :dc, :publisher
|
118
|
+
end
|
119
|
+
describe "dc.date" do
|
120
|
+
it_behaves_like "a metadata profile accessor with an alias", :dc, :date
|
121
|
+
end
|
122
|
+
describe "dc.type" do
|
123
|
+
it_behaves_like "a metadata profile accessor with an alias", :dc, :type
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "datacite.creator" do
|
127
|
+
it_behaves_like "a metadata profile accessor with an alias", :datacite, :creator
|
128
|
+
end
|
129
|
+
describe "datacite.title" do
|
130
|
+
it_behaves_like "a metadata profile accessor with an alias", :datacite, :title
|
131
|
+
end
|
132
|
+
describe "datacite.publisher" do
|
133
|
+
it_behaves_like "a metadata profile accessor with an alias", :datacite, :publisher
|
134
|
+
end
|
135
|
+
describe "datacite.publicationyear" do
|
136
|
+
it_behaves_like "a metadata profile accessor with an alias", :datacite, :publicationyear
|
137
|
+
end
|
138
|
+
describe "datacite.resourcetype" do
|
139
|
+
it_behaves_like "a metadata profile accessor with an alias", :datacite, :resourcetype
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "erc.who" do
|
143
|
+
it_behaves_like "a metadata profile accessor with an alias", :erc, :who
|
144
|
+
end
|
145
|
+
describe "erc.what" do
|
146
|
+
it_behaves_like "a metadata profile accessor with an alias", :erc, :what
|
147
|
+
end
|
148
|
+
describe "erc.when" do
|
149
|
+
it_behaves_like "a metadata profile accessor with an alias", :erc, :when
|
80
150
|
end
|
81
151
|
end
|
82
152
|
|
@@ -95,7 +165,7 @@ _status: public")
|
|
95
165
|
end
|
96
166
|
describe "encoding" do
|
97
167
|
before do
|
98
|
-
subject.
|
168
|
+
subject.each { |k, v| subject[k] = v.force_encoding(Encoding::US_ASCII) }
|
99
169
|
end
|
100
170
|
it "should be encoded in UTF-8" do
|
101
171
|
expect(subject.to_anvl.encoding).to eq(Encoding::UTF_8)
|
@@ -107,8 +177,8 @@ _status: public")
|
|
107
177
|
subject { described_class.new(data) }
|
108
178
|
context "of nil" do
|
109
179
|
let(:data) { nil }
|
110
|
-
it "should create
|
111
|
-
expect(subject).to
|
180
|
+
it "should create be empty" do
|
181
|
+
expect(subject).to be_empty
|
112
182
|
end
|
113
183
|
end
|
114
184
|
context "of a string" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ezid-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
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: 2015-02-
|
11
|
+
date: 2015-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|