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.
config/app_config.yaml:
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 development
.
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 newrelic_enabled
setting.
You can nest configs as much as you like.
common:
facebook:
app:
id: 123
AppConfig.facebook.app.id # => 123
If you have a config file named config/app_config.yml
and another config
file named 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 Configy gem based on the AppConfig plugin which was evolved from the original plugin by Eugene Bolshakov, eugene.bolshakov@gmail.com, http://www.taknado.com
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/