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 implement the following methods:
- valid_keys - provide an array of valid top-level keys for the config as symbols
- 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
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.
27 28 29 30 |
# File 'lib/cem_acpt/config/base.rb', line 27 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.
25 26 27 |
# File 'lib/cem_acpt/config/base.rb', line 25 def config @config end |
#env_vars ⇒ Object (readonly)
Returns the value of attribute env_vars.
25 26 27 |
# File 'lib/cem_acpt/config/base.rb', line 25 def env_vars @env_vars end |
Instance Method Details
#[](key) ⇒ Object
93 94 95 96 97 98 99 100 101 |
# File 'lib/cem_acpt/config/base.rb', line 93 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?
116 117 118 |
# File 'lib/cem_acpt/config/base.rb', line 116 def ci_mode? !!get('ci_mode') || !!(ENV['GITHUB_ACTIONS'] || ENV['CI']) end |
#debug_mode? ⇒ Boolean Also known as: debug?
121 122 123 |
# File 'lib/cem_acpt/config/base.rb', line 121 def debug_mode? get('log_level') == 'debug' end |
#defaults ⇒ Hash
Returns The default configuration.
43 44 45 |
# File 'lib/cem_acpt/config/base.rb', line 43 def defaults {} end |
#empty? ⇒ Boolean
112 113 114 |
# File 'lib/cem_acpt/config/base.rb', line 112 def empty? @config.empty? end |
#env_var_prefix ⇒ String
Returns The prefix for environment variables.
33 34 35 |
# File 'lib/cem_acpt/config/base.rb', line 33 def env_var_prefix 'CEM_ACPT' end |
#explain ⇒ Object
Returns a string representation of how the config was loaded
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/cem_acpt/config/base.rb', line 75 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
103 104 105 |
# File 'lib/cem_acpt/config/base.rb', line 103 def get(dot_key) @config.dget(dot_key).dup end |
#has?(dot_key) ⇒ Boolean
108 109 110 |
# File 'lib/cem_acpt/config/base.rb', line 108 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)
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/cem_acpt/config/base.rb', line 57 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?
131 132 133 |
# File 'lib/cem_acpt/config/base.rb', line 131 def quiet_mode? !!get('quiet') end |
#to_json(*args) ⇒ Object
140 141 142 |
# File 'lib/cem_acpt/config/base.rb', line 140 def to_json(*args) @config.to_json(*args) end |
#to_yaml ⇒ Object
136 137 138 |
# File 'lib/cem_acpt/config/base.rb', line 136 def to_yaml @config.to_yaml end |
#valid_keys ⇒ Array<Symbol>
Returns Valid top-level keys for the config.
38 39 40 |
# File 'lib/cem_acpt/config/base.rb', line 38 def valid_keys [] end |
#verbose_mode? ⇒ Boolean Also known as: verbose?
126 127 128 |
# File 'lib/cem_acpt/config/base.rb', line 126 def verbose_mode? !!get('verbose') end |