ezid-client 0.4.2 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2b09cc8d07326bf5ec70e376feb37a7958018724
4
- data.tar.gz: a95378e37e305a0dd79e127b654bcd41a6d4e658
3
+ metadata.gz: 024d805940fcc9a0ccbe8ed0e6e80177d05393f6
4
+ data.tar.gz: e488fafa09132f630a2047cd4008fd653a9a221a
5
5
  SHA512:
6
- metadata.gz: 2d07041e9bf5961f6b5f5def5936f24f08553d789032de6c9c1cebeba0da4e848b5b8f34515995f6e52646df916f7cf234b52c228a63cd64bef0ae3e36ec9bf4
7
- data.tar.gz: c35e0ab65837eb7d4bfbfc3f6b2a29cf645e68b1c2862e2fbd1013d6a2096e646671291e423daeffa3b9a16e8502b2b3054e6b5d65f7bacb0d0590af272687ab
6
+ metadata.gz: 3f32330825caf59ba03f3e7765226fe5f9aaef98877a12c9ac1396ac98a2511863f57f9b2619adea40d425b9b09ae5c97b311614d1b9e21a52ec4007217a9511
7
+ data.tar.gz: 4972d261b297f95f763499c92882fe1600238a3e5865bd510b41dc780ba33904f22b17f95fc1c87ff9aaeddfdb6e761b53c1159d9d011f920e7bfc7818a433e5
data/README.md CHANGED
@@ -71,7 +71,7 @@ I, [2014-12-04T15:12:48.853964 #86734] INFO -- : EZID DELETE ark:/99999/fk4n58p
71
71
 
72
72
  ## Metadata handling
73
73
 
74
- See `Ezid::Metadata`.
74
+ See `Ezid::Metadata` class and examples in `spec/unit/metadata_spec.rb`.
75
75
 
76
76
  ## Authentication
77
77
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.5.0
data/ezid-client.gemspec CHANGED
@@ -19,9 +19,7 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.required_ruby_version = "~> 2.0"
21
21
 
22
- spec.add_dependency "activesupport", "~> 4.0"
23
-
24
- spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "bundler", "~> 1.7"
25
23
  spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rspec", "~> 3.0"
24
+ spec.add_development_dependency "rspec", "~> 3.1"
27
25
  end
data/lib/ezid/client.rb CHANGED
@@ -12,6 +12,7 @@ module Ezid
12
12
  # EZID client
13
13
  #
14
14
  # @api public
15
+ #
15
16
  class Client
16
17
 
17
18
  class << self
@@ -1,3 +1,5 @@
1
+ require "forwardable"
2
+
1
3
  module Ezid
2
4
  #
3
5
  # Represents an EZID identifier as a resource.
@@ -5,10 +7,14 @@ module Ezid
5
7
  # @api public
6
8
  #
7
9
  class Identifier
10
+ extend Forwardable
8
11
 
9
12
  attr_reader :id, :client
10
13
  attr_accessor :shoulder, :metadata
11
14
 
15
+ def_delegators :metadata, *(Metadata.elements.readers)
16
+ def_delegators :metadata, *(Metadata.elements.writers)
17
+
12
18
  # Attributes to display on inspect
13
19
  INSPECT_ATTRS = %w( id status target created )
14
20
 
data/lib/ezid/metadata.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  require "delegate"
2
- require_relative "metadata_elements"
2
+ require "singleton"
3
3
 
4
4
  module Ezid
5
5
  #
6
6
  # EZID metadata collection for an identifier
7
7
  #
8
+ # @note Although this API is not private, its direct use is discouraged.
9
+ # Instead use the metadata element accessors through Ezid::Identifier.
8
10
  # @api public
9
11
  #
10
12
  class Metadata < SimpleDelegator
11
13
 
12
- include MetadataElements
13
-
14
14
  # EZID metadata field/value separator
15
15
  ANVL_SEPARATOR = ": "
16
16
 
@@ -25,7 +25,7 @@ module Ezid
25
25
  ESCAPE_NAMES_RE = /[%:\r\n]/
26
26
 
27
27
  # Character sequence to unescape from EZID
28
- # http://ezid.cdlib.org/doc/apidoc.html#request-response-bodies
28
+ # @see http://ezid.cdlib.org/doc/apidoc.html#request-response-bodies
29
29
  UNESCAPE_RE = /%\h\h/
30
30
 
31
31
  # A comment line
@@ -37,6 +37,99 @@ module Ezid
37
37
  # A line ending
38
38
  LINE_ENDING_RE = /\r?\n/
39
39
 
40
+ # A metadata element
41
+ Element = Struct.new(:name, :writer)
42
+
43
+ # Metadata profiles
44
+ PROFILES = {
45
+ "dc" => %w( creator title publisher date type ).freeze,
46
+ "datacite" => %w( creator title publisher publicationyear resourcetype ).freeze,
47
+ "erc" => %w( who what when ).freeze,
48
+ "crossref" => [].freeze
49
+ }.freeze
50
+
51
+ # EZID reserved metadata elements that have time values
52
+ # @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
53
+ RESERVED_TIME_ELEMENTS = %w( _created _updated )
54
+
55
+ # EZID reserved metadata elements that are read-only
56
+ # @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
57
+ RESERVED_READONLY_ELEMENTS = %w( _owner _ownergroup _shadows _shadowedby _datacenter _created _updated )
58
+
59
+ # EZID reserved metadata elements that may be set by clients
60
+ # @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
61
+ RESERVED_READWRITE_ELEMENTS = %w( _coowners _target _profile _status _export _crossref )
62
+
63
+ # All EZID reserved metadata elements
64
+ # @see http://ezid.cdlib.org/doc/apidoc.html#internal-metadata
65
+ RESERVED_ELEMENTS = RESERVED_READONLY_ELEMENTS + RESERVED_READWRITE_ELEMENTS
66
+
67
+ # Metadata element registry
68
+ class ElementRegistry < SimpleDelegator
69
+ include Singleton
70
+
71
+ def initialize
72
+ super(Hash.new)
73
+ end
74
+
75
+ def readers
76
+ keys
77
+ end
78
+
79
+ def writers
80
+ keys.select { |k| self[k].writer }.map(&:to_s).map { |k| k.concat("=") }.map(&:to_sym)
81
+ end
82
+ end
83
+
84
+ def self.initialize!
85
+ register_elements
86
+ define_element_accessors
87
+ end
88
+
89
+ def self.elements
90
+ ElementRegistry.instance
91
+ end
92
+
93
+ def self.register_elements
94
+ register_profile_elements
95
+ register_reserved_elements
96
+ elements.freeze
97
+ end
98
+
99
+ def self.define_element_accessors
100
+ elements.each do |accessor, element|
101
+ define_method(accessor) { reader(element.name) }
102
+
103
+ if element.writer
104
+ define_method("#{accessor}=") { |value| writer(element.name, value) }
105
+ end
106
+ end
107
+ end
108
+
109
+ def self.register_element(accessor, element, opts={})
110
+ writer = opts.fetch(:writer, true)
111
+ elements[accessor] = Element.new(element, writer).freeze
112
+ end
113
+
114
+ def self.register_profile_elements
115
+ PROFILES.each do |profile, profile_elements|
116
+ profile_elements.each do |element|
117
+ register_element("#{profile}_#{element}".to_sym, "#{profile}.#{element}")
118
+ end
119
+ register_element(profile.to_sym, profile) unless profile == "dc"
120
+ end
121
+ end
122
+
123
+ def self.register_reserved_elements
124
+ RESERVED_ELEMENTS.each do |element|
125
+ accessor = ((element == "_crossref") ? element : element.sub("_", "")).to_sym
126
+ register_element(accessor, element, writer: RESERVED_READWRITE_ELEMENTS.include?(element))
127
+ end
128
+ end
129
+
130
+ private_class_method :register_element, :register_elements, :register_reserved_elements,
131
+ :register_profile_elements, :define_element_accessors
132
+
40
133
  def initialize(data={})
41
134
  super(coerce(data))
42
135
  end
@@ -56,59 +149,74 @@ module Ezid
56
149
 
57
150
  private
58
151
 
59
- # Coerce data into a Hash of elements
60
- def coerce(data)
61
- data.to_h
62
- rescue NoMethodError
63
- coerce_string(data)
64
- end
152
+ def reader(element)
153
+ value = self[element]
154
+ if RESERVED_TIME_ELEMENTS.include?(element)
155
+ time = value.to_i
156
+ value = (time == 0) ? nil : Time.at(time).utc
157
+ end
158
+ value
159
+ end
65
160
 
66
- # Escape elements hash keys and values
67
- def escape_elements(hsh)
68
- hsh.each_with_object({}) do |(n, v), memo|
69
- memo[escape_name(n)] = escape_value(v)
161
+ def writer(element, value)
162
+ self[element] = value
70
163
  end
71
- end
72
164
 
73
- # Escape an element name
74
- def escape_name(n)
75
- escape(ESCAPE_NAMES_RE, n)
76
- end
165
+ # Coerce data into a Hash of elements
166
+ def coerce(data)
167
+ data.to_h
168
+ rescue NoMethodError
169
+ coerce_string(data)
170
+ end
77
171
 
78
- # Escape an element value
79
- def escape_value(v)
80
- escape(ESCAPE_VALUES_RE, v)
81
- end
172
+ # Escape elements hash keys and values
173
+ def escape_elements(hsh)
174
+ hsh.each_with_object({}) do |(n, v), memo|
175
+ memo[escape_name(n)] = escape_value(v)
176
+ end
177
+ end
82
178
 
83
- # Escape string for sending to EZID host
84
- # @see http://ezid.cdlib.org/doc/apidoc.html#request-response-bodies
85
- # @param re [Regexp] the regular expression to match for escaping
86
- # @param s [String] the string to escape
87
- # @return [String] the escaped string
88
- def escape(re, s)
89
- s.gsub(re) { |m| URI.encode_www_form_component(m.force_encoding(Encoding::UTF_8)) }
90
- end
179
+ # Escape an element name
180
+ def escape_name(n)
181
+ escape(ESCAPE_NAMES_RE, n)
182
+ end
91
183
 
92
- # Unescape value from EZID host (or other source)
93
- # @see http://ezid.cdlib.org/doc/apidoc.html#request-response-bodies
94
- # @param value [String] the value to unescape
95
- # @return [String] the unescaped value
96
- def unescape(value)
97
- value.gsub(UNESCAPE_RE) { |m| URI.decode_www_form_component(m) }
98
- end
99
-
100
- # Coerce a string of metadata (e.g., from EZID host) into a Hash
101
- # @note EZID host does not send comments or line continuations.
102
- # @param data [String] the string to coerce
103
- # @return [Hash] the hash of coerced data
104
- def coerce_string(data)
105
- data.gsub!(COMMENT_RE, "")
106
- data.gsub!(LINE_CONTINUATION_RE, " ")
107
- data.split(LINE_ENDING_RE).each_with_object({}) do |line, memo|
108
- element, value = line.split(ANVL_SEPARATOR, 2)
109
- memo[unescape(element.strip)] = unescape(value.strip)
184
+ # Escape an element value
185
+ def escape_value(v)
186
+ escape(ESCAPE_VALUES_RE, v)
187
+ end
188
+
189
+ # Escape string for sending to EZID host
190
+ # @see http://ezid.cdlib.org/doc/apidoc.html#request-response-bodies
191
+ # @param re [Regexp] the regular expression to match for escaping
192
+ # @param s [String] the string to escape
193
+ # @return [String] the escaped string
194
+ def escape(re, s)
195
+ s.gsub(re) { |m| URI.encode_www_form_component(m.force_encoding(Encoding::UTF_8)) }
196
+ end
197
+
198
+ # Unescape value from EZID host (or other source)
199
+ # @see http://ezid.cdlib.org/doc/apidoc.html#request-response-bodies
200
+ # @param value [String] the value to unescape
201
+ # @return [String] the unescaped value
202
+ def unescape(value)
203
+ value.gsub(UNESCAPE_RE) { |m| URI.decode_www_form_component(m) }
204
+ end
205
+
206
+ # Coerce a string of metadata (e.g., from EZID host) into a Hash
207
+ # @note EZID host does not send comments or line continuations.
208
+ # @param data [String] the string to coerce
209
+ # @return [Hash] the hash of coerced data
210
+ def coerce_string(data)
211
+ data.gsub!(COMMENT_RE, "")
212
+ data.gsub!(LINE_CONTINUATION_RE, " ")
213
+ data.split(LINE_ENDING_RE).each_with_object({}) do |line, memo|
214
+ element, value = line.split(ANVL_SEPARATOR, 2)
215
+ memo[unescape(element.strip)] = unescape(value.strip)
216
+ end
110
217
  end
111
- end
112
218
 
113
219
  end
114
220
  end
221
+
222
+ Ezid::Metadata.initialize!
data/lib/ezid/request.rb CHANGED
@@ -7,6 +7,7 @@ module Ezid
7
7
  # A request to the EZID service.
8
8
  #
9
9
  # @api private
10
+ #
10
11
  class Request < SimpleDelegator
11
12
 
12
13
  HOST = "https://ezid.cdlib.org"
data/lib/ezid/response.rb CHANGED
@@ -5,6 +5,7 @@ module Ezid
5
5
  # A response from the EZID service.
6
6
  #
7
7
  # @api private
8
+ #
8
9
  class Response < SimpleDelegator
9
10
 
10
11
  # Success response status
data/lib/ezid/session.rb CHANGED
@@ -3,6 +3,7 @@ module Ezid
3
3
  # An EZID session
4
4
  #
5
5
  # @api private
6
+ #
6
7
  class Session
7
8
 
8
9
  attr_reader :cookie
data/lib/ezid/status.rb CHANGED
@@ -1,4 +1,10 @@
1
1
  module Ezid
2
+ #
3
+ # A response to an EZID status request
4
+ #
5
+ # @see Ezid::Response
6
+ # @api private
7
+ #
2
8
  class Status < SimpleDelegator
3
9
 
4
10
  SUBSYSTEMS = %w( noid ldap datacite )
@@ -183,5 +183,26 @@ module Ezid
183
183
  end
184
184
  end
185
185
 
186
+ describe "boolean status methods" do
187
+ context "when the status is 'public'" do
188
+ before { allow(subject.metadata).to receive(:status) { Identifier::PUBLIC } }
189
+ it { is_expected.to be_public }
190
+ it { is_expected.not_to be_reserved }
191
+ it { is_expected.not_to be_unavailable }
192
+ end
193
+ context "when the status is 'reserved'" do
194
+ before { allow(subject.metadata).to receive(:status) { Identifier::RESERVED } }
195
+ it { is_expected.not_to be_public }
196
+ it { is_expected.to be_reserved }
197
+ it { is_expected.not_to be_unavailable }
198
+ end
199
+ context "when the status is 'unavailable'" do
200
+ before { allow(subject.metadata).to receive(:status) { Identifier::UNAVAILABLE } }
201
+ it { is_expected.not_to be_public }
202
+ it { is_expected.not_to be_reserved }
203
+ it { is_expected.to be_unavailable }
204
+ end
205
+ end
206
+
186
207
  end
187
208
  end
@@ -3,11 +3,11 @@ module Ezid
3
3
 
4
4
  describe "reserved elements" do
5
5
  describe "readers" do
6
- Metadata::RESERVED_ELEMENTS.each do |element|
7
- next if element == "_crossref"
6
+ Metadata::RESERVED_ELEMENTS.each do |element|
8
7
  it "should have a reader for '#{element}'" do
9
8
  expect(subject).to receive(:reader).with(element)
10
- subject.send(element.sub("_", ""))
9
+ reader = (element == "_crossref") ? element : element.sub("_", "")
10
+ subject.send(reader)
11
11
  end
12
12
  end
13
13
  describe "for time-based elements" do
@@ -27,7 +27,8 @@ module Ezid
27
27
  next if element == "_crossref"
28
28
  it "should have a writer for '#{element}'" do
29
29
  expect(subject).to receive(:writer).with(element, "value")
30
- subject.send("#{element.sub('_', '')}=", "value")
30
+ writer = ((element == "_crossref") ? element : element.sub("_", "")).concat("=")
31
+ subject.send(writer, "value")
31
32
  end
32
33
  end
33
34
  end
@@ -51,6 +52,15 @@ module Ezid
51
52
  end
52
53
  end
53
54
  end
55
+ next if profile == "dc"
56
+ it "should have a reader for '#{profile}'" do
57
+ expect(subject).to receive(:reader).with(profile)
58
+ subject.send(profile)
59
+ end
60
+ it "should have a writer for '#{profile}'" do
61
+ expect(subject).to receive(:writer).with(profile, "value")
62
+ subject.send("#{profile}=", "value")
63
+ end
54
64
  end
55
65
  end
56
66
  end
metadata CHANGED
@@ -1,43 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ezid-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.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: 2014-12-05 00:00:00.000000000 Z
11
+ date: 2014-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '4.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '4.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '1.6'
19
+ version: '1.7'
34
20
  type: :development
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '1.6'
26
+ version: '1.7'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +44,14 @@ dependencies:
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '3.0'
47
+ version: '3.1'
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '3.0'
54
+ version: '3.1'
69
55
  description: Ruby client for EZID API Version 2 (http://ezid.cdlib.org/doc/apidoc.html)
70
56
  email:
71
57
  - dchandekstark@gmail.com
@@ -88,7 +74,6 @@ files:
88
74
  - lib/ezid/error.rb
89
75
  - lib/ezid/identifier.rb
90
76
  - lib/ezid/metadata.rb
91
- - lib/ezid/metadata_elements.rb
92
77
  - lib/ezid/request.rb
93
78
  - lib/ezid/response.rb
94
79
  - lib/ezid/session.rb
@@ -98,7 +83,6 @@ files:
98
83
  - spec/spec_helper.rb
99
84
  - spec/unit/client_spec.rb
100
85
  - spec/unit/identifier_spec.rb
101
- - spec/unit/metadata_elements_spec.rb
102
86
  - spec/unit/metadata_spec.rb
103
87
  homepage: https://github.com/duke-libraries/ezid-client
104
88
  licenses:
@@ -130,5 +114,4 @@ test_files:
130
114
  - spec/spec_helper.rb
131
115
  - spec/unit/client_spec.rb
132
116
  - spec/unit/identifier_spec.rb
133
- - spec/unit/metadata_elements_spec.rb
134
117
  - spec/unit/metadata_spec.rb
@@ -1,145 +0,0 @@
1
- require "active_support"
2
-
3
- module Ezid
4
- #
5
- # EZID metadata elements
6
- #
7
- # @note Intended to be used only as included in Ezid::Metadata.
8
- #
9
- module MetadataElements
10
- extend ActiveSupport::Concern
11
-
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
- }
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
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
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
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
37
- RESERVED_ELEMENTS = RESERVED_READONLY_ELEMENTS + RESERVED_READWRITE_ELEMENTS + RESERVED_TIME_ELEMENTS
38
-
39
- included do
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
44
-
45
- profile_element_accessors
46
-
47
- element_accessor *PROFILE_ELEMENTS
48
-
49
- # "_crossref" does not get a reserved accessor because of the "crossref" element.
50
- element_accessor "_crossref"
51
- end
52
-
53
- module ClassMethods
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)
61
- end
62
-
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)
73
- elements.each do |element|
74
- define_method(element.sub("_", "")) { reader(element) }
75
- end
76
- end
77
-
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)
83
- elements.each do |element|
84
- define_method(element.sub("_", "")) do
85
- time = reader(element).to_i
86
- return nil if time == 0 # value is nil or empty string
87
- Time.at(time).utc
88
- end
89
- end
90
- end
91
-
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)
102
- elements.each do |element|
103
- define_method("#{element.sub('_', '')}=") do |value|
104
- writer(element, value)
105
- end
106
- end
107
- end
108
-
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
116
-
117
- define_method("#{profile}_#{element}=") do |value|
118
- writer("#{profile}.#{element}", value)
119
- end
120
- end
121
- end
122
- end
123
-
124
- # Creates an accessor for each element
125
- # @param elements [Array<String>] a list of elements
126
- def element_accessor(*elements)
127
- elements.each do |element|
128
- define_method(element) { reader(element) }
129
- define_method("#{element}=") { |value| writer(element, value) }
130
- end
131
- end
132
- end
133
-
134
- private
135
-
136
- def reader(element)
137
- self[element]
138
- end
139
-
140
- def writer(element, value)
141
- self[element] = value
142
- end
143
-
144
- end
145
- end
@@ -1,43 +0,0 @@
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