Skip to content

Commit f90c54e

Browse files
committed
Merge pull request #139 from hakamadare/19864_num2bool_match_fix
(19864) num2bool match fix
2 parents 4078a6f + c372f17 commit f90c54e

File tree

3 files changed

+70
-23
lines changed

3 files changed

+70
-23
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pkg/
22
.DS_Store
33
metadata.json
44
coverage/
5+
spec/fixtures/
56
Gemfile.lock
67
.bundle/
78
vendor/bundle/

lib/puppet/parser/functions/num2bool.rb

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,41 @@
22
# num2bool.rb
33
#
44

5-
# TODO(Krzysztof Wilczynski): We probably need to approach numeric values differently ...
6-
75
module Puppet::Parser::Functions
86
newfunction(:num2bool, :type => :rvalue, :doc => <<-EOS
9-
This function converts a number into a true boolean. Zero becomes false. Numbers
10-
higher then 0 become true.
7+
This function converts a number or a string representation of a number into a
8+
true boolean. Zero or anything non-numeric becomes false. Numbers higher then 0
9+
become true.
1110
EOS
1211
) do |arguments|
1312

1413
raise(Puppet::ParseError, "num2bool(): Wrong number of arguments " +
15-
"given (#{arguments.size} for 1)") if arguments.size < 1
14+
"given (#{arguments.size} for 1)") if arguments.size != 1
1615

1716
number = arguments[0]
1817

19-
# Only numbers allowed ...
20-
unless number.match(/^\-?\d+$/)
21-
raise(Puppet::ParseError, 'num2bool(): Requires integer to work with')
18+
case number
19+
when Numeric
20+
# Yay, it's a number
21+
when String
22+
begin
23+
number = Float(number)
24+
rescue ArgumentError => ex
25+
raise(Puppet::ParseError, "num2bool(): '#{number}' does not look like a number: #{ex.message}")
26+
end
27+
else
28+
begin
29+
number = number.to_s
30+
rescue NoMethodError => ex
31+
raise(Puppet::ParseError, "num2bool(): Unable to parse argument: #{ex.message}")
32+
end
2233
end
2334

24-
result = case number
25-
when /^0$/
26-
false
27-
when /^\-?\d+$/
28-
# Numbers in Puppet are often string-encoded which is troublesome ...
29-
number = number.to_i
30-
# We yield true for any positive number and false otherwise ...
31-
number > 0 ? true : false
32-
else
33-
raise(Puppet::ParseError, 'num2bool(): Unknown numeric format given')
34-
end
35+
# Truncate Floats
36+
number = number.to_i
3537

36-
return result
38+
# Return true for any positive number and false otherwise
39+
return number > 0
3740
end
3841
end
3942

spec/unit/puppet/parser/functions/num2bool_spec.rb

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,60 @@
88
Puppet::Parser::Functions.function("num2bool").should == "function_num2bool"
99
end
1010

11-
it "should raise a ParseError if there is less than 1 arguments" do
11+
it "should raise a ParseError if there are no arguments" do
1212
lambda { scope.function_num2bool([]) }.should( raise_error(Puppet::ParseError))
1313
end
1414

15-
it "should return true if 1" do
15+
it "should raise a ParseError if there are more than 1 arguments" do
16+
lambda { scope.function_num2bool(["foo","bar"]) }.should( raise_error(Puppet::ParseError))
17+
end
18+
19+
it "should raise a ParseError if passed something non-numeric" do
20+
lambda { scope.function_num2bool(["xyzzy"]) }.should( raise_error(Puppet::ParseError))
21+
end
22+
23+
it "should return true if passed string 1" do
1624
result = scope.function_num2bool(["1"])
1725
result.should(be_true)
1826
end
1927

20-
it "should return false if 0" do
28+
it "should return true if passed string 1.5" do
29+
result = scope.function_num2bool(["1.5"])
30+
result.should(be_true)
31+
end
32+
33+
it "should return true if passed number 1" do
34+
result = scope.function_num2bool([1])
35+
result.should(be_true)
36+
end
37+
38+
it "should return false if passed string 0" do
2139
result = scope.function_num2bool(["0"])
2240
result.should(be_false)
2341
end
42+
43+
it "should return false if passed number 0" do
44+
result = scope.function_num2bool([0])
45+
result.should(be_false)
46+
end
47+
48+
it "should return false if passed string -1" do
49+
result = scope.function_num2bool(["-1"])
50+
result.should(be_false)
51+
end
52+
53+
it "should return false if passed string -1.5" do
54+
result = scope.function_num2bool(["-1.5"])
55+
result.should(be_false)
56+
end
57+
58+
it "should return false if passed number -1" do
59+
result = scope.function_num2bool([-1])
60+
result.should(be_false)
61+
end
62+
63+
it "should return false if passed float -1.5" do
64+
result = scope.function_num2bool([-1.5])
65+
result.should(be_false)
66+
end
2467
end

0 commit comments

Comments
 (0)