configurability 3.0.0.pre20161123172826 → 3.0.0.pre20161130162622

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 312a9f359af2205c1d19680cdbf9d78dccffabbd
4
- data.tar.gz: 04da93e50487652b33a29533d8bce47bdd6d45eb
3
+ metadata.gz: ec7bd9ddc5f5378d2ae449b87206d9c3c2c957ef
4
+ data.tar.gz: 1f9f7e27cb176bef33f426d0cb62fe1e99ad216f
5
5
  SHA512:
6
- metadata.gz: fa298908a7f0a5c1204397e94e31b9c3292f045133b36e0c61c8f9d94065e371c3b7e7f53ca15f85d4902765f6b43d40f3b35fa71344a6e4edae10082f2a58de
7
- data.tar.gz: 30c3d90e89cc257107f60d5eb7097508ad820b03caa3c23453f2ed384b5c8efd828d169f440c7f7850a8a9820108d89a5e1ac66fecb85509c946ed9f2f6b280a
6
+ metadata.gz: f0370cd0b0a9bf748f5d4fd5c358008723e130e6f4183c7a03fbafdf7be0e1f33610da76fc874c439f88eb32d21fbfbae347cdf72dfca98c2885c661c7af4884
7
+ data.tar.gz: 2d5a72fe466eedbd356742ff970c076b93569b0a2c221bd92b6616f58feead5f4c81df2c4f2541493a6684ef55f6fb383120b4cbb6ea590b0c7578e9b807b020
@@ -18,14 +18,15 @@ module Configurability
18
18
 
19
19
 
20
20
  # Library version constant
21
- VERSION = '3.0.0'
21
+ VERSION = '2.99.0'
22
22
 
23
23
  # Version-control revision constant
24
- REVISION = %q$Revision: 1932602f7894 $
24
+ REVISION = %q$Revision: 5c1ffea885e8 $
25
25
 
26
26
  require 'configurability/deferredconfig'
27
27
 
28
28
  autoload :Config, 'configurability/config'
29
+ autoload :DSL, 'configurability/dsl'
29
30
 
30
31
 
31
32
  ### The objects that have had Configurability added to them
@@ -233,9 +234,48 @@ module Configurability
233
234
  end
234
235
 
235
236
 
236
- ### Default configuration method.
237
- def configure( config )
237
+ ### Default configuration method. This will merge the provided +config+ with the defaults
238
+ ### if there are any and the +config+ responds to <tt>#to_h</tt>. If the +config+ responds to
239
+ ### <tt>#each_pair</tt>, any writable attributes of the calling object with the same name
240
+ ### as a key of the +config+ will be called with the corresponding value. E.g.,
241
+ ###
242
+ ### class MyClass
243
+ ### extend Configurability
244
+ ### CONFIG_DEFAULTS = { environment: 'develop', apikey: 'testing-key' }
245
+ ### config_key :my_class
246
+ ### class << self
247
+ ### attr_accessor :environment, :apikey
248
+ ### end
249
+ ### end
250
+ ###
251
+ ### config = { my_class: {apikey: 'demo-key'} }
252
+ ### Configurability.configure_objects( config )
253
+ ###
254
+ ### MyClass.apikey
255
+ ### # => 'demo-key'
256
+ ### MyClass.environment
257
+ ### # => 'develop'
258
+ ###
259
+ def configure( config=nil )
260
+ config = self.defaults( {} ).merge( config.to_h || {} ) if
261
+ config.nil? || config.respond_to?( :to_h )
262
+
238
263
  @config = config
264
+
265
+ if @config.respond_to?( :each_pair )
266
+ @config.each_pair do |key, value|
267
+ Configurability.log.debug "Looking for %p config attribute" % [ key ]
268
+ next unless self.respond_to?( "#{key}=" )
269
+ Configurability.log.debug " setting %p to %p via attr_writer" %
270
+ [ key, value ]
271
+ self.public_send( "#{key}=", value )
272
+ end
273
+ else
274
+ Configurability.log.
275
+ debug "config object (%p) isn't iterable; skipping config attributes" % [ @config ]
276
+ end
277
+
278
+ return @config
239
279
  end
240
280
 
241
281
 
@@ -245,6 +285,36 @@ module Configurability
245
285
  end
246
286
 
247
287
 
