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.
-
#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
116 117 118 119 120 121 122 123 124 |
# File 'lib/cem_acpt/config/base.rb', line 116 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?
139 140 141 |
# File 'lib/cem_acpt/config/base.rb', line 139 def ci_mode? !!get('ci_mode') || !!(ENV['GITHUB_ACTIONS'] || ENV['CI']) end |
#debug_mode? ⇒ Boolean Also known as: debug?
144 145 146 |
# File 'lib/cem_acpt/config/base.rb', line 144 def debug_mode? get('log_level') == 'debug' end |
#defaults ⇒ Hash
Returns The default configuration.
65 66 67 |
# File 'lib/cem_acpt/config/base.rb', line 65 def defaults {} end |
#empty? ⇒ Boolean
135 136 137 |
# File 'lib/cem_acpt/config/base.rb', line 135 def empty? @config.empty? end |
#env_var_prefix ⇒ String
Returns The prefix for environment variables.
51 52 53 |
# File 'lib/cem_acpt/config/base.rb', line 51 def env_var_prefix 'CEM_ACPT' end |
#explain ⇒ Object
Returns a string representation of how the config was loaded
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/cem_acpt/config/base.rb', line 98 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
126 127 128 |
# File 'lib/cem_acpt/config/base.rb', line 126 def get(dot_key) @dot_key_cache[dot_key] ||= @config.dget(dot_key).dup end |
#has?(dot_key) ⇒ Boolean
131 132 133 |
# File 'lib/cem_acpt/config/base.rb', line 131 def has?(dot_key) !!get(dot_key) 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)
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/cem_acpt/config/base.rb', line 79 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?
154 155 156 |
# File 'lib/cem_acpt/config/base.rb', line 154 def quiet_mode? !!get('quiet') end |
#to_json(*args) ⇒ Object
163 164 165 |
# File 'lib/cem_acpt/config/base.rb', line 163 def to_json(*args) @config.to_json(*args) end |
#to_yaml ⇒ Object
159 160 161 |
# File 'lib/cem_acpt/config/base.rb', line 159 def to_yaml @config.to_yaml end |
#valid_keys ⇒ Array<Symbol>
Returns Valid top-level keys for the config.
56 57 58 59 60 61 62 |
# File 'lib/cem_acpt/config/base.rb', line 56 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?
149 150 151 |
# File 'lib/cem_acpt/config/base.rb', line 149 def verbose_mode? !!get('verbose') end |