mead 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +27 -0
- data/Gemfile.lock +56 -0
- data/LICENSE +20 -0
- data/README.rdoc +86 -0
- data/Rakefile +67 -0
- data/VERSION +1 -0
- data/bin/automead +53 -0
- data/bin/ead2meads +90 -0
- data/bin/emv +77 -0
- data/bin/mead2barcode +64 -0
- data/bin/meadbfv +27 -0
- data/lib/mead/barcode.rb +49 -0
- data/lib/mead/container.rb +21 -0
- data/lib/mead/ead.rb +215 -0
- data/lib/mead/ead_validator.rb +46 -0
- data/lib/mead/extractor.rb +198 -0
- data/lib/mead/identifier.rb +112 -0
- data/lib/mead/trollop.rb +38 -0
- data/lib/mead/validations.rb +130 -0
- data/lib/mead.rb +71 -0
- data/mead.gemspec +142 -0
- data/test/ead/mc00145.xml +157 -0
- data/test/ead/mc00240.xml +12523 -0
- data/test/ead/ua015_010.xml +31103 -0
- data/test/ead/ua021_428.xml +146 -0
- data/test/ead/ua023_006.xml +469 -0
- data/test/ead/ua023_031.xml +5202 -0
- data/test/ead/ua110_041.xml +4101 -0
- data/test/fixtures/mc00310.xml +186 -0
- data/test/fixtures/ua023_031.xml +5228 -0
- data/test/helper.rb +38 -0
- data/test/test_barcode.rb +25 -0
- data/test/test_ead.rb +193 -0
- data/test/test_ead_validator.rb +18 -0
- data/test/test_extractor.rb +83 -0
- data/test/test_mc00145.rb +19 -0
- data/test/test_mc00240.rb +140 -0
- data/test/test_mead.rb +5 -0
- data/test/test_ua015_010.rb +111 -0
- data/test/test_ua021_428.rb +26 -0
- data/test/test_ua023_006_buildings.rb +111 -0
- data/test/test_ua023_006_faculty.rb +112 -0
- data/test/test_ua110_041.rb +112 -0
- data/test/test_validations.rb +81 -0
- data/watchr.rb +71 -0
- metadata +338 -0
data/lib/mead/ead.rb
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
module Mead
|
2
|
+
class Ead
|
3
|
+
# factor out :baseurl, :file and :url into an options object?
|
4
|
+
attr_accessor :containers, :ead, :baseurl, :file, :url, :doc, :eadid, :series_present,
|
5
|
+
:c01s_series_answer
|
6
|
+
|
7
|
+
# options include :file and :base_url
|
8
|
+
def initialize(opts={})
|
9
|
+
@eadid = opts[:eadid] || nil
|
10
|
+
@file = opts[:file] || nil
|
11
|
+
@baseurl = opts[:baseurl] || nil
|
12
|
+
@url = opts[:url] || nil
|
13
|
+
@containers = []
|
14
|
+
|
15
|
+
get_ead
|
16
|
+
find_eadid unless @eadid
|
17
|
+
crawl_for_containers
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_ead
|
21
|
+
if @eadid.nil? and @url.nil? and @file.nil? and @baseurl
|
22
|
+
raise 'Cannot get EAD based on params.'
|
23
|
+
end
|
24
|
+
if @file and @file.is_a? File
|
25
|
+
@file.rewind if @file.eof?
|
26
|
+
@ead = @file.read
|
27
|
+
elsif @url
|
28
|
+
@ead = open(@url).read
|
29
|
+
elsif @baseurl
|
30
|
+
@ead = open(File.join(@baseurl, @eadid + '.xml')).read
|
31
|
+
end
|
32
|
+
@doc = Nokogiri::XML(@ead)
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_eadid
|
36
|
+
begin
|
37
|
+
@eadid = @doc.xpath('//xmlns:eadid').first.text
|
38
|
+
rescue => e
|
39
|
+
raise 'Need an eadid and none has been given and it cannot be found in the EAD XML.'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def crawl_for_containers
|
44
|
+
c01s.each_with_index do |c, i|
|
45
|
+
dids = c.xpath('.//xmlns:container').map{|c| c.parent}.uniq
|
46
|
+
#c.xpath('xmlns:c02/xmlns:did').map do |did|
|
47
|
+
dids.map do |did|
|
48
|
+
info = {}
|
49
|
+
if c01s_series?
|
50
|
+
info[:series] = i + 1 # if all the c01s are at the file level this fails
|
51
|
+
else
|
52
|
+
info[:series] = 0
|
53
|
+
end
|
54
|
+
info[:mead] = create_mead(did, i)
|
55
|
+
info[:title] = concat_title(did)
|
56
|
+
# FIXME
|
57
|
+
info[:containers] = text_containers(did)
|
58
|
+
@containers << info
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def text_containers(did)
|
64
|
+
did.xpath('xmlns:container').map do |container|
|
65
|
+
text = ''
|
66
|
+
text << container.attribute('type').text + ' ' if container.attribute('type')
|
67
|
+
text << container.text if container.text
|
68
|
+
text
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def c01s
|
73
|
+
@doc.xpath('//xmlns:dsc/xmlns:c01')
|
74
|
+
end
|
75
|
+
|
76
|
+
def c01s_series?
|
77
|
+
@c01s_series_answer ||= c01s.length == series_c01s.length
|
78
|
+
end
|
79
|
+
|
80
|
+
def series_c01s
|
81
|
+
@doc.xpath("//xmlns:dsc/xmlns:c01[@level='series']")
|
82
|
+
end
|
83
|
+
|
84
|
+
def create_mead(did, i)
|
85
|
+
mead = [@eadid.dup]
|
86
|
+
if c01s_series?
|
87
|
+
mead << "%03d" % (i + 1) #series
|
88
|
+
else
|
89
|
+
mead << '001'
|
90
|
+
end
|
91
|
+
begin
|
92
|
+
mead << specific_containers(did)
|
93
|
+
rescue
|
94
|
+
return @mead = mead.flatten.join('-')
|
95
|
+
end
|
96
|
+
mead << '001' # stub for first record
|
97
|
+
@mead = mead.flatten.join('-')
|
98
|
+
end
|
99
|
+
|
100
|
+
def concat_title(did)
|
101
|
+
title = ''
|
102
|
+
title << did.xpath('xmlns:unittitle').text if did.xpath('xmlns:unittitle')
|
103
|
+
if did.xpath('xmlns:unittitle') and did.xpath('xmlns:unitdate') and !did.xpath('xmlns:unitdate').text.empty?
|
104
|
+
title << ', ' << did.xpath('xmlns:unitdate').text
|
105
|
+
end
|
106
|
+
if did.xpath('xmlns:unitid') and !did.xpath('xmlns:unitid').text.empty?
|
107
|
+
title << ' (' + did.xpath('xmlns:unitid').text + ')'
|
108
|
+
end
|
109
|
+
title
|
110
|
+
end
|
111
|
+
|
112
|
+
def specific_containers(did)
|
113
|
+
containers = did.xpath('xmlns:container')
|
114
|
+
container_values = []
|
115
|
+
if containers.length == 1
|
116
|
+
container_values << make_box(did.xpath('xmlns:container')[0])
|
117
|
+
container_values << '000'
|
118
|
+
elsif containers.length == 2
|
119
|
+
container_values << make_box(did.xpath('xmlns:container')[0])
|
120
|
+
container_values << make_box(did.xpath('xmlns:container')[1],3)
|
121
|
+
elsif containers.length > 2
|
122
|
+
raise "I can't create a mead identifier with more than 2 containers in a did!"
|
123
|
+
else
|
124
|
+
raise "Do we really have zero containers?!"
|
125
|
+
end
|
126
|
+
return container_values
|
127
|
+
end
|
128
|
+
|
129
|
+
def make_box(container, padding=4)
|
130
|
+
# FIXME: pad based on first part of range for folder +++
|
131
|
+
padder = "%0" + padding.to_s + 's'
|
132
|
+
text = (padder % container.text).gsub(' ','0').gsub('.','_').gsub('-', '~')
|
133
|
+
container_type(container) + text
|
134
|
+
end
|
135
|
+
|
136
|
+
def container_type(container)
|
137
|
+
match =''
|
138
|
+
CONTAINER_MAPPING.each do |k,v|
|
139
|
+
if container.attribute('type').text == v or
|
140
|
+
container.attribute('type').text.downcase == v
|
141
|
+
match = k
|
142
|
+
end
|
143
|
+
end
|
144
|
+
match
|
145
|
+
end
|
146
|
+
|
147
|
+
def to_csv
|
148
|
+
Mead::Ead.to_csv(self.containers)
|
149
|
+
end
|
150
|
+
|
151
|
+
def self.to_csv(container_list)
|
152
|
+
if CSV.const_defined? :Reader
|
153
|
+
csv_class = FasterCSV # old CSV was loaded
|
154
|
+
else
|
155
|
+
csv_class = CSV # use CSV from 1.9
|
156
|
+
end
|
157
|
+
csv_string = csv_class.generate do |csv|
|
158
|
+
# FIXME
|
159
|
+
csv << ['mead','title','series', 'containers']
|
160
|
+
#csv << ['mead','title','series']
|
161
|
+
container_list.each do |container|
|
162
|
+
csv << [container[:mead], container[:title], container[:series], container[:containers].join(', ')]
|
163
|
+
#csv << [container[:mead], container[:title], container[:series]]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def valid?
|
169
|
+
if unique_meads.length == @containers.length
|
170
|
+
if short_meads?
|
171
|
+
false
|
172
|
+
else
|
173
|
+
true
|
174
|
+
end
|
175
|
+
else
|
176
|
+
false
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def unique_meads
|
181
|
+
@containers.collect{|container| container[:mead]}.uniq
|
182
|
+
end
|
183
|
+
|
184
|
+
def long_meads
|
185
|
+
unique_meads.select{|m| m.split('-').length > 2}
|
186
|
+
end
|
187
|
+
|
188
|
+
def short_meads
|
189
|
+
unique_meads.select{|m| m.split('-').length <= 2}
|
190
|
+
end
|
191
|
+
|
192
|
+
def short_meads?
|
193
|
+
if unique_meads.length == long_meads.length
|
194
|
+
false
|
195
|
+
else
|
196
|
+
true
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def invalid
|
201
|
+
duplicates = dups
|
202
|
+
@containers.select{|container| duplicates.include?(container[:mead])}
|
203
|
+
end
|
204
|
+
|
205
|
+
def dups
|
206
|
+
meads.inject({}) {|h,v| h[v]=h[v].to_i+1; h}.reject{|k,v| v==1}.keys.sort
|
207
|
+
end
|
208
|
+
|
209
|
+
def meads
|
210
|
+
@containers.collect{|container| container[:mead]}
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Mead
|
2
|
+
class EadValidator
|
3
|
+
attr_accessor :directory, :valid, :invalid, :invalid_full
|
4
|
+
|
5
|
+
# Creates a new EadValidator when given the path to a directory as a String
|
6
|
+
def initialize(directory)
|
7
|
+
@directory = directory
|
8
|
+
@valid = []
|
9
|
+
@invalid = []
|
10
|
+
@invalid_full = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate!
|
14
|
+
files = Dir.glob(File.join(@directory, '*.xml')).sort
|
15
|
+
threads = []
|
16
|
+
files.map do |path|
|
17
|
+
threads << Thread.new(path) do |path_t|
|
18
|
+
eadid = File.basename(path_t, '.xml')
|
19
|
+
begin
|
20
|
+
ead = Mead::Ead.new({:file => File.open(path_t), :eadid => eadid})
|
21
|
+
rescue => e
|
22
|
+
record_invalid(eadid, ead, e)
|
23
|
+
next
|
24
|
+
end
|
25
|
+
if ead.valid?
|
26
|
+
@valid << eadid
|
27
|
+
else
|
28
|
+
record_invalid(eadid, ead)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
threads.each { |thread| thread.join }
|
33
|
+
metadata
|
34
|
+
end
|
35
|
+
|
36
|
+
def record_invalid(eadid, ead, error=nil)
|
37
|
+
@invalid << eadid
|
38
|
+
@invalid_full << {:eadid => eadid, :error => error, :dups => ead.dups, :containers => ead.invalid}
|
39
|
+
end
|
40
|
+
|
41
|
+
def metadata
|
42
|
+
{:valid => @valid.sort, :invalid => @invalid.sort}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,198 @@
|
|
1
|
+
module Mead
|
2
|
+
class Extractor
|
3
|
+
|
4
|
+
attr_accessor :mead, :dsc, :series, :doc, :ead_location, :stack, :node
|
5
|
+
|
6
|
+
# a stack contains the data (unittitle, unitdate) from the identifier's
|
7
|
+
# container all the way through to parent containers. The order is from
|
8
|
+
# most specific to least specific
|
9
|
+
def initialize(mead)
|
10
|
+
@stack = []
|
11
|
+
get_mead_obj(mead)
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def extract
|
16
|
+
get_ead_location
|
17
|
+
eadxml = get_eadxml
|
18
|
+
@doc = Nokogiri::XML(eadxml)
|
19
|
+
do_extraction
|
20
|
+
@mead.metadata = @stack # make sure the metadata always gets cached to the identifier
|
21
|
+
return @stack
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def get_mead_obj(mead)
|
27
|
+
if mead.is_a? Mead::Identifier
|
28
|
+
@mead = mead
|
29
|
+
else
|
30
|
+
raise "is not a Mead::Identifier"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_ead_location
|
35
|
+
if mead.ead_location
|
36
|
+
@ead_location = mead.ead_location
|
37
|
+
else
|
38
|
+
raise 'Cannot extract because no Ead location defined in Mead::Identifier.'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def do_extraction
|
43
|
+
get_dsc
|
44
|
+
get_series
|
45
|
+
find_node
|
46
|
+
push_to_stack(@node)
|
47
|
+
end
|
48
|
+
|
49
|
+
def push_to_stack(node)
|
50
|
+
return nil if node.nil?
|
51
|
+
additional_did = {:unittitle => container_field('unittitle', node),
|
52
|
+
:unitdate => container_field('unitdate', node),
|
53
|
+
:level => container_level(node),
|
54
|
+
:unitid => container_field('unitid', node)
|
55
|
+
}
|
56
|
+
did_location_text = did_location(node)
|
57
|
+
additional_did[:item_location] = did_location_text if did_location_text
|
58
|
+
|
59
|
+
add_containers(additional_did, node)
|
60
|
+
|
61
|
+
if additional_did[:level] == 'series'
|
62
|
+
additional_did[:series_number] = series_number(node)
|
63
|
+
end
|
64
|
+
if @stack.last == additional_did
|
65
|
+
return
|
66
|
+
end
|
67
|
+
@stack << additional_did
|
68
|
+
if !node.parent.parent.xpath('xmlns:did').empty?
|
69
|
+
push_to_stack(node.parent.parent.xpath('xmlns:did')[0])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def add_containers(hash, node)
|
74
|
+
if !node.xpath('./xmlns:container').empty?
|
75
|
+
hash[:containers] = []
|
76
|
+
node.xpath('./xmlns:container').each do |container|
|
77
|
+
c = Mead::Container.new
|
78
|
+
c.type = container.attribute('type').text if container.attribute('type')
|
79
|
+
c.label = container.attribute('label').text if container.attribute('label')
|
80
|
+
c.text = container.text if !container.text.empty?
|
81
|
+
hash[:containers] << c
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def did_location(did)
|
87
|
+
location = []
|
88
|
+
did.xpath('./xmlns:container').each do |container|
|
89
|
+
location << container.attribute('type').text + ' ' + container.text
|
90
|
+
end
|
91
|
+
unless location.empty?
|
92
|
+
location.join(', ')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_series
|
97
|
+
c01_series = @dsc.xpath(".//xmlns:c01[@level='series']")
|
98
|
+
if c01_series and !c01_series.empty?
|
99
|
+
c01_series.each_with_index do |c01, i|
|
100
|
+
if mead.series.to_i == i + 1
|
101
|
+
@series = c01
|
102
|
+
end
|
103
|
+
end
|
104
|
+
else
|
105
|
+
@series = @dsc
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def folder_types
|
110
|
+
types = "@type='#{@mead.folder[:type]}' or @type='#{@mead.folder[:type].capitalize}'"
|
111
|
+
if @mead.folder[:type] == 'folder'
|
112
|
+
types << " or @type='envelope' or @type='Envelope'"
|
113
|
+
end
|
114
|
+
types
|
115
|
+
end
|
116
|
+
|
117
|
+
def find_node(folder=true)
|
118
|
+
#dsc_dids = series.xpath('.//xmlns:did')
|
119
|
+
if @mead.container[:type]
|
120
|
+
container_set_xpath = ".//xmlns:container[text()='#{@mead.container[:number]}' and (@type='#{@mead.container[:type]}' or @type='#{@mead.container[:type].capitalize}')]"
|
121
|
+
if folder and @mead.folder
|
122
|
+
container_set_xpath << "/../xmlns:container[text()='#{@mead.folder[:number]}' and (#{folder_types})]"
|
123
|
+
end
|
124
|
+
containers = series.xpath(container_set_xpath)
|
125
|
+
#matching_dids
|
126
|
+
if containers.length > 1
|
127
|
+
raise "too many matching nodes!"
|
128
|
+
elsif containers.length == 0
|
129
|
+
# Second chance to handle legacy identifiers where a blank folder was given as 001
|
130
|
+
if @mead.folder[:number] == '1'
|
131
|
+
#@mead.folder = nil #TODO: check do 000 folders get automatically turned to nil when the mead is created?
|
132
|
+
find_node(false)
|
133
|
+
else
|
134
|
+
raise "no matching dids!"
|
135
|
+
end
|
136
|
+
else
|
137
|
+
@node = containers[0].parent
|
138
|
+
end
|
139
|
+
else
|
140
|
+
return nil
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def container_field(field, node)
|
145
|
+
xpath = 'xmlns:' + field
|
146
|
+
if node.xpath(xpath)
|
147
|
+
text = node.xpath(xpath).text
|
148
|
+
if text.nil? or text.empty?
|
149
|
+
return nil
|
150
|
+
else
|
151
|
+
return text
|
152
|
+
end
|
153
|
+
else
|
154
|
+
nil
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def container_level(node)
|
159
|
+
if node.parent['level']
|
160
|
+
node.parent['level']
|
161
|
+
else
|
162
|
+
nil
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def series_number(node)
|
167
|
+
parent_node = node.parent
|
168
|
+
siblings = node.document.xpath('//xmlns:c01')
|
169
|
+
length = siblings.length
|
170
|
+
index = siblings.index(parent_node) + 1
|
171
|
+
index
|
172
|
+
end
|
173
|
+
|
174
|
+
def get_dsc
|
175
|
+
@dsc = @doc.xpath('//xmlns:dsc')
|
176
|
+
end
|
177
|
+
|
178
|
+
def get_eadxml
|
179
|
+
tries = 5
|
180
|
+
begin
|
181
|
+
if @ead_location.respond_to? :read
|
182
|
+
@ead_location.read
|
183
|
+
else
|
184
|
+
return open(@ead_location).read
|
185
|
+
end
|
186
|
+
rescue => e
|
187
|
+
tries -= 1
|
188
|
+
if tries > 0
|
189
|
+
retry
|
190
|
+
else
|
191
|
+
raise "Could not get record by eadid! " + e.inspect
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Mead
|
2
|
+
class Identifier
|
3
|
+
|
4
|
+
attr_accessor :mead, :eadid, :series, :container, :folder, :sequence, :page,
|
5
|
+
:ead_location, :metadata
|
6
|
+
include Mead::Validations
|
7
|
+
validates_format_of_mead
|
8
|
+
validates_presence_of_mead
|
9
|
+
validates_numericality_of_mead :sequence, :page
|
10
|
+
|
11
|
+
# If a location is given then extraction can take place
|
12
|
+
def initialize(mead, ead_location=nil)
|
13
|
+
@mead = mead
|
14
|
+
@metadata = nil
|
15
|
+
parse_mead 'eadid', 'series', 'container', 'folder', 'sequence'
|
16
|
+
@ead_location = parse_ead_location(ead_location)
|
17
|
+
split_container
|
18
|
+
split_folder
|
19
|
+
split_page
|
20
|
+
clean_zeros 'series', 'sequence', 'page'
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_mead(*args)
|
25
|
+
parts = @mead.split('-')
|
26
|
+
args.each_with_index do |field, i|
|
27
|
+
instance_variable_set('@' + field, parts[i])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def split_container
|
32
|
+
type = CONTAINER_MAPPING[ @container[0,2] ]
|
33
|
+
number = strip_zeros(container_number_transforms(@container[2,10]))
|
34
|
+
@container = {:type=> type, :number=> number}
|
35
|
+
end
|
36
|
+
|
37
|
+
def split_folder
|
38
|
+
if CONTAINER_MAPPING.keys.include?(@folder[0,2])
|
39
|
+
type = CONTAINER_MAPPING[ @folder[0,2] ]
|
40
|
+
number = strip_zeros(container_number_transforms(@folder[2,10]))
|
41
|
+
else
|
42
|
+
type = 'folder'
|
43
|
+
number = strip_zeros(container_number_transforms(@folder))
|
44
|
+
end
|
45
|
+
if number.nil? or (number and number.empty?)
|
46
|
+
@folder = nil
|
47
|
+
else
|
48
|
+
@folder = {:type=> type, :number=> number}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def container_number_transforms(string)
|
53
|
+
string.gsub('_','.').gsub('~', '-').gsub(/^0*/,'')
|
54
|
+
end
|
55
|
+
|
56
|
+
def clean_zeros(*args)
|
57
|
+
args.each do |field|
|
58
|
+
instance_var = instance_variable_get('@' + field)
|
59
|
+
if instance_var
|
60
|
+
cleaned_value = strip_zeros(instance_var)
|
61
|
+
instance_variable_set('@' + field, cleaned_value)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def strip_zeros(num)
|
67
|
+
num.sub(/^0+/,'')
|
68
|
+
end
|
69
|
+
|
70
|
+
def split_page
|
71
|
+
@sequence, @page = sequence.split('_')
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_ead_location(loc)
|
75
|
+
return nil if loc.nil?
|
76
|
+
if loc
|
77
|
+
if loc.is_a? File
|
78
|
+
loc.rewind if loc.eof?
|
79
|
+
@ead_location = loc
|
80
|
+
elsif loc.include?('http://')
|
81
|
+
if loc.include?(@eadid)
|
82
|
+
@ead_location = loc
|
83
|
+
else
|
84
|
+
@ead_location = File.join(loc, @eadid + '.xml')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def extract
|
91
|
+
@metadata = Mead::Extractor.new(self).extract
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
95
|
+
# def ead_has_series?
|
96
|
+
# if series > 1
|
97
|
+
# true
|
98
|
+
# else
|
99
|
+
# if
|
100
|
+
# false
|
101
|
+
# end
|
102
|
+
# end
|
103
|
+
|
104
|
+
# def replace_underscores(*args)
|
105
|
+
# args.each do |field|
|
106
|
+
# value = instance_variable_get('@' + field).gsub('_', '.')
|
107
|
+
# instance_variable_set('@' + field, value)
|
108
|
+
# end
|
109
|
+
# end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
data/lib/mead/trollop.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module Mead
|
2
|
+
module TrollopOptions
|
3
|
+
def check_options(opts)
|
4
|
+
number_of_get_methods = [:baseurl, :url, :file].inject(0) do |memo, option|
|
5
|
+
temp_memo = memo
|
6
|
+
temp_memo += 1 if opts[option]
|
7
|
+
temp_memo
|
8
|
+
end
|
9
|
+
if number_of_get_methods > 1
|
10
|
+
Trollop::die 'Must specify ONLY one way to get the Ead XML'
|
11
|
+
elsif number_of_get_methods == 0
|
12
|
+
Trollop::die 'Must specify at least one way to get the Ead XML'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_location_options(opts)
|
17
|
+
location_options = {}
|
18
|
+
if opts[:baseurl]
|
19
|
+
location_options[:baseurl] = opts[:baseurl]
|
20
|
+
elsif opts[:url]
|
21
|
+
location_options[:url] = opts[:url]
|
22
|
+
elsif opts[:file]
|
23
|
+
location_options[:file] = File.open(opts[:file])
|
24
|
+
end
|
25
|
+
location_options
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_location(opts)
|
29
|
+
if opts[:baseurl]
|
30
|
+
opts[:baseurl]
|
31
|
+
elsif opts[:url]
|
32
|
+
opts[:url]
|
33
|
+
elsif opts[:file]
|
34
|
+
File.open(opts[:file])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|