Merge branch '2.x' into 3.x

* 2.x:
  Extend delete function for strings and hashes
  Fixed typo
This commit is contained in:
Jeff McCune 2012-11-19 08:45:31 -05:00
commit 824ea6d49f
3 changed files with 44 additions and 13 deletions

View file

@ -7,7 +7,7 @@ almost always be evaluated in the context of Puppet and Facter working
together.
Still, we don't want to write custom facts that blow up in the users face if
Puppet is not loaded in memory. This is often the case if the user run
Puppet is not loaded in memory. This is often the case if the user runs
`facter` without also supplying the `--puppet` flag.
Ah! But Jeff, the custom fact won't be in the `$LOAD_PATH` unless the user

View file

@ -3,31 +3,43 @@
#
# TODO(Krzysztof Wilczynski): We need to add support for regular expression ...
# TODO(Krzysztof Wilczynski): Support for strings and hashes too ...
module Puppet::Parser::Functions
newfunction(:delete, :type => :rvalue, :doc => <<-EOS
Deletes a selected element from an array.
Deletes all instances of a given element from an array, substring from a
string, or key from a hash.
*Examples:*
delete(['a','b','c'], 'b')
delete(['a','b','c','b'], 'b')
Would return: ['a','c']
Would return: ['a','c']
delete({'a'=>1,'b'=>2,'c'=>3}, 'b')
Would return: {'a'=>1,'c'=>3}
delete('abracadabra', 'bra')
Would return: 'acada'
EOS
) do |arguments|
if (arguments.size != 2) then
raise(Puppet::ParseError, "delete(): Wrong number of arguments "+
"given #{arguments.size} for 2")
"given #{arguments.size} for 2.")
end
a = arguments[0]
collection = arguments[0]
item = arguments[1]
a.delete(item)
a
case collection
when Array, Hash
collection.delete item
when String
collection.gsub! item, ''
else
raise(TypeError, "delete(): First argument must be an Array, " +
"String, or Hash. Given an argument of class #{collection.class}.")
end
collection
end
end

View file

@ -8,12 +8,31 @@ describe "the delete function" do
Puppet::Parser::Functions.function("delete").should == "function_delete"
end
it "should raise a ParseError if there is less than 1 arguments" do
it "should raise a ParseError if there are fewer than 2 arguments" do
lambda { scope.function_delete([]) }.should( raise_error(Puppet::ParseError))
end
it "should delete an item from an array" do
result = scope.function_delete([['a','b','c'],'b'])
it "should raise a ParseError if there are greater than 2 arguments" do
lambda { scope.function_delete([[], 'foo', 'bar']) }.should( raise_error(Puppet::ParseError))
end
it "should raise a TypeError if a number is passed as the first argument" do
lambda { scope.function_delete([1, 'bar']) }.should( raise_error(TypeError))
end
it "should delete all instances of an element from an array" do
result = scope.function_delete([['a','b','c','b'],'b'])
result.should(eq(['a','c']))
end
it "should delete all instances of a substring from a string" do
result = scope.function_delete(['foobarbabarz','bar'])
result.should(eq('foobaz'))
end
it "should delete a key from a hash" do
result = scope.function_delete([{ 'a' => 1, 'b' => 2, 'c' => 3 },'b'])
result.should(eq({ 'a' => 1, 'c' => 3 }))
end
end