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