ridley 2.5.1 → 3.0.0.rc1
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 +4 -4
- data/lib/ridley/chef/chefignore.rb +0 -2
- data/lib/ridley/chef/cookbook/metadata.rb +0 -14
- data/lib/ridley/chef/cookbook.rb +13 -11
- data/lib/ridley/client.rb +3 -3
- data/lib/ridley/connection.rb +3 -3
- data/lib/ridley/errors.rb +23 -0
- data/lib/ridley/logging.rb +0 -1
- data/lib/ridley/middleware/chef_auth.rb +1 -1
- data/lib/ridley/middleware/chef_response.rb +1 -1
- data/lib/ridley/middleware/follow_redirects.rb +1 -1
- data/lib/ridley/middleware/gzip.rb +1 -1
- data/lib/ridley/middleware/parse_json.rb +1 -1
- data/lib/ridley/mixin/from_file.rb +31 -5
- data/lib/ridley/resources/cookbook_resource.rb +1 -5
- data/lib/ridley/resources/data_bag_resource.rb +1 -1
- data/lib/ridley/resources/sandbox_resource.rb +2 -2
- data/lib/ridley/version.rb +1 -1
- data/ridley.gemspec +3 -3
- data/spec/support/actor_mocking.rb +1 -1
- data/spec/unit/ridley/chef/cookbook_spec.rb +12 -7
- data/spec/unit/ridley/mixins/from_file_spec.rb +30 -0
- metadata +12 -11
- data/lib/ridley/middleware/retry.rb +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 507254a6cdf340a5c7e11ac8354043df5f66d5cf
|
4
|
+
data.tar.gz: bdea7bdd458295e87a7401968cba749a7aa8e738
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8f65480cb316c3b5ab316fa68687582a15014042003ed0d85a684af38aea0f10a83a39fb2fcb0514adfcaa7a41e18b9aff317a1fdf6390970ffea118389afd0
|
7
|
+
data.tar.gz: a9c3c56283f0873eaacee0fd5fbf6a9b9f09100886b704da43d83b96d9ebc6254665021c6516304adf02c5506dc5672247a25e0bfa1384e1130946340272daf6
|
@@ -239,8 +239,6 @@ module Ridley::Chef
|
|
239
239
|
version = version_args.first
|
240
240
|
@platforms[platform] = Solve::Constraint.new(version).to_s
|
241
241
|
@platforms[platform]
|
242
|
-
rescue Solve::Errors::InvalidConstraintFormat => ex
|
243
|
-
raise InvalidVersionConstraint, ex.to_s
|
244
242
|
end
|
245
243
|
|
246
244
|
# Adds a dependency on another cookbook, with version checking strings.
|
@@ -257,8 +255,6 @@ module Ridley::Chef
|
|
257
255
|
version = version_args.first
|
258
256
|
@dependencies[cookbook] = Solve::Constraint.new(version).to_s
|
259
257
|
@dependencies[cookbook]
|
260
|
-
rescue Solve::Errors::InvalidConstraintFormat => ex
|
261
|
-
raise InvalidVersionConstraint, ex.to_s
|
262
258
|
end
|
263
259
|
|
264
260
|
# Adds a recommendation for another cookbook, with version checking strings.
|
@@ -275,8 +271,6 @@ module Ridley::Chef
|
|
275
271
|
version = version_args.first
|
276
272
|
@recommendations[cookbook] = Solve::Constraint.new(version).to_s
|
277
273
|
@recommendations[cookbook]
|
278
|
-
rescue Solve::Errors::InvalidConstraintFormat => ex
|
279
|
-
raise InvalidVersionConstraint, ex.to_s
|
280
274
|
end
|
281
275
|
|
282
276
|
# Adds a suggestion for another cookbook, with version checking strings.
|
@@ -293,8 +287,6 @@ module Ridley::Chef
|
|
293
287
|
version = version_args.first
|
294
288
|
@suggestions[cookbook] = Solve::Constraint.new(version).to_s
|
295
289
|
@suggestions[cookbook]
|
296
|
-
rescue Solve::Errors::InvalidConstraintFormat => ex
|
297
|
-
raise InvalidVersionConstraint, ex.to_s
|
298
290
|
end
|
299
291
|
|
300
292
|
# Adds a conflict for another cookbook, with version checking strings.
|
@@ -311,8 +303,6 @@ module Ridley::Chef
|
|
311
303
|
version = version_args.first
|
312
304
|
@conflicting[cookbook] = Solve::Constraint.new(version).to_s
|
313
305
|
@conflicting[cookbook]
|
314
|
-
rescue Solve::Errors::InvalidConstraintFormat => ex
|
315
|
-
raise InvalidVersionConstraint, ex.to_s
|
316
306
|
end
|
317
307
|
|
318
308
|
# Adds a recipe, definition, or resource provided by this cookbook.
|
@@ -333,8 +323,6 @@ module Ridley::Chef
|
|
333
323
|
version = version_args.first
|
334
324
|
@providing[cookbook] = Solve::Constraint.new(version).to_s
|
335
325
|
@providing[cookbook]
|
336
|
-
rescue Solve::Errors::InvalidConstraintFormat => ex
|
337
|
-
raise InvalidVersionConstraint, ex.to_s
|
338
326
|
end
|
339
327
|
|
340
328
|
# Adds a cookbook that is replaced by this one, with version checking strings.
|
@@ -350,8 +338,6 @@ module Ridley::Chef
|
|
350
338
|
version = version_args.first
|
351
339
|
@replacing[cookbook] = Solve::Constraint.new(version).to_s
|
352
340
|
@replacing[cookbook]
|
353
|
-
rescue Solve::Errors::InvalidConstraintFormat => ex
|
354
|
-
raise InvalidVersionConstraint, ex.to_s
|
355
341
|
end
|
356
342
|
|
357
343
|
# Adds a description for a recipe.
|
data/lib/ridley/chef/cookbook.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
module Ridley::Chef
|
2
4
|
class Cookbook
|
3
5
|
require_relative 'cookbook/metadata'
|
@@ -24,24 +26,24 @@ module Ridley::Chef
|
|
24
26
|
# @param [#to_s] path
|
25
27
|
# a path on disk to the location of a Cookbook
|
26
28
|
#
|
27
|
-
# @option options [String] :name
|
28
|
-
# explicitly supply the name of the cookbook we are loading. This is useful if
|
29
|
-
# you are dealing with a cookbook that does not have well-formed metadata
|
30
|
-
#
|
31
29
|
# @raise [IOError] if the path does not contain a metadata.rb or metadata.json file
|
32
30
|
#
|
33
31
|
# @return [Ridley::Chef::Cookbook]
|
34
|
-
def from_path(path
|
35
|
-
path
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
def from_path(path)
|
33
|
+
path = Pathname.new(path)
|
34
|
+
|
35
|
+
if (file = path.join(Metadata::COMPILED_FILE_NAME)).exist?
|
36
|
+
metadata = Metadata.from_json(File.read(file))
|
37
|
+
elsif (file = path.join(Metadata::RAW_FILE_NAME)).exist?
|
38
|
+
metadata = Metadata.from_file(file)
|
40
39
|
else
|
41
40
|
raise IOError, "no #{Metadata::COMPILED_FILE_NAME} or #{Metadata::RAW_FILE_NAME} found at #{path}"
|
42
41
|
end
|
43
42
|
|
44
|
-
|
43
|
+
unless metadata.name.presence
|
44
|
+
raise Ridley::Errors::MissingNameAttribute.new(path)
|
45
|
+
end
|
46
|
+
|
45
47
|
new(metadata.name, path, metadata)
|
46
48
|
end
|
47
49
|
end
|
data/lib/ridley/client.rb
CHANGED
@@ -140,7 +140,7 @@ module Ridley
|
|
140
140
|
@options[:client_key] = File.expand_path(@options[:client_key])
|
141
141
|
raise Errors::ClientKeyFileNotFoundOrInvalid, "client key is invalid or not found at: '#{@options[:client_key]}'" unless File.exist?(@options[:client_key]) && verify_client_key(::IO.read(@options[:client_key]))
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
@connection_registry = Celluloid::Registry.new
|
145
145
|
@resources_registry = Celluloid::Registry.new
|
146
146
|
@connection_supervisor = ConnectionSupervisor.new(@connection_registry, @options)
|
@@ -276,8 +276,8 @@ module Ridley
|
|
276
276
|
end
|
277
277
|
|
278
278
|
def finalize_callback
|
279
|
-
@connection_supervisor.terminate if @connection_supervisor
|
280
|
-
@resources_supervisor.terminate if @resources_supervisor
|
279
|
+
@connection_supervisor.async.terminate if @connection_supervisor
|
280
|
+
@resources_supervisor.async.terminate if @resources_supervisor
|
281
281
|
end
|
282
282
|
end
|
283
283
|
end
|
data/lib/ridley/connection.rb
CHANGED
@@ -44,10 +44,10 @@ module Ridley
|
|
44
44
|
options = options.reverse_merge(retries: 5, retry_interval: 0.5)
|
45
45
|
@client_name = client_name
|
46
46
|
@client_key = client_key
|
47
|
-
@retries = options
|
48
|
-
@retry_interval = options
|
47
|
+
@retries = options.delete(:retries)
|
48
|
+
@retry_interval = options.delete(:retry_interval)
|
49
49
|
|
50
|
-
options[:builder] = Faraday::
|
50
|
+
options[:builder] = Faraday::RackBuilder.new do |b|
|
51
51
|
b.request :retry,
|
52
52
|
max: @retries,
|
53
53
|
interval: @retry_interval,
|
data/lib/ridley/errors.rb
CHANGED
@@ -42,6 +42,29 @@ module Ridley
|
|
42
42
|
"no encrypted data bag secret was set for this Ridley connection"
|
43
43
|
end
|
44
44
|
end
|
45
|
+
class FromFileParserError < RidleyError
|
46
|
+
def initialize(filename, error)
|
47
|
+
super "Could not parse `#{filename}': #{error.message}"
|
48
|
+
|
49
|
+
# Populate the backtrace with the actual error though
|
50
|
+
set_backtrace(error.backtrace)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class MissingNameAttribute < RidleyError
|
55
|
+
def initialize(path)
|
56
|
+
@path = path
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_s
|
60
|
+
out = "The metadata at '#{@path}' does not contain a 'name' "
|
61
|
+
out << "attribute. While Chef does not strictly enforce this "
|
62
|
+
out << "requirement, Ridley cannot continue without a valid metadata "
|
63
|
+
out << "'name' entry."
|
64
|
+
out
|
65
|
+
end
|
66
|
+
alias_method :message, :to_s
|
67
|
+
end
|
45
68
|
|
46
69
|
class BootstrapError < RidleyError; end
|
47
70
|
class ClientKeyFileNotFoundOrInvalid < BootstrapError; end
|
data/lib/ridley/logging.rb
CHANGED
@@ -25,11 +25,11 @@ module Ridley::Mixin
|
|
25
25
|
def from_file(filename)
|
26
26
|
filename = filename.to_s
|
27
27
|
|
28
|
-
|
28
|
+
ensure_presence!(filename)
|
29
|
+
|
30
|
+
with_error_handling(filename) do
|
29
31
|
self.instance_eval(IO.read(filename), filename, 1)
|
30
32
|
self
|
31
|
-
else
|
32
|
-
raise IOError, "Could not open or read: '#{filename}'"
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -42,12 +42,38 @@ module Ridley::Mixin
|
|
42
42
|
def class_from_file(filename)
|
43
43
|
filename = filename.to_s
|
44
44
|
|
45
|
-
|
45
|
+
ensure_presence!(filename)
|
46
|
+
|
47
|
+
with_error_handling(filename) do
|
46
48
|
self.class_eval(IO.read(filename), filename, 1)
|
47
49
|
self
|
48
|
-
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Ensure the given filename and path is readable
|
56
|
+
#
|
57
|
+
# @param [String] filename
|
58
|
+
#
|
59
|
+
# @raise [IOError]
|
60
|
+
# if the target file does not exist or is not readable
|
61
|
+
def ensure_presence!(filename)
|
62
|
+
unless File.exists?(filename) && File.readable?(filename)
|
49
63
|
raise IOError, "Could not open or read: '#{filename}'"
|
50
64
|
end
|
51
65
|
end
|
66
|
+
|
67
|
+
# Execute the given block, handling any exceptions that occur
|
68
|
+
#
|
69
|
+
# @param [String] filename
|
70
|
+
#
|
71
|
+
# @raise [Ridley::Errors::FromFileParserError]
|
72
|
+
# if any exceptions if raised
|
73
|
+
def with_error_handling(filename)
|
74
|
+
yield
|
75
|
+
rescue => e
|
76
|
+
raise Ridley::Errors::FromFileParserError.new(filename, e)
|
77
|
+
end
|
52
78
|
end
|
53
79
|
end
|
@@ -171,10 +171,6 @@ module Ridley
|
|
171
171
|
# @param [String] path
|
172
172
|
# path to a cookbook on local disk
|
173
173
|
#
|
174
|
-
# @option options [String] :name
|
175
|
-
# automatically populated by the metadata of the cookbook at the given path, but
|
176
|
-
# in the event that the metadata does not contain a name it can be specified with
|
177
|
-
# this option
|
178
174
|
# @option options [Boolean] :force (false)
|
179
175
|
# Upload the Cookbook even if the version already exists and is frozen on
|
180
176
|
# the target Chef Server
|
@@ -187,7 +183,7 @@ module Ridley
|
|
187
183
|
# @return [Hash]
|
188
184
|
def upload(path, options = {})
|
189
185
|
options = options.reverse_merge(validate: true, force: false, freeze: false)
|
190
|
-
cookbook = Ridley::Chef::Cookbook.from_path(path
|
186
|
+
cookbook = Ridley::Chef::Cookbook.from_path(path)
|
191
187
|
|
192
188
|
unless (existing = find(cookbook.cookbook_name, cookbook.version)).nil?
|
193
189
|
if existing.frozen? && options[:force] == false
|
@@ -8,7 +8,7 @@ module Ridley
|
|
8
8
|
def initialize(connection_registry, client_name, client_key, options = {})
|
9
9
|
super(connection_registry)
|
10
10
|
options = options.reverse_merge(pool_size: 4)
|
11
|
-
@uploader = SandboxUploader.pool(size: options
|
11
|
+
@uploader = SandboxUploader.pool(size: options.delete(:pool_size), args: [ client_name, client_key, options ])
|
12
12
|
end
|
13
13
|
|
14
14
|
# Create a new Sandbox on the client's Chef Server. A Sandbox requires an
|
@@ -98,7 +98,7 @@ module Ridley
|
|
98
98
|
attr_reader :uploader
|
99
99
|
|
100
100
|
def finalize_callback
|
101
|
-
uploader.terminate if uploader
|
101
|
+
uploader.async.terminate if uploader
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
data/lib/ridley/version.rb
CHANGED
data/ridley.gemspec
CHANGED
@@ -23,10 +23,10 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency 'buff-extensions', '~> 0.3'
|
24
24
|
s.add_dependency 'buff-ignore', '~> 1.1'
|
25
25
|
s.add_dependency 'buff-shell_out', '~> 0.1'
|
26
|
-
s.add_dependency 'celluloid', '~> 0.
|
27
|
-
s.add_dependency 'celluloid-io', '~> 0.
|
26
|
+
s.add_dependency 'celluloid', '~> 0.16.0.pre'
|
27
|
+
s.add_dependency 'celluloid-io', '~> 0.16.0.pre'
|
28
28
|
s.add_dependency 'erubis'
|
29
|
-
s.add_dependency 'faraday', '~> 0.
|
29
|
+
s.add_dependency 'faraday', '~> 0.9.0'
|
30
30
|
s.add_dependency 'hashie', '>= 2.0.2'
|
31
31
|
s.add_dependency 'json', '>= 1.7.7'
|
32
32
|
s.add_dependency 'mixlib-authentication', '>= 1.3.0'
|
@@ -15,10 +15,6 @@ describe Ridley::Chef::Cookbook do
|
|
15
15
|
subject.from_path(cookbook_path).cookbook_name.should eql("example_cookbook")
|
16
16
|
end
|
17
17
|
|
18
|
-
it "sets the cookbook_name attribute to the value of the :name option if given" do
|
19
|
-
subject.from_path(cookbook_path, name: "rspec_tester").cookbook_name.should eql("rspec_tester")
|
20
|
-
end
|
21
|
-
|
22
18
|
context "given a path that does not contain a metadata file" do
|
23
19
|
it "raises an IOError" do
|
24
20
|
lambda {
|
@@ -35,8 +31,10 @@ describe Ridley::Chef::Cookbook do
|
|
35
31
|
FileUtils.touch(File.join(cookbook_path, 'metadata.rb'))
|
36
32
|
end
|
37
33
|
|
38
|
-
it "
|
39
|
-
|
34
|
+
it "raises an exception" do
|
35
|
+
expect {
|
36
|
+
subject.from_path(cookbook_path)
|
37
|
+
}.to raise_error(Ridley::Errors::MissingNameAttribute)
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
@@ -158,7 +156,14 @@ describe Ridley::Chef::Cookbook do
|
|
158
156
|
end
|
159
157
|
|
160
158
|
context "when a metadata.json file is not present" do
|
161
|
-
before
|
159
|
+
before do
|
160
|
+
FileUtils.rm_f(File.join(cookbook_path, 'metadata.json'))
|
161
|
+
|
162
|
+
File.open(File.join(cookbook_path, 'metadata.rb'), 'w+') do |f|
|
163
|
+
f.write "name 'cookbook'"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
162
167
|
its(:compiled_metadata?) { should be_false }
|
163
168
|
end
|
164
169
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Ridley
|
4
|
+
describe Mixin::FromFile do
|
5
|
+
describe '.from_file' do
|
6
|
+
context 'when there is bad Ruby in the file' do
|
7
|
+
let(:instance) { Class.new { include Ridley::Mixin::FromFile }.new }
|
8
|
+
|
9
|
+
before do
|
10
|
+
File.stub(:exists?).and_return(true)
|
11
|
+
File.stub(:readable?).and_return(true)
|
12
|
+
IO.stub(:read).and_return('invalid Ruby code')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'raises a FromFileParserError' do
|
16
|
+
expect {
|
17
|
+
instance.from_file('/path')
|
18
|
+
}.to raise_error(Errors::FromFileParserError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'includes the backtrace from the original error' do
|
22
|
+
expect { instance.from_file('/path') }.to raise_error { |error|
|
23
|
+
expect(error.message).to include("undefined local variable or method `code' for")
|
24
|
+
expect(error.backtrace).to include("/path:1:in `block in from_file'")
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ridley
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
@@ -101,28 +101,28 @@ dependencies:
|
|
101
101
|
requirements:
|
102
102
|
- - ~>
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version:
|
104
|
+
version: 0.16.0.pre
|
105
105
|
type: :runtime
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
109
|
- - ~>
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
111
|
+
version: 0.16.0.pre
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: celluloid-io
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
116
|
- - ~>
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
118
|
+
version: 0.16.0.pre
|
119
119
|
type: :runtime
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
123
|
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
125
|
+
version: 0.16.0.pre
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: erubis
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,14 +143,14 @@ dependencies:
|
|
143
143
|
requirements:
|
144
144
|
- - ~>
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version: 0.
|
146
|
+
version: 0.9.0
|
147
147
|
type: :runtime
|
148
148
|
prerelease: false
|
149
149
|
version_requirements: !ruby/object:Gem::Requirement
|
150
150
|
requirements:
|
151
151
|
- - ~>
|
152
152
|
- !ruby/object:Gem::Version
|
153
|
-
version: 0.
|
153
|
+
version: 0.9.0
|
154
154
|
- !ruby/object:Gem::Dependency
|
155
155
|
name: hashie
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
@@ -304,7 +304,6 @@ files:
|
|
304
304
|
- lib/ridley/middleware/follow_redirects.rb
|
305
305
|
- lib/ridley/middleware/gzip.rb
|
306
306
|
- lib/ridley/middleware/parse_json.rb
|
307
|
-
- lib/ridley/middleware/retry.rb
|
308
307
|
- lib/ridley/mixin.rb
|
309
308
|
- lib/ridley/mixin/checksum.rb
|
310
309
|
- lib/ridley/mixin/from_file.rb
|
@@ -388,6 +387,7 @@ files:
|
|
388
387
|
- spec/unit/ridley/middleware/chef_response_spec.rb
|
389
388
|
- spec/unit/ridley/middleware/gzip_spec.rb
|
390
389
|
- spec/unit/ridley/middleware/parse_json_spec.rb
|
390
|
+
- spec/unit/ridley/mixins/from_file_spec.rb
|
391
391
|
- spec/unit/ridley/resource_spec.rb
|
392
392
|
- spec/unit/ridley/resources/client_resource_spec.rb
|
393
393
|
- spec/unit/ridley/resources/cookbook_resource_spec.rb
|
@@ -416,9 +416,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
416
416
|
version: 1.9.1
|
417
417
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
418
418
|
requirements:
|
419
|
-
- - '
|
419
|
+
- - '>'
|
420
420
|
- !ruby/object:Gem::Version
|
421
|
-
version:
|
421
|
+
version: 1.3.1
|
422
422
|
requirements: []
|
423
423
|
rubyforge_project:
|
424
424
|
rubygems_version: 2.0.14
|
@@ -488,6 +488,7 @@ test_files:
|
|
488
488
|
- spec/unit/ridley/middleware/chef_response_spec.rb
|
489
489
|
- spec/unit/ridley/middleware/gzip_spec.rb
|
490
490
|
- spec/unit/ridley/middleware/parse_json_spec.rb
|
491
|
+
- spec/unit/ridley/mixins/from_file_spec.rb
|
491
492
|
- spec/unit/ridley/resource_spec.rb
|
492
493
|
- spec/unit/ridley/resources/client_resource_spec.rb
|
493
494
|
- spec/unit/ridley/resources/cookbook_resource_spec.rb
|
@@ -1,60 +0,0 @@
|
|
1
|
-
module Ridley
|
2
|
-
# Catches exceptions and retries each request a limited number of times.
|
3
|
-
#
|
4
|
-
# @example
|
5
|
-
#
|
6
|
-
# Faraday.new do |conn|
|
7
|
-
# conn.request :retry, max: 2, interval: 0.05, exceptions: [CustomException, Faraday::Timeout::Error]
|
8
|
-
# conn.adapter ...
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
# @note Borrowed and modified from: {https://github.com/lostisland/faraday/blob/master/lib/faraday/request/retry.rb}
|
12
|
-
# use the Faraday official middleware after the release of 0.9.x
|
13
|
-
class Middleware::Retry < Faraday::Middleware
|
14
|
-
# @option options [Integer] :max
|
15
|
-
# maximum number of retries
|
16
|
-
# @option options [Float] :interval
|
17
|
-
# pause in seconds between retries
|
18
|
-
# @option options [Array] :exceptions
|
19
|
-
# the list of exceptions to handle
|
20
|
-
def initialize(app, options = {})
|
21
|
-
super(app)
|
22
|
-
@options = options.slice(:max, :interval, :exceptions)
|
23
|
-
@errmatch = build_exception_matcher(@options[:exceptions])
|
24
|
-
end
|
25
|
-
|
26
|
-
def call(env)
|
27
|
-
retries = @options[:max]
|
28
|
-
begin
|
29
|
-
@app.call(env)
|
30
|
-
rescue @errmatch
|
31
|
-
if retries > 0
|
32
|
-
retries -= 1
|
33
|
-
sleep @options[:interval] if @options[:interval] > 0
|
34
|
-
retry
|
35
|
-
end
|
36
|
-
raise
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# construct an exception matcher object.
|
41
|
-
#
|
42
|
-
# An exception matcher for the rescue clause can usually be any object that
|
43
|
-
# responds to `===`, but for Ruby 1.8 it has to be a Class or Module.
|
44
|
-
def build_exception_matcher(exceptions)
|
45
|
-
matcher = Module.new
|
46
|
-
(class << matcher; self; end).class_eval do
|
47
|
-
define_method(:===) do |error|
|
48
|
-
exceptions.any? do |ex|
|
49
|
-
if ex.is_a? Module then error.is_a? ex
|
50
|
-
else error.class.to_s == ex.to_s
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
matcher
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
Faraday.register_middleware(:request, retry: Ridley::Middleware::Retry)
|