lib/love.rb in love-0.0.3 vs lib/love.rb in love-0.0.4

- old
+ new

@@ -3,10 +3,12 @@ require 'active_support/core_ext/module/attribute_accessors.rb' require 'yajl' module Love + VERSION = "0.0.4" + # Create a custom exception class. class Exception < StandardError; end # Class for unauthorized exceptions class Unauthorized < Love::Exception; end @@ -38,10 +40,18 @@ ::URI.parse(input.to_s) else raise Love::Exception, "This does not appear to be a Tender #{kind} URI or ID!" end end + + def request_uri(base_uri, added_params = {}) + base_params = base_uri.query ? CGI.parse(base_uri.query) : {} + get_params = base_params.merge(added_params || {}) + base_uri.dup.tap do |uri| + uri.query = get_params.map { |k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"}.join('&') + end + end end class Client include Love::ResourceURI @@ -117,27 +127,36 @@ raise Love::Exception, "#{response.code}: #{response.body}" end end def buffered_each(uri, list_key, options = {}, &block) - query_options = {} - query_options[:since] = options[:since].to_date.to_s(:db) if options[:since] + query_params = {} + query_params[:since] = options[:since].to_date.to_s(:db) if options[:since] + query_params[:page] = [options[:start_page].to_i, 1].max rescue 1 - uri.query = query_options.map { |k, v| "#{k}=#{v}" }.join('&') - initial_result = get(uri) - start_page = [options[:start_page].to_i, 1].max rescue 1 + initial_result = get(request_uri(uri, query_params)) + + # Determine the amount of pages that is going to be requested. max_page = (initial_result['total'].to_f / initial_result['per_page'].to_f).ceil end_page = options[:end_page].nil? ? max_page : [options[:end_page].to_i, max_page].min # Print out some initial debugging information - Love.logger.debug "Paged requests to #{uri}: #{max_page} total pages, importing #{start_page} upto #{end_page}." if Love.logger + Love.logger.debug "Paged requests to #{uri}: #{max_page} total pages, importing #{query_params[:page]} upto #{end_page}." if Love.logger - start_page.upto(end_page) do |page| - query_options[:page] = page - uri.query = query_options.map { |k, v| "#{k}=#{v}" }.join('&') - result = get(uri) - result[list_key].each { |record| yield(record) } + # Handle first page of results + if initial_result[list_key].kind_of?(Array) + initial_result[list_key].each { |record| yield(record) } sleep(sleep_between_requests) if sleep_between_requests + end + + start_page = query_params[:page].to_i + 1 + start_page.upto(end_page) do |page| + query_params[:page] = page + result = get(request_uri(uri, query_params)) + if result[list_key].kind_of?(Array) + result[list_key].each { |record| yield(record) } + sleep(sleep_between_requests) if sleep_between_requests + end end end end end