Sha256: 913295e6e0cf2efaa681a5aae543d6d573d411a4c7f0ba1a4a8a07db2153be3b

Contents?: true

Size: 1.47 KB

Versions: 9

Compression:

Stored size: 1.47 KB

Contents

require 'poms/api/json_client'

module Poms
  module Api
    # Creates lazy Enumerators to handle pagination of the Poms API and performs
    # the request on demand.
    module PaginationClient
      module_function

      def get(uri, credentials)
        execute(uri) do |page_uri|
          Api::JsonClient.get(page_uri, credentials)
        end
      end

      def post(uri, body, credentials)
        execute(uri) do |page_uri|
          Api::JsonClient.post(page_uri, body, credentials)
        end
      end

      def execute(uri)
        Enumerator.new do |yielder|
          page = Page.new(uri)
          loop do
            page.execute { |page_uri| yield page_uri }
            page.items.each { |item| yielder << item }
            raise StopIteration if page.final?
            page = page.next_page
          end
        end.lazy
      end

      # Keep track of number of items and how many have been retrieved
      class Page
        def initialize(uri, offset = 0)
          uri.query_values = { offset: offset }
          @uri = uri
        end

        def next_page
          self.class.new(uri, next_index)
        end

        def final?
          next_index >= response['total']
        end

        def items
          response['items']
        end

        def execute
          @response = yield uri
        end

        private

        attr_reader :response, :uri

        def next_index
          response['offset'] + response['max']
        end
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
poms-2.1.3 lib/poms/api/pagination_client.rb
poms-2.1.2.1 lib/poms/api/pagination_client.rb
poms-2.1.2 lib/poms/api/pagination_client.rb
poms-2.1.1 lib/poms/api/pagination_client.rb
poms-2.1.0 lib/poms/api/pagination_client.rb
poms-2.0.1 lib/poms/api/pagination_client.rb
poms-2.0.0 lib/poms/api/pagination_client.rb
poms-2.0.0.b lib/poms/api/pagination_client.rb
poms-2.0.0.a lib/poms/api/pagination_client.rb