Class: Hanami::Settings
- Inherits:
-
Object
- Object
- Hanami::Settings
- Includes:
- Dry::Configurable
- Defined in:
- lib/hanami/settings.rb,
lib/hanami/settings/env_store.rb
Overview
Provides user-defined settings for an Hanami app or slice.
Define your own settings by inheriting from this class in ‘config/settings.rb` within an app or slice. Your settings will be loaded from matching ENV vars (with upper-cased names) and be registered as a component as part of the Hanami app prepare step.
The settings instance is registered in your app and slice containers as a ‘“settings”` component. You can use the `Deps` mixin to inject this dependency and make settings available to your other components as required.
Settings are defined with [dry-configurable]‘s `setting` method. You may likely want to provide `default:` and `constructor:` options for your settings.
If you have [dry-types] bundled, then a nested ‘Types` module will be available for type checking your setting values. Pass type objects to the setting `constructor:` options to ensure their values meet your type expectations. You can use dry-types’ default type objects or define your own.
When the settings are initialized, all type errors will be collected and presented together for correction. Settings are loaded early, as part of the Hanami app’s prepare step, to ensure that the app boots only when valid settings are present.
Setting values are loaded from a configurable store, which defaults to EnvStore, which fetches the values from equivalent upper-cased keys in ‘ENV`. You can configure an alternative store via Config#settings_store. Setting stores must implement a `#fetch` method with the same signature as `Hash#fetch`.
[dry-c]: dry-rb.org/gems/dry-configurable/ [dry-t]: dry-rb.org/gems/dry-types/
Defined Under Namespace
Classes: EnvStore, InvalidSettingsError
Constant Summary collapse
- Undefined =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Dry::Core::Constants::Undefined
- EMPTY_STORE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Dry::Core::Constants::EMPTY_HASH
Class Method Summary collapse
-
.inherited(subclass) ⇒ Object
private
Defines a nested ‘Types` constant in `Settings` subclasses if dry-types is bundled.
-
.load_for_slice(slice) ⇒ Settings?
private
Loads the settings for a slice.
Instance Method Summary collapse
-
#initialize(store = EMPTY_STORE) ⇒ Settings
constructor
private
A new instance of Settings.
-
#inspect ⇒ String
Returns a string containing a human-readable representation of the settings.
-
#inspect_values ⇒ String
Returns a string containing a human-readable representation of the settings and their values.
Constructor Details
#initialize(store = EMPTY_STORE) ⇒ Settings
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Settings.
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/hanami/settings.rb', line 158 def initialize(store = EMPTY_STORE) errors = config._settings.map(&:name).each_with_object({}) do |name, errs| value = store.fetch(name, Undefined) if value.eql?(Undefined) # When a key is missing entirely from the store, _read_ its value from the config instead. # This ensures its setting constructor runs (with a `nil` argument given) and raises any # necessary errors. public_send(name) else public_send("#{name}=", value) end rescue => e # rubocop:disable Style/RescueStandardError errs[name] = e end raise InvalidSettingsError, errors if errors.any? config.finalize! end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object (private)
222 223 224 225 226 227 228 |
# File 'lib/hanami/settings.rb', line 222 def method_missing(name, *args, &block) if config.respond_to?(name) config.send(name, *args, &block) else super end end |
Class Method Details
.inherited(subclass) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Defines a nested ‘Types` constant in `Settings` subclasses if dry-types is bundled.
93 94 95 96 97 98 99 100 |
# File 'lib/hanami/settings.rb', line 93 def inherited(subclass) super if Hanami.bundled?("dry-types") require "dry/types" subclass.const_set(:Types, Dry.Types()) end end |
.load_for_slice(slice) ⇒ Settings?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Loads the settings for a slice.
Returns nil if no settings class is defined.
109 110 111 112 113 114 115 |
# File 'lib/hanami/settings.rb', line 109 def load_for_slice(slice) return unless settings_defined?(slice) require_slice_settings(slice) unless slice_settings_class?(slice) slice_settings_class(slice).new(slice.config.settings_store) end |
Instance Method Details
#inspect ⇒ String
Returns a string containing a human-readable representation of the settings.
This includes setting names only, not any values, to ensure that sensitive values do not inadvertently leak.
Use #inspect_values to inspect settings with their values.
196 197 198 |
# File 'lib/hanami/settings.rb', line 196 def inspect "#<#{self.class} [#{config._settings.map(&:name).join(", ")}]>" end |
#inspect_values ⇒ String
Returns a string containing a human-readable representation of the settings and their values.
214 215 216 |
# File 'lib/hanami/settings.rb', line 214 def inspect_values "#<#{self.class} #{config._settings.map { |setting| "#{setting.name}=#{config[setting.name].inspect}" }.join(" ")}>" end |