Class: CemAcpt::Config::Base
- Inherits:
-
Object
- Object
- CemAcpt::Config::Base
- Defined in:
- lib/cem_acpt/config/base.rb
Overview
Base class for other config classes Child classes should provide the following constant:
- VALID_KEYS - provide an array of valid top-level keys for the config as symbols
Child classes should implement the following methods:
- defaults - provide a hash of default values for the config
- env_var_prefix - provide a string to prefix environment variables with (defaults to 'CEM_ACPT').
This will be converted to uppercase, have all non-alphanumeric characters replaced with
underscores, and be joined with the key name with an underscore to form the environment
variable name.
However, they can override any of the methods in this class.
Direct Known Subclasses
Constant Summary collapse
- BASE_VALID_KEYS =
%i[ ci_mode config_file log_level log_file log_format no_destroy_nodes no_ephemeral_ssh_key platform provisioner puppet quiet terraform user_config verbose ].freeze
Instance Attribute Summary collapse
-
#config ⇒ Object
(also: #to_h)
readonly
Returns the value of attribute config.
-
#env_vars ⇒ Object
readonly
Returns the value of attribute env_vars.
Instance Method Summary collapse
- #[](key) ⇒ Object
- #ci_mode? ⇒ Boolean (also: #ci?)
- #debug_mode? ⇒ Boolean (also: #debug?)
-
#defaults ⇒ Hash
The default configuration.
- #empty? ⇒ Boolean
-
#env_var_prefix ⇒ String
The prefix for environment variables.
-
#explain ⇒ Object
Returns a string representation of how the config was loaded.
- #get(dot_key) ⇒ Object (also: #dget)
- #has?(dot_key) ⇒ Boolean
-
#initialize(opts: {}, config_file: nil, load_user_config: true) ⇒ Base
constructor
A new instance of Base.
- #inspect ⇒ Object
-
#load(opts: {}, config_file: nil) ⇒ self
Load the configuration from the environment variables, config file, and opts The order of precedence is: 1.
- #quiet_mode? ⇒ Boolean (also: #quiet?)
- #to_json(*args) ⇒ Object
- #to_yaml ⇒ Object
-
#valid_keys ⇒ Array<Symbol>
Valid top-level keys for the config.
- #verbose_mode? ⇒ Boolean (also: #verbose?)
Constructor Details
#initialize(opts: {}, config_file: nil, load_user_config: true) ⇒ Base
Returns a new instance of Base.
45 46 47 48 |
# File 'lib/cem_acpt/config/base.rb', line 45 def initialize(opts: {}, config_file: nil, load_user_config: true) @load_user_config = load_user_config load(opts: opts, config_file: config_file) end |
Instance Attribute Details
#config ⇒ Object (readonly) Also known as: to_h
Returns the value of attribute config.
43 44 45 |
# File 'lib/cem_acpt/config/base.rb', line 43 def config @config end |
#env_vars ⇒ Object (readonly)
Returns the value of attribute env_vars.
43 44 45 |
# File 'lib/cem_acpt/config/base.rb', line 43 def env_vars @env_vars end |
Instance Method Details
#[](key) ⇒ Object
120 121 122 123 124 125 126 127 128 |
# File 'lib/cem_acpt/config/base.rb', line 120 def [](key) if key.is_a?(Symbol) @config[key].dup elsif key.is_a?(String) get(key) else raise ArgumentError, "Invalid key type '#{key.class}'" end end |
#ci_mode? ⇒ Boolean Also known as: ci?
143 144 145 |
# File 'lib/cem_acpt/config/base.rb', line 143 def ci_mode? !!get('ci_mode') || !!(ENV['GITHUB_ACTIONS'] || ENV['CI']) end |
#debug_mode? ⇒ Boolean Also known as: debug?
148 149 150 |
# File 'lib/cem_acpt/config/base.rb', line 148 def debug_mode? get('log_level') == 'debug' end |
#defaults ⇒ Hash
Returns The default configuration.
69 70 71 |
# File 'lib/cem_acpt/config/base.rb', line 69 def defaults {} end |
#empty? ⇒ Boolean
139 140 141 |
# File 'lib/cem_acpt/config/base.rb', line 139 def empty? @config.empty? end |
#env_var_prefix ⇒ String
Returns The prefix for environment variables.
55 56 57 |
# File 'lib/cem_acpt/config/base.rb', line 55 def env_var_prefix 'CEM_ACPT' end |
#explain ⇒ Object
Returns a string representation of how the config was loaded
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/cem_acpt/config/base.rb', line 102 def explain explanation = {} %i[defaults env_vars user_config config_from_file options].each do |source| source_vals = send(source).dup next if source_vals.nil? || source_vals.empty? # The loop below will overwrite the value of explanation[key] if the same key is found in multiple sources # This is intentional, as the last source to set the value is the one that should be used source_vals.each do |key, value| explanation[key] = source if @config.dget(key.to_s) == value end end explained = explanation.each_with_object([]) do |(key, value), ary| ary << "Key '#{key}' from source '#{value}'" end explained.join("\n") end |
#get(dot_key) ⇒ Object Also known as: dget
130 131 132 |
# File 'lib/cem_acpt/config/base.rb', line 130 def get(dot_key) @dot_key_cache[dot_key] ||= @config.dget(dot_key).dup end |
#has?(dot_key) ⇒ Boolean
135 136 137 |
# File 'lib/cem_acpt/config/base.rb', line 135 def has?(dot_key) !!get(dot_key) end |
#inspect ⇒ Object
50 51 52 |
# File 'lib/cem_acpt/config/base.rb', line 50 def inspect "#<#{self.class}:#{object_id.to_s(16)}>" end |
#load(opts: {}, config_file: nil) ⇒ self
Load the configuration from the environment variables, config file, and opts The order of precedence is:
1. environment variables
2. user config file (config.yaml in user_config_dir)
3. specified config file (if it exists)
4. opts
5. static options (set in this class)
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/cem_acpt/config/base.rb', line 83 def load(opts: {}, config_file: nil) create_config_dirs! init_config!(opts: opts, config_file: config_file) add_env_vars!(@config) @config.merge!(user_config) if user_config && @load_user_config @config.merge!(config_from_file) if config_from_file @config.merge!(@options) if @options (@config) @config.format! # Symbolize keys of all hashes validate_config! @dot_key_cache = {} # Freeze the config so it can't be modified # This helps with thread safety and deterministic behavior @config.freeze self end |
#quiet_mode? ⇒ Boolean Also known as: quiet?
158 159 160 |
# File 'lib/cem_acpt/config/base.rb', line 158 def quiet_mode? !!get('quiet') end |
#to_json(*args) ⇒ Object
167 168 169 |
# File 'lib/cem_acpt/config/base.rb', line 167 def to_json(*args) @config.to_json(*args) end |
#to_yaml ⇒ Object
163 164 165 |
# File 'lib/cem_acpt/config/base.rb', line 163 def to_yaml @config.to_yaml end |
#valid_keys ⇒ Array<Symbol>
Returns Valid top-level keys for the config.
60 61 62 63 64 65 66 |
# File 'lib/cem_acpt/config/base.rb', line 60 def valid_keys if self.class.const_defined?(:VALID_KEYS) (BASE_VALID_KEYS + self.class.const_get(:VALID_KEYS)).uniq else BASE_VALID_KEYS end end |
#verbose_mode? ⇒ Boolean Also known as: verbose?
153 154 155 |
# File 'lib/cem_acpt/config/base.rb', line 153 def verbose_mode? !!get('verbose') end |