easyconf-rails
easyconf-rails makes customizing your Rails application easy. (Surprise!) To use it, follow these simple steps:
1.
Add the following line to your project's Gemfile
:
gem 'easyconf-rails'
2.
Run bundle update
.
3.
Create a YAML file called defaults.yml
in your project's config
directory. This file will contain your project's default configuration values.
Individual installations SHOULD NOT change this file. For example:
---
should_donate: 10
awesomeness:
ruby: true
rspec: true
4.
Create a YAML file called config.yml
in your project's root directory. These
settings will take precedence over the settings in defaults.yml
, so you should
instruct your users to change their settings here. For example:
---
should_support_easyconf: true
should_donate: 5
donate_to: 1A9hGUYswsMLNdaeH9qMrjoJKQGnYKgmT2
awesomeness:
easyconf: true
rails: true
perl: false
rspec: false
why_easyconf_is_awesome:
- its_easiness
- YAML
-
recursive_processing: true
5.
Now you're ready to use config
in your application.
$config.should_support_easyconf # true
$config.should_donate # 5
$config.awesomeness.easyconf # true
$config.awesomeness.ruby # true
$config.awesomeness.rspec # false
$config.why_easyconf_is_awesome[0] # 'its_easiness'
$config.why_easyconf_is_awesome[2].recursive_processing # true
$config.variable_that_was_never_defined # raises NameError
# You can reload your configuration file by with .reload!.
$config.reload!
BIG RED WARNING
$config
is a mutable global variable, and should therefore be treated with
extreme caution. In particular, $config.reload!
will reset the value of
$config
in all threads; it is therefore important to ensure that a program's
corrent functioning does not rely on subsequent accesses to the $config
value
to be consistent.
THE WRONG WAY ^^^^^^^^^^^^^
Person[$config.good_guy].kill(Person[$config.bad_guy])
is wrong because $config.reload!
could have been called after evaluating the
value of Person[$config.good_guy]
, but before calling its kill() method.
If $config.bad_guy
was set to the former value of $config.good_guy
, we would
be asking Person[$config.bad_guy]
to kill itself.
THE RIGHT WAY ^^^^^^^^^^^^^
$config.lock do
Person[config.good_guy].kill(Person[config.bad_guy])
end
is correct because this gaurantees that config.bad_guy
and config.good_guy
are consistent. Even if they're switched in the interim, no one will ever be
asked to kill themselves.