Class: MywayConfig::Loaders::DefaultsLoader

Inherits:
Anyway::Loaders::Base
  • Object
show all
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):

  1. Bundled defaults (this loader)
  2. XDG user config (~/.config/app/app.yml)
  3. Project config (./config/app.yml)
  4. Local overrides (./config/app.local.yml)
  5. Environment variables (APP_*)
  6. Programmatic (configure block)

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.defaults_pathsObject (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

Parameters:

  • name (Symbol, String)

    the config name

Returns:

  • (Boolean)


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

Parameters:

  • name (Symbol, String)

    the config name

Returns:

  • (String, nil)

    the path or nil if not registered



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

Parameters:

  • name (Symbol, String)

    the config name

Returns:

  • (Hash)

    parsed YAML with symbolized keys



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.message}"
  {}
end

.register(name, path) ⇒ Object

Register a defaults file path for a config name

Parameters:

  • name (Symbol, String)

    the config name

  • path (String)

    absolute path to the defaults.yml file



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

Parameters:

  • name (Symbol, String)

    the config name

Returns:

  • (Hash)

    the defaults section containing all attribute definitions



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

Parameters:

  • name (Symbol, String)

    the config name

  • env (String, Symbol)

    environment name to check

Returns:

  • (Boolean)

    true if environment 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'.

Parameters:

  • name (Symbol, String)

    the config name

Returns:

  • (Array<Symbol>)

    list of valid environment names



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:, **_options)
  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