tlopo-retry 0.1.1 → 0.2.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 +5 -5
- data/.rubocop.yml +34 -18
- data/Gemfile +7 -10
- data/Rakefile +2 -0
- data/lib/tlopo/retry/version.rb +4 -2
- data/lib/tlopo/retry.rb +32 -63
- data/tlopo-retry.gemspec +8 -5
- metadata +27 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d1961dc0719a0297e1278860e12db653b0fe5aa716c2bd15d84980527936f336
|
4
|
+
data.tar.gz: 702278c529f45dc6603adc85595d26c6e78ba0063410b29fcf29cb19d06f4e98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95dc121f19785b8b447f173181761c028506e755f7b823c38b8f40e9e0e1b37b33dd49ba5a778dc5b06f9ac3f47928191ef6a37d1c93fd75c2df5e5971c4d28c
|
7
|
+
data.tar.gz: e2c482b9f7fc3d6f636dcb2e1e79e5d193d833419597ff2b92b71ea6298535ba09fc507a58ea7803f136e2452df6ff4819c9aa84701d0298c7adf74c192dad11
|
data/.rubocop.yml
CHANGED
@@ -1,30 +1,46 @@
|
|
1
|
-
|
2
1
|
AllCops:
|
3
2
|
DisplayCopNames: true
|
4
|
-
TargetRubyVersion: 2.
|
3
|
+
TargetRubyVersion: 2.6
|
4
|
+
NewCops: enable
|
5
|
+
SuggestExtensions: false
|
6
|
+
|
7
|
+
Gemspec/DevelopmentDependencies:
|
8
|
+
EnforcedStyle: gemspec
|
9
|
+
|
5
10
|
MethodLength:
|
6
11
|
Enabled: false
|
7
12
|
ClassLength:
|
8
13
|
Enabled: false
|
9
|
-
Metrics/AbcSize:
|
10
|
-
Enabled: false
|
11
|
-
Metrics/LineLength:
|
12
|
-
Max: 100
|
13
14
|
Metrics/ParameterLists:
|
14
15
|
Max: 5
|
15
16
|
CountKeywordArgs: false
|
16
17
|
Metrics/CyclomaticComplexity:
|
17
|
-
Max:
|
18
|
-
|
19
|
-
|
18
|
+
Max: 15
|
19
|
+
Metrics/PerceivedComplexity:
|
20
|
+
Max: 15
|
20
21
|
Metrics/ModuleLength:
|
21
22
|
Enabled: false
|
22
|
-
|
23
|
-
Enabled:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
Metrics/AbcSize:
|
24
|
+
Enabled: false
|
25
|
+
Naming/AccessorMethodName:
|
26
|
+
Enabled: false
|
27
|
+
Style/Documentation:
|
28
|
+
Enabled: false
|
29
|
+
Style/SpecialGlobalVars:
|
30
|
+
Enabled: false
|
31
|
+
Style/ConditionalAssignment:
|
32
|
+
Enabled: false
|
33
|
+
Style/ClassVars:
|
34
|
+
Enabled: false
|
35
|
+
Style/OptionalBooleanParameter:
|
36
|
+
Enabled: false
|
37
|
+
Layout/FirstHashElementIndentation:
|
38
|
+
Enabled: false
|
39
|
+
Layout/LineLength:
|
40
|
+
Max: 120
|
41
|
+
Lint/OrAssignmentToConstant:
|
42
|
+
Enabled: false
|
43
|
+
Lint/AmbiguousRegexpLiteral:
|
44
|
+
Enabled: false
|
45
|
+
Gemspec/RequireMFA:
|
46
|
+
Enabled: false
|
data/Gemfile
CHANGED
@@ -1,15 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source 'https://rubygems.org'
|
2
4
|
|
3
|
-
# Specify your gem's dependencies in tlopo-
|
5
|
+
# Specify your gem's dependencies in tlopo-cmd.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
8
|
+
gem 'rake', '~> 13.0'
|
9
|
+
|
10
|
+
gem 'minitest', '~> 5.0'
|
10
11
|
|
11
|
-
|
12
|
-
group :perf do
|
13
|
-
gem 'memory_profiler', '~> 0.9.8'
|
14
|
-
end
|
15
|
-
end
|
12
|
+
gem 'rubocop', '~> 1.21'
|
data/Rakefile
CHANGED
data/lib/tlopo/retry/version.rb
CHANGED
data/lib/tlopo/retry.rb
CHANGED
@@ -1,81 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tlopo/retry/version'
|
2
4
|
require 'logger'
|
3
5
|
require 'timeout'
|
4
6
|
|
5
7
|
# Simple module so we have a namespace
|
6
8
|
module Tlopo
|
7
|
-
LOGGER ||=
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
LOGGER.debug("#{self} loaded")
|
17
|
-
VALID_OPTS = %i[tries timeout interval fork cleanup].freeze
|
18
|
-
|
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)
|
9
|
+
LOGGER ||= Logger.new $stderr
|
10
|
+
|
11
|
+
module Setters
|
12
|
+
def make_setter(*names)
|
13
|
+
names.each do |name|
|
14
|
+
define_method(name) do |val|
|
15
|
+
instance_variable_set("@#{name}", val)
|
16
|
+
self
|
17
|
+
end
|
23
18
|
end
|
24
19
|
end
|
20
|
+
end
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
class Retry
|
23
|
+
extend Setters
|
24
|
+
make_setter :tries, :interval, :exponential_backoff, :error_types
|
25
|
+
def initialize(**args)
|
26
|
+
@tries = args[:tries] || 3
|
27
|
+
@interval = args[:interval] || 1
|
28
|
+
@exponential_backoff = args[:exponential_backoff] || false
|
29
|
+
@error_types = args[:error_types] || [StandardError]
|
31
30
|
end
|
32
31
|
|
33
|
-
def
|
34
|
-
|
32
|
+
def run(&block)
|
33
|
+
count = 1
|
34
|
+
while count <= @tries
|
35
|
+
next unless block_given?
|
35
36
|
|
36
|
-
pid = fork do
|
37
|
-
read.close
|
38
37
|
begin
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
38
|
+
return instance_eval(&block)
|
39
|
+
rescue *@error_types => e
|
40
|
+
count += 1
|
41
|
+
time = @exponential_backoff ? @interval**count : @interval
|
42
|
+
sleep time
|
43
|
+
e
|
43
44
|
end
|
44
45
|
end
|
45
|
-
|
46
|
-
|
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
|
67
|
-
msg = "#{self} Retrying to #{desc} #{count} out of #{tries}"
|
68
|
-
LOGGER.info(msg) if desc
|
69
|
-
LOGGER.debug("#{self} Calling cleanup") if cleanup
|
70
|
-
cleanup.call if cleanup
|
71
|
-
sleep(interval)
|
72
|
-
retry
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.get_opt_value(opts, key, default)
|
77
|
-
return opts[key] unless opts[key].nil?
|
78
|
-
default
|
46
|
+
LOGGER.error e
|
47
|
+
raise "Retries exhausted, error: #{e.message}"
|
79
48
|
end
|
80
49
|
end
|
81
50
|
end
|
data/tlopo-retry.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
|
-
lib = File.expand_path('
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'tlopo/retry/version'
|
5
6
|
|
@@ -15,6 +16,7 @@ Gem::Specification.new do |spec|
|
|
15
16
|
spec.description = spec.summary
|
16
17
|
spec.homepage = 'https://github.com/tlopo-ruby/tlopo-retry'
|
17
18
|
spec.license = 'MIT'
|
19
|
+
spec.required_ruby_version = '>= 2.6.0'
|
18
20
|
|
19
21
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
20
22
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
@@ -22,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
22
24
|
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
23
25
|
else
|
24
26
|
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
25
|
-
|
27
|
+
'public gem pushes.'
|
26
28
|
end
|
27
29
|
|
28
30
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
@@ -32,8 +34,9 @@ Gem::Specification.new do |spec|
|
|
32
34
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
33
35
|
spec.require_paths = ['lib']
|
34
36
|
|
35
|
-
spec.add_development_dependency('bundler', '~>
|
37
|
+
spec.add_development_dependency('bundler', '~> 2.4')
|
36
38
|
spec.add_development_dependency('minitest', '~> 5.0')
|
37
|
-
spec.add_development_dependency('rake', '~>
|
38
|
-
spec.add_development_dependency('rubocop', '~>
|
39
|
+
spec.add_development_dependency('rake', '~> 13.1')
|
40
|
+
spec.add_development_dependency('rubocop', '~> 1.6')
|
41
|
+
spec.add_development_dependency('simplecov', '~> 0.2')
|
39
42
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tlopo
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.4'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,28 +44,42 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '13.1'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '13.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubocop
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: '1.6'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: '1.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.2'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.2'
|
69
83
|
description: A reusable retry mechanism which supports timeout, cleanup, and fork
|
70
84
|
email:
|
71
85
|
- tiagolopo@yahoo.com.br
|
@@ -88,7 +102,7 @@ homepage: https://github.com/tlopo-ruby/tlopo-retry
|
|
88
102
|
licenses:
|
89
103
|
- MIT
|
90
104
|
metadata: {}
|
91
|
-
post_install_message:
|
105
|
+
post_install_message:
|
92
106
|
rdoc_options: []
|
93
107
|
require_paths:
|
94
108
|
- lib
|
@@ -96,16 +110,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
110
|
requirements:
|
97
111
|
- - ">="
|
98
112
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
113
|
+
version: 2.6.0
|
100
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
115
|
requirements:
|
102
116
|
- - ">="
|
103
117
|
- !ruby/object:Gem::Version
|
104
118
|
version: '0'
|
105
119
|
requirements: []
|
106
|
-
|
107
|
-
|
108
|
-
signing_key:
|
120
|
+
rubygems_version: 3.4.10
|
121
|
+
signing_key:
|
109
122
|
specification_version: 4
|
110
123
|
summary: A reusable retry mechanism which supports timeout, cleanup, and fork
|
111
124
|
test_files: []
|