lib/percheron/config.rb in percheron-0.6.4 vs lib/percheron/config.rb in percheron-0.7.0

- old
+ new

@@ -1,42 +1,103 @@ require 'yaml' module Percheron class Config + DEFAULT_CONFIG_FILE = '.percheron.yml' + extend Forwardable def_delegators :contents, :docker def initialize(file) @file = Pathname.new(file).expand_path - valid? docker_setup! self end def stacks - contents.stacks.to_hash_by_key(:name) + process_stacks! end def file_base_path file.dirname end def valid? Validators::Config.new(file).valid? end + def self.load!(config_file = DEFAULT_CONFIG_FILE) + new(config_file) + end + private attr_reader :file + # rubocop:disable Metrics/MethodLength + def process_stacks! # FIXME: bugs here :( + stacks_by_name = contents.stacks.to_hash_by_key(:name) + scanned = scan_container_configs(stacks_by_name) + stacks_by_name.each do |_, stack| + stack_containers = stack.containers.each_with_object({}) do |container_config, all| + if scanned[container_config.name] + merge(all, container_config, scanned) + else + replace_scanned(all, container_config, scanned) + end + end + stack.containers = stack_containers + end + end + # rubocop:enable Metrics/MethodLength + + def merge(all, container_config, scanned) # FIXME: poor name + all.merge!(expand_container_config(container_config, scanned[container_config.name])) + end + + def replace_scanned(all, container_config, scanned) # FIXME: poor name + match = container_config.fetch(:dependant_container_names, []) + unless (match & scanned.keys).empty? + container_config.dependant_container_names = match.map { |v| scanned[v] }.flatten + end + all[container_config.name] = container_config + end + + def scan_container_configs(stacks_by_name) # FIXME + all = {} + stacks_by_name.each do |_, stack| + stack.containers.each do |container_config| + next if container_config.fetch(:instances, 1) == 1 + all[container_config.name] = 1.upto(container_config.instances).map do |number| + "#{container_config.name}#{number}" + end + end + end + all + end + + def expand_container_config(container_config, new_container_names) # FIXME + new_container_names.each_with_object({}) do |new_name, all| + temp_container_config = container_config.dup + temp_container_config.delete(:instances) + temp_container_config.pseudo_name = container_config.name + temp_container_config.name = new_name + all[new_name] = eval_container_config(temp_container_config) + end + end + + def eval_container_config(container_config) + template = Liquid::Template.parse(container_config.to_h.to_yaml.to_s) + YAML.load(template.render(container_config)) + end + def contents Hashie::Mash.new(YAML.load_file(file)) end def docker_setup! Percheron::DockerConnection.new(self).setup! end - end end