cascading-configuration-array 1.4.1 → 1.5.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 (19) hide show
  1. data/lib/cascading-configuration-array/CascadingConfiguration/Array/Interface.rb +58 -21
  2. data/lib/cascading-configuration-array/CascadingConfiguration/Array.rb +6 -21
  3. data/lib/cascading-configuration-array/{CascadingConfiguration → _private_/CascadingConfiguration/Array/CompositingArray}/LocalConfigurationArray.rb +27 -1
  4. data/lib/cascading-configuration-array/_private_/CascadingConfiguration/Array/CompositingArray.rb +295 -0
  5. data/lib/cascading-configuration-array/_private_/CascadingConfiguration/Array/Interface/GettersSetters.rb +246 -0
  6. data/lib/cascading-configuration-array/_private_/CascadingConfiguration/Array/ModuleSupportMethods.rb +48 -0
  7. data/lib/cascading-configuration-array.rb +16 -23
  8. data/spec/CascadingConfiguration/Array_spec.rb +2 -3
  9. data/spec/{CascadingConfiguration → _private_/CascadingConfiguration/Array/CompositingArray}/LocalConfigurationArray_spec.rb +13 -13
  10. data/spec/_private_/CascadingConfiguration/Array/CompositingArray_spec.rb +569 -0
  11. metadata +10 -28
  12. data/lib/cascading-configuration-array/CascadingConfiguration/Array/AccessorDefinitionMethods.rb +0 -175
  13. data/lib/cascading-configuration-array/CascadingConfiguration/Array/Interface/Instance.rb +0 -22
  14. data/lib/cascading-configuration-array/CascadingConfiguration/CompositingArray/Instance.rb +0 -31
  15. data/lib/cascading-configuration-array/CascadingConfiguration/CompositingArray.rb +0 -215
  16. data/lib/cascading-configuration-array/CascadingConfiguration/_private_/CompositingArray.rb +0 -57
  17. data/lib/cascading-configuration-array/CascadingConfiguration/_private_/LocalConfigurationArray.rb +0 -26
  18. data/spec/CascadingConfiguration/Array/AccessorDefinitionMethods_spec.rb +0 -30
  19. data/spec/CascadingConfiguration/CompositingArray_spec.rb +0 -541
@@ -1,21 +1,26 @@
1
1
 
2
2
  module CascadingConfiguration::Array::Interface
3
3
 
4
- extend CascadingConfiguration::InternalModuleStub
5
-
4
+ # Support methods that define configuration settings array methods
5
+ include ::CascadingConfiguration::Array::Interface::GettersSetters
6
+
6
7
  ##############################
7
8
  # attr_configuration_array #
8
9
  ##############################
9
10
 
10
11
  # defines configuration in class or module
11
12
  # configuration cascades downward to instance including all classes or modules in-between
12
- def attr_configuration_array( *property_names )
13
- property_names.each do |this_property_name|
13
+ def attr_configuration_array( *configuration_names )
14
+
15
+ configuration_names.each do |this_configuration_name|
14
16
  # define configuration setter
15
- define_cascading_array_setter( this_property_name )
17
+ define_cascading_array_setter( this_configuration_name )
16
18
  # define configuration getter
17
- define_cascading_array_getter( this_property_name )
19
+ define_cascading_array_getter( this_configuration_name )
18
20
  end
21
+
22
+ return self
23
+
19
24
  end
20
25
 
21
26
  #####################################
@@ -24,13 +29,17 @@ module CascadingConfiguration::Array::Interface
24
29
 
25
30
  # defines configuration in class or module
26
31
  # configuration cascades downward to last class or module
27
- def attr_module_configuration_array( *property_names )
28
- property_names.each do |this_property_name|
32
+ def attr_module_configuration_array( *configuration_names )
33
+
34
+ configuration_names.each do |this_configuration_name|
29
35
  # define configuration setter
30
- define_class_configuration_array_setter( this_property_name )
36
+ define_class_configuration_array_setter( this_configuration_name )
31
37
  # define configuration getter
32
- define_class_configuration_array_getter( this_property_name )
38
+ define_class_configuration_array_getter( this_configuration_name )
33
39
  end
40
+
41
+ return self
42
+
34
43
  end
35
44
  alias_method :attr_class_configuration_array, :attr_module_configuration_array
36
45
 
@@ -40,15 +49,19 @@ module CascadingConfiguration::Array::Interface
40
49
 
41
50
  # defines configuration in present class or module context
