qonfig 0.18.1 → 0.19.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/.rubocop.yml +1 -0
- data/CHANGELOG.md +14 -0
- data/README.md +233 -34
- data/Rakefile +4 -2
- data/lib/qonfig/command_set.rb +14 -3
- data/lib/qonfig/commands/base.rb +37 -0
- data/lib/qonfig/commands/definition/add_nested_option.rb +3 -0
- data/lib/qonfig/commands/definition/add_option.rb +3 -0
- data/lib/qonfig/commands/definition/compose.rb +3 -0
- data/lib/qonfig/commands/definition/expose_json.rb +3 -0
- data/lib/qonfig/commands/definition/expose_self.rb +3 -0
- data/lib/qonfig/commands/definition/expose_yaml.rb +3 -0
- data/lib/qonfig/commands/definition/load_from_env.rb +3 -0
- data/lib/qonfig/commands/definition/load_from_json.rb +3 -0
- data/lib/qonfig/commands/definition/load_from_self.rb +3 -0
- data/lib/qonfig/commands/definition/load_from_yaml.rb +3 -0
- data/lib/qonfig/commands/instantiation/freeze_state.rb +18 -0
- data/lib/qonfig/commands/instantiation/values_file.rb +3 -0
- data/lib/qonfig/commands/instantiation.rb +1 -0
- data/lib/qonfig/data_set/class_builder.rb +11 -0
- data/lib/qonfig/data_set.rb +44 -16
- data/lib/qonfig/dsl.rb +10 -3
- data/lib/qonfig/errors.rb +24 -5
- data/lib/qonfig/plugins/abstract.rb +30 -1
- data/lib/qonfig/plugins/access_mixin.rb +11 -0
- data/lib/qonfig/plugins/pretty_print/data_set.rb +9 -0
- data/lib/qonfig/plugins/pretty_print/mixin.rb +24 -0
- data/lib/qonfig/plugins/pretty_print.rb +16 -0
- data/lib/qonfig/plugins/registry.rb +21 -0
- data/lib/qonfig/plugins/toml.rb +2 -2
- data/lib/qonfig/plugins.rb +15 -0
- data/lib/qonfig/settings/builder.rb +13 -2
- data/lib/qonfig/settings.rb +75 -8
- data/lib/qonfig/version.rb +1 -1
- data/lib/qonfig.rb +2 -0
- data/qonfig.gemspec +1 -1
- metadata +12 -2
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.19.0
|
5
|
+
class Qonfig::Commands::Instantiation::FreezeState < Qonfig::Commands::Base
|
6
|
+
# @since 0.19.0
|
7
|
+
self.inheritable = false
|
8
|
+
|
9
|
+
# @param data_set [Qonfig::DataSet]
|
10
|
+
# @param settings [Qonfig::Settings]
|
11
|
+
# @return [void]
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
# @since 0.19.0
|
15
|
+
def call(data_set, settings)
|
16
|
+
settings.__freeze__
|
17
|
+
end
|
18
|
+
end
|
@@ -23,5 +23,16 @@ module Qonfig::DataSet::ClassBuilder
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
# @option base_klass [Class<Qonfig::DataSet>]
|
28
|
+
# @option child_klass [Class<Qonfig::DataSet>]
|
29
|
+
# @return [void]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
# @since 0.19.0
|
33
|
+
def inherit(base_klass:, child_klass:)
|
34
|
+
child_klass.definition_commands.concat(base_klass.definition_commands)
|
35
|
+
child_klass.instance_commands.concat(base_klass.instance_commands, &:inheritable?)
|
36
|
+
end
|
26
37
|
end
|
27
38
|
end
|
data/lib/qonfig/data_set.rb
CHANGED
@@ -26,6 +26,18 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
26
26
|
|
27
27
|
Class.new(base_dataset_klass, &config_klass_definitions).new
|
28
28
|
end
|
29
|
+
|
30
|
+
# @param configurations [Hash<Symbol|String,Any>]
|
31
|
+
# @return [Boolean]
|
32
|
+
#
|
33
|
+
# @api public
|
34
|
+
# @since 0.19.0
|
35
|
+
def valid_with?(configurations = {})
|
36
|
+
new(configurations)
|
37
|
+
true
|
38
|
+
rescue Qonfig::ValidationError
|
39
|
+
false
|
40
|
+
end
|
29
41
|
end
|
30
42
|
|
31
43
|
# @return [Qonfig::Settings]
|
@@ -302,6 +314,26 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
302
314
|
thread_safe_access { validator.valid? }
|
303
315
|
end
|
304
316
|
|
317
|
+
# @param configurations [Hash<String,Symbol|Any>]
|
318
|
+
# @return [Boolean]
|
319
|
+
#
|
320
|
+
# @api public
|
321
|
+
# @since 0.19.0
|
322
|
+
def valid_with?(configurations = {})
|
323
|
+
# NOTE:
|
324
|
+
# 'dup.configure(configurations)' has better thread-safety than 'with(configurations)'
|
325
|
+
# pros:
|
326
|
+
# - no arbitrary lock is obtained;
|
327
|
+
# - all threads can read and work :)
|
328
|
+
# cons:
|
329
|
+
# - useless ton of objects (new dataset, new settings, new locks, and etc);
|
330
|
+
# - useless setting options assignment steps (self.dup + self.to_h + configure(to_h))
|
331
|
+
dup.configure(configurations)
|
332
|
+
true
|
333
|
+
rescue Qonfig::ValidationError
|
334
|
+
false
|
335
|
+
end
|
336
|
+
|
305
337
|
# @return [void]
|
306
338
|
#
|
307
339
|
# @api public
|
@@ -405,9 +437,11 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
405
437
|
#
|
406
438
|
# @api private
|
407
439
|
# @since 0.2.0
|
440
|
+
# @version 0.19.0
|
408
441
|
def build_settings
|
409
|
-
@settings = Qonfig::Settings::Builder.
|
442
|
+
@settings = Qonfig::Settings::Builder.build_definitions(self)
|
410
443
|
validator.validate!
|
444
|
+
Qonfig::Settings::Builder.build_state(self)
|
411
445
|
end
|
412
446
|
|
413
447
|
# @return [void]
|
@@ -429,16 +463,6 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
429
463
|
yield(settings) if block_given?
|
430
464
|
end
|
431
465
|
|
432
|
-
# @return [void]
|
433
|
-
#
|
434
|
-
# @api private
|
435
|
-
# @since 0.17.0
|
436
|
-
def call_instance_management_commands
|
437
|
-
self.class.instance_commands.each do |instance_command|
|
438
|
-
instance_command.call(self, settings)
|
439
|
-
end
|
440
|
-
end
|
441
|
-
|
442
466
|
# @param settings_map [Hash]
|
443
467
|
# @param configurations [Proc]
|
444
468
|
# @return [void]
|
@@ -448,7 +472,6 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
448
472
|
def load!(settings_map = {}, &configurations)
|
449
473
|
build_validator
|
450
474
|
build_settings
|
451
|
-
call_instance_management_commands
|
452
475
|
apply_settings(settings_map, &configurations)
|
453
476
|
end
|
454
477
|
|
@@ -475,8 +498,8 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
475
498
|
).call(self, settings)
|
476
499
|
end
|
477
500
|
|
478
|
-
# @param instructions [
|
479
|
-
# @return [
|
501
|
+
# @param instructions [Block]
|
502
|
+
# @return [Any]
|
480
503
|
#
|
481
504
|
# @api private
|
482
505
|
# @since 0.2.0
|
@@ -484,8 +507,8 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
484
507
|
@__lock__.thread_safe_access(&instructions)
|
485
508
|
end
|
486
509
|
|
487
|
-
# @param instructions [
|
488
|
-
# @return [
|
510
|
+
# @param instructions [Block]
|
511
|
+
# @return [Any]
|
489
512
|
#
|
490
513
|
# @api private
|
491
514
|
# @since 0.2.0
|
@@ -493,6 +516,11 @@ class Qonfig::DataSet # rubocop:disable Metrics/ClassLength
|
|
493
516
|
@__lock__.thread_safe_definition(&instructions)
|
494
517
|
end
|
495
518
|
|
519
|
+
# @param instructions [Block]
|
520
|
+
# @return [Any]
|
521
|
+
#
|
522
|
+
# @api priavte
|
523
|
+
# @since 0.17.0
|
496
524
|
def with_arbitary_access(&instructions)
|
497
525
|
@__lock__.with_arbitary_access(&instructions)
|
498
526
|
end
|
data/lib/qonfig/dsl.rb
CHANGED
@@ -9,6 +9,7 @@ module Qonfig::DSL
|
|
9
9
|
#
|
10
10
|
# @api private
|
11
11
|
# @since 0.1.0
|
12
|
+
# @version 0.19.0
|
12
13
|
def extended(child_klass)
|
13
14
|
child_klass.instance_variable_set(:@definition_commands, Qonfig::CommandSet.new)
|
14
15
|
child_klass.instance_variable_set(:@instance_commands, Qonfig::CommandSet.new)
|
@@ -17,9 +18,7 @@ module Qonfig::DSL
|
|
17
18
|
def inherited(child_klass)
|
18
19
|
child_klass.instance_variable_set(:@definition_commands, Qonfig::CommandSet.new)
|
19
20
|
child_klass.instance_variable_set(:@instance_commands, Qonfig::CommandSet.new)
|
20
|
-
|
21
|
-
child_klass.definition_commands.concat(definition_commands)
|
22
|
-
child_klass.instance_commands.concat(instance_commands)
|
21
|
+
Qonfig::DataSet::ClassBuilder.inherit(base_klass: self, child_klass: child_klass)
|
23
22
|
super
|
24
23
|
end
|
25
24
|
end)
|
@@ -183,4 +182,12 @@ module Qonfig::DSL
|
|
183
182
|
file_path, caller_location, format: format, strict: strict, expose: expose
|
184
183
|
)
|
185
184
|
end
|
185
|
+
|
186
|
+
# @return [void]
|
187
|
+
#
|
188
|
+
# @api public
|
189
|
+
# @since 0.19.0
|
190
|
+
def freeze_state!
|
191
|
+
instance_commands << Qonfig::Commands::Instantiation::FreezeState.new
|
192
|
+
end
|
186
193
|
end
|
data/lib/qonfig/errors.rb
CHANGED
@@ -9,10 +9,18 @@ module Qonfig
|
|
9
9
|
# @since 0.1.0
|
10
10
|
ArgumentError = Class.new(ArgumentError)
|
11
11
|
|
12
|
+
# @see Qonfig::Validator::Builder::AttributeConsistency
|
13
|
+
# @see Qonfig::Validator::Predefined::Registry
|
14
|
+
#
|
12
15
|
# @api public
|
13
16
|
# @since 0.13.0
|
14
17
|
ValidatorArgumentError = Class.new(ArgumentError)
|
15
18
|
|
19
|
+
# @see Qonfig::Validator
|
20
|
+
# @see Qonfig::Validator::MethodBased
|
21
|
+
# @see Qonfig::Validator::ProcBased
|
22
|
+
# @see Qonfig::Validator::Predefined::Common
|
23
|
+
#
|
16
24
|
# @api public
|
17
25
|
# @since 0.13.0
|
18
26
|
ValidationError = Class.new(Error)
|
@@ -39,6 +47,12 @@ module Qonfig
|
|
39
47
|
# @since 0.1.0
|
40
48
|
UnknownSettingError = Class.new(Error)
|
41
49
|
|
50
|
+
# @see Qonfig::Settings
|
51
|
+
#
|
52
|
+
# @api private
|
53
|
+
# @since 0.19.0
|
54
|
+
StrangeThingsError = Class.new(Error)
|
55
|
+
|
42
56
|
# @see Qonfig::Settings
|
43
57
|
#
|
44
58
|
# @api public
|
@@ -54,12 +68,9 @@ module Qonfig
|
|
54
68
|
# @since 0.2.0
|
55
69
|
CoreMethodIntersectionError = Class.new(Error)
|
56
70
|
|
57
|
-
# @see Qonfig::Settings
|
58
|
-
# @see Qonfig::DataSet
|
59
|
-
#
|
60
71
|
# @api public
|
61
|
-
# @since 0.
|
62
|
-
|
72
|
+
# @since 0.19.0
|
73
|
+
FrozenError = begin # rubocop:disable Naming/ConstantName
|
63
74
|
# :nocov:
|
64
75
|
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
|
65
76
|
Class.new(::FrozenError)
|
@@ -69,6 +80,14 @@ module Qonfig
|
|
69
80
|
# :nocov:
|
70
81
|
end
|
71
82
|
|
83
|
+
# @see Qonfig::Settings
|
84
|
+
# @see Qonfig::DataSet
|
85
|
+
#
|
86
|
+
# @api public
|
87
|
+
# @since 0.1.0
|
88
|
+
# @version 0.19.0
|
89
|
+
FrozenSettingsError = Class.new(FrozenError)
|
90
|
+
|
72
91
|
# @see Qonfig::Commands::Instantiation::ValuesFile
|
73
92
|
#
|
74
93
|
# @api public
|
@@ -4,10 +4,39 @@
|
|
4
4
|
# @since 0.4.0
|
5
5
|
class Qonfig::Plugins::Abstract
|
6
6
|
class << self
|
7
|
+
# @param child_klass [Class]
|
8
|
+
# @return [void]
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
# @since 0.19.0
|
12
|
+
def inherited(child_klass)
|
13
|
+
child_klass.instance_variable_set(:@loaded, false)
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
7
17
|
# @return [void]
|
8
18
|
#
|
9
19
|
# @api private
|
10
20
|
# @since 0.4.0
|
11
|
-
def load
|
21
|
+
def load!
|
22
|
+
@loaded = true
|
23
|
+
install!
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [Boolean]
|
27
|
+
#
|
28
|
+
# @api private
|
29
|
+
# @since 0.19.0
|
30
|
+
def loaded?
|
31
|
+
@loaded
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# @return [void]
|
37
|
+
#
|
38
|
+
# @api private
|
39
|
+
# @since 0.19.0
|
40
|
+
def install!; end
|
12
41
|
end
|
13
42
|
end
|
@@ -13,6 +13,8 @@ module Qonfig::Plugins::AccessMixin
|
|
13
13
|
def plugin(plugin_name)
|
14
14
|
Qonfig::Plugins.load(plugin_name)
|
15
15
|
end
|
16
|
+
alias_method :enable, :plugin
|
17
|
+
alias_method :load, :plugin
|
16
18
|
|
17
19
|
# @return [Array<String>]
|
18
20
|
#
|
@@ -24,6 +26,15 @@ module Qonfig::Plugins::AccessMixin
|
|
24
26
|
Qonfig::Plugins.names
|
25
27
|
end
|
26
28
|
|
29
|
+
# @return [Array<String>]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
# @since 0.19.0
|
33
|
+
def loaded_plugins
|
34
|
+
Qonfig::Plugins.loaded_plugins
|
35
|
+
end
|
36
|
+
alias_method :enabled_plugins, :loaded_plugins
|
37
|
+
|
27
38
|
# @param plugin_name [String, Symbol]
|
28
39
|
# @param plugin_klass [Class<Qonfig::Plugins::Abstract>]
|
29
40
|
# @return [void]
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.19.0
|
5
|
+
module Qonfig::Plugins::PrettyPrint::Mixin
|
6
|
+
# @param pp [?] Suitable for Ruby's PP module
|
7
|
+
# @return [void]
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
# @since 0.19.0
|
11
|
+
def pretty_print(pp)
|
12
|
+
pp.object_address_group(self) do
|
13
|
+
pp.seplist(keys, proc { pp.text(',') }) do |key|
|
14
|
+
pp.breakable(' ')
|
15
|
+
pp.group(1) do
|
16
|
+
pp.text(key)
|
17
|
+
pp.text(':')
|
18
|
+
pp.breakable
|
19
|
+
pp.pp(self[key])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.19.0
|
5
|
+
class Qonfig::Plugins::PrettyPrint < Qonfig::Plugins::Abstract
|
6
|
+
class << self
|
7
|
+
# @return [void]
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
# @since 0.19.0
|
11
|
+
def install!
|
12
|
+
require_relative 'pretty_print/mixin'
|
13
|
+
require_relative 'pretty_print/data_set'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -3,6 +3,9 @@
|
|
3
3
|
# @api private
|
4
4
|
# @since 0.4.0
|
5
5
|
class Qonfig::Plugins::Registry
|
6
|
+
# @since 0.19.0
|
7
|
+
include Enumerable
|
8
|
+
|
6
9
|
# @return [void]
|
7
10
|
#
|
8
11
|
# @api private
|
@@ -40,6 +43,15 @@ class Qonfig::Plugins::Registry
|
|
40
43
|
thread_safe { plugin_names }
|
41
44
|
end
|
42
45
|
|
46
|
+
# @param block [Block]
|
47
|
+
# @return [Enumerable]
|
48
|
+
#
|
49
|
+
# @api private
|
50
|
+
# @since 0.19.0
|
51
|
+
def each(&block)
|
52
|
+
thread_safe { iterate(&block) }
|
53
|
+
end
|
54
|
+
|
43
55
|
private
|
44
56
|
|
45
57
|
# @return [Hash]
|
@@ -70,6 +82,15 @@ class Qonfig::Plugins::Registry
|
|
70
82
|
plugin_set.keys
|
71
83
|
end
|
72
84
|
|
85
|
+
# @param block [Block]
|
86
|
+
# @return [Enumerable]
|
87
|
+
#
|
88
|
+
# @api private
|
89
|
+
# @since 0.19.0
|
90
|
+
def iterate(&block)
|
91
|
+
block_given? ? plugin_set.each_pair(&block) : plugin_set.each_pair
|
92
|
+
end
|
93
|
+
|
73
94
|
# @param plugin_name [String]
|
74
95
|
# @return [Boolean]
|
75
96
|
#
|
data/lib/qonfig/plugins/toml.rb
CHANGED
@@ -7,8 +7,8 @@ class Qonfig::Plugins::TOML < Qonfig::Plugins::Abstract
|
|
7
7
|
# @return [void]
|
8
8
|
#
|
9
9
|
# @api private
|
10
|
-
# @since 0.
|
11
|
-
def
|
10
|
+
# @since 0.19.0
|
11
|
+
def install!
|
12
12
|
raise(
|
13
13
|
Qonfig::UnresolvedPluginDependencyError,
|
14
14
|
'::TomlRB does not exist or "toml-rb" gem is not loaded'
|
data/lib/qonfig/plugins.rb
CHANGED
@@ -7,6 +7,7 @@ module Qonfig::Plugins
|
|
7
7
|
require_relative 'plugins/access_mixin'
|
8
8
|
require_relative 'plugins/abstract'
|
9
9
|
require_relative 'plugins/toml'
|
10
|
+
require_relative 'plugins/pretty_print'
|
10
11
|
|
11
12
|
# @since 0.4.0
|
12
13
|
@plugin_registry = Registry.new
|
@@ -23,6 +24,20 @@ module Qonfig::Plugins
|
|
23
24
|
thread_safe { plugin_registry[plugin_name].load! }
|
24
25
|
end
|
25
26
|
|
27
|
+
# @return [Array<String>]
|
28
|
+
#
|
29
|
+
# @api public
|
30
|
+
# @since 0.19.0
|
31
|
+
def loaded_plugins
|
32
|
+
thread_safe do
|
33
|
+
plugin_registry.select do |_plugin_name, plugin_module|
|
34
|
+
plugin_module.loaded?
|
35
|
+
end.map do |plugin_name, _plugin_module|
|
36
|
+
plugin_name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
26
41
|
# @return [Array<String>]
|
27
42
|
#
|
28
43
|
# @api public
|
@@ -8,8 +8,8 @@ module Qonfig::Settings::Builder
|
|
8
8
|
# @return [Qonfig::Settings]
|
9
9
|
#
|
10
10
|
# @api private
|
11
|
-
# @since 0.
|
12
|
-
def
|
11
|
+
# @since 0.19.0
|
12
|
+
def build_definitions(data_set)
|
13
13
|
Qonfig::Settings.new(build_mutation_callbacks(data_set)).tap do |settings|
|
14
14
|
data_set.class.definition_commands.dup.each do |command|
|
15
15
|
command.call(data_set, settings)
|
@@ -17,6 +17,17 @@ module Qonfig::Settings::Builder
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
# @param data_set [Qonfig::DataSet]
|
21
|
+
# @return [void]
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
# @since 0.19.0
|
25
|
+
def build_state(data_set)
|
26
|
+
data_set.class.instance_commands.dup.each do |command|
|
27
|
+
command.call(data_set, data_set.settings)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
20
31
|
private
|
21
32
|
|
22
33
|
# @param data_set [Qonfig::DataSet]
|
data/lib/qonfig/settings.rb
CHANGED
@@ -22,6 +22,12 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
22
22
|
# @since 0.11.0
|
23
23
|
BASIC_SETTING_VALUE_TRANSFORMER = (proc { |value| value }).freeze
|
24
24
|
|
25
|
+
# @return [String]
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
# @since 0.19.0
|
29
|
+
DOT_NOTATION_SEPARATOR = '.'
|
30
|
+
|
25
31
|
# @return [Hash]
|
26
32
|
#
|
27
33
|
# @api private
|
@@ -128,7 +134,13 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
128
134
|
# @api public
|
129
135
|
# @since 0.1.0
|
130
136
|
def [](key)
|
131
|
-
__lock__.thread_safe_access
|
137
|
+
__lock__.thread_safe_access do
|
138
|
+
begin
|
139
|
+
__get_value__(key)
|
140
|
+
rescue Qonfig::UnknownSettingError
|
141
|
+
__deep_access__(*__parse_dot_notated_key__(key))
|
142
|
+
end
|
143
|
+
end
|
132
144
|
end
|
133
145
|
|
134
146
|
# @param key [String, Symbol]
|
@@ -156,7 +168,17 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
156
168
|
# @api private
|
157
169
|
# @since 0.2.0
|
158
170
|
def __dig__(*keys)
|
159
|
-
__lock__.thread_safe_access
|
171
|
+
__lock__.thread_safe_access do
|
172
|
+
begin
|
173
|
+
__deep_access__(*keys)
|
174
|
+
rescue Qonfig::UnknownSettingError
|
175
|
+
if keys.size == 1
|
176
|
+
__deep_access__(*__parse_dot_notated_key__(keys.first))
|
177
|
+
else
|
178
|
+
raise
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
160
182
|
end
|
161
183
|
|
162
184
|
# @param keys [Array<String, Symbol>]
|
@@ -342,7 +364,16 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
342
364
|
# @api private
|
343
365
|
# @since 0.17.0
|
344
366
|
def __is_key_exists__(*key_path)
|
345
|
-
|
367
|
+
begin
|
368
|
+
__deep_access__(*key_path)
|
369
|
+
rescue Qonfig::UnknownSettingError
|
370
|
+
if key_path.size == 1
|
371
|
+
__deep_access__(*__parse_dot_notated_key__(key_path.first))
|
372
|
+
else
|
373
|
+
raise
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
346
377
|
true
|
347
378
|
rescue Qonfig::UnknownSettingError
|
348
379
|
false
|
@@ -526,9 +557,21 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
526
557
|
# @since 0.9.0
|
527
558
|
def __deep_slice__(*keys)
|
528
559
|
{}.tap do |result|
|
529
|
-
|
530
|
-
|
531
|
-
|
560
|
+
begin
|
561
|
+
__deep_access__(*keys).tap do |setting|
|
562
|
+
required_key = __indifferently_accessable_option_key__(keys.last)
|
563
|
+
result[required_key] = __is_a_setting__(setting) ? setting.__to_h__ : setting
|
564
|
+
end
|
565
|
+
rescue Qonfig::UnknownSettingError
|
566
|
+
if keys.size == 1
|
567
|
+
key_set = __parse_dot_notated_key__(keys.first)
|
568
|
+
__deep_access__(*key_set).tap do |setting|
|
569
|
+
required_key = __indifferently_accessable_option_key__(key_set.last)
|
570
|
+
result[required_key] = __is_a_setting__(setting) ? setting.__to_h__ : setting
|
571
|
+
end
|
572
|
+
else
|
573
|
+
raise
|
574
|
+
end
|
532
575
|
end
|
533
576
|
end
|
534
577
|
end
|
@@ -543,7 +586,22 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
543
586
|
# @since 0.1.0
|
544
587
|
def __deep_slice_value__(*keys)
|
545
588
|
required_key = __indifferently_accessable_option_key__(keys.last)
|
546
|
-
__deep_slice__(*keys)
|
589
|
+
sliced_data = __deep_slice__(*keys)
|
590
|
+
|
591
|
+
case
|
592
|
+
when sliced_data.key?(required_key)
|
593
|
+
sliced_data[required_key]
|
594
|
+
when keys.size == 1
|
595
|
+
required_key = __parse_dot_notated_key__(required_key).last
|
596
|
+
sliced_data[required_key]
|
597
|
+
else # NOTE: possibly unreachable code
|
598
|
+
# :nocov:
|
599
|
+
raise(
|
600
|
+
Qonfig::StrangeThingsError,
|
601
|
+
"Strange things happpens with #{keys} keyset and value slicing"
|
602
|
+
)
|
603
|
+
# :nocov:
|
604
|
+
end
|
547
605
|
end
|
548
606
|
|
549
607
|
# @param keys [Array<String, Symbol, Array<String, Symbol>>]
|
@@ -662,6 +720,15 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
662
720
|
KeyGuard.new(key).prevent_core_method_intersection!
|
663
721
|
end
|
664
722
|
|
723
|
+
# @param key [String, Symbol]
|
724
|
+
# @return [Array<String>]
|
725
|
+
#
|
726
|
+
# @api private
|
727
|
+
# @since 0.19.0
|
728
|
+
def __parse_dot_notated_key__(key)
|
729
|
+
__indifferently_accessable_option_key__(key).split(DOT_NOTATION_SEPARATOR)
|
730
|
+
end
|
731
|
+
|
665
732
|
# @return [Array<String>]
|
666
733
|
#
|
667
734
|
# @api private
|
@@ -669,7 +736,7 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
|
|
669
736
|
CORE_METHODS = Array(
|
670
737
|
instance_methods(false) |
|
671
738
|
private_instance_methods(false) |
|
672
|
-
%i[super define_singleton_method self]
|
739
|
+
%i[super define_singleton_method self is_a?]
|
673
740
|
).map(&:to_s).freeze
|
674
741
|
end
|
675
742
|
# rubocop:enable Metrics/ClassLength, Layout/ClassStructure
|
data/lib/qonfig/version.rb
CHANGED
data/lib/qonfig.rb
CHANGED
data/qonfig.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency 'coveralls', '~> 0.8'
|
33
33
|
spec.add_development_dependency 'simplecov', '~> 0.16'
|
34
34
|
spec.add_development_dependency 'rspec', '~> 3.8'
|
35
|
-
spec.add_development_dependency 'armitage-rubocop', '~> 0.76'
|
35
|
+
spec.add_development_dependency 'armitage-rubocop', '~> 0.76', '>= 0.76.0.3'
|
36
36
|
|
37
37
|
spec.add_development_dependency 'bundler'
|
38
38
|
spec.add_development_dependency 'rake'
|