cascading-configuration-hash 1.1.0 → 1.1.1
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.
- data/lib/cascading-configuration-hash/CascadingConfiguration/CompositingHash.rb +5 -2
- data/lib/cascading-configuration-hash/CascadingConfiguration/CompositingHash/_private_/Instance.rb +2 -1
- data/lib/cascading-configuration-hash/CascadingConfiguration/Hash.rb +3 -11
- data/lib/cascading-configuration-hash/CascadingConfiguration/Hash/Accessors.rb +0 -16
- data/lib/cascading-configuration-hash/CascadingConfiguration/Hash/ClassInstance.rb +2 -1
- data/lib/cascading-configuration-hash/CascadingConfiguration/Hash/ModuleInstance.rb +6 -7
- data/lib/cascading-configuration-hash/CascadingConfiguration/_private_/CompositingHash.rb +24 -5
- data/spec/CascadingConfiguration/ConfigurationSettingsHash_spec.rb +35 -16
- metadata +3 -3
@@ -9,7 +9,8 @@ class CascadingConfiguration::CompositingHash < Hash
|
|
9
9
|
|
10
10
|
def initialize( cascading_name, working_instance )
|
11
11
|
@cascading_name = cascading_name
|
12
|
-
|
12
|
+
@working_class = ( working_instance.is_a?( Module ) ? working_instance : working_instance.class )
|
13
|
+
@cascading_variable = @working_class::AccessorSupportModule.cascading_variable_name( @cascading_name )
|
13
14
|
@working_instance = working_instance
|
14
15
|
# if first ancestor can have a composite array, register self with it in case it gets updated in the future
|
15
16
|
if ( first_ancestor = @working_instance.first_ancestor ).respond_to?( :composite_hash_for_cascading_configuration )
|
@@ -79,11 +80,13 @@ class CascadingConfiguration::CompositingHash < Hash
|
|
79
80
|
# replace #
|
80
81
|
#############
|
81
82
|
|
83
|
+
alias_method :super_replace, :replace
|
82
84
|
def replace( other_hash )
|
83
85
|
# clear current values
|
84
86
|
clear
|
85
87
|
# merge replacement settings
|
86
88
|
merge!( other_hash )
|
89
|
+
update_self_as_cascading_composite
|
87
90
|
return self
|
88
91
|
end
|
89
92
|
|
@@ -106,7 +109,7 @@ class CascadingConfiguration::CompositingHash < Hash
|
|
106
109
|
alias_method :super_clear, :clear
|
107
110
|
def clear
|
108
111
|
# add all existing values to exclude array
|
109
|
-
|
112
|
+
keys.each do |this_key|
|
110
113
|
delete( this_key )
|
111
114
|
end
|
112
115
|
update_removing_composite_elements( *self.keys )
|
data/lib/cascading-configuration-hash/CascadingConfiguration/CompositingHash/_private_/Instance.rb
CHANGED
@@ -10,7 +10,8 @@ module CascadingConfiguration::CompositingHash::Instance
|
|
10
10
|
##################################
|
11
11
|
|
12
12
|
def composite_hash_variable_name( configuration_name )
|
13
|
-
|
13
|
+
klass = ( is_a?( Module ) ? self : self.class )
|
14
|
+
return ( klass::AccessorSupportModule.cascading_variable_name( configuration_name ).to_s + '__' + 'composite_hash' ).to_sym
|
14
15
|
end
|
15
16
|
|
16
17
|
end
|
@@ -12,22 +12,14 @@ module CascadingConfiguration::Hash
|
|
12
12
|
class_or_module.instance_eval do
|
13
13
|
include CascadingConfiguration::Variable
|
14
14
|
extend module_self
|
15
|
-
extend
|
16
|
-
extend
|
15
|
+
extend module_self::Accessors
|
16
|
+
extend module_self::ClassInstance
|
17
17
|
include CascadingConfiguration::CompositingHash::Instance
|
18
18
|
# module support
|
19
|
-
unless
|
19
|
+
unless is_a?( Class )
|
20
20
|
extend CascadingConfiguration::Hash::ModuleInstance
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
#########################
|
26
|
-
# ancestors_to_Object #
|
27
|
-
#########################
|
28
|
-
|
29
|
-
def ancestors_to_Object
|
30
|
-
return ancestors_to_class_or_module_interpolating_module_branches( Object, CascadingConfiguration::Hash::ModuleInstance )
|
31
|
-
end
|
32
|
-
|
33
25
|
end
|
@@ -3,22 +3,6 @@ module CascadingConfiguration::Hash::Accessors
|
|
3
3
|
|
4
4
|
extend CascadingConfiguration::InternalModuleStub
|
5
5
|
|
6
|
-
###################
|
7
|
-
# self.extended #
|
8
|
-
###################
|
9
|
-
|
10
|
-
def self.extended( class_or_module )
|
11
|
-
class_or_module.instance_eval do
|
12
|
-
# accessor support in module to permit method overriding with super
|
13
|
-
unless const_defined?( :AccessorSupportModule )
|
14
|
-
accessor_support_module = Module.new { extend CascadingConfiguration::InternalModuleStub }
|
15
|
-
const_set( :AccessorSupportModule, accessor_support_module )
|
16
|
-
include class_or_module::AccessorSupportModule
|
17
|
-
extend class_or_module::AccessorSupportModule
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
6
|
######################################
|
23
7
|
# define_configuration_hash_setter #
|
24
8
|
######################################
|
@@ -7,9 +7,10 @@ module CascadingConfiguration::Hash::ClassInstance
|
|
7
7
|
# attr_configuration_hash #
|
8
8
|
#############################
|
9
9
|
|
10
|
-
def attr_configuration_hash( *property_names )
|
10
|
+
def attr_configuration_hash( *property_names, & compositing_block )
|
11
11
|
|
12
12
|
property_names.each do |this_property_name|
|
13
|
+
self::AccessorSupportModule.set_compositing_proc( this_property_name, compositing_block ) if block_given?
|
13
14
|
# define configuration setter
|
14
15
|
define_configuration_hash_setter( this_property_name )
|
15
16
|
# define configuration getter
|
@@ -2,22 +2,21 @@
|
|
2
2
|
module CascadingConfiguration::Hash::ModuleInstance
|
3
3
|
|
4
4
|
extend CascadingConfiguration::InternalModuleStub
|
5
|
-
|
5
|
+
|
6
6
|
##############
|
7
7
|
# included #
|
8
8
|
##############
|
9
9
|
|
10
10
|
def included( class_or_module )
|
11
11
|
super if method_defined?( :super )
|
12
|
+
# CascadingConfiguration::Hash
|
12
13
|
module_self = self
|
13
14
|
class_or_module.instance_eval do
|
14
|
-
|
15
|
-
# when we extend a module (which has happened if we got here)
|
16
|
-
# then we need to make sure when the module we are extending is included
|
17
|
-
# * CascadingConfiguration is included
|
18
|
-
# * the module we extended is used to extend the class/module that included
|
15
|
+
# whichever module included CascadingConfiguration::Hash
|
19
16
|
extend module_self
|
17
|
+
# cascade CascadingConfiguration::Hash
|
18
|
+
include CascadingConfiguration::Hash
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
23
|
-
end
|
22
|
+
end
|
@@ -12,10 +12,7 @@ class CascadingConfiguration::CompositingHash < Hash
|
|
12
12
|
def update_self_as_cascading_composite
|
13
13
|
# start fresh
|
14
14
|
super_clear
|
15
|
-
|
16
|
-
super_merge!( @parent_composite_hash ) if @parent_composite_hash
|
17
|
-
# add additional local config
|
18
|
-
super_merge!( @local_cascading_hash )
|
15
|
+
update_composite_self_for_parent_hash( @parent_composite_hash, @local_cascading_hash )
|
19
16
|
# remove local exclude
|
20
17
|
unless @local_cascading_hash.exclude_array.empty?
|
21
18
|
@local_cascading_hash.exclude_array.each do |this_excluded_element|
|
@@ -32,10 +29,32 @@ class CascadingConfiguration::CompositingHash < Hash
|
|
32
29
|
######################################
|
33
30
|
|
34
31
|
def update_adding_composite_elements( elements_to_cascade )
|
35
|
-
|
32
|
+
update_composite_self_for_parent_hash( self, elements_to_cascade )
|
36
33
|
update_child_composite_arrays
|
34
|
+
return self
|
37
35
|
end
|
38
36
|
|
37
|
+
###########################################
|
38
|
+
# update_composite_self_for_parent_hash #
|
39
|
+
###########################################
|
40
|
+
|
41
|
+
def update_composite_self_for_parent_hash( parent_hash, second_hash )
|
42
|
+
if compositing_proc = @working_class::AccessorSupportModule.get_compositing_proc( @cascading_name )
|
43
|
+
# if we have a compositing proc defined, use its result to replace
|
44
|
+
parent_hash_copy = Hash.new
|
45
|
+
parent_hash_copy.merge!( parent_hash ) if parent_hash
|
46
|
+
second_hash_copy = Hash.new
|
47
|
+
second_hash_copy.merge!( second_hash ) if second_hash
|
48
|
+
composite_result = compositing_proc.call( parent_hash_copy, second_hash_copy )
|
49
|
+
super_replace( composite_result )
|
50
|
+
else
|
51
|
+
# otherwise we simply merge
|
52
|
+
super_merge!( parent_hash ) if parent_hash
|
53
|
+
super_merge!( second_hash ) if second_hash
|
54
|
+
end
|
55
|
+
return self
|
56
|
+
end
|
57
|
+
|
39
58
|
########################################
|
40
59
|
# update_removing_composite_elements #
|
41
60
|
########################################
|
@@ -8,7 +8,6 @@ describe CascadingConfiguration::Hash do
|
|
8
8
|
#############################
|
9
9
|
|
10
10
|
it 'can define a configuration hash, which is the primary interface' do
|
11
|
-
|
12
11
|
module CascadingConfiguration::Hash::MockModule
|
13
12
|
include CascadingConfiguration::Hash
|
14
13
|
attr_configuration_hash :configuration_setting
|
@@ -55,7 +54,7 @@ describe CascadingConfiguration::Hash do
|
|
55
54
|
end
|
56
55
|
|
57
56
|
CascadingConfiguration::Hash::MockClassSub1.new.configuration_setting.should == { :a_configuration => :some_value,
|
58
|
-
|
57
|
+
:another_configuration => :some_value }
|
59
58
|
|
60
59
|
object_instance_two = CascadingConfiguration::Hash::MockClassSub1.new
|
61
60
|
object_instance_two.configuration_setting.should == { :a_configuration => :some_value,
|
@@ -68,13 +67,13 @@ describe CascadingConfiguration::Hash do
|
|
68
67
|
# change ancestor setting
|
69
68
|
CascadingConfiguration::Hash::MockClass.configuration_setting[ :a_yet_unused_configuration ] = :some_value
|
70
69
|
CascadingConfiguration::Hash::MockClass.configuration_setting.should == { :a_configuration => :some_value,
|
71
|
-
|
70
|
+
:a_yet_unused_configuration => :some_value }
|
72
71
|
object_instance_one.configuration_setting.should == { :a_configuration => :some_value,
|
73
72
|
:a_yet_unused_configuration => :some_value,
|
74
73
|
:some_other_configuration => :some_value }
|
75
74
|
CascadingConfiguration::Hash::MockClassSub1.configuration_setting.should == { :a_configuration => :some_value,
|
76
|
-
|
77
|
-
|
75
|
+
:a_yet_unused_configuration => :some_value,
|
76
|
+
:another_configuration => :some_value }
|
78
77
|
object_instance_two.configuration_setting.should == { :a_configuration => :some_value,
|
79
78
|
:a_yet_unused_configuration => :some_value,
|
80
79
|
:another_configuration => :some_value,
|
@@ -87,24 +86,44 @@ describe CascadingConfiguration::Hash do
|
|
87
86
|
:some_other_configuration => :some_value }
|
88
87
|
CascadingConfiguration::Hash::MockClassSub1.configuration_setting.freeze!
|
89
88
|
CascadingConfiguration::Hash::MockClassSub1.configuration_setting.should == { :a_configuration => :some_value,
|
90
|
-
|
91
|
-
|
89
|
+
:a_yet_unused_configuration => :some_value,
|
90
|
+
:another_configuration => :some_value }
|
92
91
|
CascadingConfiguration::Hash::MockClass.configuration_setting[ :non_cascading_configuration ] = :some_value
|
93
92
|
CascadingConfiguration::Hash::MockClass.configuration_setting.should == { :a_configuration => :some_value,
|
94
|
-
|
95
|
-
|
93
|
+
:a_yet_unused_configuration => :some_value,
|
94
|
+
:non_cascading_configuration => :some_value }
|
96
95
|
object_instance_one.configuration_setting.should == { :a_configuration => :some_value,
|
97
96
|
:a_yet_unused_configuration => :some_value,
|
98
97
|
:some_other_configuration => :some_value }
|
99
98
|
CascadingConfiguration::Hash::MockClassSub1.configuration_setting.should == { :a_configuration => :some_value,
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
99
|
+
:a_yet_unused_configuration => :some_value,
|
100
|
+
:another_configuration => :some_value }
|
101
|
+
object_instance_two.configuration_setting.should == { :a_configuration => :some_value,
|
102
|
+
:a_yet_unused_configuration => :some_value,
|
103
|
+
:another_configuration => :some_value,
|
104
|
+
:some_other_configuration => :some_value }
|
107
105
|
|
106
|
+
module CascadingConfiguration::Hash::MockModule
|
107
|
+
attr_configuration_hash :some_hash do |parent_hash, composite_hash|
|
108
|
+
parent_hash.each do |this_key, this_data|
|
109
|
+
if existing_value = composite_hash[ this_key ]
|
110
|
+
composite_hash[ this_key ] = this_data - existing_value
|
111
|
+
else
|
112
|
+
composite_hash[ this_key ] = this_data
|
113
|
+
end
|
114
|
+
end
|
115
|
+
composite_hash
|
116
|
+
end
|
117
|
+
self.some_hash = { :one => 1, :two => 2 }
|
118
|
+
self.some_hash.should == { :one => 1, :two => 2 }
|
119
|
+
end
|
120
|
+
|
121
|
+
module CascadingConfiguration::Hash::MockModule2
|
122
|
+
self.some_hash.should == { :one => 1, :two => 2 }
|
123
|
+
self.some_hash.replace( { :one => 1, :two => 2 } )
|
124
|
+
self.some_hash.should == { :one => 0, :two => 0 }
|
125
|
+
end
|
126
|
+
|
108
127
|
end
|
109
128
|
|
110
129
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 1.1.
|
8
|
+
- 1
|
9
|
+
version: 1.1.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Asher
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-07-
|
17
|
+
date: 2011-07-15 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|