From 0798059361cd79991220ff997529593a4cb43a0e Mon Sep 17 00:00:00 2001 From: Joshua Harlan Lifton Date: Sat, 17 Nov 2012 22:26:57 -0800 Subject: Fixed typo --- README_DEVELOPER.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_DEVELOPER.markdown b/README_DEVELOPER.markdown index e8aa27a..04349ed 100644 --- a/README_DEVELOPER.markdown +++ b/README_DEVELOPER.markdown @@ -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 -- cgit v1.2.3 From 7322e4dc2f8dc831097d2b0fa3768df0689acfa2 Mon Sep 17 00:00:00 2001 From: Joshua Harlan Lifton Date: Sat, 17 Nov 2012 22:27:15 -0800 Subject: Extend delete function for strings and hashes 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 | 30 +++++++++++++++++------- spec/unit/puppet/parser/functions/delete_spec.rb | 25 +++++++++++++++++--- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/lib/puppet/parser/functions/delete.rb b/lib/puppet/parser/functions/delete.rb index ab8f75b..f814344 100644 --- a/lib/puppet/parser/functions/delete.rb +++ b/lib/puppet/parser/functions/delete.rb @@ -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 diff --git a/spec/unit/puppet/parser/functions/delete_spec.rb b/spec/unit/puppet/parser/functions/delete_spec.rb index 0549232..2f29c93 100755 --- a/spec/unit/puppet/parser/functions/delete_spec.rb +++ b/spec/unit/puppet/parser/functions/delete_spec.rb @@ -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 -- cgit v1.2.3