module Highrise module Pagination def self.included(base) base.extend(ClassMethods) end module ClassMethods def find_all_across_pages(options = {}) records = [] each(options) { |record| records << record } records end # This only is usefull for company, person & recordings, but should be safely ignored by other classes def find_all_across_pages_since(time) find_all_across_pages(:params => { :since => time.utc.strftime("%Y%m%d%H%M%S") }) end # This is useful only for Company, Person, Note, Comment, Email and Task, but should be safely ignored by other classes def find_all_deletions_across_pages(options = {}) # point to the global deletions feed options[:from] = '/deletions.xml' records = [] each_deletions(options) { |record| records << record } records end # This is useful only for Company, Person, Note, Comment, Email and Task, but should be safely ignored by other classes def find_all_deletions_across_pages_since(time) find_all_deletions_across_pages(:params => { :since => time.utc.strftime("%Y%m%d%H%M%S") }) end private def each(options = {}) options[:params] ||= {} options[:params][:n] = 0 loop do records = find(:all, options) if records && records.any? records.each { |record| yield record } options[:params][:n] += records.size else break # no people included on that page, thus no more people total end end end def each_deletions(options = {}) options[:params] ||= {} # first index for deletions is 1 options[:params][:n] = 1 loop do if (records = self.find(:all, options)).try(:any?) # reject the records whose resource type is different from self records.reject!{|r| r.class.to_s.split('::').last != self.to_s.split('::').last} records.each{ |record| yield record } # index increment for deletions is 1 per page of 500 resources options[:params][:n] += 1 else break # no deletions included on that page, thus no more deletions end end end end end end