module ConfigVolumizer::Parser

Public Class Methods

parse(source, mapping) click to toggle source

Parses keys within the {source} hash matching {base_name} returning a hash with all the matched data under a string key matching the {base_name}

See Readme for an example

@param [Hash] source @param [Hash] mapping @return [Hash]

# File lib/config_volumizer/parser.rb, line 18
def parse(source, mapping)
  result = {}
  mapping.each do |mapping_key, mapping_info|
    source.each do |key, value|
      if matches_name(mapping_key, key)
        handle_item(result, key, value, mapping_key, mapping_info)
      end
    end
  end
  result
end

Private Class Methods

format_array_value(value) click to toggle source
# File lib/config_volumizer/parser.rb, line 40
def format_array_value(value)
  CSV.parse_line(value).map { |inner_value| format_value(inner_value) }
end
format_value(value) click to toggle source
# File lib/config_volumizer/parser.rb, line 36
def format_value(value)
  YAML.load(value)
end
handle_array_hash_item(inner_mapping_info, mapping_key, name, result, value) click to toggle source
# File lib/config_volumizer/parser.rb, line 86
def handle_array_hash_item(inner_mapping_info, mapping_key, name, result, value)
  new_name = name.gsub(/^#{mapping_key}_(\d+)(?:_)?/, '')
  index = $~[1].to_i
  handle_item(result[mapping_key], new_name, value, index, inner_mapping_info)
end
handle_array_item(mapping_info, mapping_key, name, result, value) click to toggle source
# File lib/config_volumizer/parser.rb, line 72
def handle_array_item(mapping_info, mapping_key, name, result, value)
  result[mapping_key] ||= []
  mapping_info.each do |inner_mapping_info|
    case inner_mapping_info
    when :value
      result[mapping_key] += format_array_value(value)
    when :hash, Hash
      handle_array_hash_item(inner_mapping_info, mapping_key, name, result, value)
    else
      raise "don't know how to handle: #{inner_mapping_info.inspect}"
    end
  end
end
handle_hash_item(mapping_info, mapping_key, name, result, value) click to toggle source
# File lib/config_volumizer/parser.rb, line 62
def handle_hash_item(mapping_info, mapping_key, name, result, value)
  result[mapping_key] ||= {}
  new_name = name.gsub(/^#{mapping_key}_/, '')
  mapping_info.each do |inner_mapping_key, inner_mapping_info|
    if matches_name(inner_mapping_key, new_name)
      handle_item(result[mapping_key], new_name, value, inner_mapping_key, inner_mapping_info)
    end
  end
end
handle_item(result, name, value, mapping_key, mapping_info) click to toggle source
# File lib/config_volumizer/parser.rb, line 44
def handle_item(result, name, value, mapping_key, mapping_info)
  case mapping_info
  when Array
    handle_array_item(mapping_info, mapping_key, name, result, value)
  when Hash
    handle_hash_item(mapping_info, mapping_key, name, result, value)
  when :value
    result[mapping_key] = format_value(value)
  when :hash
    new_name = name.gsub(/^#{mapping_key}_/, '')
    result[mapping_key] ||= {}
    result[mapping_key][new_name] = format_value(value)
  else
    raise ArgumentError, "don't know how to deal with #{mapping_info.inspect}"
  end

end
matches_name(base_name, key) click to toggle source
# File lib/config_volumizer/parser.rb, line 32
def matches_name(base_name, key)
  key == base_name || key =~ /^#{base_name}_/
end