A simple mixin to make Ruby classes configurable
Support for custom config classes via config_class:
option (#136 by @solnic)
extend Dry::Configurable(config_class: MyConfig)
Your config class should inherit from Dry::Configurable::Config
.
Return Dry::Core::Constants::Undefined
(instead of nil) as the value for non-configured settings via a default_undefined: true
option (#141 by @timriley)
extend Dry::Configurable(default_undefined: true)
You must opt into this feature via the default_undefined: true
option. Non-configured setting values are still nil
by default.
Improve memory usage by separating setting definitions from config values (#138 by @timriley)
Your usage of dry-configurable may be impacted if you have been accessing objects from _settings
or the internals of Dry::Configurable::Config
. _settings
now returns Dry::Configurable::Setting
instances, which contain only the details from the setting's definition. Setting values remain in Dry::Configurable::Config
.
Use Zeitwerk to speed up load time (#135 by @solnic)
The finalize!
method (as class or instance method, depending on whether you extend or include Dry::Configurable
respectively) now accepts a boolean freeze_values:
argument, which if true, will recursively freeze all config values in addition to the config
itself. (#105 by @ojab)
class MyConfigurable
include Dry::Configurable
setting :db, default: "postgre"
end
my_obj = MyConfigurable.new
my_obj.finalize!(freeze_values: true)
my_obj.config.db << "sql" # Will raise FrozenError
Dry::Configurable::Config#update
will set hashes as values for non-nested settings (#131 by @ojab)
class MyConfigurable
extend Dry::Configurable
setting :sslcert, constructor: ->(v) { v&.values_at(:pem, :pass)&.join }
end
MyConfigurable.config.update(sslcert: {pem: "cert", pass: "qwerty"})
MyConfigurable.config.sslcert # => "certqwerty"
Dry::Configurable::Config#update
will accept any values implicitly convertible to hash via #to_hash
(#133 by @timriley)
config
will still be made available on that config
. (#130 by @timriley)Added flags to determine whether to warn on the API usage deprecated in this release (see "Changed" section below). Set these to false
to suppress the warnings. (#124 by @timriley)
Dry::Configurable.warn_on_setting_constructor_block false
Dry::Configurable.warn_on_setting_positional_default false
ArgumentError
for classes including Dry::Configurable
whose initializer
has required kwargs. (#113 by @timriley)Deprecated the setting constructor provided as a block. Provide it via the constructor:
keyword argument instead. (#111 by @waiting-for-dev & @timriley)
setting :path, constructor: -> path { Pathname(path) }
Deprecated the setting default provided as the second positional argument. Provide it via the default:
keyword argument instead. (#112 and #121 by @waiting-for-dev & @timriley)
setting :path, default: "some/default/path"
[BREAKING] Removed implicit to_hash
conversion from Config
. (#114 by @timriley)
cloneable
option, e.g.setting :component_dirs, Configuration::ComponentDirs.new, cloneable: true
This change makes it possible to provide “rich” config values that carry their own configuration interface.
In the above example, ComponentDirs
could provide its own API for adding component
dirs and configuring aspects of their behavior at the same time. By being passed to
the setting along with cloneable: true
, dry-configurable will ensure the setting's
values are cloned along with the setting at all the appropriate times.
A custom cloneable setting value should provide its own #initialize_copy
(used by
Object#dup
) with the appropriate logic. (@timriley in #102)
#initialize
instance method is prepended, leaving the rest of the instance
methods to be included as normal again. This allows classes including
Dry::Configurable
to override instance methods with their own methods as required
(@adam12 in #103)initialize
, calling super
is no longer required (see #98 for more details) (@zabolotnov87)