Module: Confix

Defined in:
lib/confix.rb,
lib/confix/version.rb

Overview

This module makes it easy for any configuration object to define itself declaratively.

Usage

Include this module in a new object, like this:

class MyConfiguration
  include Confix

   setting :database_url
   config :external_api do
     setting :client_id
     setting :client_secret
   end

end

Now, one can access these properties like this:

cfg = MyConfiguration.new

cfg.database_url = 'http://www.database.com'
cfg.external_api.client_id = 'MyApp'

or

cfg.external_api.update :client_id => 'MyApp', :client_secret => '1234567890'

One can access the settings using indexers or method calls, just like in OpenStruct. Also, symbols or strings can be used by the indexers, mimicking HashWithIndifferentAccess. One can even get or set a property of a child configuration easily:

raise 'invalid secret' if cfg['external_api.client_secret'] != secret

Notes

Internally, all settings are stored in the ‘root’ configuration object. Imagine you have the following configuration setup:

class Configuration
  include Confix

  config :child1 do
    setting :one
  end
  config :child2 do
    setting :two
    config :child2a do setting :three end
  end
end

Configurations child1 and child2 will not store their own configuration values. Instead, all configuration options are stored in the root object, using the following keys:

  • child1.one

  • child2.two

  • +child2.child2a.three

This allows for rapid lookup and exporting. Any operation on a child configuration will forward their call to the root object.

Convenience accessors are created to retrieve values. Using the example above, one can access the same setting in the following ways:

config = Configuration.new

config.child1.one = 'One'
config.child2[:two] = 'Two'
config['child2.child2a.three'] = 'Three'

config[:child1].one          # => 'One'
config.child2[:one]          # raises {UndefinedSetting}
config.child2.child2a.three  # => 'Three'

If you use an intermediate key, you will get a Config object.

config.child2                # #<Confix::Config @parent=#<Configuration>>
config.child2 = 'something'  # (raises {CannotModifyConfiguration})

Assigns

You may add assignment variables to the #assigns hash. This hash is used to interpolate string settings.

Example

config.assigns[:some_path] = '/path/to/something'
config.path_setting = '%{some_path}/file.yml'
config.path_setting # => '/path/to/something/file.yml'

Defined Under Namespace

Modules: ClassMethods, InstanceMethods, RootClassMethods, RootInstanceMethods Classes: CannotModifyConfiguration, Config, UndefinedSetting

Constant Summary collapse

VERSION =
"1.0.0"

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object



91
92
93
94
95
96
97
# File 'lib/confix.rb', line 91

def self.included(base)
  base.send :include, InstanceMethods
  base.send :extend, ClassMethods

  base.send :include, RootInstanceMethods
  base.send :extend, RootClassMethods
end

.valid_key?(key) ⇒ Boolean

Returns:

  • (Boolean)


408
409
410
# File 'lib/confix.rb', line 408

def self.valid_key?(key)
  key.to_s !~ /[^_a-zA_Z0-9]/
end