Sha256: dc5aec60b6632eb15d88caf7c763d90d64398b35a5ca192585d1fbbdd684671f

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

module AMEE
  class Collection < Array
    include ParseHelper
    attr_reader :pager,:connection,:doc,:json,:response
    def initialize(connection, options = {}, &block)
      # Load data from path
      @options=options
      @max=options.delete :resultMax
      @connection=connection
      @filter = block
      # Parse data from response     
      each_page do
        parse_page
      end
    rescue => err
      #raise AMEE::BadData.new("Couldn't load #{self.class.name}.\n#{response} due to #{err}")
      raise AMEE::BadData.new("Couldn't load #{self.class.name}.\n#{response}")
    end
    def parse_page
      if json
        jsoncollector.each do |p|
          obj = klass.new(parse_json(p))
          obj.connection = connection
          self << obj
          break if @max&&length>=@max
        end
      else
        doc.xpath(xmlcollectorpath.split('/')[1...-1].join('/')).first or
          raise AMEE::BadData.new("Couldn't load #{self.class.name}. parp\n#{response}")
        doc.xpath(xmlcollectorpath).each do |p|
          obj=klass.new(parse_xml(p))
          obj.connection = connection
          x= @filter ? @filter.call(obj) : obj
          self << x if x
          break if @max&&length>=@max
        end
      end
    end

    def fetch
      @options.merge! @pager.options if @pager
      @response= @connection.get(collectionpath, @options).body
      if @response.is_json?
        @json = true
        @doc = JSON.parse(@response)
      else
        @doc = load_xml_doc(@response)
      end
    end

    def each_page
      begin           
        fetch
        yield
        if json
          @pager = AMEE::Pager.from_json(doc['pager'])
        else
          @pager = AMEE::Pager.from_xml(doc.xpath('/Resources//Pager').first)
        end
        break if @max && length>=@max
      end while @pager && @pager.next! #pager is nil if no pager in response,
      # pager.next! is false if @pager said current=last.
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
amee-2.5.1 lib/amee/collection.rb
amee-2.5.0 lib/amee/collection.rb