Class: MywayConfig::Loaders::DefaultsLoader
- Inherits:
-
Anyway::Loaders::Base
- Object
- Anyway::Loaders::Base
- MywayConfig::Loaders::DefaultsLoader
- Defined in:
- lib/myway_config/loaders/defaults_loader.rb
Overview
Bundled Defaults Loader for Anyway Config
Loads default configuration values from a YAML file bundled with a gem. This ensures defaults are always available regardless of where the gem is installed.
The defaults.yml file structure:
defaults: # Base values for all environments
database:
host: localhost
port: 5432
development: # Overrides for development
database:
name: myapp_development
test: # Overrides for test
database:
name: myapp_test
production: # Overrides for production
database:
sslmode: require
This loader deep-merges defaults with the current environment's overrides.
Loading priority (lowest to highest):
- Bundled defaults (this loader)
- XDG user config (~/.config/app/app.yml)
- Project config (./config/app.yml)
- Local overrides (./config/app.local.yml)
- Environment variables (APP_*)
- Programmatic (configure block)
Class Attribute Summary collapse
-
.defaults_paths ⇒ Object
readonly
Returns the value of attribute defaults_paths.
Class Method Summary collapse
-
.defaults_exist?(name) ⇒ Boolean
Check if defaults file exists for a config name.
-
.defaults_path(name) ⇒ String?
Get the registered defaults path for a config name.
-
.load_raw_yaml(name) ⇒ Hash
Load and parse the raw YAML content.
-
.register(name, path) ⇒ Object
Register a defaults file path for a config name.
-
.schema(name) ⇒ Hash
Extract the schema (attribute names) from the defaults section.
-
.valid_environment?(name, env) ⇒ Boolean
Check if a given environment name is valid.
-
.valid_environments(name) ⇒ Array<Symbol>
Returns valid environment names from the config file.
Instance Method Summary collapse
Class Attribute Details
.defaults_paths ⇒ Object (readonly)
Returns the value of attribute defaults_paths.
43 44 45 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 43 def defaults_paths @defaults_paths end |
Class Method Details
.defaults_exist?(name) ⇒ Boolean
Check if defaults file exists for a config name
65 66 67 68 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 65 def defaults_exist?(name) path = defaults_path(name) path && File.exist?(path) end |
.defaults_path(name) ⇒ String?
Get the registered defaults path for a config name
57 58 59 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 57 def defaults_path(name) @defaults_paths[name.to_sym] end |
.load_raw_yaml(name) ⇒ Hash
Load and parse the raw YAML content
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 74 def load_raw_yaml(name) path = defaults_path(name) return {} unless path && File.exist?(path) content = File.read(path) YAML.safe_load( content, permitted_classes: [Symbol], symbolize_names: true, aliases: true ) || {} rescue Psych::SyntaxError => e warn "MywayConfig: Failed to parse bundled defaults #{path}: #{e.}" {} end |
.register(name, path) ⇒ Object
Register a defaults file path for a config name
49 50 51 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 49 def register(name, path) @defaults_paths[name.to_sym] = path end |
.schema(name) ⇒ Hash
Extract the schema (attribute names) from the defaults section
94 95 96 97 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 94 def schema(name) raw = load_raw_yaml(name) raw[:defaults] || {} end |
.valid_environment?(name, env) ⇒ Boolean
Check if a given environment name is valid
115 116 117 118 119 120 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 115 def valid_environment?(name, env) return false if env.nil? || env.to_s.empty? return false if env.to_s == 'defaults' valid_environments(name).include?(env.to_sym) end |
.valid_environments(name) ⇒ Array<Symbol>
Returns valid environment names from the config file
Valid environments are top-level keys excluding 'defaults'.
105 106 107 108 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 105 def valid_environments(name) raw = load_raw_yaml(name) raw.keys.reject { |k| k == :defaults }.sort end |
Instance Method Details
#call(name:, **_options) ⇒ Object
123 124 125 126 127 128 129 130 |
# File 'lib/myway_config/loaders/defaults_loader.rb', line 123 def call(name:, **) return {} unless self.class.defaults_exist?(name) path = self.class.defaults_path(name) trace!(:bundled_defaults, path: path) do load_and_merge_for_environment(name) end end |