288
+ #
289
+ # :section: Configuration settings block
290
+ #
291
+
292
+ ### Declare configuration settings and defaults. In the provided +block+, you can create
293
+ ### a configuration setting using the following syntax:
294
+ ###
295
+ ### configurability( :my_config_key ) do
296
+ ### # Declare a setting with a `nil` default
297
+ ### setting :a_config_key
298
+ ### # Declare one with a default value
299
+ ### setting :another_config_key, default: 18
300
+ ### end
301
+ ###
302
+ def configurability( config_key=nil, &block )
303
+ self.config_key = config_key if config_key
304
+
305
+ if block
306
+ Configurability.log.debug "Applying config declaration block using DSL::Generator"
307
+ generator = Configurability::DSL::Generator.new( self )
308
+ generator.instance_eval( &block )
309
+ end
310
+
311
+ if (( config = Configurability.loaded_config ))
312
+ Configurability.install_config( config, self )
313
+ end
314
+
315
+ end
316
+
317
+
248
318
  #
249
319
  # :section: Configuration Defaults API
250
320
  #
@@ -252,10 +322,10 @@ module Configurability
252
322
  ### The default implementation of the method called by ::gather_defaults when
253
323
  ### gathering configuration defaults. This method expects either a
254
324
  ### +DEFAULT_CONFIG+ or a +CONFIG_DEFAULTS+ constant to contain the configuration
255
- ### defaults, and will just return +nil+ if neither exists.
256
- def defaults
325
+ ### defaults, and will just return the +fallback+ value if neither exists.
326
+ def defaults( fallback=nil )
257
327
 
258
- return nil unless respond_to?( :const_defined? )
328
+ return fallback unless respond_to?( :const_defined? )
259
329
 
260
330
  Configurability.log.debug "Looking for defaults in %p's constants." % [ self ]
261
331
  if self.const_defined?( :DEFAULT_CONFIG, false )
@@ -266,7 +336,7 @@ module Configurability
266
336
  return self.const_get( :CONFIG_DEFAULTS, false ).dup
267
337
  else
268
338
  Configurability.log.debug " no default constants."
269
- return nil
339
+ return fallback
270
340
  end
271
341
  end
272
342
 
@@ -141,10 +141,7 @@ describe Configurability do
141
141
  config_key :testconfig
142
142
  end
143
143
 
144
- config = double( "configuration object" )
145
- expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( false )
146
- expect( config ).to receive( :respond_to? ).with( :[] ).and_return( false )
147
-
144
+ config = Object.new
148
145
  expect( klass ).to receive( :configure ).with( nil )
149
146
 
150
147
  Configurability.configure_objects( config )
@@ -157,15 +154,7 @@ describe Configurability do
157
154
  config_key :testconfig
158
155
  end
159
156
 
160
- config = double( "configuration object" )
161
- expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( false )
162
- expect( config ).to receive( :respond_to? ).with( :key? ).and_return( true )
163
- expect( config ).to receive( :respond_to? ).with( :[] ).and_return( true )
164
- expect( config ).to receive( :key? ).with( :testconfig ).and_return( false )
165
- expect( config ).to receive( :key? ).with( 'testconfig' ).and_return( true )
166
- expect( config ).to receive( :[] ).with( :testconfig ).and_return( nil )
167
- expect( config ).to receive( :[] ).with( 'testconfig' ).and_return( :a_config_section )
168
-
157
+ config = { 'testconfig' => :a_config_section }
169
158
  expect( klass ).to receive( :configure ).with( :a_config_section )
170
159
 
171
160
  Configurability.configure_objects( config )
@@ -178,11 +167,9 @@ describe Configurability do
178
167
  config_key :testconfig
179
168
  end
180
169
 
181
- config = double( "configuration object" )
182
- expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( true )
183
- expect( config ).to receive( :testconfig ).and_return( :a_config_section )
184
-
170
+ config = OpenStruct.new( testconfig: :a_config_section )
185
171
  expect( klass ).to receive( :configure ).with( :a_config_section )
172
+
186
173
  Configurability.configure_objects( config )
187
174
  end
188
175
 
@@ -192,10 +179,7 @@ describe Configurability do
192
179
  object.extend( Configurability )
193
180
  object.config_key = :testobjconfig
194
181
 
195
- config = double( "configuration object" )
196
- expect( config ).to receive( :respond_to? ).with( :testobjconfig ).and_return( true )
197
- expect( config ).to receive( :testobjconfig ).and_return( :a_config_section )
198
-
182
+ config = OpenStruct.new( testobjconfig: :a_config_section )
199
183
  expect( object ).to receive( :configure ).with( :a_config_section )
200
184
 
201
185
  Configurability.configure_objects( config )
@@ -211,12 +195,7 @@ describe Configurability do
211
195
  config_key :subconfig
212
196
  end
213
197
 
214
- config = double( "configuration object" )
215
- expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( true )
216
- expect( config ).to receive( :testconfig ).and_return( :a_config_section )
217
- expect( config ).to receive( :respond_to? ).with( :subconfig ).and_return( true )
218
- expect( config ).to receive( :subconfig ).and_return( :a_sub_config_section )
219
-
198
+ config = OpenStruct.new( testconfig: :a_config_section, subconfig: :a_sub_config_section )
220
199
  expect( subclass ).to receive( :configure ).with( :a_sub_config_section )
