Skip to content

Commit

Permalink
Merge pull request #166 from ptomulik/delete_undef_values
Browse files Browse the repository at this point in the history
Add delete_values() and delete_undef_values() functions
  • Loading branch information
adrienthebo committed Aug 5, 2013
2 parents e8dcc69 + 2069415 commit 5544be9
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 0 deletions.
27 changes: 27 additions & 0 deletions README.markdown
Expand Up @@ -202,6 +202,33 @@ Deletes a determined indexed value from an array.
Would return: ['a','c']


- *Type*: rvalue

delete_values
-------------
Deletes all instances of a given value from a hash.

*Examples:*

delete_values({'a'=>'A','b'=>'B','c'=>'C','B'=>'D'}, 'B')

Would return: {'a'=>'A','c'=>'C','B'=>'D'}


delete_undef_values
-------------------
Deletes all instances of the undef value from an array or hash.

*Examples:*

$hash = delete_undef_values({a=>'A', b=>'', c=>undef, d => false})

Would return: {a => 'A', b => '', d => false}

$array = delete_undef_values(['A','',undef,false])

Would return: ['A','',false]

- *Type*: rvalue

difference
Expand Down
34 changes: 34 additions & 0 deletions lib/puppet/parser/functions/delete_undef_values.rb
@@ -0,0 +1,34 @@
module Puppet::Parser::Functions
newfunction(:delete_undef_values, :type => :rvalue, :doc => <<-EOS
Returns a copy of input hash or array with all undefs deleted.
*Examples:*
$hash = delete_undef_values({a=>'A', b=>'', c=>undef, d => false})
Would return: {a => 'A', b => '', d => false}
$array = delete_undef_values(['A','',undef,false])
Would return: ['A','',false]
EOS
) do |args|

raise(Puppet::ParseError,
"delete_undef_values(): Wrong number of arguments given " +
"(#{args.size})") if args.size < 1

result = args[0]
if result.is_a?(Hash)
result.delete_if {|key, val| val.equal? :undef}
elsif result.is_a?(Array)
result.delete :undef
else
raise(Puppet::ParseError,
"delete_undef_values(): Wrong argument type #{args[0].class} " +
"for first argument")
end
result
end
end
27 changes: 27 additions & 0 deletions lib/puppet/parser/functions/delete_values.rb
@@ -0,0 +1,27 @@
module Puppet::Parser::Functions
newfunction(:delete_values, :type => :rvalue, :doc => <<-EOS
Deletes all instances of a given value from a hash.
*Examples:*
delete_values({'a'=>'A','b'=>'B','c'=>'C','B'=>'D'}, 'B')
Would return: {'a'=>'A','c'=>'C','B'=>'D'}
EOS
) do |arguments|

raise(Puppet::ParseError,
"delete_values(): Wrong number of arguments given " +
"(#{arguments.size} of 2)") if arguments.size != 2

hash = arguments[0]
item = arguments[1]

if not hash.is_a?(Hash)
raise(TypeError, "delete_values(): First argument must be a Hash. " + \
"Given an" " argument of class #{hash.class}.")
end
hash.delete_if { |key, val| item == val }
end
end
29 changes: 29 additions & 0 deletions spec/unit/puppet/parser/functions/delete_undef_values_spec.rb
@@ -0,0 +1,29 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'

describe "the delete_undef_values function" do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }

it "should exist" do
Puppet::Parser::Functions.function("delete_undef_values").should == "function_delete_undef_values"
end

it "should raise a ParseError if there is less than 1 argument" do
lambda { scope.function_delete_undef_values([]) }.should( raise_error(Puppet::ParseError))
end

it "should raise a ParseError if the argument is not Array nor Hash" do
lambda { scope.function_delete_undef_values(['']) }.should( raise_error(Puppet::ParseError))
lambda { scope.function_delete_undef_values([nil]) }.should( raise_error(Puppet::ParseError))
end

it "should delete all undef items from Array and only these" do
result = scope.function_delete_undef_values([['a',:undef,'c','undef']])
result.should(eq(['a','c','undef']))
end

it "should delete all undef items from Hash and only these" do
result = scope.function_delete_undef_values([{'a'=>'A','b'=>:undef,'c'=>'C','d'=>'undef'}])
result.should(eq({'a'=>'A','c'=>'C','d'=>'undef'}))
end
end
30 changes: 30 additions & 0 deletions spec/unit/puppet/parser/functions/delete_values_spec.rb
@@ -0,0 +1,30 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'

describe "the delete_values function" do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }

it "should exist" do
Puppet::Parser::Functions.function("delete_values").should == "function_delete_values"
end

it "should raise a ParseError if there are fewer than 2 arguments" do
lambda { scope.function_delete_values([]) }.should( raise_error(Puppet::ParseError))
end

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 the argument is not a hash" do
lambda { scope.function_delete_values([1,'bar']) }.should( raise_error(TypeError))
lambda { scope.function_delete_values(['foo','bar']) }.should( raise_error(TypeError))
lambda { scope.function_delete_values([[],'bar']) }.should( raise_error(TypeError))
end

it "should delete all instances of a value from a hash" do
result = scope.function_delete_values([{ 'a'=>'A', 'b'=>'B', 'B'=>'C', 'd'=>'B' },'B'])
result.should(eq({ 'a'=>'A', 'B'=>'C' }))
end

end

0 comments on commit 5544be9

Please sign in to comment.