lib/tries.rb
require 'tries/version'
require 'gem_config'
module Tries
include GemConfig::Base
with_configuration do
has :on_error, classes: Proc
end
end
class Integer
def tries(options = {}, &block)
attempts = 1
exception_classes = Array(options[:on] || StandardError)
delay = options[:delay]
incremental = options[:incremental]
condition = options[:if]
begin
return yield
rescue *exception_classes => exception
raise exception if condition && !condition.call(exception)
next_delay = calculate_delay(delay, attempts, incremental) if delay
[Tries.configuration.on_error, options[:on_error]].compact.each do |on_error_callback|
on_error_callback.call(exception, attempts, next_delay)
end
Kernel.sleep next_delay if delay
retry if (attempts += 1) <= self
end
yield
end
private
def calculate_delay(delay, attempts, incremental)
return delay unless incremental
(delay * attempts * 100).round.to_f / 100
end
end