Skip to content

Commit 5544be9

Browse files
committed
Merge pull request #166 from ptomulik/delete_undef_values
Add delete_values() and delete_undef_values() functions
2 parents e8dcc69 + 2069415 commit 5544be9

File tree

5 files changed

+147
-0
lines changed

5 files changed

+147
-0
lines changed

README.markdown

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,33 @@ Deletes a determined indexed value from an array.
202202
Would return: ['a','c']
203203

204204

205+
- *Type*: rvalue
206+
207+
delete_values
208+
-------------
209+
Deletes all instances of a given value from a hash.
210+
211+
*Examples:*
212+
213+
delete_values({'a'=>'A','b'=>'B','c'=>'C','B'=>'D'}, 'B')
214+
215+
Would return: {'a'=>'A','c'=>'C','B'=>'D'}
216+
217+
218+
delete_undef_values
219+
-------------------
220+
Deletes all instances of the undef value from an array or hash.
221+
222+
*Examples:*
223+
224+
$hash = delete_undef_values({a=>'A', b=>'', c=>undef, d => false})
225+
226+
Would return: {a => 'A', b => '', d => false}
227+
228+
$array = delete_undef_values(['A','',undef,false])
229+
230+
Would return: ['A','',false]
231+
205232
- *Type*: rvalue
206233

207234
difference
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module Puppet::Parser::Functions
2+
newfunction(:delete_undef_values, :type => :rvalue, :doc => <<-EOS
3+
Returns a copy of input hash or array with all undefs deleted.
4+
5+
*Examples:*
6+
7+
$hash = delete_undef_values({a=>'A', b=>'', c=>undef, d => false})
8+
9+
Would return: {a => 'A', b => '', d => false}
10+
11+
$array = delete_undef_values(['A','',undef,false])
12+
13+
Would return: ['A','',false]
14+
15+
EOS
16+
) do |args|
17+
18+
raise(Puppet::ParseError,
19+
"delete_undef_values(): Wrong number of arguments given " +
20+
"(#{args.size})") if args.size < 1
21+
22+
result = args[0]
23+
if result.is_a?(Hash)
24+
result.delete_if {|key, val| val.equal? :undef}
25+
elsif result.is_a?(Array)
26+
result.delete :undef
27+
else
28+
raise(Puppet::ParseError,
29+
"delete_undef_values(): Wrong argument type #{args[0].class} " +
30+
"for first argument")
31+
end
32+
result
33+
end
34+
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module Puppet::Parser::Functions
2+
newfunction(:delete_values, :type => :rvalue, :doc => <<-EOS
3+
Deletes all instances of a given value from a hash.
4+
5+
*Examples:*
6+
7+
delete_values({'a'=>'A','b'=>'B','c'=>'C','B'=>'D'}, 'B')
8+
9+
Would return: {'a'=>'A','c'=>'C','B'=>'D'}
10+
11+
EOS
12+
) do |arguments|
13+
14+
raise(Puppet::ParseError,
15+
"delete_values(): Wrong number of arguments given " +
16+
"(#{arguments.size} of 2)") if arguments.size != 2
17+
18+
hash = arguments[0]
19+
item = arguments[1]
20+
21+
if not hash.is_a?(Hash)
22+
raise(TypeError, "delete_values(): First argument must be a Hash. " + \
23+
"Given an" " argument of class #{hash.class}.")
24+
end
25+
hash.delete_if { |key, val| item == val }
26+
end
27+
end
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#! /usr/bin/env ruby -S rspec
2+
require 'spec_helper'
3+
4+
describe "the delete_undef_values function" do
5+
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
6+
7+
it "should exist" do
8+
Puppet::Parser::Functions.function("delete_undef_values").should == "function_delete_undef_values"
9+
end
10+
11+
it "should raise a ParseError if there is less than 1 argument" do
12+
lambda { scope.function_delete_undef_values([]) }.should( raise_error(Puppet::ParseError))
13+
end
14+
15+
it "should raise a ParseError if the argument is not Array nor Hash" do
16+
lambda { scope.function_delete_undef_values(['']) }.should( raise_error(Puppet::ParseError))
17+
lambda { scope.function_delete_undef_values([nil]) }.should( raise_error(Puppet::ParseError))
18+
end
19+
20+
it "should delete all undef items from Array and only these" do
21+
result = scope.function_delete_undef_values([['a',:undef,'c','undef']])
22+
result.should(eq(['a','c','undef']))
23+
end
24+
25+
it "should delete all undef items from Hash and only these" do
26+
result = scope.function_delete_undef_values([{'a'=>'A','b'=>:undef,'c'=>'C','d'=>'undef'}])
27+
result.should(eq({'a'=>'A','c'=>'C','d'=>'undef'}))
28+
end
29+
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#! /usr/bin/env ruby -S rspec
2+
require 'spec_helper'
3+
4+
describe "the delete_values function" do
5+
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
6+
7+
it "should exist" do
8+
Puppet::Parser::Functions.function("delete_values").should == "function_delete_values"
9+
end
10+
11+
it "should raise a ParseError if there are fewer than 2 arguments" do
12+
lambda { scope.function_delete_values([]) }.should( raise_error(Puppet::ParseError))
13+
end
14+
15+
it "should raise a ParseError if there are greater than 2 arguments" do
16+
lambda { scope.function_delete([[], 'foo', 'bar']) }.should( raise_error(Puppet::ParseError))
17+
end
18+
19+
it "should raise a TypeError if the argument is not a hash" do
20+
lambda { scope.function_delete_values([1,'bar']) }.should( raise_error(TypeError))
21+
lambda { scope.function_delete_values(['foo','bar']) }.should( raise_error(TypeError))
22+
lambda { scope.function_delete_values([[],'bar']) }.should( raise_error(TypeError))
23+
end
24+
25+
it "should delete all instances of a value from a hash" do
26+
result = scope.function_delete_values([{ 'a'=>'A', 'b'=>'B', 'B'=>'C', 'd'=>'B' },'B'])
27+
result.should(eq({ 'a'=>'A', 'B'=>'C' }))
28+
end
29+
30+
end

0 commit comments

Comments
 (0)