chef-dk 0.5.0.rc.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +63 -24
- data/lib/chef-dk/builtin_commands.rb +2 -0
- data/lib/chef-dk/command/diff.rb +312 -0
- data/lib/chef-dk/command/push.rb +1 -1
- data/lib/chef-dk/command/shell_init.rb +21 -3
- data/lib/chef-dk/command/update.rb +28 -5
- data/lib/chef-dk/configurable.rb +1 -1
- data/lib/chef-dk/exceptions.rb +3 -0
- data/lib/chef-dk/pager.rb +106 -0
- data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +114 -0
- data/lib/chef-dk/policyfile/comparison_base.rb +124 -0
- data/lib/chef-dk/policyfile/cookbook_sources.rb +1 -0
- data/lib/chef-dk/policyfile/differ.rb +266 -0
- data/lib/chef-dk/policyfile/dsl.rb +26 -3
- data/lib/chef-dk/policyfile/uploader.rb +4 -5
- data/lib/chef-dk/policyfile_compiler.rb +8 -0
- data/lib/chef-dk/policyfile_lock.rb +135 -3
- data/lib/chef-dk/policyfile_services/install.rb +1 -0
- data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -0
- data/lib/chef-dk/service_exceptions.rb +12 -0
- data/lib/chef-dk/ui.rb +8 -0
- data/lib/chef-dk/version.rb +1 -1
- data/spec/spec_helper.rb +6 -0
- data/spec/test_helpers.rb +4 -0
- data/spec/unit/command/diff_spec.rb +283 -0
- data/spec/unit/command/shell_init_spec.rb +19 -2
- data/spec/unit/command/update_spec.rb +96 -0
- data/spec/unit/command/verify_spec.rb +0 -6
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -0
- data/spec/unit/pager_spec.rb +119 -0
- data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +66 -0
- data/spec/unit/policyfile/comparison_base_spec.rb +343 -0
- data/spec/unit/policyfile/differ_spec.rb +687 -0
- data/spec/unit/policyfile_evaluation_spec.rb +87 -0
- data/spec/unit/policyfile_lock_build_spec.rb +247 -8
- data/spec/unit/policyfile_lock_serialization_spec.rb +47 -0
- data/spec/unit/policyfile_services/export_repo_spec.rb +2 -0
- data/spec/unit/policyfile_services/push_spec.rb +2 -0
- data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -0
- metadata +62 -6
@@ -243,6 +243,25 @@ E
|
|
243
243
|
|
244
244
|
end
|
245
245
|
|
246
|
+
context "with the default source set to a chef-repo path" do
|
247
|
+
|
248
|
+
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
249
|
+
|
250
|
+
let(:policyfile_rb) do
|
251
|
+
<<-EOH
|
252
|
+
run_list "foo", "bar"
|
253
|
+
default_source :chef_repo, "#{chef_repo}"
|
254
|
+
EOH
|
255
|
+
end
|
256
|
+
|
257
|
+
it "has a default source" do
|
258
|
+
expect(policyfile.errors).to eq([])
|
259
|
+
expected = ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo)
|
260
|
+
expect(policyfile.default_source).to eq(expected)
|
261
|
+
end
|
262
|
+
|
263
|
+
end
|
264
|
+
|
246
265
|
end
|
247
266
|
|
248
267
|
describe "assigning cookbooks to specific sources" do
|
@@ -323,6 +342,74 @@ EOH
|
|
323
342
|
|
324
343
|
end
|
325
344
|
|
345
|
+
describe "defining attributes" do
|
346
|
+
|
347
|
+
let(:policyfile_rb) do
|
348
|
+
<<-EOH
|
349
|
+
name "policy-with-attrs"
|
350
|
+
run_list "foo"
|
351
|
+
|
352
|
+
# basic attribute setting:
|
353
|
+
default["foo"] = "bar"
|
354
|
+
|
355
|
+
# auto-vivify
|
356
|
+
default["abc"]["def"]["ghi"] = "xyz"
|
357
|
+
|
358
|
+
# literal data structures
|
359
|
+
default["baz"] = {
|
360
|
+
"more_nested_stuff" => "yup"
|
361
|
+
}
|
362
|
+
|
363
|
+
# Array literals work and we merge rather than overwrite:
|
364
|
+
default["baz"]["an_array"] = ["a", "b", "c"]
|
365
|
+
|
366
|
+
# all the same stuff works with overrides:
|
367
|
+
|
368
|
+
override["foo"] = "bar"
|
369
|
+
|
370
|
+
override["abc"]["def"]["ghi"] = "xyz"
|
371
|
+
|
372
|
+
override["baz_override"] = {
|
373
|
+
"more_nested_stuff" => "yup"
|
374
|
+
}
|
375
|
+
|
376
|
+
override["baz_override"]["an_array"] = ["a", "b", "c"]
|
377
|
+
EOH
|
378
|
+
end
|
379
|
+
|
380
|
+
let(:expected_combined_default_attrs) do
|
381
|
+
{
|
382
|
+
"foo" => "bar",
|
383
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
384
|
+
"baz" => {
|
385
|
+
"more_nested_stuff" => "yup",
|
386
|
+
"an_array" => ["a", "b", "c"]
|
387
|
+
}
|
388
|
+
}
|
389
|
+
end
|
390
|
+
|
391
|
+
let(:expected_combined_override_attrs) do
|
392
|
+
{
|
393
|
+
"foo" => "bar",
|
394
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
395
|
+
"baz_override" => {
|
396
|
+
"more_nested_stuff" => "yup",
|
397
|
+
"an_array" => ["a", "b", "c"]
|
398
|
+
}
|
399
|
+
}
|
400
|
+
end
|
401
|
+
|
402
|
+
it "defines default attributes" do
|
403
|
+
expect(policyfile.errors).to eq([])
|
404
|
+
expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
|
405
|
+
end
|
406
|
+
|
407
|
+
it "defines override attributes" do
|
408
|
+
expect(policyfile.errors).to eq([])
|
409
|
+
expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
326
413
|
end
|
327
414
|
|
328
415
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
1
2
|
#
|
2
3
|
# Copyright:: Copyright (c) 2014 Chef Software Inc.
|
3
4
|
# License:: Apache License, Version 2.0
|
@@ -130,6 +131,61 @@ describe ChefDK::PolicyfileLock, "building a lockfile" do
|
|
130
131
|
|
131
132
|
end
|
132
133
|
|
134
|
+
describe "policyfiles with invalid attributes" do
|
135
|
+
|
136
|
+
let(:policyfile_lock) do
|
137
|
+
ChefDK::PolicyfileLock.build(storage_config) do |p|
|
138
|
+
|
139
|
+
p.name = "invalid_cache_key_policyfile"
|
140
|
+
|
141
|
+
p.run_list = [ "recipe[foo]" ]
|
142
|
+
|
143
|
+
p.cached_cookbook("foo") do |cb|
|
144
|
+
cb.cache_key = "foo-1.0.0"
|
145
|
+
end
|
146
|
+
|
147
|
+
p.default_attributes = default_attributes
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "invalid floats - infinity" do
|
152
|
+
|
153
|
+
let(:default_attributes) { {"infinity" => Float::INFINITY} }
|
154
|
+
|
155
|
+
it "raises a descriptive error" do
|
156
|
+
expect { policyfile_lock.to_lock }.to raise_error(ChefDK::InvalidPolicyfileAttribute)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context "invalid floats - nan" do
|
161
|
+
|
162
|
+
let(:default_attributes) { {"infinity" => Float::NAN} }
|
163
|
+
|
164
|
+
it "raises a descriptive error" do
|
165
|
+
expect { policyfile_lock.to_lock }.to raise_error(ChefDK::InvalidPolicyfileAttribute)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context "non-string hash/object keys" do
|
170
|
+
|
171
|
+
let(:default_attributes) { {1906 => "lol nope"} }
|
172
|
+
|
173
|
+
it "raises a descriptive error" do
|
174
|
+
expect { policyfile_lock.to_lock }.to raise_error(ChefDK::InvalidPolicyfileAttribute)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context "values that are not Hash/Array/String/Float/Integer/true/false/nil" do
|
179
|
+
|
180
|
+
let(:default_attributes) { { "raw object" => Object.new } }
|
181
|
+
|
182
|
+
it "raises a descriptive error" do
|
183
|
+
expect { policyfile_lock.to_lock }.to raise_error(ChefDK::InvalidPolicyfileAttribute)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
|
133
189
|
context "with a minimal policyfile" do
|
134
190
|
|
135
191
|
let(:policyfile_lock) do
|
@@ -150,11 +206,99 @@ describe ChefDK::PolicyfileLock, "building a lockfile" do
|
|
150
206
|
name:minimal_policyfile
|
151
207
|
run-list-item:recipe[foo]
|
152
208
|
cookbook:foo;id:467dc855408ce8b74f991c5dc2fd72a6aa369b60
|
209
|
+
default_attributes:{}
|
210
|
+
override_attributes:{}
|
211
|
+
REVISION_STRING
|
212
|
+
end
|
213
|
+
|
214
|
+
let(:expected_revision_id) do
|
215
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
216
|
+
end
|
217
|
+
|
218
|
+
let(:compiled_policyfile) do
|
219
|
+
{
|
220
|
+
"revision_id" => expected_revision_id,
|
221
|
+
|
222
|
+
"name" => "minimal_policyfile",
|
223
|
+
|
224
|
+
"run_list" => ["recipe[foo]"],
|
225
|
+
|
226
|
+
"cookbook_locks" => {
|
227
|
+
|
228
|
+
"foo" => {
|
229
|
+
"version" => "1.0.0",
|
230
|
+
"identifier" => cookbook_foo_cksum,
|
231
|
+
"dotted_decimal_identifier" => cookbook_foo_cksum_dotted,
|
232
|
+
"cache_key" => "foo-1.0.0",
|
233
|
+
"origin" => nil,
|
234
|
+
"source_options" => nil
|
235
|
+
},
|
236
|
+
},
|
237
|
+
"default_attributes" => {},
|
238
|
+
"override_attributes" => {},
|
239
|
+
|
240
|
+
"solution_dependencies" => { "Policyfile" => [], "dependencies" => {} }
|
241
|
+
}
|
242
|
+
end
|
243
|
+
|
244
|
+
it "has a cache path" do
|
245
|
+
expect(policyfile_lock.cache_path).to eq(cache_path)
|
246
|
+
end
|
247
|
+
|
248
|
+
it "computes a minimal policyfile" do
|
249
|
+
expect(policyfile_lock.to_lock).to eq(compiled_policyfile)
|
250
|
+
end
|
251
|
+
|
252
|
+
it "generates a canonical revision string" do
|
253
|
+
expect(policyfile_lock.canonical_revision_string).to eq(expected_canonical_revision_string)
|
254
|
+
end
|
255
|
+
|
256
|
+
it "generates a revision id" do
|
257
|
+
expect(policyfile_lock.revision_id).to eq(expected_revision_id)
|
258
|
+
end
|
259
|
+
|
260
|
+
end
|
261
|
+
|
262
|
+
context "with a policyfile containing attributes" do
|
263
|
+
|
264
|
+
let(:policyfile_lock) do
|
265
|
+
ChefDK::PolicyfileLock.build(storage_config) do |p|
|
266
|
+
|
267
|
+
p.name = "minimal_policyfile"
|
268
|
+
|
269
|
+
p.run_list = [ "recipe[foo]" ]
|
270
|
+
p.cached_cookbook("foo") do |cb|
|
271
|
+
cb.cache_key = "foo-1.0.0"
|
272
|
+
end
|
273
|
+
|
274
|
+
p.default_attributes = {
|
275
|
+
"foo" => "bar",
|
276
|
+
"aaa".encode('utf-16') => "aaa".encode('utf-16'),
|
277
|
+
"ddd" => true,
|
278
|
+
"ccc" => false,
|
279
|
+
"bbb" => nil,
|
280
|
+
"e" => 1.2,
|
281
|
+
"f" => 5,
|
282
|
+
"g" => 1_000_000_000_000_000.0,
|
283
|
+
"nested" => { "a" => "b" }
|
284
|
+
}
|
285
|
+
p.override_attributes = { "foo2" => "baz" }
|
286
|
+
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
let(:expected_canonical_revision_string) do
|
291
|
+
<<-REVISION_STRING
|
292
|
+
name:minimal_policyfile
|
293
|
+
run-list-item:recipe[foo]
|
294
|
+
cookbook:foo;id:467dc855408ce8b74f991c5dc2fd72a6aa369b60
|
295
|
+
default_attributes:{"aaa":"aaa","bbb":null,"ccc":false,"ddd":true,"e":1.2,"f":5,"foo":"bar","g":1e+15,"nested":{"a":"b"}}
|
296
|
+
override_attributes:{"foo2":"baz"}
|
153
297
|
REVISION_STRING
|
154
298
|
end
|
155
299
|
|
156
300
|
let(:expected_revision_id) do
|
157
|
-
Digest::
|
301
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
158
302
|
end
|
159
303
|
|
160
304
|
let(:compiled_policyfile) do
|
@@ -176,6 +320,19 @@ REVISION_STRING
|
|
176
320
|
"source_options" => nil
|
177
321
|
},
|
178
322
|
},
|
323
|
+
"default_attributes" => {
|
324
|
+
"foo" => "bar",
|
325
|
+
"aaa".encode('utf-16') => "aaa".encode('utf-16'),
|
326
|
+
"ddd" => true,
|
327
|
+
"ccc" => false,
|
328
|
+
"bbb" => nil,
|
329
|
+
"e" => 1.2,
|
330
|
+
"f" => 5,
|
331
|
+
"g" => 1_000_000_000_000_000.0,
|
332
|
+
"nested" => { "a" => "b" }
|
333
|
+
},
|
334
|
+
"override_attributes" => { "foo2" => "baz" },
|
335
|
+
|
179
336
|
"solution_dependencies" => { "Policyfile" => [], "dependencies" => {} }
|
180
337
|
}
|
181
338
|
end
|
@@ -225,11 +382,13 @@ REVISION_STRING
|
|
225
382
|
name:dev_cookbook
|
226
383
|
run-list-item:recipe[bar]
|
227
384
|
cookbook:bar;id:#{cookbook_bar_cksum}
|
385
|
+
default_attributes:{}
|
386
|
+
override_attributes:{}
|
228
387
|
REVISION_STRING
|
229
388
|
end
|
230
389
|
|
231
390
|
let(:expected_revision_id) do
|
232
|
-
Digest::
|
391
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
233
392
|
end
|
234
393
|
|
235
394
|
let(:compiled_policyfile) do
|
@@ -261,6 +420,10 @@ REVISION_STRING
|
|
261
420
|
"source_options" => nil
|
262
421
|
},
|
263
422
|
},
|
423
|
+
|
424
|
+
"default_attributes" => {},
|
425
|
+
"override_attributes" => {},
|
426
|
+
|
264
427
|
"solution_dependencies" => { "Policyfile" => [], "dependencies" => {} }
|
265
428
|
}
|
266
429
|
end
|
@@ -319,11 +482,13 @@ name:custom_identifier
|
|
319
482
|
run-list-item:recipe[foo]
|
320
483
|
cookbook:foo;id:1.0.0
|
321
484
|
cookbook:bar;id:0.1.0
|
485
|
+
default_attributes:{}
|
486
|
+
override_attributes:{}
|
322
487
|
REVISION_STRING
|
323
488
|
end
|
324
489
|
|
325
490
|
let(:expected_revision_id) do
|
326
|
-
Digest::
|
491
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
327
492
|
end
|
328
493
|
|
329
494
|
let(:compiled_policyfile) do
|
@@ -364,6 +529,10 @@ REVISION_STRING
|
|
364
529
|
"source_options" => nil
|
365
530
|
},
|
366
531
|
},
|
532
|
+
|
533
|
+
"default_attributes" => {},
|
534
|
+
"override_attributes" => {},
|
535
|
+
|
367
536
|
"solution_dependencies" => { "Policyfile" => [], "dependencies" => {} }
|
368
537
|
}
|
369
538
|
end
|
@@ -438,11 +607,13 @@ cookbook:foo;id:#{cookbook_foo_cksum}
|
|
438
607
|
cookbook:bar;id:#{cookbook_bar_cksum}
|
439
608
|
cookbook:baz;id:#{cookbook_baz_cksum}
|
440
609
|
cookbook:dep_of_bar;id:#{cookbook_dep_of_bar_cksum}
|
610
|
+
default_attributes:{}
|
611
|
+
override_attributes:{}
|
441
612
|
REVISION_STRING
|
442
613
|
end
|
443
614
|
|
444
615
|
let(:expected_revision_id) do
|
445
|
-
Digest::
|
616
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
446
617
|
end
|
447
618
|
|
448
619
|
let(:compiled_policyfile) do
|
@@ -504,6 +675,9 @@ REVISION_STRING
|
|
504
675
|
|
505
676
|
},
|
506
677
|
|
678
|
+
"default_attributes" => {},
|
679
|
+
"override_attributes" => {},
|
680
|
+
|
507
681
|
"solution_dependencies" => { "Policyfile" => [], "dependencies" => {} }
|
508
682
|
|
509
683
|
}
|
@@ -560,11 +734,13 @@ REVISION_STRING
|
|
560
734
|
name:minimal_policyfile
|
561
735
|
run-list-item:recipe[foo]
|
562
736
|
cookbook:foo;id:#{cookbook_foo_cksum}
|
737
|
+
default_attributes:{}
|
738
|
+
override_attributes:{}
|
563
739
|
REVISION_STRING
|
564
740
|
end
|
565
741
|
|
566
742
|
let(:expected_revision_id) do
|
567
|
-
Digest::
|
743
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
568
744
|
end
|
569
745
|
|
570
746
|
let(:compiled_policyfile) do
|
@@ -587,6 +763,10 @@ REVISION_STRING
|
|
587
763
|
"source_options" => nil
|
588
764
|
},
|
589
765
|
},
|
766
|
+
|
767
|
+
"default_attributes" => {},
|
768
|
+
"override_attributes" => {},
|
769
|
+
|
590
770
|
"solution_dependencies" => {
|
591
771
|
"Policyfile" => [],
|
592
772
|
"dependencies" => {"foo (1.0.0)" => []}
|
@@ -624,11 +804,13 @@ name:minimal_policyfile
|
|
624
804
|
run-list-item:recipe[foo]
|
625
805
|
named-run-list:rl2;run-list-item:recipe[foo::bar]
|
626
806
|
cookbook:foo;id:#{cookbook_foo_cksum}
|
807
|
+
default_attributes:{}
|
808
|
+
override_attributes:{}
|
627
809
|
REVISION_STRING
|
628
810
|
end
|
629
811
|
|
630
812
|
let(:expected_revision_id) do
|
631
|
-
Digest::
|
813
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
632
814
|
end
|
633
815
|
|
634
816
|
let(:compiled_policyfile) do
|
@@ -654,6 +836,9 @@ REVISION_STRING
|
|
654
836
|
},
|
655
837
|
},
|
656
838
|
|
839
|
+
"default_attributes" => {},
|
840
|
+
"override_attributes" => {},
|
841
|
+
|
657
842
|
"solution_dependencies" => { "Policyfile" => [], "dependencies" => {} }
|
658
843
|
}
|
659
844
|
end
|
@@ -706,13 +891,48 @@ REVISION_STRING
|
|
706
891
|
end
|
707
892
|
end
|
708
893
|
|
894
|
+
let(:policyfile_default_attrs) do
|
895
|
+
{
|
896
|
+
"foo" => "bar",
|
897
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
898
|
+
"baz" => {
|
899
|
+
"more_nested_stuff" => "yup",
|
900
|
+
"an_array" => ["a", "b", "c"]
|
901
|
+
}
|
902
|
+
}
|
903
|
+
end
|
904
|
+
|
905
|
+
let(:canonicalized_default_attrs) do
|
906
|
+
elements = [
|
907
|
+
%q{"abc":{"def":{"ghi":"xyz"}}},
|
908
|
+
%q{"baz":{"an_array":["a","b","c"],"more_nested_stuff":"yup"}},
|
909
|
+
%q{"foo":"bar"}
|
910
|
+
]
|
911
|
+
"{" + elements.join(',') + "}"
|
912
|
+
end
|
913
|
+
|
914
|
+
let(:policyfile_override_attrs) do
|
915
|
+
{
|
916
|
+
"foo" => "bar",
|
917
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
918
|
+
"baz" => {
|
919
|
+
"more_nested_stuff" => "yup",
|
920
|
+
"an_array" => ["a", "b", "c"]
|
921
|
+
}
|
922
|
+
}
|
923
|
+
end
|
924
|
+
|
925
|
+
let(:canonicalized_override_attrs) { canonicalized_default_attrs }
|
926
|
+
|
709
927
|
let(:policyfile_compiler) do
|
710
928
|
double( "ChefDK::PolicyfileCompiler",
|
711
929
|
name: "my-policyfile",
|
712
930
|
normalized_run_list: %w[recipe[foo::default] recipe[bar::default]],
|
713
931
|
normalized_named_run_lists: { "rl2" => %w[recipe[bar::default]] },
|
714
932
|
all_cookbook_location_specs: {"foo" => cached_location_spec, "bar" => local_location_spec},
|
715
|
-
solution_dependencies: policyfile_solution_dependencies
|
933
|
+
solution_dependencies: policyfile_solution_dependencies,
|
934
|
+
default_attributes: policyfile_default_attrs,
|
935
|
+
override_attributes: policyfile_override_attrs )
|
716
936
|
end
|
717
937
|
|
718
938
|
let(:policyfile_lock) do
|
@@ -728,11 +948,13 @@ run-list-item:recipe[bar::default]
|
|
728
948
|
named-run-list:rl2;run-list-item:recipe[bar::default]
|
729
949
|
cookbook:foo;id:#{cookbook_foo_cksum}
|
730
950
|
cookbook:bar;id:#{cookbook_bar_cksum}
|
951
|
+
default_attributes:#{canonicalized_default_attrs}
|
952
|
+
override_attributes:#{canonicalized_override_attrs}
|
731
953
|
REVISION_STRING
|
732
954
|
end
|
733
955
|
|
734
956
|
let(:expected_revision_id) do
|
735
|
-
Digest::
|
957
|
+
Digest::SHA256.new.hexdigest(expected_canonical_revision_string)
|
736
958
|
end
|
737
959
|
|
738
960
|
let(:compiled_policyfile) do
|
@@ -776,6 +998,23 @@ REVISION_STRING
|
|
776
998
|
}
|
777
999
|
},
|
778
1000
|
|
1001
|
+
"default_attributes" => {
|
1002
|
+
"foo" => "bar",
|
1003
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
1004
|
+
"baz" => {
|
1005
|
+
"more_nested_stuff" => "yup",
|
1006
|
+
"an_array" => ["a", "b", "c"]
|
1007
|
+
}
|
1008
|
+
},
|
1009
|
+
|
1010
|
+
"override_attributes" => {
|
1011
|
+
"foo" => "bar",
|
1012
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
1013
|
+
"baz" => {
|
1014
|
+
"more_nested_stuff" => "yup",
|
1015
|
+
"an_array" => ["a", "b", "c"]
|
1016
|
+
}
|
1017
|
+
},
|
779
1018
|
"solution_dependencies" => {
|
780
1019
|
"Policyfile" => [ [ "foo", "~> 1.0" ] ],
|
781
1020
|
"dependencies" => { "foo (1.0.0)" => [], "bar (0.1.0)" => [] }
|