tlopo-retry 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0f301e35e2ab51e5baf34a2d6e94ead7f697996d
4
- data.tar.gz: 8643e0a47e62da8fc53f07fb8929116e916a398d
3
+ metadata.gz: 77ef23b75122a02c372f335adf6277b8b17bb7ed
4
+ data.tar.gz: a7c1846fc1d8981a2c9e224d033936337644e67a
5
5
  SHA512:
6
- metadata.gz: fd9cd0de673f05b9690eb74b2b1a4ff68c9aae24221a5149be81fe5d324e47e5cee5e2fa7ec38ebdecb516facac82361fa49a431e75d124405612f43286cf31b
7
- data.tar.gz: 913da92c875082ba0e74746e26347c06e7e8b9ad2205e8879888a330961a41c8dc4d42f985f9f8bf26f444cfbb9c353f310b50d55f77cf99ef170a3380bf0391
6
+ metadata.gz: d3789283628c94ebb4697d5e38e85f68486886cde318072298c17e69a054d87209b453679f7ca368c4dd788472e6fb60d85c0f215a83557579188161446988af
7
+ data.tar.gz: 85ed915f99ad0a494b9b1f7901c29f02b39f6143ae4008f0e62963601d30ae2abe0fb3819fb1f5590ce08fd3b4c830ecc4db5c5ce4cf8f89ff0a2d1c5ad8c78d
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ .idea/
@@ -0,0 +1,30 @@
1
+
2
+ AllCops:
3
+ DisplayCopNames: true
4
+ TargetRubyVersion: 2.2 # Oldest version kubeclient supports
5
+ MethodLength:
6
+ Enabled: false
7
+ ClassLength:
8
+ Enabled: false
9
+ Metrics/AbcSize:
10
+ Enabled: false
11
+ Metrics/LineLength:
12
+ Max: 100
13
+ Metrics/ParameterLists:
14
+ Max: 5
15
+ CountKeywordArgs: false
16
+ Metrics/CyclomaticComplexity:
17
+ Max: 8
18
+ Exclude:
19
+ - lib/tlopo/retry.rb
20
+ Metrics/ModuleLength:
21
+ Enabled: false
22
+ Style/MethodCallWithArgsParentheses:
23
+ Enabled: true
24
+ IgnoredMethods: [require, raise, include, attr_reader, refute, assert]
25
+ Exclude: [Gemfile, Rakefile, kubeclient.gemspec]
26
+ Security/MarshalLoad:
27
+ Exclude:
28
+ - test/**/*
29
+ - lib/tlopo/retry.rb
30
+
@@ -1,5 +1,12 @@
1
- sudo: false
2
1
  language: ruby
3
2
  rvm:
4
- - 2.3.0
5
- before_install: gem install bundler -v 1.13.2
3
+ - "2.2"
4
+ - "2.3.0"
5
+ - "2.4.0"
6
+ sudo: false
7
+ cache: bundler
8
+ script: bundle exec rake $TASK
9
+ env:
10
+ - TASK=test
11
+ - TASK=rubocop
12
+ - TASK=test_with_coveralls
data/Gemfile CHANGED
@@ -2,3 +2,14 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in tlopo-retry.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'coveralls', '~> 0.8.17'
8
+ gem 'simplecov', '~> 0.12.0'
9
+ end
10
+
11
+ if RUBY_VERSION > '2.1.0'
12
+ group :perf do
13
+ gem 'memory_profiler', '~> 0.9.8'
14
+ end
15
+ end
data/README.md CHANGED
@@ -1,2 +1,80 @@
1
1
  # tlopo-retry
