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.
- data/README.md +112 -4
- data/Rakefile +7 -0
- data/confuse.gemspec +1 -0
- data/example/env_example.rb +10 -0
- data/example/example.ini +1 -0
- data/example/example.yaml +1 -0
- data/example/ini_example.rb +10 -0
- data/example/yaml_example.rb +11 -0
- data/lib/confuse.rb +23 -4
- data/lib/confuse/config.rb +22 -33
- data/lib/confuse/definition.rb +52 -0
- data/lib/confuse/errors.rb +12 -0
- data/lib/confuse/item.rb +20 -0
- data/lib/confuse/key_splitter.rb +40 -0
- data/lib/confuse/namespace.rb +6 -59
- data/lib/confuse/source.rb +34 -0
- data/lib/confuse/source/env.rb +28 -0
- data/lib/confuse/source/ini.rb +26 -0
- data/lib/confuse/source/yaml.rb +20 -0
- data/lib/confuse/version.rb +4 -1
- data/test/test_config.rb +27 -44
- data/test/test_confuse.rb +13 -0
- data/test/test_definition.rb +32 -0
- data/test/test_item.rb +21 -0
- data/test/test_key_splitter.rb +53 -0
- data/test/test_namespace.rb +7 -16
- metadata +40 -17
- data/example/001_simple_example.ini +0 -3
- data/example/001_simple_example.rb +0 -18
- data/example/002_namespace_example.rb +0 -29
- data/example/003_config_subclass_instance.ini +0 -2
- data/example/003_config_subclass_instance_example.rb +0 -9
- data/example/004_configured_by.rb +0 -26
- data/lib/confuse/config_item.rb +0 -38
- data/lib/confuse/config_mixin.rb +0 -135
- data/lib/confuse/configurable.rb +0 -15
- data/lib/confuse/dsl.rb +0 -68
- data/test/test_config_base.rb +0 -37
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Confuse
|
4
|
+
module Source
|
5
|
+
class << self
|
6
|
+
def types
|
7
|
+
@types ||= { }
|
8
|
+
end
|
9
|
+
|
10
|
+
def create(options = {})
|
11
|
+
path = options[:path]
|
12
|
+
|
13
|
+
type = if path
|
14
|
+
path[path.rindex('.') + 1, path.length].to_sym
|
15
|
+
end
|
16
|
+
type ||= options[:type]
|
17
|
+
|
18
|
+
if type
|
19
|
+
types[type].new(options)
|
20
|
+
else
|
21
|
+
Env.new(options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def register(type, klass)
|
26
|
+
types[type] = klass
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
require 'confuse/source/ini'
|
33
|
+
require 'confuse/source/yaml'
|
34
|
+
require 'confuse/source/env'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Confuse
|
4
|
+
module Source
|
5
|
+
class Env
|
6
|
+
def initialize(options = {})
|
7
|
+
@prefix = options[:prefix]
|
8
|
+
end
|
9
|
+
|
10
|
+
def [](namespace, key)
|
11
|
+
lookup = key
|
12
|
+
lookup = prepend(namespace, lookup) if namespace
|
13
|
+
lookup = prepend(@prefix, lookup) if @prefix
|
14
|
+
|
15
|
+
ENV[lookup.upcase]
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def prepend(pref, key)
|
21
|
+
"#{pref}_#{key}" if pref
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
register(:env, Env)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'inifile'
|
4
|
+
|
5
|
+
module Confuse
|
6
|
+
module Source
|
7
|
+
class Ini
|
8
|
+
def initialize(options = {})
|
9
|
+
@ini = from_file(options[:path])
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_file(file)
|
13
|
+
IniFile.load(file).to_h
|
14
|
+
rescue IniFile::Error
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def [](namespace, key)
|
19
|
+
namespace ||= :global
|
20
|
+
@ini[namespace.to_s][key.to_s]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
register(:ini, Ini)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Confuse
|
6
|
+
module Source
|
7
|
+
class Yaml
|
8
|
+
def initialize(options = {})
|
9
|
+
@yaml = ::YAML.load_file(options[:path])
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](namespace, key)
|
13
|
+
namespace ? @yaml[namespace][key] : @yaml[key]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
register(:yml, Yaml)
|
18
|
+
register(:yaml, Yaml)
|
19
|
+
end
|
20
|
+
end
|
data/lib/confuse/version.rb
CHANGED
data/test/test_config.rb
CHANGED
@@ -1,62 +1,45 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
1
3
|
require 'minitest/autorun'
|
2
|
-
require 'confuse'
|
3
4
|
|
4
|
-
# Test instance methods
|
5
5
|
class TestConfig < MiniTest::Unit::TestCase
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
def definition
|
7
|
+
@definition ||= Confuse.define do |conf|
|
8
|
+
conf.add_item :foo
|
9
|
+
conf.add_item :bar, :default => 'default'
|
10
|
+
conf.add_item :baz, :required => true
|
11
11
|
end
|
12
|
-
@config = Confuse::Config
|
13
|
-
@config.load_namespaces({ :foo_bar => namespace })
|
14
12
|
end
|
15
13
|
|
16
|
-
def
|
17
|
-
|
14
|
+
def source
|
15
|
+
@source ||= Class.new do
|
16
|
+
def [](namespace, key)
|
17
|
+
'foo' if key == :foo
|
18
|
+
end
|
19
|
+
end.new
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
+
def setup
|
23
|
+
@config = Confuse::Config.new(definition, source)
|
22
24
|
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
+
# gets a value from the source if it is defined, and in the source
|
27
|
+
def test_get_value_from_source
|
28
|
+
assert_equal 'foo', @config.foo
|
26
29
|
end
|
27
30
|
|
28
|
-
|
29
|
-
|
31
|
+
# returns the default value if the source returns nil
|
32
|
+
def test_get_default_from_definition
|
33
|
+
assert_equal 'default', @config.bar
|
30
34
|
end
|
31
35
|
|
32
|
-
|
33
|
-
|
36
|
+
# raises undefined if an item hasn't been set, and has no default
|
37
|
+
def test_get_default_from_definition
|
38
|
+
assert_nil @config.buz
|
34
39
|
end
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
default 1
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
@config.load_namespaces({ :foo_bar => namespace })
|
44
|
-
|
45
|
-
assert @config[:foo_bar][:foo]
|
46
|
-
assert @config[:foo_bar][:baz]
|
41
|
+
# raises an error if any items are required and don't have defaults
|
42
|
+
def test_check
|
43
|
+
assert_raises(Confuse::Errors::Undefined) { @config.check }
|
47
44
|
end
|
48
|
-
|
49
|
-
def test_to_hash
|
50
|
-
config = Class.new(Confuse::ConfigBase) do
|
51
|
-
define :foo do
|
52
|
-
description 'Foo'
|
53
|
-
type :integer
|
54
|
-
default 1
|
55
|
-
end
|
56
|
-
end
|
57
|
-
assert_nil config.new.to_hash[:default_foo]
|
58
|
-
refute_nil config.new.to_hash[:foo]
|
59
|
-
end
|
60
|
-
|
61
45
|
end
|
62
|
-
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
|
5
|
+
class TestConfuse < MiniTest::Unit::TestCase
|
6
|
+
def create_definition
|
7
|
+
definition = Confuse.define do |d|
|
8
|
+
d.add_item :foo, :default => 1, :description => 'Foo'
|
9
|
+
end
|
10
|
+
|
11
|
+
assert definition.instance_of Confuse::Definition
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Confuse
|
4
|
+
class TestDefinition < MiniTest::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@definition = Confuse::Definition.new do |d|
|
7
|
+
d.add_item :foo, :default => 1
|
8
|
+
d.add_namespace :bar do |n|
|
9
|
+
n.add_item(:foo, :default => 1, :description => 'test')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# can define a configuration item
|
15
|
+
def test_define_item
|
16
|
+
assert @definition.defines? :foo
|
17
|
+
end
|
18
|
+
|
19
|
+
# can define a namespace
|
20
|
+
def test_define_namespace
|
21
|
+
assert @definition.defines? :bar_foo
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_default
|
25
|
+
assert_equal 1, @definition.default(nil, :foo)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_default_for_namespaced_item
|
29
|
+
assert_equal 1, @definition.default(:bar, :foo)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/test/test_item.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class TestItem < MiniTest::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@item = Confuse::Item.new(:foo, :default => 1, :description => 'Description')
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_sets_the_default_value
|
9
|
+
assert_equal 1, @item.default
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_sets_the_description
|
13
|
+
assert_equal 'Description', @item.description
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_required_item
|
17
|
+
item = Confuse::Item.new(:foo, :description => 'required!',
|
18
|
+
:required => true)
|
19
|
+
assert_raises(Confuse::Errors::Undefined) { item.default }
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
|
5
|
+
class TestKeySplitter < MiniTest::Unit::TestCase
|
6
|
+
def test_key_with_no_underscore
|
7
|
+
key_splitter = Confuse::KeySplitter.new(:foo)
|
8
|
+
assert_equal 0, key_splitter.possible_namespaces.count
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_key_with_one_underscore
|
12
|
+
key_splitter = Confuse::KeySplitter.new(:foo_bar)
|
13
|
+
assert_equal 1, key_splitter.possible_namespaces.count
|
14
|
+
assert key_splitter.possible_namespaces.include? :foo
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_key_with_many_underscores
|
18
|
+
key_splitter = Confuse::KeySplitter.new(:foo_1_2_3_4_5_6_7_8_9)
|
19
|
+
assert_equal 9, key_splitter.possible_namespaces.count
|
20
|
+
assert key_splitter.possible_namespaces.include? :foo
|
21
|
+
assert key_splitter.possible_namespaces.include? :foo_1
|
22
|
+
assert key_splitter.possible_namespaces.include? :foo_1_2
|
23
|
+
assert key_splitter.possible_namespaces.include? :foo_1_2_3
|
24
|
+
assert key_splitter.possible_namespaces.include? :foo_1_2_3_4
|
25
|
+
assert key_splitter.possible_namespaces.include? :foo_1_2_3_4_5
|
26
|
+
assert key_splitter.possible_namespaces.include? :foo_1_2_3_4_5_6
|
27
|
+
assert key_splitter.possible_namespaces.include? :foo_1_2_3_4_5_6_7
|
28
|
+
assert key_splitter.possible_namespaces.include? :foo_1_2_3_4_5_6_7_8
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_rest_of_key
|
32
|
+
key_splitter = Confuse::KeySplitter.new(:foo_bar)
|
33
|
+
assert_equal :bar, key_splitter.rest_of_key(:foo)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_rest_of_key_return_nil_if_namespace_doesnt_match
|
37
|
+
key_splitter = Confuse::KeySplitter.new(:foo_bar)
|
38
|
+
assert_nil key_splitter.rest_of_key(:baz)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_split
|
42
|
+
key_splitter = Confuse::KeySplitter.new(:foo_1_2_3_4_5_6_7_8_9)
|
43
|
+
assert key_splitter.split.include? [:foo, :"1_2_3_4_5_6_7_8_9"]
|
44
|
+
assert key_splitter.split.include? [:foo_1, :"2_3_4_5_6_7_8_9"]
|
45
|
+
assert key_splitter.split.include? [:foo_1_2, :"3_4_5_6_7_8_9"]
|
46
|
+
assert key_splitter.split.include? [:foo_1_2_3, :"4_5_6_7_8_9"]
|
47
|
+
assert key_splitter.split.include? [:foo_1_2_3_4, :"5_6_7_8_9"]
|
48
|
+
assert key_splitter.split.include? [:foo_1_2_3_4_5, :"6_7_8_9"]
|
49
|
+
assert key_splitter.split.include? [:foo_1_2_3_4_5_6, :"7_8_9"]
|
50
|
+
assert key_splitter.split.include? [:foo_1_2_3_4_5_6_7, :"8_9"]
|
51
|
+
assert key_splitter.split.include? [:foo_1_2_3_4_5_6_7_8, :"9"]
|
52
|
+
end
|
53
|
+
end
|
data/test/test_namespace.rb
CHANGED
@@ -1,25 +1,16 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
1
3
|
require 'minitest/autorun'
|
2
4
|
require 'confuse'
|
3
5
|
|
6
|
+
# Test {Confuse::Namespace}
|
4
7
|
class TestNamespace < MiniTest::Unit::TestCase
|
5
8
|
def setup
|
6
|
-
@namespace = Confuse::Namespace.new
|
7
|
-
define :foo do
|
8
|
-
default 1
|
9
|
-
end
|
10
|
-
end
|
9
|
+
@namespace = Confuse::Namespace.new
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
14
|
-
namespace
|
15
|
-
|
16
|
-
default 1
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
@namespace.merge!(namespace)
|
21
|
-
|
22
|
-
assert @namespace[:foo]
|
23
|
-
assert @namespace[:bar]
|
12
|
+
def test_add_an_item
|
13
|
+
@namespace.add_item(:foo, :default => :foo, :description => 'Test')
|
14
|
+
refute_nil @namespace[:foo]
|
24
15
|
end
|
25
16
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: confuse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
-
- 0
|
8
7
|
- 1
|
9
|
-
-
|
10
|
-
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tom Chipchase
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2014-
|
18
|
+
date: 2014-09-15 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: inifile
|
@@ -60,6 +60,20 @@ dependencies:
|
|
60
60
|
version: "0"
|
61
61
|
type: :development
|
62
62
|
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rake
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
type: :development
|
76
|
+
version_requirements: *id004
|
63
77
|
description: Add nested configuration to an application
|
64
78
|
email:
|
65
79
|
- tom@mediasp.com
|
@@ -77,22 +91,28 @@ files:
|
|
77
91
|
- README.md
|
78
92
|
- Rakefile
|
79
93
|
- confuse.gemspec
|
80
|
-
- example/
|
81
|
-
- example/
|
82
|
-
- example/
|
83
|
-
- example/
|
84
|
-
- example/
|
85
|
-
- example/004_configured_by.rb
|
94
|
+
- example/env_example.rb
|
95
|
+
- example/example.ini
|
96
|
+
- example/example.yaml
|
97
|
+
- example/ini_example.rb
|
98
|
+
- example/yaml_example.rb
|
86
99
|
- lib/confuse.rb
|
87
100
|
- lib/confuse/config.rb
|
88
|
-
- lib/confuse/
|
89
|
-
- lib/confuse/
|
90
|
-
- lib/confuse/
|
91
|
-
- lib/confuse/
|
101
|
+
- lib/confuse/definition.rb
|
102
|
+
- lib/confuse/errors.rb
|
103
|
+
- lib/confuse/item.rb
|
104
|
+
- lib/confuse/key_splitter.rb
|
92
105
|
- lib/confuse/namespace.rb
|
106
|
+
- lib/confuse/source.rb
|
107
|
+
- lib/confuse/source/env.rb
|
108
|
+
- lib/confuse/source/ini.rb
|
109
|
+
- lib/confuse/source/yaml.rb
|
93
110
|
- lib/confuse/version.rb
|
94
111
|
- test/test_config.rb
|
95
|
-
- test/
|
112
|
+
- test/test_confuse.rb
|
113
|
+
- test/test_definition.rb
|
114
|
+
- test/test_item.rb
|
115
|
+
- test/test_key_splitter.rb
|
96
116
|
- test/test_namespace.rb
|
97
117
|
homepage: https://github.com/mediasp/confuse
|
98
118
|
licenses:
|
@@ -129,6 +149,9 @@ specification_version: 3
|
|
129
149
|
summary: A DSL for defining configuration options in classes
|
130
150
|
test_files:
|
131
151
|
- test/test_config.rb
|
132
|
-
- test/
|
152
|
+
- test/test_confuse.rb
|
153
|
+
- test/test_definition.rb
|
154
|
+
- test/test_item.rb
|
155
|
+
- test/test_key_splitter.rb
|
133
156
|
- test/test_namespace.rb
|
134
157
|
has_rdoc:
|