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 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.
44 45 46 47 |
# File 'lib/cem_acpt/config/base.rb', line 44 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.
42 43 44 |
# File 'lib/cem_acpt/config/base.rb', line 42 def config @config end |
#env_vars ⇒ Object (readonly)
Returns the value of attribute env_vars.
42 43 44 |
# File 'lib/cem_acpt/config/base.rb', line 42 def env_vars @env_vars end |
Instance Method Details
#[](key) ⇒ Object
114 115 116 117 118 119 120 121 122 |
# File 'lib/cem_acpt/config/base.rb', line 114 def [](key) if key.is_a?(Symbol) @config[key].dup elsif key.is_a?(String) @config.dget(key).dup else raise ArgumentError, "Invalid key type '#{key.class}'" end end |
#ci_mode? ⇒ Boolean Also known as: ci?
137 138 139 |
# File 'lib/cem_acpt/config/base.rb', line 137 def ci_mode? !!get('ci_mode') || !!(ENV['GITHUB_ACTIONS'] || ENV['CI']) end |
#debug_mode? ⇒ Boolean Also known as: debug?
142 143 144 |
# File 'lib/cem_acpt/config/base.rb', line 142 def debug_mode? get('log_level') == 'debug' end |
#defaults ⇒ Hash
Returns The default configuration.
64 65 66 |
# File 'lib/cem_acpt/config/base.rb', line 64 def defaults {} end |
#empty? ⇒ Boolean
133 134 135 |
# File 'lib/cem_acpt/config/base.rb', line 133 def empty? @config.empty? end |
#env_var_prefix ⇒ String
Returns The prefix for environment variables.
50 51 52 |
# File 'lib/cem_acpt/config/base.rb', line 50 def env_var_prefix 'CEM_ACPT' end |
#explain ⇒ Object
Returns a string representation of how the config was loaded
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/cem_acpt/config/base.rb', line 96 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
124 125 126 |
# File 'lib/cem_acpt/config/base.rb', line 124 def get(dot_key) @config.dget(dot_key).dup end |
#has?(dot_key) ⇒ Boolean
129 130 131 |
# File 'lib/cem_acpt/config/base.rb', line 129 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)
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/cem_acpt/config/base.rb', line 78 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! # 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?
152 153 154 |
# File 'lib/cem_acpt/config/base.rb', line 152 def quiet_mode? !!get('quiet') end |
#to_json(*args) ⇒ Object
161 162 163 |
# File 'lib/cem_acpt/config/base.rb', line 161 def to_json(*args) @config.to_json(*args) end |
#to_yaml ⇒ Object
157 158 159 |
# File 'lib/cem_acpt/config/base.rb', line 157 def to_yaml @config.to_yaml end |
#valid_keys ⇒ Array<Symbol>
Returns Valid top-level keys for the config.
55 56 57 58 59 60 61 |
# File 'lib/cem_acpt/config/base.rb', line 55 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?
147 148 149 |
# File 'lib/cem_acpt/config/base.rb', line 147 def verbose_mode? !!get('verbose') end |