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