221
200
 
222
201
  Configurability.configure_objects( config )
@@ -229,10 +208,7 @@ describe Configurability do
229
208
  def object.name; "testobjconfig"; end
230
209
  object.extend( Configurability )
231
210
 
232
- config = double( "configuration object" )
233
- expect( config ).to receive( :respond_to? ).with( :testobjconfig ).and_return( true )
234
- expect( config ).to receive( :testobjconfig ).and_return( :a_config_section )
235
-
211
+ config = OpenStruct.new( testobjconfig: :a_config_section )
236
212
  expect( object ).to receive( :configure ).with( :a_config_section )
237
213
 
238
214
  Configurability.configure_objects( config )
@@ -244,10 +220,7 @@ describe Configurability do
244
220
  def object.name; "Test Obj-Config"; end
245
221
  object.extend( Configurability )
246
222
 
247
- config = double( "configuration object" )
248
- expect( config ).to receive( :respond_to? ).with( :test_obj_config ).and_return( true )
249
- expect( config ).to receive( :test_obj_config ).and_return( :a_config_section )
250
-
223
+ config = OpenStruct.new( test_obj_config: :a_config_section )
251
224
  expect( object ).to receive( :configure ).with( :a_config_section )
252
225
 
253
226
  Configurability.configure_objects( config )
@@ -259,10 +232,7 @@ describe Configurability do
259
232
  object = Object.new
260
233
  object.extend( Configurability )
261
234
 
262
- config = double( "configuration object" )
263
- expect( config ).to receive( :respond_to? ).with( :object ).and_return( true )
264
- expect( config ).to receive( :object ).and_return( :a_config_section )
265
-
235
+ config = OpenStruct.new( object: :a_config_section )
266
236
  expect( object ).to receive( :configure ).with( :a_config_section )
267
237
 
268
238
  Configurability.configure_objects( config )
@@ -276,10 +246,7 @@ describe Configurability do
276
246
  end
277
247
  end
278
248
 
279
- config = double( "configuration object" )
280
- expect( config ).to receive( :respond_to? ).with( :dbobject ).and_return( true )
281
- expect( config ).to receive( :dbobject ).and_return( :a_config_section )
282
-
249
+ config = OpenStruct.new( dbobject: :a_config_section )
283
250
  expect( My::DbObject ).to receive( :configure ).with( :a_config_section )
284
251
 
285
252
  Configurability.configure_objects( config )
@@ -292,10 +259,7 @@ describe Configurability do
292
259
  object = objectclass.new
293
260
  object.extend( Configurability )
294
261
 
295
- config = double( "configuration object" )
296
- expect( config ).to receive( :respond_to? ).with( :anonymous ).and_return( true )
297
- expect( config ).to receive( :anonymous ).and_return( :a_config_section )
298
-
262
+ config = OpenStruct.new( anonymous: :a_config_section )
299
263
  expect( object ).to receive( :configure ).with( :a_config_section )
300
264
 
301
265
  Configurability.configure_objects( config )
@@ -489,6 +453,183 @@ describe Configurability do
489
453
  expect( config.spanishconfig.uno ).to eq( 1 )
490
454
  end
491
455
 
