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