]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
Extend delete function for strings and hashes
authorJoshua Harlan Lifton <lifton@puppetlabs.com>
Sun, 18 Nov 2012 06:27:15 +0000 (22:27 -0800)
committerJeff McCune <jeff@puppetlabs.com>
Mon, 19 Nov 2012 13:44:44 +0000 (08:44 -0500)
Previous to this commit, the delete function only acted on
arrays. This commit adds the same functionality for hashes and strings
in the obvious way: delete(h, k) would delete the k key from the h
hash and delete(s, sub) would delete all instances of the sub
substring from the s string.

lib/puppet/parser/functions/delete.rb
spec/unit/puppet/parser/functions/delete_spec.rb

index ab8f75bdb1ecf002cedb4ba3069b7dac861921ec..f81434409c718b42cebbbaac105d4e87df70cfb8 100644 (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
 
index 0549232a55cb1c6db5dfd71b2ea57339bfe60489..2f29c93c0ce1349a096e29652f405c3a1a3f2b88 100755 (executable)
@@ -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