Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add delete_values() and delete_undef_values() functions #166

Merged
merged 1 commit into from Aug 5, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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