Sha256: dc45c759e5dc22c3a6447ecc315431d1e67f43c4058f259700e994c8a9798824
Contents?: true
Size: 1.63 KB
Versions: 3
Compression:
Stored size: 1.63 KB
Contents
require 'ostruct' module Uploadcare class Api class ResourceList include Enumerable extend Forwardable def_delegator :@data, :meta def_delegator :@data, :objects attr_reader :options def initialize(api, data, options) @api = api @data = build_data(data) @options = options.dup.freeze end def [](index) first(index + 1).last end def each return enum_for(:each) unless block_given? resource_enumerator.each { |object| yield object } self end def total meta['total'] end def loaded objects.size end def fully_loaded? meta['next'].nil? end private attr_reader :api def build_data(data_hash) OpenStruct.new( meta: data_hash.reject{|k, _| k == 'results'}.freeze, objects: data_hash['results'].map{|object| to_resource(api, object)} ) end def get_next_page return nil if fully_loaded? next_page = build_data(api.get(@data.meta['next'])) @data = OpenStruct.new( meta: next_page.meta, objects: objects + next_page.objects ) next_page end def to_resource(*args) raise NotImplementedError, 'You must define this method in a child class' end def resource_enumerator Enumerator.new do |yielder| objects.each { |obj| yielder << obj } while next_page = get_next_page do next_page.objects.each { |obj| yielder << obj } end end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems