ComplexConfig

Description

This library makes your YAML configuration files available via a nice API. It
also supports different configurations for each RAILS_ENV environment and
using plugins to return more complex settings values.

Installation

You can use rubygems to fetch the gem and install it for you:

# gem install complex_config

You can also put this line into your Gemfile

gem ‘complex_config’, require: ‘complex_config/rude’

and bundle. This command will enable all the default plugins and make the cc
and complex_config shortcuts available. The configurations are expected to be
in the config subdirectory according to the rails convention.

Usage

Given a config file like this and named config/products.yml

development:
flux_capacitor:
version_20:
name: Flux Capacitor Version 2.0
price_in_cents: 12_000_00
manual_pdf_url: “http://brown-inc.com/manuals/fc_20.pdf
components:
- Miniature Chrono-Levitation Chamber (mCLC)
- Single Gravitational Displacement Coil (SGDC)
- Simple Quantum Flux Transducer (SQFT)
- Basic Time-Space Navigation System (BTN)
pro_version:
name: Flux Capacitor Professional
price_in_cents: 23_000_00
manual_pdf_url: “http://brown-inc.com/manuals/fc_pro.pdf
components:
- Advanced Chrono-Levitation Chamber (ACL)
- Dual Gravitational Displacement Coils (DGDCs)
- Advanced Quantum Flux Transducer (AQFT)
- Professional Time-Space Navigation System (PTNS)
enterprise_version:
name: Flux Capacitor Enterpise
price_in_cents: 1_600_000_00
manual_pdf_url: “http://brown-inc.com/manuals/fc_enterprise.pdf
components:
- Super-Advanced Chrono-Levitation Chamber (SACL)
- Quadruple Gravitational Displacement Coils (QGDCs)
- Ultra-Advanced Quantum Flux Transducer (UAQFT)
- Enterprise Time-Space Navigation System (ETNS)
test:
flux_capacitor:
test_version:
name: Yadayada
price_in_cents: 6_66
manual_pdf_url: “http://staging.brown-inc.com/manuals/fc_10.pdf
components:
- Experimental Chrono-Levitation Chamber (ECLC)
- Modular Gravitational Displacement Coils (MGDCs)
- Variable Quantum Flux Transducer (VQFT)
- Development Time-Space Navigation System (DTNS)

and using require "complex_config/rude" in the "development" environment you
can now access the configuration.

Accessing configuration settings

Fetching the name of a product:

> cc.products.flux_capacitor.enterprise_version.name => “Flux Capacitor Enterpise”

If the name of configuration file isn’t valid ruby method name syntax you can also
use cc(:products).flux_capacitor… to avoid this problem.

Fetching the price of a product in cents:

> cc.products.flux_capacitor.enterprise_version.price_in_cents => 160000000

Fetching the price of a product and using the ComplexConfig::Plugins::MONEY
plugin to format it:

> cc.products.flux_capacitor.enterprise_version.price.format => “€1,600,000.00”

Fetching the URL of a product manual as a string:

> cc.products.flux_capacitor.enterprise_version.manual_pdf_url => “http://brown-inc.com/manuals/fc_enterprise.pdf

Fetching the URL of a product manual and using the ComplexConfig::Plugins::URI
plugin return an URI instance:

> cc.products.flux_capacitor.enterprise_version.manual_pdf_uri => #

You can also fetch config settings from a different environment:

>> pp cc.products(:test); nil
products
└─ flux_capacitor
└─ test_version
├─ name = “Yadayada”
├─ price_in_cents = 666
├─ manual_pdf_url = “http://staging.brown-inc.com/manuals/fc_10.pdf
└─ components
├─ “Experimental Chrono-Levitation Chamber (ECLC)”
├─ “Modular Gravitational Displacement Coils (MGDCs)”
├─ “Variable Quantum Flux Transducer (VQFT)”
└─ “Development Time-Space Navigation System (DTNS)"kk

Calling complex_config.products. instead of cc(…) would skip the implicite
namespacing via the RAILS_ENV environment, so
complex_config(:products).test.flux_capacitor returns the same settings
object.

Configuration

You can complex_config by passing a block to its configure method, which you
can for example do in a rails config/initializers file:

ComplexConfig.configure do |config|
config.deep_freeze = !Rails.env.test? # allow modification during tests b/c of stubs etc.

# config.env = ‘some_environment’

# config.config_dir = Rails.root + ‘config’

config.add_plugin -> id do
if base64_string = ask_and_send(”#{id}_base64")
Base64.decode64 base64_string
else
skip
end
end
end

Adding plugins

You can add your own plugins by calling

ComplexConfig::Provider.add_plugin SomeNamespace::PLUGIN

or in the configuration block by calling

ComplexConfig.configure do |config|
config.add_plugin SomeNamespace::PLUGIN
end

Implementing your own plugins

A plugin is just a lambda expression with a single argument id which
identifies the attribute that is being accessed. If it calls skip it won’t
apply and the following plugins are tried until one doesn’t call skip and
returns a value instead.

Here is the ComplexConfig::Plugins::MONEY plugin for example:

require ‘monetize’

module ComplexConfig::Plugins
MONEY = -> id do
if cents = ask_and_send(“#{id}_in_cents”)
Money.new(cents)
else
skip
end
end
end

Download

The homepage of this library is located at

Author

Florian Frank

License

This software is licensed under the Apache 2.0 license.