Sha256: 0e4b91d3d9c723c7d9829e689f721be2470f80469ddff60a16bfb9abd6e476bd

Contents?: true

Size: 841 Bytes

Versions: 1

Compression:

Stored size: 841 Bytes

Contents

module Retryable
  extend self
  
  def retryable(options = {})
    opts    = {:on => Exception, :times => 1, :sleep => 0.1}.merge(options)
    handler = {}
    
    retry_exception = opts[:on].is_a?(Array) ? opts[:on] : [opts[:on]]
    times = retries = opts[:times]
    attempts        = 0

    begin
      attempts += 1
      
      return yield(handler)
    rescue *retry_exception => exception
      opts[:then].call(exception, handler, attempts, retries, times) if opts[:then]
      
      if attempts <= times
        sleep opts[:sleep]
        retries -= 1
        retry
      else
        opts[:finally].call(exception, handler, attempts, retries, times) if opts[:finally]
        raise exception
      end
    ensure
      opts[:always].call(handler, attempts, retries, times) if opts[:always]
    end

    yield(handler)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
retryable-rb-1.0.0 lib/retryable.rb