]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
bug # 20681 delete() function should not remove elements from original list
authorLeonardo Rodrigues de Mello <l@lmello.eu.org>
Mon, 9 Sep 2013 13:27:54 +0000 (10:27 -0300)
committerLeonardo Rodrigues de Mello <l@lmello.eu.org>
Mon, 16 Sep 2013 13:19:35 +0000 (10:19 -0300)
The setup: list with 3 elements, delete one:
$test_list = [‘a’, ‘b’, ‘c’]
$test_deleted = delete($test_list, ‘a’)

Print out the elements in ‘test_deleted’:
notify { ‘group_output2’:  withpath => true, name     => “$cfeng::test_deleted”, }
Notice: /Stage[main]/Syslog/Notify[group_output2]/message: bc

Good!  Run-on output shows that ‘a’ was deleted

Print out the elements in ‘test_list’:
notify { ‘group_output1’: withpath => true, name     => “$cfeng::test_list”, }
Notice: /Stage[main]/Syslog/Notify[group_output1]/message: bc

WHAT!?  'a' was deleted from ‘test_list’ as well! Expected abc as output!

This behaviour is confirmed for string, hash and array.
This is fixed on this commit, I had  added two spec tests to cover that cases.

bug #20681 spec test for delete() function.

I had forgot in the last commit the spec test for hash in the
delete function.

bug # 20681 delete() function change aproach.

Instead of rejecting elements from the original list, we use
collection = arguments[0].dup .
then latter we could continue to use delete and gsub! on collection
without impact on original argument.

this is a better solution than the previous one, and works on ruby
1.8.7, 1.9.3 and 2.0.0.

The previous solution does not work on ruby 1.8.7.

delete function remove typo whitespace.

fix typo whitespaces.

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

index f81434409c718b42cebbbaac105d4e87df70cfb8..d03a29355e24067c922f5ea4aacb3614769c108e 100644 (file)
@@ -27,7 +27,7 @@ string, or key from a hash.
         "given #{arguments.size} for 2.")
     end
 
-    collection = arguments[0]
+    collection = arguments[0].dup
     item = arguments[1]
 
     case collection
index 2f29c93c0ce1349a096e29652f405c3a1a3f2b88..06238f1522c20a96cea8559ae45dba06fee5a689 100755 (executable)
@@ -35,4 +35,22 @@ describe "the delete function" do
     result.should(eq({ 'a' => 1, 'c' => 3 }))
   end
 
+  it "should not change origin array passed as argument" do 
+    origin_array = ['a','b','c','d']
+    result = scope.function_delete([origin_array, 'b'])
+    origin_array.should(eq(['a','b','c','d']))
+  end
+
+  it "should not change the origin string passed as argument" do
+    origin_string = 'foobarbabarz'
+    result = scope.function_delete([origin_string,'bar'])
+    origin_string.should(eq('foobarbabarz'))
+  end
+
+  it "should not change origin hash passed as argument" do 
+    origin_hash = { 'a' => 1, 'b' => 2, 'c' => 3 } 
+    result = scope.function_delete([origin_hash, 'b'])
+    origin_hash.should(eq({ 'a' => 1, 'b' => 2, 'c' => 3 }))
+  end
+
 end