456
+
457
+ it "responds with the provided result if the object with Configurabilty has no defaults" do
458
+ klass = Class.new do
459
+ extend Configurability
460
+ config_key :testconfig
461
+ end
462
+
463
+ expect( klass.defaults({}) ).to eq( {} )
464
+ end
465
+
466
+ end
467
+
468
+
469
+ describe "default configure method" do
470
+
471
+ let!( :configurable_class ) do
472
+ Class.new do
473
+ include Configurability
474
+ config_key :testconfig
475
+ class << self
476
+ attr_accessor :apikey, :environment
477
+ end
478
+ end
479
+ end
480
+
481
+
482
+ it "sets attributes of the configured object that correspond with the keys of the config" do
483
+ config = OpenStruct.new( apikey: 'the-api-key', environment: 'production' )
484
+
485
+ configurable_class.configure( config )
486
+
487
+ expect( configurable_class.apikey ).to eq( 'the-api-key' )
488
+ expect( configurable_class.environment ).to eq( 'production' )
489
+ end
490
+
491
+
492
+ it "merges in defaults if they exist" do
493
+ configurable_class::DEFAULT_CONFIG = { environment: 'development' }
494
+ config = OpenStruct.new( apikey: 'the-api-key' )
495
+
496
+ configurable_class.configure( config )
497
+
498
+ expect( configurable_class.apikey ).to eq( 'the-api-key' )
499
+ expect( configurable_class.environment ).to eq( 'development' )
500
+ end
501
+
502
+
503
+ it "merges in defaults even if configured with `nil`" do
504
+ configurable_class::DEFAULT_CONFIG = { environment: 'development' }
505
+
506
+ configurable_class.configure
507
+
508
+ expect( configurable_class.apikey ).to eq( nil )
509
+ expect( configurable_class.environment ).to eq( 'development' )
510
+ end
511
+
512
+
513
+ it "returns the merged config for overrides" do
514
+ configurable_class::DEFAULT_CONFIG = { environment: 'development' }
515
+
516
+ rval = configurable_class.configure( apikey: 'the-api-key' )
517
+
518
+ expect( rval[:apikey] ).to eq( 'the-api-key' )
519
+ expect( rval[:environment] ).to eq( 'development' )
520
+ end
521
+
522
+ end
523
+
524
+
525
+ describe "configuration DSL" do
526
+
527
+ let( :mod ) do
528
+ mod = Module.new
529
+ mod.extend( Configurability )
530
+ mod
531
+ end
532
+
533
+ let( :instance ) do
534
+ instance = Object.new
535
+ instance.extend( Configurability )
536
+ instance
537
+ end
538
+
539
+
540
+ it "just sets the config key if called with a name" do
541
+ mod.configurability( :testconfig )
542
+ expect( mod.config_key ).to eq( :testconfig )
543
+ end
544
+
545
+
546
+ it "allows the declaration of one or more config options" do
547
+ mod.configurability( :testconfig ) do
548
+ setting :environment
549
+ setting :apikey
550
+ end
551
+
552
+ expect {
553
+ mod.environment = 'development'
554
+ }.to change { mod.environment }.to( 'development' )
555
+ expect {
556
+ mod.apikey = 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs'
557
+ }.to change { mod.apikey }.to( 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs' )
558
+ end
559
+
560
+
561
+ it "works for object instances with Configurability as well" do
562
+ instance.configurability( :testconfig ) do
563
+ setting :environment
564
+ setting :apikey
565
+ end
566
+
567
+ expect {
568
+ instance.environment = 'development'
569
+ }.to change { instance.environment }.to( 'development' )
570
+ expect {
571
+ instance.apikey = 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs'
572
+ }.to change { instance.apikey }.to( 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs' )
573
+ end
574
+
575
+
576
+ it "allow the declaration of one or more config options with an inferred config key" do
577
+ mod.configurability do
578
+ setting :environment
579
+ setting :apikey
580
+ end
581
+
582
+ expect {
583
+ mod.environment = 'development'
584
+ }.to change { mod.environment }.to( 'development' )
585
+ expect {
586
+ mod.apikey = 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs'
587
+ }.to change { mod.apikey }.to( 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs' )
588
+ end
589
+
590
+
591
+ it "allow the declaration of one or more config options with defaults" do
592
+ mod.configurability( :testconfig ) do
593
+ setting :environment, default: 'development'
594
+ setting :apikey, default: '<none set>'
595
+ end
596
+
597
+ expect {
598
+ mod.environment = 'production'
599
+ }.to change { mod.environment }.
600
+ from( 'development' ).
601
+ to( 'production' )
602
+
603
+ expect {
604
+ mod.apikey = 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs'
605
+ }.to change { mod.apikey }.
606
+ from( '<none set>' ).
607
+ to( 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs' )
608
+
609
+ expect( mod.defaults ).to include(
610
+ environment: 'development',
611
+ apikey: '<none set>'
612
+ )
613
+ end
614
+
615
+
616
+ it "installs the current config after its done if it's already been loaded" do
617
+ config = OpenStruct.new( testconfig: {
618
+ environment: 'production',
619
+ apikey: 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs'
620
+ })
621
+
622
+ Configurability.configure_objects( config )
623
+
624
+ mod.configurability( :testconfig ) do
625
+ setting :environment, default: 'development'
626
+ setting :apikey, default: '<none set>'
627
+ end
628
+
629
+ expect( mod.environment ).to eq( 'production' )
630
+ expect( mod.apikey ).to eq( 'jofRtkw&QzCoukGwAWDMjyTkQzWnCXhhgEs' )
631
+ end
632
+
492
633
  end
493
634
 
494
635
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configurability
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.pre20161123172826
4
+ version: 3.0.0.pre20161130162622
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -36,7 +36,7 @@ cert_chain:
36
36
  w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
37
37
  p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
38
38
  -----END CERTIFICATE-----
39
- date: 2016-11-24 00:00:00.000000000 Z
39
+ date: 2016-12-01 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: loggability