Add the default value to the "loadyaml" function
This value will be returned if the is no file to load or a file could not be parsed. It's similar to the "parseyaml" function's default value. Add the "loadjson" function too
This commit is contained in:
parent
b63849c786
commit
870a272cee
7 changed files with 214 additions and 18 deletions
|
@ -660,12 +660,42 @@ Returns the keys of a hash as an array. *Type*: rvalue.
|
||||||
|
|
||||||
#### `loadyaml`
|
#### `loadyaml`
|
||||||
|
|
||||||
Loads a YAML file containing an array, string, or hash, and returns the data in the corresponding native data type. For example:
|
Loads a YAML file containing an array, string, or hash, and returns the data in the corresponding native data type.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
$myhash = loadyaml('/etc/puppet/data/myhash.yaml')
|
$myhash = loadyaml('/etc/puppet/data/myhash.yaml')
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
|
The second parameter will be returned if the file was not found or could not be parsed.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
~~~
|
||||||
|
$myhash = loadyaml('no-file.yaml', {'default'=>'value'})
|
||||||
|
~~~
|
||||||
|
|
||||||
|
*Type*: rvalue.
|
||||||
|
|
||||||
|
#### `loadjson`
|
||||||
|
|
||||||
|
Loads a JSON file containing an array, string, or hash, and returns the data in the corresponding native data type.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
~~~
|
||||||
|
$myhash = loadjson('/etc/puppet/data/myhash.json')
|
||||||
|
~~~
|
||||||
|
|
||||||
|
The second parameter will be returned if the file was not found or could not be parsed.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
~~~
|
||||||
|
$myhash = loadjson('no-file.json', {'default'=>'value'})
|
||||||
|
~~~
|
||||||
|
|
||||||
*Type*: rvalue.
|
*Type*: rvalue.
|
||||||
|
|
||||||
#### `load_module_metadata`
|
#### `load_module_metadata`
|
||||||
|
|
34
lib/puppet/parser/functions/loadjson.rb
Normal file
34
lib/puppet/parser/functions/loadjson.rb
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
module Puppet::Parser::Functions
|
||||||
|
newfunction(:loadjson, :type => :rvalue, :arity => -2, :doc => <<-'ENDHEREDOC') do |args|
|
||||||
|
Load a JSON file containing an array, string, or hash, and return the data
|
||||||
|
in the corresponding native data type.
|
||||||
|
The second parameter is the default value. It will be returned if the file
|
||||||
|
was not found or could not be parsed.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
$myhash = loadjson('/etc/puppet/data/myhash.json')
|
||||||
|
$myhash = loadjson('no-file.json', {'default' => 'value'})
|
||||||
|
ENDHEREDOC
|
||||||
|
|
||||||
|
raise ArgumentError, 'Wrong number of arguments. 1 or 2 arguments should be provided.' unless args.length >= 1
|
||||||
|
|
||||||
|
if File.exists?(args[0])
|
||||||
|
begin
|
||||||
|
content = File.read(args[0])
|
||||||
|
PSON::load(content) || args[1]
|
||||||
|
rescue Exception => e
|
||||||
|
if args[1]
|
||||||
|
args[1]
|
||||||
|
else
|
||||||
|
raise e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
warning("Can't load '#{args[0]}' File does not exist!")
|
||||||
|
args[1]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -1,23 +1,32 @@
|
||||||
module Puppet::Parser::Functions
|
module Puppet::Parser::Functions
|
||||||
|
newfunction(:loadyaml, :type => :rvalue, :arity => -2, :doc => <<-'ENDHEREDOC') do |args|
|
||||||
|
Load a YAML file containing an array, string, or hash, and return the data
|
||||||
|
in the corresponding native data type.
|
||||||
|
The second parameter is the default value. It will be returned if the file
|
||||||
|
was not found or could not be parsed.
|
||||||
|
|
||||||
newfunction(:loadyaml, :type => :rvalue, :doc => <<-'ENDHEREDOC') do |args|
|
For example:
|
||||||
Load a YAML file containing an array, string, or hash, and return the data
|
|
||||||
in the corresponding native data type.
|
|
||||||
|
|
||||||
For example:
|
$myhash = loadyaml('/etc/puppet/data/myhash.yaml')
|
||||||
|
$myhash = loadyaml('no-file.yaml', {'default' => 'value'})
|
||||||
|
ENDHEREDOC
|
||||||
|
|
||||||
$myhash = loadyaml('/etc/puppet/data/myhash.yaml')
|
raise ArgumentError, 'Wrong number of arguments. 1 or 2 arguments should be provided.' unless args.length >= 1
|
||||||
ENDHEREDOC
|
require 'yaml'
|
||||||
|
|
||||||
unless args.length == 1
|
if File.exists?(args[0])
|
||||||
raise Puppet::ParseError, ("loadyaml(): wrong number of arguments (#{args.length}; must be 1)")
|
begin
|
||||||
end
|
YAML::load_file(args[0]) || args[1]
|
||||||
|
rescue Exception => e
|
||||||
if File.exists?(args[0]) then
|
if args[1]
|
||||||
YAML.load_file(args[0])
|
args[1]
|
||||||
|
else
|
||||||
|
raise e
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
warning("Can't load " + args[0] + ". File does not exist!")
|
warning("Can't load '#{args[0]}' File does not exist!")
|
||||||
nil
|
args[1]
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
52
spec/acceptance/loadjson_spec.rb
Normal file
52
spec/acceptance/loadjson_spec.rb
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#! /usr/bin/env ruby -S rspec
|
||||||
|
require 'spec_helper_acceptance'
|
||||||
|
|
||||||
|
tmpdir = default.tmpdir('stdlib')
|
||||||
|
|
||||||
|
describe 'loadjson function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('operatingsystem')) do
|
||||||
|
describe 'success' do
|
||||||
|
it 'loadjsons array of values' do
|
||||||
|
shell("echo '{\"aaa\":1,\"bbb\":2,\"ccc\":3,\"ddd\":4}' > #{tmpdir}/testjson.json")
|
||||||
|
pp = <<-EOS
|
||||||
|
$o = loadjson('#{tmpdir}/testjson.json')
|
||||||
|
notice(inline_template('loadjson[aaa] is <%= @o["aaa"].inspect %>'))
|
||||||
|
notice(inline_template('loadjson[bbb] is <%= @o["bbb"].inspect %>'))
|
||||||
|
notice(inline_template('loadjson[ccc] is <%= @o["ccc"].inspect %>'))
|
||||||
|
notice(inline_template('loadjson[ddd] is <%= @o["ddd"].inspect %>'))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
apply_manifest(pp, :catch_failures => true) do |r|
|
||||||
|
expect(r.stdout).to match(/loadjson\[aaa\] is 1/)
|
||||||
|
expect(r.stdout).to match(/loadjson\[bbb\] is 2/)
|
||||||
|
expect(r.stdout).to match(/loadjson\[ccc\] is 3/)
|
||||||
|
expect(r.stdout).to match(/loadjson\[ddd\] is 4/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the default value if there is no file to load' do
|
||||||
|
pp = <<-EOS
|
||||||
|
$o = loadjson('#{tmpdir}/no-file.json', {'default' => 'value'})
|
||||||
|
notice(inline_template('loadjson[default] is <%= @o["default"].inspect %>'))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
apply_manifest(pp, :catch_failures => true) do |r|
|
||||||
|
expect(r.stdout).to match(/loadjson\[default\] is "value"/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the default value if the file was parsed with an error' do
|
||||||
|
shell("echo '!' > #{tmpdir}/testjson.json")
|
||||||
|
pp = <<-EOS
|
||||||
|
$o = loadjson('#{tmpdir}/testjson.json', {'default' => 'value'})
|
||||||
|
notice(inline_template('loadjson[default] is <%= @o["default"].inspect %>'))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
apply_manifest(pp, :catch_failures => true) do |r|
|
||||||
|
expect(r.stdout).to match(/loadjson\[default\] is "value"/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
describe 'failure' do
|
||||||
|
it 'fails with no arguments'
|
||||||
|
end
|
||||||
|
end
|
|
@ -26,6 +26,29 @@ describe 'loadyaml function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('op
|
||||||
expect(r.stdout).to match(/loadyaml\[ddd\] is 4/)
|
expect(r.stdout).to match(/loadyaml\[ddd\] is 4/)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'returns the default value if there is no file to load' do
|
||||||
|
pp = <<-EOS
|
||||||
|
$o = loadyaml('#{tmpdir}/no-file.yaml', {'default' => 'value'})
|
||||||
|
notice(inline_template('loadyaml[default] is <%= @o["default"].inspect %>'))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
apply_manifest(pp, :catch_failures => true) do |r|
|
||||||
|
expect(r.stdout).to match(/loadyaml\[default\] is "value"/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the default value if the file was parsed with an error' do
|
||||||
|
shell("echo '!' > #{tmpdir}/testyaml.yaml")
|
||||||
|
pp = <<-EOS
|
||||||
|
$o = loadyaml('#{tmpdir}/testyaml.yaml', {'default' => 'value'})
|
||||||
|
notice(inline_template('loadyaml[default] is <%= @o["default"].inspect %>'))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
apply_manifest(pp, :catch_failures => true) do |r|
|
||||||
|
expect(r.stdout).to match(/loadyaml\[default\] is "value"/)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
describe 'failure' do
|
describe 'failure' do
|
||||||
it 'fails with no arguments'
|
it 'fails with no arguments'
|
||||||
|
|
38
spec/functions/loadjson_spec.rb
Normal file
38
spec/functions/loadjson_spec.rb
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe 'loadjson' do
|
||||||
|
it { is_expected.not_to eq(nil) }
|
||||||
|
it { is_expected.to run.with_params().and_raise_error(ArgumentError, /wrong number of arguments/i) }
|
||||||
|
|
||||||
|
context 'when a non-existing file is specified' do
|
||||||
|
let(:filename) { '/tmp/doesnotexist' }
|
||||||
|
before {
|
||||||
|
File.expects(:exists?).with(filename).returns(false).once
|
||||||
|
PSON.expects(:load).never
|
||||||
|
}
|
||||||
|
it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when an existing file is specified' do
|
||||||
|
let(:filename) { '/tmp/doesexist' }
|
||||||
|
let(:data) { { 'key' => 'value' } }
|
||||||
|
let(:json) { '{"key":"value"}' }
|
||||||
|
before {
|
||||||
|
File.expects(:exists?).with(filename).returns(true).once
|
||||||
|
File.expects(:read).with(filename).returns(json).once
|
||||||
|
PSON.expects(:load).with(json).returns(data).once
|
||||||
|
}
|
||||||
|
it { is_expected.to run.with_params(filename).and_return(data) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the file could not be parsed' do
|
||||||
|
let(:filename) { '/tmp/doesexist' }
|
||||||
|
let(:json) { '{"key":"value"}' }
|
||||||
|
before {
|
||||||
|
File.expects(:exists?).with(filename).returns(true).once
|
||||||
|
File.expects(:read).with(filename).returns(json).once
|
||||||
|
PSON.stubs(:load).with(json).once.raises StandardError, 'Something terrible have happened!'
|
||||||
|
}
|
||||||
|
it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,16 +2,17 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe 'loadyaml' do
|
describe 'loadyaml' do
|
||||||
it { is_expected.not_to eq(nil) }
|
it { is_expected.not_to eq(nil) }
|
||||||
it { is_expected.to run.with_params().and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }
|
it { is_expected.to run.with_params().and_raise_error(ArgumentError, /wrong number of arguments/i) }
|
||||||
it { is_expected.to run.with_params('', '').and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }
|
|
||||||
context 'when a non-existing file is specified' do
|
context 'when a non-existing file is specified' do
|
||||||
let(:filename) { '/tmp/doesnotexist' }
|
let(:filename) { '/tmp/doesnotexist' }
|
||||||
before {
|
before {
|
||||||
File.expects(:exists?).with(filename).returns(false).once
|
File.expects(:exists?).with(filename).returns(false).once
|
||||||
YAML.expects(:load_file).never
|
YAML.expects(:load_file).never
|
||||||
}
|
}
|
||||||
it { is_expected.to run.with_params(filename).and_return(nil) }
|
it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when an existing file is specified' do
|
context 'when an existing file is specified' do
|
||||||
let(:filename) { '/tmp/doesexist' }
|
let(:filename) { '/tmp/doesexist' }
|
||||||
let(:data) { { 'key' => 'value' } }
|
let(:data) { { 'key' => 'value' } }
|
||||||
|
@ -21,4 +22,13 @@ describe 'loadyaml' do
|
||||||
}
|
}
|
||||||
it { is_expected.to run.with_params(filename).and_return(data) }
|
it { is_expected.to run.with_params(filename).and_return(data) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when the file could not be parsed' do
|
||||||
|
let(:filename) { '/tmp/doesexist' }
|
||||||
|
before {
|
||||||
|
File.expects(:exists?).with(filename).returns(true).once
|
||||||
|
YAML.stubs(:load_file).with(filename).once.raises StandardError, 'Something terrible have happened!'
|
||||||
|
}
|
||||||
|
it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue