Project

goran

0.01
No commit activity in last 3 years
No release in over 3 years
Named after Goran Invanisevic, the tennis legend who won the Wimbledon after losing the final 3 times, Goran provides a simple syntax to run a block of code multiple times. E.g. * run block 'x' number of times * run until the block returns a non-nil value * run until the block does not raise an exception * run until the block returns a non-zero value, to a maximum of 3 times, and return nil if all runs return a 0 Goran is especially useful for running network calls which have unexpected outputs like 404, timeouts. It is an easy way to build in retry logic into these calls and handle cases where these calls do not succeed at all.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

Goran

Named after Goran Invanisevic, the tennis legend who won the Wimbledon after losing the final 3 times, Goran provides a simple syntax to run a block of code multiple times. E.g.

  • run block 'x' number of times
  • run until the block returns a non-nil value
  • run until the block does not raise an exception
  • run until the block returns a non-zero value, to a maximum of 3 times, and return nil if all runs return a 0

Goran is especially useful for running network calls which have unexpected outputs like 404, timeouts. It is an easy way to build in retry logic into these calls and handle cases where these calls do not succeed at all.

Installation

Add this line to your application's Gemfile:

gem 'goran'

And then execute:

$ bundle

Or install it yourself as:

$ gem install goran

Usage

require 'goran'

Run a block until it stops returning 0

Goran.serve :retry_if => 0 do
  #block
end

Run a block until it returns a value > 0; run it a maximum of 3 times

Goran.serve :max_tries => 3, :retry_if => { |x| x <= 0 } do
  #block
end

Run a block until it stops returning 0; run it a maximum of 3 times; wait for a second between calls

Goran.serve :max_tries => 3, :retry_if => 0, :interval => 1 do
  #block
end	

Run a block until it stops returning 0; run it a maximum of 3 times; return nil if it doesn't return a non-zero value even after 3 tries

Goran.serve :max_tries => 3, :retry_if => 0, :fallback => nil do
  #block
end

Run a block until it doesn't raise a StandardError

Goran.serve :rescue_from => StandardError do
  #block
end

Run a block until it doesn't raise a StandardError; run it a maximum of 3 times; supress error all three times

Goran.serve :max_tries => 3, :rescue_from => StandardError do
  #block
end

Run a block until it doesn't raise a StandardError; run it a maximum of 3 times; do not supress an error in the last run

Goran.serve :max_tries => 3, :rescue_from => StandardError, :rescue_last => false
  #block
end

Run a block until it doesn't raise a StandardError; run it a maximum of 3 times; run a block when an error happens (say for logging the error)

Goran.serve :max_tries => 3, :rescue_from => StandardError, :on_rescue => lambda { |e| logger.error e }
  #block
end

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request