Configy creates a config object based on a YAML file.
It allows you to have a file (
config/app_config.yml) with application
configuration parameters. It should have a "common" section with all
parameters along with default values and can also contain a section for each
application environment (development, test, production, or your custom one).
The values from the current environment section will override the values in
the "common" section.
If a developer needs his own specific values for his working copy, he can
simply create a
config/app_config.local.yml file and override any value
there, again having a "common" section and a section for each environment.
The files are parsed with ERB. Configy also checks for file modifications so you don't have to restart the server to pick up new values on production.
common: appname: "My App" caching: enabled: false facebook: appid: 123 secret: abc production: caching: enabled: true default_max_age: <%= 1.hour %> facebook: appid: 456 secret: def
Assuming ENV['RACK_ENV'] == "production"
Configy.create("app_config") # Creates AppConfig constant AppConfig.caching.enabled? # => true AppConfig.caching.default_max_age # => 3600 AppConfig.appname # => "My App" AppConfig.facebook.appid # => 456 # Or with less magic: config = Configy::Base.new("app_config", "production", Rails.root.join("config") ) config.caching.enabled? # => true config['caching']['enabled'] # => true ...
Configy assumes that you are breaking your configurations into sections. It will automatically detect which section to use. It looks for an environment variable in following order
ENV['CONFIGY_ENV'], ENV['RAILS_ENV'], ENV['RACK_ENV']
and assumes you have a section in your YAML file named the same way, for example:
development: facebook_app_id: 123456 facebook_secret: abcdef production: facebook_app_id: 456789 facebook_secret: defghi
If none of the environment variables above are set, it defaults to
If you have a section named
common, that section will provide default values
for all other sections. Under the hood, Configy deep merges the environment
section into the common section. For example:
common: newrelic_enabled: true newrelic_key: "123456" development: newrelic_enabled: false staging: production:
All environments will inherit the
common section configurations, and the
development environment overrides the
You can nest configs as much as you like.
common: facebook: app: id: 123
AppConfig.facebook.app.id # => 123
Local config file
If you have a config file named
config/app_config.yml and another config
config/app_config.local.yml, the local config file's configurations
will override the main config file's configurations.
Config files are parsed as ERB templates
Configy will check the config file's mtime to see if it needs to
reload it's configuration. You can disable this with
Configy.cache_config = true
Configy provides an [optional] generator.
rails g configy:install
- Gabe Varela
- Ben Marini
- Chip Miller
- Bram Swenson
- Jeremy Ruppel
The plugin is based on the idea described here: http://kpumuk.info/ruby-on-rails/flexible-application-configuration-in-ruby-on-rails/lang-pref/en/