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