Skip to content

neopoly/nested_config

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nested_config

Travis Gem Version Code Climate Test Coverage Inline docs

Gem | Source | Documentation

Simple, static, nested application configuration

Usage

require 'nested_config'

class MyApp
  def self.configure
    yield config
  end

  def self.config
    @config ||= MyConfig.new
  end

  class MyConfig < NestedConfig
  end
end

Basic

MyApp.configure do |config|
  config.coins = 1000
  config.user do |user|
    user.max = 5
  end
  config.queue do |queue|
    queue.workers do |workers|
      workers.max = 2
      workers.timeout = 60.seconds
    end
  end
end

MyApp.config.coins # => 1000
MyApp.config.queue.workers.timeout # => 60

Special config keys

Sometimes you need to define config keys which contains spaces, dashes or other special chars. In those case you can use NestedConfig#_:

config = NestedConfig.new.tap do |config|
  config._ "mix & match" do |mix_and_match|
    mix_and_match.name = "Mix & match"
    # ...
  end
end

config["mix & match"].name # => Mix & match

EvaluateOnce

With the module EvaluateOnce you can define config value which will be evaluated lazily. Once.

class MyConfig
  include NestedConfig::EvaluateOnce
end

MyApp.configure do |config|
  config.country_list = proc { Country.all }
end

MyApp.config.country_list # => [List of countries]
MyApp.config.country_list # => [List of countries] (cached)

The initial access to key country_list calls (via call method) the proc and replaces the value. Subsequent calls just fetch the replaced value.

Modifying config using NestedConfig::WithConfig

Values of NestedConfig can be temporalily modified.

This can be used in tests modifying a global application config inside a block:

require 'nested_config/with_config'

class MyCase < MiniTest::TestCase
  include NestedConfig::WithConfig

  def app_config
    MyApp.config # global
  end
end

class SomeCase < MyCase
  def setup
    app_config.tap do |config|
      config.coins = 1000
      config.queue do |queue|
        queue.workers do |workers|
          workers.max = 5
        end
      end
    end
  end

  def test_with_basic_value
    with_config(app_config) do |config|
      config.coins = 500
    end
    # global config reset to previous config
  end

  def test_queue_with_changed_workers
    with_config(app_config, :queue, :workers) do |workers|
      workers.max = 1
      # do stuff with modified config max value
    end
    # global config reset to previous config
  end
end

Key names

Note: NestedConfig is not a blank slate so you CANNOT use defined method names as keys like object_id.

Installation

gem install nested_config

Test

rake test
COVERAGE=1 bundle exec rake test

TODO

  • Make NestedConfig a blank slate

Release

edit lib/nested_config/version.rb
git commit -am "Release X.Y.Z"
rake release