configure 0.2.0 → 0.3.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.
- data/README.rdoc +74 -45
- data/lib/configure.rb +14 -4
- data/lib/configure/checker.rb +29 -0
- data/lib/configure/injector.rb +13 -56
- data/lib/configure/schema.rb +24 -2
- data/lib/configure/value.rb +61 -0
- data/spec/acceptance/configure_with_schema_spec.rb +27 -8
- data/spec/acceptance/configure_without_schema_spec.rb +10 -0
- data/spec/acceptance/schema_spec.rb +53 -0
- data/spec/lib/configure/checker_spec.rb +41 -0
- data/spec/lib/configure/injector_spec.rb +34 -4
- data/spec/lib/configure/schema_spec.rb +1 -1
- data/spec/lib/configure/value_spec.rb +151 -0
- data/spec/lib/configure_spec.rb +20 -1
- metadata +10 -2
data/README.rdoc
CHANGED
@@ -9,10 +9,10 @@ receives a block and returns well-structured configuration values.
|
|
9
9
|
The most simple way <tt>configure</tt> can be used is to pass a block to the <tt>Configure.process</tt> method and
|
10
10
|
receive back a hash with the configuration values.
|
11
11
|
|
12
|
-
laser = Configure.process
|
12
|
+
laser = Configure.process {
|
13
13
|
label "red laser"
|
14
14
|
wave_length 700
|
15
|
-
|
15
|
+
}
|
16
16
|
|
17
17
|
laser == {
|
18
18
|
:label => "red laser",
|
@@ -23,17 +23,17 @@ receive back a hash with the configuration values.
|
|
23
23
|
|
24
24
|
It is also possible to pass blocks to configuration keys and combine multiple values to an array.
|
25
25
|
|
26
|
-
laser = Configure.process
|
26
|
+
laser = Configure.process {
|
27
27
|
label "red and violet pulse laser"
|
28
|
-
pulse
|
28
|
+
pulse {
|
29
29
|
wave_length 700
|
30
30
|
duration 20
|
31
|
-
|
32
|
-
pulse
|
31
|
+
}
|
32
|
+
pulse {
|
33
33
|
wave_length 400
|
34
34
|
duration 20
|
35
|
-
|
36
|
-
|
35
|
+
}
|
36
|
+
}
|
37
37
|
|
38
38
|
laser == {
|
39
39
|
:label => "red and violet pulse laser",
|
@@ -46,13 +46,13 @@ It is also possible to pass blocks to configuration keys and combine multiple va
|
|
46
46
|
If arguments and a block is passed to a configuration key, the arguments are stored at the <tt>:arguments</tt> key
|
47
47
|
inside the nested configuration.
|
48
48
|
|
49
|
-
laser = Configure.process
|
49
|
+
laser = Configure.process {
|
50
50
|
label "red pulse laser"
|
51
|
-
pulse "test"
|
51
|
+
pulse "test" {
|
52
52
|
wave_length 700
|
53
53
|
duration 20
|
54
|
-
|
55
|
-
|
54
|
+
}
|
55
|
+
}
|
56
56
|
|
57
57
|
laser = {
|
58
58
|
:label => "red pulse laser",
|
@@ -67,21 +67,22 @@ inside the nested configuration.
|
|
67
67
|
== Schema
|
68
68
|
|
69
69
|
In order receive a more structured configuration, a schema can be passed to the <tt>Configure.process</tt> method. This
|
70
|
-
schema is a simple hash, that can be created - off course - using the configure syntax ;-)
|
70
|
+
schema is a simple hash, that can be created - off course - using the configure syntax ;-) (Guess how the
|
71
|
+
schema-structure is defined internally ;-) )
|
71
72
|
|
72
73
|
=== Defaults
|
73
74
|
|
74
|
-
schema = Configure::Schema.build
|
75
|
-
defaults
|
75
|
+
schema = Configure::Schema.build {
|
76
|
+
defaults {
|
76
77
|
wave_length 700
|
77
78
|
duration 20
|
78
|
-
|
79
|
-
|
79
|
+
}
|
80
|
+
}
|
80
81
|
|
81
|
-
laser = Configure.process
|
82
|
+
laser = Configure.process(schema) {
|
82
83
|
label "violet pulse laser"
|
83
84
|
wave_length 400
|
84
|
-
|
85
|
+
}
|
85
86
|
|
86
87
|
laser = {
|
87
88
|
:label => "violet pulse laser",
|
@@ -93,33 +94,33 @@ schema is a simple hash, that can be created - off course - using the configure
|
|
93
94
|
|
94
95
|
Nested schema have to go to the <tt>nested</tt> section.
|
95
96
|
|
96
|
-
schema = Configure::Schema.build
|
97
|
-
nested
|
98
|
-
pulse
|
99
|
-
defaults
|
97
|
+
schema = Configure::Schema.build {
|
98
|
+
nested {
|
99
|
+
pulse {
|
100
|
+
defaults {
|
100
101
|
wave_length 700
|
101
102
|
duration 20
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
106
107
|
|
107
108
|
If a nested schema provides the key <tt>argument_keys</tt>, the arguments that have been passed along with the nested
|
108
109
|
configuration, are stored to these keys. The rest will be assigned to the <tt>:arguments</tt> key as before.
|
109
110
|
|
110
|
-
schema = Configure::Schema.build
|
111
|
-
nested
|
112
|
-
pulse
|
111
|
+
schema = Configure::Schema.build {
|
112
|
+
nested {
|
113
|
+
pulse {
|
113
114
|
argument_keys :wave_length, :duration
|
114
|
-
|
115
|
-
|
116
|
-
|
115
|
+
}
|
116
|
+
}
|
117
|
+
}
|
117
118
|
|
118
|
-
laser = Configure.process
|
119
|
-
pulse
|
119
|
+
laser = Configure.process(schema) {
|
120
|
+
pulse(700, 20, :extra) {
|
120
121
|
label "red pulse"
|
121
|
-
|
122
|
-
|
122
|
+
}
|
123
|
+
}
|
123
124
|
|
124
125
|
laser == {
|
125
126
|
:pulse => {
|
@@ -130,6 +131,8 @@ configuration, are stored to these keys. The rest will be assigned to the <tt>:a
|
|
130
131
|
}
|
131
132
|
} # => true
|
132
133
|
|
134
|
+
The <tt>:nested_default</tt> attribute can be used to define a default schema for all nested blocks.
|
135
|
+
|
133
136
|
=== Configuration class
|
134
137
|
|
135
138
|
Sometimes, a hash may not be the best data structure to store the configuration. If a more strict structure is needed,
|
@@ -145,26 +148,52 @@ is raised.
|
|
145
148
|
|
146
149
|
end
|
147
150
|
|
148
|
-
schema = Configure::Schema.build
|
151
|
+
schema = Configure::Schema.build {
|
149
152
|
configuration_class Laser
|
150
|
-
defaults
|
153
|
+
defaults {
|
151
154
|
duration 20
|
152
|
-
|
153
|
-
|
155
|
+
}
|
156
|
+
}
|
154
157
|
|
155
|
-
laser = Configure.process
|
158
|
+
laser = Configure.process(schema) {
|
156
159
|
label "red laser"
|
157
160
|
wave_length 700
|
158
|
-
|
161
|
+
}
|
159
162
|
|
160
163
|
laser.is_a? Laser # => true
|
161
164
|
laser.label == "red laser" # => true
|
162
165
|
laser.wave_length == 700 # => true
|
163
166
|
laser.duration == 20 # => true
|
164
167
|
|
165
|
-
Configure.process
|
168
|
+
Configure.process(schema) {
|
166
169
|
invalid_key "value"
|
167
|
-
|
170
|
+
} # => raises Configure::InvalidKeyError
|
171
|
+
|
172
|
+
=== The Only list
|
173
|
+
|
174
|
+
If the <tt>:only</tt> attribute is defined in a schema, only the values of the given keys are allowed to be set.
|
175
|
+
|
176
|
+
schema = Configure::Schema.build {
|
177
|
+
only :duration
|
178
|
+
}
|
179
|
+
|
180
|
+
laser = Configure.process(schema) {
|
181
|
+
wave_length 700
|
182
|
+
} # => raises Configure::InvalidKeyError
|
183
|
+
|
184
|
+
=== The Not-Nil list
|
185
|
+
|
186
|
+
If the <tt>:not_nil</tt> attribute is defined in a schema, an error will be raised if one of the values of the given
|
187
|
+
keys remains <tt>nil</tt>.
|
188
|
+
|
189
|
+
schema = Configure::Schema.build {
|
190
|
+
only :wave_length, :duration
|
191
|
+
not_nil :duration
|
192
|
+
}
|
193
|
+
|
194
|
+
laser = Configure.process(schema) {
|
195
|
+
wave_length 700
|
196
|
+
} # => raises Configure::NilValueError
|
168
197
|
|
169
198
|
== Development
|
170
199
|
|
data/lib/configure.rb
CHANGED
@@ -1,19 +1,29 @@
|
|
1
1
|
|
2
2
|
module Configure
|
3
3
|
|
4
|
+
autoload :Checker, File.join(File.dirname(__FILE__), "configure", "checker")
|
4
5
|
autoload :Injector, File.join(File.dirname(__FILE__), "configure", "injector")
|
5
6
|
autoload :Sandbox, File.join(File.dirname(__FILE__), "configure", "sandbox")
|
6
7
|
autoload :Schema, File.join(File.dirname(__FILE__), "configure", "schema")
|
8
|
+
autoload :Value, File.join(File.dirname(__FILE__), "configure", "value")
|
7
9
|
|
8
|
-
|
10
|
+
# This error is thrown, if a key can't be set or get.
|
11
|
+
class InvalidKeyError < StandardError; end
|
12
|
+
|
13
|
+
# This error is thrown, if a value is nil that shouldn't be nil.
|
14
|
+
class NilValueError < StandardError; end
|
15
|
+
|
16
|
+
def self.process(schema = nil, &block)
|
17
|
+
schema ||= Schema.build { }
|
9
18
|
process_configuration schema, &block
|
10
19
|
end
|
11
20
|
|
12
21
|
def self.process_configuration(schema = { }, &block)
|
13
22
|
injector = Injector.new schema
|
14
|
-
|
15
|
-
|
16
|
-
|
23
|
+
Sandbox.new(injector).instance_eval &block
|
24
|
+
configuration = injector.configuration
|
25
|
+
Checker.new(schema, configuration).check!
|
26
|
+
configuration
|
17
27
|
end
|
18
28
|
|
19
29
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
# Checks the value against nil.
|
3
|
+
class Configure::Checker
|
4
|
+
|
5
|
+
attr_accessor :schema
|
6
|
+
attr_accessor :configuration
|
7
|
+
|
8
|
+
def initialize(schema, configuration)
|
9
|
+
@schema, @configuration = schema, configuration
|
10
|
+
end
|
11
|
+
|
12
|
+
def check!
|
13
|
+
check_not_nils!
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def check_not_nils!
|
19
|
+
[ @schema[:not_nil] ].flatten.compact.each do |key|
|
20
|
+
check_not_nil! key
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def check_not_nil!(key)
|
25
|
+
value = Configure::Value.new @schema, @configuration, key
|
26
|
+
raise Configure::NilValueError, "the value of the key #{key} can't be nil!" if value.get.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/lib/configure/injector.rb
CHANGED
@@ -2,9 +2,6 @@
|
|
2
2
|
# Creates a configuration from the passed class and provides methods to inject values.
|
3
3
|
class Configure::Injector
|
4
4
|
|
5
|
-
# The error will be raised if the configuration value can't be set or get.
|
6
|
-
class Error < StandardError; end
|
7
|
-
|
8
5
|
attr_reader :schema
|
9
6
|
|
10
7
|
def initialize(schema)
|
@@ -13,7 +10,7 @@ class Configure::Injector
|
|
13
10
|
end
|
14
11
|
|
15
12
|
def configuration_class
|
16
|
-
@schema[:configuration_class]
|
13
|
+
@schema[:configuration_class]
|
17
14
|
end
|
18
15
|
|
19
16
|
def defaults
|
@@ -21,15 +18,15 @@ class Configure::Injector
|
|
21
18
|
end
|
22
19
|
|
23
20
|
def put_block(key, arguments, &block)
|
24
|
-
nested_schema = (
|
21
|
+
nested_schema = (@schema[:nested] || { })[key] || @schema[:nested_default] || Configure::Schema.build { }
|
25
22
|
nested_configuration = Configure.process_configuration nested_schema, &block
|
26
23
|
Arguments.new(nested_schema, nested_configuration, arguments).put
|
27
|
-
value = Value.new @configuration, key
|
24
|
+
value = Configure::Value.new @schema, @configuration, key
|
28
25
|
value.put_or_combine nested_configuration
|
29
26
|
end
|
30
27
|
|
31
28
|
def put_arguments(key, arguments)
|
32
|
-
value = Value.new @configuration, key
|
29
|
+
value = Configure::Value.new @schema, @configuration, key
|
33
30
|
value.put_single_or_multiple arguments
|
34
31
|
end
|
35
32
|
|
@@ -42,8 +39,8 @@ class Configure::Injector
|
|
42
39
|
|
43
40
|
def apply_defaults
|
44
41
|
self.defaults.each do |key, default_value|
|
45
|
-
value = Value.new @configuration, key
|
46
|
-
value.
|
42
|
+
value = Configure::Value.new @schema, @configuration, key
|
43
|
+
value.put_unless_existing default_value
|
47
44
|
end
|
48
45
|
end
|
49
46
|
|
@@ -57,68 +54,28 @@ class Configure::Injector
|
|
57
54
|
def put
|
58
55
|
put_to_specified_keys
|
59
56
|
put_to_argument_key
|
57
|
+
check_values!
|
60
58
|
end
|
61
59
|
|
60
|
+
private
|
61
|
+
|
62
62
|
def put_to_specified_keys
|
63
63
|
return if @arguments.empty?
|
64
64
|
argument_keys = [ @schema[:argument_keys] ].flatten.compact
|
65
65
|
argument_keys.each do |argument_key|
|
66
|
-
arguments_value = Value.new @configuration, argument_key
|
66
|
+
arguments_value = Configure::Value.new @schema, @configuration, argument_key
|
67
67
|
arguments_value.put @arguments.shift
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
def put_to_argument_key
|
72
72
|
return if @arguments.empty?
|
73
|
-
arguments_value = Value.new @configuration, :arguments
|
73
|
+
arguments_value = Configure::Value.new @schema, @configuration, :arguments
|
74
74
|
arguments_value.put @arguments
|
75
75
|
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
# Injector for a single configuration value.
|
80
|
-
class Value
|
81
|
-
|
82
|
-
def initialize(configuration, key)
|
83
|
-
@configuration, @key = configuration, key
|
84
|
-
end
|
85
|
-
|
86
|
-
def put_single_or_multiple(values)
|
87
|
-
self.put_or_combine values.size == 1 ? values.first : values
|
88
|
-
end
|
89
|
-
|
90
|
-
def put_or_combine(value)
|
91
|
-
self.put exists? ? [ get, value ].flatten : value
|
92
|
-
end
|
93
|
-
|
94
|
-
def put_if_nil(value)
|
95
|
-
self.put value if get.nil?
|
96
|
-
end
|
97
|
-
|
98
|
-
def put(value)
|
99
|
-
method_name = :"#{@key}="
|
100
|
-
if @configuration.respond_to?(method_name)
|
101
|
-
@configuration.send method_name, value
|
102
|
-
elsif @configuration.respond_to?(:[]=)
|
103
|
-
@configuration[@key] = value
|
104
|
-
else
|
105
|
-
raise Error, "couldn't set configuration value for key #{@key}!"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def get
|
110
|
-
method_name = :"#{@key}"
|
111
|
-
if @configuration.respond_to?(method_name)
|
112
|
-
@configuration.send method_name
|
113
|
-
elsif @configuration.respond_to?(:[])
|
114
|
-
@configuration[@key]
|
115
|
-
else
|
116
|
-
raise Error, "couldn't get configuration value for key #{@key}!"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def exists?
|
121
|
-
!!self.get
|
77
|
+
def check_values!
|
78
|
+
Configure::Checker.new(@schema, @configuration).check!
|
122
79
|
end
|
123
80
|
|
124
81
|
end
|
data/lib/configure/schema.rb
CHANGED
@@ -2,8 +2,30 @@
|
|
2
2
|
module Configure::Schema
|
3
3
|
|
4
4
|
SCHEMA = {
|
5
|
-
|
6
|
-
|
5
|
+
:configuration_class => Hash,
|
6
|
+
:only => [
|
7
|
+
:configuration_class,
|
8
|
+
:only,
|
9
|
+
:not_nil,
|
10
|
+
:argument_keys,
|
11
|
+
:defaults,
|
12
|
+
:nested_default,
|
13
|
+
:nested
|
14
|
+
],
|
15
|
+
:not_nil => [
|
16
|
+
:configuration_class
|
17
|
+
],
|
18
|
+
:defaults => {
|
19
|
+
:configuration_class => Hash
|
20
|
+
},
|
21
|
+
:nested => {
|
22
|
+
:nested => {
|
23
|
+
:configuration_class => Hash
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
27
|
+
SCHEMA[:nested][:nested][:nested_default] = SCHEMA
|
28
|
+
SCHEMA.freeze
|
7
29
|
|
8
30
|
def self.build(&block)
|
9
31
|
Configure.process SCHEMA, &block
|
@@ -0,0 +1,61 @@
|
|
1
|
+
|
2
|
+
# Handler for a single configuration value.
|
3
|
+
class Configure::Value
|
4
|
+
|
5
|
+
attr_accessor :schema
|
6
|
+
attr_accessor :configuration
|
7
|
+
attr_accessor :key
|
8
|
+
|
9
|
+
def initialize(schema, configuration, key)
|
10
|
+
@schema, @configuration, @key = schema, configuration, key
|
11
|
+
end
|
12
|
+
|
13
|
+
def put_single_or_multiple(values)
|
14
|
+
self.put_or_combine values.size == 1 ? values.first : values
|
15
|
+
end
|
16
|
+
|
17
|
+
def put_or_combine(value)
|
18
|
+
existing_value = get
|
19
|
+
self.put existing_value.nil? ? value : [ existing_value, value ].flatten
|
20
|
+
end
|
21
|
+
|
22
|
+
def put_unless_existing(value)
|
23
|
+
self.put value unless exists?
|
24
|
+
end
|
25
|
+
|
26
|
+
def put(value)
|
27
|
+
check_only_list!
|
28
|
+
method_name = :"#{@key}="
|
29
|
+
if @configuration.respond_to?(method_name)
|
30
|
+
@configuration.send method_name, value
|
31
|
+
elsif @configuration.respond_to?(:[]=)
|
32
|
+
@configuration[@key] = value
|
33
|
+
else
|
34
|
+
raise Configure::InvalidKeyError, "couldn't set configuration value for key #{@key}!"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def get
|
39
|
+
check_only_list!
|
40
|
+
method_name = :"#{@key}"
|
41
|
+
if @configuration.respond_to?(method_name)
|
42
|
+
@configuration.send method_name
|
43
|
+
elsif @configuration.respond_to?(:[])
|
44
|
+
@configuration[@key]
|
45
|
+
else
|
46
|
+
raise Configure::InvalidKeyError, "couldn't get configuration value for key #{@key}!"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def exists?
|
51
|
+
@configuration.respond_to?(:has_key?) ? @configuration.has_key?(@key) : !!self.get
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def check_only_list!
|
57
|
+
raise Configure::InvalidKeyError, "access to set configuration value for key #{@key} denied!" if
|
58
|
+
@schema.has_key?(:only) && ![ @schema[:only] ].flatten.include?(@key)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -12,17 +12,19 @@ describe Configure do
|
|
12
12
|
configuration_class = @configuration_class
|
13
13
|
@schema = described_class::Schema.build do
|
14
14
|
configuration_class configuration_class
|
15
|
-
|
15
|
+
only :test_key_one, :test_key_two, :test_key_three, :test_key_four, :test_key_five
|
16
|
+
not_nil :test_key_one
|
17
|
+
defaults {
|
16
18
|
test_key_one "default value"
|
17
|
-
|
18
|
-
nested
|
19
|
-
test_key_two
|
19
|
+
}
|
20
|
+
nested {
|
21
|
+
test_key_two {
|
20
22
|
argument_keys :test_key_three, :test_key_four
|
21
|
-
defaults
|
23
|
+
defaults {
|
22
24
|
test_key_five "default value"
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
@@ -42,6 +44,23 @@ describe Configure do
|
|
42
44
|
configuration.test_key_one.should == "one"
|
43
45
|
end
|
44
46
|
|
47
|
+
it "should raise an #{Configure::InvalidKeyError} if key isn't included in :only list" do
|
48
|
+
lambda do
|
49
|
+
described_class.process @schema do
|
50
|
+
test_key_six "six"
|
51
|
+
end
|
52
|
+
end.should raise_error(Configure::InvalidKeyError)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should raise an #{Configure::NilValueError} if a not-nil value is nil" do
|
56
|
+
@configuration_class.send(:define_method, :has_key?) { |key| key == :test_key_one }
|
57
|
+
lambda do
|
58
|
+
described_class.process @schema do
|
59
|
+
test_key_one nil
|
60
|
+
end
|
61
|
+
end.should raise_error(Configure::NilValueError)
|
62
|
+
end
|
63
|
+
|
45
64
|
it "should use the specified default values" do
|
46
65
|
configuration = described_class.process @schema do
|
47
66
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe Configure::Schema do
|
4
|
+
|
5
|
+
describe "build" do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@block = Proc.new {
|
9
|
+
configuration_class Hash
|
10
|
+
nested {
|
11
|
+
test_key_one {
|
12
|
+
only :test_key_two
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return a hash with the schema" do
|
19
|
+
schema = described_class.build &@block
|
20
|
+
schema.should == {
|
21
|
+
:configuration_class => Hash,
|
22
|
+
:nested => {
|
23
|
+
:test_key_one => {
|
24
|
+
:configuration_class => Hash,
|
25
|
+
:only => :test_key_two
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should raise an #{Configure::InvalidKeyError} if an invalid schema key is given" do
|
32
|
+
lambda do
|
33
|
+
described_class.build {
|
34
|
+
invalid :value
|
35
|
+
}
|
36
|
+
end.should raise_error(Configure::InvalidKeyError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should raise an #{Configure::InvalidKeyError} if an invalid nested schema key is given" do
|
40
|
+
lambda do
|
41
|
+
described_class.build {
|
42
|
+
nested {
|
43
|
+
test_key_one {
|
44
|
+
invalid :value
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
end.should raise_error(Configure::InvalidKeyError)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe Configure::Checker do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@schema = {
|
7
|
+
:not_nil => [ :test ]
|
8
|
+
}
|
9
|
+
@configuration = { }
|
10
|
+
|
11
|
+
@checker = described_class.new @schema, @configuration
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#check!" do
|
15
|
+
|
16
|
+
before :each do
|
17
|
+
@value = mock Configure::Value, :get => "value"
|
18
|
+
Configure::Value.stub :new => @value
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should initialize #{Configure::Value}" do
|
22
|
+
Configure::Value.should_receive(:new).with(@schema, @configuration, :test).and_return(@value)
|
23
|
+
@checker.check!
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not raise any error" do
|
27
|
+
lambda do
|
28
|
+
@checker.check!
|
29
|
+
end.should_not raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should raise a #{Configure::NilValueError} if value is nil" do
|
33
|
+
@value.stub :get => nil
|
34
|
+
lambda do
|
35
|
+
@checker.check!
|
36
|
+
end.should raise_error(Configure::NilValueError)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -6,10 +6,16 @@ describe Configure::Injector do
|
|
6
6
|
@configuration_class = Class.new
|
7
7
|
@configuration_class.send :attr_accessor, :test_key
|
8
8
|
@configuration_class.send :attr_accessor, :another_test_key
|
9
|
+
@configuration_class.send :attr_accessor, :invalid_key
|
9
10
|
|
10
|
-
@nested_schema = {
|
11
|
+
@nested_schema = {
|
12
|
+
:configuration_class => @configuration_class
|
13
|
+
}
|
11
14
|
@schema = {
|
12
15
|
:configuration_class => @configuration_class,
|
16
|
+
:only => [ :test_key, :another_test_key, :not_existing_key ],
|
17
|
+
:not_nil => :another_test_key,
|
18
|
+
:nested_default => @nested_schema,
|
13
19
|
:nested => {
|
14
20
|
:test_key => @nested_schema
|
15
21
|
},
|
@@ -40,7 +46,10 @@ describe Configure::Injector do
|
|
40
46
|
@block = Proc.new { }
|
41
47
|
@arguments = [ "one" ]
|
42
48
|
@nested_configuration = { }
|
43
|
-
Configure.stub
|
49
|
+
Configure.stub :process_configuration => @nested_configuration
|
50
|
+
|
51
|
+
@checker = mock Configure::Checker, :check! => nil
|
52
|
+
Configure::Checker.stub :new => @checker
|
44
53
|
end
|
45
54
|
|
46
55
|
it "should process a new (nested) configuration" do
|
@@ -48,6 +57,11 @@ describe Configure::Injector do
|
|
48
57
|
@injector.put_block :test_key, @arguments, &@block
|
49
58
|
end
|
50
59
|
|
60
|
+
it "should use the nested default if no nested schema is specified for the given key" do
|
61
|
+
Configure.should_receive(:process_configuration).with(@nested_schema, &@block).and_return(@nested_configuration)
|
62
|
+
@injector.put_block :another_test_key, @arguments, &@block
|
63
|
+
end
|
64
|
+
|
51
65
|
it "should nest the configuration" do
|
52
66
|
@injector.put_block :test_key, @arguments, &@block
|
53
67
|
@injector.configuration.test_key.should == @nested_configuration
|
@@ -69,6 +83,16 @@ describe Configure::Injector do
|
|
69
83
|
@injector.configuration.test_key[:another_test_key].should == "one"
|
70
84
|
end
|
71
85
|
|
86
|
+
it "should initialize the checker" do
|
87
|
+
Configure::Checker.should_receive(:new).with(@nested_schema, @nested_configuration).and_return(@checker)
|
88
|
+
@injector.put_block :test_key, @arguments, &@block
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should check the nested configuration values" do
|
92
|
+
@checker.should_receive(:check!)
|
93
|
+
@injector.put_block :test_key, @arguments, &@block
|
94
|
+
end
|
95
|
+
|
72
96
|
it "should combine nested configurations to an array" do
|
73
97
|
@injector.put_block :test_key, @arguments, &@block
|
74
98
|
@injector.put_block :test_key, @arguments, &@block
|
@@ -100,10 +124,16 @@ describe Configure::Injector do
|
|
100
124
|
@injector.configuration.test_key.should == [ "one", "two" ]
|
101
125
|
end
|
102
126
|
|
103
|
-
it "should raise a #{
|
127
|
+
it "should raise a #{Configure::InvalidKeyError} if key is not in only-list" do
|
104
128
|
lambda do
|
105
129
|
@injector.put_arguments :invalid_key, [ "one" ]
|
106
|
-
end.should raise_error(
|
130
|
+
end.should raise_error(Configure::InvalidKeyError)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should raise a #{Configure::InvalidKeyError} if key is not existing" do
|
134
|
+
lambda do
|
135
|
+
@injector.put_arguments :not_existing_key, [ "one" ]
|
136
|
+
end.should raise_error(Configure::InvalidKeyError)
|
107
137
|
end
|
108
138
|
|
109
139
|
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe Configure::Value do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@schema = { :only => :test }
|
7
|
+
@configuration = { }
|
8
|
+
|
9
|
+
@value = described_class.new @schema, @configuration, :test
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#put_single_or_multiple" do
|
13
|
+
|
14
|
+
before :each do
|
15
|
+
@value.stub :put_or_combine => nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should call :put_or_combine with a single value" do
|
19
|
+
@value.should_receive(:put_or_combine).with(:value)
|
20
|
+
@value.put_single_or_multiple [ :value ]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should call :put_or_combine with a multiple values" do
|
24
|
+
@value.should_receive(:put_or_combine).with([ :value_one, :value_two ])
|
25
|
+
@value.put_single_or_multiple [ :value_one, :value_two ]
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#put_or_combine" do
|
31
|
+
|
32
|
+
before :each do
|
33
|
+
@value.stub :put => nil
|
34
|
+
@value.stub :get => :test
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should call :put with the argument combined with the existing value if it's existing" do
|
38
|
+
@value.should_receive(:put).with([ :test, :value ])
|
39
|
+
@value.put_or_combine :value
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should call :put with the argument if no value is existing" do
|
43
|
+
@value.stub :get => nil
|
44
|
+
@value.should_receive(:put).with(:value)
|
45
|
+
@value.put_or_combine :value
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#put_unless_existing" do
|
51
|
+
|
52
|
+
before :each do
|
53
|
+
@value.stub :put => nil
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should call :put with the argument if the value isn't existing" do
|
57
|
+
@value.should_receive(:put).with(:value)
|
58
|
+
@value.put_unless_existing :value
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should not call :put with the argument if the value is existing" do
|
62
|
+
@configuration[:test] = nil
|
63
|
+
@value.should_not_receive(:put)
|
64
|
+
@value.put_unless_existing :value
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#put" do
|
70
|
+
|
71
|
+
it "should set the configuration value" do
|
72
|
+
@value.put :value
|
73
|
+
@configuration[:test].should == :value
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should raise an #{Configure::InvalidKeyError} if the key isn't included in only-list" do
|
77
|
+
@value.key = :invalid
|
78
|
+
lambda do
|
79
|
+
@value.put :value
|
80
|
+
end.should raise_error(Configure::InvalidKeyError)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should raise an #{Configure::InvalidKeyError} if the value can't be set" do
|
84
|
+
@value.configuration = Object.new
|
85
|
+
lambda do
|
86
|
+
@value.put :value
|
87
|
+
end.should raise_error(Configure::InvalidKeyError)
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "#get" do
|
93
|
+
|
94
|
+
before :each do
|
95
|
+
@configuration[:test] = :value
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should set the configuration value" do
|
99
|
+
value = @value.get
|
100
|
+
value.should == :value
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should raise an #{Configure::InvalidKeyError} if the key isn't included in only-list" do
|
104
|
+
@value.key = :invalid
|
105
|
+
lambda do
|
106
|
+
@value.get
|
107
|
+
end.should raise_error(Configure::InvalidKeyError)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should raise an #{Configure::InvalidKeyError} if the value can't be set" do
|
111
|
+
@value.configuration = Object.new
|
112
|
+
lambda do
|
113
|
+
@value.get
|
114
|
+
end.should raise_error(Configure::InvalidKeyError)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#exists?" do
|
120
|
+
|
121
|
+
before :each do
|
122
|
+
@configuration[:test] = :value
|
123
|
+
@value.stub :get => :value
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should return true" do
|
127
|
+
exists = @value.exists?
|
128
|
+
exists.should be_true
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should return true if key is existing, but value is nil" do
|
132
|
+
@configuration[:test] = nil
|
133
|
+
exists = @value.exists?
|
134
|
+
exists.should be_true
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should return false if key isn't existing" do
|
138
|
+
@configuration.delete :test
|
139
|
+
exists = @value.exists?
|
140
|
+
exists.should be_false
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should check just the value if configuration doesn't respond to :has_key?" do
|
144
|
+
@configuration.stub :respond_to? => false
|
145
|
+
exists = @value.exists?
|
146
|
+
exists.should be_true
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
data/spec/lib/configure_spec.rb
CHANGED
@@ -9,7 +9,13 @@ describe Configure do
|
|
9
9
|
describe "#process" do
|
10
10
|
|
11
11
|
before :each do
|
12
|
-
described_class.stub
|
12
|
+
described_class::Schema.stub :build => :schema
|
13
|
+
described_class.stub :process_configuration => nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should build an empty schema if none given" do
|
17
|
+
described_class::Schema.should_receive(:build).and_return(:schema)
|
18
|
+
described_class.process nil, &@block
|
13
19
|
end
|
14
20
|
|
15
21
|
it "should call :process_configuration" do
|
@@ -27,6 +33,9 @@ describe Configure do
|
|
27
33
|
|
28
34
|
@sandbox = mock described_class::Sandbox, :instance_eval => nil
|
29
35
|
described_class::Sandbox.stub :new => @sandbox
|
36
|
+
|
37
|
+
@checker = mock described_class::Checker, :check! => nil
|
38
|
+
described_class::Checker.stub :new => @checker
|
30
39
|
end
|
31
40
|
|
32
41
|
it "should initialize the injector" do
|
@@ -44,6 +53,16 @@ describe Configure do
|
|
44
53
|
described_class.process_configuration :schema, &@block
|
45
54
|
end
|
46
55
|
|
56
|
+
it "should initialize the checker" do
|
57
|
+
described_class::Checker.should_receive(:new).with(:schema, :configuration).and_return(@checker)
|
58
|
+
described_class.process_configuration :schema, &@block
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should check the configuration values" do
|
62
|
+
@checker.should_receive(:check!)
|
63
|
+
described_class.process_configuration :schema, &@block
|
64
|
+
end
|
65
|
+
|
47
66
|
it "should return the configuration" do
|
48
67
|
configuration = described_class.process_configuration :schema, &@block
|
49
68
|
configuration.should == :configuration
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: configure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.3.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- "Philipp Br\xC3\xBCll"
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-04-08 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -48,14 +48,19 @@ files:
|
|
48
48
|
- LICENSE
|
49
49
|
- Rakefile
|
50
50
|
- lib/configure.rb
|
51
|
+
- lib/configure/value.rb
|
51
52
|
- lib/configure/injector.rb
|
53
|
+
- lib/configure/checker.rb
|
52
54
|
- lib/configure/sandbox.rb
|
53
55
|
- lib/configure/schema.rb
|
54
56
|
- spec/lib/configure_spec.rb
|
55
57
|
- spec/lib/configure/injector_spec.rb
|
56
58
|
- spec/lib/configure/schema_spec.rb
|
59
|
+
- spec/lib/configure/checker_spec.rb
|
60
|
+
- spec/lib/configure/value_spec.rb
|
57
61
|
- spec/lib/configure/sandbox_spec.rb
|
58
62
|
- spec/spec_helper.rb
|
63
|
+
- spec/acceptance/schema_spec.rb
|
59
64
|
- spec/acceptance/configure_without_schema_spec.rb
|
60
65
|
- spec/acceptance/configure_with_schema_spec.rb
|
61
66
|
has_rdoc: true
|
@@ -90,6 +95,9 @@ test_files:
|
|
90
95
|
- spec/lib/configure_spec.rb
|
91
96
|
- spec/lib/configure/injector_spec.rb
|
92
97
|
- spec/lib/configure/schema_spec.rb
|
98
|
+
- spec/lib/configure/checker_spec.rb
|
99
|
+
- spec/lib/configure/value_spec.rb
|
93
100
|
- spec/lib/configure/sandbox_spec.rb
|
101
|
+
- spec/acceptance/schema_spec.rb
|
94
102
|
- spec/acceptance/configure_without_schema_spec.rb
|
95
103
|
- spec/acceptance/configure_with_schema_spec.rb
|