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 => #<URI::HTTP:0x007ff626d2a2e8 URL:http://brown-inc.com/manuals/fc_enterprise.pdf>
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
- https://github.com/flori/complex_config
Author
License
This software is licensed under the Apache 2.0 license.