hiera 1.3.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +1 -1
- data/README.md +47 -10
- data/bin/hiera +48 -27
- data/lib/hiera/backend/json_backend.rb +9 -7
- data/lib/hiera/backend/yaml_backend.rb +17 -14
- data/lib/hiera/backend.rb +163 -44
- data/lib/hiera/config.rb +1 -3
- data/lib/hiera/interpolate.rb +64 -14
- data/lib/hiera/util.rb +5 -5
- data/lib/hiera/version.rb +1 -1
- data/lib/hiera.rb +55 -3
- data/spec/spec_helper.rb +23 -0
- data/spec/unit/backend/json_backend_spec.rb +9 -9
- data/spec/unit/backend/yaml_backend_spec.rb +62 -73
- data/spec/unit/backend_spec.rb +192 -32
- data/spec/unit/config_spec.rb +17 -2
- data/spec/unit/fixtures/interpolate/config/hiera.yaml +6 -0
- data/spec/unit/fixtures/interpolate/data/niltest.yaml +2 -0
- data/spec/unit/fixtures/interpolate/data/recursive.yaml +3 -0
- data/spec/unit/fixtures/override/config/hiera.yaml +5 -0
- data/spec/unit/fixtures/override/data/alternate.yaml +1 -0
- data/spec/unit/fixtures/override/data/common.yaml +2 -0
- data/spec/unit/interpolate_spec.rb +36 -0
- data/spec/unit/util_spec.rb +4 -4
- metadata +51 -41
data/spec/unit/backend_spec.rb
CHANGED
@@ -2,6 +2,14 @@ require 'spec_helper'
|
|
2
2
|
require 'hiera/util'
|
3
3
|
|
4
4
|
class Hiera
|
5
|
+
module Backend
|
6
|
+
class Backend1x_backend
|
7
|
+
def lookup(key, scope, order_override, resolution_type)
|
8
|
+
["a", "b"]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
5
13
|
describe Backend do
|
6
14
|
describe "#datadir" do
|
7
15
|
it "interpolates any values in the configured value" do
|
@@ -84,7 +92,7 @@ class Hiera
|
|
84
92
|
end
|
85
93
|
|
86
94
|
it "parses the names of the hierarchy levels using the given scope" do
|
87
|
-
Backend.expects(:parse_string).with("common", {:rspec => :tests})
|
95
|
+
Backend.expects(:parse_string).with("common", {:rspec => :tests}, {}, {:order_override => nil})
|
88
96
|
Backend.datasources({:rspec => :tests}) { }
|
89
97
|
end
|
90
98
|
|
@@ -181,17 +189,6 @@ class Hiera
|
|
181
189
|
"test_%{scope('rspec')}_test" => "test__test"
|
182
190
|
}
|
183
191
|
|
184
|
-
@interprets_undefined_in_scope_tests.each do |input, expected|
|
185
|
-
it "interprets :undefined in scope as a non-value" do
|
186
|
-
Backend.parse_string(input, {"rspec" => :undefined}).should == expected
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
it "uses the value from extra_data when scope is :undefined" do
|
191
|
-
input = "test_%{rspec}_test"
|
192
|
-
Backend.parse_string(input, {"rspec" => :undefined}, { "rspec" => "extra" }).should == "test_extra_test"
|
193
|
-
end
|
194
|
-
|
195
192
|
@exact_lookup_tests = {
|
196
193
|
"test_%{::rspec::data}_test" => "test_value_test",
|
197
194
|
"test_%{scope('::rspec::data')}_test" => "test_value_test"
|
@@ -253,15 +250,32 @@ class Hiera
|
|
253
250
|
end.to raise_error Hiera::InterpolationLoop, "Detected in [first, second]"
|
254
251
|
end
|
255
252
|
|
253
|
+
it "replaces repeated occurances of the same lookup" do
|
254
|
+
scope = {"rspec" => "value"}
|
255
|
+
input = "it replaces %{rspec} and %{rspec}"
|
256
|
+
Backend.parse_string(input, scope).should == "it replaces value and value"
|
257
|
+
end
|
258
|
+
|
256
259
|
it "replaces hiera interpolations with data looked up in hiera" do
|
257
260
|
input = "%{hiera('key1')}"
|
258
261
|
scope = {}
|
259
262
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
260
263
|
Config.load_backends
|
261
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("key1", scope, nil, :priority).returns("answer")
|
264
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("key1", scope, nil, :priority, instance_of(Hash)).returns("answer")
|
262
265
|
|
263
266
|
Backend.parse_string(input, scope).should == "answer"
|
264
267
|
end
|
268
|
+
|
269
|
+
it "interpolation passes the order_override back into the backend" do
|
270
|
+
Backend.expects(:lookup).with("lookup::key", nil, {}, "order_override_datasource", :priority, instance_of(Hash))
|
271
|
+
Backend.parse_string("%{hiera('lookup::key')}", {}, {}, {:order_override => "order_override_datasource"})
|
272
|
+
end
|
273
|
+
|
274
|
+
it "replaces literal interpolations with their argument" do
|
275
|
+
scope = {}
|
276
|
+
input = "%{literal('%')}{rspec::data}"
|
277
|
+
Backend.parse_string(input, scope).should == "%{rspec::data}"
|
278
|
+
end
|
265
279
|
end
|
266
280
|
|
267
281
|
describe "#parse_answer" do
|
@@ -300,16 +314,47 @@ class Hiera
|
|
300
314
|
scope = {}
|
301
315
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
302
316
|
Config.load_backends
|
303
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("test")
|
317
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("test")
|
304
318
|
Backend.parse_answer(input, scope).should == "test_test_test"
|
305
319
|
end
|
306
320
|
|
321
|
+
it "interpolates alias lookups with non-string types" do
|
322
|
+
input = "%{alias('rspec')}"
|
323
|
+
scope = {}
|
324
|
+
Config.load({:yaml => {:datadir => "/tmp"}})
|
325
|
+
Config.load_backends
|
326
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns(['test', 'test'])
|
327
|
+
Backend.parse_answer(input, scope).should == ['test', 'test']
|
328
|
+
end
|
329
|
+
|
330
|
+
it 'fails if alias interpolation is attempted in a string context with a prefix' do
|
331
|
+
input = "stuff_before%{alias('rspec')}"
|
332
|
+
scope = {}
|
333
|
+
Config.load({:yaml => {:datadir => "/tmp"}})
|
334
|
+
Config.load_backends
|
335
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns(['test', 'test'])
|
336
|
+
expect do
|
337
|
+
Backend.parse_answer(input, scope).should == ['test', 'test']
|
338
|
+
end.to raise_error(Hiera::InterpolationInvalidValue, 'Cannot call alias in the string context')
|
339
|
+
end
|
340
|
+
|
341
|
+
it 'fails if alias interpolation is attempted in a string context with a postfix' do
|
342
|
+
input = "%{alias('rspec')}_stiff after"
|
343
|
+
scope = {}
|
344
|
+
Config.load({:yaml => {:datadir => "/tmp"}})
|
345
|
+
Config.load_backends
|
346
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns(['test', 'test'])
|
347
|
+
expect do
|
348
|
+
Backend.parse_answer(input, scope).should == ['test', 'test']
|
349
|
+
end.to raise_error(Hiera::InterpolationInvalidValue, 'Cannot call alias in the string context')
|
350
|
+
end
|
351
|
+
|
307
352
|
it "interpolates hiera lookups in each string in an array" do
|
308
353
|
input = ["test_%{hiera('rspec')}_test", "test_%{hiera('rspec')}_test", ["test_%{hiera('rspec')}_test"]]
|
309
354
|
scope = {}
|
310
355
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
311
356
|
Config.load_backends
|
312
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("test")
|
357
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("test")
|
313
358
|
Backend.parse_answer(input, scope).should == ["test_test_test", "test_test_test", ["test_test_test"]]
|
314
359
|
end
|
315
360
|
|
@@ -318,7 +363,7 @@ class Hiera
|
|
318
363
|
scope = {}
|
319
364
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
320
365
|
Config.load_backends
|
321
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("test")
|
366
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("test")
|
322
367
|
Backend.parse_answer(input, scope).should == {"foo"=>"test_test_test", "bar"=>"test_test_test"}
|
323
368
|
end
|
324
369
|
|
@@ -327,7 +372,7 @@ class Hiera
|
|
327
372
|
scope = {}
|
328
373
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
329
374
|
Config.load_backends
|
330
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("foo")
|
375
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("foo")
|
331
376
|
Backend.parse_answer(input, scope).should == {"foo"=>"test"}
|
332
377
|
end
|
333
378
|
|
@@ -336,7 +381,7 @@ class Hiera
|
|
336
381
|
scope = {}
|
337
382
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
338
383
|
Config.load_backends
|
339
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("foo")
|
384
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("foo")
|
340
385
|
Backend.parse_answer(input, scope).should == {"topkey"=>{"foo" => "test"}}
|
341
386
|
end
|
342
387
|
|
@@ -345,7 +390,7 @@ class Hiera
|
|
345
390
|
scope = {}
|
346
391
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
347
392
|
Config.load_backends
|
348
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("test")
|
393
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("test")
|
349
394
|
Backend.parse_answer(input, scope).should == {"foo"=>"test_test_test", "bar"=>["test_test_test", "test_test_test"]}
|
350
395
|
end
|
351
396
|
|
@@ -354,7 +399,7 @@ class Hiera
|
|
354
399
|
scope = {"rspec2" => "scope_rspec"}
|
355
400
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
356
401
|
Config.load_backends
|
357
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("hiera_rspec")
|
402
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("hiera_rspec")
|
358
403
|
Backend.parse_answer(input, scope).should == {"foo"=>"test_hiera_rspec_test", "bar"=>"test_scope_rspec_test"}
|
359
404
|
end
|
360
405
|
|
@@ -363,7 +408,7 @@ class Hiera
|
|
363
408
|
scope = {"rspec" => "scope_rspec"}
|
364
409
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
365
410
|
Config.load_backends
|
366
|
-
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority).returns("hiera_rspec")
|
411
|
+
Backend::Yaml_backend.any_instance.stubs(:lookup).with("rspec", scope, nil, :priority, instance_of(Hash)).returns("hiera_rspec")
|
367
412
|
Backend.parse_answer(input, scope).should == "test_hiera_rspec_test_scope_rspec"
|
368
413
|
end
|
369
414
|
|
@@ -425,7 +470,7 @@ class Hiera
|
|
425
470
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
426
471
|
Config.load_backends
|
427
472
|
|
428
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, nil).returns("answer")
|
473
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, nil, instance_of(Hash)).returns("answer")
|
429
474
|
|
430
475
|
Backend.lookup("key", "default", {}, nil, nil).should == "answer"
|
431
476
|
end
|
@@ -434,9 +479,9 @@ class Hiera
|
|
434
479
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
435
480
|
Config.load_backends
|
436
481
|
|
437
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("stringval", {}, nil, nil).returns("string")
|
438
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("boolval", {}, nil, nil).returns(false)
|
439
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("numericval", {}, nil, nil).returns(1)
|
482
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("stringval", {}, nil, nil, instance_of(Hash)).returns("string")
|
483
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("boolval", {}, nil, nil, instance_of(Hash)).returns(false)
|
484
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("numericval", {}, nil, nil, instance_of(Hash)).returns(1)
|
440
485
|
|
441
486
|
Backend.lookup("stringval", "default", {}, nil, nil).should == "string"
|
442
487
|
Backend.lookup("boolval", "default", {}, nil, nil).should == false
|
@@ -518,7 +563,7 @@ class Hiera
|
|
518
563
|
Config.load_backends
|
519
564
|
|
520
565
|
Backend.expects(:resolve_answer).with("test_test", :priority).returns("parsed")
|
521
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {"rspec" => "test"}, nil, :priority).returns("test_test")
|
566
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {"rspec" => "test"}, nil, :priority, instance_of(Hash)).returns("test_test")
|
522
567
|
|
523
568
|
Backend.lookup("key", "test_%{rspec}", {"rspec" => "test"}, nil, :priority).should == "parsed"
|
524
569
|
end
|
@@ -527,31 +572,129 @@ class Hiera
|
|
527
572
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
528
573
|
Config.load_backends
|
529
574
|
|
530
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {"rspec" => "test"}, nil, nil)
|
575
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {"rspec" => "test"}, nil, nil, instance_of(Hash)).throws(:no_such_key)
|
531
576
|
|
532
577
|
Backend.lookup("key", "test_%{rspec}", {"rspec" => "test"}, nil, nil).should == "test_test"
|
533
578
|
end
|
534
579
|
|
580
|
+
it "returns nil instead of the default when key is found with a nil value" do
|
581
|
+
Config.load({:yaml => {:datadir => "/tmp"}})
|
582
|
+
Config.load_backends
|
583
|
+
|
584
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {"rspec" => "test"}, nil, nil, instance_of(Hash)).returns(nil)
|
585
|
+
|
586
|
+
Backend.lookup("key", "test_%{rspec}", {"rspec" => "test"}, nil, nil).should == nil
|
587
|
+
end
|
588
|
+
|
535
589
|
it "keeps string default data as a string" do
|
536
590
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
537
591
|
Config.load_backends
|
538
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, nil)
|
592
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, nil, instance_of(Hash)).throws(:no_such_key)
|
539
593
|
Backend.lookup("key", "test", {}, nil, nil).should == "test"
|
540
594
|
end
|
541
595
|
|
542
596
|
it "keeps array default data as an array" do
|
543
597
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
544
598
|
Config.load_backends
|
545
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, :array)
|
599
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, :array, instance_of(Hash)).throws(:no_such_key)
|
546
600
|
Backend.lookup("key", ["test"], {}, nil, :array).should == ["test"]
|
547
601
|
end
|
548
602
|
|
549
603
|
it "keeps hash default data as a hash" do
|
550
604
|
Config.load({:yaml => {:datadir => "/tmp"}})
|
551
605
|
Config.load_backends
|
552
|
-
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, :hash)
|
606
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with("key", {}, nil, :hash, instance_of(Hash)).throws(:no_such_key)
|
553
607
|
Backend.lookup("key", {"test" => "value"}, {}, nil, :hash).should == {"test" => "value"}
|
554
608
|
end
|
609
|
+
|
610
|
+
it 'can use qualified key to lookup value in hash' do
|
611
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
612
|
+
Config.load_backends
|
613
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', {}, nil, nil, instance_of(Hash)).returns({ 'test' => 'value'})
|
614
|
+
Backend.lookup('key.test', 'dflt', {}, nil, nil).should == 'value'
|
615
|
+
end
|
616
|
+
|
617
|
+
it 'can use qualified key to lookup value in array' do
|
618
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
619
|
+
Config.load_backends
|
620
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', {}, nil, nil, instance_of(Hash)).returns([ 'first', 'second'])
|
621
|
+
Backend.lookup('key.1', 'dflt', {}, nil, nil).should == 'second'
|
622
|
+
end
|
623
|
+
|
624
|
+
it 'will fail when qualified key is partially found but not expected hash' do
|
625
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
626
|
+
Config.load_backends
|
627
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', {}, nil, nil, instance_of(Hash)).returns(['value 1', 'value 2'])
|
628
|
+
expect do
|
629
|
+
Backend.lookup('key.test', 'dflt', {}, nil, nil)
|
630
|
+
end.to raise_error(Exception, /^Hiera type mismatch:/)
|
631
|
+
end
|
632
|
+
|
633
|
+
it 'will fail when qualified key used with resolution_type :hash' do
|
634
|
+
expect do
|
635
|
+
Backend.lookup('key.test', 'dflt', {}, nil, :hash)
|
636
|
+
end.to raise_error(ArgumentError, /^Resolution type :hash is illegal/)
|
637
|
+
end
|
638
|
+
|
639
|
+
it 'will fail when qualified key used with resolution_type :array' do
|
640
|
+
expect do
|
641
|
+
Backend.lookup('key.test', 'dflt', {}, nil, :array)
|
642
|
+
end.to raise_error(ArgumentError, /^Resolution type :array is illegal/)
|
643
|
+
end
|
644
|
+
|
645
|
+
it 'will succeed when qualified key used with resolution_type :priority' do
|
646
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
647
|
+
Config.load_backends
|
648
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', {}, nil, :priority, instance_of(Hash)).returns({ 'test' => 'value'})
|
649
|
+
Backend.lookup('key.test', 'dflt', {}, nil, :priority).should == 'value'
|
650
|
+
end
|
651
|
+
|
652
|
+
it 'will fail when qualified key is partially found but not expected array' do
|
653
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
654
|
+
Config.load_backends
|
655
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', {}, nil, nil, instance_of(Hash)).returns({ 'test' => 'value'})
|
656
|
+
expect do
|
657
|
+
Backend.lookup('key.2', 'dflt', {}, nil, nil)
|
658
|
+
end.to raise_error(Exception, /^Hiera type mismatch:/)
|
659
|
+
end
|
660
|
+
|
661
|
+
it 'will not fail when qualified key is partially not found' do
|
662
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
663
|
+
Config.load_backends
|
664
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', {}, nil, nil, instance_of(Hash)).returns(nil)
|
665
|
+
Backend.lookup('key.test', 'dflt', {}, nil, nil).should == 'dflt'
|
666
|
+
end
|
667
|
+
|
668
|
+
it 'will not fail when qualified key is array index out of bounds' do
|
669
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
670
|
+
Config.load_backends
|
671
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', {}, nil, nil, instance_of(Hash)).returns(['value 1', 'value 2'])
|
672
|
+
Backend.lookup('key.33', 'dflt', {}, nil, nil).should == 'dflt'
|
673
|
+
end
|
674
|
+
|
675
|
+
it 'can use qualified key in interpolation to lookup value in hash' do
|
676
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
677
|
+
Config.load_backends
|
678
|
+
Hiera::Backend.stubs(:datasourcefiles).yields('foo', 'bar')
|
679
|
+
Hiera::Filecache.any_instance.expects(:read_file).at_most(2).returns({'key' => '%{hiera(\'some.subkey\')}', 'some' => { 'subkey' => 'value' }})
|
680
|
+
Backend.lookup('key', 'dflt', {}, nil, nil).should == 'value'
|
681
|
+
end
|
682
|
+
|
683
|
+
it 'can use qualified key in interpolated default and scope' do
|
684
|
+
Config.load({:yaml => {:datadir => '/tmp'}})
|
685
|
+
Config.load_backends
|
686
|
+
scope = { 'some' => { 'test' => 'value'}}
|
687
|
+
Backend::Yaml_backend.any_instance.expects(:lookup).with('key', scope, nil, nil, instance_of(Hash))
|
688
|
+
Backend.lookup('key.notfound', '%{some.test}', scope, nil, nil).should == 'value'
|
689
|
+
end
|
690
|
+
|
691
|
+
it "handles older backend with 4 argument lookup" do
|
692
|
+
Config.load({})
|
693
|
+
Config.instance_variable_set("@config", {:backends => ["Backend1x"]})
|
694
|
+
|
695
|
+
Hiera.expects(:debug).at_least_once.with(regexp_matches /Using Hiera 1.x backend/)
|
696
|
+
Backend.lookup("key", {}, {"rspec" => "test"}, nil, :priority).should == ["a", "b"]
|
697
|
+
end
|
555
698
|
end
|
556
699
|
|
557
700
|
describe '#merge_answer' do
|
@@ -569,13 +712,30 @@ class Hiera
|
|
569
712
|
|
570
713
|
it "uses deep_merge! when configured with :merge_behavior => :deeper" do
|
571
714
|
Config.load({:merge_behavior => :deeper})
|
572
|
-
Hash.any_instance.expects('deep_merge!').with({"b" => "bnswer"}).returns({"a" => "answer", "b" => "bnswer"})
|
715
|
+
Hash.any_instance.expects('deep_merge!').with({"b" => "bnswer"}, {}).returns({"a" => "answer", "b" => "bnswer"})
|
573
716
|
Backend.merge_answer({"a" => "answer"},{"b" => "bnswer"}).should == {"a" => "answer", "b" => "bnswer"}
|
574
717
|
end
|
575
718
|
|
576
719
|
it "uses deep_merge when configured with :merge_behavior => :deep" do
|
577
720
|
Config.load({:merge_behavior => :deep})
|
578
|
-
Hash.any_instance.expects('deep_merge').with({"b" => "bnswer"}).returns({"a" => "answer", "b" => "bnswer"})
|
721
|
+
Hash.any_instance.expects('deep_merge').with({"b" => "bnswer"}, {}).returns({"a" => "answer", "b" => "bnswer"})
|
722
|
+
Backend.merge_answer({"a" => "answer"},{"b" => "bnswer"}).should == {"a" => "answer", "b" => "bnswer"}
|
723
|
+
end
|
724
|
+
|
725
|
+
it "disregards configuration when 'merge' parameter is given as a Hash" do
|
726
|
+
Config.load({:merge_behavior => :deep})
|
727
|
+
Hash.any_instance.expects('deep_merge!').with({"b" => "bnswer"}, {}).returns({"a" => "answer", "b" => "bnswer"})
|
728
|
+
Backend.merge_answer({"a" => "answer"},{"b" => "bnswer"}, {:behavior => 'deeper' }).should == {"a" => "answer", "b" => "bnswer"}
|
729
|
+
end
|
730
|
+
|
731
|
+
it "propagates deep merge options when given Hash 'merge' parameter" do
|
732
|
+
Hash.any_instance.expects('deep_merge!').with({"b" => "bnswer"}, { :knockout_prefix => '-' }).returns({"a" => "answer", "b" => "bnswer"})
|
733
|
+
Backend.merge_answer({"a" => "answer"},{"b" => "bnswer"}, {:behavior => 'deeper', :knockout_prefix => '-'}).should == {"a" => "answer", "b" => "bnswer"}
|
734
|
+
end
|
735
|
+
|
736
|
+
it "passes Config[:deep_merge_options] into calls to deep_merge" do
|
737
|
+
Config.load({:merge_behavior => :deep, :deep_merge_options => { :knockout_prefix => '-' } })
|
738
|
+
Hash.any_instance.expects('deep_merge').with({"b" => "bnswer"}, {:knockout_prefix => '-'}).returns({"a" => "answer", "b" => "bnswer"})
|
579
739
|
Backend.merge_answer({"a" => "answer"},{"b" => "bnswer"}).should == {"a" => "answer", "b" => "bnswer"}
|
580
740
|
end
|
581
741
|
end
|
data/spec/unit/config_spec.rb
CHANGED
@@ -61,7 +61,7 @@ class Hiera
|
|
61
61
|
Config.load({})
|
62
62
|
end
|
63
63
|
|
64
|
-
context "loading '/dev/null' as spec tests do" do
|
64
|
+
context "loading '/dev/null' as spec tests do", :unless => Hiera::Util.microsoft_windows? do
|
65
65
|
before :each do
|
66
66
|
# Simulate the behavior of YAML.load_file('/dev/null') in MRI 1.9.3p194
|
67
67
|
Config.stubs(:yaml_load_file).
|
@@ -69,7 +69,22 @@ class Hiera
|
|
69
69
|
end
|
70
70
|
|
71
71
|
it "is not exceptional behavior" do
|
72
|
-
|
72
|
+
Config.load('/dev/null')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "if deep_merge can't be loaded" do
|
77
|
+
let(:error_message) { "Must have 'deep_merge' gem installed for the configured merge_behavior." }
|
78
|
+
before(:each) do
|
79
|
+
Config.expects(:require).with("deep_merge").raises(LoadError, "unable to load")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should error if merge_behavior is 'deep'" do
|
83
|
+
expect { Config.load(:merge_behavior => :deep) }.to raise_error(Hiera::Error, error_message)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should error if merge_behavior is 'deeper'" do
|
87
|
+
expect { Config.load(:merge_behavior => :deeper) }.to raise_error(Hiera::Error, error_message)
|
73
88
|
end
|
74
89
|
end
|
75
90
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
bar: 'alternate'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'hiera/util'
|
3
|
+
|
4
|
+
describe "Hiera" do
|
5
|
+
context "when doing interpolation" do
|
6
|
+
let(:fixtures) { File.join(HieraSpec::FIXTURE_DIR, 'interpolate') }
|
7
|
+
|
8
|
+
it 'should prevent endless recursion' do
|
9
|
+
Hiera::Util.expects(:var_dir).at_least_once.returns(File.join(fixtures, 'data'))
|
10
|
+
hiera = Hiera.new(:config => File.join(fixtures, 'config', 'hiera.yaml'))
|
11
|
+
expect do
|
12
|
+
hiera.lookup('foo', nil, {})
|
13
|
+
end.to raise_error Hiera::InterpolationLoop, 'Detected in [hiera("bar"), hiera("foo")]'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when not finding value for interpolated key" do
|
18
|
+
let(:fixtures) { File.join(HieraSpec::FIXTURE_DIR, 'interpolate') }
|
19
|
+
|
20
|
+
it 'should resolve the interpolation to an empty string' do
|
21
|
+
Hiera::Util.expects(:var_dir).at_least_once.returns(File.join(fixtures, 'data'))
|
22
|
+
hiera = Hiera.new(:config => File.join(fixtures, 'config', 'hiera.yaml'))
|
23
|
+
expect(hiera.lookup('niltest', nil, {})).to eq('Missing key ##. Key with nil ##')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "when doing interpolation with override" do
|
28
|
+
let(:fixtures) { File.join(HieraSpec::FIXTURE_DIR, 'override') }
|
29
|
+
|
30
|
+
it 'should resolve interpolation using the override' do
|
31
|
+
Hiera::Util.expects(:var_dir).at_least_once.returns(File.join(fixtures, 'data'))
|
32
|
+
hiera = Hiera.new(:config => File.join(fixtures, 'config', 'hiera.yaml'))
|
33
|
+
expect(hiera.lookup('foo', nil, {}, 'alternate')).to eq('alternate')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/unit/util_spec.rb
CHANGED
@@ -23,26 +23,26 @@ describe Hiera::Util do
|
|
23
23
|
describe 'Hiera::Util.config_dir' do
|
24
24
|
it 'should return the correct path for posix systems' do
|
25
25
|
Hiera::Util.expects(:file_alt_separator).returns(nil)
|
26
|
-
Hiera::Util.config_dir.should == '/etc'
|
26
|
+
Hiera::Util.config_dir.should == '/etc/puppetlabs/code'
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'should return the correct path for microsoft windows systems' do
|
30
30
|
Hiera::Util.expects(:microsoft_windows?).returns(true)
|
31
31
|
Hiera::Util.expects(:common_appdata).returns('C:\\ProgramData')
|
32
|
-
Hiera::Util.config_dir.should == 'C:\\ProgramData/PuppetLabs/
|
32
|
+
Hiera::Util.config_dir.should == 'C:\\ProgramData/PuppetLabs/code'
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
describe 'Hiera::Util.var_dir' do
|
37
37
|
it 'should return the correct path for posix systems' do
|
38
38
|
Hiera::Util.expects(:file_alt_separator).returns(nil)
|
39
|
-
Hiera::Util.var_dir.should == '/
|
39
|
+
Hiera::Util.var_dir.should == '/etc/puppetlabs/code/hieradata'
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'should return the correct path for microsoft windows systems' do
|
43
43
|
Hiera::Util.expects(:microsoft_windows?).returns(true)
|
44
44
|
Hiera::Util.expects(:common_appdata).returns('C:\\ProgramData')
|
45
|
-
Hiera::Util.var_dir.should == 'C:\\ProgramData/PuppetLabs/
|
45
|
+
Hiera::Util.var_dir.should == 'C:\\ProgramData/PuppetLabs/code/hieradata'
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
metadata
CHANGED
@@ -1,30 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hiera
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Puppet Labs
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-03-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: json_pure
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
description: A pluggable data store for hierarcical data
|
@@ -35,70 +32,83 @@ extensions: []
|
|
35
32
|
extra_rdoc_files: []
|
36
33
|
files:
|
37
34
|
- bin/hiera
|
38
|
-
- lib/hiera/
|
35
|
+
- lib/hiera/backend.rb
|
36
|
+
- lib/hiera/backend/json_backend.rb
|
37
|
+
- lib/hiera/backend/yaml_backend.rb
|
38
|
+
- lib/hiera/config.rb
|
39
39
|
- lib/hiera/console_logger.rb
|
40
|
-
- lib/hiera/filecache.rb
|
41
|
-
- lib/hiera/version.rb
|
42
|
-
- lib/hiera/fallback_logger.rb
|
43
40
|
- lib/hiera/error.rb
|
41
|
+
- lib/hiera/fallback_logger.rb
|
42
|
+
- lib/hiera/filecache.rb
|
44
43
|
- lib/hiera/interpolate.rb
|
45
|
-
- lib/hiera/util.rb
|
46
|
-
- lib/hiera/recursive_guard.rb
|
47
|
-
- lib/hiera/backend.rb
|
48
44
|
- lib/hiera/noop_logger.rb
|
49
|
-
- lib/hiera/
|
50
|
-
- lib/hiera/
|
51
|
-
- lib/hiera/
|
45
|
+
- lib/hiera/puppet_logger.rb
|
46
|
+
- lib/hiera/recursive_guard.rb
|
47
|
+
- lib/hiera/util.rb
|
48
|
+
- lib/hiera/version.rb
|
52
49
|
- lib/hiera.rb
|
53
50
|
- COPYING
|
54
51
|
- README.md
|
55
52
|
- LICENSE
|
56
|
-
- spec/
|
57
|
-
- spec/unit/
|
58
|
-
- spec/unit/
|
59
|
-
- spec/unit/config_spec.rb
|
53
|
+
- spec/spec_helper.rb
|
54
|
+
- spec/unit/backend/json_backend_spec.rb
|
55
|
+
- spec/unit/backend/yaml_backend_spec.rb
|
60
56
|
- spec/unit/backend_spec.rb
|
61
|
-
- spec/unit/
|
62
|
-
- spec/unit/hiera_spec.rb
|
57
|
+
- spec/unit/config_spec.rb
|
63
58
|
- spec/unit/console_logger_spec.rb
|
64
|
-
- spec/unit/backend/yaml_backend_spec.rb
|
65
|
-
- spec/unit/backend/json_backend_spec.rb
|
66
59
|
- spec/unit/fallback_logger_spec.rb
|
67
|
-
- spec/
|
60
|
+
- spec/unit/filecache_spec.rb
|
61
|
+
- spec/unit/fixtures/interpolate/config/hiera.yaml
|
62
|
+
- spec/unit/fixtures/interpolate/data/niltest.yaml
|
63
|
+
- spec/unit/fixtures/interpolate/data/recursive.yaml
|
64
|
+
- spec/unit/fixtures/override/config/hiera.yaml
|
65
|
+
- spec/unit/fixtures/override/data/alternate.yaml
|
66
|
+
- spec/unit/fixtures/override/data/common.yaml
|
67
|
+
- spec/unit/hiera_spec.rb
|
68
|
+
- spec/unit/interpolate_spec.rb
|
69
|
+
- spec/unit/puppet_logger_spec.rb
|
70
|
+
- spec/unit/util_spec.rb
|
71
|
+
- spec/unit/version_spec.rb
|
68
72
|
homepage: https://github.com/puppetlabs/hiera
|
69
73
|
licenses: []
|
74
|
+
metadata: {}
|
70
75
|
post_install_message:
|
71
76
|
rdoc_options: []
|
72
77
|
require_paths:
|
73
78
|
- lib
|
74
79
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
80
|
requirements:
|
77
|
-
- -
|
81
|
+
- - '>='
|
78
82
|
- !ruby/object:Gem::Version
|
79
83
|
version: '0'
|
80
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
85
|
requirements:
|
83
|
-
- -
|
86
|
+
- - '>='
|
84
87
|
- !ruby/object:Gem::Version
|
85
88
|
version: '0'
|
86
89
|
requirements: []
|
87
90
|
rubyforge_project:
|
88
|
-
rubygems_version:
|
91
|
+
rubygems_version: 2.0.14
|
89
92
|
signing_key:
|
90
|
-
specification_version:
|
93
|
+
specification_version: 4
|
91
94
|
summary: Light weight hierarchical data store
|
92
95
|
test_files:
|
93
|
-
- spec/
|
94
|
-
- spec/unit/
|
95
|
-
- spec/unit/
|
96
|
-
- spec/unit/config_spec.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
- spec/unit/backend/json_backend_spec.rb
|
98
|
+
- spec/unit/backend/yaml_backend_spec.rb
|
97
99
|
- spec/unit/backend_spec.rb
|
98
|
-
- spec/unit/
|
99
|
-
- spec/unit/hiera_spec.rb
|
100
|
+
- spec/unit/config_spec.rb
|
100
101
|
- spec/unit/console_logger_spec.rb
|
101
|
-
- spec/unit/backend/yaml_backend_spec.rb
|
102
|
-
- spec/unit/backend/json_backend_spec.rb
|
103
102
|
- spec/unit/fallback_logger_spec.rb
|
104
|
-
- spec/
|
103
|
+
- spec/unit/filecache_spec.rb
|
104
|
+
- spec/unit/fixtures/interpolate/config/hiera.yaml
|
105
|
+
- spec/unit/fixtures/interpolate/data/niltest.yaml
|
106
|
+
- spec/unit/fixtures/interpolate/data/recursive.yaml
|
107
|
+
- spec/unit/fixtures/override/config/hiera.yaml
|
108
|
+
- spec/unit/fixtures/override/data/alternate.yaml
|
109
|
+
- spec/unit/fixtures/override/data/common.yaml
|
110
|
+
- spec/unit/hiera_spec.rb
|
111
|
+
- spec/unit/interpolate_spec.rb
|
112
|
+
- spec/unit/puppet_logger_spec.rb
|
113
|
+
- spec/unit/util_spec.rb
|
114
|
+
- spec/unit/version_spec.rb
|