class Configature::Namespace

Constants

BOOLEAN_EQUIVALENT

Constants ============================================================

RECAST_AS

Attributes

config_name[R]
env_name_prefix[R]
name[R]

Properties ===========================================================

namespaces[R]
parameters[R]

Public Class Methods

new(name = nil, env_name_prefix: '', env_suffix: '', extends: nil) { |self| ... } click to toggle source

Instance Methods =====================================================

# File lib/configature/namespace.rb, line 52
def initialize(name = nil, env_name_prefix: '', env_suffix: '', extends: nil)
  @name = name&.to_sym
  @extends = extends
  @env = extends&.instance_variable_get(:@env)
  @env_default = extends&.instance_variable_get(:@env_default)
  @namespaces = extends&.namespaces&.dup || { }
  @parameters = extends&.parameters&.dup || { }
  @env_suffix = env_suffix
  @env_name_prefix = name ? Configature::Support.extend_env_prefix(env_name_prefix, name) : ''

  @config_name = extends&.config_name || name

  yield(self) if (block_given?)
end

Public Instance Methods

[](name) click to toggle source
# File lib/configature/namespace.rb, line 118
def [](name)
  @parameters[name] or @namespaces[name]
end
__instantiate(source: nil, env: ENV) click to toggle source
# File lib/configature/namespace.rb, line 126
def __instantiate(source: nil, env: ENV)
  if (@env and source)
    env_key = @env.map { |e| env[e] }.first || @env_default

    if (@env_suffix)
      env_key += @env_suffix
    end

    source = source[env_key] || source[env_key.to_sym]
  end

  self.__instantiate_branch(source: source, env: env)
end
__instantiate_branch(source: nil, env: nil) click to toggle source
# File lib/configature/namespace.rb, line 140
def __instantiate_branch(source: nil, env: nil)
  Configature::Data.new(
    @parameters.values.map do |param|
      name = param[:name]
      name_s = name.to_s
      name_sym = name_s.to_sym

      value = (param[:env] && env && env[param[:env]]) ||
        source && (source[name_s] || source[name_sym])

      case (remap = param[:remap])
      when Hash, Proc
        value = remap[value] || value
      end

      if (!value.nil? and as = param[:as])
        value = as[value]
      end

      [ param[:name], value.nil? ? param[:default].call : value ]
    end.to_h.merge(
      @namespaces.map do |name, namespace|
        [
          name,
          namespace.__instantiate_branch(
            source: source && (source[name] || source[name.to_s]),
            env: env
          )
        ]
      end.to_h
    )
  )
end
env(*names, default: 'development') click to toggle source
# File lib/configature/namespace.rb, line 87
def env(*names, default: 'development')
  @env = names.map(&:to_s).freeze
  @env_default = default
end
method_missing(name, **options) click to toggle source
# File lib/configature/namespace.rb, line 122
def method_missing(name, **options)
  parameter(name, **options)
end
namespace(name, env_suffix: '', extends: nil, &block) click to toggle source
# File lib/configature/namespace.rb, line 67
def namespace(name, env_suffix: '', extends: nil, &block)
  name = name.to_sym

  @namespaces[name] = self.class.new(
    name,
    env_suffix: env_suffix,
    extends: extends && self.namespaces[extends],
    env_name_prefix: @env_name_prefix
  ).tap do |n|
    case (block&.arity)
    when nil
      nil
    when 1
      block[n]
    else
      n.instance_eval(&block)
    end
  end
end
parameter(parameter_name, default: nil, as: nil, name: nil, env: nil, remap: nil) click to toggle source
# File lib/configature/namespace.rb, line 92
def parameter(parameter_name, default: nil, as: nil, name: nil, env: nil, remap: nil)
  name ||= parameter_name
  as ||= default.is_a?(Array) ? :array : :string

  case (as)
  when Class, Symbol
    as = RECAST_AS[as]
  end

  @parameters[name] = {
    name: name,
    default: default.is_a?(Proc) ? default : -> { default },
    as: as,
    remap: remap,
    env:
      case (env)
      when false
        false
      when nil
        Configature::Support.extend_env_prefix(@env_name_prefix, name)
      else
        env
      end
  }
end