X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=3rdparty%2Fmodules%2Fstdlib%2Flib%2Fpuppet%2Fparser%2Ffunctions%2Fvalues_at.rb;h=337104207256a204a6534538ae577b2192f2f472;hb=30caaa85aed7015ca0d77216bff175eebd917eb7;hp=04a3d1ac40abfe0b0dd62a0a50797fc8744fc640;hpb=6963202b4b62c2816655ac9532521b018fdf83bd;p=mirror%2Fdsa-puppet.git diff --git a/3rdparty/modules/stdlib/lib/puppet/parser/functions/values_at.rb b/3rdparty/modules/stdlib/lib/puppet/parser/functions/values_at.rb index 04a3d1ac4..337104207 100644 --- a/3rdparty/modules/stdlib/lib/puppet/parser/functions/values_at.rb +++ b/3rdparty/modules/stdlib/lib/puppet/parser/functions/values_at.rb @@ -1,33 +1,42 @@ # # values_at.rb # - module Puppet::Parser::Functions - newfunction(:values_at, :type => :rvalue, :doc => <<-EOS -Finds value inside an array based on location. + newfunction(:values_at, :type => :rvalue, :doc => <<-DOC + @summary + Finds value inside an array based on location. + + The first argument is the array you want to analyze, and the second element can + be a combination of: -The first argument is the array you want to analyze, and the second element can -be a combination of: + * A single numeric index + * A range in the form of 'start-stop' (eg. 4-9) + * An array combining the above -* A single numeric index -* A range in the form of 'start-stop' (eg. 4-9) -* An array combining the above + @return + an array of values identified by location -*Examples*: + @example **Usage** - values_at(['a','b','c'], 2) + values_at(['a','b','c'], 2) + Would return ['c'] -Would return ['c']. + values_at(['a','b','c'], ["0-1"]) + Would return ['a','b'] - values_at(['a','b','c'], ["0-1"]) + values_at(['a','b','c','d','e'], [0, "2-3"]) + Would return ['a','c','d'] -Would return ['a','b']. + > *Note:* + Since Puppet 4.0.0 it is possible to slice an array with index and count directly in the language. + A negative value is taken to be "from the end" of the array: - values_at(['a','b','c','d','e'], [0, "2-3"]) + `['a', 'b', 'c', 'd'][1, 2]` results in `['b', 'c']` + `['a', 'b', 'c', 'd'][2, -1]` results in `['c', 'd']` + `['a', 'b', 'c', 'd'][1, -2]` results in `['b', 'c']` -Would return ['a','c','d']. - EOS - ) do |arguments| + DOC + ) do |arguments| raise(Puppet::ParseError, "values_at(): Wrong number of arguments given (#{arguments.size} for 2)") if arguments.size < 2 @@ -37,38 +46,35 @@ Would return ['a','c','d']. raise(Puppet::ParseError, 'values_at(): Requires array to work with') end - indices = [arguments.shift].flatten() # Get them all ... Pokemon ... + indices = [arguments.shift].flatten # Get them all ... Pokemon ... - if not indices or indices.empty? + if !indices || indices.empty? raise(Puppet::ParseError, 'values_at(): You must provide at least one positive index to collect') end - result = [] indices_list = [] indices.each do |i| i = i.to_s - if m = i.match(/^(\d+)(\.\.\.?|\-)(\d+)$/) + m = i.match(%r{^(\d+)(\.\.\.?|\-)(\d+)$}) + if m start = m[1].to_i stop = m[3].to_i type = m[2] - if start > stop - raise(Puppet::ParseError, 'values_at(): Stop index in given indices range is smaller than the start index') - elsif stop > array.size - 1 # First element is at index 0 is it not? - raise(Puppet::ParseError, 'values_at(): Stop index in given indices range exceeds array size') - end + raise(Puppet::ParseError, 'values_at(): Stop index in given indices range is smaller than the start index') if start > stop + raise(Puppet::ParseError, 'values_at(): Stop index in given indices range exceeds array size') if stop > array.size - 1 # First element is at index 0 is it not? range = case type - when /^(\.\.|\-)$/ then (start .. stop) - when /^(\.\.\.)$/ then (start ... stop) # Exclusive of last element ... - end + when %r{^(\.\.|\-)$} then (start..stop) + when %r{^(\.\.\.)$} then (start...stop) # Exclusive of last element ... + end - range.each { |i| indices_list << i.to_i } + range.each { |i| indices_list << i.to_i } # rubocop:disable Lint/ShadowingOuterLocalVariable : Value is meant to be shadowed else # Only positive numbers allowed in this case ... - if not i.match(/^\d+$/) + unless i =~ %r{^\d+$} raise(Puppet::ParseError, 'values_at(): Unknown format of given index') end @@ -84,7 +90,7 @@ Would return ['a','c','d']. end # We remove nil values as they make no sense in Puppet DSL ... - result = indices_list.collect { |i| array[i] }.compact + result = indices_list.map { |i| array[i] }.compact return result end