qonfig 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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +8 -0
- data/README.md +24 -6
- data/lib/qonfig/configurable.rb +6 -4
- data/lib/qonfig/data_set.rb +15 -8
- data/lib/qonfig/settings.rb +66 -14
- data/lib/qonfig/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29fa558caa3bd1f96663617174ba854aaf286cf17a08433c8fb4a497fde1d702
|
4
|
+
data.tar.gz: 6f3ad5c3bd5c4e6ca9b81897c11cb8a8edf208d50e86238ade40ccab99832e36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0aa25942d38b95a2af5f432af94bd642d8b7074e35f4a53f31b987dab409f3a274853b76eb42fe72f2ca171336e2907eb06309c00062ab3fb188ad1d268c775e
|
7
|
+
data.tar.gz: c7870403e266a21f837bd4789b5a7df74bc06e165a78f4155fb707a4083c165c144ba19e2764610efd3aef802ef0644dfc932abf89be63a7c7553596b495010d
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [0.3.0] - 2018-06-13
|
5
|
+
### Added
|
6
|
+
- Improved configuration process: `#configure` can take a hash as a configuration `[option key => option]`
|
7
|
+
map of values;
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
- `#clear!` causes `Qonfig::FrozenSettingsError` if config object is frozen;
|
11
|
+
|
4
12
|
## [0.2.0] - 2018-06-07
|
5
13
|
### Added
|
6
14
|
- Instant configuration via block `config = Config.new { |conf| <<your configuration code>> }`;
|
data/README.md
CHANGED
@@ -26,9 +26,9 @@ require 'qonfig'
|
|
26
26
|
- [Inheritance](#inheritance)
|
27
27
|
- [Composition](#composition)
|
28
28
|
- [Hash representation](#hash-representation)
|
29
|
-
- [State freeze](#state-freeze)
|
30
29
|
- [Config reloading](#config-reloading) (reload config definitions and option values)
|
31
30
|
- [Clear options](#clear-options) (set to nil)
|
31
|
+
- [State freeze](#state-freeze)
|
32
32
|
- [Settings as Predicates](#settings-as-predicates)
|
33
33
|
- [Load from YAML file](#load-from-yaml-file)
|
34
34
|
- [Load from ENV](#load-from-env)
|
@@ -131,6 +131,23 @@ config = Config.new do |conf|
|
|
131
131
|
conf.geo_api.provider = :amazon_maps
|
132
132
|
conf.testing.engine = :crypto_test
|
133
133
|
end
|
134
|
+
|
135
|
+
# using a hash
|
136
|
+
config = Config.new(
|
137
|
+
testing: { engine: :mini_test, parallel: false },
|
138
|
+
geo_api: { provider: :rambler_maps },
|
139
|
+
enable_middlewares: true
|
140
|
+
)
|
141
|
+
config.configure(enable_middlewares: false)
|
142
|
+
|
143
|
+
# using both hash and proc (proc has higher priority)
|
144
|
+
config = Config.new(enable_middlewares: true) do |conf|
|
145
|
+
conf.testing.parallel = true
|
146
|
+
end
|
147
|
+
|
148
|
+
config.configure(geo_api: { provider: nil }) do |conf|
|
149
|
+
conf.testing.engine = :rspec
|
150
|
+
end
|
134
151
|
```
|
135
152
|
|
136
153
|
---
|
@@ -272,11 +289,11 @@ config.settings.logger # => #<Logger:0x00007ff9> (reloaded from defaults)
|
|
272
289
|
config.settings.enable_api # => false (new setting)
|
273
290
|
|
274
291
|
# reload with instant configuration
|
275
|
-
config.reload! do |conf|
|
292
|
+
config.reload!(db: { adapter: 'oracle' }) do |conf|
|
276
293
|
conf.enable_api = true # changed instantly
|
277
294
|
end
|
278
295
|
|
279
|
-
config.settings.db.adapter # => '
|
296
|
+
config.settings.db.adapter # => 'oracle'
|
280
297
|
config.settings.logger = # => #<Logger:0x00007ff9>
|
281
298
|
config.settings.enable_api # => true # value from instant change
|
282
299
|
```
|
@@ -337,6 +354,7 @@ config.settings.worker = :que # => Qonfig::FrozenSettingsError
|
|
337
354
|
config.settings.db.adapter = 'mongoid' # => Qonfig::FrozenSettingsError
|
338
355
|
|
339
356
|
config.reload! # => Qonfig::FrozenSettingsError
|
357
|
+
config.clear! # => Qonfig::FrozenSettingsError
|
340
358
|
```
|
341
359
|
|
342
360
|
---
|
@@ -441,7 +459,7 @@ config.settings.ruby.platform # => 'x86_64-darwin17'
|
|
441
459
|
# --- strict mode ---
|
442
460
|
class Config < Qonfig::DataSet
|
443
461
|
setting :nonexistent_yaml do
|
444
|
-
load_from_yaml '
|
462
|
+
load_from_yaml 'nonexistent_yaml.yml', strict: true # true by default
|
445
463
|
end
|
446
464
|
|
447
465
|
setting :another_key
|
@@ -452,7 +470,7 @@ Config.new # => Qonfig::FileNotFoundError
|
|
452
470
|
# --- non-strict mode ---
|
453
471
|
class Config < Qonfig::DataSet
|
454
472
|
settings :nonexistent_yaml do
|
455
|
-
load_from_yaml '
|
473
|
+
load_from_yaml 'nonexistent_yaml.yml', strict: false
|
456
474
|
end
|
457
475
|
|
458
476
|
setting :another_key
|
@@ -539,7 +557,7 @@ config.settings['RUN_CI'] # => '1'
|
|
539
557
|
class Config < Qonfig::DataSet
|
540
558
|
load_from_self # on the root
|
541
559
|
|
542
|
-
setting :
|
560
|
+
setting :nested do
|
543
561
|
load_from_self # nested
|
544
562
|
end
|
545
563
|
end
|
data/lib/qonfig/configurable.rb
CHANGED
@@ -58,14 +58,15 @@ module Qonfig
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
# @param options_map [Hash]
|
61
62
|
# @param block [Proc]
|
62
63
|
# @return [void]
|
63
64
|
#
|
64
65
|
# @api public
|
65
66
|
# @since 0.2.0
|
66
|
-
def configure(&block)
|
67
|
+
def configure(options_map = {}, &block)
|
67
68
|
@__qonfig_access_lock__.synchronize do
|
68
|
-
config.configure(&block)
|
69
|
+
config.configure(options_map, &block)
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
@@ -93,14 +94,15 @@ module Qonfig
|
|
93
94
|
end
|
94
95
|
end
|
95
96
|
|
97
|
+
# @param options_map [Hash]
|
96
98
|
# @param block [Proc]
|
97
99
|
# @return [void]
|
98
100
|
#
|
99
101
|
# @api public
|
100
102
|
# @since 0.2.0
|
101
|
-
def configure(&block)
|
103
|
+
def configure(options_map = {}, &block)
|
102
104
|
self.class.instance_variable_get(:@__qonfig_access_lock__).synchronize do
|
103
|
-
config.configure(&block)
|
105
|
+
config.configure(options_map, &block)
|
104
106
|
end
|
105
107
|
end
|
106
108
|
end
|
data/lib/qonfig/data_set.rb
CHANGED
@@ -13,15 +13,16 @@ module Qonfig
|
|
13
13
|
# @since 0.1.0
|
14
14
|
attr_reader :settings
|
15
15
|
|
16
|
+
# @param options_map [Hash]
|
16
17
|
# @param configurations [Proc]
|
17
18
|
#
|
18
19
|
# @api public
|
19
20
|
# @since 0.1.0
|
20
|
-
def initialize(&configurations)
|
21
|
+
def initialize(options_map = {}, &configurations)
|
21
22
|
@__access_lock__ = Mutex.new
|
22
23
|
@__definition_lock__ = Mutex.new
|
23
24
|
|
24
|
-
thread_safe_definition { load!(&configurations) }
|
25
|
+
thread_safe_definition { load!(options_map, &configurations) }
|
25
26
|
end
|
26
27
|
|
27
28
|
# @return [void]
|
@@ -40,6 +41,7 @@ module Qonfig
|
|
40
41
|
thread_safe_access { settings.__is_frozen__ }
|
41
42
|
end
|
42
43
|
|
44
|
+
# @param options_map [Hash]
|
43
45
|
# @param configurations [Proc]
|
44
46
|
# @return [void]
|
45
47
|
#
|
@@ -47,19 +49,23 @@ module Qonfig
|
|
47
49
|
#
|
48
50
|
# @api public
|
49
51
|
# @since 0.2.0
|
50
|
-
def reload!(&configurations)
|
52
|
+
def reload!(options_map = {}, &configurations)
|
51
53
|
thread_safe_definition do
|
52
54
|
raise Qonfig::FrozenSettingsError, 'Frozen config can not be reloaded' if frozen?
|
53
|
-
load!(&configurations)
|
55
|
+
load!(options_map, &configurations)
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
59
|
+
# @param options_map [Hash]
|
57
60
|
# @return [void]
|
58
61
|
#
|
59
62
|
# @api public
|
60
63
|
# @since 0.1.0
|
61
|
-
def configure
|
62
|
-
thread_safe_access
|
64
|
+
def configure(options_map = {})
|
65
|
+
thread_safe_access do
|
66
|
+
settings.__apply_values__(options_map)
|
67
|
+
yield(settings) if block_given?
|
68
|
+
end
|
63
69
|
end
|
64
70
|
|
65
71
|
# @return [Hash]
|
@@ -107,14 +113,15 @@ module Qonfig
|
|
107
113
|
Qonfig::Settings::Builder.build(self.class.commands.dup)
|
108
114
|
end
|
109
115
|
|
116
|
+
# @param options_map [Hash]
|
110
117
|
# @param configurations [Proc]
|
111
118
|
# @return [void]
|
112
119
|
#
|
113
120
|
# @api private
|
114
121
|
# @since 0.2.0
|
115
|
-
def load!(&configurations)
|
122
|
+
def load!(options_map = {}, &configurations)
|
116
123
|
@settings = build_settings
|
117
|
-
configure(&configurations)
|
124
|
+
configure(options_map, &configurations)
|
118
125
|
end
|
119
126
|
|
120
127
|
# @param instructions [Proc]
|
data/lib/qonfig/settings.rb
CHANGED
@@ -76,6 +76,15 @@ module Qonfig
|
|
76
76
|
__lock__.thread_safe_access { __set_value__(key, value) }
|
77
77
|
end
|
78
78
|
|
79
|
+
# @param options_map [Hash]
|
80
|
+
# @return [void]
|
81
|
+
#
|
82
|
+
# @api private
|
83
|
+
# @since 0.3.0
|
84
|
+
def __apply_values__(options_map)
|
85
|
+
__lock__.thread_safe_access { __set_values_from_map__(options_map) }
|
86
|
+
end
|
87
|
+
|
79
88
|
# @param keys [Array<String, Symbol>]
|
80
89
|
# @return [Object]
|
81
90
|
#
|
@@ -114,7 +123,7 @@ module Qonfig
|
|
114
123
|
def method_missing(method_name, *arguments, &block)
|
115
124
|
super
|
116
125
|
rescue NoMethodError
|
117
|
-
raise
|
126
|
+
::Kernel.raise(Qonfig::UnknownSettingError, "Setting with <#{method_name}> key doesnt exist!")
|
118
127
|
end
|
119
128
|
|
120
129
|
# @return [Boolean]
|
@@ -151,11 +160,54 @@ module Qonfig
|
|
151
160
|
|
152
161
|
private
|
153
162
|
|
163
|
+
# @return [Qonfig::Settings::Lock]
|
164
|
+
#
|
165
|
+
# @api private
|
166
|
+
# @since 0.2.0
|
167
|
+
attr_reader :__lock__
|
168
|
+
|
169
|
+
# @param options_map [Hash]
|
154
170
|
# @return [void]
|
155
171
|
#
|
172
|
+
# @raise [Qonfig::ArgumentError]
|
173
|
+
# @raise [Qonfig::AmbiguousSettingValueError]
|
174
|
+
#
|
175
|
+
# @api private
|
176
|
+
# @since 0.3.0
|
177
|
+
def __set_values_from_map__(options_map)
|
178
|
+
::Kernel.raise(
|
179
|
+
Qonfig::ArgumentError, 'Options map should be represented as a hash'
|
180
|
+
) unless options_map.is_a?(Hash)
|
181
|
+
|
182
|
+
options_map.each_pair do |key, value|
|
183
|
+
current_value = __get_value__(key)
|
184
|
+
|
185
|
+
# NOTE: some duplications here was made only for the better code readability
|
186
|
+
case
|
187
|
+
when !current_value.is_a?(Qonfig::Settings)
|
188
|
+
__set_value__(key, value)
|
189
|
+
when current_value.is_a?(Qonfig::Settings) && value.is_a?(Hash)
|
190
|
+
current_value.__apply_values__(value)
|
191
|
+
when current_value.is_a?(Qonfig::Settings) && !value.is_a?(Hash)
|
192
|
+
::Kernel.raise(
|
193
|
+
Qonfig::AmbiguousSettingValueError,
|
194
|
+
"Can not redefine option <#{key}> that contains nested options"
|
195
|
+
)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# @return [void]
|
201
|
+
#
|
202
|
+
# @raise [Qonfig::FrozenSettingsError]
|
203
|
+
#
|
156
204
|
# @api private
|
157
205
|
# @since 0.2.0
|
158
206
|
def __clear_option_values__
|
207
|
+
::Kernel.raise(
|
208
|
+
Qonfig::FrozenSettingsError, 'Can not modify frozen settings'
|
209
|
+
) if __options__.frozen?
|
210
|
+
|
159
211
|
__options__.each_pair do |key, value|
|
160
212
|
if value.is_a?(Qonfig::Settings)
|
161
213
|
value.__clear__
|
@@ -176,7 +228,7 @@ module Qonfig
|
|
176
228
|
key = __indifferently_accessable_option_key__(key)
|
177
229
|
|
178
230
|
unless __options__.key?(key)
|
179
|
-
raise
|
231
|
+
::Kernel.raise(Qonfig::UnknownSettingError, "Setting with <#{key}> key does not exist!")
|
180
232
|
end
|
181
233
|
|
182
234
|
__options__[key]
|
@@ -196,15 +248,18 @@ module Qonfig
|
|
196
248
|
key = __indifferently_accessable_option_key__(key)
|
197
249
|
|
198
250
|
unless __options__.key?(key)
|
199
|
-
raise
|
251
|
+
::Kernel.raise(Qonfig::UnknownSettingError, "Setting with <#{key}> key does not exist!")
|
200
252
|
end
|
201
253
|
|
202
254
|
if __options__.frozen?
|
203
|
-
raise
|
255
|
+
::Kernel.raise(Qonfig::FrozenSettingsError, 'Can not modify frozen settings')
|
204
256
|
end
|
205
257
|
|
206
258
|
if __options__[key].is_a?(Qonfig::Settings)
|
207
|
-
raise
|
259
|
+
::Kernel.raise(
|
260
|
+
Qonfig::AmbiguousSettingValueError,
|
261
|
+
"Can not redefine option <#{key}> that contains nested options"
|
262
|
+
)
|
208
263
|
end
|
209
264
|
|
210
265
|
__options__[key] = value
|
@@ -220,7 +275,7 @@ module Qonfig
|
|
220
275
|
# @api private
|
221
276
|
# @since 0.2.0
|
222
277
|
def __deep_access__(*keys)
|
223
|
-
raise
|
278
|
+
::Kernel.raise(Qonfig::ArgumentError, 'Key list can not be empty') if keys.empty?
|
224
279
|
|
225
280
|
result = __get_value__(keys.first)
|
226
281
|
rest_keys = Array(keys[1..-1])
|
@@ -229,18 +284,15 @@ module Qonfig
|
|
229
284
|
when rest_keys.empty?
|
230
285
|
result
|
231
286
|
when !result.is_a?(Qonfig::Settings)
|
232
|
-
raise(
|
287
|
+
::Kernel.raise(
|
288
|
+
Qonfig::UnknownSettingError,
|
289
|
+
'Setting with required digging sequence does not exist!'
|
290
|
+
)
|
233
291
|
when result.is_a?(Qonfig::Settings)
|
234
292
|
result.__dig__(*rest_keys)
|
235
293
|
end
|
236
294
|
end
|
237
295
|
|
238
|
-
# @return [Qonfig::Settings::Lock]
|
239
|
-
#
|
240
|
-
# @api private
|
241
|
-
# @since 0.2.0
|
242
|
-
attr_reader :__lock__
|
243
|
-
|
244
296
|
# @param options_part [Hash]
|
245
297
|
# @return [Hash]
|
246
298
|
#
|
@@ -310,7 +362,7 @@ module Qonfig
|
|
310
362
|
CORE_METHODS = Array(
|
311
363
|
instance_methods(false) |
|
312
364
|
private_instance_methods(false) |
|
313
|
-
%i[super
|
365
|
+
%i[super define_singleton_method self]
|
314
366
|
).map(&:to_s).freeze
|
315
367
|
end
|
316
368
|
|
data/lib/qonfig/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qonfig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rustam Ibragimov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coveralls
|