take2 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 59388477e42afe74b6c90644d81827c912f32009
4
- data.tar.gz: b90cad82f9cbede51323717710e8221858c75bd7
3
+ metadata.gz: c8ec07213b11c7223692259cee1c4fae9af86069
4
+ data.tar.gz: e3050a3a0aac4b6454193e2051a899e4b2b52635
5
5
  SHA512:
6
- metadata.gz: e0fd246fd3e70ce50675a0c4356cc183e2af51dde8b70ec69f30c9e5124e18d70a83e2352cd3ebe03fe6e27df0876cb04c7737ab709ada1d9c1c07e3e5055bf3
7
- data.tar.gz: 73016bec098e375b5d055999e8ca6d51972c11c7188671d554039676201f23e8ce0085a27c3d05191fa6aeb74d749f6332e29b9fe03a69cf0d9084e8822a1e25
6
+ metadata.gz: 73b036448036c9903c5cae7243ff7dfe1df679f04f5482ac413a40aeb3587652fd7f66ac457be8feb624706bf4534e73cede712935e47ffb7131f4dc89fe1cac
7
+ data.tar.gz: 83cfcac40ee6e3c24f546091a016ab93b6a72527a9a66a3f713df9a7376625cd29c1d339fc876597c24e0832e6ffb08a2364d7b271087b57ac392a39597fc04a
@@ -0,0 +1,5 @@
1
+ 0.0.1
2
+ #
3
+ * Add class validations for class helper methods
4
+ * Add basic documentation
5
+ * Rename the public api to :call_with_retry
data/Gemfile CHANGED
@@ -1,8 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
  gemspec
3
3
 
4
- gem "take2", :path => File.expand_path("..", __FILE__)
5
-
6
4
  gem "rake"
7
5
 
8
6
  group :test do
data/README.md CHANGED
@@ -1 +1 @@
1
- # take2
1
+ # Work in process
@@ -29,6 +29,30 @@ module Take2
29
29
 
30
30
  module InstanceMethods
31
31
 
32
+ # Yields a block and retries on retriable errors n times.
33
+ # The raised error could be the defined retriable or it child.
34
+ #
35
+ # Example:
36
+ # class KatorzaService
37
+ # include Take2
38
+ #
39
+ # number_of_retries 3
40
+ # retriable_errors Net::HTTPRetriableError, Net::HTTPServerError
41
+ # retriable_condition proc { |error| response_status(error.response) < 500 }
42
+ # on_retry proc do |error, tries|
43
+ # puts "#{self.class.name} - Retrying.. #{tries} of #{self.class.retriable_configuration[:retries]} (#{error})"
44
+ # end
45
+ # sleep_before_retry 3
46
+ #
47
+ # def give_me_food
48
+ # call_api_with_retry do
49
+ # # Some logic that might raise..
50
+ # # If it will raise retriable, magic happens.
51
+ # # If not the original error re raised
52
+ # end
53
+ # end
54
+ #
55
+ # end
32
56
  def call_api_with_retry
33
57
  config = self.class.retriable_configuration
34
58
  tries ||= config[:retries]
@@ -42,41 +66,85 @@ module Take2
42
66
  tries -= 1
43
67
  retry
44
68
  end
45
- end
46
- log_error e
69
+ end
47
70
  raise e
48
71
  end
49
72
  end
50
-
51
- def log_error(error)
52
- # Overrider this method in the includer
53
- true
54
- end
55
73
 
56
74
  end
57
75
 
58
76
  module ClassMethods
59
-
77
+ # Sets number of retries.
78
+ #
79
+ # Example:
80
+ # class KatorzaService
81
+ # include Take2
82
+ # number_of_retries 3
83
+ # end
84
+ # Arguments:
85
+ # num: Positive integer
60
86
  def number_of_retries(num)
87
+ raise ArgumentError, 'Must be positive Integer' unless num.is_a?(Integer) && num.positive?
61
88
  self.retries = num
62
89
  end
63
90
 
91
+ # Sets list of errors on which the block will retry.
92
+ #
93
+ # Example:
94
+ # class KatorzaService
95
+ # include Take2
96
+ # retriable_errors Net::HTTPRetriableError, Errno::ECONNRESET
97
+ # end
98
+ # Arguments:
99
+ # errors: List of retiable errors
64
100
  def retriable_errors(*errors)
65
101
  self.retriable = errors
66
102
  end
67
103
 
