cascading-configuration-setting 1.1.6 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +120 -203
- data/README.rdoc +9 -7
- data/lib/cascading-configuration-setting.rb +2 -2
- data/lib/cascading-configuration-setting/CascadingConfiguration/Setting.rb +2 -2
- data/lib/cascading-configuration-setting/CascadingConfiguration/Setting/{ConfigurationAccessors.rb → AccessorDefinitionMethods.rb} +11 -11
- data/lib/cascading-configuration-setting/CascadingConfiguration/Setting/Interface.rb +6 -4
- data/spec/CascadingConfiguration/Setting/{ConfigurationAccessors_spec.rb → AccessorDefinitionMethods_spec.rb} +1 -1
- data/spec/CascadingConfiguration/Setting_spec.rb +240 -14
- metadata +5 -5
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Cascading Configuration #
|
1
|
+
# Cascading Configuration Setting #
|
2
2
|
|
3
3
|
http://rubygems.org/gems/cascading-configuration-setting
|
4
4
|
|
@@ -7,341 +7,258 @@ http://rubygems.org/gems/cascading-configuration-setting
|
|
7
7
|
Adds methods for cascading configuration settings. Support package for cascading-configuration.
|
8
8
|
|
9
9
|
# Summary #
|
10
|
-
|
11
|
-
## :attr_configuration ##
|
12
|
-
|
13
|
-
:attr_configuration provides inheritable configuration that cascades downward.
|
14
10
|
|
15
|
-
Configuration inheritance can cascade through modules, classes, and instances.
|
11
|
+
Cascading configuration methods for settings, which returns the appropriate lowest accumulated value. Configuration inheritance can cascade through modules, classes, and to instances.
|
16
12
|
|
17
|
-
|
13
|
+
This means that we can create configuration modules, optionally setting configuration defaults, and include those configuration modules in other modules or classes.
|
18
14
|
|
19
15
|
# Install #
|
20
16
|
|
21
|
-
* sudo gem install cascading-configuration
|
17
|
+
* sudo gem install cascading-configuration
|
22
18
|
|
23
19
|
# Usage #
|
24
20
|
|
25
|
-
|
26
|
-
|
27
|
-
Settings are set and acquired by the attribute name declared in :attr_configuration.
|
28
|
-
|
29
|
-
## First Module ##
|
30
|
-
|
31
|
-
1. Define initial configuration in a module.
|
32
|
-
|
33
|
-
A class works just as well, but we can't use a module in the same chain if we start with a class.
|
34
|
-
|
35
|
-
* Include module to enable attr_configuration_setting.
|
21
|
+
Including the module will enable support for singleton and for instances.
|
36
22
|
|
37
23
|
```ruby
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
|
24
|
+
module AnyModuleOrClass
|
25
|
+
include CascadingConfiguration::Setting
|
26
|
+
end
|
43
27
|
```
|
44
28
|
|
45
|
-
|
29
|
+
Extending the module will enable support for singleton only.
|
46
30
|
|
47
31
|
```ruby
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
32
|
+
module AnyModuleOrClass
|
33
|
+
extend CascadingConfiguration::Setting
|
34
|
+
end
|
53
35
|
```
|
54
36
|
|
55
|
-
|
37
|
+
Including or extending CascadingConfiguration includes or extends:
|
56
38
|
|
57
|
-
|
39
|
+
* CascadingConfiguration::Variable
|
58
40
|
|
59
|
-
|
60
|
-
self.some_configuration = :some_value
|
61
|
-
end
|
41
|
+
## :attr_configuration ##
|
62
42
|
|
63
|
-
|
43
|
+
:attr_configuration provides inheritable single-object configurations that cascades downward. The value lowest in the ancestor hierarchy will be returned.
|
64
44
|
|
65
|
-
|
45
|
+
Define initial configuration in a module or class:
|
66
46
|
|
67
47
|
```ruby
|
48
|
+
module SomeModule
|
68
49
|
|
69
|
-
|
70
|
-
# => some_configuration.should == :some_value
|
71
|
-
end
|
72
|
-
|
73
|
-
```
|
74
|
-
|
75
|
-
## Including Module 1 ##
|
50
|
+
include CascadingConfiguration::Setting
|
76
51
|
|
77
|
-
|
52
|
+
attr_configuration :some_setting
|
78
53
|
|
79
|
-
|
54
|
+
some_setting # => nil
|
80
55
|
|
81
|
-
|
56
|
+
# note: if we don't specify the receiver here (self) assignment creates local variable instead
|
57
|
+
self.some_setting = :some_value
|
82
58
|
|
83
|
-
|
84
|
-
include CascadingConfiguration::MockModule
|
85
|
-
end
|
59
|
+
some_setting # => :some_value
|
86
60
|
|
61
|
+
end
|
87
62
|
```
|
88
63
|
|
89
|
-
|
64
|
+
Include initial module in a module or class:
|
90
65
|
|
91
66
|
```ruby
|
67
|
+
class SomeClass
|
92
68
|
|
93
|
-
|
94
|
-
# => some_configuration.should == :some_value
|
95
|
-
end
|
69
|
+
include SomeModule
|
96
70
|
|
97
|
-
|
71
|
+
some_setting # => :some_value
|
98
72
|
|
99
|
-
|
73
|
+
self.some_setting = :some_other_value
|
100
74
|
|
101
|
-
|
75
|
+
some_setting # => :some_other_value
|
102
76
|
|
103
|
-
|
104
|
-
self.some_configuration = :module_value
|
105
|
-
end
|
77
|
+
SomeModule.some_setting # => :some_value
|
106
78
|
|
79
|
+
end
|
107
80
|
```
|
108
81
|
|
109
|
-
|
82
|
+
And it cascades to instances:
|
110
83
|
|
111
84
|
```ruby
|
85
|
+
instance = SomeClass.new
|
112
86
|
|
113
|
-
|
114
|
-
# => some_configuration.should == :module_value
|
115
|
-
end
|
116
|
-
|
117
|
-
```
|
118
|
-
|
119
|
-
## Including Module 2 ##
|
120
|
-
|
121
|
-
3. Include second module in another module.
|
122
|
-
|
123
|
-
```ruby
|
87
|
+
instance.some_setting.should == :some_value
|
124
88
|
|
125
|
-
|
126
|
-
include CascadingConfiguration::MockModule2
|
127
|
-
end
|
89
|
+
instance.some_setting = :another_value
|
128
90
|
|
91
|
+
instance.some_setting.should == :another_value
|
129
92
|
```
|
130
93
|
|
131
|
-
|
94
|
+
### :attr_module_configuration, :attr_class_configuration ###
|
132
95
|
|
133
|
-
|
96
|
+
:attr_class_configuration works like :attr_configuration but does not cascade to instances.
|
134
97
|
|
135
|
-
|
136
|
-
# => some_configuration.should == :module_value
|
137
|
-
end
|
138
|
-
|
139
|
-
```
|
140
|
-
|
141
|
-
## Top Class ##
|
142
|
-
|
143
|
-
4. Include third module in a class.
|
98
|
+
Define initial configuration in a module or class:
|
144
99
|
|
145
100
|
```ruby
|
101
|
+
module SomeModule
|
146
102
|
|
147
|
-
|
148
|
-
include CascadingConfiguration::MockModule3
|
149
|
-
end
|
103
|
+
include CascadingConfiguration::Setting
|
150
104
|
|
151
|
-
|
105
|
+
attr_class_configuration :some_setting
|
152
106
|
|
153
|
-
|
107
|
+
some_setting # => nil
|
154
108
|
|
155
|
-
|
109
|
+
self.some_setting = :some_value
|
156
110
|
|
157
|
-
|
158
|
-
# => some_configuration.should == :module_value
|
159
|
-
end
|
111
|
+
some_setting # => :some_value
|
160
112
|
|
113
|
+
end
|
161
114
|
```
|
162
115
|
|
163
|
-
|
116
|
+
Include initial module in a module or class:
|
164
117
|
|
165
118
|
```ruby
|
119
|
+
class SomeClass
|
166
120
|
|
167
|
-
|
168
|
-
self.some_configuration = :another_value
|
169
|
-
end
|
121
|
+
include SomeModule
|
170
122
|
|
171
|
-
|
123
|
+
some_setting # => :some_value
|
172
124
|
|
173
|
-
|
125
|
+
self.some_setting = :some_other_value
|
174
126
|
|
175
|
-
|
127
|
+
some_setting # => :some_other_value
|
176
128
|
|
177
|
-
|
178
|
-
# => some_configuration.should == :another_value
|
179
|
-
end
|
129
|
+
SomeModule.some_setting # => :some_value
|
180
130
|
|
131
|
+
end
|
181
132
|
```
|
182
133
|
|
183
|
-
|
184
|
-
|
185
|
-
5. Instantiate class.
|
134
|
+
And it does not cascade to instances:
|
186
135
|
|
187
136
|
```ruby
|
137
|
+
instance = SomeClass.new
|
188
138
|
|
189
|
-
|
190
|
-
|
139
|
+
instance.respond_to?( :some_setting ).should == false
|
191
140
|
```
|
192
141
|
|
193
|
-
|
194
|
-
|
195
|
-
```ruby
|
196
|
-
|
197
|
-
# => object_instance_one.some_configuration.should == :another_value
|
142
|
+
### :attr_local_configuration ###
|
198
143
|
|
199
|
-
|
144
|
+
:attr_local_configuration works like :attr_configuration but does not cascade. This is primarily useful for creating local configurations maintained in parallel with cascading configurations (for instance, with the same variable prefixes), for overriding the local configuration method, and for hiding the configuration variable (coming soon).
|
200
145
|
|
201
|
-
|
146
|
+
Define initial configuration in a module or class:
|
202
147
|
|
203
148
|
```ruby
|
149
|
+
module SomeModule
|
204
150
|
|
205
|
-
|
151
|
+
include CascadingConfiguration::Setting
|
206
152
|
|
207
|
-
|
153
|
+
attr_local_configuration :some_setting
|
208
154
|
|
209
|
-
|
155
|
+
some_setting # => nil
|
210
156
|
|
211
|
-
|
157
|
+
self.some_setting = :some_value
|
212
158
|
|
213
|
-
# =>
|
214
|
-
# => CascadingConfiguration::MockClass.some_configuration.should == :another_value
|
215
|
-
# => CascadingConfiguration::MockModule.some_configuration.should == :some_value
|
159
|
+
some_setting # => :some_value
|
216
160
|
|
161
|
+
end
|
217
162
|
```
|
218
163
|
|
219
|
-
|
220
|
-
|
221
|
-
6. Inheriting class.
|
222
|
-
|
223
|
-
Inheriting class should not get any settings from instance of superclass.
|
224
|
-
|
225
|
-
* Verify inherited value
|
164
|
+
Include initial module in a module or class:
|
226
165
|
|
227
166
|
```ruby
|
167
|
+
class SomeClass
|
228
168
|
|
229
|
-
|
230
|
-
# => some_configuration.should == :another_value
|
231
|
-
end
|
232
|
-
|
233
|
-
```
|
234
|
-
|
235
|
-
* Override inherited value
|
236
|
-
|
237
|
-
```ruby
|
169
|
+
include SomeModule
|
238
170
|
|
239
|
-
|
240
|
-
self.some_configuration = :a_value_not_yet_used
|
241
|
-
end
|
171
|
+
respond_to?( :some_setting ).should == false
|
242
172
|
|
173
|
+
end
|
243
174
|
```
|
244
175
|
|
245
|
-
|
246
|
-
|
247
|
-
```ruby
|
176
|
+
## Additional Functionality ##
|
248
177
|
|
249
|
-
|
250
|
-
# => some_configuration.should == :a_value_not_yet_used
|
251
|
-
# => CascadingConfiguration::MockClass.some_configuration.should == :another_value
|
252
|
-
# => CascadingConfiguration::MockModule.some_configuration.should == :some_value
|
253
|
-
end
|
178
|
+
Cascading-configuration also provides several other convenience functions.
|
254
179
|
|
255
|
-
|
180
|
+
### Variable Name Prefixing ###
|
256
181
|
|
257
|
-
|
182
|
+
Configuration prefix can be set so that variables use property name with the configuration prefix prepended.
|
258
183
|
|
259
|
-
|
184
|
+
This can be done in order defined (current configuration prefix is stored for configuration), or it can be specified on a per-property basis.
|
260
185
|
|
261
186
|
```ruby
|
187
|
+
module SomeModule
|
262
188
|
|
263
|
-
|
189
|
+
include CascadingConfiguration
|
264
190
|
|
265
|
-
|
191
|
+
attr_configuration :some_setting
|
266
192
|
|
267
|
-
|
193
|
+
self.some_setting = :a_value
|
268
194
|
|
269
|
-
|
195
|
+
instance_variables.include?( :@some_setting ) # => true
|
270
196
|
|
271
|
-
#
|
272
|
-
|
273
|
-
# => CascadingConfiguration::MockClass.some_configuration.should == :another_value
|
274
|
-
# => CascadingConfiguration::MockModule.some_configuration.should == :some_value
|
197
|
+
# we can declare a prefix for specific properties
|
198
|
+
attr_configuration_prefix '__configuration_prefix__', :some_other_setting
|
275
199
|
|
276
|
-
|
200
|
+
attr_configuration :some_other_setting, :yet_another_setting
|
277
201
|
|
278
|
-
|
202
|
+
self.some_setting = :some_value
|
203
|
+
self.yet_another_setting = :another_value
|
279
204
|
|
280
|
-
|
205
|
+
instance_variables.include?( :@some_other_setting ) # => false
|
206
|
+
instance_variables.include?( :@__configuration_prefix__some_other_setting ) # => true
|
207
|
+
instance_variables.include?( :@yet_another_setting ) # => true
|
281
208
|
|
282
|
-
|
209
|
+
# or we can declare a prefix for all properties defined after prefix is declared
|
210
|
+
attr_configuration_prefix '__another_configuration_prefix__'
|
283
211
|
|
284
|
-
|
212
|
+
attr_configuration :still_another_prefix
|
285
213
|
|
286
|
-
|
287
|
-
|
288
|
-
end
|
214
|
+
instance_variables.include?( :@still_another_prefix ) # => false
|
215
|
+
instance_variables.include?( :@__another_configuration_prefix__still_another_prefix ) # => true
|
289
216
|
|
217
|
+
end
|
290
218
|
```
|
291
219
|
|
292
|
-
|
293
|
-
|
294
|
-
```ruby
|
220
|
+
### Method Redefinition ###
|
295
221
|
|
296
|
-
|
297
|
-
self.some_configuration = :another_value_not_yet_used
|
298
|
-
end
|
222
|
+
Any declared configuration is defined in order to support locally redefining the method and accessing the original by calling super.
|
299
223
|
|
300
|
-
```
|
224
|
+
```ruby
|
225
|
+
module SomeModule
|
301
226
|
|
302
|
-
|
227
|
+
include CascadingConfiguration
|
303
228
|
|
304
|
-
|
229
|
+
attr_configuration :some_array_setting
|
305
230
|
|
306
|
-
|
307
|
-
|
231
|
+
def some_array_setting=( value )
|
232
|
+
puts 'Replacing configuration array!'
|
233
|
+
super
|
308
234
|
end
|
309
235
|
|
236
|
+
end
|
310
237
|
```
|
311
238
|
|
312
|
-
|
239
|
+
### Hidden Configuration ###
|
313
240
|
|
314
|
-
|
241
|
+
#### :attr_hide ####
|
315
242
|
|
316
|
-
|
317
|
-
|
318
|
-
object_instance_three = CascadingConfiguration::MockClassSub2.new
|
319
|
-
|
320
|
-
```
|
321
|
-
|
322
|
-
* Verify inherited value
|
243
|
+
Coming soon.
|
323
244
|
|
324
245
|
```ruby
|
246
|
+
module SomeModule
|
325
247
|
|
326
|
-
|
248
|
+
include CascadingConfiguration
|
327
249
|
|
328
|
-
|
250
|
+
attr_configuration :some_array_setting
|
329
251
|
|
330
|
-
|
252
|
+
instance_variables.include?( :@some_array_setting ) # => true
|
331
253
|
|
332
|
-
|
254
|
+
attr_hide :some_array_setting
|
333
255
|
|
334
|
-
|
256
|
+
instance_variables.include?( :@some_array_setting ) # => false
|
335
257
|
|
258
|
+
end
|
336
259
|
```
|
337
260
|
|
338
|
-
|
339
|
-
|
340
|
-
```ruby
|
341
|
-
|
342
|
-
# => object_instance_three.some_configuration.should == :one_more_unused_value
|
343
|
-
|
344
|
-
```
|
261
|
+
Causes configuration variable to be stored in external context so that it is not included in instance variables.
|
345
262
|
|
346
263
|
# License #
|
347
264
|
|
@@ -366,4 +283,4 @@ Inheriting class should not get any settings from instance of superclass.
|
|
366
283
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
367
284
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
368
285
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
369
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
286
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
== Cascading Configuration
|
2
2
|
|
3
|
-
http://rubygems.org/gems/cascading-configuration
|
3
|
+
http://rubygems.org/gems/cascading-configuration-setting
|
4
4
|
|
5
5
|
== Description
|
6
6
|
|
7
|
-
Adds methods for cascading
|
7
|
+
Adds methods for cascading configuration settings. Support package for cascading-configuration.
|
8
8
|
|
9
9
|
== Summary
|
10
10
|
|
11
|
-
Cascading configuration methods for
|
11
|
+
Cascading configuration methods for settings, which returns the appropriate lowest accumulated value. Configuration inheritance can cascade through modules, classes, and to instances.
|
12
|
+
|
13
|
+
This means that we can create configuration modules, optionally setting configuration defaults, and include those configuration modules in other modules or classes.
|
12
14
|
|
13
15
|
== :attr_configuration
|
14
16
|
|
15
|
-
:attr_configuration provides inheritable
|
17
|
+
:attr_configuration provides inheritable single-object configurations that cascades downward. The value lowest in the ancestor hierarchy will be returned.
|
16
18
|
|
17
|
-
|
19
|
+
:attr_class_configuration works like :attr_configuration but does not cascade to instances.
|
18
20
|
|
19
|
-
:attr_configuration
|
21
|
+
:attr_local_configuration works like :attr_configuration but does not cascade. This is primarily useful for creating local configurations maintained in parallel with cascading configurations (for instance, with the same variable prefixes), for overriding the local configuration method, and for hiding the configuration variable (coming soon).
|
20
22
|
|
21
23
|
== Install
|
22
24
|
|
@@ -24,7 +26,7 @@ Configuration inheritance can cascade through modules, classes, and instances.
|
|
24
26
|
|
25
27
|
== Usage
|
26
28
|
|
27
|
-
See
|
29
|
+
See README.md
|
28
30
|
|
29
31
|
== License
|
30
32
|
|
@@ -7,7 +7,7 @@ end
|
|
7
7
|
|
8
8
|
module CascadingConfiguration
|
9
9
|
module Setting
|
10
|
-
module
|
10
|
+
module AccessorDefinitionMethods
|
11
11
|
end
|
12
12
|
module Interface
|
13
13
|
end
|
@@ -19,6 +19,6 @@ module CascadingConfiguration
|
|
19
19
|
end
|
20
20
|
|
21
21
|
require_relative 'cascading-configuration-setting/CascadingConfiguration/Setting.rb'
|
22
|
-
require_relative 'cascading-configuration-setting/CascadingConfiguration/Setting/
|
22
|
+
require_relative 'cascading-configuration-setting/CascadingConfiguration/Setting/AccessorDefinitionMethods.rb'
|
23
23
|
require_relative 'cascading-configuration-setting/CascadingConfiguration/Setting/Interface.rb'
|
24
24
|
require_relative 'cascading-configuration-setting/CascadingConfiguration/Setting/ModuleInclusionExtensionSupport.rb'
|
@@ -33,7 +33,7 @@ module CascadingConfiguration::Setting
|
|
33
33
|
class_or_module.instance_eval do
|
34
34
|
extend module_self
|
35
35
|
extend module_self::Interface
|
36
|
-
extend module_self::
|
36
|
+
extend module_self::AccessorDefinitionMethods
|
37
37
|
extend module_self::ModuleInclusionExtensionSupport unless is_a?( Class )
|
38
38
|
end
|
39
39
|
end
|
@@ -46,7 +46,7 @@ module CascadingConfiguration::Setting
|
|
46
46
|
module_self = self
|
47
47
|
class_or_module.instance_eval do
|
48
48
|
extend module_self::Interface
|
49
|
-
extend module_self::
|
49
|
+
extend module_self::AccessorDefinitionMethods
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
module CascadingConfiguration::Setting::
|
2
|
+
module CascadingConfiguration::Setting::AccessorDefinitionMethods
|
3
3
|
|
4
4
|
extend CascadingConfiguration::InternalModuleStub
|
5
5
|
|
@@ -9,11 +9,11 @@ module CascadingConfiguration::Setting::ConfigurationAccessors
|
|
9
9
|
|
10
10
|
def define_cascading_setter( configuration_name )
|
11
11
|
configuration_setter_name = ( configuration_name.to_s + '=' ).to_s
|
12
|
-
[ accessor_instance_support, accessor_module_support ].compact.each do |
|
13
|
-
|
12
|
+
[ accessor_instance_support, accessor_module_support ].compact.each do |accessor_module_support|
|
13
|
+
accessor_module_support.module_eval do
|
14
14
|
define_method( configuration_setter_name ) do |value|
|
15
15
|
# configuration setter returns setting variable (variable from self), which is now the ID of value
|
16
|
-
return instance_variable_set(
|
16
|
+
return instance_variable_set( accessor_module_support.cascading_variable_name( configuration_name ), value )
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -26,8 +26,8 @@ module CascadingConfiguration::Setting::ConfigurationAccessors
|
|
26
26
|
def define_cascading_getter( configuration_name )
|
27
27
|
configuration_getter_name = configuration_name
|
28
28
|
module_self = self
|
29
|
-
[ accessor_instance_support, accessor_module_support ].compact.each do |
|
30
|
-
|
29
|
+
[ accessor_instance_support, accessor_module_support ].compact.each do |accessor_module_support|
|
30
|
+
accessor_module_support.module_eval do
|
31
31
|
define_method( configuration_getter_name ) do
|
32
32
|
# configuration getter returns current setting value (taken from first superclass with setting)
|
33
33
|
# that means first variable that has been set
|
@@ -46,7 +46,7 @@ module CascadingConfiguration::Setting::ConfigurationAccessors
|
|
46
46
|
accessor_module_support.module_eval do
|
47
47
|
define_method( configuration_setter_name ) do |value|
|
48
48
|
# configuration setter returns setting variable (variable from self), which is now the ID of value
|
49
|
-
return instance_variable_set(
|
49
|
+
return instance_variable_set( accessor_module_support.cascading_variable_name( configuration_name ), value )
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -72,10 +72,10 @@ module CascadingConfiguration::Setting::ConfigurationAccessors
|
|
72
72
|
|
73
73
|
def define_local_configuration_setter( configuration_name )
|
74
74
|
configuration_setter_name = ( configuration_name.to_s + '=' ).to_s
|
75
|
-
|
75
|
+
accessor_local_instance_support.module_eval do
|
76
76
|
define_method( configuration_setter_name ) do |value|
|
77
77
|
# configuration setter returns setting variable (variable from self), which is now the ID of value
|
78
|
-
return instance_variable_set(
|
78
|
+
return instance_variable_set( accessor_module_support.cascading_variable_name( configuration_name ), value )
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
@@ -86,11 +86,11 @@ module CascadingConfiguration::Setting::ConfigurationAccessors
|
|
86
86
|
|
87
87
|
def define_local_configuration_getter( configuration_name )
|
88
88
|
configuration_getter_name = configuration_name
|
89
|
-
|
89
|
+
accessor_local_instance_support.module_eval do
|
90
90
|
define_method( configuration_getter_name ) do
|
91
91
|
# configuration getter returns current setting value (taken from first superclass with setting)
|
92
92
|
# that means first variable that has been set
|
93
|
-
return
|
93
|
+
return instance_variable_get( accessor_module_support.cascading_variable_name( configuration_name ) )
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
@@ -18,13 +18,13 @@ module CascadingConfiguration::Setting::Interface
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
#
|
23
|
-
|
21
|
+
###############################
|
22
|
+
# attr_module_configuration #
|
23
|
+
###############################
|
24
24
|
|
25
25
|
# defines configuration in class or module
|
26
26
|
# configuration cascades downward to last class or module
|
27
|
-
def
|
27
|
+
def attr_module_configuration( *property_names )
|
28
28
|
property_names.each do |this_property_name|
|
29
29
|
# define configuration setter
|
30
30
|
define_class_configuration_setter( this_property_name )
|
@@ -32,6 +32,7 @@ module CascadingConfiguration::Setting::Interface
|
|
32
32
|
define_class_configuration_getter( this_property_name )
|
33
33
|
end
|
34
34
|
end
|
35
|
+
alias_method :attr_class_configuration, :attr_module_configuration
|
35
36
|
|
36
37
|
##############################
|
37
38
|
# attr_local_configuration #
|
@@ -40,6 +41,7 @@ module CascadingConfiguration::Setting::Interface
|
|
40
41
|
# defines configuration in present class or module context
|
41
42
|
# configuration does not cascade
|
42
43
|
def attr_local_configuration( *property_names )
|
44
|
+
CascadingConfiguration::Variable.define_accessor_local_instance_support( self )
|
43
45
|
property_names.each do |this_property_name|
|
44
46
|
# define configuration setter
|
45
47
|
define_local_configuration_setter( this_property_name )
|
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
require_relative '../../../lib/cascading-configuration-setting.rb'
|
3
3
|
|
4
|
-
describe CascadingConfiguration::Setting::
|
4
|
+
describe CascadingConfiguration::Setting::AccessorDefinitionMethods do
|
5
5
|
|
6
6
|
#############################
|
7
7
|
# define_cascading_setter #
|
@@ -17,7 +17,7 @@ describe CascadingConfiguration::Setting do
|
|
17
17
|
|
18
18
|
# possibilities:
|
19
19
|
# * module extended with setting
|
20
|
-
module CascadingConfiguration::Setting::
|
20
|
+
module CascadingConfiguration::Setting::ConfigurationMockExtended
|
21
21
|
extend CascadingConfiguration::Setting
|
22
22
|
# => singleton gets attr_configuration and configurations
|
23
23
|
respond_to?( :attr_configuration ).should == true
|
@@ -28,31 +28,31 @@ describe CascadingConfiguration::Setting do
|
|
28
28
|
instance_methods.include?( :some_configuration ).should == false
|
29
29
|
# => including modules and classes get nothing
|
30
30
|
module SubmoduleIncluding
|
31
|
-
include CascadingConfiguration::Setting::
|
31
|
+
include CascadingConfiguration::Setting::ConfigurationMockExtended
|
32
32
|
instance_methods.include?( :some_configuration ).should == false
|
33
33
|
respond_to?( :some_configuration ).should == false
|
34
34
|
end
|
35
35
|
# => extending modules and classes get nothing
|
36
36
|
module SubmoduleExtending
|
37
|
-
extend CascadingConfiguration::Setting::
|
37
|
+
extend CascadingConfiguration::Setting::ConfigurationMockExtended
|
38
38
|
instance_methods.include?( :some_configuration ).should == false
|
39
39
|
respond_to?( :some_configuration ).should == false
|
40
40
|
end
|
41
41
|
# => instances of including and extending classes get nothing
|
42
42
|
class ClassIncluding
|
43
|
-
include CascadingConfiguration::Setting::
|
43
|
+
include CascadingConfiguration::Setting::ConfigurationMockExtended
|
44
44
|
instance_methods.include?( :some_configuration ).should == false
|
45
45
|
respond_to?( :some_configuration ).should == false
|
46
46
|
end
|
47
47
|
class ClassExtending
|
48
|
-
extend CascadingConfiguration::Setting::
|
48
|
+
extend CascadingConfiguration::Setting::ConfigurationMockExtended
|
49
49
|
instance_methods.include?( :some_configuration ).should == false
|
50
50
|
respond_to?( :some_configuration ).should == false
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
# * module included with setting
|
55
|
-
module CascadingConfiguration::Setting::
|
55
|
+
module CascadingConfiguration::Setting::ConfigurationMockIncluded
|
56
56
|
include CascadingConfiguration::Setting
|
57
57
|
# => singleton gets attr_configuration and configurations
|
58
58
|
respond_to?( :attr_configuration ).should == true
|
@@ -63,7 +63,7 @@ describe CascadingConfiguration::Setting do
|
|
63
63
|
instance_methods.include?( :some_configuration ).should == true
|
64
64
|
# => including modules and classes get attr_configuration and configurations
|
65
65
|
module SubmoduleIncluding
|
66
|
-
include CascadingConfiguration::Setting::
|
66
|
+
include CascadingConfiguration::Setting::ConfigurationMockIncluded
|
67
67
|
instance_methods.include?( :some_configuration ).should == true
|
68
68
|
respond_to?( :some_configuration ).should == true
|
69
69
|
some_configuration.should == :our_setting_value
|
@@ -72,7 +72,7 @@ describe CascadingConfiguration::Setting do
|
|
72
72
|
end
|
73
73
|
# => extending modules and classes get attr_configuration and configurations
|
74
74
|
module SubmoduleExtending
|
75
|
-
extend CascadingConfiguration::Setting::
|
75
|
+
extend CascadingConfiguration::Setting::ConfigurationMockIncluded
|
76
76
|
# if we're extended then we want to use the eigenclass ancestor chain
|
77
77
|
# - the first ancestor will be the extending module
|
78
78
|
# - the rest of the ancestors will be the extending module's include chain
|
@@ -84,7 +84,7 @@ describe CascadingConfiguration::Setting do
|
|
84
84
|
end
|
85
85
|
# => instances of including classes get configurations
|
86
86
|
class ClassIncluding
|
87
|
-
include CascadingConfiguration::Setting::
|
87
|
+
include CascadingConfiguration::Setting::ConfigurationMockIncluded
|
88
88
|
instance_methods.include?( :some_configuration ).should == true
|
89
89
|
respond_to?( :some_configuration ).should == true
|
90
90
|
some_configuration.should == :our_setting_value
|
@@ -98,7 +98,7 @@ describe CascadingConfiguration::Setting do
|
|
98
98
|
some_configuration.should == :our_setting_value
|
99
99
|
# => instances of extending classes get nothing
|
100
100
|
class ClassExtending
|
101
|
-
extend CascadingConfiguration::Setting::
|
101
|
+
extend CascadingConfiguration::Setting::ConfigurationMockIncluded
|
102
102
|
respond_to?( :some_configuration ).should == true
|
103
103
|
some_configuration.should == :our_setting_value
|
104
104
|
self.some_configuration = :some_other_configuration
|
@@ -109,22 +109,248 @@ describe CascadingConfiguration::Setting do
|
|
109
109
|
setting_class_including_instance.respond_to?( :some_configuration ).should == false
|
110
110
|
end
|
111
111
|
|
112
|
-
class CascadingConfiguration::Setting::
|
113
|
-
include CascadingConfiguration::Setting::
|
112
|
+
class CascadingConfiguration::Setting::ConfigurationMockClass
|
113
|
+
include CascadingConfiguration::Setting::ConfigurationMockIncluded::SubmoduleIncluding
|
114
114
|
some_configuration.should == :another_configuration
|
115
115
|
self.some_configuration = :our_setting_value
|
116
116
|
some_configuration.should == :our_setting_value
|
117
117
|
end
|
118
|
-
class CascadingConfiguration::Setting::
|
118
|
+
class CascadingConfiguration::Setting::ConfigurationMockClassSub1 < CascadingConfiguration::Setting::ConfigurationMockClass
|
119
119
|
some_configuration.should == :our_setting_value
|
120
120
|
self.some_configuration = :our_other_setting_value
|
121
121
|
some_configuration.should == :our_other_setting_value
|
122
122
|
end
|
123
|
-
class CascadingConfiguration::Setting::
|
123
|
+
class CascadingConfiguration::Setting::ConfigurationMockClassSub2 < CascadingConfiguration::Setting::ConfigurationMockClassSub1
|
124
124
|
some_configuration.should == :our_other_setting_value
|
125
125
|
self.some_configuration = :a_third_setting_value
|
126
126
|
some_configuration.should == :a_third_setting_value
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
|
+
###############################
|
131
|
+
# attr_module_configuration #
|
132
|
+
# attr_class_configuration #
|
133
|
+
###############################
|
134
|
+
|
135
|
+
it 'can define a class configuration setting, which will not cascade to instances' do
|
136
|
+
|
137
|
+
# extending a module or class works like a finalizer for the cascading configuration
|
138
|
+
# if the configuration is re-opened at a later point (including or extending a lower ancestor)
|
139
|
+
# then the configuration will still cascade upward
|
140
|
+
# this permits ancestors in the heirarchy to skip out on configurations
|
141
|
+
# upward cascade can be frozen at any point using :freeze!, which will prevent further upward lookup
|
142
|
+
|
143
|
+
# possibilities:
|
144
|
+
# * module extended with setting
|
145
|
+
module CascadingConfiguration::Setting::ClassConfigurationMockExtended
|
146
|
+
extend CascadingConfiguration::Setting
|
147
|
+
# => singleton gets attr_module_configuration and configurations
|
148
|
+
respond_to?( :attr_module_configuration ).should == true
|
149
|
+
method( :attr_module_configuration ).should == method( :attr_class_configuration )
|
150
|
+
attr_module_configuration :some_configuration
|
151
|
+
respond_to?( :attr_module_configuration ).should == true
|
152
|
+
self.some_configuration = :our_setting_value
|
153
|
+
some_configuration.should == :our_setting_value
|
154
|
+
instance_methods.include?( :some_configuration ).should == false
|
155
|
+
# => including modules and classes get nothing
|
156
|
+
module SubmoduleIncluding
|
157
|
+
include CascadingConfiguration::Setting::ClassConfigurationMockExtended
|
158
|
+
instance_methods.include?( :some_configuration ).should == false
|
159
|
+
respond_to?( :some_configuration ).should == false
|
160
|
+
end
|
161
|
+
# => extending modules and classes get nothing
|
162
|
+
module SubmoduleExtending
|
163
|
+
extend CascadingConfiguration::Setting::ClassConfigurationMockExtended
|
164
|
+
instance_methods.include?( :some_configuration ).should == false
|
165
|
+
respond_to?( :some_configuration ).should == false
|
166
|
+
end
|
167
|
+
# => instances of including and extending classes get nothing
|
168
|
+
class ClassIncluding
|
169
|
+
include CascadingConfiguration::Setting::ClassConfigurationMockExtended
|
170
|
+
instance_methods.include?( :some_configuration ).should == false
|
171
|
+
respond_to?( :some_configuration ).should == false
|
172
|
+
end
|
173
|
+
class ClassExtending
|
174
|
+
extend CascadingConfiguration::Setting::ClassConfigurationMockExtended
|
175
|
+
instance_methods.include?( :some_configuration ).should == false
|
176
|
+
respond_to?( :some_configuration ).should == false
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# * module included with setting
|
181
|
+
module CascadingConfiguration::Setting::ClassConfigurationMockIncluded
|
182
|
+
include CascadingConfiguration::Setting
|
183
|
+
# => singleton gets attr_module_configuration and configurations
|
184
|
+
respond_to?( :attr_module_configuration ).should == true
|
185
|
+
attr_module_configuration :some_configuration
|
186
|
+
respond_to?( :some_configuration ).should == true
|
187
|
+
self.some_configuration = :our_setting_value
|
188
|
+
some_configuration.should == :our_setting_value
|
189
|
+
instance_methods.include?( :some_configuration ).should == false
|
190
|
+
# => including modules and classes get attr_module_configuration and configurations
|
191
|
+
module SubmoduleIncluding
|
192
|
+
include CascadingConfiguration::Setting::ClassConfigurationMockIncluded
|
193
|
+
instance_methods.include?( :some_configuration ).should == false
|
194
|
+
respond_to?( :some_configuration ).should == true
|
195
|
+
some_configuration.should == :our_setting_value
|
196
|
+
self.some_configuration = :another_configuration
|
197
|
+
some_configuration.should == :another_configuration
|
198
|
+
end
|
199
|
+
# => extending modules and classes get attr_module_configuration and configurations
|
200
|
+
module SubmoduleExtending
|
201
|
+
extend CascadingConfiguration::Setting::ClassConfigurationMockIncluded
|
202
|
+
# if we're extended then we want to use the eigenclass ancestor chain
|
203
|
+
# - the first ancestor will be the extending module
|
204
|
+
# - the rest of the ancestors will be the extending module's include chain
|
205
|
+
respond_to?( :some_configuration ).should == true
|
206
|
+
some_configuration.should == :our_setting_value
|
207
|
+
self.some_configuration = :some_other_configuration
|
208
|
+
some_configuration.should == :some_other_configuration
|
209
|
+
instance_methods.include?( :some_configuration ).should == false
|
210
|
+
end
|
211
|
+
# => instances of including classes get configurations
|
212
|
+
class ClassIncluding
|
213
|
+
include CascadingConfiguration::Setting::ClassConfigurationMockIncluded
|
214
|
+
instance_methods.include?( :some_configuration ).should == false
|
215
|
+
respond_to?( :some_configuration ).should == true
|
216
|
+
some_configuration.should == :our_setting_value
|
217
|
+
self.some_configuration = :another_configuration
|
218
|
+
some_configuration.should == :another_configuration
|
219
|
+
end
|
220
|
+
setting_class_including_instance = ClassIncluding.new
|
221
|
+
setting_class_including_instance.respond_to?( :some_configuration ).should == false
|
222
|
+
# => instances of extending classes get nothing
|
223
|
+
class ClassExtending
|
224
|
+
extend CascadingConfiguration::Setting::ClassConfigurationMockIncluded
|
225
|
+
respond_to?( :some_configuration ).should == true
|
226
|
+
some_configuration.should == :our_setting_value
|
227
|
+
self.some_configuration = :some_other_configuration
|
228
|
+
some_configuration.should == :some_other_configuration
|
229
|
+
instance_methods.include?( :some_configuration ).should == false
|
230
|
+
end
|
231
|
+
setting_class_including_instance = ClassExtending.new
|
232
|
+
setting_class_including_instance.respond_to?( :some_configuration ).should == false
|
233
|
+
end
|
234
|
+
|
235
|
+
class CascadingConfiguration::Setting::ClassConfigurationMockClass
|
236
|
+
include CascadingConfiguration::Setting::ClassConfigurationMockIncluded::SubmoduleIncluding
|
237
|
+
some_configuration.should == :another_configuration
|
238
|
+
self.some_configuration = :our_setting_value
|
239
|
+
some_configuration.should == :our_setting_value
|
240
|
+
end
|
241
|
+
class CascadingConfiguration::Setting::ClassConfigurationMockClassSub1 < CascadingConfiguration::Setting::ClassConfigurationMockClass
|
242
|
+
some_configuration.should == :our_setting_value
|
243
|
+
self.some_configuration = :our_other_setting_value
|
244
|
+
some_configuration.should == :our_other_setting_value
|
245
|
+
end
|
246
|
+
class CascadingConfiguration::Setting::ClassConfigurationMockClassSub2 < CascadingConfiguration::Setting::ClassConfigurationMockClassSub1
|
247
|
+
some_configuration.should == :our_other_setting_value
|
248
|
+
self.some_configuration = :a_third_setting_value
|
249
|
+
some_configuration.should == :a_third_setting_value
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
##############################
|
254
|
+
# attr_local_configuration #
|
255
|
+
##############################
|
256
|
+
|
257
|
+
it 'can define a local configuration setting, which will not cascade' do
|
258
|
+
|
259
|
+
# extending a module or class works like a finalizer for the cascading configuration
|
260
|
+
# if the configuration is re-opened at a later point (including or extending a lower ancestor)
|
261
|
+
# then the configuration will still cascade upward
|
262
|
+
# this permits ancestors in the heirarchy to skip out on configurations
|
263
|
+
# upward cascade can be frozen at any point using :freeze!, which will prevent further upward lookup
|
264
|
+
|
265
|
+
# possibilities:
|
266
|
+
# * module extended with setting
|
267
|
+
module CascadingConfiguration::Setting::LocalConfigurationMockExtended
|
268
|
+
extend CascadingConfiguration::Setting
|
269
|
+
# => singleton gets attr_configuration and configurations
|
270
|
+
respond_to?( :attr_local_configuration ).should == true
|
271
|
+
attr_local_configuration :some_configuration
|
272
|
+
respond_to?( :some_configuration ).should == true
|
273
|
+
self.some_configuration = :our_setting_value
|
274
|
+
some_configuration.should == :our_setting_value
|
275
|
+
instance_methods.include?( :some_configuration ).should == false
|
276
|
+
# => including modules and classes get nothing
|
277
|
+
module SubmoduleIncluding
|
278
|
+
include CascadingConfiguration::Setting::LocalConfigurationMockExtended
|
279
|
+
instance_methods.include?( :some_configuration ).should == false
|
280
|
+
respond_to?( :some_configuration ).should == false
|
281
|
+
end
|
282
|
+
# => extending modules and classes get nothing
|
283
|
+
module SubmoduleExtending
|
284
|
+
extend CascadingConfiguration::Setting::LocalConfigurationMockExtended
|
285
|
+
instance_methods.include?( :some_configuration ).should == false
|
286
|
+
respond_to?( :some_configuration ).should == false
|
287
|
+
end
|
288
|
+
# => instances of including and extending classes get nothing
|
289
|
+
class ClassIncluding
|
290
|
+
include CascadingConfiguration::Setting::LocalConfigurationMockExtended
|
291
|
+
instance_methods.include?( :some_configuration ).should == false
|
292
|
+
respond_to?( :some_configuration ).should == false
|
293
|
+
end
|
294
|
+
class ClassExtending
|
295
|
+
extend CascadingConfiguration::Setting::LocalConfigurationMockExtended
|
296
|
+
instance_methods.include?( :some_configuration ).should == false
|
297
|
+
respond_to?( :some_configuration ).should == false
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
# * module included with setting
|
302
|
+
module CascadingConfiguration::Setting::LocalConfigurationMockIncluded
|
303
|
+
include CascadingConfiguration::Setting
|
304
|
+
# => singleton gets attr_configuration and configurations
|
305
|
+
respond_to?( :attr_local_configuration ).should == true
|
306
|
+
attr_local_configuration :some_configuration
|
307
|
+
respond_to?( :some_configuration ).should == true
|
308
|
+
self.some_configuration = :our_setting_value
|
309
|
+
some_configuration.should == :our_setting_value
|
310
|
+
instance_methods.include?( :some_configuration ).should == false
|
311
|
+
# => including modules and classes get attr_configuration and configurations
|
312
|
+
module SubmoduleIncluding
|
313
|
+
include CascadingConfiguration::Setting::LocalConfigurationMockIncluded
|
314
|
+
instance_methods.include?( :some_configuration ).should == false
|
315
|
+
respond_to?( :some_configuration ).should == false
|
316
|
+
end
|
317
|
+
# => extending modules and classes get attr_configuration and configurations
|
318
|
+
module SubmoduleExtending
|
319
|
+
extend CascadingConfiguration::Setting::LocalConfigurationMockIncluded
|
320
|
+
# if we're extended then we want to use the eigenclass ancestor chain
|
321
|
+
# - the first ancestor will be the extending module
|
322
|
+
# - the rest of the ancestors will be the extending module's include chain
|
323
|
+
respond_to?( :some_configuration ).should == false
|
324
|
+
instance_methods.include?( :some_configuration ).should == false
|
325
|
+
end
|
326
|
+
# => instances of including classes get configurations
|
327
|
+
class ClassIncluding
|
328
|
+
include CascadingConfiguration::Setting::LocalConfigurationMockIncluded
|
329
|
+
instance_methods.include?( :some_configuration ).should == false
|
330
|
+
respond_to?( :some_configuration ).should == false
|
331
|
+
end
|
332
|
+
setting_class_including_instance = ClassIncluding.new
|
333
|
+
setting_class_including_instance.respond_to?( :some_configuration ).should == false
|
334
|
+
# => instances of extending classes get nothing
|
335
|
+
class ClassExtending
|
336
|
+
extend CascadingConfiguration::Setting::LocalConfigurationMockIncluded
|
337
|
+
respond_to?( :some_configuration ).should == false
|
338
|
+
instance_methods.include?( :some_configuration ).should == false
|
339
|
+
end
|
340
|
+
setting_class_including_instance = ClassExtending.new
|
341
|
+
setting_class_including_instance.respond_to?( :some_configuration ).should == false
|
342
|
+
end
|
343
|
+
|
344
|
+
class CascadingConfiguration::Setting::LocalConfigurationMockClass
|
345
|
+
include CascadingConfiguration::Setting::LocalConfigurationMockIncluded::SubmoduleIncluding
|
346
|
+
respond_to?( :some_configuration ).should == false
|
347
|
+
end
|
348
|
+
class CascadingConfiguration::Setting::LocalConfigurationMockClassSub1 < CascadingConfiguration::Setting::LocalConfigurationMockClass
|
349
|
+
respond_to?( :some_configuration ).should == false
|
350
|
+
end
|
351
|
+
class CascadingConfiguration::Setting::LocalConfigurationMockClassSub2 < CascadingConfiguration::Setting::LocalConfigurationMockClassSub1
|
352
|
+
respond_to?( :some_configuration ).should == false
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
130
356
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 1.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 1.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Asher
|
@@ -39,12 +39,12 @@ extensions: []
|
|
39
39
|
extra_rdoc_files: []
|
40
40
|
|
41
41
|
files:
|
42
|
-
- lib/cascading-configuration-setting/CascadingConfiguration/Setting/
|
42
|
+
- lib/cascading-configuration-setting/CascadingConfiguration/Setting/AccessorDefinitionMethods.rb
|
43
43
|
- lib/cascading-configuration-setting/CascadingConfiguration/Setting/Interface.rb
|
44
44
|
- lib/cascading-configuration-setting/CascadingConfiguration/Setting/ModuleInclusionExtensionSupport.rb
|
45
45
|
- lib/cascading-configuration-setting/CascadingConfiguration/Setting.rb
|
46
46
|
- lib/cascading-configuration-setting.rb
|
47
|
-
- spec/CascadingConfiguration/Setting/
|
47
|
+
- spec/CascadingConfiguration/Setting/AccessorDefinitionMethods_spec.rb
|
48
48
|
- spec/CascadingConfiguration/Setting_spec.rb
|
49
49
|
- README.md
|
50
50
|
- README.rdoc
|