Container Config

ContainerConfig loads values from environment variables, secrets, application credentials, and any other desired value sources within Ruby applications. Rails is not required, but this gem will integrate with Rails if it is available.

Installation

Add this line to your application“s Gemfile:

gem "container_config"

And then execute:

$ bundle install

Or install it yourself as:

$ gem install container_config

Usage

# Retrieve the value of the POSTGRES_USER environment variable, secret mount, or Rails credential
ContainerConfig.load("POSTGRES_USER")

# Retrieve the value of the POSTGRES_PORT environment variable, secret mount, or Rails credential as an integer with a default value of 5432
ContainerConfig.load("POSTGRES_PORT", type: :integer, default: 5432)

# Retrieve the value of the POSTGRES_PASSWORD environment variable, secret mount, or Rails credential and raise an exception if it cannot be found
ContainerConfig.load("POSTGRES_PASSWORD", required: true)

Full documentation is available in the ContainerConfig GitHub Pages.

Extending ContainerConfig

ContainerConfig may be extended by adding more value providers to gather configuration data or by adding more type coercers to coerce retrieved data into desired types.

Value Providers

More value providers may be added by creating a new class that inherits from ContainerConfig::Provider::Base and implementing the name and load methods. The name method should return a String name for your value provider and the load method should receive a String key, *dig_keys, and **options and return the found value or nil.

You may optionally call super from load to enable logging by default.

# Define a new value provider that returns the abstract from a DuckDuckGo instant result search (https://duckduckgo.com/api)
require "container_config"
require "uri"
require "net/http"
require "json"

class DuckDuckGoAbstractProvider < ContainerConfig::Provider::Base
  def name
    "DuckDuckGo Wikipedia abstract provider"
  end

  def load(key, *dig_keys, **options)
    super
    
    response = Net::HTTP.get(URI.parse("https://api.duckduckgo.com/?q=#{URI.encode_www_form([key])}&format=json"))
    JSON.parse(response)["Abstract"]
  end
end

# Add the DuckDuckGo value provider to the array of existing providers
ContainerConfig.providers << DuckDuckGoAbstractProvider.new

# Use the DuckDuckGo value provider
ContainerConfig.load("rockhopper penguins")
# => "The rockhopper penguins are three closely related taxa of crested penguins..."

Type Coercers

More supported types may be added by creating a new class that inherits from ContainerConfig::Coercer::Base and implementing the name, type, and coerce methods. The name method should return a String name for your type coercer, the type method should return a Symbol type for your type coercer, and the coerce method should receive a single Object value and return your coerced type.

# Define a new type coercer that simply prepends "MyType: " to the string representation of a value
require "container_config"

class MyTypeCoercer < ContainerConfig::Coercer::Base
  def name
    "My Type"
  end

  def type
    :my_type
  end

  def coerce(value)
    "MyType: #{value}"
  end
end

# Add the type coercer to the array of existing type coercers
ContainerConfig.coercers << MyTypeCoercer.new

# Use the type coercer (KEY has value "key_value")
ContainerConfig.load("KEY", type: :my_type)
# => "MyType: key_value"

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at github.com/wheatevo/container_config.

License

The gem is available as open source under the terms of the MIT License.