lyber-core 1.3.0 → 3.2.2
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 +15 -0
- data/LICENSE +1 -1
- data/README.md +81 -0
- data/lib/lyber_core.rb +1 -15
- data/lib/lyber_core/destroyer.rb +2 -9
- data/lib/lyber_core/log.rb +26 -30
- data/lib/lyber_core/robot.rb +67 -0
- metadata +131 -370
- data/README.rdoc +0 -76
- data/lib/dlss_service.rb +0 -81
- data/lib/dor_service.rb +0 -588
- data/lib/lyber_core/config.rb +0 -13
- data/lib/lyber_core/connection.rb +0 -130
- data/lib/lyber_core/exceptions/chained_error.rb +0 -21
- data/lib/lyber_core/exceptions/empty_queue.rb +0 -9
- data/lib/lyber_core/exceptions/fatal_error.rb +0 -10
- data/lib/lyber_core/exceptions/item_error.rb +0 -19
- data/lib/lyber_core/exceptions/service_error.rb +0 -10
- data/lib/lyber_core/robots/robot.rb +0 -333
- data/lib/lyber_core/robots/service_controller.rb +0 -174
- data/lib/lyber_core/robots/work_item.rb +0 -112
- data/lib/lyber_core/robots/work_queue.rb +0 -177
- data/lib/lyber_core/robots/workflow.rb +0 -104
- data/lib/lyber_core/robots/workspace.rb +0 -77
- data/lib/lyber_core/utils.rb +0 -4
- data/lib/lyber_core/utils/bagit_bag.rb +0 -100
- data/lib/lyber_core/utils/checksum_validate.rb +0 -65
- data/lib/lyber_core/utils/file_utilities.rb +0 -168
- data/lib/xml_models/identity_metadata/dublin_core.rb +0 -116
- data/lib/xml_models/identity_metadata/identity_metadata.rb +0 -264
@@ -1,116 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
|
-
#<oai_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
|
4
|
-
#xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
5
|
-
#xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://cosimo.stanford.edu/standards/oai_dc/v2/oai_dc.xsd">
|
6
|
-
# <dc:title>Life of Abraham Lincoln, sixteenth president of the United States: Containing his early
|
7
|
-
#history and political career; together with the speeches, messages, proclamations and other official
|
8
|
-
#documents illus. of his eventful administration</dc:title>
|
9
|
-
# <dc:creator>Crosby, Frank.</dc:creator>
|
10
|
-
# <dc:format>text</dc:format>
|
11
|
-
# <dc:language>eng</dc:language>
|
12
|
-
# <dc:subject>E457 .C94</dc:subject>
|
13
|
-
# <dc:identifier>lccn:11030686</dc:identifier>
|
14
|
-
# <dc:identifier>callseq:1</dc:identifier>
|
15
|
-
# <dc:identifier>shelfseq:973.7111 .L731CR</dc:identifier>
|
16
|
-
# <dc:identifier>catkey:1206382</dc:identifier>
|
17
|
-
# <dc:identifier>barcode:36105005459602</dc:identifier>
|
18
|
-
# <dc:identifier>uuid:ddcf5f1a-0331-4345-beca-e66f7db276eb</dc:identifier>
|
19
|
-
# <dc:identifier>google:STANFORD_36105005459602</dc:identifier>
|
20
|
-
# <dc:identifier>druid:ng786kn0371</dc:identifier>
|
21
|
-
#</oai_dc:dc>
|
22
|
-
|
23
|
-
class DublinCore
|
24
|
-
|
25
|
-
|
26
|
-
attr_accessor :xml
|
27
|
-
|
28
|
-
attr_accessor :title
|
29
|
-
attr_accessor :creator
|
30
|
-
attr_accessor :subject
|
31
|
-
attr_accessor :description
|
32
|
-
attr_accessor :publisher
|
33
|
-
attr_accessor :contributor
|
34
|
-
attr_accessor :date
|
35
|
-
attr_accessor :type
|
36
|
-
attr_accessor :format
|
37
|
-
attr_accessor :identifier
|
38
|
-
attr_accessor :source
|
39
|
-
attr_accessor :language
|
40
|
-
attr_accessor :relation
|
41
|
-
attr_accessor :coverage
|
42
|
-
attr_accessor :rights
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
def initialize(xml = nil)
|
48
|
-
|
49
|
-
@title ||= []
|
50
|
-
@creator ||= []
|
51
|
-
@subject ||= []
|
52
|
-
@description ||= []
|
53
|
-
@publisher ||= []
|
54
|
-
@contributor ||= []
|
55
|
-
@date ||= []
|
56
|
-
@type ||= []
|
57
|
-
@format ||= []
|
58
|
-
@identifier ||= []
|
59
|
-
@source ||= []
|
60
|
-
@language ||= []
|
61
|
-
@relation ||= []
|
62
|
-
@coverage ||= []
|
63
|
-
@rights ||= []
|
64
|
-
|
65
|
-
# if the new is given an xml string, store that in the xml attr_accessor and don't rebuild.
|
66
|
-
# this will allow users to access the raw unprocessed XML string via @xml.
|
67
|
-
if xml.nil?
|
68
|
-
build_xml()
|
69
|
-
else
|
70
|
-
@xml = xml
|
71
|
-
end
|
72
|
-
|
73
|
-
end #initalize
|
74
|
-
|
75
|
-
|
76
|
-
def build_xml()
|
77
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
78
|
-
xml.dc('xmlns:dc' => 'http://purl.org/dc/elements/1.1/', 'xmlns:srw_dc' => 'info:srw/schema/1/dc-schema', "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance" ) {
|
79
|
-
xml.parent.namespace = xml.parent.add_namespace_definition('oai_dc','http://www.openarchives.org/OAI/2.0/oai_dc/')
|
80
|
-
xml.parent.add_namespace_definition("xsi:schemaLocation", "http://www.openarchives.org/OAI/2.0/oai_dc/ http://cosimo.stanford.edu/standards/oai_dc/v2/oai_dc.xsd")
|
81
|
-
self.instance_variables.each do |var|
|
82
|
-
unless var == "@xml"
|
83
|
-
self.instance_variable_get(var).each { |v| xml['dc'].send("#{var.gsub('@','')}_", v) }
|
84
|
-
end #unless
|
85
|
-
end #instance_Variables.each
|
86
|
-
}
|
87
|
-
end
|
88
|
-
@xml = builder.to_xml
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
# This method rebuilds the xml attr_accesor and returns it as a string.
|
94
|
-
def to_xml
|
95
|
-
build_xml
|
96
|
-
return self.xml
|
97
|
-
end #to_xml
|
98
|
-
|
99
|
-
|
100
|
-
# This method takes DC XML as a string, and maps the root child node to their proper attr_accesor.
|
101
|
-
|
102
|
-
def self.from_xml(xml="")
|
103
|
-
dc = DublinCore.new(xml)
|
104
|
-
doc = Nokogiri::XML(xml)
|
105
|
-
children = doc.root.element_children
|
106
|
-
children.each do |c|
|
107
|
-
if dc.instance_variables.include?("@#{c.name}")
|
108
|
-
dc.send("#{c.name}").send("<<", c.text.strip)
|
109
|
-
end #if
|
110
|
-
end #each
|
111
|
-
return dc
|
112
|
-
end #from_xml
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
end #dublin_core
|
@@ -1,264 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
#<identityMetadata>
|
3
|
-
# <objectId>druid:rt923jk342</objectId>
|
4
|
-
# <objectType>item</objectType>
|
5
|
-
# <objectLabel>google download barcode 36105049267078</objectLabel>
|
6
|
-
# <objectCreator>DOR</objectCreator>
|
7
|
-
# <citationTitle>Squirrels of North America</citationTitle>
|
8
|
-
# <citationCreator>Eder, Tamara, 1974-</citationCreator>
|
9
|
-
# <sourceId source="google">STANFORD_342837261527</sourceId>
|
10
|
-
# <otherId name="barcode">342837261527</otherId>
|
11
|
-
# <otherId name="catkey">129483625</otherId>
|
12
|
-
# <otherId name="uuid">7f3da130-7b02-11de-8a39-0800200c9a66</otherId>
|
13
|
-
# <agreementId>druid:yh72ms9133</agreementId>
|
14
|
-
# <tag>Google Books : Phase 1</tag>
|
15
|
-
# <tag>Google Books : Scan source STANFORD</tag>
|
16
|
-
#</identityMetadata>
|
17
|
-
|
18
|
-
|
19
|
-
# this just maps the #value method to return the "text", "source", "name" values form the hash
|
20
|
-
class SourceId
|
21
|
-
attr_accessor :source
|
22
|
-
attr_accessor :value
|
23
|
-
|
24
|
-
def xml_values
|
25
|
-
[self.value, {:source => self.source}]
|
26
|
-
end
|
27
|
-
|
28
|
-
def to_s
|
29
|
-
"#{self.source}:#{self.value}"
|
30
|
-
end
|
31
|
-
|
32
|
-
def empty?
|
33
|
-
(self.source.nil? || self.source.empty?) && (self.value.nil? || self.value.empty?)
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
class OtherId
|
39
|
-
attr_accessor :name
|
40
|
-
attr_accessor :value
|
41
|
-
|
42
|
-
def xml_values
|
43
|
-
[self.value, {:name => self.name}]
|
44
|
-
end
|
45
|
-
|
46
|
-
def to_s
|
47
|
-
"#{self.name}:#{self.value}"
|
48
|
-
end
|
49
|
-
|
50
|
-
def empty?
|
51
|
-
(self.name.nil? || self.name.empty?) && (self.value.nil? || self.value.empty?)
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
class Tag
|
57
|
-
attr_accessor :value
|
58
|
-
|
59
|
-
def xml_values
|
60
|
-
[self.value]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
class IdentityMetadata
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
# these are single values
|
70
|
-
attr_accessor :objectId
|
71
|
-
attr_reader :sourceId, :tags
|
72
|
-
# these instance vars map to nodes in the identityMetadata XML
|
73
|
-
attr_accessor :objectTypes, :objectLabels, :objectCreators, :citationCreators, :citationTitle,
|
74
|
-
:otherIds, :agreementIds, :objectAdminClass
|
75
|
-
# this stores the xml string
|
76
|
-
attr_accessor :xml
|
77
|
-
|
78
|
-
|
79
|
-
def initialize(xml = nil)
|
80
|
-
|
81
|
-
@objectId, @citationTitle, @objectAdminClass = "", "", "" #there can only be one of these values
|
82
|
-
@sourceId = SourceId.new #there can be only one.
|
83
|
-
@otherIds, @tags = [], [] # this is an array that will be filled with OtherId and Tag objects
|
84
|
-
@objectTypes, @objectLabels, @objectCreators, @citationCreators, @agreementIds = [], [], [], [], [], []
|
85
|
-
|
86
|
-
|
87
|
-
# if the new is given an xml string, store that in the xml attr_accessor and don't rebuild.
|
88
|
-
# this will allow users to access the raw unprocessed XML string via @xml.
|
89
|
-
if xml.nil?
|
90
|
-
build_xml()
|
91
|
-
else
|
92
|
-
@xml = xml
|
93
|
-
end
|
94
|
-
end #def init
|
95
|
-
|
96
|
-
#this builds the xml based on the instance variables in the object. If it's a hash, this assumes that we want to
|
97
|
-
#use attributes ==> {"text"=> "7f3da130-7b02-11de-8a39-0800200c9a66", "name" => "uuid" }. If the instance var is
|
98
|
-
# an array, we assume we don't need attrs, so all values get put into the text node.
|
99
|
-
def build_xml()
|
100
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
101
|
-
xml.identityMetadata {
|
102
|
-
self.instance_variables.each do |var_name|
|
103
|
-
unless var_name == "@xml"
|
104
|
-
var = self.instance_variable_get(var_name)
|
105
|
-
tag_name = var_name[1..-1]
|
106
|
-
if var.is_a?(Array)
|
107
|
-
tag_name.chomp!('s')
|
108
|
-
end
|
109
|
-
# wrap the singleton properties in a one-element array
|
110
|
-
var = [var] unless var.respond_to?(:each)
|
111
|
-
var.each do |v|
|
112
|
-
if v.respond_to?(:xml_values)
|
113
|
-
unless (v.respond_to?(:empty?) && v.empty?)
|
114
|
-
xml.send(tag_name, *(v.xml_values))
|
115
|
-
end
|
116
|
-
else
|
117
|
-
xml.send(tag_name, v.to_s)
|
118
|
-
end
|
119
|
-
end #var.each
|
120
|
-
end #unless
|
121
|
-
end #instance_variables.each
|
122
|
-
}
|
123
|
-
end
|
124
|
-
@xml = builder.to_xml
|
125
|
-
end
|
126
|
-
|
127
|
-
# This method rebuilds the xml attr_accesor and returns it as a string.
|
128
|
-
def to_xml
|
129
|
-
build_xml
|
130
|
-
return self.xml
|
131
|
-
end #to_xml
|
132
|
-
|
133
|
-
#
|
134
|
-
# The following methods are convience methods
|
135
|
-
#
|
136
|
-
|
137
|
-
|
138
|
-
# Add a new tag to the IdentityMetadata instance
|
139
|
-
def add_tag(new_tag_value)
|
140
|
-
# Make sure tag is not already present
|
141
|
-
unless self.get_tags.include?(new_tag_value)
|
142
|
-
tag = Tag.new
|
143
|
-
tag.value = new_tag_value
|
144
|
-
self.tags << tag
|
145
|
-
end
|
146
|
-
return self.get_tags
|
147
|
-
end
|
148
|
-
|
149
|
-
alias :tag :add_tag
|
150
|
-
|
151
|
-
# Returns an array of tag values
|
152
|
-
def get_tags()
|
153
|
-
self.tags.collect { |t| t.value }
|
154
|
-
end
|
155
|
-
|
156
|
-
# Convenience method to return the first agreementId. There's usually only one.
|
157
|
-
# Returns nil if there are no agreementIds.
|
158
|
-
def agreementId
|
159
|
-
@agreementIds.first
|
160
|
-
end
|
161
|
-
|
162
|
-
|
163
|
-
# Return the OtherId hash for the specified identier name
|
164
|
-
def get_other_id(name)
|
165
|
-
self.otherIds.each do |oi|
|
166
|
-
if oi.name == name
|
167
|
-
return oi
|
168
|
-
end
|
169
|
-
end
|
170
|
-
return nil
|
171
|
-
end
|
172
|
-
|
173
|
-
# Return the identifier value for the specified identier name
|
174
|
-
def get_identifier_value(key)
|
175
|
-
other_id = self.get_other_id(key)
|
176
|
-
if other_id != nil && other_id.value != nil
|
177
|
-
return other_id.value
|
178
|
-
end
|
179
|
-
raise "No #{key} indentifier found for druid #{@objectId}"
|
180
|
-
end
|
181
|
-
|
182
|
-
# Add a new name,value pair to the set of identifiers
|
183
|
-
def add_identifier(*args)
|
184
|
-
(key,value) = args
|
185
|
-
if value.nil? and key =~ /:/
|
186
|
-
(key,value) = key.split(/:/,2)
|
187
|
-
end
|
188
|
-
|
189
|
-
other_id = self.get_other_id(key)
|
190
|
-
if (other_id != nil)
|
191
|
-
other_id.value = value
|
192
|
-
else
|
193
|
-
other_id = OtherId.new
|
194
|
-
other_id.name = key
|
195
|
-
other_id.value = value
|
196
|
-
self.otherIds << other_id
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
def sourceId=(*args)
|
201
|
-
(source,value) = args
|
202
|
-
if value.nil? and source =~ /:/
|
203
|
-
(source,value) = source.split(/:/,2)
|
204
|
-
end
|
205
|
-
|
206
|
-
self.sourceId.source = source
|
207
|
-
self.sourceId.value = value
|
208
|
-
end
|
209
|
-
|
210
|
-
# Return an array of strings where each entry consists of name:value
|
211
|
-
def get_id_pairs
|
212
|
-
pairs=Array.new
|
213
|
-
self.otherIds.collect do |other_id|
|
214
|
-
other_id.to_s
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
#another convience method to allow citationCreator=
|
219
|
-
def citationCreator=(creator)
|
220
|
-
if creator.is_a?(Array)
|
221
|
-
self.citationCreators = creator
|
222
|
-
elsif creator.is_a?(String)
|
223
|
-
self.citationCreators = [creator]
|
224
|
-
else
|
225
|
-
raise "Identity_metadata.citationCreator requires either a string or array. "
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
#takes a string of XML and constructs the object with all the instance variables added to the correct location.
|
230
|
-
def self.from_xml(xml="")
|
231
|
-
if xml.is_a?(File)
|
232
|
-
xml = xml.read
|
233
|
-
end
|
234
|
-
|
235
|
-
im = self.new(xml)
|
236
|
-
doc = Nokogiri::XML(xml)
|
237
|
-
|
238
|
-
children = doc.root.element_children #iterate through the nodes and map them to instance vars in the object.
|
239
|
-
children.each do |c|
|
240
|
-
if im.instance_variables.include?("@#{c.name}") or im.instance_variables.include?("@#{c.name}s")
|
241
|
-
if c.name == "sourceId" #SourceID already has a SourceID object made
|
242
|
-
im.sourceId.source = c["source"]
|
243
|
-
im.sourceId.value = c.text.strip
|
244
|
-
elsif c.name == "otherId" #otherID needs to be cast as an object and stored in an array
|
245
|
-
im.add_identifier(c['name'],c.text.strip)
|
246
|
-
elsif c.name == "tag" #tags also need to have objects created and stored in an array
|
247
|
-
im.add_tag(c.text.strip)
|
248
|
-
elsif c.name == "objectId" # objectId needs to be mapped to objectId attr_access
|
249
|
-
im.objectId = c.text.strip
|
250
|
-
elsif c.name == "citationTitle" #citationTitle also needs to be mapped to citationTitle attr_accessor
|
251
|
-
im.citationTitle = c.text.strip
|
252
|
-
elsif c.name == "objectAdminClass" #objectAdminClass also needs to be mapped to objectAdminClass attr_accessor
|
253
|
-
im.objectAdminClass = c.text.strip
|
254
|
-
else # everything else gets put into an attr_accessor array (note the added 's' on the attr_accessor.)
|
255
|
-
im.send("#{c.name}s").send("<<", c.text.strip)
|
256
|
-
end #if
|
257
|
-
end #if
|
258
|
-
end #each
|
259
|
-
|
260
|
-
return im
|
261
|
-
|
262
|
-
end #from_xml
|
263
|
-
|
264
|
-
end #class IdentityMetadata
|