cascading_configuration 1.0.0

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.
Files changed (43) hide show
  1. data/CHANGELOG.md +40 -0
  2. data/README.md +211 -0
  3. data/lib/cascading_configuration/array/sorted/unique.rb +110 -0
  4. data/lib/cascading_configuration/array/sorted.rb +106 -0
  5. data/lib/cascading_configuration/array/unique.rb +106 -0
  6. data/lib/cascading_configuration/array.rb +103 -0
  7. data/lib/cascading_configuration/core/enable_instance_support.rb +22 -0
  8. data/lib/cascading_configuration/core/enable_module_support.rb +24 -0
  9. data/lib/cascading_configuration/core/encapsulation.rb +343 -0
  10. data/lib/cascading_configuration/core/instance_controller/extension_module.rb +38 -0
  11. data/lib/cascading_configuration/core/instance_controller/support_module/instance_support_module.rb +21 -0
  12. data/lib/cascading_configuration/core/instance_controller/support_module/singleton_support_module.rb +21 -0
  13. data/lib/cascading_configuration/core/instance_controller/support_module.rb +253 -0
  14. data/lib/cascading_configuration/core/instance_controller.rb +840 -0
  15. data/lib/cascading_configuration/core/module/block_configurations/cascading_variables.rb +129 -0
  16. data/lib/cascading_configuration/core/module/block_configurations.rb +15 -0
  17. data/lib/cascading_configuration/core/module/extended_configurations/compositing_objects.rb +173 -0
  18. data/lib/cascading_configuration/core/module/extended_configurations.rb +65 -0
  19. data/lib/cascading_configuration/core/module/inheriting_values.rb +64 -0
  20. data/lib/cascading_configuration/core/module.rb +284 -0
  21. data/lib/cascading_configuration/core.rb +23 -0
  22. data/lib/cascading_configuration/hash.rb +103 -0
  23. data/lib/cascading_configuration/setting.rb +87 -0
  24. data/lib/cascading_configuration.rb +47 -0
  25. data/lib/namespaces.rb +9 -0
  26. data/lib/requires.rb +46 -0
  27. data/spec/cascading_configuration/array/sorted/unique_spec.rb +742 -0
  28. data/spec/cascading_configuration/array/sorted_spec.rb +741 -0
  29. data/spec/cascading_configuration/array/unique_spec.rb +746 -0
  30. data/spec/cascading_configuration/array_spec.rb +768 -0
  31. data/spec/cascading_configuration/core/encapsulation_spec.rb +208 -0
  32. data/spec/cascading_configuration/core/instance_controller/extension_module_spec.rb +26 -0
  33. data/spec/cascading_configuration/core/instance_controller/support_module_spec.rb +269 -0
  34. data/spec/cascading_configuration/core/instance_controller_spec.rb +273 -0
  35. data/spec/cascading_configuration/core/module/block_configurations/cascading_variables_spec.rb +17 -0
  36. data/spec/cascading_configuration/core/module/extended_configurations/compositing_objects_spec.rb +127 -0
  37. data/spec/cascading_configuration/core/module/extended_configurations_spec.rb +37 -0
  38. data/spec/cascading_configuration/core/module/inheriting_values_spec.rb +87 -0
  39. data/spec/cascading_configuration/core/module_spec.rb +491 -0
  40. data/spec/cascading_configuration/hash_spec.rb +826 -0
  41. data/spec/cascading_configuration/setting_spec.rb +687 -0
  42. data/spec/cascading_configuration_spec.rb +58 -0
  43. metadata +185 -0
