class Essential::Resource::PaginatorProxy

Attributes

count[R]
headers[R]
pages[R]
params[R]
per_page[R]
proxied_class[R]
size[R]
total[R]
url[R]

Public Class Methods

new(proxied_class, url: nil, params: {}, headers: {}, attrs: {}) click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 13
def initialize(proxied_class, url: nil, params: {}, headers: {}, attrs: {})
  @fetched_pages = {}
  @proxied_class = proxied_class
  @url = url || @proxied_class.url
  @params  = params  || {}
  @headers = headers || {}
  @attrs   = attrs   || {}

  @total = 0
  @pages = 0
  @per_page = 0

  self.refresh
end

Public Instance Methods

[](i) click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 28
def [](i)
  i = i.to_i

  # support reverse wrap
  i += @total if i < 0

  return nil if i >= @total || i < 0

  page = (i / @per_page) + 1
  index = i % @per_page

  fetch_page(page) unless @fetched_pages.key?(page)
  @fetched_pages[page][index]
end
as_json() click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 60
def as_json
  self.map(&:as_json)
end
each() { |self| ... } click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 47
def each
  return enum_for(:each) unless block_given?

  (0...self.total).each do |idx|
    yield self[idx]
  end
end
inspect() click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 64
def inspect
  innards = [:proxied_class, :total, :per_page, :headers, :params].map do |m|
    attr = self.send(m)
    if attr
      format('  @%s=%s', m, attr.inspect)
    else
      nil
    end
  end

  format(
    "#<%s:0x%s\n%s\n>",
    self.class.name,
    (self.object_id << 1).to_s(16),
    innards.compact.join(",\n")
  )
end
last() click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 43
def last
  self[-1]
end
refresh() click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 55
def refresh
  @fetched_pages.clear
  fetch_page(nil)
end

Protected Instance Methods

fetch_page(page) click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 84
def fetch_page(page)
  params = (@params || {}).clone
  params = {page: page}.merge(params) if page

  # Actually touch the network
  response = @proxied_class.request(
    :get,
    url: @url,
    params: params,
    headers: @headers
  )

  # update our paging information
  @total    = response.headers[:total].to_i
  @per_page = response.headers[:per_page].to_i
  @pages    = (@total.to_f / @per_page).ceil

  json = JSON.parse(response)
  @fetched_pages[page || 1] = json.map do |json|
    # persist @attrs across returned objects
    attrs = @attrs.merge(json)
    @proxied_class.from_attributes(attrs, headers: @headers)
  end
end

Private Instance Methods

method_missing(method, *args, &block) click to toggle source
# File lib/essential/resource/paginator_proxy.rb, line 111
def method_missing(method, *args, &block)
  @proxied_class.send(method, *args, &block)
end