complex_config 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/VERSION +1 -1
- data/complex_config.gemspec +3 -3
- data/lib/complex_config.rb +0 -2
- data/lib/complex_config/plugins/uri.rb +2 -1
- data/lib/complex_config/settings.rb +78 -34
- data/lib/complex_config/version.rb +1 -1
- data/spec/complex_config/provider_spec.rb +9 -3
- data/spec/complex_config/settings_spec.rb +38 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d74e24dc69a917bf0f1e11a3d8a93238c11de4be
|
4
|
+
data.tar.gz: d4c8f847392f993b03097ce58c3ea9d96ac8e5c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9412892436dd53c2fa3d2570825b64acc947bb1c78b583b99e61e84747b4fb88077e1704c1f06c0a02eb112112cff911a90de5e7d456015365004a93a08445d
|
7
|
+
data.tar.gz: 0a56013a9ea6a9afcb7aa194f689bf3ae7a05d1d6972e64837506a472f78a8217fab40ee8a6a084b30b0bcc337d30aad2b4262b651816fac59a8e1a68f30543e
|
data/README.md
CHANGED
@@ -143,6 +143,12 @@ Here is the `ComplexConfig::Plugins::MONEY` plugin for example:
|
|
143
143
|
end
|
144
144
|
|
145
145
|
## Changes
|
146
|
+
|
147
|
+
* 2016-07-15 Release 0.7.0
|
148
|
+
* Slim down `ComplexConfig::Settings` interface to avoid clashes with methods
|
149
|
+
mixed into `Object` class or `Enumerable#instance_methods`
|
150
|
+
* 2016-07-15 Release 0.6.0
|
151
|
+
* Depend on mize gem for caching.
|
146
152
|
* 2016-06-23 Release 0.5.2
|
147
153
|
* Resolve index access via the plugin code path, so foo.bar and foo[:bar]
|
148
154
|
have the same result for a plugin key.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.0
|
data/complex_config.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: complex_config 0.
|
2
|
+
# stub: complex_config 0.7.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "complex_config"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.7.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Florian Frank"]
|
11
|
-
s.date = "2016-07-
|
11
|
+
s.date = "2016-07-18"
|
12
12
|
s.description = "This library allows you to access configuration files via a simple interface"
|
13
13
|
s.email = "flori@ping.de"
|
14
14
|
s.extra_rdoc_files = ["README.md", "lib/complex_config.rb", "lib/complex_config/config.rb", "lib/complex_config/errors.rb", "lib/complex_config/plugins.rb", "lib/complex_config/plugins/enable.rb", "lib/complex_config/plugins/money.rb", "lib/complex_config/plugins/uri.rb", "lib/complex_config/provider.rb", "lib/complex_config/proxy.rb", "lib/complex_config/railtie.rb", "lib/complex_config/rude.rb", "lib/complex_config/settings.rb", "lib/complex_config/shortcuts.rb", "lib/complex_config/version.rb"]
|
data/lib/complex_config.rb
CHANGED
@@ -2,12 +2,37 @@ require 'json'
|
|
2
2
|
require 'tins/xt/ask_and_send'
|
3
3
|
require 'tins/thread_local'
|
4
4
|
|
5
|
-
class ComplexConfig::Settings <
|
6
|
-
|
7
|
-
|
8
|
-
end
|
5
|
+
class ComplexConfig::Settings < BasicObject
|
6
|
+
include ::Kernel
|
7
|
+
include ::Tins::AskAndSend
|
9
8
|
|
10
9
|
class << self
|
10
|
+
def [](*a)
|
11
|
+
from_hash(*a)
|
12
|
+
end
|
13
|
+
|
14
|
+
def from_hash(object)
|
15
|
+
case
|
16
|
+
when object.respond_to?(:to_hash)
|
17
|
+
result = new
|
18
|
+
object.to_hash.each do |key, value|
|
19
|
+
result[key] = from_hash(value)
|
20
|
+
end
|
21
|
+
result
|
22
|
+
when object.respond_to?(:to_ary)
|
23
|
+
object.to_ary.map { |a| from_hash(a) }
|
24
|
+
else
|
25
|
+
object
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def build(name, hash)
|
30
|
+
name.nil? or self.name_prefix = name.to_sym
|
31
|
+
from_hash(hash)
|
32
|
+
ensure
|
33
|
+
self.name_prefix = nil
|
34
|
+
end
|
35
|
+
|
11
36
|
extend Tins::ThreadLocal
|
12
37
|
|
13
38
|
thread_local :name_prefix
|
@@ -15,34 +40,39 @@ class ComplexConfig::Settings < JSON::GenericObject
|
|
15
40
|
|
16
41
|
attr_accessor :name_prefix
|
17
42
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
43
|
+
def initialize(hash = nil)
|
44
|
+
self.name_prefix = self.class.name_prefix
|
45
|
+
@table = {}
|
46
|
+
if hash
|
47
|
+
hash.each_pair do |k, v|
|
48
|
+
k = k.to_sym
|
49
|
+
@table[k] = v
|
50
|
+
end
|
51
|
+
end
|
23
52
|
end
|
24
53
|
|
25
|
-
def
|
26
|
-
self.name_prefix = self.class.name_prefix
|
54
|
+
def initialize_copy(orig)
|
27
55
|
super
|
56
|
+
@table = @table.dup
|
57
|
+
self
|
28
58
|
end
|
29
59
|
|
30
60
|
def attribute_set?(name)
|
31
|
-
table.key?(name.to_sym)
|
61
|
+
@table.key?(name.to_sym)
|
32
62
|
end
|
33
63
|
|
34
64
|
def attribute_names
|
35
|
-
table.keys
|
65
|
+
@table.keys
|
36
66
|
end
|
37
67
|
|
38
68
|
def attribute_values
|
39
|
-
table.values
|
69
|
+
@table.values
|
40
70
|
end
|
41
71
|
|
42
72
|
def to_h
|
43
73
|
table_enumerator.each_with_object({}) do |(k, v), h|
|
44
74
|
h[k] =
|
45
|
-
if Array === v
|
75
|
+
if ::Array === v
|
46
76
|
v.to_ary.map { |x| (x.ask_and_send(:to_h) rescue x) || x }
|
47
77
|
elsif v.respond_to?(:to_h)
|
48
78
|
v.ask_and_send(:to_h) rescue v
|
@@ -52,6 +82,10 @@ class ComplexConfig::Settings < JSON::GenericObject
|
|
52
82
|
end
|
53
83
|
end
|
54
84
|
|
85
|
+
def size
|
86
|
+
each.count
|
87
|
+
end
|
88
|
+
|
55
89
|
def to_s(pair_sep: ' = ', path_sep: ?.)
|
56
90
|
pathes(path_sep: path_sep).inject('') do |result, (path, value)|
|
57
91
|
result << "#{path}#{pair_sep}#{value.inspect}\n"
|
@@ -62,17 +96,17 @@ class ComplexConfig::Settings < JSON::GenericObject
|
|
62
96
|
hash.each do |key, value|
|
63
97
|
path = prefix.empty? ? key.to_s : "#{prefix}#{path_sep}#{key}"
|
64
98
|
case value
|
65
|
-
when ComplexConfig::Settings
|
99
|
+
when ::ComplexConfig::Settings
|
66
100
|
pathes(
|
67
101
|
value,
|
68
102
|
path_sep: path_sep,
|
69
103
|
prefix: path,
|
70
104
|
result: result
|
71
105
|
)
|
72
|
-
when Array
|
106
|
+
when ::Array
|
73
107
|
value.each_with_index do |v, i|
|
74
108
|
sub_path = path + "[#{i}]"
|
75
|
-
if ComplexConfig::Settings === v
|
109
|
+
if ::ComplexConfig::Settings === v
|
76
110
|
pathes(
|
77
111
|
v,
|
78
112
|
path_sep: path_sep,
|
@@ -90,12 +124,16 @@ class ComplexConfig::Settings < JSON::GenericObject
|
|
90
124
|
result
|
91
125
|
end
|
92
126
|
|
127
|
+
alias inspect to_s
|
93
128
|
|
94
|
-
def
|
95
|
-
|
129
|
+
def pretty_print(q)
|
130
|
+
q.text inspect
|
96
131
|
end
|
97
132
|
|
98
|
-
|
133
|
+
def freeze
|
134
|
+
@table.freeze
|
135
|
+
super
|
136
|
+
end
|
99
137
|
|
100
138
|
def deep_freeze
|
101
139
|
table_enumerator.each do |_, v|
|
@@ -104,26 +142,34 @@ class ComplexConfig::Settings < JSON::GenericObject
|
|
104
142
|
freeze
|
105
143
|
end
|
106
144
|
|
107
|
-
alias index []
|
108
|
-
|
109
145
|
def [](name)
|
110
146
|
if !attribute_set?(name) and
|
111
|
-
value = ComplexConfig::Provider.apply_plugins(self, name)
|
147
|
+
value = ::ComplexConfig::Provider.apply_plugins(self, name)
|
112
148
|
then
|
113
149
|
value
|
114
150
|
else
|
115
|
-
|
151
|
+
@table[name.to_sym]
|
116
152
|
end
|
117
153
|
end
|
118
154
|
|
155
|
+
def []=(name, value)
|
156
|
+
@table[name.to_sym] = value
|
157
|
+
end
|
158
|
+
|
159
|
+
def each(&block)
|
160
|
+
table_enumerator.each(&block)
|
161
|
+
end
|
162
|
+
|
119
163
|
private
|
120
164
|
|
165
|
+
attr_reader :table
|
166
|
+
|
121
167
|
def table_enumerator
|
122
|
-
table.enum_for(:each)
|
168
|
+
@table.enum_for(:each)
|
123
169
|
end
|
124
170
|
|
125
171
|
def respond_to_missing?(id, include_private = false)
|
126
|
-
id =~ /\?\z/ ||
|
172
|
+
id =~ /\?\z/ || attribute_set?(id)
|
127
173
|
end
|
128
174
|
|
129
175
|
def skip
|
@@ -135,20 +181,18 @@ class ComplexConfig::Settings < JSON::GenericObject
|
|
135
181
|
when id =~ /\?\z/
|
136
182
|
begin
|
137
183
|
public_send $`.to_sym, *a, &b
|
138
|
-
rescue ComplexConfig::AttributeMissing
|
184
|
+
rescue ::ComplexConfig::AttributeMissing
|
139
185
|
nil
|
140
186
|
end
|
141
187
|
when id =~ /=\z/
|
142
|
-
|
143
|
-
when value = ComplexConfig::Provider.apply_plugins(self, id)
|
188
|
+
@table[$`.to_sym] = a.first
|
189
|
+
when value = ::ComplexConfig::Provider.apply_plugins(self, id)
|
144
190
|
value
|
145
191
|
else
|
146
192
|
if attribute_set?(id)
|
147
|
-
|
148
|
-
elsif table.respond_to?(id)
|
149
|
-
table.__send__(id, *a, &b)
|
193
|
+
@table[id]
|
150
194
|
else
|
151
|
-
raise ComplexConfig::AttributeMissing, "no attribute named #{id.inspect}"
|
195
|
+
raise ::ComplexConfig::AttributeMissing, "no attribute named #{id.inspect}"
|
152
196
|
end
|
153
197
|
end
|
154
198
|
end
|
@@ -11,7 +11,13 @@ RSpec.describe ComplexConfig::Provider do
|
|
11
11
|
|
12
12
|
context 'plugin' do
|
13
13
|
let :plugin do
|
14
|
-
-> id {
|
14
|
+
-> id {
|
15
|
+
if id == :evaluate_plugin
|
16
|
+
:evaluated
|
17
|
+
else
|
18
|
+
skip
|
19
|
+
end
|
20
|
+
}
|
15
21
|
end
|
16
22
|
|
17
23
|
let :setting do
|
@@ -28,8 +34,8 @@ RSpec.describe ComplexConfig::Provider do
|
|
28
34
|
|
29
35
|
it 'can apply plugins' do
|
30
36
|
provider.add_plugin plugin
|
31
|
-
|
32
|
-
expect(provider.apply_plugins(setting, :
|
37
|
+
allow(setting).to receive(:skip).and_throw :skip
|
38
|
+
expect(provider.apply_plugins(setting, :evaluate_plugin)).to eq :evaluated
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
@@ -17,6 +17,40 @@ RSpec.describe ComplexConfig::Settings do
|
|
17
17
|
]
|
18
18
|
end
|
19
19
|
|
20
|
+
it 'can be initialized with a hash' do
|
21
|
+
s = ComplexConfig::Settings.new(foo: 'bar')
|
22
|
+
expect(s.foo).to eq 'bar'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'can be duped and changed' do
|
26
|
+
s = ComplexConfig::Settings.new(foo: 'bar')
|
27
|
+
t = s.dup
|
28
|
+
expect(s.foo).to eq 'bar'
|
29
|
+
t.foo = 'baz'
|
30
|
+
expect(s.foo).to eq 'bar'
|
31
|
+
expect(t.foo).to eq 'baz'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'can set its attributes' do
|
35
|
+
expect {
|
36
|
+
settings.blub = 'blub'
|
37
|
+
}.to change {
|
38
|
+
settings.blub?
|
39
|
+
}.from(nil).to('blub')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'has a size' do
|
43
|
+
expect(settings.size).to eq 1
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'can set its attributes via index method' do
|
47
|
+
expect {
|
48
|
+
settings['blub'] = 'blub'
|
49
|
+
}.to change {
|
50
|
+
settings.blub?
|
51
|
+
}.from(nil).to('blub')
|
52
|
+
end
|
53
|
+
|
20
54
|
it "can return an attribute's value" do
|
21
55
|
expect(settings.foo.bar.baz).to eq true
|
22
56
|
end
|
@@ -64,9 +98,10 @@ ary[2] = 3
|
|
64
98
|
EOT
|
65
99
|
end
|
66
100
|
|
67
|
-
it 'can be
|
68
|
-
|
69
|
-
expect(
|
101
|
+
it 'can be pretty printed' do
|
102
|
+
q = double
|
103
|
+
expect(q).to receive(:text).with("foo.bar.baz = true\nfoo.qux = \"quux\"\n")
|
104
|
+
settings.pretty_print(q)
|
70
105
|
end
|
71
106
|
|
72
107
|
it 'raises exception if expected attribute is missing' do
|
@@ -89,9 +124,4 @@ EOT
|
|
89
124
|
settings = ComplexConfig::Settings[zip: 'a string']
|
90
125
|
expect(settings.zip).to eq 'a string'
|
91
126
|
end
|
92
|
-
|
93
|
-
it 'zips the hash if zip was not set' do
|
94
|
-
settings = ComplexConfig::Settings[not_zip: 'a string']
|
95
|
-
expect(settings.zip([1])).to eq [ [ [ :not_zip, 'a string' ], 1 ] ]
|
96
|
-
end
|
97
127
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: complex_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|