Gem | Source | Documentation
Simple, static, nested application configuration
require 'nested_config'
class MyApp
def self.configure
yield config
end
def self.config
@config ||= MyConfig.new
end
class MyConfig < NestedConfig
end
end
MyApp.configure do |config|
config.coins = 1000
config.user do |user|
user.max = 5
end
config.queue do |queue|
queue.workers do |workers|
workers.max = 2
workers.timeout = 60.seconds
end
end
end
MyApp.config.coins # => 1000
MyApp.config.queue.workers.timeout # => 60
Sometimes you need to define config keys which contains spaces, dashes or other special chars.
In those case you can use NestedConfig#_
:
config = NestedConfig.new.tap do |config|
config._ "mix & match" do |mix_and_match|
mix_and_match.name = "Mix & match"
# ...
end
end
config["mix & match"].name # => Mix & match
With the module EvaluateOnce
you can define config value which will be
evaluated lazily. Once.
class MyConfig
include NestedConfig::EvaluateOnce
end
MyApp.configure do |config|
config.country_list = proc { Country.all }
end
MyApp.config.country_list # => [List of countries]
MyApp.config.country_list # => [List of countries] (cached)
The initial access to key country_list
calls (via call
method) the proc
and replaces the value. Subsequent calls just fetch the replaced value.
Values of NestedConfig can be temporalily modified.
This can be used in tests modifying a global application config inside a block:
require 'nested_config/with_config'
class MyCase < MiniTest::TestCase
include NestedConfig::WithConfig
def app_config
MyApp.config # global
end
end
class SomeCase < MyCase
def setup
app_config.tap do |config|
config.coins = 1000
config.queue do |queue|
queue.workers do |workers|
workers.max = 5
end
end
end
end
def test_with_basic_value
with_config(app_config) do |config|
config.coins = 500
end
# global config reset to previous config
end
def test_queue_with_changed_workers
with_config(app_config, :queue, :workers) do |workers|
workers.max = 1
# do stuff with modified config max value
end
# global config reset to previous config
end
end
Note: NestedConfig is not a blank slate so you CANNOT use defined method
names as keys like object_id
.
gem install nested_config
rake test
COVERAGE=1 bundle exec rake test
- Make NestedConfig a blank slate
edit lib/nested_config/version.rb
git commit -am "Release X.Y.Z"
rake release