104
+ # Sets condition for retry attempt.
105
+ # If set, it MUST result to +false+ with number left retries greater that zero in order to retry.
106
+ #
107
+ # Example:
108
+ # class KatorzaService
109
+ # include Take2
110
+ # retriable_condition proc { |error| error.response.status_code < 500 }
111
+ # end
112
+ # Arguments:
113
+ # proc: Proc. The +proc+ called by default with the raised error argument
68
114
  def retriable_condition(proc)
115
+ raise ArgumentError, 'Must be callable' unless proc.respond_to?(:call)
69
116
  self.retry_condition_proc = proc
70
117
  end
71
118
 
119
+ # Defines a proc that is called *before* retry attempt.
120
+ #
121
+ # Example:
122
+ # class KatorzaService
123
+ # include Take2
124
+ # on_retry proc { |error, tries| puts "Retrying.. #{tries} of #{self.class.retriable_configuration[:retries]}" }
125
+ # end
126
+ # Arguments:
127
+ # proc: Proc. The +proc+ called by default with the raised error and number of left retries.
72
128
  def on_retry(proc)
129
+ raise ArgumentError, 'Must be callable' unless proc.respond_to?(:call)
73
130
  self.retry_proc = proc
74
131
  end
75
132
 
133
+ # Sets number of seconds to sleep before next retry.
134
+ #
135
+ # Example:
136
+ # class KatorzaService
137
+ # include Take2
138
+ # sleep_before_retry 1.5
139
+ # end
140
+ # Arguments:
141
+ # seconds: Positive number.
76
142
  def sleep_before_retry(seconds)
143
+ raise ArgumentError, 'Must be positive numer' unless (seconds.is_a?(Integer) || seconds.is_a?(Float)) && seconds.positive?
77
144
  self.time_to_sleep = seconds
78
145
  end
79
146
 
147
+ # Exposes current class configuration
80
148
  def retriable_configuration
81
149
  Take2::Configuration::CONFIG_ATTRS.each_with_object({}) do |key, hash|
82
150
  hash[key] = send(key)
@@ -99,11 +167,6 @@ module Take2
99
167
  response.status_code if response.respond_to? :status_code
100
168
  end
101
169
 
102
- def log_client_error(error, tries)
103
- # Override this method in the includer
104
- true
105
- end
106
-
107
170
  end
108
171
 
109
172
  end
@@ -1,3 +1,3 @@
1
1
  module Take2
2
- VERSION = "0.0.0"
2
+ VERSION = "0.0.1"
3
3
  end
@@ -57,7 +57,7 @@ RSpec.describe Take2 do
57
57
  describe '#retriable_errors' do
58
58
 
59
59
  it 'sets the :retriable_errors attribute' do
60
- retriables = IOError, Faraday::ClientError
60
+ retriables = IOError
61
61
  klass.retriable_errors retriables
62
62
  expect(subject[:retriable]).to eql [retriables]
63
63
  end
@@ -124,10 +124,10 @@ RSpec.describe Take2 do
124
124
  end.to change{@tries}.from(0).to(1)
125
125
  end
126
126
 
127
- it 'logs the error' do
128
- expect(object).to receive(:log_error).with(error)
129
- object.call_api_with_retry { wrath_the_gods_with error } rescue nil
130
- end
127
+ # it 'logs the error' do
128
+ # expect(object).to receive(:log_error).with(error)
129
+ # object.call_api_with_retry { wrath_the_gods_with error } rescue nil
130
+ # end
131
131
 
132
132
  end
133
133
 
@@ -158,10 +158,10 @@ RSpec.describe Take2 do
158
158
  object.call_api_with_retry { wrath_the_gods_with retriable_error } rescue nil
159
159
  end
160
160
 
161
- it 'logs the error' do
162
- expect(object).to receive(:log_error).with(retriable_error)
163
- object.call_api_with_retry { wrath_the_gods_with retriable_error } rescue nil
164
- end
161
+ # it 'logs the error' do
162
+ # expect(object).to receive(:log_error).with(retriable_error)
163
+ # object.call_api_with_retry { wrath_the_gods_with retriable_error } rescue nil
164
+ # end
165
165
 
166
166
  it 're raises the original error' do
167
167
  expect do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: take2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Magids
@@ -19,6 +19,7 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - ".gitignore"
22
+ - CHANGELOG.md
22
23
  - Gemfile
23
24
  - LICENSE
24
25
  - README.md