class CDMDEXER::OaiRequest
Light wrapper around OAI requests Enhances OAI responses with handles sets, records, etc and adds a little extra value to their data with a keyed set lookup, filters for deleted and non-deleted records
Attributes
after_date[R]
client[R]
endpoint_url[R]
resumption_token[R]
set_spec[R]
Public Class Methods
new(endpoint_url: '', resumption_token: nil, set_spec: nil, client: Net::HTTP, after_date: false)
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 19 def initialize(endpoint_url: '', resumption_token: nil, set_spec: nil, client: Net::HTTP, after_date: false) @endpoint_url = endpoint_url @resumption_token = resumption_token @client = client @set_spec = set_spec ? "&set=#{set_spec}" : '' @after_date = after_date end
Public Instance Methods
deletable_ids()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 52 def deletable_ids records.select do |record| if record['status'] == 'deleted' after_date ? Time.parse(record['datestamp']) >= after_date : true end end.map { |record| record[:id] } end
next_resumption_token()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 48 def next_resumption_token identifier_request.at_path('OAI_PMH/ListIdentifiers/resumptionToken') end
records()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 31 def records headers.map do |header| header.merge( id: header['identifier'].split(':').last.split('/').join(':') ) end end
set_lookup()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 44 def set_lookup sets.inject({}) { |memo, set| memo.merge(to_key(set)) } end
sets()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 39 def sets # Ensure a result of one set is still an array @sets ||= force_array request(sets_endpoint_url).at_path('OAI_PMH/ListSets/set') end
updatables()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 60 def updatables records.reject do |record| if record['status'] == 'deleted' true elsif after_date && Time.parse(record['datestamp']) < after_date true else false end end end
Private Instance Methods
batch_endpoint_url()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 104 def batch_endpoint_url "#{endpoint_url}?verb=ListIdentifiers&resumptionToken=#{resumption_token}" end
first_batch_endpoint_url()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 100 def first_batch_endpoint_url "#{endpoint_url}?verb=ListIdentifiers&metadataPrefix=oai_dc#{set_spec}" end
force_array(result)
click to toggle source
Ensure results are a single level array (single row sets, records, etc)
# File lib/cdmdexer/oai_request.rb, line 81 def force_array(result) [result].flatten.compact end
headers()
click to toggle source
TODO: Add some error handling if this ever turns up empty
# File lib/cdmdexer/oai_request.rb, line 75 def headers force_array identifier_request.at_path('OAI_PMH/ListIdentifiers/header') end
identifier_request()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 95 def identifier_request @identifier_request ||= resumption_token ? request(batch_endpoint_url) : request(first_batch_endpoint_url) end
request(location)
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 112 def request(location) CDMDEXER::OaiNotification.call!(location) Hash.from_xml(client.get_response(URI(location)).body) end
sets_endpoint_url()
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 108 def sets_endpoint_url "#{endpoint_url}?verb=ListSets" end
to_key(set)
click to toggle source
# File lib/cdmdexer/oai_request.rb, line 85 def to_key(set) { set['setSpec'] => { name: set['setName'], description: set.at_path('setDescription/dc/description') } } end