class AnsibleDocGenerator::DocGenerator::Interpolator::VariableExtractor

Attributes

input[R]
role_path[R]
task[R]

Public Class Methods

new(input, task, role_path) click to toggle source
# File lib/ansible_doc_generator/doc_generator/interpolator/variable_extractor.rb, line 12
def initialize input, task, role_path
  @input = input
  @task = task
  @role_path = role_path
  @filters = {
    join: ', '
  }
end

Public Instance Methods

call() click to toggle source
# File lib/ansible_doc_generator/doc_generator/interpolator/variable_extractor.rb, line 21
def call
  output = input

  input.scan(/#\{[^\}]+\}/).each do |interpolation|
    new_string = get_string(interpolation)
    output.gsub!(interpolation, new_string)
  end

  output
end

Private Instance Methods

dig(task, keys) click to toggle source
# File lib/ansible_doc_generator/doc_generator/interpolator/variable_extractor.rb, line 55
def dig task, keys
  head, *tail = keys
  new_task = task[head]

  raise MissingInterpolationError if new_task.nil?

  if tail == []
    return new_task
  elsif new_task.is_a?(String) && tail != []
    return scan_in_inline_syntax(new_task, tail.first)
  else
    dig(new_task, tail)
  end
end
get_string(interpolation) click to toggle source
# File lib/ansible_doc_generator/doc_generator/interpolator/variable_extractor.rb, line 34
def get_string interpolation
  variable_match = interpolation.match(/#\{([^\}]+)\}/)[1]
  yaml_path, filters = variable_match.split('|')
  set_filters(filters)
  yaml_value = dig(task, yaml_path.gsub(/\s/, '').split('>'))

  case yaml_value
  when String then yaml_value
  when Array then yaml_value.join(@filters[:join])
  else interpolation
  end
rescue MissingInterpolationError => e
  raise e, "Interpolation not found:\n - #{interpolation}\n - #{task}\n - #{role_path}"
end
scan_in_inline_syntax(string, key) click to toggle source
# File lib/ansible_doc_generator/doc_generator/interpolator/variable_extractor.rb, line 70
def scan_in_inline_syntax string, key
  input = StringScanner.new(string)

  # Scan until the key we are looking for
  input.scan_until(/#{key}=/)
  # Scan until the next key or until the end
  output = input.scan_until(/\s{1}\S+=/) || input.scan(/.*/)
  # Remove the next key part
  output.gsub(/\s{1}\S+=/, '')
end
set_filters(filters) click to toggle source
# File lib/ansible_doc_generator/doc_generator/interpolator/variable_extractor.rb, line 49
def set_filters(filters)
  return if filters.nil?
  filter_name, filter_value = filters.split(':')
  @filters[filter_name.gsub(/\s/, '').to_sym] = eval(filter_value)
end