module Config::Factory::AbstractFactory

Attributes

impl_key[R]

Public Class Methods

extended(mod) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 27
def self.extended(mod)
  filter_registry = {}
  mod.define_singleton_method(:can_build_if) do |&block|
    filter_registry[self] = block
  end
  mod.define_singleton_method(:filters_by_impl_class) { filter_registry }
end

Public Instance Methods

build_from(arg_hash, section_name = nil, env_name = nil) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 46
def build_from(arg_hash, section_name = nil, env_name = nil)
  raise ArgumentError, "nil argument hash passed to #{self}.build_from" unless arg_hash
  args = deep_symbolize_keys(arg_hash)
  args = args[section_name] if section_name
  impl_class = find_impl_class(args)
  begin
    return create_impl(impl_class, args, env_name)
  rescue StandardError => e
    raise ArgumentError, "Error instantiating #{impl_class} with arguments #{args}: #{e}"
  end
end
for_environment(env, config_name) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 35
def for_environment(env, config_name)
  arg_hash = env.args_for(config_name)
  raise ArgumentError, "no #{self} arguments found for config #{config_name} in environment #{env}" unless arg_hash
  build_from(arg_hash, nil, env.name)
end
from_file(path, config_name) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 41
def from_file(path, config_name)
  env = Environment.load_file(path)
  for_environment(env, config_name)
end
key(k) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 19
def key(k)
  @impl_key = k
  registry = impls_by_key
  define_singleton_method(k) do |v|
    registry[v] = self
  end
end

Private Instance Methods

create_impl(impl_class, args, env_name) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 88
def create_impl(impl_class, args, env_name)
  factory_impl = impl_class.new(args)
  factory_impl.instance_variable_set(:@env_name, env_name)
  factory_impl
end
deep_symbolize_keys(val) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 77
def deep_symbolize_keys(val)
  return val unless val.is_a?(Hash)
  val.map do |k, v|
    [k.respond_to?(:to_sym) ? k.to_sym : k, deep_symbolize_keys(v)]
  end.to_h
end
find_impl_class(args) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 60
def find_impl_class(args)
  pk = impl_key
  return impl_for_key(pk, args) if pk
  filters_by_impl_class.each_pair do |impl_class, filter|
    return impl_class if filter.call(args)
  end
  self
end
impl_for_key(key_sym, args) click to toggle source
# File lib/config/factory/abstract_factory.rb, line 69
def impl_for_key(key_sym, args)
  raise ArgumentError, "implementation key #{key_sym} not found in argument hash #{args || 'nil'}" unless args&.key?(key_sym)
  key_value = args.delete(key_sym)
  impl_class = impls_by_key[key_value]
  raise ArgumentError, "No #{name} implementation found for #{key_sym}: #{key_value}" unless impl_class
  impl_class
end
impls_by_key() click to toggle source
# File lib/config/factory/abstract_factory.rb, line 84
def impls_by_key
  @impls_by_key ||= {}
end