0.01
No commit activity in last 3 years
No release in over 3 years
Load configuration settings from ENV, dotfiles, and gems
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 0
>= 0
>= 0

Runtime

 Project Readme

Constellation

Constellation is a powerful configuration system. It's great for API client libraries and applications and anywhere else you need to let your users set some configuration parameters.

Putting Settings In

Ruby Parameters

Start by creating a class and calling Constellation.enhance:

class MyConfiguration
  Constellation.enhance self
end

With just this, you have a basic Hash configuration. The only way to set properties is to pass them in Ruby:

config = MyConfiguration.new(:foo => 'bar')

config.foo # => "bar"

ENV

To add support for ENV hash configuration, set env_params:

class MyConfiguration
  self.env_params = { :foo => 'MY_FOO' }
end

ENV['MY_FOO'] = 'bar'

MyConfiguration.new.foo # => "bar"

Configuration Files

To add support for config files, set config_file to a path. The Constellation will look up a config file in that location relative to two places ("base paths"):

  • the current working directory (Dir.pwd)
  • the user's home directory (ENV['HOME'])
class MyConfiguration
  self.config_file = 'my/config.yml'
end

If ./my/config.yml contains the following

---
foo: bar

then MyConfiguration.new.foo will return "bar".

From Gems

If you set config_file to a path and set load_from_gems to true, then Constellation will add all of the loaded gem directories to the list of base paths.

class MyConfiguration
  self.config_file = 'my/config.yml'
  self.load_from_gems = true
end

Order of Precedence

Constellation will load parameters in the order listed above. Given

class MyConfiguration
  self.env_params = { :foo => 'MY_FOO' }
  self.config_file = 'my/config.yml'
  self.load_from_gems = true
end

Constellation will first look in a Hash passed in, then in ENV, then in ./my/config.yml, then in ~/my/config.yml, then in GEM_PATH/my/config.yml for each loaded gem.

File Parsers

Constellation will do the right thing if config_file ends with .yml, .yaml, or .json. If it's a different format, you'll have to tell Constellation how to parse it by redefining parse_config_file:

class MyConfiguration
  self.config_file = '.myrc'

  def parse_config_file(contents)
    contents.split("\n").inject({}) do |result, line|
      k, v = line.split(/:\s*/)
      result[k] = v
      result
    end
  end
end

Getting Settings Out

Given a Constellation configuration object

c = MyConfiguration.new(:foo => 'bar')

you can get the settings out in a few ways.

Keys are available as methods:

c.foo     # => "bar"

Keys are available via [] as Strings or Symbols:

c['foo']  # => "bar"
c[:foo]   # => "bar"

to_hash will return all of the settings, with String keys:

c.to_hash # => { "foo" => "bar" }

(If you have loaded activesupport, to_hash will return a HashWithIndifferentAccess.)

The enumerable methods are available:

c.map { |k,v| k + ':' + v } # => [ "foo:bar" ]