configurability 2.2.2 → 2.3.0.pre20161121123955
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/Rakefile +1 -1
- data/lib/configurability.rb +41 -27
- data/spec/configurability/config_spec.rb +27 -0
- data/spec/configurability/deferredconfig_spec.rb +1 -1
- data/spec/configurability_spec.rb +91 -7
- metadata +25 -27
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -2
- data/.gemtest +0 -0
- data/LICENSE +0 -27
- metadata.gz.sig +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 470dde9269109d507424b3459e90e86f5dca7bce
|
4
|
+
data.tar.gz: 8c3ac3e698ab18ff6783c2c0c7afe2b333de8234
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ba7e4bb087da76a09937c1eb655e02a41aed364c8ead62e95e6d87210143b94d23979c7636ea82c4b31e7391d0da6803093e4b8572a49ae9d6f302414f27312
|
7
|
+
data.tar.gz: b770a6f29e6703a0c16ccc0c56896e49e34fff4fe5ebc2eacca5533dbbab04e99879c18b65af101b7045a1b891ca77acf98412499e2e3ebd7a92305ee4aeb6b0
|
data/Rakefile
CHANGED
@@ -71,7 +71,7 @@ file GEMSPEC => __FILE__ do |task|
|
|
71
71
|
spec.files.delete( '.gemtest' )
|
72
72
|
spec.files.delete( 'LICENSE' )
|
73
73
|
spec.signing_key = nil
|
74
|
-
spec.version = "#{spec.version}.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
74
|
+
spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
75
75
|
spec.cert_chain = [ 'certs/ged.pem' ]
|
76
76
|
File.open( task.name, 'w' ) do |fh|
|
77
77
|
fh.write( spec.to_ruby )
|
data/lib/configurability.rb
CHANGED
@@ -21,7 +21,7 @@ module Configurability
|
|
21
21
|
VERSION = '2.2.2'
|
22
22
|
|
23
23
|
# Version-control revision constant
|
24
|
-
REVISION = %q$Revision:
|
24
|
+
REVISION = %q$Revision: 93764baee5f8 $
|
25
25
|
|
26
26
|
require 'configurability/deferredconfig'
|
27
27
|
|
@@ -126,38 +126,46 @@ module Configurability
|
|
126
126
|
|
127
127
|
### Install the appropriate section of the +config+ into the given +object+.
|
128
128
|
def self::install_config( config, object )
|
129
|
-
section
|
130
|
-
|
131
|
-
[ object, section ]
|
129
|
+
self.log.debug "Configuring %p with the %s section of the config." %
|
130
|
+
[ object, object.config_key ]
|
132
131
|
|
133
|
-
|
134
|
-
|
135
|
-
|
132
|
+
section = self.find_config_section( config, object.config_key )
|
133
|
+
configure_method = object.method( :configure )
|
134
|
+
|
135
|
+
self.log.debug " calling %p" % [ configure_method ]
|
136
|
+
configure_method.call( section )
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
### Find the section of the specified +config+ object that corresponds to the
|
141
|
+
### given +key+.
|
142
|
+
def self::find_config_section( config, key )
|
143
|
+
return key.to_s.split( '__' ).inject( config ) do |section, subkey|
|
144
|
+
next nil if section.nil?
|
145
|
+
self.get_config_subsection( section, subkey.to_sym )
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
|
150
|
+
### Return the subsection of the specified +config+ that corresponds to +key+, trying
|
151
|
+
### both struct-like and hash-like interfaces.
|
152
|
+
def self::get_config_subsection( config, key )
|
153
|
+
if config.respond_to?( key )
|
154
|
+
self.log.debug " config has a #%s method; using that" % [ key ]
|
155
|
+
return config.send( key )
|
136
156
|
elsif config.respond_to?( :[] ) && config.respond_to?( :key? )
|
137
157
|
self.log.debug " config has a hash-ish interface..."
|
138
|
-
if config.key?(
|
139
|
-
self.log.debug " and has a %
|
140
|
-
|
158
|
+
if config.key?( key.to_sym ) || config.key?( key.to_s )
|
159
|
+
self.log.debug " and has a %s member; using that" % [ key ]
|
160
|
+
return config[ key.to_sym ] || config[ key.to_s ]
|
141
161
|
else
|
142
|
-
self.log.debug " but no
|
143
|
-
|
162
|
+
self.log.debug " but no `%s` member." % [ key ]
|
163
|
+
return nil
|
144
164
|
end
|
145
165
|
else
|
146
|
-
self.log.debug " no %p section in %p; configuring with nil" % [
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
# Figure out if the configure method has already been called with this config
|
151
|
-
# section before, and don't re-call it if so
|
152
|
-
configure_method = object.method( :configure )
|
153
|
-
|
154
|
-
if self.configured[ configure_method ] == section
|
155
|
-
self.log.debug " avoiding re-calling %p" % [ configure_method ]
|
156
|
-
return
|
166
|
+
self.log.debug " no %p section in %p; configuring with nil" % [ key, config ]
|
167
|
+
return nil
|
157
168
|
end
|
158
|
-
|
159
|
-
self.log.debug " calling %p" % [ configure_method ]
|
160
|
-
configure_method.call( section )
|
161
169
|
end
|
162
170
|
|
163
171
|
|
@@ -210,7 +218,7 @@ module Configurability
|
|
210
218
|
### Set the config key of the object.
|
211
219
|
def config_key=( sym )
|
212
220
|
Configurability.configurable_objects |= [ self ]
|
213
|
-
@config_key = sym
|
221
|
+
@config_key = normalize_config_key( sym )
|
214
222
|
end
|
215
223
|
|
216
224
|
|
@@ -220,6 +228,12 @@ module Configurability
|
|
220
228
|
end
|
221
229
|
|
222
230
|
|
231
|
+
### Return the specified +key+ normalized into a valid Symbol config key.
|
232
|
+
def normalize_config_key( key )
|
233
|
+
return key.to_s.gsub( /\./, '__' ).to_sym
|
234
|
+
end
|
235
|
+
|
236
|
+
|
223
237
|
#
|
224
238
|
# :section: Configuration Defaults API
|
225
239
|
#
|
@@ -49,10 +49,12 @@ describe Configurability::Config do
|
|
49
49
|
expect( described_class.new.dump.strip ).to eq( "--- {}" )
|
50
50
|
end
|
51
51
|
|
52
|
+
|
52
53
|
it "returns nil as its change description" do
|
53
54
|
expect( described_class.new.changed_reason ).to be_nil()
|
54
55
|
end
|
55
56
|
|
57
|
+
|
56
58
|
it "autogenerates accessors for non-existant struct members" do
|
57
59
|
config = described_class.new
|
58
60
|
config.plugins ||= {}
|
@@ -62,18 +64,21 @@ describe Configurability::Config do
|
|
62
64
|
expect( config.plugins.filestore.maxsize ).to eq( 1024 )
|
63
65
|
end
|
64
66
|
|
67
|
+
|
65
68
|
it "merges values loaded from the config with any defaults given" do
|
66
69
|
config = described_class.new( TEST_CONFIG, :defaultkey => "Oh yeah." )
|
67
70
|
|
68
71
|
expect( config.defaultkey ).to eq( "Oh yeah." )
|
69
72
|
end
|
70
73
|
|
74
|
+
|
71
75
|
it "symbolifies keys in defaults (issue #3)" do
|
72
76
|
config = described_class.new( TEST_CONFIG, 'stringkey' => "String value." )
|
73
77
|
|
74
78
|
expect( config.stringkey ).to eq( "String value." )
|
75
79
|
end
|
76
80
|
|
81
|
+
|
77
82
|
it "yields itself if a block is given at creation" do
|
78
83
|
yielded_self = nil
|
79
84
|
config = described_class.new { yielded_self = self }
|
@@ -81,6 +86,7 @@ describe Configurability::Config do
|
|
81
86
|
expect( yielded_self ).to equal( config )
|
82
87
|
end
|
83
88
|
|
89
|
+
|
84
90
|
it "passes itself as the block argument if a block of arity 1 is given at creation" do
|
85
91
|
arg_self = nil
|
86
92
|
yielded_self = nil
|
@@ -93,12 +99,14 @@ describe Configurability::Config do
|
|
93
99
|
expect( arg_self ).to equal( config )
|
94
100
|
end
|
95
101
|
|
102
|
+
|
96
103
|
it "supports both Symbols and Strings for Hash-like access" do
|
97
104
|
config = described_class.new( TEST_CONFIG )
|
98
105
|
|
99
106
|
expect( config[:section]['subsection'][:subsubsection] ).to eq( 'value' )
|
100
107
|
end
|
101
108
|
|
109
|
+
|
102
110
|
it "autoloads predicates for its members" do
|
103
111
|
config = described_class.new( TEST_CONFIG )
|
104
112
|
|
@@ -110,6 +118,7 @@ describe Configurability::Config do
|
|
110
118
|
expect( config.section.monkeysubsection? ).to be_falsey()
|
111
119
|
end
|
112
120
|
|
121
|
+
|
113
122
|
it "untaints values loaded from a config" do
|
114
123
|
yaml = TEST_CONFIG.dup.taint
|
115
124
|
config = described_class.new( yaml )
|
@@ -138,6 +147,7 @@ describe Configurability::Config do
|
|
138
147
|
expect( val ).to eq([ 'pattern1', 'pattern2' ])
|
139
148
|
end
|
140
149
|
|
150
|
+
|
141
151
|
it "knows that it has a nil member" do
|
142
152
|
val = config[:trap_on]['low disk space alert']
|
143
153
|
expect( val ).to have_member( nil )
|
@@ -156,6 +166,7 @@ describe Configurability::Config do
|
|
156
166
|
expect( config ).not_to respond_to( :pork_sausage )
|
157
167
|
end
|
158
168
|
|
169
|
+
|
159
170
|
it "contains values specified in the source" do
|
160
171
|
# section:
|
161
172
|
# subsection:
|
@@ -178,6 +189,7 @@ describe Configurability::Config do
|
|
178
189
|
expect( config.textsection ).to eq("With some text as the value\n...and another line.")
|
179
190
|
end
|
180
191
|
|
192
|
+
|
181
193
|
it "returns struct members as an Array of Symbols" do
|
182
194
|
expect( config.members ).to be_an_instance_of( Array )
|
183
195
|
expect( config.members.size ).to be >= 4
|
@@ -186,12 +198,14 @@ describe Configurability::Config do
|
|
186
198
|
end
|
187
199
|
end
|
188
200
|
|
201
|
+
|
189
202
|
it "is able to iterate over sections" do
|
190
203
|
config.each do |key, struct|
|
191
204
|
expect( key ).to be_an_instance_of( Symbol )
|
192
205
|
end
|
193
206
|
end
|
194
207
|
|
208
|
+
|
195
209
|
it "dumps values specified in the source" do
|
196
210
|
expect( config.dump ).to match( /^section:/ )
|
197
211
|
expect( config.dump ).to match( /^\s+subsection:/ )
|
@@ -199,6 +213,7 @@ describe Configurability::Config do
|
|
199
213
|
expect( config.dump ).to match( /^- list/ )
|
200
214
|
end
|
201
215
|
|
216
|
+
|
202
217
|
it "provides a human-readable description of itself when inspected" do
|
203
218
|
expect( config.inspect ).to match( /\d+ sections/i )
|
204
219
|
expect( config.inspect ).to match( /mergekey/ )
|
@@ -206,6 +221,7 @@ describe Configurability::Config do
|
|
206
221
|
expect( config.inspect ).to match( /from memory/i )
|
207
222
|
end
|
208
223
|
|
224
|
+
|
209
225
|
it "raises an exception when reloaded" do
|
210
226
|
expect {
|
211
227
|
config.reload
|
@@ -228,6 +244,7 @@ describe Configurability::Config do
|
|
228
244
|
expect( config.changed? ).to be_truthy()
|
229
245
|
end
|
230
246
|
|
247
|
+
|
231
248
|
it "should report that its internal struct was modified as the reason for the change" do
|
232
249
|
expect( config.changed_reason ).to match( /struct was modified/i )
|
233
250
|
end
|
@@ -255,6 +272,7 @@ describe Configurability::Config do
|
|
255
272
|
expect( config.path ).to eq( @tmpfile.expand_path )
|
256
273
|
end
|
257
274
|
|
275
|
+
|
258
276
|
it "writes itself back to the same file by default" do
|
259
277
|
config.port = 114411
|
260
278
|
config.write
|
@@ -263,6 +281,7 @@ describe Configurability::Config do
|
|
263
281
|
expect( otherconfig.port ).to eq( 114411 )
|
264
282
|
end
|
265
283
|
|
284
|
+
|
266
285
|
it "can be written to a different file" do
|
267
286
|
begin
|
268
287
|
path = Dir::Tmpname.make_tmpname( './another-', '.config' )
|
@@ -274,10 +293,12 @@ describe Configurability::Config do
|
|
274
293
|
end
|
275
294
|
end
|
276
295
|
|
296
|
+
|
277
297
|
it "includes the name of the file in its inspect output" do
|
278
298
|
expect( config.inspect ).to include( File.basename(@tmpfile.to_s) )
|
279
299
|
end
|
280
300
|
|
301
|
+
|
281
302
|
it "yields itself if a block is given at load-time" do
|
282
303
|
yielded_self = nil
|
283
304
|
config = described_class.load( @tmpfile.to_s ) do
|
@@ -286,6 +307,7 @@ describe Configurability::Config do
|
|
286
307
|
expect( yielded_self ).to equal( config )
|
287
308
|
end
|
288
309
|
|
310
|
+
|
289
311
|
it "passes itself as the block argument if a block of arity 1 is given at load-time" do
|
290
312
|
arg_self = nil
|
291
313
|
yielded_self = nil
|
@@ -298,6 +320,7 @@ describe Configurability::Config do
|
|
298
320
|
expect( arg_self ).to equal( config )
|
299
321
|
end
|
300
322
|
|
323
|
+
|
301
324
|
it "doesn't re-read its source file if it hasn't changed" do
|
302
325
|
expect( config.path ).not_to receive( :read )
|
303
326
|
expect( Configurability ).not_to receive( :configure_objects )
|
@@ -308,6 +331,7 @@ describe Configurability::Config do
|
|
308
331
|
|
309
332
|
# reload if file changes
|
310
333
|
context " whose file changes after loading" do
|
334
|
+
|
311
335
|
before( :all ) do
|
312
336
|
filename = Dir::Tmpname.make_tmpname( './test', '.conf' )
|
313
337
|
@tmpfile = Pathname( filename )
|
@@ -333,16 +357,19 @@ describe Configurability::Config do
|
|
333
357
|
expect( @config ).to be_changed
|
334
358
|
end
|
335
359
|
|
360
|
+
|
336
361
|
it "reports that its source was updated as the reason for the change" do
|
337
362
|
expect( @config.changed_reason ).to match( /source.*updated/i )
|
338
363
|
end
|
339
364
|
|
365
|
+
|
340
366
|
it "re-reads its file when reloaded" do
|
341
367
|
expect( @config.path ).to receive( :read ).and_return( TEST_CONFIG )
|
342
368
|
expect( Configurability ).to receive( :configure_objects ).with( @config )
|
343
369
|
expect( @config.reload ).to be_truthy()
|
344
370
|
end
|
345
371
|
|
372
|
+
|
346
373
|
it "reapplies its defaults when reloading" do
|
347
374
|
@config = described_class.load( @tmpfile.to_s, :defaultskey => 8 )
|
348
375
|
@config.reload
|
@@ -16,12 +16,12 @@ require 'configurability/deferredconfig'
|
|
16
16
|
#####################################################################
|
17
17
|
describe Configurability::DeferredConfig do
|
18
18
|
|
19
|
-
|
20
19
|
after( :each ) do
|
21
20
|
Configurability.configurable_objects.clear
|
22
21
|
Configurability.reset
|
23
22
|
end
|
24
23
|
|
24
|
+
|
25
25
|
it "calls Configurability.install_config with itself when a 'configure' method is defined" do
|
26
26
|
config = { :testing => :testing_config }
|
27
27
|
Configurability.configure_objects( config )
|
@@ -34,6 +34,27 @@ describe Configurability do
|
|
34
34
|
expect( klass.config_key ).to be( :testconfig )
|
35
35
|
end
|
36
36
|
|
37
|
+
|
38
|
+
it "allows a config key to specify a sub-section" do
|
39
|
+
klass = Class.new do
|
40
|
+
extend Configurability
|
41
|
+
config_key :testconfig__subsection
|
42
|
+
end
|
43
|
+
|
44
|
+
expect( klass.config_key ).to eq( :testconfig__subsection )
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
it "allows a config key to specify a sub-section via a more-readable string" do
|
49
|
+
klass = Class.new do
|
50
|
+
extend Configurability
|
51
|
+
config_key "testconfig.subsection"
|
52
|
+
end
|
53
|
+
|
54
|
+
expect( klass.config_key ).to eq( :testconfig__subsection )
|
55
|
+
end
|
56
|
+
|
57
|
+
|
37
58
|
it "fetches config sections via a method with the config key name if the config " +
|
38
59
|
"responds_to? it" do
|
39
60
|
klass = Class.new do
|
@@ -49,20 +70,26 @@ describe Configurability do
|
|
49
70
|
Configurability.configure_objects( config )
|
50
71
|
end
|
51
72
|
|
52
|
-
|
73
|
+
|
74
|
+
it "fetches config subsections via a method chain that corresponds to the config key" do
|
53
75
|
klass = Class.new do
|
54
|
-
|
55
|
-
config_key
|
76
|
+
extend Configurability
|
77
|
+
config_key "testconfig.subsection"
|
56
78
|
end
|
57
79
|
|
58
80
|
config = double( "configuration object" )
|
59
81
|
expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( true )
|
60
|
-
expect( config ).to receive( :testconfig ).and_return( :a_config_section )
|
61
82
|
|
62
|
-
|
83
|
+
section = double( "configuration section" )
|
84
|
+
expect( config ).to receive( :testconfig ).and_return( section )
|
85
|
+
expect( section ).to receive( :respond_to? ).with( :subsection ).and_return( true )
|
86
|
+
expect( section ).to receive( :subsection ).and_return( :the_config_subsection )
|
87
|
+
|
88
|
+
expect( klass ).to receive( :configure ).with( :the_config_subsection )
|
63
89
|
Configurability.configure_objects( config )
|
64
90
|
end
|
65
91
|
|
92
|
+
|
66
93
|
it "fetches config sections via the index operator if the config doesn't respond " +
|
67
94
|
"directly to the section name, but does to the index operator and #key?" do
|
68
95
|
klass = Class.new do
|
@@ -81,6 +108,33 @@ describe Configurability do
|
|
81
108
|
Configurability.configure_objects( config )
|
82
109
|
end
|
83
110
|
|
111
|
+
|
112
|
+
it "fetches config subsections via the index operator if the config doesn't respond " +
|
113
|
+
"directly to the section name, but does to the index operator and #key?" do
|
114
|
+
klass = Class.new do
|
115
|
+
extend Configurability
|
116
|
+
config_key :testconfig__subsection
|
117
|
+
end
|
118
|
+
|
119
|
+
config = double( "configuration object" )
|
120
|
+
expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( false )
|
121
|
+
expect( config ).to receive( :respond_to? ).with( :key? ).and_return( true )
|
122
|
+
expect( config ).to receive( :respond_to? ).with( :[] ).and_return( true )
|
123
|
+
expect( config ).to receive( :key? ).with( :testconfig ).and_return( true )
|
124
|
+
|
125
|
+
section = double( "configuration section" )
|
126
|
+
expect( config ).to receive( :[] ).with( :testconfig ).and_return( section )
|
127
|
+
expect( section ).to receive( :respond_to? ).with( :subsection ).and_return( false )
|
128
|
+
expect( section ).to receive( :respond_to? ).with( :key? ).and_return( true )
|
129
|
+
expect( section ).to receive( :respond_to? ).with( :[] ).and_return( true )
|
130
|
+
expect( section ).to receive( :key? ).with( :subsection ).and_return( true )
|
131
|
+
expect( section ).to receive( :[] ).with( :subsection ).and_return( :the_config_subsection )
|
132
|
+
|
133
|
+
expect( klass ).to receive( :configure ).with( :the_config_subsection )
|
134
|
+
Configurability.configure_objects( config )
|
135
|
+
end
|
136
|
+
|
137
|
+
|
84
138
|
it "passes nil to the configure method if the config doesn't respond to the section " +
|
85
139
|
"name or the index operator" do
|
86
140
|
klass = Class.new do
|
@@ -97,6 +151,7 @@ describe Configurability do
|
|
97
151
|
Configurability.configure_objects( config )
|
98
152
|
end
|
99
153
|
|
154
|
+
|
100
155
|
it "tries the config key as a String if calling it with the Symbol returns nil" do
|
101
156
|
klass = Class.new do
|
102
157
|
extend Configurability
|
@@ -117,6 +172,22 @@ describe Configurability do
|
|
117
172
|
Configurability.configure_objects( config )
|
118
173
|
end
|
119
174
|
|
175
|
+
|
176
|
+
it "extends including classes instead of appending features to them" do
|
177
|
+
klass = Class.new do
|
178
|
+
include Configurability
|
179
|
+
config_key :testconfig
|
180
|
+
end
|
181
|
+
|
182
|
+
config = double( "configuration object" )
|
183
|
+
expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( true )
|
184
|
+
expect( config ).to receive( :testconfig ).and_return( :a_config_section )
|
185
|
+
|
186
|
+
expect( klass ).to receive( :configure ).with( :a_config_section )
|
187
|
+
Configurability.configure_objects( config )
|
188
|
+
end
|
189
|
+
|
190
|
+
|
120
191
|
it "can be used to configure plain objects, too" do
|
121
192
|
object = Object.new
|
122
193
|
object.extend( Configurability )
|
@@ -131,6 +202,7 @@ describe Configurability do
|
|
131
202
|
Configurability.configure_objects( config )
|
132
203
|
end
|
133
204
|
|
205
|
+
|
134
206
|
it "configures classes that have inherited Configurability and set a different config_key" do
|
135
207
|
klass = Class.new do
|
136
208
|
extend Configurability
|
@@ -151,6 +223,7 @@ describe Configurability do
|
|
151
223
|
Configurability.configure_objects( config )
|
152
224
|
end
|
153
225
|
|
226
|
+
|
154
227
|
it "uses the object's name for its config key if it has one and hasn't specified a key " +
|
155
228
|
"directly" do
|
156
229
|
object = Object.new
|
@@ -166,6 +239,7 @@ describe Configurability do
|
|
166
239
|
Configurability.configure_objects( config )
|
167
240
|
end
|
168
241
|
|
242
|
+
|
169
243
|
it "normalizes the object's name before using it" do
|
170
244
|
object = Object.new
|
171
245
|
def object.name; "Test Obj-Config"; end
|
@@ -180,7 +254,8 @@ describe Configurability do
|
|
180
254
|
Configurability.configure_objects( config )
|
181
255
|
end
|
182
256
|
|
183
|
-
|
257
|
+
|
258
|
+
it "uses the object's class name for its config key if it doesn't have a name and " +
|
184
259
|
"hasn't specified a key directly" do
|
185
260
|
object = Object.new
|
186
261
|
object.extend( Configurability )
|
@@ -194,6 +269,7 @@ describe Configurability do
|
|
194
269
|
Configurability.configure_objects( config )
|
195
270
|
end
|
196
271
|
|
272
|
+
|
197
273
|
it "uses only the last part of a class's name if it is namespaced" do
|
198
274
|
module My
|
199
275
|
class DbObject
|
@@ -210,6 +286,7 @@ describe Configurability do
|
|
210
286
|
Configurability.configure_objects( config )
|
211
287
|
end
|
212
288
|
|
289
|
+
|
213
290
|
it "uses the 'anonymous' key if the object doesn't have a name, and its class is " +
|
214
291
|
"anonymous, and it hasn't specified a key directly" do
|
215
292
|
objectclass = Class.new
|
@@ -243,6 +320,7 @@ describe Configurability do
|
|
243
320
|
expect( Configurability.loaded_config ).to equal( @config )
|
244
321
|
end
|
245
322
|
|
323
|
+
|
246
324
|
it "propagates the installed configuration to any objects which add Configurability" do
|
247
325
|
objectclass = Class.new do
|
248
326
|
def initialize; @config = nil; end
|
@@ -257,6 +335,7 @@ describe Configurability do
|
|
257
335
|
expect( object.config ).to eq( :yes )
|
258
336
|
end
|
259
337
|
|
338
|
+
|
260
339
|
it "defers configuration until after an object has defined a #configure method if " +
|
261
340
|
"it adds Configurability before declaring one" do
|
262
341
|
objectclass = Class.new do
|
@@ -269,6 +348,7 @@ describe Configurability do
|
|
269
348
|
expect( objectclass.config ).to eq( :yes )
|
270
349
|
end
|
271
350
|
|
351
|
+
|
272
352
|
it "doesn't reconfigure objects that have already been configured unless the config changes" do
|
273
353
|
first_objectclass = Class.new do
|
274
354
|
extend Configurability
|
@@ -304,6 +384,7 @@ describe Configurability do
|
|
304
384
|
expect(Configurability.gather_defaults).to be_a( Hash )
|
305
385
|
end
|
306
386
|
|
387
|
+
|
307
388
|
it "fetches defaults from a CONFIG_DEFAULTS constant if the object defines one" do
|
308
389
|
klass = Class.new do
|
309
390
|
extend Configurability
|
@@ -319,6 +400,7 @@ describe Configurability do
|
|
319
400
|
expect( defaults[:testconfig] ).to_not be( klass.const_get(:CONFIG_DEFAULTS) )
|
320
401
|
end
|
321
402
|
|
403
|
+
|
322
404
|
it "fetches defaults from a DEFAULT_CONFIG constant if the object defines one" do
|
323
405
|
klass = Class.new do
|
324
406
|
extend Configurability
|
@@ -333,6 +415,7 @@ describe Configurability do
|
|
333
415
|
expect( defaults[:testconfig] ).to_not be( klass.const_get(:DEFAULT_CONFIG) )
|
334
416
|
end
|
335
417
|
|
418
|
+
|
336
419
|
it "fetches defaults from a #defaults method if the object implements one" do
|
337
420
|
klass = Class.new do
|
338
421
|
extend Configurability
|
@@ -347,6 +430,7 @@ describe Configurability do
|
|
347
430
|
expect( defaults[:otherconfig] ).to_not be( klass.defaults )
|
348
431
|
end
|
349
432
|
|
433
|
+
|
350
434
|
it "can return a Configurability::Config object with defaults, too" do
|
351
435
|
klass1 = Class.new do
|
352
436
|
extend Configurability
|
@@ -374,6 +458,7 @@ describe Configurability do
|
|
374
458
|
expect( config.otherconfig.other ).to be_truthy()
|
375
459
|
end
|
376
460
|
|
461
|
+
|
377
462
|
it "returns defaults for an object that inherits from a class with Configurability" do
|
378
463
|
klass = Class.new do
|
379
464
|
extend Configurability
|
@@ -390,7 +475,6 @@ describe Configurability do
|
|
390
475
|
|
391
476
|
expect( config ).to respond_to( :spanishconfig )
|
392
477
|
expect( config.spanishconfig.uno ).to eq( 1 )
|
393
|
-
|
394
478
|
end
|
395
479
|
|
396
480
|
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: 2.
|
4
|
+
version: 2.3.0.pre20161121123955
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
|
36
36
|
p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2016-
|
38
|
+
date: 2016-11-21 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: loggability
|
@@ -66,103 +66,103 @@ dependencies:
|
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '1.4'
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
|
-
name: hoe-
|
69
|
+
name: hoe-deveiate
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '0.
|
74
|
+
version: '0.8'
|
75
75
|
type: :development
|
76
76
|
prerelease: false
|
77
77
|
version_requirements: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '0.
|
81
|
+
version: '0.8'
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
|
-
name:
|
83
|
+
name: hoe-highline
|
84
84
|
requirement: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
88
|
+
version: '0.2'
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
91
|
version_requirements: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '
|
95
|
+
version: '0.2'
|
96
96
|
- !ruby/object:Gem::Dependency
|
97
|
-
name:
|
97
|
+
name: simplecov
|
98
98
|
requirement: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: '0.
|
102
|
+
version: '0.8'
|
103
103
|
type: :development
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: '0.
|
109
|
+
version: '0.8'
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
|
-
name:
|
111
|
+
name: hoe-bundler
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
116
|
+
version: '1.2'
|
117
117
|
type: :development
|
118
118
|
prerelease: false
|
119
119
|
version_requirements: !ruby/object:Gem::Requirement
|
120
120
|
requirements:
|
121
121
|
- - "~>"
|
122
122
|
- !ruby/object:Gem::Version
|
123
|
-
version: '
|
123
|
+
version: '1.2'
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
|
-
name:
|
125
|
+
name: rspec
|
126
126
|
requirement: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
128
|
- - "~>"
|
129
129
|
- !ruby/object:Gem::Version
|
130
|
-
version: '
|
130
|
+
version: '3.0'
|
131
131
|
type: :development
|
132
132
|
prerelease: false
|
133
133
|
version_requirements: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
135
|
- - "~>"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: '
|
137
|
+
version: '3.0'
|
138
138
|
- !ruby/object:Gem::Dependency
|
139
|
-
name:
|
139
|
+
name: rdoc
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: '
|
144
|
+
version: '4.0'
|
145
145
|
type: :development
|
146
146
|
prerelease: false
|
147
147
|
version_requirements: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
149
|
- - "~>"
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: '
|
151
|
+
version: '4.0'
|
152
152
|
- !ruby/object:Gem::Dependency
|
153
153
|
name: hoe
|
154
154
|
requirement: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version: '3.
|
158
|
+
version: '3.15'
|
159
159
|
type: :development
|
160
160
|
prerelease: false
|
161
161
|
version_requirements: !ruby/object:Gem::Requirement
|
162
162
|
requirements:
|
163
163
|
- - "~>"
|
164
164
|
- !ruby/object:Gem::Version
|
165
|
-
version: '3.
|
165
|
+
version: '3.15'
|
166
166
|
description: |-
|
167
167
|
Configurability is a unified, unintrusive, assume-nothing configuration system
|
168
168
|
for Ruby. It lets you keep the configuration for multiple objects in a single
|
@@ -179,10 +179,8 @@ extra_rdoc_files:
|
|
179
179
|
- Manifest.txt
|
180
180
|
- README.rdoc
|
181
181
|
files:
|
182
|
-
- ".gemtest"
|
183
182
|
- ChangeLog
|
184
183
|
- History.rdoc
|
185
|
-
- LICENSE
|
186
184
|
- Manifest.txt
|
187
185
|
- README.rdoc
|
188
186
|
- Rakefile
|
@@ -214,12 +212,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
212
|
version: 1.9.2
|
215
213
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
214
|
requirements:
|
217
|
-
- - "
|
215
|
+
- - ">"
|
218
216
|
- !ruby/object:Gem::Version
|
219
|
-
version:
|
217
|
+
version: 1.3.1
|
220
218
|
requirements: []
|
221
219
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.6.
|
220
|
+
rubygems_version: 2.6.8
|
223
221
|
signing_key:
|
224
222
|
specification_version: 4
|
225
223
|
summary: Configurability is a unified, unintrusive, assume-nothing configuration system
|
checksums.yaml.gz.sig
DELETED
Binary file
|
data.tar.gz.sig
DELETED
data/.gemtest
DELETED
File without changes
|
data/LICENSE
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
Copyright (c) 2010-2016 Michael Granger
|
2
|
-
All rights reserved.
|
3
|
-
|
4
|
-
Redistribution and use in source and binary forms, with or without
|
5
|
-
modification, are permitted provided that the following conditions are met:
|
6
|
-
|
7
|
-
* Redistributions of source code must retain the above copyright notice,
|
8
|
-
this list of conditions and the following disclaimer.
|
9
|
-
|
10
|
-
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
-
this list of conditions and the following disclaimer in the documentation
|
12
|
-
and/or other materials provided with the distribution.
|
13
|
-
|
14
|
-
* Neither the name of the author/s, nor the names of the project's
|
15
|
-
contributors may be used to endorse or promote products derived from this
|
16
|
-
software without specific prior written permission.
|
17
|
-
|
18
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
-
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
-
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
-
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
metadata.gz.sig
DELETED
@@ -1,4 +0,0 @@
|
|
1
|
-
-�ܼπi)?S�����L��p���&'P�=�7��/��3ߘ��&���X$�#w�I�z�Wٶ�Ċ�VжosL��"��a�c��&�����?{�WTD2ޡ�`��5I�0��Pv}�P�b=GPPRS�ZN�<����nOז1�
|
2
|
-
-$c:0�Bu~�����@��ȼ���;��g
|
3
|
-
��\�,*%m����t������m��A�:��{���y<�I�E�b�� +E���3ټUgW�<c��d6T�A*�T���*��0�=��O.��#�*dD�
|
4
|
-
ӯo~���d�.��"'SiF��O��^��,0�������]���NRT�V��C�X��O�٪�}<t"�7S�՟W4�{E"����19[ʴ��-�1
|