(#19998) Implement any2array

This change is to implement a new function "any2array", which will take any
argument or arguments and create an array which contains it. If the argument
is a single array then it will be returned as-is. If the argument is a single
hash then it will be converted into an array. Otherwise (if there are more than
one argument, or the only argument is not an array or a hash) the function will
return an array containing all the arguments.
This commit is contained in:
Amos Shapira 2013-03-31 23:37:30 +11:00 committed by Jeff McCune
parent f90c54e2df
commit 7a2fb80834
2 changed files with 90 additions and 0 deletions

View file

@ -0,0 +1,35 @@
#
# str2bool.rb
#
module Puppet::Parser::Functions
newfunction(:any2array, :type => :rvalue, :doc => <<-EOS
This converts any object to an array containing that object. Empty argument
lists are converted to an empty array. Arrays are left untouched. Hashes are
converted to arrays of alternating keys and values.
EOS
) do |arguments|
if arguments.empty?
return []
end
if arguments.length == 1
if arguments[0].kind_of?(Array)
return arguments[0]
elsif arguments[0].kind_of?(Hash)
result = []
arguments[0].each do |key, value|
result << key << value
end
return result
else
return [arguments[0]]
end
end
return arguments
end
end
# vim: set ts=2 sw=2 et :

View file

@ -0,0 +1,55 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'
describe "the any2array function" do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
it "should exist" do
Puppet::Parser::Functions.function("any2array").should == "function_any2array"
end
it "should return an empty array if there is less than 1 argument" do
result = scope.function_any2array([])
result.should(eq([]))
end
it "should convert boolean true to [ true ] " do
result = scope.function_any2array([true])
result.should(eq([true]))
end
it "should convert one object to [object]" do
result = scope.function_any2array(['one'])
result.should(eq(['one']))
end
it "should convert multiple objects to [objects]" do
result = scope.function_any2array(['one', 'two'])
result.should(eq(['one', 'two']))
end
it "should return empty array it was called with" do
result = scope.function_any2array([[]])
result.should(eq([]))
end
it "should return one-member array it was called with" do
result = scope.function_any2array([['string']])
result.should(eq(['string']))
end
it "should return multi-member array it was called with" do
result = scope.function_any2array([['one', 'two']])
result.should(eq(['one', 'two']))
end
it "should return members of a hash it was called with" do
result = scope.function_any2array([{ 'key' => 'value' }])
result.should(eq(['key', 'value']))
end
it "should return an empty array if it was called with an empty hash" do
result = scope.function_any2array([{ }])
result.should(eq([]))
end
end