mixlib-config 2.0.0 → 2.1.0.rc.1
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.
- checksums.yaml +4 -4
- data/lib/mixlib/config.rb +122 -14
- data/lib/mixlib/config/configurable.rb +17 -4
- data/lib/mixlib/config/reopened_config_context_with_configurable_error.rb +24 -0
- data/lib/mixlib/config/reopened_configurable_with_config_context_error.rb +24 -0
- data/lib/mixlib/config/version.rb +1 -1
- data/spec/mixlib/config_spec.rb +350 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4aae86fdcef0c668433aa9862d10608ce3d5bcca
|
4
|
+
data.tar.gz: 96cbdd874fd78ffe00883b1e3149e981cc70db37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca9da0a8e7e0f6a0c577e22ae62b1c8abd29eef3c6f64d9ebfe04f7dee57e8a6722e548c936a46ca4f5467f9c93c20daaacfb65762e249c6d046ffd3dae45031
|
7
|
+
data.tar.gz: 657670f954f61bb02a919bfd4570613bc999e0d23c03ac4cea8f92e38f4fae8d53f739f35daf391c4dc73720c2db9fa02917bac8667ff63dedccf19cc6395f10
|
data/lib/mixlib/config.rb
CHANGED
@@ -21,6 +21,8 @@
|
|
21
21
|
require 'mixlib/config/version'
|
22
22
|
require 'mixlib/config/configurable'
|
23
23
|
require 'mixlib/config/unknown_config_option_error'
|
24
|
+
require 'mixlib/config/reopened_config_context_with_configurable_error'
|
25
|
+
require 'mixlib/config/reopened_configurable_with_config_context_error'
|
24
26
|
|
25
27
|
module Mixlib
|
26
28
|
module Config
|
@@ -31,7 +33,7 @@ module Mixlib
|
|
31
33
|
class << base; attr_accessor :config_parent; end
|
32
34
|
base.configuration = Hash.new
|
33
35
|
base.configurables = Hash.new
|
34
|
-
base.config_contexts =
|
36
|
+
base.config_contexts = Hash.new
|
35
37
|
end
|
36
38
|
|
37
39
|
# Loads a given ruby file, and runs instance_eval against it in the context of the current
|
@@ -105,21 +107,106 @@ module Mixlib
|
|
105
107
|
# Resets all config options to their defaults.
|
106
108
|
def reset
|
107
109
|
self.configuration = Hash.new
|
108
|
-
self.config_contexts.each { |config_context| config_context.reset }
|
110
|
+
self.config_contexts.values.each { |config_context| config_context.reset }
|
111
|
+
end
|
112
|
+
|
113
|
+
# Makes a copy of any non-default values.
|
114
|
+
#
|
115
|
+
# This returns a shallow copy of the hash; while the hash itself is
|
116
|
+
# duplicated a la dup, modifying data inside arrays and hashes may modify
|
117
|
+
# the original Config object.
|
118
|
+
#
|
119
|
+
# === Returns
|
120
|
+
#
|
121
|
+
# Hash of values the user has set.
|
122
|
+
#
|
123
|
+
# === Examples
|
124
|
+
#
|
125
|
+
# For example, this config class:
|
126
|
+
#
|
127
|
+
# class MyConfig < Mixlib::Config
|
128
|
+
# default :will_be_set, 1
|
129
|
+
# default :will_be_set_to_default, 1
|
130
|
+
# default :will_not_be_set, 1
|
131
|
+
# configurable(:computed_value) { |x| x*2 }
|
132
|
+
# config_context :group do
|
133
|
+
# default :will_not_be_set, 1
|
134
|
+
# end
|
135
|
+
# config_context :group_never_set
|
136
|
+
# end
|
137
|
+
#
|
138
|
+
# MyConfig.x = 2
|
139
|
+
# MyConfig.will_be_set = 2
|
140
|
+
# MyConfig.will_be_set_to_default = 1
|
141
|
+
# MyConfig.computed_value = 2
|
142
|
+
# MyConfig.group.x = 3
|
143
|
+
#
|
144
|
+
# produces this:
|
145
|
+
#
|
146
|
+
# MyConfig.save == {
|
147
|
+
# :x => 2,
|
148
|
+
# :will_be_set => 2,
|
149
|
+
# :will_be_set_to_default => 1,
|
150
|
+
# :computed_value => 4,
|
151
|
+
# :group => {
|
152
|
+
# :x => 3
|
153
|
+
# }
|
154
|
+
# }
|
155
|
+
#
|
156
|
+
def save(include_defaults = false)
|
157
|
+
result = self.configuration.dup
|
158
|
+
if include_defaults
|
159
|
+
(self.configurables.keys - result.keys).each do |missing_default|
|
160
|
+
# Ask any configurables to save themselves into the result array
|
161
|
+
if self.configurables[missing_default].has_default
|
162
|
+
result[missing_default] = self.configurables[missing_default].default
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
self.config_contexts.each_pair do |key, context|
|
167
|
+
context_result = context.save(include_defaults)
|
168
|
+
result[key] = context_result if context_result.size != 0 || include_defaults
|
169
|
+
end
|
170
|
+
result
|
171
|
+
end
|
172
|
+
|
173
|
+
# Restore non-default values from the given hash.
|
174
|
+
#
|
175
|
+
# This method is the equivalent of +reset+ followed by +merge!(hash)+.
|
176
|
+
#
|
177
|
+
# === Parameters
|
178
|
+
# hash<Hash>: a hash in the same format as output by save.
|
179
|
+
#
|
180
|
+
# === Returns
|
181
|
+
# self
|
182
|
+
def restore(hash)
|
183
|
+
reset
|
184
|
+
merge!(hash)
|
109
185
|
end
|
110
186
|
|
111
187
|
# Merge an incoming hash with our config options
|
112
188
|
#
|
113
189
|
# === Parameters
|
114
|
-
# hash<Hash
|
190
|
+
# hash<Hash>: a hash in the same format as output by save.
|
115
191
|
#
|
116
192
|
# === Returns
|
117
|
-
#
|
193
|
+
# self
|
118
194
|
def merge!(hash)
|
119
|
-
|
195
|
+
hash.each do |key, value|
|
196
|
+
if self.config_contexts.has_key?(key)
|
197
|
+
# Grab the config context and let internal_get cache it if so desired
|
198
|
+
self.config_contexts[key].restore(value)
|
199
|
+
else
|
200
|
+
self.configuration[key] = value
|
201
|
+
end
|
202
|
+
end
|
203
|
+
self
|
120
204
|
end
|
121
205
|
|
122
|
-
# Return the set of config hash keys
|
206
|
+
# Return the set of config hash keys.
|
207
|
+
# This *only* returns hash keys which have been set by the user. In future
|
208
|
+
# versions this will likely be removed in favor of something more explicit.
|
209
|
+
# For now though, we want this to match has_key?
|
123
210
|
#
|
124
211
|
# === Returns
|
125
212
|
# result of Hash#keys
|
@@ -128,11 +215,13 @@ module Mixlib
|
|
128
215
|
end
|
129
216
|
|
130
217
|
# Creates a shallow copy of the internal hash
|
218
|
+
# NOTE: remove this in 3.0 in favor of save. This is completely useless
|
219
|
+
# with default values and configuration_context.
|
131
220
|
#
|
132
221
|
# === Returns
|
133
222
|
# result of Hash#dup
|
134
223
|
def hash_dup
|
135
|
-
|
224
|
+
save
|
136
225
|
end
|
137
226
|
|
138
227
|
# metaprogramming to ensure that the slot for method_symbol
|
@@ -184,6 +273,9 @@ module Mixlib
|
|
184
273
|
# The value of the config option.
|
185
274
|
def configurable(symbol, &block)
|
186
275
|
unless configurables[symbol]
|
276
|
+
if config_contexts.has_key?(symbol)
|
277
|
+
raise ReopenedConfigContextWithConfigurableError, "Cannot redefine config_context #{symbol} as a configurable value"
|
278
|
+
end
|
187
279
|
configurables[symbol] = Configurable.new(symbol)
|
188
280
|
define_attr_accessor_methods(symbol)
|
189
281
|
end
|
@@ -196,6 +288,8 @@ module Mixlib
|
|
196
288
|
# Allows you to create a new config context where you can define new
|
197
289
|
# options with default values.
|
198
290
|
#
|
291
|
+
# This method allows you to open up the configurable more than once.
|
292
|
+
#
|
199
293
|
# For example:
|
200
294
|
#
|
201
295
|
# config_context :server_info do
|
@@ -207,16 +301,25 @@ module Mixlib
|
|
207
301
|
# block<Block>: a block that will be run in the context of this new config
|
208
302
|
# class.
|
209
303
|
def config_context(symbol, &block)
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
304
|
+
if configurables.has_key?(symbol)
|
305
|
+
raise ReopenedConfigurableWithConfigContextError, "Cannot redefine config value #{symbol} with a config context"
|
306
|
+
end
|
307
|
+
|
308
|
+
if config_contexts.has_key?(symbol)
|
309
|
+
context = config_contexts[symbol]
|
310
|
+
else
|
311
|
+
context = Class.new
|
312
|
+
context.extend(::Mixlib::Config)
|
313
|
+
context.config_parent = self
|
314
|
+
config_contexts[symbol] = context
|
315
|
+
define_attr_accessor_methods(symbol)
|
316
|
+
end
|
317
|
+
|
214
318
|
if block
|
215
319
|
context.instance_eval(&block)
|
216
320
|
end
|
217
|
-
|
218
|
-
|
219
|
-
end
|
321
|
+
|
322
|
+
context
|
220
323
|
end
|
221
324
|
|
222
325
|
NOT_PASSED = Object.new
|
@@ -295,6 +398,7 @@ module Mixlib
|
|
295
398
|
private
|
296
399
|
|
297
400
|
# Internal dispatch setter for config values.
|
401
|
+
#
|
298
402
|
# === Parameters
|
299
403
|
# symbol<Symbol>:: Name of the method (variable setter)
|
300
404
|
# value<Object>:: Value to be set in config hash
|
@@ -302,6 +406,8 @@ module Mixlib
|
|
302
406
|
def internal_set(symbol,value)
|
303
407
|
if configurables.has_key?(symbol)
|
304
408
|
configurables[symbol].set(self.configuration, value)
|
409
|
+
elsif config_contexts.has_key?(symbol)
|
410
|
+
config_contexts[symbol].restore(value)
|
305
411
|
else
|
306
412
|
if config_strict_mode == :warn
|
307
413
|
Chef::Log.warn("Setting unsupported config value #{method_name}..")
|
@@ -315,6 +421,8 @@ module Mixlib
|
|
315
421
|
def internal_get(symbol)
|
316
422
|
if configurables.has_key?(symbol)
|
317
423
|
configurables[symbol].get(self.configuration)
|
424
|
+
elsif config_contexts.has_key?(symbol)
|
425
|
+
config_contexts[symbol]
|
318
426
|
else
|
319
427
|
if config_strict_mode == :warn
|
320
428
|
Chef::Log.warn("Reading unsupported config value #{symbol}.")
|
@@ -21,13 +21,17 @@ module Mixlib
|
|
21
21
|
class Configurable
|
22
22
|
def initialize(symbol)
|
23
23
|
@symbol = symbol
|
24
|
-
@
|
24
|
+
@default_block = nil
|
25
|
+
@has_default = false
|
25
26
|
@default_value = nil
|
26
27
|
@writes_value = nil
|
27
28
|
end
|
28
29
|
|
30
|
+
attr_reader :has_default
|
31
|
+
|
29
32
|
def defaults_to(default_value = nil, &block)
|
30
|
-
@
|
33
|
+
@has_default = true
|
34
|
+
@default_block = block
|
31
35
|
@default_value = default_value
|
32
36
|
self
|
33
37
|
end
|
@@ -40,11 +44,12 @@ module Mixlib
|
|
40
44
|
def get(config)
|
41
45
|
if config.has_key?(@symbol)
|
42
46
|
config[@symbol]
|
43
|
-
elsif @
|
44
|
-
@
|
47
|
+
elsif @default_block
|
48
|
+
@default_block.call
|
45
49
|
else
|
46
50
|
begin
|
47
51
|
# Some things cannot be dup'd, and you won't know this till after the fact
|
52
|
+
# because all values implement dup
|
48
53
|
config[@symbol] = @default_value.dup
|
49
54
|
rescue TypeError
|
50
55
|
@default_value
|
@@ -55,6 +60,14 @@ module Mixlib
|
|
55
60
|
def set(config, value)
|
56
61
|
config[@symbol] = @writes_value ? @writes_value.call(value) : value
|
57
62
|
end
|
63
|
+
|
64
|
+
def default
|
65
|
+
if @default_block
|
66
|
+
@default_block.call
|
67
|
+
else
|
68
|
+
@default_value
|
69
|
+
end
|
70
|
+
end
|
58
71
|
end
|
59
72
|
end
|
60
73
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module Mixlib
|
20
|
+
module Config
|
21
|
+
class ReopenedConfigContextWithConfigurableError < StandardError
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module Mixlib
|
20
|
+
module Config
|
21
|
+
class ReopenedConfigurableWithConfigContextError < StandardError
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/mixlib/config_spec.rb
CHANGED
@@ -275,6 +275,32 @@ describe Mixlib::Config do
|
|
275
275
|
@klass.reset
|
276
276
|
@klass.attr.should == 4
|
277
277
|
end
|
278
|
+
|
279
|
+
it "save should not save anything for it" do
|
280
|
+
@klass.save.should == {}
|
281
|
+
end
|
282
|
+
|
283
|
+
it "save with include_defaults should save all defaults" do
|
284
|
+
@klass.save(true).should == { :attr => 4 }
|
285
|
+
end
|
286
|
+
|
287
|
+
it "save should save the new value if it gets set" do
|
288
|
+
@klass.attr 5
|
289
|
+
(saved = @klass.save).should == { :attr => 5 }
|
290
|
+
@klass.reset
|
291
|
+
@klass.attr.should == 4
|
292
|
+
@klass.restore(saved)
|
293
|
+
@klass.attr.should == 5
|
294
|
+
end
|
295
|
+
|
296
|
+
it "save should save the new value even if it is set to its default value" do
|
297
|
+
@klass.attr 4
|
298
|
+
(saved = @klass.save).should == { :attr => 4 }
|
299
|
+
@klass.reset
|
300
|
+
@klass.save.should == {}
|
301
|
+
@klass.restore(saved)
|
302
|
+
@klass.save.should == { :attr => 4 }
|
303
|
+
end
|
278
304
|
end
|
279
305
|
|
280
306
|
describe "When config has a default value block" do
|
@@ -283,7 +309,7 @@ describe Mixlib::Config do
|
|
283
309
|
@klass.extend(::Mixlib::Config)
|
284
310
|
@klass.class_eval do
|
285
311
|
default :x, 4
|
286
|
-
default(:attr) { x*2}
|
312
|
+
default(:attr) { x*2 }
|
287
313
|
end
|
288
314
|
end
|
289
315
|
|
@@ -317,6 +343,32 @@ describe Mixlib::Config do
|
|
317
343
|
@klass.reset
|
318
344
|
@klass.attr.should == 8
|
319
345
|
end
|
346
|
+
|
347
|
+
it "save should not save anything for it" do
|
348
|
+
@klass.save.should == {}
|
349
|
+
end
|
350
|
+
|
351
|
+
it "save with include_defaults should save all defaults" do
|
352
|
+
@klass.save(true).should == { :attr => 8, :x => 4 }
|
353
|
+
end
|
354
|
+
|
355
|
+
it "save should save the new value if it gets set" do
|
356
|
+
@klass.attr 5
|
357
|
+
(saved = @klass.save).should == { :attr => 5 }
|
358
|
+
@klass.reset
|
359
|
+
@klass.attr.should == 8
|
360
|
+
@klass.restore(saved)
|
361
|
+
@klass.attr.should == 5
|
362
|
+
end
|
363
|
+
|
364
|
+
it "save should save the new value even if it is set to its default value" do
|
365
|
+
@klass.attr 8
|
366
|
+
(saved = @klass.save).should == { :attr => 8 }
|
367
|
+
@klass.reset
|
368
|
+
@klass.save.should == {}
|
369
|
+
@klass.restore(saved)
|
370
|
+
@klass.save.should == { :attr => 8 }
|
371
|
+
end
|
320
372
|
end
|
321
373
|
|
322
374
|
describe "When config has an array default value" do
|
@@ -332,6 +384,32 @@ describe Mixlib::Config do
|
|
332
384
|
@klass.reset
|
333
385
|
@klass.attr.should == []
|
334
386
|
end
|
387
|
+
|
388
|
+
it "save should not save anything for it" do
|
389
|
+
@klass.save.should == {}
|
390
|
+
end
|
391
|
+
|
392
|
+
it "save with include_defaults should save all defaults" do
|
393
|
+
@klass.save(true).should == { :attr => [] }
|
394
|
+
end
|
395
|
+
|
396
|
+
it "save should save the new value if it gets set" do
|
397
|
+
@klass.attr << 'x'
|
398
|
+
(saved = @klass.save).should == { :attr => [ 'x' ] }
|
399
|
+
@klass.reset
|
400
|
+
@klass.attr.should == []
|
401
|
+
@klass.restore(saved)
|
402
|
+
@klass.attr.should == [ 'x' ]
|
403
|
+
end
|
404
|
+
|
405
|
+
it "save should save the new value even if it is set to its default value" do
|
406
|
+
@klass.attr = []
|
407
|
+
(saved = @klass.save).should == { :attr => [] }
|
408
|
+
@klass.reset
|
409
|
+
@klass.save.should == {}
|
410
|
+
@klass.restore(saved)
|
411
|
+
@klass.save.should == { :attr => [] }
|
412
|
+
end
|
335
413
|
end
|
336
414
|
|
337
415
|
describe "When config has a hash default value" do
|
@@ -347,6 +425,32 @@ describe Mixlib::Config do
|
|
347
425
|
@klass.reset
|
348
426
|
@klass.attr[:x].should == nil
|
349
427
|
end
|
428
|
+
|
429
|
+
it "save should not save anything for it" do
|
430
|
+
@klass.save.should == {}
|
431
|
+
end
|
432
|
+
|
433
|
+
it "save with include_defaults should save all defaults" do
|
434
|
+
@klass.save(true).should == { :attr => {} }
|
435
|
+
end
|
436
|
+
|
437
|
+
it "save should save the new value if it gets set" do
|
438
|
+
@klass.attr[:hi] = 'lo'
|
439
|
+
(saved = @klass.save).should == { :attr => { :hi => 'lo' } }
|
440
|
+
@klass.reset
|
441
|
+
@klass.attr.should == {}
|
442
|
+
@klass.restore(saved)
|
443
|
+
@klass.save.should == { :attr => { :hi => 'lo' } }
|
444
|
+
end
|
445
|
+
|
446
|
+
it "save should save the new value even if it is set to its default value" do
|
447
|
+
@klass.attr = {}
|
448
|
+
(saved = @klass.save).should == { :attr => {} }
|
449
|
+
@klass.reset
|
450
|
+
@klass.save.should == {}
|
451
|
+
@klass.restore(saved)
|
452
|
+
@klass.save.should == { :attr => {} }
|
453
|
+
end
|
350
454
|
end
|
351
455
|
|
352
456
|
describe "When config has a string default value" do
|
@@ -362,6 +466,32 @@ describe Mixlib::Config do
|
|
362
466
|
@klass.reset
|
363
467
|
@klass.attr.should == 'hello'
|
364
468
|
end
|
469
|
+
|
470
|
+
it "save should not save anything for it" do
|
471
|
+
@klass.save.should == {}
|
472
|
+
end
|
473
|
+
|
474
|
+
it "save with include_defaults should save all defaults" do
|
475
|
+
@klass.save(true).should == { :attr => 'hello' }
|
476
|
+
end
|
477
|
+
|
478
|
+
it "save should save the new value if it gets set" do
|
479
|
+
@klass.attr << ' world'
|
480
|
+
(saved = @klass.save).should == { :attr => 'hello world' }
|
481
|
+
@klass.reset
|
482
|
+
@klass.attr.should == 'hello'
|
483
|
+
@klass.restore(saved)
|
484
|
+
@klass.attr.should == 'hello world'
|
485
|
+
end
|
486
|
+
|
487
|
+
it "save should save the new value even if it is set to its default value" do
|
488
|
+
@klass.attr 'hello world'
|
489
|
+
(saved = @klass.save).should == { :attr => 'hello world' }
|
490
|
+
@klass.reset
|
491
|
+
@klass.save.should == {}
|
492
|
+
@klass.restore(saved)
|
493
|
+
@klass.save.should == { :attr => 'hello world' }
|
494
|
+
end
|
365
495
|
end
|
366
496
|
|
367
497
|
describe "When config has a a default value block" do
|
@@ -398,6 +528,32 @@ describe Mixlib::Config do
|
|
398
528
|
@klass.reset
|
399
529
|
@klass.attr.should == 4
|
400
530
|
end
|
531
|
+
|
532
|
+
it "save should not save anything for it" do
|
533
|
+
@klass.save.should == {}
|
534
|
+
end
|
535
|
+
|
536
|
+
it "save with include_defaults should save all defaults" do
|
537
|
+
@klass.save(true).should == { :attr => 4 }
|
538
|
+
end
|
539
|
+
|
540
|
+
it "save should save the new value if it gets set" do
|
541
|
+
@klass.attr 5
|
542
|
+
(saved = @klass.save).should == { :attr => 5 }
|
543
|
+
@klass.reset
|
544
|
+
@klass.attr.should == 4
|
545
|
+
@klass.restore(saved)
|
546
|
+
@klass.attr.should == 5
|
547
|
+
end
|
548
|
+
|
549
|
+
it "save should save the new value even if it is set to its default value" do
|
550
|
+
@klass.attr 4
|
551
|
+
(saved = @klass.save).should == { :attr => 4 }
|
552
|
+
@klass.reset
|
553
|
+
@klass.save.should == {}
|
554
|
+
@klass.restore(saved)
|
555
|
+
@klass.save.should == { :attr => 4 }
|
556
|
+
end
|
401
557
|
end
|
402
558
|
|
403
559
|
describe "When a configurable exists with writer and default value" do
|
@@ -449,6 +605,32 @@ describe Mixlib::Config do
|
|
449
605
|
@klass.reset
|
450
606
|
@klass.attr.should == 4
|
451
607
|
end
|
608
|
+
|
609
|
+
it "save should not save anything for it" do
|
610
|
+
@klass.save.should == {}
|
611
|
+
end
|
612
|
+
|
613
|
+
it "save with include_defaults should save all defaults" do
|
614
|
+
@klass.save(true).should == { :attr => 4 }
|
615
|
+
end
|
616
|
+
|
617
|
+
it "save should save the new value if it gets set" do
|
618
|
+
@klass.attr 5
|
619
|
+
(saved = @klass.save).should == { :attr => 10 }
|
620
|
+
@klass.reset
|
621
|
+
@klass.attr.should == 4
|
622
|
+
@klass.restore(saved)
|
623
|
+
@klass.attr.should == 10
|
624
|
+
end
|
625
|
+
|
626
|
+
it "save should save the new value even if it is set to its default value" do
|
627
|
+
@klass.attr 4
|
628
|
+
(saved = @klass.save).should == { :attr => 8 }
|
629
|
+
@klass.reset
|
630
|
+
@klass.save.should == {}
|
631
|
+
@klass.restore(saved)
|
632
|
+
@klass.save.should == { :attr => 8 }
|
633
|
+
end
|
452
634
|
end
|
453
635
|
|
454
636
|
describe "When a configurable exists with writer and default value set in chained form" do
|
@@ -497,6 +679,32 @@ describe Mixlib::Config do
|
|
497
679
|
@klass.reset
|
498
680
|
@klass.attr.should == 4
|
499
681
|
end
|
682
|
+
|
683
|
+
it "save should not save anything for it" do
|
684
|
+
@klass.save.should == {}
|
685
|
+
end
|
686
|
+
|
687
|
+
it "save with include_defaults should save all defaults" do
|
688
|
+
@klass.save(true).should == { :attr => 4 }
|
689
|
+
end
|
690
|
+
|
691
|
+
it "save should save the new value if it gets set" do
|
692
|
+
@klass.attr 5
|
693
|
+
(saved = @klass.save).should == { :attr => 10 }
|
694
|
+
@klass.reset
|
695
|
+
@klass.attr.should == 4
|
696
|
+
@klass.restore(saved)
|
697
|
+
@klass.attr.should == 10
|
698
|
+
end
|
699
|
+
|
700
|
+
it "save should save the new value even if it is set to its default value" do
|
701
|
+
@klass.attr 2
|
702
|
+
(saved = @klass.save).should == { :attr => 4 }
|
703
|
+
@klass.reset
|
704
|
+
@klass.save.should == {}
|
705
|
+
@klass.restore(saved)
|
706
|
+
@klass.save.should == { :attr => 4 }
|
707
|
+
end
|
500
708
|
end
|
501
709
|
|
502
710
|
describe "When a configurable exists with a context" do
|
@@ -526,12 +734,50 @@ describe Mixlib::Config do
|
|
526
734
|
@klass.blah.x.should == 5
|
527
735
|
end
|
528
736
|
|
737
|
+
it "setting the entire context to a hash with default value overridden sets the value" do
|
738
|
+
@klass.blah = { :x => 10 }
|
739
|
+
@klass.blah.x.should == 10
|
740
|
+
end
|
741
|
+
|
742
|
+
it "setting the entire context to a hash sets non-default values" do
|
743
|
+
@klass.blah = { :y => 10 }
|
744
|
+
@klass.blah.x.should == 5
|
745
|
+
@klass.blah.y.should == 10
|
746
|
+
end
|
747
|
+
|
748
|
+
it "setting the entire context to a hash deletes any non-default values and resets default values" do
|
749
|
+
@klass.blah.x = 10
|
750
|
+
@klass.blah.y = 10
|
751
|
+
@klass.blah = { :z => 10 }
|
752
|
+
@klass.blah.x.should == 5
|
753
|
+
@klass.blah.y.should == nil
|
754
|
+
@klass.blah.z.should == 10
|
755
|
+
end
|
756
|
+
|
529
757
|
it "after reset of the parent class, children are reset" do
|
530
758
|
@klass.blah.x = 10
|
531
759
|
@klass.blah.x.should == 10
|
532
760
|
@klass.reset
|
533
761
|
@klass.blah.x.should == 5
|
534
762
|
end
|
763
|
+
|
764
|
+
it "save should not save anything for it by default" do
|
765
|
+
@klass.save.should == {}
|
766
|
+
end
|
767
|
+
|
768
|
+
it "save with include_defaults should save all defaults" do
|
769
|
+
@klass.save(true).should == { :blah => { :x => 5 } }
|
770
|
+
end
|
771
|
+
|
772
|
+
it "save should save any new values that are set in the context" do
|
773
|
+
@klass.blah.x = 10
|
774
|
+
(saved = @klass.save).should == { :blah => { :x => 10 } }
|
775
|
+
@klass.reset
|
776
|
+
@klass.blah.x.should == 5
|
777
|
+
@klass.restore(saved)
|
778
|
+
@klass.blah.x.should == 10
|
779
|
+
@klass.save.should == { :blah => { :x => 10 } }
|
780
|
+
end
|
535
781
|
end
|
536
782
|
|
537
783
|
describe "When a configurable exists with a nested context" do
|
@@ -569,6 +815,62 @@ describe Mixlib::Config do
|
|
569
815
|
@klass.reset
|
570
816
|
@klass.blah.yarr.x.should == 5
|
571
817
|
end
|
818
|
+
|
819
|
+
it "save should not save anything for it by default" do
|
820
|
+
@klass.save.should == {}
|
821
|
+
end
|
822
|
+
|
823
|
+
it "save with include_defaults should save all defaults" do
|
824
|
+
@klass.save(true).should == { :blah => { :yarr => { :x => 5 } } }
|
825
|
+
end
|
826
|
+
|
827
|
+
it "save should save any new values that are set in the context" do
|
828
|
+
@klass.blah.yarr.x = 10
|
829
|
+
(saved = @klass.save).should == { :blah => { :yarr => { :x => 10 } } }
|
830
|
+
@klass.reset
|
831
|
+
@klass.blah.yarr.x.should == 5
|
832
|
+
@klass.restore(saved)
|
833
|
+
@klass.blah.yarr.x.should == 10
|
834
|
+
@klass.save.should == { :blah => { :yarr => { :x => 10 } } }
|
835
|
+
end
|
836
|
+
end
|
837
|
+
|
838
|
+
describe "When a config_context with no defaulted values exists" do
|
839
|
+
before :each do
|
840
|
+
@klass = Class.new
|
841
|
+
@klass.extend(::Mixlib::Config)
|
842
|
+
@klass.class_eval do
|
843
|
+
config_context(:blah) do
|
844
|
+
configurable(:x)
|
845
|
+
end
|
846
|
+
end
|
847
|
+
end
|
848
|
+
|
849
|
+
it "save does not save the hash for the config_context" do
|
850
|
+
@klass.save.should == {}
|
851
|
+
end
|
852
|
+
|
853
|
+
it "save with defaults saves the hash for the config_context" do
|
854
|
+
@klass.save(true).should == { :blah => {} }
|
855
|
+
end
|
856
|
+
end
|
857
|
+
|
858
|
+
describe "When a config_context with no configurables exists" do
|
859
|
+
before :each do
|
860
|
+
@klass = Class.new
|
861
|
+
@klass.extend(::Mixlib::Config)
|
862
|
+
@klass.class_eval do
|
863
|
+
config_context(:blah)
|
864
|
+
end
|
865
|
+
end
|
866
|
+
|
867
|
+
it "save does not save the hash for the config_context" do
|
868
|
+
@klass.save.should == {}
|
869
|
+
end
|
870
|
+
|
871
|
+
it "save with defaults saves the hash for the config_context" do
|
872
|
+
@klass.save(true).should == { :blah => {} }
|
873
|
+
end
|
572
874
|
end
|
573
875
|
|
574
876
|
describe "When a nested context has strict mode on" do
|
@@ -605,4 +907,51 @@ describe Mixlib::Config do
|
|
605
907
|
lambda { StrictClass3.y = 10 }.should raise_error(Mixlib::Config::UnknownConfigOptionError)
|
606
908
|
end
|
607
909
|
end
|
910
|
+
|
911
|
+
describe "When a config_context is opened twice" do
|
912
|
+
before :each do
|
913
|
+
@klass = Class.new
|
914
|
+
@klass.extend(::Mixlib::Config)
|
915
|
+
@klass.class_eval do
|
916
|
+
config_context(:blah) do
|
917
|
+
default :x, 10
|
918
|
+
end
|
919
|
+
config_context(:blah) do
|
920
|
+
default :y, 20
|
921
|
+
end
|
922
|
+
end
|
923
|
+
end
|
924
|
+
|
925
|
+
it "Both config_context blocks are honored" do
|
926
|
+
@klass.blah.x == 10
|
927
|
+
@klass.blah.y == 20
|
928
|
+
end
|
929
|
+
end
|
930
|
+
|
931
|
+
it "When a config_context is opened in place of a regular configurable, an error is raised" do
|
932
|
+
klass = Class.new
|
933
|
+
klass.extend(::Mixlib::Config)
|
934
|
+
lambda do
|
935
|
+
klass.class_eval do
|
936
|
+
default :blah, 10
|
937
|
+
config_context(:blah) do
|
938
|
+
default :y, 20
|
939
|
+
end
|
940
|
+
end
|
941
|
+
end.should raise_error(Mixlib::Config::ReopenedConfigurableWithConfigContextError)
|
942
|
+
end
|
943
|
+
|
944
|
+
it "When a config_context is opened in place of a regular configurable, an error is raised" do
|
945
|
+
klass = Class.new
|
946
|
+
klass.extend(::Mixlib::Config)
|
947
|
+
lambda do
|
948
|
+
klass.class_eval do
|
949
|
+
config_context(:blah) do
|
950
|
+
default :y, 20
|
951
|
+
end
|
952
|
+
default :blah, 10
|
953
|
+
end
|
954
|
+
end.should raise_error(Mixlib::Config::ReopenedConfigContextWithConfigurableError)
|
955
|
+
end
|
956
|
+
|
608
957
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixlib-config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.1.0.rc.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Opscode, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -65,6 +65,8 @@ files:
|
|
65
65
|
- README.md
|
66
66
|
- Rakefile
|
67
67
|
- lib/mixlib/config/configurable.rb
|
68
|
+
- lib/mixlib/config/reopened_config_context_with_configurable_error.rb
|
69
|
+
- lib/mixlib/config/reopened_configurable_with_config_context_error.rb
|
68
70
|
- lib/mixlib/config/unknown_config_option_error.rb
|
69
71
|
- lib/mixlib/config/version.rb
|
70
72
|
- lib/mixlib/config.rb
|
@@ -84,9 +86,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
84
86
|
version: '0'
|
85
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
88
|
requirements:
|
87
|
-
- - '
|
89
|
+
- - '>'
|
88
90
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
91
|
+
version: 1.3.1
|
90
92
|
requirements: []
|
91
93
|
rubyforge_project:
|
92
94
|
rubygems_version: 2.0.3
|