e2d7f3bb89
We need to use unless value.is_a?(String) || value.is_a?(Array) rather than klass = value.class unless [String, Array].include?(klass) because the klass version enforces type checking which is too strict, and does not allow us to accept objects wich have extended String (or Array). For example, generate() function now returns Puppet::Util::Execution::ProcessOutput which is just a very simple extension of String. While this in it's self was not intentional (PUP-2306) it is not unreasonable to cope with objects which extend Strings
63 lines
1.8 KiB
Ruby
63 lines
1.8 KiB
Ruby
#
|
|
# zip.rb
|
|
#
|
|
|
|
module Puppet::Parser::Functions
|
|
newfunction(:zip, :type => :rvalue, :doc => <<-EOS
|
|
Takes one element from first array and merges corresponding elements from second array. This generates a sequence of n-element arrays, where n is one more than the count of arguments.
|
|
|
|
*Example:*
|
|
|
|
zip(['1','2','3'],['4','5','6'])
|
|
|
|
Would result in:
|
|
|
|
["1", "4"], ["2", "5"], ["3", "6"]
|
|
EOS
|
|
) do |arguments|
|
|
|
|
# Technically we support three arguments but only first is mandatory ...
|
|
raise(Puppet::ParseError, "zip(): Wrong number of arguments " +
|
|
"given (#{arguments.size} for 2)") if arguments.size < 2
|
|
|
|
a = arguments[0]
|
|
b = arguments[1]
|
|
|
|
unless a.is_a?(Array) and b.is_a?(Array)
|
|
raise(Puppet::ParseError, 'zip(): Requires array to work with')
|
|
end
|
|
|
|
flatten = arguments[2] if arguments[2]
|
|
|
|
if flatten
|
|
# We can have either true or false, or string which resembles boolean ...
|
|
unless flatten.is_a?(String) || flatten.is_a?(FalseClass) || flatten.is_a?(TrueClass)
|
|
raise(Puppet::ParseError, 'zip(): Requires either ' +
|
|
'boolean or string to work with')
|
|
end
|
|
|
|
if flatten.is_a?(String)
|
|
# We consider all the yes, no, y, n and so on too ...
|
|
flatten = case flatten
|
|
#
|
|
# This is how undef looks like in Puppet ...
|
|
# We yield false in this case.
|
|
#
|
|
when /^$/, '' then false # Empty string will be false ...
|
|
when /^(1|t|y|true|yes)$/ then true
|
|
when /^(0|f|n|false|no)$/ then false
|
|
when /^(undef|undefined)$/ then false # This is not likely to happen ...
|
|
else
|
|
raise(Puppet::ParseError, 'zip(): Unknown type of boolean given')
|
|
end
|
|
end
|
|
end
|
|
|
|
result = a.zip(b)
|
|
result = flatten ? result.flatten : result
|
|
|
|
return result
|
|
end
|
|
end
|
|
|
|
# vim: set ts=2 sw=2 et :
|