Sha256: addada161c0b4bcf9215a0e64c22b153a3c6827e61a54dac1d9b5f3b552cbf89

Contents?: true

Size: 1.76 KB

Versions: 2

Compression:

Stored size: 1.76 KB

Contents

module VzaarApi
  module Lib
    class PagedResource

      attr_reader :query, :meta, :collection, :resource_class, :resource_url,
                  :scope_id

      def initialize(query = {})
        @query = query.dup
        @resource_class = @query.delete(:resource_class)
        @resource_url = @query.delete(:resource_url)
        @scope_id = @query.delete(:scope_id)
        @loaded = false
      end

      def loaded?
        @loaded
      end

      def each_item
        return enum_for :each_item unless block_given?
        begin
          each { |record| yield record }
        end while !self.next.empty?
      end

      def first
        loaded? ? load_page_url(:first) : load!
      end

      def next
        load_page_url :next
      end

      def previous
        load_page_url :previous
      end

      def last
        load_page_url :last
      end

      private

      def load!
        @loaded = true
        load_from_url resource_url, query
      end

      def load_page_url(page)
        load! unless loaded?
        if url = meta_link(page)
          load_from_url meta[:links][page]
        else
          []
        end
      end

      def meta_link(page)
        return unless meta
        meta[:links][page]
      end

      def each
        return enum_for :each unless block_given?
        load! unless collection
        collection.each { |record| yield record }
      end

      def load_from_url(url, query = {})
        response = Api.new.get(url, query)
        @meta = response.meta
        @collection = build_collection response.data
      end

      def build_collection(items)
        items.map do |attrs|
          attrs = scope_id ? attrs.merge(scope_id: scope_id) : attrs
          resource_class.new attrs
        end
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
vzaar_api-2.0.2 lib/vzaar_api/lib/paged_resource.rb
vzaar_api-2.0.1 lib/vzaar_api/lib/paged_resource.rb