retry_it 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3133fcf53875f5554c5fbdbb62f7e0cd413efd2db0ad11e30afa99e06be263b3
4
+ data.tar.gz: 4bb4e6ce29a77b4f3b3bd816bf0766b58540641894b4298ee86b2534f3867771
5
+ SHA512:
6
+ metadata.gz: a7f5dd9a4ffa9728d2ff13b6f2f898ebe9762c9a2f9801c140025b3a8f52363a3e966298bded772382cd1756941908917362ec1aa2f54ab5901299456a90016d
7
+ data.tar.gz: 98571c88ef2f8758d45f71965d1c2607eeeb00e4f0f8775509207d97129edbc74608042d7c65cea4f642530df6adf9544040d10e86bd271c82228280f3521a27
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.1
7
+ before_install: gem install bundler -v 1.16.5
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in retry_it.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,22 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ retryable (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ minitest (5.11.3)
10
+ rake (10.5.0)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ bundler (~> 1.16)
17
+ minitest (~> 5.0)
18
+ rake (~> 10.0)
19
+ retryable!
20
+
21
+ BUNDLED WITH
22
+ 1.16.5
data/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # RetryIt
2
+
3
+ Easily retry a code block a set amount of times, before giving up. Useful for unreliable external I/O, such as accessing
4
+ HTTP servers that periodically throw errors, but are expected to work most of the time.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'retry_it'
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install retry_it
21
+
22
+ ## Usage
23
+
24
+ Include RetryIt in your class:
25
+
26
+ ```
27
+ class APIClient
28
+ include RetryIt
29
+ end
30
+ ```
31
+
32
+ You can then call `retry_it` when running code that fails intermittently:
33
+
34
+ ```
35
+ class APIClient
36
+ include RetryIt
37
+
38
+ def get_data
39
+ retry_it(errors: [Timeout::Error]) do
40
+ HTTP.get('http://foo.com')
41
+ end
42
+ end
43
+ end
44
+ ```
45
+
46
+ If `HTTP.get` throws an error, `retry_it` will wait a few seconds, and then try
47
+ again. It will repeat this a few times before eventually giving up, and raising
48
+ the last error it received.
49
+
50
+ `retry_it` accepts these arguments:
51
+
52
+ * `max_runs`: controls the maximum number of times the block should be fun.
53
+ Defaults to RetryIt::MAX_RUNS
54
+ * `errors`: an Array of subclasses of Exception, which indicate which Exceptions
55
+ are considered retryable.
56
+ * `timeout`: how many seconds we will wait between retries. Defaults to
57
+ RetryIt::DEFAULT_TIMEOUT_S
58
+ * `logger`: A Logger object. If provided, when a retry occurs, an info-level
59
+ message will be logged.
60
+ * `should_retry_proc`: A Proc that can be used to more finely control when a
61
+ retry occurs. The Proc is given one parameter: the
62
+ Exception object. The Proc must return a boolean value.
63
+ A true indicates that a retry should occur. Useful for
64
+ when it is sometimes desired to retry from an error, but
65
+ not always (For instance, an HTTP error with code 504 is
66
+ retryable, but a 404 probably isn't)
67
+
68
+ Examples:
69
+
70
+ ```
71
+ # Retry only on HTTPErrors with code 504. All other errors will not trigger a
72
+ # retry.
73
+ retry_it(timeout: 60, errors: [HTTPError], should_retry_proc: Proc.new { |e| e.code == 504 }) do
74
+ some_api_request
75
+ end
76
+
77
+
78
+ # Use a logger to be notified when a retry occurs:
79
+ require 'logger'
80
+
81
+ logger = Logger.new STDOUT
82
+ retry_it(max_runs: 100, timeout: 60, errors: [Error], logger: logger) do
83
+ some_api_request
84
+ end
85
+ ```
86
+
87
+ Keep in mind that you can pass methods as parameters using `method`:
88
+
89
+ ```
90
+ class APIClient
91
+ include RetryIt
92
+
93
+ def download_data
94
+ retry_it(should_retry_proc: method(:is_retryable), errors: [HTTPError]) do
95
+ api.get("foo.com")
96
+ end
97
+ end
98
+
99
+ def is_retryable(error)
100
+ error.code == 504
101
+ end
102
+ end
103
+ ```
104
+
105
+
106
+ ## Development
107
+
108
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
109
+
110
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "retry_it"
5
+ require "irb"
6
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/retry_it.rb ADDED
@@ -0,0 +1,32 @@
1
+ require "retry_it/version"
2
+
3
+ module RetryIt
4
+ MAX_RUNS = 10
5
+ DEFAULT_TIMEOUT_S = 10 # seconds
6
+ DEFAULT_EXCEPTIONS = []
7
+
8
+ def retry_it(max_runs: MAX_RUNS,
9
+ errors: DEFAULT_EXCEPTIONS,
10
+ timeout: DEFAULT_TIMEOUT_S,
11
+ should_retry_proc: nil,
12
+ logger: nil)
13
+ retries = 0
14
+ begin
15
+ yield
16
+ rescue *errors => e
17
+ retries += 1
18
+ if retries < max_runs && (!should_retry_proc.is_a?(Proc) || should_retry_proc.call(e))
19
+ if logger
20
+ logger.info "Error (#{e.class}), retrying ##{retries} of #{max_runs}. Sleeping for #{timeout}"
21
+ end
22
+ if timeout > 0
23
+ sleep timeout
24
+ end
25
+ retry
26
+ else
27
+ raise
28
+ end
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,3 @@
1
+ module RetryIt
2
+ VERSION = "0.1.0"
3
+ end
data/retry_it.gemspec ADDED
@@ -0,0 +1,29 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "retry_it/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "retry_it"
8
+ spec.version = RetryIt::VERSION
9
+ spec.authors = ["rgould"]
10
+ spec.email = ["richard.gould@daliaresearch.com"]
11
+
12
+ spec.summary = %q{Easily retry code that fails intermittently}
13
+ spec.description = %q{Easily retry code that fails intermittently. Perfect for interacting with that flakey HTTP API.}
14
+ spec.homepage = "https://github.com/DaliaResearch/retry_it"
15
+ spec.license = "MIT"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.16"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "minitest", "~> 5.0"
29
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: retry_it
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - rgould
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-11-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ description: Easily retry code that fails intermittently. Perfect for interacting
56
+ with that flakey HTTP API.
57
+ email:
58
+ - richard.gould@daliaresearch.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".travis.yml"
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - README.md
68
+ - Rakefile
69
+ - bin/console
70
+ - bin/setup
71
+ - lib/retry_it.rb
72
+ - lib/retry_it/version.rb
73
+ - retry_it.gemspec
74
+ homepage: https://github.com/DaliaResearch/retry_it
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.7.6
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: Easily retry code that fails intermittently
98
+ test_files: []