Class: Kotoshu::Configuration::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/kotoshu/configuration/resolver.rb

Overview

Canon-style resolver for configuration values.

Implements the priority order: CLI > ENV > Programmatic > Defaults

This ensures that:

  1. CLI arguments have highest priority (explicit user intent)

  2. Environment variables override programmatic settings

  3. Programmatic/API settings override defaults

  4. Defaults are the fallback

Examples:

resolver = Configuration::Resolver.new(
  env: { "KOTOSHU_LANGUAGE" => "de" },
  programmatic: { language: "en-US" },
  cli: { language: "ja" },
  defaults: { language: "en-US" }
)

resolver.get(:language)  # => "ja" (CLI wins)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env: {}, programmatic: {}, cli: {}, defaults: {}) ⇒ Resolver

Create a new resolver.

Parameters:

  • env (Hash) (defaults to: {})

    Environment variables (e.g., { “KOTOSHU_LANGUAGE” => “de” })

  • programmatic (Hash) (defaults to: {})

    Programmatic settings (e.g., { language: “en-US” })

  • cli (Hash) (defaults to: {})

    CLI argument settings (e.g., { language: “ja” })

  • defaults (Hash) (defaults to: {})

    Default values (e.g., { language: “en-US” })



44
45
46
47
48
49
# File 'lib/kotoshu/configuration/resolver.rb', line 44

def initialize(env: {}, programmatic: {}, cli: {}, defaults: {})
  @env = env
  @programmatic = programmatic
  @cli = cli
  @defaults = defaults
end

Instance Attribute Details

#cliHash (readonly)

Returns CLI argument settings.

Returns:

  • (Hash)

    CLI argument settings



33
34
35
# File 'lib/kotoshu/configuration/resolver.rb', line 33

def cli
  @cli
end

#defaultsHash (readonly)

Returns Default values.

Returns:

  • (Hash)

    Default values



36
37
38
# File 'lib/kotoshu/configuration/resolver.rb', line 36

def defaults
  @defaults
end

#envHash (readonly)

Returns Environment variable overrides.

Returns:

  • (Hash)

    Environment variable overrides



27
28
29
# File 'lib/kotoshu/configuration/resolver.rb', line 27

def env
  @env
end

#programmaticHash (readonly)

Returns Programmatic/API settings.

Returns:

  • (Hash)

    Programmatic/API settings



30
31
32
# File 'lib/kotoshu/configuration/resolver.rb', line 30

def programmatic
  @programmatic
end

Instance Method Details

#get(key) ⇒ Object

Resolve a configuration value using priority order.

Priority: CLI > ENV > Programmatic > Defaults

Examples:

resolver.get(:language)  # => resolved language value

Parameters:

  • key (Symbol)

    The configuration key (e.g., :language)

Returns:

  • (Object)

    The resolved value



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/kotoshu/configuration/resolver.rb', line 60

def get(key)
  # CLI has highest priority when explicitly set
  return @cli[key] if @cli.key?(key)

  # Environment variables override programmatic
  env_key = env_key_for(key)
  return ENV[env_key] if ENV.key?(env_key)

  # Programmatic settings override defaults
  return @programmatic[key] if @programmatic.key?(key)

  @defaults[key]
end

#get_all(key) ⇒ Hash

Get all values for a key across all priority levels.

Parameters:

  • key (Symbol)

    The configuration key

Returns:

  • (Hash)

    Hash with priority levels as keys



89
90
91
92
93
94
95
96
# File 'lib/kotoshu/configuration/resolver.rb', line 89

def get_all(key)
  {
    cli: @cli[key],
    env: ENV[env_key_for(key)],
    programmatic: @programmatic[key],
    default: @defaults[key]
  }
end

#key?(key) ⇒ Boolean

Check if a key has a value set at any priority level.

Parameters:

  • key (Symbol)

    The configuration key

Returns:

  • (Boolean)

    True if the key is set somewhere



78
79
80
81
82
83
# File 'lib/kotoshu/configuration/resolver.rb', line 78

def key?(key)
  @cli.key?(key) ||
    ENV.key?(env_key_for(key)) ||
    @programmatic.key?(key) ||
    @defaults.key?(key)
end

#merge(env: {}, programmatic: {}, cli: {}) ⇒ Resolver

Create a new resolver with merged values.

Parameters:

  • env (Hash) (defaults to: {})

    Additional environment overrides

  • programmatic (Hash) (defaults to: {})

    Additional programmatic settings

  • cli (Hash) (defaults to: {})

    Additional CLI settings

Returns:

  • (Resolver)

    New resolver with merged values



104
105
106
107
108
109
110
111
# File 'lib/kotoshu/configuration/resolver.rb', line 104

def merge(env: {}, programmatic: {}, cli: {})
  self.class.new(
    env: @env.merge(env),
    programmatic: @programmatic.merge(programmatic),
    cli: @cli.merge(cli),
    defaults: @defaults
  )
end