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
45 lines
1.1 KiB
Ruby
45 lines
1.1 KiB
Ruby
#
|
||
# shuffle.rb
|
||
#
|
||
|
||
module Puppet::Parser::Functions
|
||
newfunction(:shuffle, :type => :rvalue, :doc => <<-EOS
|
||
Randomizes the order of a string or array elements.
|
||
EOS
|
||
) do |arguments|
|
||
|
||
raise(Puppet::ParseError, "shuffle(): Wrong number of arguments " +
|
||
"given (#{arguments.size} for 1)") if arguments.size < 1
|
||
|
||
value = arguments[0]
|
||
|
||
unless value.is_a?(Array) || value.is_a?(String)
|
||
raise(Puppet::ParseError, 'shuffle(): Requires either ' +
|
||
'array or string to work with')
|
||
end
|
||
|
||
result = value.clone
|
||
|
||
string = value.is_a?(String) ? true : false
|
||
|
||
# Check whether it makes sense to shuffle ...
|
||
return result if result.size <= 1
|
||
|
||
# We turn any string value into an array to be able to shuffle ...
|
||
result = string ? result.split('') : result
|
||
|
||
elements = result.size
|
||
|
||
# Simple implementation of Fisher–Yates in-place shuffle ...
|
||
elements.times do |i|
|
||
j = rand(elements - i) + i
|
||
result[j], result[i] = result[i], result[j]
|
||
end
|
||
|
||
result = string ? result.join : result
|
||
|
||
return result
|
||
end
|
||
end
|
||
|
||
# vim: set ts=2 sw=2 et :
|