diff options
| -rw-r--r-- | lib/puppet/parser/functions/range.rb | 36 | 
1 files changed, 30 insertions, 6 deletions
diff --git a/lib/puppet/parser/functions/range.rb b/lib/puppet/parser/functions/range.rb index 16d189f..49fba21 100644 --- a/lib/puppet/parser/functions/range.rb +++ b/lib/puppet/parser/functions/range.rb @@ -41,9 +41,29 @@ Will return: [0,2,4,6,8]      raise(Puppet::ParseError, "range(): Wrong number of " +        "arguments given (#{arguments.size} for 1)") if arguments.size < 1 -    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 + +      type = '..' # We select simplest type for Range available in Ruby ... + +    elsif 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 given') +      else +        raise(Puppet::ParseError, 'range(): Unknown format of range given') +      end +    end      # Check whether we have integer value if so then make it so ...      if start.to_s.match(/^\d+$/) @@ -54,10 +74,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 } # Get them all ... Pokemon ... -    range.step(step).collect { |i| i } # Get them all ... Pokemon ... +    return result    end  end  | 
