From 420f76d8dcb307d363d30bef7cc963bff4f776fc Mon Sep 17 00:00:00 2001
From: Peter Souter
Date: Wed, 27 Apr 2016 14:06:22 +0100
Subject: [PATCH] (MODULES-1439) Adds any2bool function
* Basically a combination of `string2bool` and `num2bool`
---
lib/puppet/parser/functions/any2bool.rb | 55 +++++++++++++++++++++++++
spec/functions/any2bool_spec.rb | 42 +++++++++++++++++++
2 files changed, 97 insertions(+)
create mode 100644 lib/puppet/parser/functions/any2bool.rb
create mode 100755 spec/functions/any2bool_spec.rb
diff --git a/lib/puppet/parser/functions/any2bool.rb b/lib/puppet/parser/functions/any2bool.rb
new file mode 100644
index 0000000..f0f8f83
--- /dev/null
+++ b/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 :
diff --git a/spec/functions/any2bool_spec.rb b/spec/functions/any2bool_spec.rb
new file mode 100755
index 0000000..9d351ce
--- /dev/null
+++ b/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