Skip to content

Commit

Permalink
Merge pull request #601 from petems/MODULES-1439-any2bool_added
Browse files Browse the repository at this point in the history
(MODULES-1439) Adds any2bool function
  • Loading branch information
bmjen committed May 5, 2016
2 parents f46c9fd + 420f76d commit b2165df
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
55 changes: 55 additions & 0 deletions lib/puppet/parser/functions/any2bool.rb
@@ -0,0 +1,55 @@
#
# any2bool.rb
#

module Puppet::Parser::Functions
newfunction(:any2bool, :type => :rvalue, :doc => <<-EOS
This converts 'anything' to a boolean. In practise it does the following:
* Strings such as Y,y,1,T,t,TRUE,yes,'true' will return true
* Strings such as 0,F,f,N,n,FALSE,no,'false' will return false
* Booleans will just return their original value
* Number (or a string representation of a number) > 0 will return true, otherwise false
* undef will return false
* Anything else will return true
EOS
) do |arguments|

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

# If argument is already Boolean, return it
if !!arguments[0] == arguments[0]
return arguments[0]
end

arg = arguments[0]

if arg == nil
return false
end

if arg == :undef
return false
end

valid_float = !!Float(arg) rescue false

if arg.is_a?(Numeric)
return function_num2bool( [ arguments[0] ] )
end

if arg.is_a?(String)
if valid_float
return function_num2bool( [ arguments[0] ] )
else
return function_str2bool( [ arguments[0] ] )
end
end

return true

end
end

# vim: set ts=2 sw=2 et :
42 changes: 42 additions & 0 deletions spec/functions/any2bool_spec.rb
@@ -0,0 +1,42 @@
require 'spec_helper'

describe 'any2bool' do
it { is_expected.not_to eq(nil) }
it { is_expected.to run.with_params().and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }

it { is_expected.to run.with_params(true).and_return(true) }
it { is_expected.to run.with_params(false).and_return(false) }

it { is_expected.to run.with_params('1.5').and_return(true) }

describe 'when testing stringy values that mean "true"' do
[ 'TRUE','1', 't', 'y', 'true', 'yes'].each do |value|
it { is_expected.to run.with_params(value).and_return(true) }
end
end

describe 'when testing stringy values that mean "false"' do
[ 'FALSE','', '0', 'f', 'n', 'false', 'no', 'undef', 'undefined', nil, :undef ].each do |value|
it { is_expected.to run.with_params(value).and_return(false) }
end
end

describe 'when testing numeric values that mean "true"' do
[ 1,'1',1.5, '1.5'].each do |value|
it { is_expected.to run.with_params(value).and_return(true) }
end
end

describe 'when testing numeric that mean "false"' do
[ -1, '-1', -1.5, '-1.5', '0', 0 ].each do |value|
it { is_expected.to run.with_params(value).and_return(false) }
end
end

describe 'everything else returns true' do
[ [], {}, ['1'], [1], {:one => 1} ].each do |value|
it { is_expected.to run.with_params(value).and_return(true) }
end
end

end

0 comments on commit b2165df

Please sign in to comment.