ridley 0.7.0.rc4 → 0.7.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.
- data/lib/ridley.rb +2 -0
- data/lib/ridley/chef.rb +10 -0
- data/lib/ridley/chef/cookbook.rb +254 -0
- data/lib/ridley/chef/cookbook/metadata.rb +552 -0
- data/lib/ridley/chef/cookbook/syntax_check.rb +162 -0
- data/lib/ridley/chef/digester.rb +55 -0
- data/lib/ridley/errors.rb +2 -0
- data/lib/ridley/mixin.rb +3 -0
- data/lib/ridley/mixin/checksum.rb +14 -0
- data/lib/ridley/mixin/shell_out.rb +23 -0
- data/lib/ridley/resources/cookbook_resource.rb +44 -4
- data/lib/ridley/version.rb +1 -1
- data/ridley.gemspec +3 -1
- data/spec/fixtures/example_cookbook/README.md +11 -0
- data/spec/fixtures/example_cookbook/attributes/default.rb +6 -0
- data/spec/fixtures/example_cookbook/definitions/bad_def.rb +6 -0
- data/spec/fixtures/example_cookbook/files/default/file.h +2 -0
- data/spec/fixtures/example_cookbook/files/ubuntu/file.h +2 -0
- data/spec/fixtures/example_cookbook/libraries/my_lib.rb +6 -0
- data/spec/fixtures/example_cookbook/metadata.rb +7 -0
- data/spec/fixtures/example_cookbook/providers/defprovider.rb +6 -0
- data/spec/fixtures/example_cookbook/recipes/default.rb +6 -0
- data/spec/fixtures/example_cookbook/resources/defresource.rb +6 -0
- data/spec/fixtures/example_cookbook/templates/default/temp.txt.erb +1 -0
- data/spec/support/filepath_matchers.rb +19 -0
- data/spec/unit/ridley/chef/cookbook_spec.rb +412 -0
- data/spec/unit/ridley/resource_spec.rb +1 -1
- data/spec/unit/ridley/resources/cookbook_resource_spec.rb +1 -1
- metadata +76 -7
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
RSpec::Matchers.define :be_relative_path do
|
4
|
+
match do |given|
|
5
|
+
if given.nil?
|
6
|
+
false
|
7
|
+
else
|
8
|
+
Pathname.new(given).relative?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
failure_message_for_should do |given|
|
13
|
+
"Expected '#{given}' to be a relative path but got an absolute path."
|
14
|
+
end
|
15
|
+
|
16
|
+
failure_message_for_should_not do |given|
|
17
|
+
"Expected '#{given}' to not be a relative path but got an absolute path."
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,412 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::Chef::Cookbook do
|
4
|
+
describe "ClassMethods" do
|
5
|
+
subject { described_class }
|
6
|
+
|
7
|
+
describe "#from_path" do
|
8
|
+
let(:cookbook_path) { fixtures_path.join("example_cookbook") }
|
9
|
+
|
10
|
+
it "returns an instance of Ridley::Chef::Cookbook" do
|
11
|
+
subject.from_path(cookbook_path).should be_a(described_class)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a cookbook_name attribute set to the value of the 'name' attribute in the metadata" do
|
15
|
+
subject.from_path(cookbook_path).cookbook_name.should eql("example_cookbook")
|
16
|
+
end
|
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
|
+
context "given a path that does not contain a metadata file" do
|
23
|
+
it "raises an IOError" do
|
24
|
+
lambda {
|
25
|
+
subject.from_path(Dir.mktmpdir)
|
26
|
+
}.should raise_error(IOError)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#checksum" do
|
32
|
+
it "delegates to Ridley::Chef::Digester.md5_checksum_for_file" do
|
33
|
+
path = fixtures_path.join("example_cookbook", "metadata.rb")
|
34
|
+
Ridley::Chef::Digester.should_receive(:md5_checksum_for_file).with(path)
|
35
|
+
|
36
|
+
subject.checksum(path)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:cookbook) do
|
42
|
+
described_class.from_path(fixtures_path.join('example_cookbook'))
|
43
|
+
end
|
44
|
+
|
45
|
+
subject { cookbook }
|
46
|
+
|
47
|
+
describe "#checksums" do
|
48
|
+
it "returns a Hash" do
|
49
|
+
subject.checksums.should be_a(Hash)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "has a key value for every cookbook file" do
|
53
|
+
subject.checksums.should have(subject.send(:files).length).items
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#manifest" do
|
58
|
+
it "returns a Mash with a key for each cookbook file category" do
|
59
|
+
[
|
60
|
+
:recipes,
|
61
|
+
:definitions,
|
62
|
+
:libraries,
|
63
|
+
:attributes,
|
64
|
+
:files,
|
65
|
+
:templates,
|
66
|
+
:resources,
|
67
|
+
:providers,
|
68
|
+
:root_files
|
69
|
+
].each do |category|
|
70
|
+
subject.manifest.should have_key(category)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#validate" do
|
76
|
+
let(:syntax_checker) { double('syntax_checker') }
|
77
|
+
|
78
|
+
before(:each) do
|
79
|
+
subject.stub(:syntax_checker) { syntax_checker }
|
80
|
+
end
|
81
|
+
|
82
|
+
it "asks the syntax_checker to validate the ruby and template files of the cookbook" do
|
83
|
+
syntax_checker.should_receive(:validate_ruby_files).and_return(true)
|
84
|
+
syntax_checker.should_receive(:validate_templates).and_return(true)
|
85
|
+
|
86
|
+
subject.validate
|
87
|
+
end
|
88
|
+
|
89
|
+
it "raises CookbookSyntaxError if the cookbook contains invalid ruby files" do
|
90
|
+
syntax_checker.should_receive(:validate_ruby_files).and_return(false)
|
91
|
+
|
92
|
+
lambda {
|
93
|
+
subject.validate
|
94
|
+
}.should raise_error(Ridley::Errors::CookbookSyntaxError)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "raises CookbookSyntaxError if the cookbook contains invalid template files" do
|
98
|
+
syntax_checker.should_receive(:validate_ruby_files).and_return(true)
|
99
|
+
syntax_checker.should_receive(:validate_templates).and_return(false)
|
100
|
+
|
101
|
+
lambda {
|
102
|
+
subject.validate
|
103
|
+
}.should raise_error(Ridley::Errors::CookbookSyntaxError)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#file_metadata" do
|
108
|
+
let(:file) { subject.path.join("files", "default", "file.h") }
|
109
|
+
before(:each) { @metadata = subject.file_metadata(:file, file) }
|
110
|
+
|
111
|
+
it "has a :path key whose value is a relative path from the CachedCookbook's path" do
|
112
|
+
@metadata.should have_key(:path)
|
113
|
+
@metadata[:path].should be_relative_path
|
114
|
+
@metadata[:path].should eql("files/default/file.h")
|
115
|
+
end
|
116
|
+
|
117
|
+
it "has a :name key whose value is the basename of the target file" do
|
118
|
+
@metadata.should have_key(:name)
|
119
|
+
@metadata[:name].should eql("file.h")
|
120
|
+
end
|
121
|
+
|
122
|
+
it "has a :checksum key whose value is the checksum of the target file" do
|
123
|
+
@metadata.should have_key(:checksum)
|
124
|
+
@metadata[:checksum].should eql("7b1ebd2ff580ca9dc46fb27ec1653bf2")
|
125
|
+
end
|
126
|
+
|
127
|
+
it "has a :specificity key" do
|
128
|
+
@metadata.should have_key(:specificity)
|
129
|
+
end
|
130
|
+
|
131
|
+
context "given a file or template in a 'default' directory" do
|
132
|
+
let(:file) { subject.path.join("files", "default", "file.h") }
|
133
|
+
before(:each) { @metadata = subject.file_metadata(:files, file) }
|
134
|
+
|
135
|
+
it "has a specificity of 'default'" do
|
136
|
+
@metadata[:specificity].should eql("default")
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "given a file or template in a 'ubuntu' directory" do
|
141
|
+
let(:file) { subject.path.join("files", "ubuntu", "file.h") }
|
142
|
+
before(:each) { @metadata = subject.file_metadata(:files, file) }
|
143
|
+
|
144
|
+
it "has a specificity of 'ubuntu'" do
|
145
|
+
@metadata[:specificity].should eql("ubuntu")
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe "#to_hash" do
|
151
|
+
subject { cookbook.to_hash }
|
152
|
+
|
153
|
+
it "has a :recipes key with a value of an Array Hashes" do
|
154
|
+
subject.should have_key(:recipes)
|
155
|
+
subject[:recipes].should be_a(Array)
|
156
|
+
subject[:recipes].each do |item|
|
157
|
+
item.should be_a(Hash)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
it "has a :name key value pair in a Hash of the :recipes Array of Hashes" do
|
162
|
+
subject[:recipes].first.should have_key(:name)
|
163
|
+
end
|
164
|
+
|
165
|
+
it "has a :path key value pair in a Hash of the :recipes Array of Hashes" do
|
166
|
+
subject[:recipes].first.should have_key(:path)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "has a :checksum key value pair in a Hash of the :recipes Array of Hashes" do
|
170
|
+
subject[:recipes].first.should have_key(:checksum)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "has a :specificity key value pair in a Hash of the :recipes Array of Hashes" do
|
174
|
+
subject[:recipes].first.should have_key(:specificity)
|
175
|
+
end
|
176
|
+
|
177
|
+
it "has a :definitions key with a value of an Array Hashes" do
|
178
|
+
subject.should have_key(:definitions)
|
179
|
+
subject[:definitions].should be_a(Array)
|
180
|
+
subject[:definitions].each do |item|
|
181
|
+
item.should be_a(Hash)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
it "has a :name key value pair in a Hash of the :definitions Array of Hashes" do
|
186
|
+
subject[:definitions].first.should have_key(:name)
|
187
|
+
end
|
188
|
+
|
189
|
+
it "has a :path key value pair in a Hash of the :definitions Array of Hashes" do
|
190
|
+
subject[:definitions].first.should have_key(:path)
|
191
|
+
end
|
192
|
+
|
193
|
+
it "has a :checksum key value pair in a Hash of the :definitions Array of Hashes" do
|
194
|
+
subject[:definitions].first.should have_key(:checksum)
|
195
|
+
end
|
196
|
+
|
197
|
+
it "has a :specificity key value pair in a Hash of the :definitions Array of Hashes" do
|
198
|
+
subject[:definitions].first.should have_key(:specificity)
|
199
|
+
end
|
200
|
+
|
201
|
+
it "has a :libraries key with a value of an Array Hashes" do
|
202
|
+
subject.should have_key(:libraries)
|
203
|
+
subject[:libraries].should be_a(Array)
|
204
|
+
subject[:libraries].each do |item|
|
205
|
+
item.should be_a(Hash)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
it "has a :name key value pair in a Hash of the :libraries Array of Hashes" do
|
210
|
+
subject[:libraries].first.should have_key(:name)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "has a :path key value pair in a Hash of the :libraries Array of Hashes" do
|
214
|
+
subject[:libraries].first.should have_key(:path)
|
215
|
+
end
|
216
|
+
|
217
|
+
it "has a :checksum key value pair in a Hash of the :libraries Array of Hashes" do
|
218
|
+
subject[:libraries].first.should have_key(:checksum)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "has a :specificity key value pair in a Hash of the :libraries Array of Hashes" do
|
222
|
+
subject[:libraries].first.should have_key(:specificity)
|
223
|
+
end
|
224
|
+
|
225
|
+
it "has a :attributes key with a value of an Array Hashes" do
|
226
|
+
subject.should have_key(:attributes)
|
227
|
+
subject[:attributes].should be_a(Array)
|
228
|
+
subject[:attributes].each do |item|
|
229
|
+
item.should be_a(Hash)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
it "has a :name key value pair in a Hash of the :attributes Array of Hashes" do
|
234
|
+
subject[:attributes].first.should have_key(:name)
|
235
|
+
end
|
236
|
+
|
237
|
+
it "has a :path key value pair in a Hash of the :attributes Array of Hashes" do
|
238
|
+
subject[:attributes].first.should have_key(:path)
|
239
|
+
end
|
240
|
+
|
241
|
+
it "has a :checksum key value pair in a Hash of the :attributes Array of Hashes" do
|
242
|
+
subject[:attributes].first.should have_key(:checksum)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "has a :specificity key value pair in a Hash of the :attributes Array of Hashes" do
|
246
|
+
subject[:attributes].first.should have_key(:specificity)
|
247
|
+
end
|
248
|
+
|
249
|
+
it "has a :files key with a value of an Array Hashes" do
|
250
|
+
subject.should have_key(:files)
|
251
|
+
subject[:files].should be_a(Array)
|
252
|
+
subject[:files].each do |item|
|
253
|
+
item.should be_a(Hash)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
it "has a :name key value pair in a Hash of the :files Array of Hashes" do
|
258
|
+
subject[:files].first.should have_key(:name)
|
259
|
+
end
|
260
|
+
|
261
|
+
it "has a :path key value pair in a Hash of the :files Array of Hashes" do
|
262
|
+
subject[:files].first.should have_key(:path)
|
263
|
+
end
|
264
|
+
|
265
|
+
it "has a :checksum key value pair in a Hash of the :files Array of Hashes" do
|
266
|
+
subject[:files].first.should have_key(:checksum)
|
267
|
+
end
|
268
|
+
|
269
|
+
it "has a :specificity key value pair in a Hash of the :files Array of Hashes" do
|
270
|
+
subject[:files].first.should have_key(:specificity)
|
271
|
+
end
|
272
|
+
|
273
|
+
it "has a :templates key with a value of an Array Hashes" do
|
274
|
+
subject.should have_key(:templates)
|
275
|
+
subject[:templates].should be_a(Array)
|
276
|
+
subject[:templates].each do |item|
|
277
|
+
item.should be_a(Hash)
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
it "has a :name key value pair in a Hash of the :templates Array of Hashes" do
|
282
|
+
subject[:templates].first.should have_key(:name)
|
283
|
+
end
|
284
|
+
|
285
|
+
it "has a :path key value pair in a Hash of the :templates Array of Hashes" do
|
286
|
+
subject[:templates].first.should have_key(:path)
|
287
|
+
end
|
288
|
+
|
289
|
+
it "has a :checksum key value pair in a Hash of the :templates Array of Hashes" do
|
290
|
+
subject[:templates].first.should have_key(:checksum)
|
291
|
+
end
|
292
|
+
|
293
|
+
it "has a :specificity key value pair in a Hash of the :templates Array of Hashes" do
|
294
|
+
subject[:templates].first.should have_key(:specificity)
|
295
|
+
end
|
296
|
+
|
297
|
+
it "has a :resources key with a value of an Array Hashes" do
|
298
|
+
subject.should have_key(:resources)
|
299
|
+
subject[:resources].should be_a(Array)
|
300
|
+
subject[:resources].each do |item|
|
301
|
+
item.should be_a(Hash)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
it "has a :name key value pair in a Hash of the :resources Array of Hashes" do
|
306
|
+
subject[:resources].first.should have_key(:name)
|
307
|
+
end
|
308
|
+
|
309
|
+
it "has a :path key value pair in a Hash of the :resources Array of Hashes" do
|
310
|
+
subject[:resources].first.should have_key(:path)
|
311
|
+
end
|
312
|
+
|
313
|
+
it "has a :checksum key value pair in a Hash of the :resources Array of Hashes" do
|
314
|
+
subject[:resources].first.should have_key(:checksum)
|
315
|
+
end
|
316
|
+
|
317
|
+
it "has a :specificity key value pair in a Hash of the :resources Array of Hashes" do
|
318
|
+
subject[:resources].first.should have_key(:specificity)
|
319
|
+
end
|
320
|
+
|
321
|
+
it "has a :providers key with a value of an Array Hashes" do
|
322
|
+
subject.should have_key(:providers)
|
323
|
+
subject[:providers].should be_a(Array)
|
324
|
+
subject[:providers].each do |item|
|
325
|
+
item.should be_a(Hash)
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
it "has a :name key value pair in a Hash of the :providers Array of Hashes" do
|
330
|
+
subject[:providers].first.should have_key(:name)
|
331
|
+
end
|
332
|
+
|
333
|
+
it "has a :path key value pair in a Hash of the :providers Array of Hashes" do
|
334
|
+
subject[:providers].first.should have_key(:path)
|
335
|
+
end
|
336
|
+
|
337
|
+
it "has a :checksum key value pair in a Hash of the :providers Array of Hashes" do
|
338
|
+
subject[:providers].first.should have_key(:checksum)
|
339
|
+
end
|
340
|
+
|
341
|
+
it "has a :specificity key value pair in a Hash of the :providers Array of Hashes" do
|
342
|
+
subject[:providers].first.should have_key(:specificity)
|
343
|
+
end
|
344
|
+
|
345
|
+
it "has a :root_files key with a value of an Array Hashes" do
|
346
|
+
subject.should have_key(:root_files)
|
347
|
+
subject[:root_files].should be_a(Array)
|
348
|
+
subject[:root_files].each do |item|
|
349
|
+
item.should be_a(Hash)
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
it "has a :name key value pair in a Hash of the :root_files Array of Hashes" do
|
354
|
+
subject[:root_files].first.should have_key(:name)
|
355
|
+
end
|
356
|
+
|
357
|
+
it "has a :path key value pair in a Hash of the :root_files Array of Hashes" do
|
358
|
+
subject[:root_files].first.should have_key(:path)
|
359
|
+
end
|
360
|
+
|
361
|
+
it "has a :checksum key value pair in a Hash of the :root_files Array of Hashes" do
|
362
|
+
subject[:root_files].first.should have_key(:checksum)
|
363
|
+
end
|
364
|
+
|
365
|
+
it "has a :specificity key value pair in a Hash of the :root_files Array of Hashes" do
|
366
|
+
subject[:root_files].first.should have_key(:specificity)
|
367
|
+
end
|
368
|
+
|
369
|
+
it "has a :cookbook_name key with a String value" do
|
370
|
+
subject.should have_key(:cookbook_name)
|
371
|
+
subject[:cookbook_name].should be_a(String)
|
372
|
+
end
|
373
|
+
|
374
|
+
it "has a :metadata key with a Cookbook::Metadata value" do
|
375
|
+
subject.should have_key(:metadata)
|
376
|
+
subject[:metadata].should be_a(Ridley::Chef::Cookbook::Metadata)
|
377
|
+
end
|
378
|
+
|
379
|
+
it "has a :version key with a String value" do
|
380
|
+
subject.should have_key(:version)
|
381
|
+
subject[:version].should be_a(String)
|
382
|
+
end
|
383
|
+
|
384
|
+
it "has a :name key with a String value" do
|
385
|
+
subject.should have_key(:name)
|
386
|
+
subject[:name].should be_a(String)
|
387
|
+
end
|
388
|
+
|
389
|
+
it "has a value containing the cookbook name and version separated by a dash for :name" do
|
390
|
+
name, version = subject[:name].split('-')
|
391
|
+
|
392
|
+
name.should eql(cookbook.cookbook_name)
|
393
|
+
version.should eql(cookbook.version)
|
394
|
+
end
|
395
|
+
|
396
|
+
it "has a :chef_type key with Cookbook::CHEF_TYPE as the value" do
|
397
|
+
subject.should have_key(:chef_type)
|
398
|
+
subject[:chef_type].should eql(Ridley::Chef::Cookbook::CHEF_TYPE)
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
describe "#to_json" do
|
403
|
+
before(:each) do
|
404
|
+
@json = subject.to_json
|
405
|
+
end
|
406
|
+
|
407
|
+
it "has a 'json_class' key with Cookbook::CHEF_JSON_CLASS as the value" do
|
408
|
+
@json.should have_json_path('json_class')
|
409
|
+
parse_json(@json)['json_class'].should eql(Ridley::Chef::Cookbook::CHEF_JSON_CLASS)
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end
|
@@ -8,7 +8,7 @@ describe Ridley::Resource do
|
|
8
8
|
Class.new(Ridley::Resource)
|
9
9
|
end
|
10
10
|
|
11
|
-
it_behaves_like "a Ridley Resource",
|
11
|
+
it_behaves_like "a Ridley Resource", Class.new(Ridley::Resource)
|
12
12
|
|
13
13
|
describe "::initialize" do
|
14
14
|
it "mass assigns the given attributes" do
|
@@ -211,7 +211,7 @@ describe Ridley::CookbookResource do
|
|
211
211
|
end
|
212
212
|
|
213
213
|
describe "#download_file" do
|
214
|
-
let(:destination) { tmp_path.join('fake.file') }
|
214
|
+
let(:destination) { tmp_path.join('fake.file').to_s }
|
215
215
|
|
216
216
|
before(:each) do
|
217
217
|
subject.stub(:root_files) { [ { name: 'metadata.rb', url: "http://test.it/file" } ] }
|