class GoCardless::Paginator

Constants

DEFAULT_PAGE_NUMBER
DEFAULT_PAGE_SIZE

Attributes

num_pages[R]
num_records[R]

Public Class Methods

new(client, resource_class, path, query) click to toggle source
# File lib/gocardless/paginator.rb, line 14
def initialize(client, resource_class, path, query)
  @client = client
  @resource_class = resource_class
  @path, @query = path, query
  @page_number, @per_page = DEFAULT_PAGE_NUMBER, DEFAULT_PAGE_SIZE
end

Public Instance Methods

count() click to toggle source

Return the total number of records. May trigger an HTTP request.

# File lib/gocardless/paginator.rb, line 65
def count
  load_page(1) if @num_records.nil?  # load pagination metadata
  @num_records
end
each(&block) click to toggle source

Yield every record from every current page, auto-fetching new pages as the iteration happens. Records are returned as instances of the appropriate resource classes (e.g. Subscription).

# File lib/gocardless/paginator.rb, line 50
def each(&block)
  each_page { |page| page.each(&block) }
end
each_page() { |page_obj| ... } click to toggle source

Fetch and yield each page of results.

# File lib/gocardless/paginator.rb, line 55
def each_page
  page_obj = load_page(1)
  loop do
    yield page_obj
    break unless page_obj.has_next?
    page_obj = load_page(page_obj.next_page)
  end
end
load_page(page_num) click to toggle source

Fetch and return a single page.

# File lib/gocardless/paginator.rb, line 35
def load_page(page_num)
  params = @query.merge(pagination_params(page_num))
  response = @client.api_request(:get, @path, :params => params)

  metadata = parse_metadata(response)
  @num_records, @num_pages = metadata['records'], metadata['pages']

  Page.new(@resource_class, response.parsed, metadata['links'])
end
Also aliased as: page
page(page_num)
Alias for: load_page
page_count() click to toggle source

Return the total number of pages. May trigger an HTTP request.

# File lib/gocardless/paginator.rb, line 71
def page_count
  load_page(1) if @num_records.nil?  # load pagination metadata
  @num_pages
end
per_page(results_per_page = nil) click to toggle source

Set the number of records per page (page size), if an argument is provided. Returns the current per_page value, whether an argument is provided or not.

# File lib/gocardless/paginator.rb, line 24
def per_page(results_per_page = nil)
  if results_per_page
    @num_records, @num_pages = nil, nil
    @per_page = results_per_page
    self
  else
    @per_page
  end
end

Private Instance Methods

pagination_params(page_num) click to toggle source
# File lib/gocardless/paginator.rb, line 78
def pagination_params(page_num)
  { :page => page_num, :per_page => @per_page }
end
parse_metadata(response) click to toggle source
# File lib/gocardless/paginator.rb, line 82
def parse_metadata(response)
  MultiJson.load(response.headers['X-Pagination'])
end