public
Description: Rails plugin that provides environment specific application configuration.
Homepage: http://blog.stochasticbytes.com/2007/10/better-appconfig-plugin-for-rails.html
Clone URL: git://github.com/cjbottaro/app_config.git
name age message
file CHANGELOG Fri Aug 28 09:57:44 -0700 2009 Support for environments in yaml files. [cjbottaro]
file README.rdoc Fri Aug 28 09:57:44 -0700 2009 Support for environments in yaml files. [cjbottaro]
file Rakefile Wed Jul 01 15:42:31 -0700 2009 Packaged as a gem, mini rewrite, see README.rdo... [cjbottaro]
file VERSION.yml Tue Sep 08 10:34:15 -0700 2009 Version bump to 1.2.0 [cjbottaro]
file app_config.gemspec Tue Sep 08 10:34:29 -0700 2009 Regenerated gemspec for version 1.2.0 [cjbottaro]
file init.rb Wed Jul 01 15:42:31 -0700 2009 Packaged as a gem, mini rewrite, see README.rdo... [cjbottaro]
file install.rb Mon May 19 10:21:21 -0700 2008 moving to git from svn [Christopher J. Bottaro]
directory lib/ Tue Sep 08 10:32:25 -0700 2009 Issue #2 - implemented :override_with option fo... [cjbottaro]
directory tasks/ Mon May 19 10:21:21 -0700 2008 moving to git from svn [Christopher J. Bottaro]
directory test/ Tue Sep 08 10:32:25 -0700 2009 Issue #2 - implemented :override_with option fo... [cjbottaro]
file uninstall.rb Mon May 19 10:21:21 -0700 2008 moving to git from svn [Christopher J. Bottaro]
README.rdoc

Summary

Application level configuration.

Features

 * simple YAML config files
 * config files support ERB
 * config files support inheritance
 * access config information via convenient object member notation

Basic Usage

You simply write a configuration file in YAML. Notice you can use ERB.

config.yml

  aws:
    access_key: 123ABC
    secret_key: ABC123
  now: <%= Time.now %>
  servers: [ {name: example1.com}, {name: example2.com} ]

Then somewhere in your code, you create a global constant from the config file. Then access the config data via object member notation.

code

  ::AppConfig = ApplicationConfiguration.new("config.yml")
  AppConfig.aws.access_key  # => "123ABC"
  AppConfig.aws.secret_key  # => "ABC123"
  AppConfig.now             # => Tue May 05 21:55:15 -0500 2009
  AppConfig.servers[0].name # => "example1.com"

Inheritance

You can have a second config file that is recursively merged with the first config file.

base.yml

  app_name:  MyCoolApp
  domain:  dev.mycoolapp.com

production.yml

  domain:  www.mycoolapp.com

code

  ::AppConfig = ApplicationConfiguration.new("base.yml", "production.yml")
  AppConfig.app_name # => "MyCoolApp"
  AppConfig.domain   # => "www.mycoolapp.com"

Using in a Rails app

You just need to create an initializer that looks something like this.

 require 'app_config'
 ::AppConfig = ApplicationConfiguration.new(RAILS_ROOT+"/config/app_config.yml",
                                            RAILS_ROOT+"/config/environments/#{RAILS_ENV}.yml")

If you installed this as a Rails plugin instead of a gem, that code is already run for you in the plugin’s init.rb.

Environments

Alternatively to splitting out your environments into separate files, you can just have a single file which defines the application configuration for all environments (much like how databases.yml works). Note if you do this, nested configurations will not be recursively merged. See example below.

app_config.yml

  defaults: &defaults
    one: won
    two: too
    nested:
      foo: foo
      bar: bar

  development:
    <<: *defaults
    two: new
    nested:
      foo: bar

code

  RAILS_ENV # => "development"
  ::AppConfig = ApplicationConfiguration.new("app_config.yml")
  AppConfig.use_environment!(RAILS_ENV)
  AppConfig.one # => "won"
  AppConfig.two # => "new"
  AppConfig.nested.foo # => "bar"
  AppConfig.nested.bar # raises NoMethodError because nested configurations are not recursively merged

Author

Christopher J. Bottaro