Merge pull request #600 from dmitryilyin/master

Add the default value to the "loadyaml" function
This commit is contained in:
Bryan Jen 2016-05-12 14:14:14 -07:00
commit ecfdbb2690
7 changed files with 214 additions and 18 deletions

View file

@ -661,12 +661,42 @@ Returns the keys of a hash as an array. *Type*: rvalue.
#### `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')
~~~
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.
#### `load_module_metadata`

View 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

View file

@ -1,23 +1,32 @@
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|
Load a YAML file containing an array, string, or hash, and return the data
in the corresponding native data type.
For example:
For example:
$myhash = loadyaml('/etc/puppet/data/myhash.yaml')
$myhash = loadyaml('no-file.yaml', {'default' => 'value'})
ENDHEREDOC
$myhash = loadyaml('/etc/puppet/data/myhash.yaml')
ENDHEREDOC
raise ArgumentError, 'Wrong number of arguments. 1 or 2 arguments should be provided.' unless args.length >= 1
require 'yaml'
unless args.length == 1
raise Puppet::ParseError, ("loadyaml(): wrong number of arguments (#{args.length}; must be 1)")
end
if File.exists?(args[0]) then
YAML.load_file(args[0])
if File.exists?(args[0])
begin
YAML::load_file(args[0]) || 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!")
nil
warning("Can't load '#{args[0]}' File does not exist!")
args[1]
end
end

View 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

View file

@ -26,6 +26,29 @@ describe 'loadyaml function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('op
expect(r.stdout).to match(/loadyaml\[ddd\] is 4/)
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
describe 'failure' do
it 'fails with no arguments'

View 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

View file

@ -2,16 +2,17 @@ require 'spec_helper'
describe 'loadyaml' do
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(Puppet::ParseError, /wrong number of arguments/i) }
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
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
context 'when an existing file is specified' do
let(:filename) { '/tmp/doesexist' }
let(:data) { { 'key' => 'value' } }
@ -21,4 +22,13 @@ describe 'loadyaml' do
}
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' }
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