chef-dk 0.5.0.rc.1 → 0.5.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 +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)" => [] }
|