class Persey::Builder

Public Class Methods

build(environment, defaults, &block) click to toggle source
# File lib/persey/builder.rb, line 6
def build(environment, defaults, &block)
  b = new(environment, defaults, block)
  Configus::Config.new(b.result)
end
new(environment, defaults, block) click to toggle source
# File lib/persey/builder.rb, line 12
def initialize(environment, defaults, block)
  @current_env = environment
  @config = defaults
  @envs = {}
  instance_eval(&block)
end

Public Instance Methods

result(env = nil) click to toggle source
# File lib/persey/builder.rb, line 19
def result(env = nil)
  e = env || @current_env
  edata = @envs[e]

  raise ArgumentError, "Undefined environment '#{ env }" if edata.nil?

  current_config = {}
  if edata[:block]
    current_config = expand(edata[:block])
  end

  parent = edata[:options][:parent]
  if parent
    parent_config = result(parent)
    current_config = deep_merge(parent_config, current_config)
  end

  current_config = @config.deep_merge(current_config)
end

Private Instance Methods

deep_merge(target, source) click to toggle source
# File lib/persey/builder.rb, line 50
def deep_merge(target, source)
  source.each_pair do |k,v|
    tv = target[k]
    target[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? deep_merge(tv, v) : v
  end
  target
end
env(env, options = {}, &block) click to toggle source
# File lib/persey/builder.rb, line 41
def env(env, options = {}, &block)
  env = env.to_sym

  raise ArgumentError, "Double definition of environment '#{ env }'" if @envs.has_key?(env)

  @envs[env] = { options: options }
  @envs[env][:block] = block if block_given?
end
expand(block) click to toggle source
# File lib/persey/builder.rb, line 62
def expand(block)
  Configus::Proxy.generate(block)
end
source(*args) click to toggle source
# File lib/persey/builder.rb, line 58
def source(*args)
  # Nothing. It's Inspector method
end