Fix backwards compatibility from #511
Maintain the old behavior in the case where the optional second parameter isn't passed. Also, adding arity is backwards incompatible since stdlib still supports 2.7, so remove that.
This commit is contained in:
parent
9b1932c538
commit
799c38e14e
6 changed files with 58 additions and 15 deletions
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
module Puppet::Parser::Functions
|
module Puppet::Parser::Functions
|
||||||
newfunction(:parsejson, :type => :rvalue, :arity => -2, :doc => <<-EOS
|
newfunction(:parsejson, :type => :rvalue, :doc => <<-EOS
|
||||||
This function accepts JSON as a string and converts it into the correct
|
This function accepts JSON as a string and converts it into the correct
|
||||||
Puppet structure.
|
Puppet structure.
|
||||||
|
|
||||||
|
@ -15,8 +15,12 @@ be returned if the parsing of YAML string have failed.
|
||||||
|
|
||||||
begin
|
begin
|
||||||
PSON::load(arguments[0]) || arguments[1]
|
PSON::load(arguments[0]) || arguments[1]
|
||||||
rescue Exception
|
rescue Exception => e
|
||||||
arguments[1]
|
if arguments[1]
|
||||||
|
arguments[1]
|
||||||
|
else
|
||||||
|
raise e
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
module Puppet::Parser::Functions
|
module Puppet::Parser::Functions
|
||||||
newfunction(:parseyaml, :type => :rvalue, :arity => -2, :doc => <<-EOS
|
newfunction(:parseyaml, :type => :rvalue, :doc => <<-EOS
|
||||||
This function accepts YAML as a string and converts it into the correct
|
This function accepts YAML as a string and converts it into the correct
|
||||||
Puppet structure.
|
Puppet structure.
|
||||||
|
|
||||||
|
@ -16,8 +16,12 @@ be returned if the parsing of YAML string have failed.
|
||||||
|
|
||||||
begin
|
begin
|
||||||
YAML::load(arguments[0]) || arguments[1]
|
YAML::load(arguments[0]) || arguments[1]
|
||||||
rescue Exception
|
rescue Exception => e
|
||||||
arguments[1]
|
if arguments[1]
|
||||||
|
arguments[1]
|
||||||
|
else
|
||||||
|
raise e
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,12 +21,24 @@ describe 'parsejson function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('o
|
||||||
it 'raises error on incorrect json' do
|
it 'raises error on incorrect json' do
|
||||||
pp = <<-EOS
|
pp = <<-EOS
|
||||||
$a = '{"hunter": "washere", "tests": "passing",}'
|
$a = '{"hunter": "washere", "tests": "passing",}'
|
||||||
$ao = parsejson($a, {'tests' => 'using the default value'})
|
$ao = parsejson($a, 'tests are using the default value')
|
||||||
notice(inline_template('a is <%= @ao.inspect %>'))
|
notice(inline_template('a is <%= @ao.inspect %>'))
|
||||||
EOS
|
EOS
|
||||||
|
|
||||||
apply_manifest(pp, :catch_failures => true) do |r|
|
apply_manifest(pp, :catch_failures => true) do |r|
|
||||||
expect(r.stdout).to match(/tests are "using the default value"/)
|
expect(r.stdout).to match(/tests are using the default value/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'raises error on incorrect json' do
|
||||||
|
pp = <<-EOS
|
||||||
|
$a = '{"hunter": "washere", "tests": "passing",}'
|
||||||
|
$ao = parsejson($a)
|
||||||
|
notice(inline_template('a is <%= @ao.inspect %>'))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
apply_manifest(pp, :expect_failures => true) do |r|
|
||||||
|
expect(r.stderr).to match(/expected next name/)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,20 @@ describe 'parseyaml function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('o
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'raises error on incorrect yaml' do
|
||||||
|
pp = <<-EOS
|
||||||
|
$a = "---\nhunter: washere\ntests: passing\n:"
|
||||||
|
$o = parseyaml($a)
|
||||||
|
$tests = $o['tests']
|
||||||
|
notice(inline_template('tests are <%= @tests.inspect %>'))
|
||||||
|
EOS
|
||||||
|
|
||||||
|
apply_manifest(pp, :expect_failures => true) do |r|
|
||||||
|
expect(r.stderr).to match(/(syntax error|did not find expected key)/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
it 'raises error on incorrect number of arguments' do
|
it 'raises error on incorrect number of arguments' do
|
||||||
pp = <<-EOS
|
pp = <<-EOS
|
||||||
$o = parseyaml()
|
$o = parseyaml()
|
||||||
|
|
|
@ -41,10 +41,10 @@ describe 'parsejson' do
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with incorrect YAML data' do
|
context 'with incorrect JSON data' do
|
||||||
it 'should return "nil" if a default value should be returned but is not provided' do
|
it 'should raise an error with invalid JSON and no default' do
|
||||||
is_expected.to run.with_params('').
|
is_expected.to run.with_params('').
|
||||||
and_return(nil)
|
and_raise_error(PSON::ParserError)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should support a structure for a default value' do
|
it 'should support a structure for a default value' do
|
||||||
|
|
|
@ -40,12 +40,21 @@ describe 'parseyaml' do
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with incorrect YAML data' do
|
context 'on a modern ruby', :unless => RUBY_VERSION == '1.8.7' do
|
||||||
it 'should return "nil" if a default value should be returned but is not provided' do
|
it 'should raise an error with invalid YAML and no default' do
|
||||||
is_expected.to run.with_params('').
|
is_expected.to run.with_params('["one"').
|
||||||
and_return(nil)
|
and_raise_error(Psych::SyntaxError)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when running on ruby 1.8.7, which does not have Psych', :if => RUBY_VERSION == '1.8.7' do
|
||||||
|
it 'should raise an error with invalid YAML and no default' do
|
||||||
|
is_expected.to run.with_params('["one"').
|
||||||
|
and_raise_error(ArgumentError)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with incorrect YAML data' do
|
||||||
it 'should support a structure for a default value' do
|
it 'should support a structure for a default value' do
|
||||||
is_expected.to run.with_params('', {'a' => '1'}).
|
is_expected.to run.with_params('', {'a' => '1'}).
|
||||||
and_return({'a' => '1'})
|
and_return({'a' => '1'})
|
||||||
|
|
Loading…
Reference in a new issue