42
51
  # configuration does not cascade
43
- def attr_local_configuration_array( *property_names )
44
- CascadingConfiguration::Variable.define_accessor_local_instance_support( self )
45
- property_names.each do |this_property_name|
52
+ def attr_local_configuration_array( *configuration_names )
53
+
54
+ CascadingConfiguration::Variable.initialize_local_instance_configuration_module( self )
55
+
56
+ configuration_names.each do |this_configuration_name|
46
57
  # define configuration setter
47
- define_local_configuration_array_setter( this_property_name )
58
+ define_local_configuration_array_setter( this_configuration_name )
48
59
  # define configuration getter
49
- define_local_configuration_array_getter( this_property_name )
60
+ define_local_configuration_array_getter( this_configuration_name )
50
61
  end
51
- CascadingConfiguration::Variable.cascade_local_instance( self )
62
+
63
+ return self
64
+
52
65
  end
53
66
 
54
67
  #####################################
@@ -57,14 +70,38 @@ module CascadingConfiguration::Array::Interface
57
70
 
58
71
  # defines configuration in present instance
59
72
  # configuration does not cascade
60
- def attr_object_configuration_array( *property_names )
61
- CascadingConfiguration::Variable.define_accessor_local_instance_support( self )
62
- property_names.each do |this_property_name|
73
+ def attr_object_configuration_array( *configuration_names )
74
+
75
+ CascadingConfiguration::Variable.initialize_local_instance_configuration_module( self )
76
+
77
+ configuration_names.each do |this_configuration_name|
78
+ # define configuration setter
79
+ define_object_configuration_array_setter( this_configuration_name )
80
+ # define configuration getter
81
+ define_object_configuration_array_getter( this_configuration_name )
82
+ end
83
+
84
+ return self
85
+
86
+ end
87
+
88
+ #######################################
89
+ # attr_instance_configuration_array #
90
+ #######################################
91
+
92
+ # defines configuration in present class or module context
93
+ # configuration does not cascade
94
+ def attr_instance_configuration_array( *configuration_names )
95
+
96
+ configuration_names.each do |this_configuration_name|
63
97
  # define configuration setter
64
- define_object_configuration_array_setter( this_property_name )
98
+ define_instance_configuration_array_setter( this_configuration_name )
65
99
  # define configuration getter
66
- define_object_configuration_array_getter( this_property_name )
100
+ define_instance_configuration_array_getter( this_configuration_name )
67
101
  end
102
+
103
+ return self
104
+
68
105
  end
69
106
 
70
107
  end
@@ -1,27 +1,12 @@
1
1
 
2
2
  module CascadingConfiguration::Array
3
3
 
4
- extend ModuleCluster
4
+ # Configuration modules for storage of settings arrays
5
+ include ::CascadingConfiguration::Variable
5
6
 
6
- extend CascadingConfiguration::InternalModuleStub
7
+ # Interface to declare configuration settings arrays
8
+ include ::CascadingConfiguration::Array::Interface
7
9
 
8
- include CascadingConfiguration::Variable
9
- include CascadingConfiguration::CompositingArray::Instance
10
- include CascadingConfiguration::Array::Interface
11
- include CascadingConfiguration::Array::AccessorDefinitionMethods
12
-
13
- prepend_module_include do |class_or_module|
14
- class_or_module.extend_also_extends( CascadingConfiguration::Variable::EigenclassConfigurationChain )
15
- end
16
-
17
- include_cascades_extends( CascadingConfiguration::Array::Interface::Instance )
18
-
19
- include_cascades_extends( CascadingConfiguration::Array )
20
-
21
- prepend_module_include do |class_or_module|
22
- class_or_module.include_or_extend_cascades_prepending_extends do
23
- accessor_module_support
24
- end
25
- end
26
-
10
+ extend ::CascadingConfiguration::Array::ModuleSupportMethods
11
+
27
12
  end
@@ -1,5 +1,9 @@
1
1
 
2
- class CascadingConfiguration::LocalConfigurationArray < Array
2
+ class CascadingConfiguration::Array::CompositingArray::LocalConfigurationArray < Array
3
+
4
+ # A LocalConfigurationArray is a single layer of a CompositingArray.
5
+ # The LocalConfigurationArray holds the layer's settings and exclude values.
6
+ # CompositingArray uses LocalConfigurationArray to cascade.
3
7
 
4
8
  attr_accessor :exclude_array
5
9
 
