confuse 0.1.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +0,0 @@
1
- [default]
2
- foo = 10
3
- bar = 20
@@ -1,18 +0,0 @@
1
- require 'configuration/configurable'
2
-
3
- # An example of adding configuration options to a class.
4
- class SimpleExample
5
- configurable
6
-
7
- config_path 'example/001_simple_example.ini'
8
-
9
- define :foo do
10
- description "How many Foo's are there?"
11
- type :integer
12
- default 1
13
- end
14
-
15
- end
16
-
17
- example = SimpleExample.new
18
- puts example.foo
@@ -1,29 +0,0 @@
1
- require 'configuration/configurable'
2
-
3
- # An example of adding configuration options to a class, seperated by
4
- # namespaces.
5
- class NamespaceExample
6
- configurable
7
-
8
- config_path 'example/002_namespace_example.ini'
9
-
10
- define :bar do
11
- description 'foo_bar'
12
- type :integer
13
- default 1
14
- end
15
-
16
- namespace :foo do
17
- define :bar do
18
- description 'bar_foo'
19
- type :string
20
- default 'Hello, world!'
21
- end
22
- end
23
- end
24
-
25
- example = NamespaceExample.new
26
- puts example.config.inspect
27
- puts example.bar
28
- puts example.config[:foo_bar]
29
- puts example.foo[:bar]
@@ -1,2 +0,0 @@
1
- [default]
2
- foo = 1
@@ -1,9 +0,0 @@
1
- require 'confuse'
2
-
3
- class ExampleConfig < Confuse::ConfigBase
4
- define :foo do
5
- default 10
6
- end
7
- end
8
-
9
- puts ExampleConfig.new('example/003_config_subclass_instance.ini').foo
@@ -1,26 +0,0 @@
1
- require 'configuration/configurable'
2
-
3
- module ExampleConfig
4
- extend Configuration::ConfigMixin
5
- extend Configuration::DSL
6
-
7
- define :conf do
8
- default 2
9
- end
10
- end
11
-
12
- class Foo
13
- configured_by ExampleConfig
14
-
15
- default_namespace :foo
16
-
17
- define :bar do
18
- default 1
19
- end
20
-
21
- end
22
-
23
- foo = Foo.new
24
- puts foo.config[:conf]
25
- puts foo.bar
26
-
@@ -1,38 +0,0 @@
1
- module Confuse
2
- # A {ConfigItem} is a class for storing a single piece of config. It has a
3
- # key, a type, a description, and a default value.
4
- class ConfigItem
5
- attr_reader :key
6
- attr_writer :value
7
- attr_reader :default_value
8
-
9
- def initialize(name, &block)
10
- @key = name
11
- instance_eval(&block) unless block.nil?
12
- end
13
-
14
- def description(description = nil)
15
- @description = description unless description.nil?
16
- @description
17
- end
18
-
19
- def type(type = nil)
20
- @type = type unless type.nil?
21
- @type
22
- end
23
-
24
- def default(value = nil, &block)
25
- @default_value = value unless value.nil?
26
- @default_value = block unless block.nil?
27
- end
28
-
29
- def value=(val)
30
- @value = val
31
- end
32
-
33
- def value
34
- @value || @default_value
35
- end
36
- end
37
- end
38
-
@@ -1,135 +0,0 @@
1
- require 'confuse/namespace'
2
- require 'inifile'
3
- require 'yaml'
4
-
5
- module Confuse
6
- # Mixin for configuration.
7
- module ConfigMixin
8
- def namespaces
9
- @namespaces ||= {}
10
- end
11
-
12
- def load_namespaces(new_namespaces)
13
- new_namespaces.each do |key, value|
14
- existing = namespaces[key]
15
- existing ? existing.merge!(value) : namespaces[key] = value.clone
16
- end
17
- @foo = true
18
- end
19
-
20
- def read_files(file_paths)
21
- Array(file_paths).map do |path|
22
- if File.directory?(path)
23
- load_config_dir(path)
24
- elsif File.exists?(path)
25
- load_config_file(path)
26
- end
27
- end.flatten.compact.each { |c| mixin_config!(c) }
28
- end
29
-
30
- def [](key)
31
- namespace = find_namespace(key) || :default
32
- rest_of_key = rest_of_key(key, namespace)
33
- ns = namespaces[namespace]
34
- return ns unless rest_of_key
35
- ns[rest_of_key, self]
36
- end
37
-
38
- def []=(key, value)
39
- puts 'WARNING: changing config after it has been set!'
40
- mixin_config!({ key => value })
41
- end
42
-
43
- def to_hash
44
- namespaces.reduce({}) do |memo, (name, namespace)|
45
- namespace.keys.each do |key|
46
- if name != :default
47
- memo[:"#{name}_#{key}"] = namespace[key, self]
48
- else
49
- memo[:"#{key}"] = namespace[key, self]
50
- end
51
- end
52
- memo
53
- end
54
- end
55
-
56
- # We allow the namespace and the key to be concatenated with an '_', so this
57
- # method is to search the possible substrings that could make up the
58
- # namespace for a key.
59
- #
60
- # This does not guarentee that the suffix of the namespace that is found is
61
- # a valid key in that namespace.
62
- #
63
- # @param [Symbol] key to search
64
- def find_namespace(key)
65
- until key.to_s.empty? || @namespaces[key.to_sym]
66
- key = (s = key.to_s)[0, s.rindex('_') || 0]
67
- end
68
- key.to_s.empty? ? nil : key.to_sym
69
- end
70
-
71
- # Once we've found the namespace, we want to find the rest of the string
72
- # to use as the rest of the key. If the namespace isn't a substring of the
73
- # key (e.g. :default), we return the key unaltered.
74
- #
75
- # @param [Symbol] key The full key
76
- # @param [Symbol] namespace The substring of the key that is the
77
- # namespace.
78
- def rest_of_key(key, namespace)
79
- key_s = key.to_s
80
- namespace_s = namespace.to_s
81
- return nil if key_s == namespace_s
82
- index = key_s.index(namespace_s) && (namespace_s.length + 1)
83
- key_s[index || 0, key_s.length].to_sym
84
- end
85
-
86
- def load_config_dir(config_dir)
87
- Dir[config_dir + '/*.{ini,conf,yaml}'].map do |conf_file|
88
- load_config_file(conf_file)
89
- end
90
- end
91
-
92
- def load_config_file(conf_file)
93
- conf = load_ini(conf_file) || load_yaml(conf_file)
94
- raise "Can't parse #{conf_file}" unless conf
95
- conf
96
- end
97
-
98
- def mixin_config!(config)
99
- config.each do |key, value|
100
- namespace_name = find_namespace(key) || :default
101
- namespace = @namespaces[namespace_name]
102
- if value.respond_to?(:keys)
103
- # if its a hash, set each key in the hash as a config item in the
104
- # namespace
105
- value.each { |k, v| namespace[k] = v }
106
- else
107
- # otherwise, set it directly in the namespace
108
- namespace[rest_of_key(key, namespace_name)] = value
109
- end
110
- end
111
- end
112
-
113
- def load_ini(file)
114
- begin
115
- # make sure they keys are ruby symbols
116
- symbolise_hash_keys(IniFile.load(file).to_h)
117
- rescue IniFile::Error
118
- nil
119
- end
120
- end
121
-
122
- def symbolise_hash_keys(hash)
123
- hash.reduce({}) do |memo, (key, val)|
124
- memo[key.to_sym] =
125
- val.respond_to?(:reduce) ? symbolise_hash_keys(val) : val
126
- memo
127
- end
128
- end
129
-
130
- def load_yaml(file)
131
- YAML.load(File.read(file))
132
- end
133
-
134
- end
135
- end
@@ -1,15 +0,0 @@
1
- require 'confuse'
2
-
3
- # Monkey patch class to easily allow a class to be configurable.
4
- class Class
5
- def configurable
6
- extend Confuse::DSL
7
- include Confuse::InstanceMethods
8
- end
9
-
10
- def configured_by(config)
11
- configurable
12
- @configured_by = config
13
- end
14
- end
15
-
@@ -1,68 +0,0 @@
1
- require 'confuse/config'
2
-
3
- module Confuse
4
- # DSL for setting up a configurable class
5
- module DSL
6
- attr_reader :configured_by
7
-
8
- def configured_by(config = Config)
9
- @configured_by ||= config
10
- end
11
-
12
- def default_namespace(namespace = :default)
13
- @default_namespace ||= namespace
14
- end
15
-
16
- def config_path(*paths)
17
- @config_path ||= []
18
- @config_path.concat paths
19
- end
20
-
21
- def namespaces
22
- @namespaces ||= {
23
- default_namespace => Namespace.new(&(Proc.new { }))
24
- }
25
- end
26
-
27
- def define(name, &block)
28
- namespaces[default_namespace].define(name, &block)
29
- getter(name, default_namespace)
30
- end
31
-
32
- def namespace(name, &block)
33
- new_namespace = Namespace.new(&block)
34
- if namespaces[name.to_sym]
35
- namespaces[name.to_sym].merge! new_namespace
36
- else
37
- namespaces[name.to_sym] = new_namespace
38
- end
39
- getter(name)
40
- end
41
-
42
- def getter(name, namespace = nil)
43
- class_eval do
44
- if namespace.nil?
45
- define_method(name) do
46
- config[name]
47
- end
48
- else
49
- define_method(name) do
50
- config[namespace][name, config]
51
- end
52
- end
53
- end
54
- end
55
-
56
- end
57
-
58
- # Instance methods for getting the defined configuration from an instance of
59
- # a configured class.
60
- module InstanceMethods
61
- # Lazilly create the config object when it is first requested.
62
- def config
63
- self.class.configured_by.load_namespaces(self.class.namespaces)
64
- self.class.configured_by.read_files(self.class.config_path)
65
- self.class.configured_by
66
- end
67
- end
68
- end
@@ -1,37 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'confuse'
3
-
4
- class Foo < Confuse::ConfigBase
5
- define :foo do
6
- default 'foo'
7
- type :string
8
- description 'foo'
9
- end
10
- end
11
-
12
- class TestConfigBase < MiniTest::Unit::TestCase
13
- # This is easier to test with an instance of a config object, rather than as
14
- # part of the test for the module where other tests can modify the model.
15
- def test_params_hash
16
- assert_equal({ :default_foo => { :type => :string, :doc => 'foo',
17
- :default => 'foo' } },
18
- Foo.params_hash)
19
- end
20
-
21
- def test_can_specify_config_options_on_initialize
22
- config = Foo.new(:conf => { :foo => 'bar' })
23
-
24
- assert_equal 'bar', config[:foo]
25
- end
26
-
27
- def test_two_instances_can_exist_with_different_values
28
- # instatiate two versions of the config
29
- config1 = Foo.new
30
- config2 = Foo.new(:conf => { :foo => 'bar' })
31
-
32
- # assert config1 and config2 are different
33
- assert_equal 'foo', config1[:foo]
34
- assert_equal 'bar', config2[:foo]
35
- end
36
- end
37
-