class Harvest::HardyClient::HardyCollection

Public Class Methods

new(collection, client, max_retries) click to toggle source
Calls superclass method
# File lib/harvest/hardy_client.rb, line 27
      def initialize(collection, client, max_retries)
        super(collection)
        @_sd_obj = @collection = collection
        @client = client
        @max_retries = max_retries
        (@collection.public_methods - Object.public_instance_methods).each do |name|
          instance_eval <<-END
            def #{name}(*args)
              retry_rate_limits do
                @collection.send('#{name}', *args)
              end
            end
          END
        end
      end

Public Instance Methods

__getobj__() click to toggle source
# File lib/harvest/hardy_client.rb, line 43
def __getobj__; @_sd_obj; end
__setobj__(obj) click to toggle source
# File lib/harvest/hardy_client.rb, line 44
def __setobj__(obj); @_sd_obj = obj; end
retry_rate_limits() { || ... } click to toggle source
# File lib/harvest/hardy_client.rb, line 46
def retry_rate_limits
  retries = 0

  retry_func = lambda do |e|
    if retries < @max_retries
      retries += 1
      true
    else
      raise e
    end
  end

  begin
    yield
  rescue Harvest::RateLimited => e
    seconds = if e.response.headers['retry-after']
      e.response.headers['retry-after'].to_i
    else
      16
    end
    sleep(seconds)
    retry
  rescue Harvest::Unavailable, Harvest::InformHarvest => e
    would_retry = retry_func.call(e)
    sleep(16) if @client.account.rate_limit_status.over_limit?
    retry if would_retry
  rescue Net::HTTPError, Net::HTTPFatalError => e
    retry if retry_func.call(e)
  rescue SystemCallError => e
    retry if e.is_a?(Errno::ECONNRESET) && retry_func.call(e)
  end
end