Configurethis
Clean up your configuration approach by using Configurethis. Configurethis allows you to access your config values using method names instead of string literals to identify which config value you want to retrieve.
Quick example
# lib/password_settings.rb
class PasswordSettings
extend Configurethis
end
# some_ruby_file_in_my_app.rb
PasswordSettings.min_length #=> 10
PasswordSettings.require_uppercase #=> true
PasswordSettings.storage.keep_last #=> 3---
# config/password_settings.yml
minLength: 10
require_uppercase: true
storage:
keep_last: 3Why?
Typical Ruby code has craziness like this all over the place:
# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
# application.rb
if APP_CONFIG['perform_authentication']
# Do stuff
endBut that's just ugly. It relies on string literals, constants, and gets worse if you have multiple config values, or even nested config values for that matter.
Configurethis makes your life better and your code healthier by avoiding literals, constants and makes it easy to setup multiple config files.
All you need to do is define a Class to act as your configuration container object, create a matching YAML file, and then access your values
as needed using method calls to your new Class!
# A cleaner way!
# config/initializers/configurethis.rb
Configurethis.root_path = File.join(Rails.root, "config")
# lib/password_settings.rb
class PasswordSettings
extend Configurethis
end
# some_ruby_file_in_my_app.rb
PasswordSettings.min_length #=> 10
PasswordSettings.require_uppercase #=> true
PasswordSettings.storage.keep_last #=> 3---
# config/password_settings.yml
minLength: 10
require_uppercase: true
storage:
keep_last: 3Get started with Configurethis!
Add this line to your application's Gemfile:
gem 'configurethis'
And then execute:
$ bundle
Or install it yourself as:
$ gem install configurethis
How to?
Setup
To get started, specify where you want Configurethis to look for your .yml files at.
Configurethis.root_path = '/etc/my_app'If you are using Configurethis in a Rails app, create an initializer for Configurethis and add the following:
# config/initializers/configurethis.rb
Configurethis.root_path = File.join(Rails.root, "config")If your configuration is dependent on environment variables, you can specify it (Unfortunately at this time you need to do this once per each class that is environmentally dependent):
MyConfigurationClass.set_root = Rails.envCreating a configuration
To turn your class into a configuration class, simply extend Configurethis
class MyRiakConfiguration
extend Configurethis
endAnd create a .yml file that matches your class name. In this case our .yml file would be named my_riak_configuration.yml:
And it might contain something like this:
---
pb_port: 9002
http_port: 9000
host: 127.0.0.1
riak_control:
cert: /opt/local/var/riak-1.2.0/riak.crtNow you can access those values as methods off your configuration class.
MyRiakConfiguration.pb_port #=> 9002
MyRiakConfiguration.http_port #=> 9000
MyRiakConfiguration.riak_control.cert #=> "/opt/local/var/riak-1.2.0/riak.crt"Overriding
If you do not want your .yml file to follow convention, you can choose your own name.
class IWantToBeDifferent
extend Configurethis
configure_this_with 'my_configuration_file.yml'
endInspecting keys for a hash value
Sometimes you may want to iterate over the keys of a configured hash. You can do this by calling #keys on the hash to retrieve a list of the keys.
For example, if your YAML is represented as:
---
bourbon:
distillery:
woodford:
# more data on woodford
buffalo_trace:
# more stuff
makers_mark:
# makers stuffAnd let's assume our configuration class is called BourbonConfig, we could retrieve a list of distilleries using #keys:
BourbonConfig.bourbon.distillery.keys #=> ["woodford", "buffalo_trace", "makers_mark"]Validation
If you are having problems and everything "looks clear", try running your YAML through a YAML lint test. Ruby has been known to be forgiving to poorly formatted YAML in some versions, but not others.
Running the tests
Just run rspec from your prompt! The tests are also contain great examples about how to use Configurethis.
Testing
While working with Configurethis in your specs/tests you can override the configuration and avoid using the real configuration files to simulate behavior. This enables you to avoid using messing stubbing hierarchies and keep your tests clean!
Just pass a hash representing your configuration to #test_with.
# my_configuration.rb
class BourbonConfig
extend Configurethis
end
# my_behavior_spec.rb
it "should do some drinking" do
BourbonConfiguration.test_with({"bourbons" => {"Woodford" => "awesome", "Buffalo Trace" => "ok"} })
expect( my_behavior.drink("Woodford") ).to eql("awesome") # => true
endContributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request