configurability 2.3.0.pre20161121123955 → 3.0.0.pre20161123172826
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/{History.rdoc → History.md} +11 -0
- data/Manifest.txt +2 -2
- data/{README.rdoc → README.md} +49 -21
- data/Rakefile +14 -8
- data/lib/configurability.rb +18 -7
- data/spec/configurability_spec.rb +50 -38
- metadata +15 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 312a9f359af2205c1d19680cdbf9d78dccffabbd
|
4
|
+
data.tar.gz: 04da93e50487652b33a29533d8bce47bdd6d45eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa298908a7f0a5c1204397e94e31b9c3292f045133b36e0c61c8f9d94065e371c3b7e7f53ca15f85d4902765f6b43d40f3b35fa71344a6e4edae10082f2a58de
|
7
|
+
data.tar.gz: 30c3d90e89cc257107f60d5eb7097508ad820b03caa3c23453f2ed384b5c8efd828d169f440c7f7850a8a9820108d89a5e1ac66fecb85509c946ed9f2f6b280a
|
data/{History.rdoc → History.md}
RENAMED
@@ -1,3 +1,14 @@
|
|
1
|
+
== v3.0.0 [2016-11-23] Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
Enhancement:
|
4
|
+
|
5
|
+
- Add hierarchical config keys.
|
6
|
+
|
7
|
+
|
8
|
+
== v2.2.2 [2016-09-28] Michael Granger <ged@FaerieMUD.org>
|
9
|
+
|
10
|
+
- Added signature for changeset 806d1f512f55
|
11
|
+
|
1
12
|
== v2.2.2 [2016-09-28] Michael Granger <ged@FaerieMUD.org>
|
2
13
|
|
3
14
|
- Fix the merge used by Configurability.gather_defaults
|
data/Manifest.txt
CHANGED
data/{README.rdoc → README.md}
RENAMED
@@ -1,12 +1,20 @@
|
|
1
|
-
|
1
|
+
# Configurability
|
2
2
|
|
3
|
-
home
|
4
|
-
|
5
|
-
docs :: http://deveiate.org/code/configurability
|
6
|
-
github :: https://github.com/ged/configurability
|
3
|
+
home
|
4
|
+
: https://bitbucket.org/ged/configurability
|
7
5
|
|
6
|
+
code
|
7
|
+
: https://bitbucket.org/ged/configurability
|
8
8
|
|
9
|
-
|
9
|
+
docs
|
10
|
+
: http://deveiate.org/code/configurability
|
11
|
+
|
12
|
+
github
|
13
|
+
: https://github.com/ged/configurability
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
## Description
|
10
18
|
|
11
19
|
Configurability is a unified, unintrusive, assume-nothing configuration system
|
12
20
|
for Ruby. It lets you keep the configuration for multiple objects in a single
|
@@ -16,12 +24,12 @@ single action.
|
|
16
24
|
|
17
25
|
|
18
26
|
|
19
|
-
|
27
|
+
## Installation
|
20
28
|
|
21
29
|
gem install configurability
|
22
30
|
|
23
31
|
|
24
|
-
|
32
|
+
## Usage
|
25
33
|
|
26
34
|
To add configurability to a class, just require the library and extend
|
27
35
|
the class:
|
@@ -68,14 +76,20 @@ When the configuration is loaded, an instance variable called `@config` is set
|
|
68
76
|
to the appropriate section of the config object for each object that has
|
69
77
|
been extended with Configurability.
|
70
78
|
|
79
|
+
As you add more objects to your configuration, it may be useful to group
|
80
|
+
related sections together. You can specify that your object's configuration
|
81
|
+
is part of a group by prepending the name of the group to your config key
|
82
|
+
separated by a double underscore (`__`)
|
83
|
+
|
71
84
|
|
72
|
-
|
85
|
+
## Customization
|
73
86
|
|
74
87
|
The default behavior above is just provided as a reasonable default; it is
|
75
88
|
expected that you'll want to customize at least one or two things about
|
76
89
|
how configuration is handled in your objects.
|
77
90
|
|
78
|
-
|
91
|
+
|
92
|
+
### Setting a Custom Config Key
|
79
93
|
|
80
94
|
The first thing you might want to do is change the config section that
|
81
95
|
corresponds to your object. You can do that by declaring a different
|
@@ -96,10 +110,8 @@ as a Symbol:
|
|
96
110
|
end
|
97
111
|
end
|
98
112
|
|
99
|
-
=== Changing How an Object Is Configured
|
100
113
|
|
101
|
-
|
102
|
-
being called with 'nil'.
|
114
|
+
### Changing How an Object Is Configured
|
103
115
|
|
104
116
|
You can also change what happens when an object is configured by implementing
|
105
117
|
a `#configure` method that takes the config section as an argument:
|
@@ -119,7 +131,7 @@ If you still want the `@config` variable to be set, just `super` from your
|
|
119
131
|
implementation; don't if you don't want it to be set.
|
120
132
|
|
121
133
|
|
122
|
-
|
134
|
+
## Configuration Objects
|
123
135
|
|
124
136
|
Configurability also includes `Configurability::Config`, a fairly simple
|
125
137
|
configuration object class that can be used to load a YAML configuration file,
|
@@ -237,15 +249,31 @@ or write it back to the file it was loaded from:
|
|
237
249
|
config.write
|
238
250
|
|
239
251
|
|
240
|
-
|
252
|
+
## Configuration Defaults
|
253
|
+
|
254
|
+
It's a good idea to provide a set of reasonable defaults for any configured
|
255
|
+
object. Configurability provides a `defaults` method that will look for a constant
|
256
|
+
called either `DEFAULT_CONFIG` or `CONFIG_DEFAULTS` on each object extended with
|
257
|
+
Configurability, and will return a dup of the value of this constant if it does.
|
258
|
+
|
259
|
+
You can also override `defaults` yourself if you wish to provide them via something
|
260
|
+
other than a constant.
|
261
|
+
|
262
|
+
There are also a couple of useful functions built on top of this method:
|
241
263
|
|
242
|
-
|
243
|
-
|
264
|
+
gather_defaults
|
265
|
+
: You can fetch a Hash of the default config values of all objects that have been extended
|
266
|
+
with Configurability by calling `Configurabilty.gather_defaults`. You can also pass an
|
267
|
+
object that responds to `#merge!` to the method to merge the defaults into an existing
|
268
|
+
config.
|
244
269
|
|
245
|
-
|
270
|
+
default_config
|
271
|
+
: This will return a Configurability::Config object made from the results of
|
272
|
+
`gather_defaults`. This makes it easy to write a config file that contains the default
|
273
|
+
configuration: `Configurability.default_config.write( "defaults.yml" )`
|
246
274
|
|
247
275
|
|
248
|
-
|
276
|
+
## Development
|
249
277
|
|
250
278
|
You can submit bug reports, suggestions, clone it with Mercurial, and
|
251
279
|
read more about future plans at
|
@@ -261,9 +289,9 @@ This task will install any missing dependencies, run the tests/specs,
|
|
261
289
|
and generate the API documentation.
|
262
290
|
|
263
291
|
|
264
|
-
|
292
|
+
## License
|
265
293
|
|
266
|
-
Copyright (c) 2010-2016 Michael Granger
|
294
|
+
Copyright (c) 2010-2016 Michael Granger and Mahlon E. Smith
|
267
295
|
All rights reserved.
|
268
296
|
|
269
297
|
Redistribution and use in source and binary forms, with or without
|
data/Rakefile
CHANGED
@@ -17,21 +17,27 @@ Hoe.plugins.delete :rubyforge
|
|
17
17
|
Encoding.default_internal = Encoding::UTF_8
|
18
18
|
|
19
19
|
hoespec = Hoe.spec 'configurability' do |spec|
|
20
|
-
spec.readme_file = 'README.
|
21
|
-
spec.history_file = 'History.
|
22
|
-
spec.extra_rdoc_files =
|
20
|
+
spec.readme_file = 'README.md'
|
21
|
+
spec.history_file = 'History.md'
|
22
|
+
spec.extra_rdoc_files = FileList[ '*.rdoc', '*.md' ]
|
23
23
|
spec.license 'BSD-3-Clause'
|
24
|
+
spec.urls = {
|
25
|
+
home: 'http://deveiate.org/projects/configurability',
|
26
|
+
code: 'http://bitbucket.org/ged/configurability',
|
27
|
+
docs: 'http://deveiate.org/code/configurability',
|
28
|
+
github: 'http://github.com/ged/configurability',
|
29
|
+
}
|
24
30
|
|
25
31
|
spec.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
32
|
+
spec.developer 'Mahlon E. Smith', 'mahlon@martini.nu'
|
26
33
|
|
27
34
|
spec.dependency 'loggability', '~> 0.11'
|
28
35
|
|
29
|
-
spec.dependency 'hoe-deveiate', '~> 0.
|
30
|
-
spec.dependency 'simplecov', '~> 0.
|
31
|
-
spec.dependency '
|
32
|
-
spec.dependency 'rspec', '~> 3.0', :developer
|
36
|
+
spec.dependency 'hoe-deveiate', '~> 0.8', :developer
|
37
|
+
spec.dependency 'simplecov', '~> 0.12', :developer
|
38
|
+
spec.dependency 'rspec', '~> 3.5', :developer
|
33
39
|
|
34
|
-
spec.require_ruby_version( '>=
|
40
|
+
spec.require_ruby_version( '>= 2.2.0' )
|
35
41
|
|
36
42
|
spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
|
37
43
|
spec.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
|
data/lib/configurability.rb
CHANGED
@@ -18,10 +18,10 @@ module Configurability
|
|
18
18
|
|
19
19
|
|
20
20
|
# Library version constant
|
21
|
-
VERSION = '
|
21
|
+
VERSION = '3.0.0'
|
22
22
|
|
23
23
|
# Version-control revision constant
|
24
|
-
REVISION = %q$Revision:
|
24
|
+
REVISION = %q$Revision: 1932602f7894 $
|
25
25
|
|
26
26
|
require 'configurability/deferredconfig'
|
27
27
|
|
@@ -169,6 +169,15 @@ module Configurability
|
|
169
169
|
end
|
170
170
|
|
171
171
|
|
172
|
+
### Nest the specified +hash+ inside subhashes for each subsection of the given +key+ and
|
173
|
+
### return the result.
|
174
|
+
def self::expand_config_hash( key, hash )
|
175
|
+
return key.to_s.split( '__' ).reverse.inject( hash ) do |inner_hash, subkey|
|
176
|
+
{ subkey.to_sym => inner_hash }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
|
172
181
|
### Gather defaults from objects with Configurability in the given +collection+
|
173
182
|
### object. Objects that wish to add a section to the defaults should implement
|
174
183
|
### a #defaults method in the same scope as #configure that returns the Hash of
|
@@ -180,10 +189,12 @@ module Configurability
|
|
180
189
|
|
181
190
|
self.configurable_objects.each do |obj|
|
182
191
|
next unless obj.respond_to?( :defaults )
|
183
|
-
if
|
184
|
-
|
185
|
-
Configurability.log.debug "Defaults for %p (%p): %p" %
|
186
|
-
|
192
|
+
if defaults_hash = obj.defaults
|
193
|
+
nested_hash = self.expand_config_hash( obj.config_key, defaults_hash )
|
194
|
+
Configurability.log.debug "Defaults for %p (%p): %p" %
|
195
|
+
[ obj, obj.config_key, nested_hash ]
|
196
|
+
|
197
|
+
collection.merge!( nested_hash, &mergefunc )
|
187
198
|
else
|
188
199
|
Configurability.log.warn "No defaults for %p; skipping" % [ obj ]
|
189
200
|
end
|
@@ -263,7 +274,7 @@ module Configurability
|
|
263
274
|
### Return a Configurability::Config object that contains the configuration
|
264
275
|
### defaults for the receiver.
|
265
276
|
def default_config
|
266
|
-
default_values = self.defaults or return Configurability::Config.new( {} )
|
277
|
+
default_values = self.defaults or return Configurability::Config::Struct.new( {} )
|
267
278
|
return Configurability::Config::Struct.new( default_values )
|
268
279
|
end
|
269
280
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
require 'ostruct'
|
3
4
|
require 'helpers'
|
4
5
|
|
5
6
|
require 'rspec'
|
@@ -55,82 +56,80 @@ describe Configurability do
|
|
55
56
|
end
|
56
57
|
|
57
58
|
|
58
|
-
it "
|
59
|
-
"responds_to? it" do
|
59
|
+
it "can use a struct-like object as the config" do
|
60
60
|
klass = Class.new do
|
61
61
|
extend Configurability
|
62
62
|
config_key :testconfig
|
63
63
|
end
|
64
|
-
|
65
|
-
config = double( "configuration object" )
|
66
|
-
expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( true )
|
67
|
-
expect( config ).to receive( :testconfig ).and_return( :a_config_section )
|
64
|
+
config = OpenStruct.new( testconfig: :a_config_section )
|
68
65
|
|
69
66
|
expect( klass ).to receive( :configure ).with( :a_config_section )
|
67
|
+
|
70
68
|
Configurability.configure_objects( config )
|
71
69
|
end
|
72
70
|
|
73
71
|
|
74
|
-
it "
|
72
|
+
it "can use a struct-like object as a config with subsections " do
|
75
73
|
klass = Class.new do
|
76
74
|
extend Configurability
|
77
75
|
config_key "testconfig.subsection"
|
78
76
|
end
|
79
|
-
|
80
|
-
config = double( "configuration object" )
|
81
|
-
expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( true )
|
82
|
-
|
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 )
|
77
|
+
config = OpenStruct.new( testconfig: {subsection: :the_config_subsection} )
|
87
78
|
|
88
79
|
expect( klass ).to receive( :configure ).with( :the_config_subsection )
|
80
|
+
|
89
81
|
Configurability.configure_objects( config )
|
90
82
|
end
|
91
83
|
|
92
84
|
|
93
|
-
it "
|
94
|
-
"directly to the section name, but does to the index operator and #key?" do
|
85
|
+
it "can use a hash as the config" do
|
95
86
|
klass = Class.new do
|
96
87
|
extend Configurability
|
97
88
|
config_key :testconfig
|
98
89
|
end
|
99
|
-
|
100
|
-
config = double( "configuration object" )
|
101
|
-
expect( config ).to receive( :respond_to? ).with( :testconfig ).and_return( false )
|
102
|
-
expect( config ).to receive( :respond_to? ).with( :key? ).and_return( true )
|
103
|
-
expect( config ).to receive( :respond_to? ).with( :[] ).and_return( true )
|
104
|
-
expect( config ).to receive( :key? ).with( :testconfig ).and_return( true )
|
105
|
-
expect( config ).to receive( :[] ).with( :testconfig ).and_return( :a_config_section )
|
90
|
+
config = { testconfig: :a_config_section }
|
106
91
|
|
107
92
|
expect( klass ).to receive( :configure ).with( :a_config_section )
|
93
|
+
|
108
94
|
Configurability.configure_objects( config )
|
109
95
|
end
|
110
96
|
|
111
97
|
|
112
|
-
it "
|
113
|
-
"directly to the section name, but does to the index operator and #key?" do
|
98
|
+
it "can use a hash as a config with subsections" do
|
114
99
|
klass = Class.new do
|
115
100
|
extend Configurability
|
116
101
|
config_key :testconfig__subsection
|
117
102
|
end
|
103
|
+
config = { testconfig: {subsection: :the_config_subsection} }
|
118
104
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
expect( config ).to receive( :key? ).with( :testconfig ).and_return( true )
|
105
|
+
expect( klass ).to receive( :configure ).with( :the_config_subsection )
|
106
|
+
|
107
|
+
Configurability.configure_objects( config )
|
108
|
+
end
|
124
109
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
110
|
+
|
111
|
+
it "can use a mix of struct-like and hash-like objects as a config with subsections" do
|
112
|
+
klass = Class.new do
|
113
|
+
extend Configurability
|
114
|
+
config_key :testconfig__subsection
|
115
|
+
end
|
116
|
+
config = OpenStruct.new( testconfig: {subsection: :the_config_subsection} )
|
117
|
+
|
118
|
+
expect( klass ).to receive( :configure ).with( :the_config_subsection )
|
119
|
+
|
120
|
+
Configurability.configure_objects( config )
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
it "supports more than one level of subsections" do
|
125
|
+
klass = Class.new do
|
126
|
+
extend Configurability
|
127
|
+
config_key "testconfig.sect1.sect2"
|
128
|
+
end
|
129
|
+
config = OpenStruct.new( testconfig: {sect1: {sect2: :the_config_subsection}} )
|
132
130
|
|
133
131
|
expect( klass ).to receive( :configure ).with( :the_config_subsection )
|
132
|
+
|
134
133
|
Configurability.configure_objects( config )
|
135
134
|
end
|
136
135
|
|
@@ -431,6 +430,19 @@ describe Configurability do
|
|
431
430
|
end
|
432
431
|
|
433
432
|
|
433
|
+
it "returns nested hashes for subsection defaults" do
|
434
|
+
klass = Class.new do
|
435
|
+
extend Configurability
|
436
|
+
config_key "testconfig.sect1.sect2"
|
437
|
+
self::CONFIG_DEFAULTS = { one: 1, two: 2 }
|
438
|
+
end
|
439
|
+
|
440
|
+
defaults = Configurability.gather_defaults
|
441
|
+
|
442
|
+
expect( defaults ).to eq({ testconfig: { sect1: {sect2: { one: 1, two: 2 }} } })
|
443
|
+
end
|
444
|
+
|
445
|
+
|
434
446
|
it "can return a Configurability::Config object with defaults, too" do
|
435
447
|
klass1 = Class.new do
|
436
448
|
extend Configurability
|
metadata
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: configurability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.pre20161123172826
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
8
|
+
- Mahlon E. Smith
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain:
|
@@ -35,7 +36,7 @@ cert_chain:
|
|
35
36
|
w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
|
36
37
|
p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
|
37
38
|
-----END CERTIFICATE-----
|
38
|
-
date: 2016-11-
|
39
|
+
date: 2016-11-24 00:00:00.000000000 Z
|
39
40
|
dependencies:
|
40
41
|
- !ruby/object:Gem::Dependency
|
41
42
|
name: loggability
|
@@ -99,42 +100,28 @@ dependencies:
|
|
99
100
|
requirements:
|
100
101
|
- - "~>"
|
101
102
|
- !ruby/object:Gem::Version
|
102
|
-
version: '0.
|
103
|
-
type: :development
|
104
|
-
prerelease: false
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0.8'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: hoe-bundler
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - "~>"
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '1.2'
|
103
|
+
version: '0.12'
|
117
104
|
type: :development
|
118
105
|
prerelease: false
|
119
106
|
version_requirements: !ruby/object:Gem::Requirement
|
120
107
|
requirements:
|
121
108
|
- - "~>"
|
122
109
|
- !ruby/object:Gem::Version
|
123
|
-
version: '
|
110
|
+
version: '0.12'
|
124
111
|
- !ruby/object:Gem::Dependency
|
125
112
|
name: rspec
|
126
113
|
requirement: !ruby/object:Gem::Requirement
|
127
114
|
requirements:
|
128
115
|
- - "~>"
|
129
116
|
- !ruby/object:Gem::Version
|
130
|
-
version: '3.
|
117
|
+
version: '3.5'
|
131
118
|
type: :development
|
132
119
|
prerelease: false
|
133
120
|
version_requirements: !ruby/object:Gem::Requirement
|
134
121
|
requirements:
|
135
122
|
- - "~>"
|
136
123
|
- !ruby/object:Gem::Version
|
137
|
-
version: '3.
|
124
|
+
version: '3.5'
|
138
125
|
- !ruby/object:Gem::Dependency
|
139
126
|
name: rdoc
|
140
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,18 +158,19 @@ description: |-
|
|
171
158
|
single action.
|
172
159
|
email:
|
173
160
|
- ged@FaerieMUD.org
|
161
|
+
- mahlon@martini.nu
|
174
162
|
executables:
|
175
163
|
- configurability
|
176
164
|
extensions: []
|
177
165
|
extra_rdoc_files:
|
178
|
-
- History.
|
166
|
+
- History.md
|
179
167
|
- Manifest.txt
|
180
|
-
- README.
|
168
|
+
- README.md
|
181
169
|
files:
|
182
170
|
- ChangeLog
|
183
|
-
- History.
|
171
|
+
- History.md
|
184
172
|
- Manifest.txt
|
185
|
-
- README.
|
173
|
+
- README.md
|
186
174
|
- Rakefile
|
187
175
|
- bin/configurability
|
188
176
|
- examples/basicconfig.rb
|
@@ -195,21 +183,21 @@ files:
|
|
195
183
|
- spec/configurability/deferredconfig_spec.rb
|
196
184
|
- spec/configurability_spec.rb
|
197
185
|
- spec/helpers.rb
|
198
|
-
homepage:
|
186
|
+
homepage: http://deveiate.org/projects/configurability
|
199
187
|
licenses:
|
200
188
|
- BSD-3-Clause
|
201
189
|
metadata: {}
|
202
190
|
post_install_message:
|
203
191
|
rdoc_options:
|
204
192
|
- "--main"
|
205
|
-
- README.
|
193
|
+
- README.md
|
206
194
|
require_paths:
|
207
195
|
- lib
|
208
196
|
required_ruby_version: !ruby/object:Gem::Requirement
|
209
197
|
requirements:
|
210
198
|
- - ">="
|
211
199
|
- !ruby/object:Gem::Version
|
212
|
-
version:
|
200
|
+
version: 2.2.0
|
213
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
202
|
requirements:
|
215
203
|
- - ">"
|