configurations 1.4.0 → 2.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -7
- data/README.md +45 -12
- data/lib/configurations.rb +1 -1
- data/lib/configurations/configurable.rb +19 -5
- data/lib/configurations/configuration.rb +66 -23
- data/test/configurations/test_configurable_with_blocks_configuration.rb +2 -2
- data/test/configurations/test_configuration.rb +49 -18
- data/test/configurations/test_configuration_methods.rb +20 -2
- data/test/configurations/test_stricter_configuration.rb +35 -9
- metadata +54 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
5
|
-
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e4dac5ba9d58bb68f5ff84dbd03433a9015f976a
|
4
|
+
data.tar.gz: 7ba636f43c643628e1281c2382dc73c4ee4b4a97
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e2813ce78bbd73297da31cf753832ae05e058bb5d75cdab01a73171302c58c7931979305f4d2dd267e7ab978573134d589ef57a72e6f75887221f791d961dc0f
|
7
|
+
data.tar.gz: 4b102d91d228b20f77097858c6753bd59e880cf060540a4115a5b3452d3bc930ad12804bb77f6fac25c3741cb67ce373c153e29524235709c5229d5b571acd57
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Configurations provides a unified approach to do configurations using the `MyGem
|
|
10
10
|
|
11
11
|
or with Bundler
|
12
12
|
|
13
|
-
`gem 'configurations', '~>
|
13
|
+
`gem 'configurations', '~> 2.0.0.pre'`
|
14
14
|
|
15
15
|
Configurations uses [Semver 2.0](http://semver.org/)
|
16
16
|
|
@@ -55,6 +55,23 @@ MyGem.configuration.class #=> 'oooh wow'
|
|
55
55
|
MyGem.configuration.foo.bar.baz #=> 'fizz'
|
56
56
|
```
|
57
57
|
|
58
|
+
Undefined properties on an arbitrary configuration will return `nil`
|
59
|
+
|
60
|
+
```
|
61
|
+
MyGem.configuration.not_set #=> nil
|
62
|
+
```
|
63
|
+
|
64
|
+
If you want to define the behaviour for not set properties yourself, use `not_configured`.
|
65
|
+
|
66
|
+
```
|
67
|
+
module MyGem
|
68
|
+
not_configured do |prop|
|
69
|
+
raise NoMethodError, "#{prop} must be configured"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
|
58
75
|
### Second way: Restricted Configuration
|
59
76
|
|
60
77
|
If you just want some properties to be configurable, consider this option
|
@@ -87,6 +104,22 @@ MyGem.configuration.foo #=> 'FOO'
|
|
87
104
|
MyGem.configuration.bar.baz #=> 'FIZZ'
|
88
105
|
```
|
89
106
|
|
107
|
+
Not configured properties on a restricted configuration will raise `NoMethodError`
|
108
|
+
|
109
|
+
```
|
110
|
+
MyGem.configuration.not_set #=> <#NoMethodError>
|
111
|
+
```
|
112
|
+
|
113
|
+
If you want to define the behaviour for not set properties yourself, use `not_configured`. This will only affect properties set to configurable. All not configurable properties will raise `NoMethodError`.
|
114
|
+
|
115
|
+
```
|
116
|
+
module MyGem
|
117
|
+
not_configured do |prop|
|
118
|
+
warn :not_configured, "Please configure #{prop} or live in danger"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
```
|
122
|
+
|
90
123
|
### Third way: Type Restricted Configuration
|
91
124
|
|
92
125
|
If you want to make sure your configurations only accept one type, consider this option
|
@@ -121,18 +154,18 @@ module MyGem
|
|
121
154
|
include Configurations
|
122
155
|
configurable :foo do |value|
|
123
156
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
157
|
+
# The return value is what gets assigned, unless it is nil,
|
158
|
+
# in which case the original value persists
|
159
|
+
#
|
160
|
+
value + ' ooooh my'
|
128
161
|
end
|
129
162
|
configurable String, bar: :baz do |value|
|
130
163
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
164
|
+
# value is guaranteed to be a string at this point
|
165
|
+
#
|
166
|
+
unless %w(bi ba bu).include?(value)
|
167
|
+
raise ArgumentError, 'baz needs to be one of bi, ba, bu'
|
168
|
+
end
|
136
169
|
end
|
137
170
|
end
|
138
171
|
```
|
@@ -166,7 +199,7 @@ module MyGem
|
|
166
199
|
include Configurations
|
167
200
|
configurable :foo, :bar
|
168
201
|
configuration_method :foobar do |arg|
|
169
|
-
|
202
|
+
foo + bar + arg
|
170
203
|
end
|
171
204
|
end
|
172
205
|
```
|
@@ -193,7 +226,7 @@ MyGem.configuration.foobar('ARG') #=> 'FOOBARARG'
|
|
193
226
|
module MyGem
|
194
227
|
include Configurations
|
195
228
|
configuration_defaults do |c|
|
196
|
-
|
229
|
+
c.foo.bar.baz = 'BAR'
|
197
230
|
end
|
198
231
|
end
|
199
232
|
```
|
data/lib/configurations.rb
CHANGED
@@ -28,7 +28,13 @@ module Configurations
|
|
28
28
|
#
|
29
29
|
def configure(&block)
|
30
30
|
raise ArgumentError, 'can not configure without a block' unless block_given?
|
31
|
-
@configuration = #{
|
31
|
+
@configuration = #{base.name}::Configuration.new(
|
32
|
+
defaults: @configuration_defaults,
|
33
|
+
methods: @configuration_methods,
|
34
|
+
configurable: @configurable,
|
35
|
+
not_configured: @not_configured_callback,
|
36
|
+
&block
|
37
|
+
)
|
32
38
|
end
|
33
39
|
end
|
34
40
|
EOF
|
@@ -85,11 +91,19 @@ module Configurations
|
|
85
91
|
# end
|
86
92
|
#
|
87
93
|
def configuration_method(method, &block)
|
88
|
-
raise ArgumentError, "
|
94
|
+
raise ArgumentError, "can not be both a configurable property and a configuration method" if configurable?(method)
|
95
|
+
@configuration_methods ||= {}
|
96
|
+
@configuration_methods.merge! method => block
|
97
|
+
end
|
89
98
|
|
90
|
-
|
91
|
-
|
92
|
-
|
99
|
+
# not_configured defines the behaviour when a property has not been configured
|
100
|
+
# This can be useful for presence validations of certain properties
|
101
|
+
# or behaviour for undefined properties deviating from the original behaviour
|
102
|
+
# @param [Proc] block the block to evaluate
|
103
|
+
# @yield [Symbol] the property that has not been configured
|
104
|
+
#
|
105
|
+
def not_configured(&block)
|
106
|
+
@not_configured_callback = block
|
93
107
|
end
|
94
108
|
|
95
109
|
private
|
@@ -3,7 +3,6 @@ module Configurations
|
|
3
3
|
# Configuration is a blank object in order to allow configuration of various properties including keywords
|
4
4
|
#
|
5
5
|
class Configuration < BasicObject
|
6
|
-
|
7
6
|
# 1.9 does not allow for method rebinding in another scope
|
8
7
|
#
|
9
8
|
if ::RUBY_VERSION < '2.0.0'
|
@@ -33,25 +32,32 @@ module Configurations
|
|
33
32
|
# Installs the inspect method from Kernel
|
34
33
|
#
|
35
34
|
install_kernel_method(:inspect)
|
35
|
+
|
36
36
|
end
|
37
37
|
|
38
38
|
# Initialize a new configuration
|
39
|
-
# @param [
|
40
|
-
# @
|
39
|
+
# @param [Hash] options The options to initialize a configuration with
|
40
|
+
# @option options [Hash] configurable a hash of configurable properties and their asserted types if given
|
41
|
+
# @option options [Hash] methods a hash of method names pointing to procs
|
42
|
+
# @option options [Proc] not_configured a proc to evaluate for not_configured properties
|
41
43
|
# @param [Proc] block a block to configure this configuration with
|
44
|
+
# @yield [HostModule::Configuration] a configuration
|
42
45
|
# @return [HostModule::Configuration] a configuration
|
43
46
|
#
|
44
|
-
def initialize(
|
45
|
-
@
|
46
|
-
@
|
47
|
+
def initialize(options={}, &block)
|
48
|
+
@_configurable = options[:configurable]
|
49
|
+
@_methods = options[:methods]
|
50
|
+
@_not_configured = options[:not_configured]
|
51
|
+
|
52
|
+
@_writeable = true
|
47
53
|
@configuration = _configuration_hash
|
48
54
|
|
49
55
|
_evaluate_configurable!
|
50
56
|
|
51
|
-
|
57
|
+
instance_eval(&options[:defaults]) if options[:defaults]
|
52
58
|
|
53
59
|
if block
|
54
|
-
|
60
|
+
instance_eval(&block)
|
55
61
|
self._writeable = false
|
56
62
|
end
|
57
63
|
end
|
@@ -64,8 +70,12 @@ module Configurations
|
|
64
70
|
|
65
71
|
if _respond_to_writer?(method)
|
66
72
|
_assign!(property, value)
|
67
|
-
elsif
|
73
|
+
elsif _respond_to_property_for_write?(method)
|
68
74
|
@configuration[method]
|
75
|
+
elsif _respond_to_property_for_read?(method)
|
76
|
+
@configuration.fetch(method, &_not_configured_callback)
|
77
|
+
elsif _has_configuration_method?(method)
|
78
|
+
_exec_configuration_method!(method, *args, &block)
|
69
79
|
elsif _can_delegate_to_kernel?(method)
|
70
80
|
::Kernel.send(method, *args, &block)
|
71
81
|
else
|
@@ -76,7 +86,7 @@ module Configurations
|
|
76
86
|
# Respond to missing according to the method_missing implementation
|
77
87
|
#
|
78
88
|
def respond_to?(method, include_private = false)
|
79
|
-
_respond_to_writer?(method) or
|
89
|
+
_respond_to_writer?(method) or _respond_to_property_for_write?(method) or _respond_to_property_for_read?(method) or _can_delegate_to_kernel?(method) or !!super
|
80
90
|
end
|
81
91
|
|
82
92
|
# Set the configuration to writeable or read only. Access to writer methods is only allowed within the
|
@@ -122,19 +132,19 @@ module Configurations
|
|
122
132
|
# @return [Boolean] whether the given property is configurable
|
123
133
|
#
|
124
134
|
def _configurable?(property)
|
125
|
-
_arbitrarily_configurable? or @
|
135
|
+
_arbitrarily_configurable? or @_configurable.has_key?(property)
|
126
136
|
end
|
127
137
|
|
128
138
|
|
129
139
|
# @return [Boolean] whether this configuration is arbitrarily configurable
|
130
140
|
#
|
131
141
|
def _arbitrarily_configurable?
|
132
|
-
@
|
142
|
+
@_configurable.nil? or @_configurable.empty?
|
133
143
|
end
|
134
144
|
|
135
145
|
# @return [Hash] the configurations configurable hash
|
136
146
|
def _configurable
|
137
|
-
@
|
147
|
+
@_configurable
|
138
148
|
end
|
139
149
|
|
140
150
|
private
|
@@ -143,31 +153,50 @@ module Configurations
|
|
143
153
|
# @return [Boolean] whether the given property has been configured
|
144
154
|
#
|
145
155
|
def _configured?(property)
|
146
|
-
@configuration.has_key?(property)
|
156
|
+
@configuration.has_key?(property) or _not_configured_callback? or _arbitrarily_configurable?
|
147
157
|
end
|
148
158
|
|
149
159
|
# @return [Hash] A configuration hash instantiating subhashes if the key is configurable
|
150
160
|
#
|
151
161
|
def _configuration_hash
|
152
162
|
::Hash.new do |h, k|
|
153
|
-
h[k] = Configuration.new(
|
163
|
+
h[k] = Configuration.new(configurable: @_configurable, not_configured: @_not_configured) if _configurable?(k)
|
154
164
|
end
|
155
165
|
end
|
156
166
|
|
167
|
+
# @return [Proc] The not_configured callback
|
168
|
+
#
|
169
|
+
def _not_configured_callback
|
170
|
+
@_not_configured || ::Proc.new { |key| nil }
|
171
|
+
end
|
172
|
+
|
173
|
+
# @return [Boolean] whether the not configured callback has been configured
|
174
|
+
#
|
175
|
+
def _not_configured_callback?
|
176
|
+
!!@_not_configured
|
177
|
+
end
|
178
|
+
|
157
179
|
# Evaluates configurable properties and passes eventual hashes down to subconfigurations
|
158
180
|
#
|
159
181
|
def _evaluate_configurable!
|
160
182
|
return if _arbitrarily_configurable?
|
161
183
|
|
162
|
-
@
|
184
|
+
@_configurable.each do |k, assertion|
|
163
185
|
if k.is_a?(::Hash)
|
164
186
|
k.each do |property, nested|
|
165
|
-
@configuration[property] = Configuration.new(
|
187
|
+
@configuration[property] = Configuration.new(configurable: _configurable_hash(property, nested, assertion), not_configured: _not_configured_callback)
|
166
188
|
end
|
167
189
|
end
|
168
190
|
end
|
169
191
|
end
|
170
192
|
|
193
|
+
# Executes a configuration method
|
194
|
+
#
|
195
|
+
def _exec_configuration_method!(method, *args, &block)
|
196
|
+
args << block #rbx complains if block is separate in the arguments list
|
197
|
+
instance_exec(*args, &@_methods[method])
|
198
|
+
end
|
199
|
+
|
171
200
|
# @param [Symbol, Hash, Array] property configurable properties, either single or nested
|
172
201
|
# @param [Symbol, Hash, Array] value configurable properties, either single or nested
|
173
202
|
# @param [Hash] assertion assertion if any
|
@@ -200,7 +229,7 @@ module Configurations
|
|
200
229
|
def _assert_type!(property, value)
|
201
230
|
return unless _evaluable?(property, :type)
|
202
231
|
|
203
|
-
assertion = @
|
232
|
+
assertion = @_configurable[property][:type]
|
204
233
|
::Kernel.raise ConfigurationError, "Expected #{property} to be configured with #{assertion}, but got #{value.class.inspect}", caller unless value.is_a?(assertion)
|
205
234
|
end
|
206
235
|
|
@@ -211,7 +240,7 @@ module Configurations
|
|
211
240
|
def _evaluate_block!(property, value)
|
212
241
|
return value unless _evaluable?(property, :block)
|
213
242
|
|
214
|
-
evaluation = @
|
243
|
+
evaluation = @_configurable[property][:block]
|
215
244
|
evaluation.call(value)
|
216
245
|
end
|
217
246
|
|
@@ -220,7 +249,7 @@ module Configurations
|
|
220
249
|
# @return [Boolean] whether the given property is assertable
|
221
250
|
#
|
222
251
|
def _evaluable?(property, evaluation)
|
223
|
-
@
|
252
|
+
@_configurable and @_configurable.has_key?(property) and @_configurable[property].is_a?(::Hash) and @_configurable[property].has_key?(evaluation)
|
224
253
|
end
|
225
254
|
|
226
255
|
# @param [Symbol] property The property to test for
|
@@ -237,6 +266,13 @@ module Configurations
|
|
237
266
|
method.to_s.end_with?('=')
|
238
267
|
end
|
239
268
|
|
269
|
+
# @param [Symbol] method the method to test for existence
|
270
|
+
# @return [Boolean] whether the method exists as a configuration method
|
271
|
+
#
|
272
|
+
def _has_configuration_method?(method)
|
273
|
+
@_methods and @_methods.has_key?(method)
|
274
|
+
end
|
275
|
+
|
240
276
|
# @param [Symbol] method the method to test for
|
241
277
|
# @return [Boolean] whether the configuration responds to the given method writer
|
242
278
|
#
|
@@ -245,10 +281,17 @@ module Configurations
|
|
245
281
|
end
|
246
282
|
|
247
283
|
# @param [Symbol] method the method to test for
|
248
|
-
# @return [Boolean] whether the configuration responds to the given property as a method
|
284
|
+
# @return [Boolean] whether the configuration responds to the given property as a method during readable state
|
285
|
+
#
|
286
|
+
def _respond_to_property_for_read?(method)
|
287
|
+
not _is_writer?(method) and _configured?(method)
|
288
|
+
end
|
289
|
+
|
290
|
+
# @param [Symbol] method the method to test for
|
291
|
+
# @return [Boolean] whether the configuration responds to the given property as a method during writeable state
|
249
292
|
#
|
250
|
-
def
|
251
|
-
not _is_writer?(method) and
|
293
|
+
def _respond_to_property_for_write?(method)
|
294
|
+
not _is_writer?(method) and @_writeable
|
252
295
|
end
|
253
296
|
|
254
297
|
# @param [Symbol] method the method to test for
|
@@ -2,8 +2,8 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TestStricterConfigurationWithBlock < Minitest::Test
|
4
4
|
|
5
|
-
BlocksConfigurationTestModule
|
6
|
-
|
5
|
+
module BlocksConfigurationTestModule
|
6
|
+
include Configurations
|
7
7
|
configurable :property1, :property2 do |value|
|
8
8
|
value.to_s + 'oooh'
|
9
9
|
end
|
@@ -2,11 +2,8 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TestConfiguration < Minitest::Test
|
4
4
|
|
5
|
-
ConfigurationTestModule
|
6
|
-
|
7
|
-
ConfigurationNoDefaultTestModule = testmodule_for(Configurations)
|
8
|
-
|
9
|
-
ConfigurationTestModule.module_eval do
|
5
|
+
module ConfigurationTestModule
|
6
|
+
include Configurations
|
10
7
|
configuration_defaults do |c|
|
11
8
|
c.uh.this.is.neat = 'NEAT'
|
12
9
|
c.pah = 'PUH'
|
@@ -15,16 +12,33 @@ class TestConfiguration < Minitest::Test
|
|
15
12
|
end
|
16
13
|
end
|
17
14
|
|
18
|
-
ConfigurationDefaultTestModule
|
15
|
+
module ConfigurationDefaultTestModule
|
16
|
+
include Configurations
|
19
17
|
configuration_defaults do |c|
|
20
18
|
c.set = 'SET'
|
21
19
|
end
|
22
20
|
end
|
23
21
|
|
22
|
+
module ConfigurationNoDefaultTestModule
|
23
|
+
include Configurations
|
24
|
+
end
|
25
|
+
|
26
|
+
module ConfigurationNotConfiguredTestModule
|
27
|
+
include Configurations
|
28
|
+
configuration_defaults do |c|
|
29
|
+
c.set.set = 'SET'
|
30
|
+
end
|
31
|
+
|
32
|
+
not_configured do |property|
|
33
|
+
raise ArgumentError, "#{property} must be configured"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
24
37
|
def setup
|
25
38
|
ConfigurationTestModule.configure do |c|
|
26
39
|
c.basic = 'BASIC'
|
27
40
|
c.class = 'KEY'
|
41
|
+
c.puts = 'OH'
|
28
42
|
c.overwriteee = 'YEAH'
|
29
43
|
c.overwrite.this = 'OVERWRITE'
|
30
44
|
c.github.repo = 'github.com/beatrichartz/configurations'
|
@@ -33,6 +47,8 @@ class TestConfiguration < Minitest::Test
|
|
33
47
|
end
|
34
48
|
|
35
49
|
@configuration = ConfigurationTestModule.configuration
|
50
|
+
@not_configured_configuration = ConfigurationNotConfiguredTestModule.configuration
|
51
|
+
@defaults_configuration = ConfigurationDefaultTestModule.configuration
|
36
52
|
end
|
37
53
|
|
38
54
|
def test_configuration_is_subclass_of_host_module
|
@@ -46,6 +62,7 @@ class TestConfiguration < Minitest::Test
|
|
46
62
|
this: { is: { neat: 'NEAT' } }
|
47
63
|
},
|
48
64
|
pah: 'PUH',
|
65
|
+
puts: 'OH',
|
49
66
|
overwrite: {
|
50
67
|
this: 'OVERWRITE'
|
51
68
|
},
|
@@ -76,7 +93,7 @@ class TestConfiguration < Minitest::Test
|
|
76
93
|
end
|
77
94
|
|
78
95
|
def test_defaults_without_configure
|
79
|
-
assert_equal 'SET',
|
96
|
+
assert_equal 'SET', @defaults_configuration.set
|
80
97
|
end
|
81
98
|
|
82
99
|
def test_no_defaults_without_configure
|
@@ -112,18 +129,34 @@ class TestConfiguration < Minitest::Test
|
|
112
129
|
assert_equal 'something', @configuration.something.else.entirely.nested.deep.below
|
113
130
|
end
|
114
131
|
|
115
|
-
def
|
116
|
-
|
117
|
-
|
132
|
+
def test_respond_to_with_undefined_property
|
133
|
+
assert_equal true, @configuration.respond_to?(:somethings)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_nil_with_undefined_property
|
137
|
+
assert_nil @configuration.somethings
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_overwritten_kernel_method
|
141
|
+
assert_equal 'OH', @configuration.puts
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_not_configured_callback
|
145
|
+
assert_raises ArgumentError do
|
146
|
+
@not_configured_configuration.something
|
118
147
|
end
|
119
148
|
end
|
120
149
|
|
121
|
-
def
|
122
|
-
assert_raises
|
123
|
-
@
|
150
|
+
def test_nested_not_configured_callback
|
151
|
+
assert_raises ArgumentError do
|
152
|
+
@not_configured_configuration.set.something
|
124
153
|
end
|
125
154
|
end
|
126
155
|
|
156
|
+
def test_nested_configured_property_with_not_configured
|
157
|
+
assert_equal 'SET', @not_configured_configuration.set.set
|
158
|
+
end
|
159
|
+
|
127
160
|
def test_respond_to_on_writer_while_writeable
|
128
161
|
ConfigurationTestModule.configure do |c|
|
129
162
|
assert_equal true, c.respond_to?(:pah=)
|
@@ -135,17 +168,15 @@ class TestConfiguration < Minitest::Test
|
|
135
168
|
end
|
136
169
|
|
137
170
|
def test_respond_to_on_kernel_method
|
138
|
-
assert_equal true, @configuration.respond_to?(:
|
171
|
+
assert_equal true, @configuration.respond_to?(:raise)
|
139
172
|
end
|
140
173
|
|
141
174
|
def test_method_missing_on_non_kernel_method
|
142
|
-
|
143
|
-
@configuration.blabla
|
144
|
-
end
|
175
|
+
assert_nil @configuration.blabla
|
145
176
|
end
|
146
177
|
|
147
178
|
def test_respond_to_missing_on_non_kernel_method
|
148
|
-
assert_equal
|
179
|
+
assert_equal true, @configuration.respond_to?(:bbaaaaa)
|
149
180
|
end
|
150
181
|
|
151
182
|
end
|
@@ -2,8 +2,9 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TestConfigurationMethods < Minitest::Test
|
4
4
|
|
5
|
-
ConfigurationMethodsClassModule
|
6
|
-
|
5
|
+
module ConfigurationMethodsClassModule
|
6
|
+
include Configurations
|
7
|
+
|
7
8
|
class MyClass
|
8
9
|
attr_reader :props
|
9
10
|
def initialize(*props)
|
@@ -27,13 +28,24 @@ class TestConfigurationMethods < Minitest::Test
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
31
|
+
module ConfigurationNoMethodsClassModule
|
32
|
+
include Configurations
|
33
|
+
|
34
|
+
configurable :property3
|
35
|
+
end
|
36
|
+
|
30
37
|
def setup
|
31
38
|
ConfigurationMethodsClassModule.configure do |c|
|
32
39
|
c.property1 = :one
|
33
40
|
c.property2 = :two
|
34
41
|
end
|
35
42
|
|
43
|
+
ConfigurationNoMethodsClassModule.configure do |c|
|
44
|
+
c.property3 = :three
|
45
|
+
end
|
46
|
+
|
36
47
|
@configuration = ConfigurationMethodsClassModule.configuration
|
48
|
+
@no_method_configuration = ConfigurationNoMethodsClassModule.configuration
|
37
49
|
end
|
38
50
|
|
39
51
|
def test_configuration_method
|
@@ -64,4 +76,10 @@ class TestConfigurationMethods < Minitest::Test
|
|
64
76
|
end
|
65
77
|
end
|
66
78
|
|
79
|
+
def test_configuration_methods_unaffected
|
80
|
+
assert_raises NoMethodError do
|
81
|
+
@no_method_configuration.method3('ARG')
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
67
85
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class TestStricterConfiguration < Minitest::Test
|
4
|
+
module StrictConfigurationTestModule
|
5
|
+
include Configurations
|
4
6
|
|
5
|
-
StrictConfigurationTestModule = testmodule_for(Configurations)
|
6
|
-
StrictConfigurationTestModule.module_eval do
|
7
7
|
configurable :property1, :property2
|
8
8
|
configurable String, :property3
|
9
9
|
configurable Symbol, property4: :property5, property6: [:property7, :property8]
|
@@ -13,6 +13,16 @@ class TestStricterConfiguration < Minitest::Test
|
|
13
13
|
configurable Hash, property9: { property10: { property11: :property13 } }
|
14
14
|
end
|
15
15
|
|
16
|
+
module StrictConfigurationTestModuleDefaultsError
|
17
|
+
include Configurations
|
18
|
+
|
19
|
+
configurable :property1, :property2
|
20
|
+
|
21
|
+
not_configured do |prop|
|
22
|
+
raise StandardError, 'Problem here'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
def setup
|
17
27
|
StrictConfigurationTestModule.configure do |c|
|
18
28
|
c.property1 = 'BASIC1'
|
@@ -26,8 +36,12 @@ class TestStricterConfiguration < Minitest::Test
|
|
26
36
|
c.property9.property10.property11.property12 = %w(here I am)
|
27
37
|
c.property9.property10.property11.property13 = { hi: :bye }
|
28
38
|
end
|
39
|
+
StrictConfigurationTestModuleDefaultsError.configure do |c|
|
40
|
+
c.property1 = 'BASIC3'
|
41
|
+
end
|
29
42
|
|
30
43
|
@configuration = StrictConfigurationTestModule.configuration
|
44
|
+
@configuration_defaults_error = StrictConfigurationTestModuleDefaultsError.configuration
|
31
45
|
end
|
32
46
|
|
33
47
|
def test_configurable_when_set_configurable
|
@@ -65,17 +79,17 @@ class TestStricterConfiguration < Minitest::Test
|
|
65
79
|
property7: :anything,
|
66
80
|
property8: :everything,
|
67
81
|
property14: 555
|
68
|
-
},
|
82
|
+
},
|
69
83
|
property9: {
|
70
84
|
property10: {
|
71
85
|
property11: {
|
72
|
-
property12: %w(here I am),
|
86
|
+
property12: %w(here I am),
|
73
87
|
property13: {
|
74
88
|
hi: :bye
|
75
89
|
}
|
76
90
|
}
|
77
91
|
}
|
78
|
-
},
|
92
|
+
},
|
79
93
|
property1: 'BASIC1',
|
80
94
|
property2: 'BASIC2',
|
81
95
|
property3: 'STRING'
|
@@ -124,12 +138,26 @@ class TestStricterConfiguration < Minitest::Test
|
|
124
138
|
end
|
125
139
|
end
|
126
140
|
|
141
|
+
def test_respond_to_with_undefined_property
|
142
|
+
assert_equal false, @configuration.respond_to?(:property12)
|
143
|
+
end
|
144
|
+
|
127
145
|
def test_not_callable_with_undefined_property
|
128
146
|
assert_raises NoMethodError do
|
129
147
|
@configuration.property12
|
130
148
|
end
|
131
149
|
end
|
132
150
|
|
151
|
+
def test_not_configured_callback
|
152
|
+
assert_raises StandardError do
|
153
|
+
@configuration_defaults_error.property2
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_not_configured_callback_not_triggered_for_configured
|
158
|
+
assert_equal 'BASIC3', @configuration_defaults_error.property1
|
159
|
+
end
|
160
|
+
|
133
161
|
def test_not_configurable_with_undefined_nested_property
|
134
162
|
assert_raises NoMethodError do
|
135
163
|
StrictConfigurationTestModule.configure do |c|
|
@@ -138,10 +166,8 @@ class TestStricterConfiguration < Minitest::Test
|
|
138
166
|
end
|
139
167
|
end
|
140
168
|
|
141
|
-
def
|
142
|
-
|
143
|
-
@configuration.property6.property9
|
144
|
-
end
|
169
|
+
def test_callable_with_undefined_nested_property
|
170
|
+
assert_nil @configuration.property6.property9
|
145
171
|
end
|
146
172
|
|
147
173
|
end
|
metadata
CHANGED
@@ -1,67 +1,57 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: configurations
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0.pre
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Beat Richartz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
|
12
|
+
date: 2014-11-02 00:00:00 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
14
15
|
name: minitest
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '5.4'
|
20
|
-
type: :development
|
21
16
|
prerelease: false
|
22
|
-
|
23
|
-
requirements:
|
24
|
-
- -
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: yard
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.8'
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: "5.4"
|
34
22
|
type: :development
|
23
|
+
version_requirements: *id001
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: yard
|
35
26
|
prerelease: false
|
36
|
-
|
37
|
-
requirements:
|
38
|
-
- -
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '10'
|
27
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: "0.8"
|
48
32
|
type: :development
|
33
|
+
version_requirements: *id002
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
49
36
|
prerelease: false
|
50
|
-
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
|
56
|
-
|
57
|
-
|
37
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: "10"
|
42
|
+
type: :development
|
43
|
+
version_requirements: *id003
|
44
|
+
description: Configurations provides a unified approach to do configurations with the flexibility to do everything from arbitrary configurations to type asserted configurations for your gem or any other ruby code.
|
58
45
|
email: attr_accessor@gmail.com
|
59
46
|
executables: []
|
47
|
+
|
60
48
|
extensions: []
|
49
|
+
|
61
50
|
extra_rdoc_files: []
|
62
|
-
|
63
|
-
|
64
|
-
-
|
51
|
+
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- .travis.yml
|
65
55
|
- Gemfile
|
66
56
|
- License.txt
|
67
57
|
- README.md
|
@@ -78,31 +68,33 @@ files:
|
|
78
68
|
- test/support/testmodules.rb
|
79
69
|
- test/test_helper.rb
|
80
70
|
homepage: http://github.com/beatrichartz/configurations
|
81
|
-
licenses:
|
71
|
+
licenses:
|
82
72
|
- MIT
|
83
73
|
metadata: {}
|
74
|
+
|
84
75
|
post_install_message:
|
85
76
|
rdoc_options: []
|
86
|
-
|
77
|
+
|
78
|
+
require_paths:
|
87
79
|
- lib
|
88
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
-
requirements:
|
90
|
-
- - ">="
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
version: '0'
|
93
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
95
82
|
- - ">="
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version:
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: "0"
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.3.1
|
98
90
|
requirements: []
|
91
|
+
|
99
92
|
rubyforge_project:
|
100
93
|
rubygems_version: 2.2.2
|
101
94
|
signing_key:
|
102
95
|
specification_version: 4
|
103
|
-
summary: Configurations with a configure block from arbitrary to type-restricted for
|
104
|
-
|
105
|
-
test_files:
|
96
|
+
summary: Configurations with a configure block from arbitrary to type-restricted for your gem or other ruby code.
|
97
|
+
test_files:
|
106
98
|
- test/configurations/test_configurable_with_blocks_configuration.rb
|
107
99
|
- test/configurations/test_configuration.rb
|
108
100
|
- test/configurations/test_configuration_methods.rb
|