lib/berkeley_library/alma/sru.rb in berkeley_library-alma-0.0.5 vs lib/berkeley_library/alma/sru.rb in berkeley_library-alma-0.0.6

- old
+ new

@@ -1,79 +2 @@ -require 'uri' -require 'berkeley_library/alma/config' -require 'berkeley_library/alma/constants' -require 'berkeley_library/alma/record_id' -require 'berkeley_library/util/uris' - -module BerkeleyLibrary - module Alma - module SRU - include BerkeleyLibrary::Logging - include Constants - - class << self - include SRU - end - - # Given a list of record IDs, returns the MARC records for each ID (if found). - # - # @param record_ids [Array<String, RecordId>] the record IDs to look up - # @return [MARC::XMLReader, nil] a reader for the MARC records, or nil if - # the records could not be read - def get_marc_records(*record_ids) - # noinspection RubyMismatchedReturnType - parsed_ids = record_ids.filter_map { |id| RecordId.parse(id) } - raise ArgumentError, "Argument #{record_ids.inspect} contain no valid record IDs" if parsed_ids.empty? - - sru_query_value = parsed_ids.map(&:sru_query_value).join(' or ') - SRU.marc_records_for(sru_query_value) - end - - # Returns a URI for retrieving records for the specified query - # via SRU. Requires {Config#alma_sru_base_uri} to be set. - # - # @return [URI] the MARC URI - def sru_query_uri(sru_query_value) - query_string = URI.encode_www_form( - 'version' => '1.2', - 'operation' => 'searchRetrieve', - 'query' => sru_query_value - ) - - Util::URIs.append(Config.alma_sru_base_uri, '?', query_string) - end - - # Makes an SRU query for the specified query value and returns the query response - # as a string. - # - # @param query_value [String] the value of the SRU query parameter - # @return [String, nil] the SRU query response body, or nil in the event of an error. - def make_sru_query(query_value) - uri = sru_query_uri(query_value) - do_get(uri) - end - - # Makes an SRU query for the specified query value and returns the query response - # as MARC records. - # - # @param query_value [String] the value of the SRU query parameter - # @return [MARC::XMLReader, nil] a reader for the MARC records, or nil if - # the records could not be read - def marc_records_for(query_value) - return unless (xml = make_sru_query(query_value)) - - input = StringIO.new(xml.scrub) - MARC::XMLReader.new(input, parser: 'nokogiri') - end - - private - - def do_get(uri) - # TODO: can we get the XML as an IO rather than as a string? - Util::URIs.get(uri, headers: { user_agent: DEFAULT_USER_AGENT }) - rescue RestClient::Exception => e - logger.warn("GET #{uri} failed", e) - nil - end - end - end -end +Dir.glob(File.expand_path('sru/*.rb', __dir__)).sort.each(&method(:require))