2
+ [![Gem Version](https://badge.fury.io/rb/tlopo-retry.svg)](http://badge.fury.io/rb/tlopo-retry)
3
+ [![Build Status](https://travis-ci.org/tlopo-ruby/tlopo-retry.svg?branch=master)](https://travis-ci.org/tlopo-ruby/tlopo-retry)
4
+ [![Code Climate](https://codeclimate.com/github/tlopo-ruby/tlopo-retry/badges/gpa.svg)](https://codeclimate.com/github/tlopo-ruby/tlopo-retry)
5
+ [![Dependency Status](https://gemnasium.com/tlopo-ruby/tlopo-retry.svg)](https://gemnasium.com/tlopo-ruby/tlopo-retry)
6
+ [![Coverage Status](https://coveralls.io/repos/github/tlopo-ruby/tlopo-retry/badge.svg?branch=master)](https://coveralls.io/github/tlopo-ruby/tlopo-retry?branch=master)
7
+
2
8
  A reusable retry mechanism which supports timeout, cleanup and fork
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'tlopo-retry'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ ```Bash
21
+ bundle
22
+ ```
23
+
24
+ Or install it yourself as:
25
+
26
+ ```Bash
27
+ gem install tlopo-retry
28
+ ```
29
+
30
+ ## Usage
31
+
32
+ Simple retry usage
33
+
34
+ ```ruby
35
+ # That will retry 3 times with no timeout and 1 second interval
36
+ Tlopo::Retry.retry do
37
+ TCPSocket.new('www.google.co.uk','8080').close
38
+ end
39
+ ```
40
+ Full options
41
+ ```ruby
42
+ require 'logger'
43
+ require 'socket'
44
+
45
+ # Enable logging
46
+ ENV['TLOPO_LOG_LEVEL'] = 'debug'
47
+
48
+ require 'tlopo/retry'
49
+
50
+ Tlopo::Retry.retry({
51
+ desc: 'check if port 8080 is open on www.google.co.uk',
52
+ tries: 2,
53
+ interval: 5,
54
+ timeout: 1,
55
+ cleanup: proc { p 'Run your cleanup code here'}
56
+ }) do
57
+ TCPSocket.new('www.google.co.uk','8080').close
58
+ end
59
+ ```
60
+
61
+
62
+ ## Contributing
63
+
64
+ 1. Fork it ( https://github.com/[my-github-username]/kubeclient/fork )
65
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
66
+ 3. Test your changes with `rake test rubocop`, add new tests if needed.
67
+ 4. If you added a new functionality, add it to README
68
+ 5. Commit your changes (`git commit -am 'Add some feature'`)
69
+ 6. Push to the branch (`git push origin my-new-feature`)
70
+ 7. Create a new Pull Request
71
+
72
+ ## Tests
73
+
74
+ This library is tested with Minitest.
75
+ Please run all tests before submitting a Pull Request, and add new tests for new functionality.
76
+
77
+ Running tests:
78
+ ```ruby
79
+ rake test
80
+ ```
data/Rakefile CHANGED
@@ -1,10 +1,16 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'rubocop/rake_task'
4
+ require 'coveralls/rake/task'
5
+
6
+ task default: %i[test rubocop]
7
+ task test_with_coveralls: [:default, 'coveralls:push']
3
8
 
4
9
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
10
+ t.libs << 'test'
11
+ t.libs << 'lib'
7
12
  t.test_files = FileList['test/**/*_test.rb']
8
13
  end
9
14
 
10
- task :default => :test
15
+ RuboCop::RakeTask.new
16
+ Coveralls::RakeTask.new
@@ -1,70 +1,81 @@
1
- require "tlopo/retry/version"
1
+ require 'tlopo/retry/version'
2
2
  require 'logger'
3
3
  require 'timeout'
4
4
 
5
+ # Simple module so we have a namespace
5
6
  module Tlopo
6
- LOGGER ||= proc do
7
+ LOGGER ||= proc do
7
8
  logger = Logger.new(ENV['TLOPO_LOG_LEVEL'] ? STDERR : '/dev/null')
8
- logger.level = ENV['TLOPO_LOG_LEVEL'] ? "#{ENV['TLOPO_LOG_LEVEL'].upcase}" : Logger::ERROR
9
+ logger.level = ENV['TLOPO_LOG_LEVEL'] ? ENV['TLOPO_LOG_LEVEL'].upcase.to_s : Logger::ERROR
9
10
  logger
10
11
  end.call
11
-
12
- end
13
12
 
14
- module Tlopo::Retry
15
- LOGGER = Tlopo::LOGGER
16
- LOGGER.debug "#{self} loaded"
17
- def self.retry(opts={},&block)
18
- is_fork = opts[:fork]
19
- return local(opts,&block) unless is_fork
20
- return child(opts,&block) if is_fork
21
- end
13
+ # A reusable retry mechanism which supports timeout, cleanup and fork
14
+ module Retry
15
+ LOGGER = Tlopo::LOGGER
16
+ LOGGER.debug("#{self} loaded")
17
+ VALID_OPTS = %i[tries timeout interval fork cleanup].freeze
22
18
 
23
- private
24
- def self.child(opts={},&block)
25
- read, write = IO.pipe
26
-
27
- pid = fork do
28
- read.close
29
- begin
30
- result = local(opts,&block)
31
- Marshal.dump({result: result, error: nil}, write)
32
- rescue => e
33
- Marshal.dump({result:nil, error: e},write)
19
+ def self.validate_opts(opts)
20
+ opts.each_key do |k|
21
+ msg = "Option #{k} is invalid. Valid options: #{VALID_OPTS}"
22
+ raise msg unless VALID_OPTS.include?(k)
34
23
  end
35
24
  end
36
-
37
- write.close
38
- result = Marshal.load(read.read)
39
- Process.wait(pid)
40
- raise result[:error] if result[:error]
41
- result[:result]
42
- end
43
25
 
44
- def self.local(opts={},&block)
45
- tries = opts[:tries] || 3
46
- timeout = opts[:timeout] || 0
47
- interval = opts[:interval] || 1
48
- desc = opts[:desc]
49
- cleanup = opts[:cleanup]
50
- LOGGER.debug "opts: #{opts}"
51
- LOGGER.debug "tries: #{tries}"
52
- count = 0
53
- begin
54
- count += 1
55
- Timeout::timeout(timeout) { yield }
56
- rescue => e
57
- unless count > tries
26
+ def self.retry(opts = {}, &block)
27
+ validate_opts(opts)
28
+ is_fork = opts[:fork]
29
+ return local(opts, &block) unless is_fork
30
+ return child(opts, &block) if is_fork
31
+ end
32
+
33
+ def self.child(opts = {}, &block)
34
+ read, write = IO.pipe
35
+
36
+ pid = fork do
37
+ read.close
38
+ begin
39
+ result = local(opts, &block)
40
+ Marshal.dump({ result: result, error: nil }, write)
41
+ rescue StandardError => e
42
+ Marshal.dump({ result: nil, error: e }, write)
43
+ end
44
+ end
45
+
46
+ write.close
47
+ result = Marshal.load(read.read)
48
+ Process.wait(pid)
49
+ raise result[:error] if result[:error]
50
+ result[:result]
51
+ end
52
+
53
+ def self.local(opts = {})
54
+ tries = get_opt_value(opts, :tries, 3)
55
+ timeout = get_opt_value(opts, :timeout, 0)
56
+ interval = get_opt_value(opts, :interval, 1)
57
+ desc = opts[:desc]
58
+ cleanup = opts[:cleanup]
59
+ LOGGER.debug("opts: #{opts}")
60
+ LOGGER.debug("tries: #{tries}")
61
+ count = 0
62
+ begin
63
+ count += 1
64
+ Timeout.timeout(timeout) { yield }
65
+ rescue StandardError => e
66
+ raise e if count > tries
58
67
  msg = "#{self} Retrying to #{desc} #{count} out of #{tries}"
59
- LOGGER.info msg if desc
60
- LOGGER.debug "#{self} Calling cleanup" if cleanup
68
+ LOGGER.info(msg) if desc
69
+ LOGGER.debug("#{self} Calling cleanup") if cleanup
61
70
  cleanup.call if cleanup
62
- sleep interval
63
- retry
64
- else
65
- raise e
71
+ sleep(interval)
72
+ retry
66
73
  end
67
74
  end
75
+
76
+ def self.get_opt_value(opts, key, default)
77
+ return opts[key] unless opts[key].nil?
78
+ default
79
+ end
68
80
  end
69
81
  end
70
-
@@ -1,5 +1,5 @@
1
1
  module Tlopo
2
2
  module Retry
3
- VERSION = "0.1.0"
3
+ VERSION = '0.1.1'.freeze
4
4
  end
5
5
  end
@@ -1,38 +1,39 @@
1
- # coding: utf-8
1
+
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'tlopo/retry/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "tlopo-retry"
7
+ spec.name = 'tlopo-retry'
8
8
  spec.version = Tlopo::Retry::VERSION
9
- spec.authors = ["tlopo"]
10
- spec.email = ["tiago@aw20.co.uk"]
9
+ spec.authors = ['tlopo']
10
+ spec.email = ['tiagolopo@yahoo.com.br']
11
11
 
12
- spec.summary = %q{
12
+ spec.summary = '
13
13
  A reusable retry mechanism which supports timeout, cleanup, and fork
14
- }
14
+ '
15
15
  spec.description = spec.summary
16
- spec.homepage = "https://github.com/tlopo-ruby/tlopo-retry"
17
- spec.license = "MIT"
16
+ spec.homepage = 'https://github.com/tlopo-ruby/tlopo-retry'
17
+ spec.license = 'MIT'
18
18
 
19
19
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
20
20
  # to allow pushing to a single host or delete this section to allow pushing to any host.
21
21
  if spec.respond_to?(:metadata)
22
- #spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
22
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
23
23
  else
24
- raise "RubyGems 2.0 or newer is required to protect against " \
25
- "public gem pushes."
24
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
25
+ 'public gem pushes.'
26
26
  end
27
27
 
28
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
28
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
29
29
  f.match(%r{^(test|spec|features)/})
30
30
  end
31
- spec.bindir = "bin"
31
+ spec.bindir = 'bin'
32
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
- spec.require_paths = ["lib"]
33
+ spec.require_paths = ['lib']
34
34
 
35
- spec.add_development_dependency "bundler", "~> 1.13"
36
- spec.add_development_dependency "rake", "~> 10.0"
37
- spec.add_development_dependency "minitest", "~> 5.0"
35
+ spec.add_development_dependency('bundler', '~> 1.13')
36
+ spec.add_development_dependency('minitest', '~> 5.0')
37
+ spec.add_development_dependency('rake', '~> 10.0')
38
+ spec.add_development_dependency('rubocop', '~> 0.52.1')
38
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tlopo-retry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - tlopo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-03 00:00:00.000000000 Z
11
+ date: 2018-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,35 +53,34 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: '10.0'
41
55
  - !ruby/object:Gem::Dependency
42
- name: minitest
56
+ name: rubocop
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '5.0'
61
+ version: 0.52.1
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '5.0'
68
+ version: 0.52.1
55
69
  description: A reusable retry mechanism which supports timeout, cleanup, and fork
56
70
  email:
57
- - tiago@aw20.co.uk
71
+ - tiagolopo@yahoo.com.br
58
72
  executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
76
  - ".gitignore"
77
+ - ".rubocop.yml"
63
78
  - ".travis.yml"
64
79
  - Gemfile
65
80
  - LICENSE
66
81
  - LICENSE.txt
67
82
  - README.md
68
83
  - Rakefile
69
- - bin/console
70
- - bin/setup
71
84
  - lib/tlopo/retry.rb
72
85
  - lib/tlopo/retry/version.rb
73
86
  - tlopo-retry.gemspec
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "tlopo/retry"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start
data/bin/setup DELETED
@@ -1,8 +0,0 @@
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