@@ -163,4 +167,26 @@ class CascadingConfiguration::LocalConfigurationArray < Array
163
167
 
164
168
  end
165
169
 
170
+ ###########################################################################################################
171
+ private ###############################################################################################
172
+ ###########################################################################################################
173
+
174
+ ##########################
175
+ # add_to_exclude_array #
176
+ ##########################
177
+
178
+ def add_to_exclude_array( *elements )
179
+ @exclude_array += elements
180
+ @exclude_array.sort!.uniq!
181
+ end
182
+
183
+ ###############################
184
+ # remove_from_exclude_array #
185
+ ###############################
186
+
187
+ def remove_from_exclude_array( *elements )
188
+ @exclude_array -= elements
189
+ @exclude_array.sort!.uniq!
190
+ end
191
+
166
192
  end
@@ -0,0 +1,295 @@
1
+
2
+ class CascadingConfiguration::Array::CompositingArray < Array
3
+
4
+ attr_accessor :local_cascading_array
5
+
6
+ ################
7
+ # initialize #
8
+ ################
9
+
10
+ def initialize( configuration_instance, configuration_name )
11
+
12
+ for_instance = false
13
+
14
+ @configuration_instance = configuration_instance
15
+
16
+ module_configuration_module = ::CascadingConfiguration::Variable.module_configuration_support_module( configuration_instance )
17
+ if ! module_configuration_module and ! configuration_instance.is_a?( Module )
18
+ module_configuration_module = ::CascadingConfiguration::Variable.module_configuration_support_module( configuration_instance.class )
19
+ for_instance = true
20
+ end
21
+
22
+ @configuration_name = configuration_name
23
+
24
+ # store self for sub composites
25
+ module_configuration_module.set_configuration_variable( configuration_name, self, for_instance )
26
+
27
+ # if first ancestor can have a composite array, register self with it in case it gets updated in the future
28
+ super_configuration_module = nil
29
+ if for_instance
30
+ super_configuration_module = module_configuration_module
31
+ else
32
+ super_configuration_module = module_configuration_module.super_configuration_module
33
+ end
34
+
35
+ if super_configuration_module and
36
+ @super_composite_array = super_configuration_module.get_configuration_variable( configuration_name ) and
37
+ @super_composite_array.respond_to?( :register_sub_composite_array )
38
+
39
+ @super_composite_array.register_sub_composite_array( self )
40
+
41
+ end
42
+
43
+ # instantiate local cascading array
44
+ @local_cascading_array = ::CascadingConfiguration::Array::CompositingArray::LocalConfigurationArray.new
45
+
46
+ # we may later have our own child composites that register with us
47
+ @sub_composite_arrays = ::Array.new
48
+
49
+ # initialize self status for parent and local
50
+ update_self_as_cascading_composite
51
+
52
+ end
53
+
54
+ ##################################
55
+ # register_sub_composite_array #
56
+ ##################################
57
+
58
+ def register_sub_composite_array( sub_composite_array )
59
+ @sub_composite_arrays.push( sub_composite_array )
60
+ return self
61
+ end
62
+
63
+ ####################################
64
+ # unregister_sub_composite_array #
65
+ ####################################
66
+
67
+ def unregister_sub_composite_array( sub_composite_array )
68
+ @sub_composite_arrays.delete( sub_composite_array )
69
+ return self
70
+ end
71
+
72
+ #########
73
+ # []= #
74
+ #########
75
+
76
+ def []=( index, element )
77
+ # we sort internally, so index is irrelevant
78
+ # no reason to differentiate from push
79
+ push( element )
80
+ end
81
+
82
+ ########
83
+ # << #
84
+ ########
85
+
86
+ def <<( *elements )
87
+ # no reason to differentiate from push
88
+ push( *elements )
89
+ end
90
+
91
+ #######
92
+ # + #
93
+ #######
94
+
95
+ def +( *arrays )
96
+ # no reason to differentiate from push
97
+ arrays.each do |this_array|
98
+ push( *this_array )
99
+ end
100
+ return self
101
+ end
102
+
103
+ ############
104
+ # concat #
105
+ ############
106
+
107
+ def concat( *arrays )
108
+ arrays.each do |this_array|
109
+ push( *this_array )
110
+ end
111
+ end
112
+
113
+ ##########
114
+ # push #
115
+ ##########
116
+
117
+ alias_method :super_push, :push
118
+ def push( *elements )
119
+
120
+ # we are a composite array
121
+ # that means we have to set the value for our class
122
+ @local_cascading_array.push( *elements )
123
+
124
+ update_adding_composite_elements( *elements )
125
+
126
+ return self
127
+
128
+ end
129
+
130
+ #######
131
+ # - #
132
+ #######
133
+
134
+ def -( *arrays )
135
+
136
+ arrays.each do |this_array|
137
+ delete( *this_array )
138
+ end
139
+
140
+ return self
141
+
142
+ end
143
+
144
+ ############
145
+ # delete #
146
+ ############
147
+
148
+ alias_method :super_delete, :delete
149
+ def delete( *elements )
150
+
151
+ @local_cascading_array.delete( *elements )
152
+
153
+ update_removing_composite_elements( *elements )
154
+
155
+ return self
156
+
157
+ end
158
+
159
+ #########
160
+ # pop #
161
+ #########
162
+
163
+ def pop
164
+
165
+ element = super
166
+
167
+ @local_cascading_array.delete( element )
168
+
169
+ update_removing_composite_elements( element )
170
+
171
+ return element
172
+
173
+ end
174
+
175
+ ###########
176
+ # shift #
177
+ ###########
178
+
179
+ def shift
180
+
181
+ element = super
182
+
183
+ @local_cascading_array.delete( element )
184
+
185
+ update_removing_composite_elements( element )
186
+
187
+ return element
188
+
189
+ end
190
+
191
+ ############
192
+ # slice! #
193
+ ############
194
+
195
+ def slice!( *args )
196
+
197
+ elements = super
198
+
199
+ @local_cascading_array.delete( *elements )
200
+
201
+ update_removing_composite_elements( *elements )
202
+
203
+ return elements
204
+
205
+ end
206
+
207
+ ###########
208
+ # clear #
209
+ ###########
210
+
211
+ alias_method :super_clear, :clear
212
+ def clear
213
+
214
+ # add all existing values to exclude array
215
+ @local_cascading_array.delete( *self )
216
+
217
+ update_removing_composite_elements( *self )
218
+
219
+ return self
220
+
221
+ end
222
+
223
+ #############
224
+ # freeze! #
225
+ #############
226
+
227
+ # freezes configuration and prevents ancestors from changing this configuration in the future
228
+ def freeze!
229
+
230
+ # move current configuration into local configuration
231
+ @local_cascading_array.clear
232
+ @local_cascading_array.exclude_array.clear
233
+ @local_cascading_array.push( *self )
234
+
235
+ # unregister with parent composite so we don't get future updates from it
236
+ @super_composite_array.unregister_sub_composite_array( self ) if @super_composite_array
237
+
238
+ return self
239
+
240
+ end
241
+
242
+ ###########################################################################################################
243
+ private ###############################################################################################
244
+ ###########################################################################################################
245
+
246
+ ########################################
247
+ # update_self_as_cascading_composite #
248
+ ########################################
249
+
250
+ def update_self_as_cascading_composite
251
+ # start fresh
252
+ super_clear
253
+ # add parent config
254
+ super_push( *@super_composite_array ) if @super_composite_array
255
+ # add additional local config
256
+ super_push( *@local_cascading_array )
257
+ # remove local exclude
258
+ super_delete( *@local_cascading_array.exclude_array ) unless @local_cascading_array.exclude_array.empty?
259
+ # notify children to update their composite status
260
+ update_sub_composite_arrays
261
+ return self
262
+ end
263
+
264
+ ######################################
265
+ # update_adding_composite_elements #
266
+ ######################################
267
+
268
+ def update_adding_composite_elements( *elements_to_cascade )
269
+ super_push( *elements_to_cascade )
270
+ sort!.uniq!
271
+ update_sub_composite_arrays
272
+ end
273
+
274
+ ########################################
275
+ # update_removing_composite_elements #
276
+ ########################################
277
+
278
+ def update_removing_composite_elements( *elements_to_exclude )
279
+ elements_to_exclude.each do |this_excluded_element|
280
+ super_delete( this_excluded_element )
281
+ end
282
+ update_sub_composite_arrays
283
+ end
284
+
285
+ ###################################
286
+ # update_sub_composite_arrays #
287
+ ###################################
288
+
289
+ def update_sub_composite_arrays
290
+ @sub_composite_arrays.each do |this_composite_array|
291
+ this_composite_array.instance_eval { update_self_as_cascading_composite }
292
+ end
293
+ end
294
+
295
+ end