class Mech::Producer::Common

Public Instance Methods

produce() click to toggle source
# File lib/mech/producer/common.rb, line 3
def produce
  build_merge_graph
  merge_recursive
end

Protected Instance Methods

build_extend_object(path, pattern) click to toggle source
# File lib/mech/producer/common.rb, line 66
def build_extend_object(path, pattern)
  paths = path.split('/')
  paths.pop
  path = paths.join('/') + '.yml'

  if File.exist?(path)
    obj = Psych.load(File.read(path))
    pattern = pattern.deep_merge(obj || {})
  end

  if path =~ Regexp.new(config.src_path)
    pattern = build_extend_object(path, pattern)
  end

  pattern
end
build_merge_graph() click to toggle source
# File lib/mech/producer/common.rb, line 10
def build_merge_graph
  @paths_with_deep = @paths.map do |path|
    path_deep = path.split('/').size
    [path, path_deep]
  end
  @paths_with_deep.sort_by! { |p| p[1] }
  @min_path_deep = @paths_with_deep.first[1]
  @max_path_deep = @paths_with_deep.last[1]
end
get_meta_data(meta_type) click to toggle source
# File lib/mech/producer/common.rb, line 61
def get_meta_data(meta_type)
  path = File.join(config.src_path, "#{meta_type}.yml")
  yaml = Psych.load(File.read(path))
end
merge_recursive() click to toggle source
# File lib/mech/producer/common.rb, line 20
def merge_recursive
  @paths_with_deep.delete_if { |p| p[0] == '/common.yml' }
  @common_obj = YAML.load(File.read(config.src_path + '/common.yml'))

  @stored_paths = @paths_with_deep.select { |p, d|
    d == @max_path_deep
  }.map(&:first)

  merged_items_by_path = @stored_paths.map do |stored_path|
    extend_obj = build_extend_object(stored_path, {})
    objs = Psych.load(File.read(stored_path))

    objs.each do |name, obj|
      objs[name] = @common_obj.deep_merge(extend_obj.deep_merge(obj))
    end

    env_path = File.join(config.src_path, config.env)
    tail_path = stored_path.gsub(env_path, '')
    meta_type = tail_path.split('/')[1]

    [meta_type, objs]
  end

  items_by_meta_type = {}
  merged_items_by_path.each do |meta, items|
    items_by_meta_type[meta] ||= {}
    items_by_meta_type[meta].deep_merge!(items)
  end

  merged_items_by_meta_type = {}
  items_by_meta_type.each do |meta, items|
    meta_data = get_meta_data(meta)
    items.each do |name, item|
      item = meta_data.deep_merge(item)
      items_by_meta_type[meta][name] = item
    end
  end

  items_by_meta_type
end