class Reliable::Tryer

Public Class Methods

after_call() click to toggle source
# File lib/reliable.rb, line 38
def after_call
  @after_call ||= -> value:, error:, tries: {}
end
after_call=(after_call) click to toggle source
# File lib/reliable.rb, line 34
def after_call=(after_call)
  @after_call = after_call
end
before_retry() click to toggle source
# File lib/reliable.rb, line 28
def before_retry
  @before_retry ||= -> e:, tries: {
    warn "Retrying on error: #{e.class.name}: #{e}"
  }
end
before_retry=(before_retry) click to toggle source
# File lib/reliable.rb, line 24
def before_retry=(before_retry)
  @before_retry = before_retry
end
delay() click to toggle source
# File lib/reliable.rb, line 20
def delay
  @delay ||= -> x { x ** 2 }
end
delay=(delay) click to toggle source
# File lib/reliable.rb, line 16
def delay=(delay)
  @delay = delay
end
new(up_to:, on:, delay: Tryer.delay, before_retry: Tryer.before_retry, after_call: Tryer.after_call) click to toggle source
# File lib/reliable.rb, line 43
def initialize(up_to:, on:, delay: Tryer.delay, before_retry: Tryer.before_retry, after_call: Tryer.after_call)
  @enumerable = up_to.respond_to?(:each) ? up_to : up_to.times
  @before_retry = before_retry
  @after_call = after_call
  @delay = delay
  @retried_errors = [on].flatten
end

Public Instance Methods

reliably(&block) click to toggle source
# File lib/reliable.rb, line 51
def reliably(&block)
  tries = 0
  last_value = nil
  last_error = nil

  @enumerable.each do
    tries += 1

    begin
      if tries > 1
        @before_retry[e: last_error, tries: tries]
        sleep @delay[tries-1]
      end

      last_error = nil
      last_value = block.call
      return last_value
    rescue *@retried_errors => e
      last_error = e
    ensure
      @after_call[value: last_value, error: last_error, tries: tries]
    end
  end

  raise last_error
end