class MyJohnDeereApi::NetHttpRetry::Decorator

Constants

DEFAULTS

Attributes

max_retries[R]
object[R]
request_methods[R]
retry_codes[R]
retry_delay_exponent[R]
valid_codes[R]

Public Class Methods

new(object, options={}) click to toggle source
# File lib/my_john_deere_api/net_http_retry/decorator.rb, line 14
def initialize(object, options={})
  @object = object

  # options that can be used as-is
  [:request_methods, :retry_delay_exponent, :max_retries, :retry_codes, :valid_codes].each do |option|
    instance_variable_set(:"@#{option}", options[option] || DEFAULTS[option])
  end

  # options that require casting as integer arrays
  [:retry_codes, :valid_codes].each do |option|
    instance_variable_set(:"@#{option}", (options[option] || DEFAULTS[option]).map(&:to_i))
  end
end

Public Instance Methods

request(method_name, *args) click to toggle source
# File lib/my_john_deere_api/net_http_retry/decorator.rb, line 28
def request(method_name, *args)
  retries = 0
  result = object.send(method_name, *args)
  while retry_codes.include?(result.status)
    if retries >= max_retries
      raise MaxRetriesExceededError.new(method_name, "#{result.status} #{result.response.reason_phrase}")
    end

    delay = [result.headers['retry-after'].to_i, retry_delay_exponent ** retries].max
    sleep(delay)

    result = object.send(method_name, *args)
    retries += 1
  end

  unless valid_codes.include?(result.status)
    raise InvalidResponseError.new(result)
  end

  result
end

Private Instance Methods

method_missing(method_name, *args, &block) click to toggle source
# File lib/my_john_deere_api/net_http_retry/decorator.rb, line 52
def method_missing(method_name, *args, &block)
  if request_methods.include?(method_name)
    request(method_name, *args)
  else
    object.send(method_name, *args, &block)
  end
end