Puppet Function: range
- Defined in:
- puppet/modules/stdlib/lib/puppet/parser/functions/range.rb
- Function type:
- Ruby 3.x API
Overview
When given range in the form of (start, stop) it will extrapolate a range as an array.
Examples:
range("0", "9")
Will return: [0,1,2,3,4,5,6,7,8,9]
range("00", "09")
Will return: [0,1,2,3,4,5,6,7,8,9] (Zero padded strings are converted to integers automatically)
range("a", "c")
Will return: [“a”,“b”,“c”]
range("host01", "host10")
Will return: [“host01”, “host02”, …, “host09”, “host10”] NB Be explicit in including trailing zeros. Otherwise the underlying ruby function will fail.
Passing a third argument will cause the generated range to step by that interval, e.g.
range("0", "9", "2")
Will return: [0,2,4,6,8]
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'puppet/modules/stdlib/lib/puppet/parser/functions/range.rb', line 8 newfunction(:range, :type => :rvalue, :doc => <<-EOS When given range in the form of (start, stop) it will extrapolate a range as an array. *Examples:* range("0", "9") Will return: [0,1,2,3,4,5,6,7,8,9] range("00", "09") Will return: [0,1,2,3,4,5,6,7,8,9] (Zero padded strings are converted to integers automatically) range("a", "c") Will return: ["a","b","c"] range("host01", "host10") Will return: ["host01", "host02", ..., "host09", "host10"] NB Be explicit in including trailing zeros. Otherwise the underlying ruby function will fail. Passing a third argument will cause the generated range to step by that interval, e.g. range("0", "9", "2") Will return: [0,2,4,6,8] EOS ) do |arguments| raise(Puppet::ParseError, 'range(): Wrong number of ' + 'arguments given (0 for 1)') if arguments.size == 0 if arguments.size > 1 start = arguments[0] stop = arguments[1] step = arguments[2].nil? ? 1 : arguments[2].to_i.abs type = '..' # Use the simplest type of Range available in Ruby else # arguments.size == 1 value = arguments[0] if m = value.match(/^(\w+)(\.\.\.?|\-)(\w+)$/) start = m[1] stop = m[3] type = m[2] step = 1 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 else start = start.to_s stop = stop.to_s end range = case type when /^(\.\.|\-)$/ then (start .. stop) when '...' then (start ... stop) # Exclusive of last element end result = range.step(step).to_a return result end |