diff options
author | David Schmitt <david.schmitt@puppetlabs.com> | 2015-05-06 09:48:31 +0100 |
---|---|---|
committer | David Schmitt <david.schmitt@puppetlabs.com> | 2015-05-06 09:48:31 +0100 |
commit | cf251303be2e89619e0b99f01fb90ed5e676dfa2 (patch) | |
tree | 017db11645787c7c56daf52dc6427b4e0e836ebe /lib | |
parent | 20669e39b18da020b82833a6e1b7b50aa9d0c1dd (diff) | |
parent | 25ed4b43c41324902e50d21eb98b5fa0db511b96 (diff) | |
download | puppet-stdlib-cf251303be2e89619e0b99f01fb90ed5e676dfa2.tar.gz puppet-stdlib-cf251303be2e89619e0b99f01fb90ed5e676dfa2.tar.bz2 |
Merge pull request #447 from elyscape/fix_range
Restore removed functionality to range()
Diffstat (limited to 'lib')
-rw-r--r-- | lib/puppet/parser/functions/range.rb | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/lib/puppet/parser/functions/range.rb b/lib/puppet/parser/functions/range.rb index 16d189f..c14f6e6 100644 --- a/lib/puppet/parser/functions/range.rb +++ b/lib/puppet/parser/functions/range.rb @@ -37,15 +37,34 @@ Will return: [0,2,4,6,8] EOS ) do |arguments| - # We support more than one argument but at least one is mandatory ... - raise(Puppet::ParseError, "range(): Wrong number of " + - "arguments given (#{arguments.size} for 1)") if arguments.size < 1 + raise(Puppet::ParseError, 'range(): Wrong number of ' + + 'arguments given (0 for 1)') if arguments.size == 0 - start = arguments[0] - stop = arguments[1] - step = arguments[2].nil? ? 1 : arguments[2].to_i.abs + if arguments.size > 1 + start = arguments[0] + stop = arguments[1] + step = arguments[2].nil? ? 1 : arguments[2].to_i.abs - # Check whether we have integer value if so then make it so ... + type = '..' # Use the simplest type of Range available in Ruby + + else # arguments.size == 0 + value = arguments[0] + + if m = value.match(/^(\w+)(\.\.\.?|\-)(\w+)$/) + start = m[1] + stop = m[3] + + type = m[2] + + elsif value.match(/^.+$/) + raise(Puppet::ParseError, "range(): Unable to compute range " + + "from the value: #{value}") + else + raise(Puppet::ParseError, "range(): Unknown range format: #{value}") + end + end + + # If we were given an integer, ensure we work with one if start.to_s.match(/^\d+$/) start = start.to_i stop = stop.to_i @@ -54,10 +73,14 @@ Will return: [0,2,4,6,8] stop = stop.to_s end - # We select simplest type for Range available in Ruby ... - range = (start .. stop) + range = case type + when /^(\.\.|\-)$/ then (start .. stop) + when '...' then (start ... stop) # Exclusive of last element + end + + result = range.step(step).collect { |i| i } - range.step(step).collect { |i| i } # Get them all ... Pokemon ... + return result end end |