mixlib-config 2.0.0.rc.4 → 2.0.0.rc.5
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/lib/mixlib/config.rb +39 -32
- data/lib/mixlib/config/version.rb +1 -1
- data/spec/mixlib/config_spec.rb +102 -2
- metadata +2 -2
data/lib/mixlib/config.rb
CHANGED
@@ -185,6 +185,7 @@ module Mixlib
|
|
185
185
|
def configurable(symbol, &block)
|
186
186
|
unless configurables[symbol]
|
187
187
|
configurables[symbol] = Configurable.new(symbol)
|
188
|
+
define_attr_accessor_methods(symbol)
|
188
189
|
end
|
189
190
|
if block
|
190
191
|
block.call(configurables[symbol])
|
@@ -287,48 +288,30 @@ module Mixlib
|
|
287
288
|
# === Raises
|
288
289
|
# <UnknownConfigOptionError>:: If the config option does not exist and strict mode is on.
|
289
290
|
def method_missing(method_symbol, *args)
|
290
|
-
|
291
|
-
|
292
|
-
if num_args > 0
|
293
|
-
method_symbol = $1.to_sym if method_symbol.to_s =~ /(.+)=$/
|
294
|
-
internal_set(method_symbol, num_args == 1 ? args[0] : args)
|
295
|
-
end
|
296
|
-
|
297
|
-
# Returning
|
298
|
-
internal_get(method_symbol)
|
291
|
+
method_symbol = $1.to_sym if method_symbol.to_s =~ /(.+)=$/
|
292
|
+
internal_get_or_set(method_symbol, *args)
|
299
293
|
end
|
300
294
|
|
301
|
-
|
302
|
-
|
303
|
-
#
|
295
|
+
private
|
296
|
+
|
297
|
+
# Internal dispatch setter for config values.
|
304
298
|
# === Parameters
|
305
|
-
#
|
299
|
+
# symbol<Symbol>:: Name of the method (variable setter)
|
306
300
|
# value<Object>:: Value to be set in config hash
|
307
301
|
#
|
308
|
-
def internal_set(
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
if self.respond_to?("#{method_name}=".to_sym)
|
313
|
-
self.send("#{method_name}=", value)
|
302
|
+
def internal_set(symbol,value)
|
303
|
+
if configurables.has_key?(symbol)
|
304
|
+
configurables[symbol].set(self.configuration, value)
|
314
305
|
else
|
315
|
-
if
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
Chef::Log.warn("Setting unsupported config value #{method_name}..")
|
320
|
-
elsif config_strict_mode
|
321
|
-
raise UnknownConfigOptionError, "Cannot set unsupported config value #{method_name}."
|
322
|
-
end
|
323
|
-
configuration[method_symbol] = value
|
306
|
+
if config_strict_mode == :warn
|
307
|
+
Chef::Log.warn("Setting unsupported config value #{method_name}..")
|
308
|
+
elsif config_strict_mode
|
309
|
+
raise UnknownConfigOptionError, "Cannot set unsupported config value #{method_name}."
|
324
310
|
end
|
311
|
+
configuration[symbol] = value
|
325
312
|
end
|
326
313
|
end
|
327
314
|
|
328
|
-
protected :internal_set
|
329
|
-
|
330
|
-
private
|
331
|
-
|
332
315
|
def internal_get(symbol)
|
333
316
|
if configurables.has_key?(symbol)
|
334
317
|
configurables[symbol].get(self.configuration)
|
@@ -341,5 +324,29 @@ module Mixlib
|
|
341
324
|
configuration[symbol]
|
342
325
|
end
|
343
326
|
end
|
327
|
+
|
328
|
+
def internal_get_or_set(symbol,*args)
|
329
|
+
num_args = args.length
|
330
|
+
# Setting
|
331
|
+
if num_args > 0
|
332
|
+
internal_set(symbol, num_args == 1 ? args[0] : args)
|
333
|
+
end
|
334
|
+
|
335
|
+
# Returning
|
336
|
+
internal_get(symbol)
|
337
|
+
end
|
338
|
+
|
339
|
+
def define_attr_accessor_methods(symbol)
|
340
|
+
# When Ruby 1.8.7 is no longer supported, this stuff can be done with define_singleton_method!
|
341
|
+
meta = class << self; self; end
|
342
|
+
# Setter
|
343
|
+
meta.send :define_method, "#{symbol.to_s}=".to_sym do |value|
|
344
|
+
internal_set(symbol, value)
|
345
|
+
end
|
346
|
+
# Getter
|
347
|
+
meta.send :define_method, symbol do |*args|
|
348
|
+
internal_get_or_set(symbol, *args)
|
349
|
+
end
|
350
|
+
end
|
344
351
|
end
|
345
352
|
end
|
data/spec/mixlib/config_spec.rb
CHANGED
@@ -151,11 +151,11 @@ describe Mixlib::Config do
|
|
151
151
|
before do
|
152
152
|
@klass = Class.new
|
153
153
|
@klass.extend(::Mixlib::Config)
|
154
|
-
@klass.class_eval
|
154
|
+
@klass.class_eval do
|
155
155
|
config_attr_writer :test_method do |blah|
|
156
156
|
blah.is_a?(Integer) ? blah * 1000 : blah
|
157
157
|
end
|
158
|
-
|
158
|
+
end
|
159
159
|
end
|
160
160
|
|
161
161
|
it "should multiply an integer by 1000" do
|
@@ -186,6 +186,64 @@ describe Mixlib::Config do
|
|
186
186
|
|
187
187
|
end
|
188
188
|
|
189
|
+
describe "When a configurable exists" do
|
190
|
+
before :each do
|
191
|
+
@klass = Class.new
|
192
|
+
@klass.extend(::Mixlib::Config)
|
193
|
+
@klass.class_eval do
|
194
|
+
configurable :daemonizeme
|
195
|
+
default :a, 1
|
196
|
+
config_attr_writer(:b) { |v| v }
|
197
|
+
config_context(:c)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
it "Getter methods are created for the configurable" do
|
202
|
+
@klass.respond_to?(:daemonizeme).should == true
|
203
|
+
@klass.respond_to?(:a).should == true
|
204
|
+
@klass.respond_to?(:b).should == true
|
205
|
+
@klass.respond_to?(:c).should == true
|
206
|
+
@klass.respond_to?(:z).should == false
|
207
|
+
end
|
208
|
+
|
209
|
+
it "Setter methods are created for the configurable" do
|
210
|
+
@klass.respond_to?("daemonizeme=".to_sym).should == true
|
211
|
+
@klass.respond_to?("a=".to_sym).should == true
|
212
|
+
@klass.respond_to?("b=".to_sym).should == true
|
213
|
+
@klass.respond_to?("c=".to_sym).should == true
|
214
|
+
@klass.respond_to?("z=".to_sym).should == false
|
215
|
+
end
|
216
|
+
|
217
|
+
describe "and extra methods have been dumped into Object" do
|
218
|
+
class NopeError < StandardError
|
219
|
+
end
|
220
|
+
before :each do
|
221
|
+
Object.send :define_method, :daemonizeme do
|
222
|
+
raise NopeError, "NOPE"
|
223
|
+
end
|
224
|
+
Object.send :define_method, "daemonizeme=".to_sym do
|
225
|
+
raise NopeError, "NOPE"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'Normal classes call the extra method' do
|
230
|
+
normal_class = Class.new
|
231
|
+
normal_class.extend(::Mixlib::Config)
|
232
|
+
lambda { normal_class.daemonizeme }.should raise_error(NopeError)
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'Configurables with the same name as the extra method can be set' do
|
236
|
+
@klass.daemonizeme = 10
|
237
|
+
@klass[:daemonizeme].should == 10
|
238
|
+
end
|
239
|
+
|
240
|
+
it 'Configurables with the same name as the extra method can be retrieved' do
|
241
|
+
@klass[:daemonizeme] = 10
|
242
|
+
@klass.daemonizeme.should == 10
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
189
247
|
describe "When config has a default value" do
|
190
248
|
before :each do
|
191
249
|
@klass = Class.new
|
@@ -219,6 +277,48 @@ describe Mixlib::Config do
|
|
219
277
|
end
|
220
278
|
end
|
221
279
|
|
280
|
+
describe "When config has a default value block" do
|
281
|
+
before :each do
|
282
|
+
@klass = Class.new
|
283
|
+
@klass.extend(::Mixlib::Config)
|
284
|
+
@klass.class_eval do
|
285
|
+
default :x, 4
|
286
|
+
default(:attr) { x*2}
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should default to that value" do
|
291
|
+
@klass.attr.should == 8
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should be recalculated each time it is retrieved" do
|
295
|
+
@klass.attr.should == 8
|
296
|
+
@klass.x = 2
|
297
|
+
@klass.attr.should == 4
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should default to that value when retrieved as a hash" do
|
301
|
+
@klass[:attr].should == 8
|
302
|
+
end
|
303
|
+
|
304
|
+
it "should be settable to another value" do
|
305
|
+
@klass.attr 5
|
306
|
+
@klass.attr.should == 5
|
307
|
+
end
|
308
|
+
|
309
|
+
it "should still default to that value after delete" do
|
310
|
+
@klass.attr 5
|
311
|
+
@klass.delete(:attr)
|
312
|
+
@klass.attr.should == 8
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should still default to that value after reset" do
|
316
|
+
@klass.attr 5
|
317
|
+
@klass.reset
|
318
|
+
@klass.attr.should == 8
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
222
322
|
describe "When config has an array default value" do
|
223
323
|
before :each do
|
224
324
|
@klass = Class.new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixlib-config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.rc.
|
4
|
+
version: 2.0.0.rc.5
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-09-
|
12
|
+
date: 2013-09-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|