4725c97102
The previous behavior of the merge() function used Array#inject with two arguments. Ruby 1.8.5 only supports inject being used with one argument. This change initializes and empty Hash object and merges each argument into the accumulator. The last argument still "wins" in the merge. rspec tests (cd spec; rspec **/*_spec.rb) verified as passing with this change. Reviewed-by: Dan Bode
30 lines
914 B
Ruby
30 lines
914 B
Ruby
module Puppet::Parser::Functions
|
|
newfunction(:merge, :type => :rvalue, :doc => <<-'ENDHEREDOC') do |args|
|
|
Merges two or more hashes together and returns the resulting hash.
|
|
|
|
For example:
|
|
|
|
$hash1 = {'one' => 1, 'two', => 2}
|
|
$hash1 = {'two' => 2, 'three', => 2}
|
|
$merged_hash = merge($hash1, $hash2)
|
|
# merged_hash = {'one' => 1, 'two' => 2, 'three' => 2}
|
|
|
|
ENDHEREDOC
|
|
|
|
if args.length < 2
|
|
raise Puppet::ParseError, ("merge(): wrong number of arguments (#{args.length}; must be at least 2)")
|
|
end
|
|
|
|
# The hash we accumulate into
|
|
accumulator = Hash.new
|
|
# Merge into the accumulator hash
|
|
args.each do |arg|
|
|
unless arg.is_a?(Hash)
|
|
raise Puppet::ParseError, "merge: unexpected argument type #{arg.class}, only expects hash arguments"
|
|
end
|
|
accumulator.merge!(arg)
|
|
end
|
|
# Return the fully merged hash
|
|
accumulator
|
|
end
|
|
end
|