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:
Morgan Haskel 2015-09-21 10:56:08 -07:00
parent 9b1932c538
commit 799c38e14e
6 changed files with 58 additions and 15 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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()

View file

@ -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

View file

@ -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'})