@@ -0,0 +1,746 @@
1
+
2
+ require_relative '../../../lib/cascading_configuration.rb'
3
+
4
+ describe CascadingConfiguration::Array::Unique do
5
+
6
+ #######################
7
+ # attr_unique_array #
8
+ #######################
9
+
10
+ it 'can define a configuration array, which is the primary interface' do
11
+
12
+ # possibilities:
13
+ # * module extended with setting
14
+ # => singleton gets attr_setting and configurations
15
+ # => including modules and classes get nothing
16
+ # => extending modules and classes get nothing
17
+ # => instances of including and extending classes get nothing
18
+ # * module included with setting
19
+ # => singleton gets attr_setting and configurations
20
+ # => including modules and classes get attr_setting and configurations
21
+ # => instances of including classes get configurations
22
+ # => extending modules and classes get attr_setting and configurations
23
+ # => instances of extending classes get nothing
24
+ module ::CascadingConfiguration::Array::Unique::ConfigurationMockModuleExtended
25
+ extend CascadingConfiguration::Array::Unique
26
+ # => singleton gets attr_setting and configurations
27
+ respond_to?( :attr_unique_array ).should == true
28
+ respond_to?( :attr_configuration_unique_array ).should == true
29
+ attr_unique_array :configuration_setting
30
+ respond_to?( :configuration_setting ).should == true
31
+ configuration_setting.should == []
32
+ configuration_setting.push( :a_configuration )
33
+ configuration_setting.should == [ :a_configuration ]
34
+ method_defined?( :configuration_setting ).should == false
35
+ instance_variables.empty?.should == true
36
+ # => including modules and classes get nothing
37
+ module SubmoduleIncluding
38
+ include CascadingConfiguration::Array::Unique::ConfigurationMockModuleExtended
39
+ method_defined?( :configuration_setting ).should == false
40
+ respond_to?( :configuration_setting ).should == false
41
+ instance_variables.empty?.should == true
42
+ end
43
+ # => extending modules and classes get nothing
44
+ module SubmoduleExtending
45
+ extend CascadingConfiguration::Array::Unique::ConfigurationMockModuleExtended
46
+ method_defined?( :configuration_setting ).should == false
47
+ respond_to?( :configuration_setting ).should == false
48
+ instance_variables.empty?.should == true
49
+ end
50
+ # => instances of including and extending classes get nothing
51
+ class ClassIncluding
52
+ include CascadingConfiguration::Array::Unique::ConfigurationMockModuleExtended
53
+ method_defined?( :configuration_setting ).should == false
54
+ respond_to?( :configuration_setting ).should == false
55
+ instance_variables.empty?.should == true
56
+ end
57
+ class ClassExtending
58
+ extend CascadingConfiguration::Array::Unique::ConfigurationMockModuleExtended
59
+ method_defined?( :configuration_setting ).should == false
60
+ respond_to?( :configuration_setting ).should == false
61
+ instance_variables.empty?.should == true
62
+ end
63
+ end
64
+
65
+ # * module included with setting
66
+ module ::CascadingConfiguration::Array::Unique::ConfigurationMockModuleIncluded
67
+ include CascadingConfiguration::Array::Unique
68
+ # => singleton gets attr_setting and configurations
69
+ respond_to?( :attr_unique_array ).should == true
70
+ attr_unique_array :configuration_setting
71
+ respond_to?( :configuration_setting ).should == true
72
+ configuration_setting.should == []
73
+ configuration_setting.push( :a_configuration )
74
+ configuration_setting.should == [ :a_configuration ]
75
+ method_defined?( :configuration_setting ).should == true
76
+ instance_variables.empty?.should == true
77
+ # => including modules and classes get attr_setting and configurations
78
+ module SubmoduleIncluding
79
+ include CascadingConfiguration::Array::Unique::ConfigurationMockModuleIncluded
80
+ method_defined?( :configuration_setting ).should == true
81
+ respond_to?( :configuration_setting ).should == true
82
+ configuration_setting.should == [ :a_configuration ]
83
+ configuration_setting.push( :another_configuration )
84
+ configuration_setting.push( :another_configuration )
85
+ configuration_setting.should == [ :a_configuration, :another_configuration ]
86
+ instance_variables.empty?.should == true
87
+ end
88
+ # => extending modules and classes get attr_setting and configurations
89
+ module SubmoduleExtending
90
+ extend CascadingConfiguration::Array::Unique::ConfigurationMockModuleIncluded
91
+ # if we're extended then we want to use the eigenclass ancestor chain
92
+ # - the first ancestor will be the extending module
93
+ # - the rest of the ancestors will be the extending module's include chain
94
+ respond_to?( :configuration_setting ).should == true
95
+ configuration_setting.should == [ :a_configuration ]
96
+ configuration_setting.push( :some_other_configuration )
97
+ configuration_setting.push( :some_other_configuration )
98
+ configuration_setting.push( :some_other_configuration )
99
+ configuration_setting.should == [ :a_configuration, :some_other_configuration ]
100
+ method_defined?( :configuration_setting ).should == false
101
+ instance_variables.empty?.should == true
102
+ end
103
+ # => instances of including classes get configurations
104
+ class ClassIncluding
105
+ include CascadingConfiguration::Array::Unique::ConfigurationMockModuleIncluded
106
+ method_defined?( :configuration_setting ).should == true
107
+ respond_to?( :configuration_setting ).should == true
108
+ configuration_setting.should == [ :a_configuration ]
109
+ configuration_setting.push( :some_other_configuration )
110
+ configuration_setting.should == [ :a_configuration, :some_other_configuration ]
111
+ instance_variables.empty?.should == true
112
+ end
113
+ setting_class_including_instance = ClassIncluding.new
114
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == true
115
+ setting_class_including_instance.configuration_setting.should == [ :a_configuration, :some_other_configuration ]
116
+ setting_class_including_instance.configuration_setting.delete( :some_other_configuration )
117
+ setting_class_including_instance.configuration_setting = [ :our_setting_value ]
118
+ setting_class_including_instance.configuration_setting.should == [ :our_setting_value ]
119
+ setting_class_including_instance.instance_variables.empty?.should == true
120
+ # => instances of extending classes get nothing
121
+ class ClassExtending
122
+ extend CascadingConfiguration::Array::Unique::ConfigurationMockModuleIncluded
123
+ respond_to?( :configuration_setting ).should == true
124
+ configuration_setting.should == [ :a_configuration ]
125
+ configuration_setting.push( :some_other_configuration )
126
+ configuration_setting.should == [ :a_configuration, :some_other_configuration ]
127
+ instance_variables.empty?.should == true
128
+ end
129
+ setting_class_including_instance = ClassExtending.new
130
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == false
131
+ setting_class_including_instance.instance_variables.empty?.should == true
132
+ end
133
+
134
+ class CascadingConfiguration::Array::Unique::ConfigurationMockClass
135
+ include CascadingConfiguration::Array::Unique::ConfigurationMockModuleIncluded::SubmoduleIncluding
136
+ configuration_setting.should == [ :a_configuration, :another_configuration ]
137
+ configuration_setting.push( :some_other_configuration )
138
+ configuration_setting.push( :some_other_configuration )
139
+ configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration ]
140
+ instance_variables.empty?.should == true
141
+ end
142
+ object_instance_one = CascadingConfiguration::Array::Unique::ConfigurationMockClass.new
143
+ object_instance_one.configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration ]
144
+ object_instance_one.configuration_setting.delete( :a_configuration )
145
+ object_instance_one.configuration_setting.should == [ :another_configuration, :some_other_configuration ]
146
+ object_instance_one.instance_variables.empty?.should == true
147
+ class CascadingConfiguration::Array::Unique::ConfigurationMockClassSub1 < CascadingConfiguration::Array::Unique::ConfigurationMockClass
148
+ configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration ]
149
+ configuration_setting.delete( :a_configuration )
150
+ configuration_setting.should == [ :another_configuration, :some_other_configuration ]
151
+ instance_variables.empty?.should == true
152
+ end
153
+ object_instance_two = CascadingConfiguration::Array::Unique::ConfigurationMockClassSub1.new
154
+ object_instance_two.configuration_setting.should == [ :another_configuration, :some_other_configuration ]
155
+ object_instance_two.configuration_setting.delete( :another_configuration )
156
+ object_instance_two.configuration_setting.should == [ :some_other_configuration ]
157
+ object_instance_two.instance_variables.empty?.should == true
158
+ class CascadingConfiguration::Array::Unique::ConfigurationMockClassSub2 < CascadingConfiguration::Array::Unique::ConfigurationMockClassSub1
159
+ configuration_setting.should == [ :another_configuration, :some_other_configuration ]
160
+ #configuration_setting.push( :yet_another_configuration )
161
+ #configuration_setting.should == [ :another_configuration, :some_other_configuration, :yet_another_configuration ]
162
+ instance_variables.empty?.should == true
163
+ end
164
+
165
+ # change ancestor setting
166
+ CascadingConfiguration::Array::Unique::ConfigurationMockClass.configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration ]
167
+ CascadingConfiguration::Array::Unique::ConfigurationMockClass.configuration_setting.push( :a_yet_unused_configuration )
168
+ CascadingConfiguration::Array::Unique::ConfigurationMockClass.configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
169
+ object_instance_one.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
170
+ CascadingConfiguration::Array::Unique::ConfigurationMockClassSub1.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
171
+ object_instance_two.configuration_setting.should == [ :some_other_configuration, :a_yet_unused_configuration ]
172
+
173
+ # freeze ancestor setting
174
+ object_instance_one.configuration_setting.freeze!
175
+ object_instance_one.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
176
+ CascadingConfiguration::Array::Unique::ConfigurationMockClassSub1.configuration_setting.freeze!
177
+ CascadingConfiguration::Array::Unique::ConfigurationMockClassSub1.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
178
+ CascadingConfiguration::Array::Unique::ConfigurationMockClass.configuration_setting.push( :non_cascading_configuration )
179
+ CascadingConfiguration::Array::Unique::ConfigurationMockClass.configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration, :a_yet_unused_configuration, :non_cascading_configuration ]
180
+ object_instance_one.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
181
+ CascadingConfiguration::Array::Unique::ConfigurationMockClassSub1.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
182
+ object_instance_two.configuration_setting.should == [ :some_other_configuration, :a_yet_unused_configuration ]
183
+
184
+ end
185
+
186
+ ##############################
187
+ # attr_module_unique_array #
188
+ # attr_class_unique_array #
189
+ ##############################
190
+
191
+ it 'can define a class configuration array, which will not cascade to instances' do
192
+
193
+ # possibilities:
194
+ # * module extended with setting
195
+ # => singleton gets attr_setting and configurations
196
+ # => including modules and classes get nothing
197
+ # => extending modules and classes get nothing
198
+ # => instances of including and extending classes get nothing
199
+ # * module included with setting
200
+ # => singleton gets attr_setting and configurations
201
+ # => including modules and classes get attr_setting and configurations
202
+ # => instances of including classes get configurations
203
+ # => extending modules and classes get attr_setting and configurations
204
+ # => instances of extending classes get nothing
205
+ module ::CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleExtended
206
+ extend CascadingConfiguration::Array::Unique
207
+ # => singleton gets attr_setting and configurations
208
+ respond_to?( :attr_module_configuration_unique_array ).should == true
209
+ respond_to?( :attr_module_unique_array ).should == true
210
+ method( :attr_module_unique_array ).should == method( :attr_class_unique_array )
211
+ attr_module_unique_array :configuration_setting
212
+ respond_to?( :configuration_setting ).should == true
213
+ configuration_setting.should == []
214
+ configuration_setting.push( :a_configuration )
215
+ configuration_setting.should == [ :a_configuration ]
216
+ method_defined?( :configuration_setting ).should == false
217
+ instance_variables.empty?.should == true
218
+ # => including modules and classes get nothing
219
+ module SubmoduleIncluding
220
+ include CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleExtended
221
+ method_defined?( :configuration_setting ).should == false
222
+ respond_to?( :configuration_setting ).should == false
223
+ instance_variables.empty?.should == true
224
+ end
225
+ # => extending modules and classes get nothing
226
+ module SubmoduleExtending
227
+ extend CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleExtended
228
+ method_defined?( :configuration_setting ).should == false
229
+ respond_to?( :configuration_setting ).should == false
230
+ instance_variables.empty?.should == true
231
+ end
232
+ # => instances of including and extending classes get nothing
233
+ class ClassIncluding
234
+ include CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleExtended
235
+ method_defined?( :configuration_setting ).should == false
236
+ respond_to?( :configuration_setting ).should == false
237
+ instance_variables.empty?.should == true
238
+ end
239
+ class ClassExtending
240
+ extend CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleExtended
241
+ method_defined?( :configuration_setting ).should == false
242
+ respond_to?( :configuration_setting ).should == false
243
+ instance_variables.empty?.should == true
244
+ end
245
+ end
246
+
247
+ # * module included with setting
248
+ module ::CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleIncluded
249
+ include CascadingConfiguration::Array::Unique
250
+ # => singleton gets attr_setting and configurations
251
+ respond_to?( :attr_module_unique_array ).should == true
252
+ attr_module_unique_array :configuration_setting
253
+ respond_to?( :configuration_setting ).should == true
254
+ configuration_setting.should == []
255
+ configuration_setting.push( :a_configuration )
256
+ configuration_setting.should == [ :a_configuration ]
257
+ method_defined?( :configuration_setting ).should == false
258
+ instance_variables.empty?.should == true
259
+ # => including modules and classes get attr_setting and configurations
260
+ module SubmoduleIncluding
261
+ include CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleIncluded
262
+ method_defined?( :configuration_setting ).should == false
263
+ respond_to?( :configuration_setting ).should == true
264
+ configuration_setting.should == [ :a_configuration ]
265
+ configuration_setting.push( :another_configuration )
266
+ configuration_setting.should == [ :a_configuration, :another_configuration ]
267
+ method_defined?( :configuration_setting ).should == false
268
+ instance_variables.empty?.should == true
269
+ end
270
+ # => extending modules and classes get attr_setting and configurations
271
+ module SubmoduleExtending
272
+ extend CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleIncluded
273
+ # if we're extended then we want to use the eigenclass ancestor chain
274
+ # - the first ancestor will be the extending module
275
+ # - the rest of the ancestors will be the extending module's include chain
276
+ respond_to?( :configuration_setting ).should == false
277
+ method_defined?( :configuration_setting ).should == false
278
+ instance_variables.empty?.should == true
279
+ end
280
+ # => instances of including classes get configurations
281
+ class ClassIncluding
282
+ include CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleIncluded
283
+ method_defined?( :configuration_setting ).should == false
284
+ respond_to?( :configuration_setting ).should == true
285
+ configuration_setting.should == [ :a_configuration ]
286
+ configuration_setting.push( :some_other_configuration )
287
+ configuration_setting.should == [ :a_configuration, :some_other_configuration ]
288
+ instance_variables.empty?.should == true
289
+ end
290
+ setting_class_including_instance = ClassIncluding.new
291
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == false
292
+ setting_class_including_instance.instance_variables.empty?.should == true
293
+ # => instances of extending classes get nothing
294
+ class ClassExtending
295
+ extend CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleIncluded
296
+ method_defined?( :configuration_setting ).should == false
297
+ respond_to?( :configuration_setting ).should == false
298
+ instance_variables.empty?.should == true
299
+ end
300
+ setting_class_including_instance = ClassExtending.new
301
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == false
302
+ setting_class_including_instance.instance_variables.empty?.should == true
303
+ end
304
+
305
+ class CascadingConfiguration::Array::Unique::ClassConfigurationMockClass
306
+ include CascadingConfiguration::Array::Unique::ClassConfigurationMockModuleIncluded::SubmoduleIncluding
307
+ method_defined?( :configuration_setting ).should == false
308
+ configuration_setting.should == [ :a_configuration, :another_configuration ]
309
+ configuration_setting.push( :some_other_configuration )
310
+ configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration ]
311
+ instance_variables.empty?.should == true
312
+ end
313
+ object_instance_one = CascadingConfiguration::Array::Unique::ClassConfigurationMockClass.new
314
+ object_instance_one.respond_to?( :configuration_setting ).should == false
315
+ object_instance_one.instance_variables.empty?.should == true
316
+ class CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub1 < CascadingConfiguration::Array::Unique::ClassConfigurationMockClass
317
+ method_defined?( :configuration_setting ).should == false
318
+ configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration ]
319
+ configuration_setting.delete( :a_configuration )
320
+ configuration_setting.should == [ :another_configuration, :some_other_configuration ]
321
+ instance_variables.empty?.should == true
322
+ end
323
+ object_instance_two = CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub1.new
324
+ object_instance_two.respond_to?( :configuration_setting ).should == false
325
+ object_instance_two.instance_variables.empty?.should == true
326
+ class CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub2 < CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub1
327
+ method_defined?( :configuration_setting ).should == false
328
+ configuration_setting.should == [ :another_configuration, :some_other_configuration ]
329
+ configuration_setting.push( :yet_another_configuration )
330
+ configuration_setting.should == [ :another_configuration, :some_other_configuration, :yet_another_configuration ]
331
+ instance_variables.empty?.should == true
332
+ end
333
+
334
+ # change ancestor setting
335
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClass.configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration ]
336
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClass.configuration_setting.push( :a_yet_unused_configuration )
337
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClass.configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
338
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub1.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
339
+
340
+ # freeze ancestor setting
341
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub1.configuration_setting.freeze!
342
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub1.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
343
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClass.configuration_setting.push( :non_cascading_configuration )
344
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClass.configuration_setting.should == [ :a_configuration, :another_configuration, :some_other_configuration, :a_yet_unused_configuration, :non_cascading_configuration ]
345
+ CascadingConfiguration::Array::Unique::ClassConfigurationMockClassSub1.configuration_setting.should == [ :another_configuration, :some_other_configuration, :a_yet_unused_configuration ]
346
+
347
+ end
348
+
349
+ #############################
350
+ # attr_local_unique_array #
351
+ #############################
352
+
353
+ it 'can define a local configuration array, which will not cascade' do
354
+
355
+ # possibilities:
356
+ # * module extended with setting
357
+ # => singleton gets attr_setting and configurations
358
+ # => including modules and classes get nothing
359
+ # => extending modules and classes get nothing
360
+ # => instances of including and extending classes get nothing
361
+ # * module included with setting
362
+ # => singleton gets attr_setting and configurations
363
+ # => including modules and classes get attr_setting and configurations
364
+ # => instances of including classes get configurations
365
+ # => extending modules and classes get attr_setting and configurations
366
+ # => instances of extending classes get nothing
367
+ module ::CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleExtended
368
+ extend CascadingConfiguration::Array::Unique
369
+ # => singleton gets attr_setting and configurations
370
+ respond_to?( :attr_local_configuration_unique_array ).should == true
371
+ respond_to?( :attr_local_unique_array ).should == true
372
+ attr_local_unique_array :configuration_setting
373
+ respond_to?( :configuration_setting ).should == true
374
+ configuration_setting.should == []
375
+ configuration_setting.push( :a_configuration )
376
+ configuration_setting.should == [ :a_configuration ]
377
+ method_defined?( :configuration_setting ).should == false
378
+ instance_variables.empty?.should == true
379
+ # => including modules and classes get nothing
380
+ module SubmoduleIncluding
381
+ include CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleExtended
382
+ method_defined?( :configuration_setting ).should == false
383
+ respond_to?( :configuration_setting ).should == false
384
+ instance_variables.empty?.should == true
385
+ end
386
+ # => extending modules and classes get nothing
387
+ module SubmoduleExtending
388
+ extend CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleExtended
389
+ method_defined?( :configuration_setting ).should == false
390
+ respond_to?( :configuration_setting ).should == false
391
+ instance_variables.empty?.should == true
392
+ end
393
+ # => instances of including and extending classes get nothing
394
+ class ClassIncluding
395
+ include CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleExtended
396
+ method_defined?( :configuration_setting ).should == false
397
+ respond_to?( :configuration_setting ).should == false
398
+ instance_variables.empty?.should == true
399
+ end
400
+ class ClassExtending
401
+ extend CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleExtended
402
+ method_defined?( :configuration_setting ).should == false
403
+ respond_to?( :configuration_setting ).should == false
404
+ instance_variables.empty?.should == true
405
+ end
406
+ end
407
+
408
+ # * module included with setting
409
+ module ::CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleIncluded
410
+ include CascadingConfiguration::Array::Unique
411
+ # => singleton gets attr_setting and configurations
412
+ respond_to?( :attr_local_unique_array ).should == true
413
+ attr_local_unique_array :configuration_setting
414
+ respond_to?( :configuration_setting ).should == true
415
+ configuration_setting.should == []
416
+ configuration_setting.push( :a_configuration )
417
+ configuration_setting.should == [ :a_configuration ]
418
+ method_defined?( :configuration_setting ).should == true
419
+ instance_variables.empty?.should == true
420
+ # => including modules and classes get attr_setting and configurations
421
+ module SubmoduleIncluding
422
+ include CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleIncluded
423
+ method_defined?( :configuration_setting ).should == true
424
+ respond_to?( :configuration_setting ).should == false
425
+ instance_variables.empty?.should == true
426
+ end
427
+ # => extending modules and classes get attr_setting and configurations
428
+ module SubmoduleExtending
429
+ extend CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleIncluded
430
+ # if we're extended then we want to use the eigenclass ancestor chain
431
+ # - the first ancestor will be the extending module
432
+ # - the rest of the ancestors will be the extending module's include chain
433
+ respond_to?( :configuration_setting ).should == true
434
+ method_defined?( :configuration_setting ).should == false
435
+ instance_variables.empty?.should == true
436
+ end
437
+ # => instances of including classes get configurations
438
+ class ClassIncluding
439
+ include CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleIncluded
440
+ method_defined?( :configuration_setting ).should == true
441
+ respond_to?( :configuration_setting ).should == false
442
+ instance_variables.empty?.should == true
443
+ end
444
+ setting_class_including_instance = ClassIncluding.new
445
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == true
446
+ setting_class_including_instance.instance_variables.empty?.should == true
447
+ # => instances of extending classes get nothing
448
+ class ClassExtending
449
+ extend CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleIncluded
450
+ method_defined?( :configuration_setting ).should == false
451
+ respond_to?( :configuration_setting ).should == true
452
+ instance_variables.empty?.should == true
453
+ end
454
+ setting_class_including_instance = ClassExtending.new
455
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == false
456
+ setting_class_including_instance.instance_variables.empty?.should == true
457
+ end
458
+
459
+ class CascadingConfiguration::Array::Unique::LocalConfigurationMockClass
460
+ include CascadingConfiguration::Array::Unique::LocalConfigurationMockModuleIncluded::SubmoduleIncluding
461
+ method_defined?( :configuration_setting ).should == true
462
+ respond_to?( :configuration_setting ).should == false
463
+ instance_variables.empty?.should == true
464
+ end
465
+ object_instance_one = CascadingConfiguration::Array::Unique::LocalConfigurationMockClass.new
466
+ object_instance_one.respond_to?( :configuration_setting ).should == true
467
+ object_instance_one.instance_variables.empty?.should == true
468
+ class CascadingConfiguration::Array::Unique::LocalConfigurationMockClassSub1 < CascadingConfiguration::Array::Unique::LocalConfigurationMockClass
469
+ method_defined?( :configuration_setting ).should == true
470
+ respond_to?( :configuration_setting ).should == false
471
+ instance_variables.empty?.should == true
472
+ end
473
+ object_instance_two = CascadingConfiguration::Array::Unique::LocalConfigurationMockClassSub1.new
474
+ object_instance_two.respond_to?( :configuration_setting ).should == true
475
+ object_instance_two.instance_variables.empty?.should == true
476
+ class CascadingConfiguration::Array::Unique::LocalConfigurationMockClassSub2 < CascadingConfiguration::Array::Unique::LocalConfigurationMockClassSub1
477
+ method_defined?( :configuration_setting ).should == true
478
+ respond_to?( :configuration_setting ).should == false
479
+ instance_variables.empty?.should == true
480
+ end
481
+
482
+ end
483
+
484
+ ################################
485
+ # attr_instance_unique_array #
486
+ ################################
487
+
488
+ it 'can define an instance configuration array, which will not cascade' do
489
+
490
+ # possibilities:
491
+ # * module extended with setting
492
+ # => singleton gets attr_setting and configurations
493
+ # => including modules and classes get nothing
494
+ # => extending modules and classes get nothing
495
+ # => instances of including and extending classes get nothing
496
+ # * module included with setting
497
+ # => singleton gets attr_setting and configurations
498
+ # => including modules and classes get attr_setting and configurations
499
+ # => instances of including classes get configurations
500
+ # => extending modules and classes get attr_setting and configurations
501
+ # => instances of extending classes get nothing
502
+ module ::CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleExtended
503
+ extend CascadingConfiguration::Array::Unique
504
+ # => singleton gets attr_setting and configurations
505
+ instance_variables.empty?.should == true
506
+ # => including modules and classes get nothing
507
+ module SubmoduleIncluding
508
+ include CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleExtended
509
+ method_defined?( :configuration_setting ).should == false
510
+ respond_to?( :configuration_setting ).should == false
511
+ instance_variables.empty?.should == true
512
+ end
513
+ # => extending modules and classes get nothing
514
+ module SubmoduleExtending
515
+ extend CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleExtended
516
+ method_defined?( :configuration_setting ).should == false
517
+ respond_to?( :configuration_setting ).should == false
518
+ instance_variables.empty?.should == true
519
+ end
520
+ # => instances of including and extending classes get nothing
521
+ class ClassIncluding
522
+ include CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleExtended
523
+ method_defined?( :configuration_setting ).should == false
524
+ respond_to?( :configuration_setting ).should == false
525
+ instance_variables.empty?.should == true
526
+ end
527
+ class ClassExtending
528
+ extend CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleExtended
529
+ method_defined?( :configuration_setting ).should == false
530
+ respond_to?( :configuration_setting ).should == false
531
+ instance_variables.empty?.should == true
532
+ end
533
+ end
534
+
535
+ # * module included with setting
536
+ module ::CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleIncluded
537
+ include CascadingConfiguration::Array::Unique
538
+ # => singleton gets attr_setting and configurations
539
+ respond_to?( :attr_instance_unique_array ).should == true
540
+ attr_instance_unique_array :configuration_setting
541
+ respond_to?( :configuration_setting ).should == false
542
+ method_defined?( :configuration_setting ).should == true
543
+ instance_variables.empty?.should == true
544
+ # => including modules and classes get attr_setting and configurations
545
+ module SubmoduleIncluding
546
+ include CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleIncluded
547
+ method_defined?( :configuration_setting ).should == true
548
+ respond_to?( :configuration_setting ).should == false
549
+ method_defined?( :configuration_setting ).should == true
550
+ instance_variables.empty?.should == true
551
+ end
552
+ # => extending modules and classes get attr_setting and configurations
553
+ module SubmoduleExtending
554
+ extend CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleIncluded
555
+ # if we're extended then we want to use the eigenclass ancestor chain
556
+ # - the first ancestor will be the extending module
557
+ # - the rest of the ancestors will be the extending module's include chain
558
+ respond_to?( :configuration_setting ).should == true
559
+ method_defined?( :configuration_setting ).should == false
560
+ instance_variables.empty?.should == true
561
+ end
562
+ # => instances of including classes get configurations
563
+ class ClassIncluding
564
+ include CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleIncluded
565
+ method_defined?( :configuration_setting ).should == true
566
+ respond_to?( :configuration_setting ).should == false
567
+ instance_variables.empty?.should == true
568
+ end
569
+ setting_class_including_instance = ClassIncluding.new
570
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == true
571
+ setting_class_including_instance.instance_variables.empty?.should == true
572
+ # => instances of extending classes get nothing
573
+ class ClassExtending
574
+ extend CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleIncluded
575
+ method_defined?( :configuration_setting ).should == false
576
+ respond_to?( :configuration_setting ).should == true
577
+ instance_variables.empty?.should == true
578
+ end
579
+ setting_class_including_instance = ClassExtending.new
580
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == false
581
+ setting_class_including_instance.instance_variables.empty?.should == true
582
+ end
583
+
584
+ class CascadingConfiguration::Array::Unique::InstanceConfigurationMockClass
585
+ include CascadingConfiguration::Array::Unique::InstanceConfigurationMockModuleIncluded::SubmoduleIncluding
586
+ method_defined?( :configuration_setting ).should == true
587
+ respond_to?( :configuration_setting ).should == false
588
+ instance_variables.empty?.should == true
589
+ end
590
+ object_instance_one = CascadingConfiguration::Array::Unique::InstanceConfigurationMockClass.new
591
+ object_instance_one.respond_to?( :configuration_setting ).should == true
592
+ object_instance_one.instance_variables.empty?.should == true
593
+ class CascadingConfiguration::Array::Unique::InstanceConfigurationMockClassSub1 < CascadingConfiguration::Array::Unique::InstanceConfigurationMockClass
594
+ method_defined?( :configuration_setting ).should == true
595
+ respond_to?( :configuration_setting ).should == false
596
+ instance_variables.empty?.should == true
597
+ end
598
+ object_instance_two = CascadingConfiguration::Array::Unique::InstanceConfigurationMockClassSub1.new
599
+ object_instance_two.respond_to?( :configuration_setting ).should == true
600
+ object_instance_two.instance_variables.empty?.should == true
601
+ class CascadingConfiguration::Array::Unique::InstanceConfigurationMockClassSub2 < CascadingConfiguration::Array::Unique::InstanceConfigurationMockClassSub1
602
+ method_defined?( :configuration_setting ).should == true
603
+ respond_to?( :configuration_setting ).should == false
604
+ instance_variables.empty?.should == true
605
+ end
606
+
607
+ end
608
+
609
+
610
+ ##############################
611
+ # attr_object_unique_array #
612
+ ##############################
613
+
614
+ it 'can define an object configuration array, which will not cascade' do
615
+
616
+ # possibilities:
617
+ # * module extended with setting
618
+ # => singleton gets attr_setting and configurations
619
+ # => including modules and classes get nothing
620
+ # => extending modules and classes get nothing
621
+ # => instances of including and extending classes get nothing
622
+ # * module included with setting
623
+ # => singleton gets attr_setting and configurations
624
+ # => including modules and classes get attr_setting and configurations
625
+ # => instances of including classes get configurations
626
+ # => extending modules and classes get attr_setting and configurations
627
+ # => instances of extending classes get nothing
628
+ module ::CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleExtended
629
+ extend CascadingConfiguration::Array::Unique
630
+ # => singleton gets attr_setting and configurations
631
+ respond_to?( :attr_object_configuration_unique_array ).should == true
632
+ respond_to?( :attr_object_unique_array ).should == true
633
+ attr_object_unique_array :configuration_setting
634
+ respond_to?( :configuration_setting ).should == true
635
+ configuration_setting.should == []
636
+ configuration_setting.push( :a_configuration )
637
+ configuration_setting.should == [ :a_configuration ]
638
+ method_defined?( :configuration_setting ).should == false
639
+ instance_variables.empty?.should == true
640
+ # => including modules and classes get nothing
641
+ module SubmoduleIncluding
642
+ include CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleExtended
643
+ method_defined?( :configuration_setting ).should == false
644
+ respond_to?( :configuration_setting ).should == false
645
+ instance_variables.empty?.should == true
646
+ end
647
+ # => extending modules and classes get nothing
648
+ module SubmoduleExtending
649
+ extend CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleExtended
650
+ method_defined?( :configuration_setting ).should == false
651
+ respond_to?( :configuration_setting ).should == false
652
+ instance_variables.empty?.should == true
653
+ end
654
+ # => instances of including and extending classes get nothing
655
+ class ClassIncluding
656
+ include CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleExtended
657
+ method_defined?( :configuration_setting ).should == false
658
+ respond_to?( :configuration_setting ).should == false
659
+ instance_variables.empty?.should == true
660
+ end
661
+ class ClassExtending
662
+ extend CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleExtended
663
+ method_defined?( :configuration_setting ).should == false
664
+ respond_to?( :configuration_setting ).should == false
665
+ instance_variables.empty?.should == true
666
+ end
667
+ end
668
+
669
+ # * module included with setting
670
+ module ::CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleIncluded
671
+ include CascadingConfiguration::Array::Unique
672
+ # => singleton gets attr_setting and configurations
673
+ respond_to?( :attr_object_unique_array ).should == true
674
+ attr_object_unique_array :configuration_setting
675
+ respond_to?( :configuration_setting ).should == true
676
+ configuration_setting.should == []
677
+ configuration_setting.push( :a_configuration )
678
+ configuration_setting.should == [ :a_configuration ]
679
+ method_defined?( :configuration_setting ).should == false
680
+ instance_variables.empty?.should == true
681
+ # => including modules and classes get attr_setting and configurations
682
+ module SubmoduleIncluding
683
+ include CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleIncluded
684
+ method_defined?( :configuration_setting ).should == false
685
+ respond_to?( :configuration_setting ).should == false
686
+ method_defined?( :configuration_setting ).should == false
687
+ instance_variables.empty?.should == true
688
+ end
689
+ # => extending modules and classes get attr_setting and configurations
690
+ module SubmoduleExtending
691
+ extend CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleIncluded
692
+ # if we're extended then we want to use the eigenclass ancestor chain
693
+ # - the first ancestor will be the extending module
694
+ # - the rest of the ancestors will be the extending module's include chain
695
+ respond_to?( :configuration_setting ).should == false
696
+ method_defined?( :configuration_setting ).should == false
697
+ instance_variables.empty?.should == true
698
+ end
699
+ # => instances of including classes get configurations
700
+ class ClassIncluding
701
+ include CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleIncluded
702
+ method_defined?( :configuration_setting ).should == false
703
+ respond_to?( :configuration_setting ).should == false
704
+ instance_variables.empty?.should == true
705
+ end
706
+ setting_class_including_instance = ClassIncluding.new
707
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == false
708
+ setting_class_including_instance.instance_variables.empty?.should == true
709
+ # => instances of extending classes get nothing
710
+ class ClassExtending
711
+ extend CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleIncluded
712
+ method_defined?( :configuration_setting ).should == false
713
+ respond_to?( :configuration_setting ).should == false
714
+ instance_variables.empty?.should == true
715
+ end
716
+ setting_class_including_instance = ClassExtending.new
717
+ setting_class_including_instance.respond_to?( :configuration_setting ).should == false
718
+ setting_class_including_instance.instance_variables.empty?.should == true
719
+ end
720
+
721
+ class CascadingConfiguration::Array::Unique::ObjectConfigurationMockClass
722
+ include CascadingConfiguration::Array::Unique::ObjectConfigurationMockModuleIncluded::SubmoduleIncluding
723
+ method_defined?( :configuration_setting ).should == false
724
+ respond_to?( :configuration_setting ).should == false
725
+ instance_variables.empty?.should == true
726
+ end
727
+ object_instance_one = CascadingConfiguration::Array::Unique::ObjectConfigurationMockClass.new
728
+ object_instance_one.respond_to?( :configuration_setting ).should == false
729
+ object_instance_one.instance_variables.empty?.should == true
730
+ class CascadingConfiguration::Array::Unique::ObjectConfigurationMockClassSub1 < CascadingConfiguration::Array::Unique::ObjectConfigurationMockClass
731
+ method_defined?( :configuration_setting ).should == false
732
+ respond_to?( :configuration_setting ).should == false
733
+ instance_variables.empty?.should == true
734
+ end
735
+ object_instance_two = CascadingConfiguration::Array::Unique::ObjectConfigurationMockClassSub1.new
736
+ object_instance_two.respond_to?( :configuration_setting ).should == false
737
+ object_instance_two.instance_variables.empty?.should == true
738
+ class CascadingConfiguration::Array::Unique::ObjectConfigurationMockClassSub2 < CascadingConfiguration::Array::Unique::ObjectConfigurationMockClassSub1
739
+ method_defined?( :configuration_setting ).should == false
740
+ respond_to?( :configuration_setting ).should == false
741
+ instance_variables.empty?.should == true
742
+ end
743
+
744
+ end
745
+
746
+ end