lulibrary/puree

View on GitHub
lib/puree/extractor/resource.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Puree

  module Extractor

    # Resource extractor.
    #
    class Resource

      # (see Puree::REST::Base#initialize)
      def initialize(config)
        @config = config
      end

      private

      # @param id [String]
      # @param api_resource_type [Symbol]
      # @param xml_extractor_resource_type [Symbol]
      def find(id:, api_resource_type:, xml_extractor_resource_type:)
        api_resource = make_api_resource api_resource_type
        response = api_resource.find id: id
        return unless response.code === 200
        xml_extractor = make_xml_extractor response.body, xml_extractor_resource_type
        xml_extractor.model
      end

      def make_api_resource(resource_type)
        resource_class = "Puree::REST::#{Puree::Util::String.titleize(resource_type)}"
        Object.const_get(resource_class).new @config
      end

      def make_xml_extractor(xml, resource_type)
        resource_class = "Puree::XMLExtractor::#{Puree::Util::String.titleize(resource_type)}"
        Object.const_get(resource_class).new xml
      end

      def record_count(api_resource_type, params = {})
        api_resource = make_api_resource api_resource_type
        params[:size] =  0
        response = api_resource.all_complex params: params
        return unless response.code === 200
        Puree::XMLExtractor::Collection.count response.to_s
      end

      def random(api_resource_type, params = {})
        offset = rand(0..record_count(api_resource_type, params)-1)
        api_resource = make_api_resource api_resource_type
        params[:size] = 1
        params[:offset] = offset
        response = api_resource.all_complex params: params
        models = Puree::XMLExtractor::Collection.send "#{api_resource_type}s", response.to_s
        return nil if models.empty?
        models[0]
      end

    end

  end

end