Class: AnywayAppConfig::Config

Inherits:
Anyway::Config
  • Object
show all
Defined in:
lib/anyway_app_config/config.rb

Constant Summary collapse

BaseNestedCfgClass =
Class.new(self)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(overrides = nil, config_path: nil, **kwargs) ⇒ Config

Returns a new instance of Config.



98
99
100
101
102
103
104
105
106
107
108
# File 'lib/anyway_app_config/config.rb', line 98

def initialize(overrides = nil, config_path: nil, **kwargs)
  @explicit_config_path = calc_explicit_config_path(config_path)

  if overrides.nil? && !kwargs.empty?
    overrides = kwargs
  elsif !kwargs.empty?
    raise ArgumentError, "unknown keywords: #{kwargs.keys.join(', ')}"
  end

  super(overrides)
end

Class Method Details

.attr_nested(name, array: false, required: false, &block) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/anyway_app_config/config.rb', line 37

def attr_nested(name, array: false, required: false, &block)
  nested_klass = Class.new(nested_config_class)
  const_set("#{name.to_s.classify}Cfg", nested_klass)
  # nested_klass.config_name represents path to config struct in main config file
  if self < nested_config_class
    # nested inside another nested config
    nested_klass.config_name :"#{config_name}.#{name}"
  else
    # nested in main config
    nested_klass.config_name name.to_sym
  end
  nested_klass.configuration_sources = []
  nested_klass.class_eval(&block) if block

  if array
    attr_config(name => [])
    caster = ->(v) { nested_klass.new(v) }
    coerce_types(name => { type: caster, array: true })
  else
    attr_config(name => {})
    coerce_types(name => { config: nested_klass })
  end

  self.required(name) if required
end

.attr_value(name, type:, array: false, default: nil, required: false) ⇒ Object



30
31
32
33
34
35
# File 'lib/anyway_app_config/config.rb', line 30

def attr_value(name, type:, array: false, default: nil, required: false)
  default_val = default.nil? && array ? [] : default
  attr_config(name => default_val)
  coerce_types(name => { type: type, array: array })
  self.required(name) if required
end

.attribute(name, type: nil, array: false, default: nil, required: false, &block) ⇒ Object



19
20
21
22
23
24
25
26
27
28
# File 'lib/anyway_app_config/config.rb', line 19

def attribute(name, type: nil, array: false, default: nil, required: false, &block)
  if block
    raise ArgumentError, "nested attribute #{name} does not support type" unless type.nil?
    raise ArgumentError, "nested attribute #{name} does not support default" unless default.nil?

    attr_nested(name, array: array, required: required, &block)
  else
    attr_value(name, type: type, array: array, default: default, required: required)
  end
end

.load!Object



63
64
65
# File 'lib/anyway_app_config/config.rb', line 63

def load!(*, **)
  new(*, **).tap(&:deep_freeze_values!)
end

.type_casterObject



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/anyway_app_config/config.rb', line 84

def type_caster
  @type_caster ||=
    if coercion_mapping.empty?
      fallback_type_caster
    else
      ::Anyway::TypeCaster.new(
        coercion_mapping,
        registry: type_registry,
        fallback: fallback_type_caster
      )
    end
end

.type_registryObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/anyway_app_config/config.rb', line 67

def type_registry
  return @type_registry if instance_variable_defined?(:@type_registry)

  @type_registry =
    if superclass < AnywayAppConfig::Config
      superclass.type_registry.dup
    else
      ::Anyway::TypeRegistry.default.dup.tap do |r|
        r.accept(:hash) do |v|
          raise ArgumentError, "expected Hash, got #{v.class}" unless v.is_a?(::Hash)

          v
        end
      end
    end
end

Instance Method Details

#deep_freeze_values!Object Also known as: deep_freeze!



110
111
112
113
# File 'lib/anyway_app_config/config.rb', line 110

def deep_freeze_values!
  deep_freeze_value(values)
  self
end

#load(overrides = nil) ⇒ Object



117
118
119
120
# File 'lib/anyway_app_config/config.rb', line 117

def load(overrides = nil)
  overrides = overrides.deep_stringify_keys if overrides.is_a?(::Hash)
  super
end

#resolve_config_path(name, env_prefix) ⇒ Object



122
123
124
# File 'lib/anyway_app_config/config.rb', line 122

def resolve_config_path(name, env_prefix)
  @explicit_config_path || super
end