diff options
author | Erik Dalén <dalen@spotify.com> | 2013-03-20 16:36:20 +0100 |
---|---|---|
committer | Adrien Thebo <git@somethingsinistral.net> | 2013-03-27 14:03:31 -0700 |
commit | ff5dd5d75adb3723e106ca20bac4e68466395a56 (patch) | |
tree | 7e2881f09efa19e7bc84e19ddfcf263e92b1627b /lib/puppet/parser | |
parent | 4c695ede384501b9c516cc53bdfc6b547a6e5ea2 (diff) | |
download | puppet-stdlib-ff5dd5d75adb3723e106ca20bac4e68466395a56.tar.gz puppet-stdlib-ff5dd5d75adb3723e106ca20bac4e68466395a56.tar.bz2 |
Allow comparisons of Numeric and number as String
Puppet passes numbers as String to functions, but it makes more sense to
compare them as Numeric.
But sometimes Puppet passes them as the wrong type, see:
https://projects.puppetlabs.com/issues/19812
Diffstat (limited to 'lib/puppet/parser')
-rw-r--r-- | lib/puppet/parser/functions/max.rb | 10 | ||||
-rw-r--r-- | lib/puppet/parser/functions/min.rb | 10 |
2 files changed, 18 insertions, 2 deletions
diff --git a/lib/puppet/parser/functions/max.rb b/lib/puppet/parser/functions/max.rb index 10b6f74..60fb94a 100644 --- a/lib/puppet/parser/functions/max.rb +++ b/lib/puppet/parser/functions/max.rb @@ -8,6 +8,14 @@ module Puppet::Parser::Functions raise(Puppet::ParseError, "max(): Wrong number of arguments " + "need at least one") if args.size == 0 - return args.max + # Sometimes we get numbers as numerics and sometimes as strings. + # We try to compare them as numbers when possible + return args.max do |a,b| + if a.to_s =~ /\A-?\d+(.\d+)?\z/ and b.to_s =~ /\A-?\d+(.\d+)?\z/ then + a.to_f <=> b.to_f + else + a.to_s <=> b.to_s + end + end end end diff --git a/lib/puppet/parser/functions/min.rb b/lib/puppet/parser/functions/min.rb index abf1b62..6bd6ebf 100644 --- a/lib/puppet/parser/functions/min.rb +++ b/lib/puppet/parser/functions/min.rb @@ -8,6 +8,14 @@ module Puppet::Parser::Functions raise(Puppet::ParseError, "min(): Wrong number of arguments " + "need at least one") if args.size == 0 - return args.min + # Sometimes we get numbers as numerics and sometimes as strings. + # We try to compare them as numbers when possible + return args.min do |a,b| + if a.to_s =~ /\A^-?\d+(.\d+)?\z/ and b.to_s =~ /\A-?\d+(.\d+)?\z/ then + a.to_f <=> b.to_f + else + a.to_s <=> b.to_s + end + end end end |