qonfig 0.20.0 → 0.21.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.
@@ -21,7 +21,7 @@ class Qonfig::Loaders::Basic
21
21
  nil # NOTE: consciously return nil (for clarity)
22
22
  end
23
23
 
24
- # @param file_path [String]
24
+ # @param file_path [String, Pathname]
25
25
  # @option fail_on_unexist [Boolean]
26
26
  # @return [Object]
27
27
  #
@@ -8,9 +8,12 @@ class Qonfig::Plugins::PrettyPrint < Qonfig::Plugins::Abstract
8
8
  #
9
9
  # @api private
10
10
  # @since 0.19.0
11
+ # @version 0.21.0
11
12
  def install!
12
13
  require_relative 'pretty_print/mixin'
13
14
  require_relative 'pretty_print/data_set'
15
+ require_relative 'pretty_print/settings'
16
+ require_relative 'pretty_print/compacted'
14
17
  end
15
18
  end
16
19
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.21.0
5
+ class Qonfig::Compacted
6
+ # @api private
7
+ # @since 0.21.0
8
+ include ::Qonfig::Plugins::PrettyPrint::CompactedConfigMixin
9
+ end
@@ -2,8 +2,9 @@
2
2
 
3
3
  # @api public
4
4
  # @since 0.19.0
5
+ # @version 0.21.0
5
6
  class Qonfig::DataSet
6
7
  # @api public
7
- # @since 0.19.0
8
- include Qonfig::Plugins::PrettyPrint::Mixin
8
+ # @since 0.21.0
9
+ include Qonfig::Plugins::PrettyPrint::DataSetMixin
9
10
  end
@@ -2,21 +2,80 @@
2
2
 
3
3
  # @api private
4
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])
5
+ class Qonfig::Plugins::PrettyPrint
6
+ # @api private
7
+ # @since 0.21.0
8
+ module DataSetMixin
9
+ # @param pp [?] Suitable for Ruby's PP module
10
+ # @return [void]
11
+ #
12
+ # @api public
13
+ # @since 0.19.0
14
+ def pretty_print(pp)
15
+ pp.object_address_group(self) do
16
+ pp.seplist(keys, proc { pp.text(',') }) do |key|
17
+ pp.breakable(' ')
18
+ pp.group(1) do
19
+ pp.text(key)
20
+ pp.text(':')
21
+ pp.breakable
22
+ pp.pp(self[key])
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ # @api private
30
+ # @since 0.21.0
31
+ module CompactedConfigMixin
32
+ # @param pp [?] Suitable for Ruby's PP module
33
+ # @return [void]
34
+ #
35
+ # @api public
36
+ # @since 0.21.0
37
+ def pretty_print(pp)
38
+ pp.object_address_group(self) do
39
+ pp.seplist(@____data_set____.keys, ::Kernel.proc { pp.text(',') }) do |key|
40
+ pp.breakable(' ')
41
+ pp.group(1) do
42
+ pp.text(key)
43
+ pp.text(':')
44
+ pp.breakable
45
+ pp.pp(@____data_set____[key])
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ # @return [Integer]
52
+ #
53
+ # @see Object#object_id
54
+ # @see BasicObject#__id__
55
+ #
56
+ # @api public
57
+ # @since 0.21.0
58
+ alias_method :object_id, :__id__
59
+ end
60
+
61
+ # @api private
62
+ # @since 0.21.0
63
+ module SettingsMixin
64
+ # @param pp [?] Suitable for Ruby's PP module
65
+ # @return [void]
66
+ #
67
+ # @api public
68
+ # @since 0.21.0
69
+ def pretty_print(pp)
70
+ pp.object_address_group(self) do
71
+ pp.seplist(__keys__, proc { pp.text(',') }) do |key|
72
+ pp.breakable(' ')
73
+ pp.group(1) do
74
+ pp.text(key)
75
+ pp.text(':')
76
+ pp.breakable
77
+ pp.pp(self[key])
78
+ end
20
79
  end
21
80
  end
22
81
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.21.0
5
+ class Qonfig::Settings
6
+ # @api private
7
+ # @since 0.21.0
8
+ include Qonfig::Plugins::PrettyPrint::SettingsMixin
9
+ end
@@ -20,13 +20,15 @@ class Qonfig::DataSet
20
20
  # @param file_path [String]
21
21
  # @option strict [Boolean]
22
22
  # @option expose [NilClass, String, Symbol] Environment key
23
+ # @param configuration [Block]
23
24
  # @return [void]
24
25
  #
25
26
  # @see Qonfig::DataSet#load_from_file
26
27
  #
27
28
  # @api public
28
29
  # @since 0.17.0
29
- def load_from_toml(file_path, strict: true, expose: nil)
30
- load_from_file(file_path, format: :toml, strict: strict, expose: expose)
30
+ # @version 0.21.0
31
+ def load_from_toml(file_path, strict: true, expose: nil, &configuration)
32
+ load_from_file(file_path, format: :toml, strict: strict, expose: expose, &configuration)
31
33
  end
32
34
  end
@@ -151,8 +151,9 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
151
151
  #
152
152
  # @api public
153
153
  # @since 0.1.0
154
+ # @version 0.21.0
154
155
  def []=(key, value)
155
- __lock__.thread_safe_access { __set_value__(key, value) }
156
+ __lock__.thread_safe_access { __assign_value__(key, value) }
156
157
  end
157
158
 
158
159
  # @param settings_map [Hash]
@@ -489,6 +490,32 @@ class Qonfig::Settings # NOTE: Layout/ClassStructure is disabled only for CORE_M
489
490
  __options__[key]
490
491
  end
491
492
 
493
+ # @param key [String, Symbol]
494
+ # @param value [Any]
495
+ # @return [void]
496
+ #
497
+ # @api private
498
+ # @since 0.21.0
499
+ # rubocop:disable Naming/RescuedExceptionsVariableName
500
+ def __assign_value__(key, value)
501
+ key = __indifferently_accessable_option_key__(key)
502
+ __set_value__(key, value)
503
+ rescue Qonfig::UnknownSettingError => initial_error
504
+ key_set = __parse_dot_notated_key__(key)
505
+
506
+ # NOTE: key is not dot-notaed and original key does not exist
507
+ raise(initial_error) if key_set.size == 1
508
+
509
+ begin
510
+ setting_value = __get_value__(key_set.first)
511
+ required_key = key_set[1..-1].join(DOT_NOTATION_SEPARATOR)
512
+ setting_value[required_key] = value # NOTE: pseudo-recoursive assignment
513
+ rescue Qonfig::UnknownSettingError
514
+ raise(initial_error)
515
+ end
516
+ end
517
+ # rubocop:enable Naming/RescuedExceptionsVariableName
518
+
492
519
  # @param key [String, Symbol]
493
520
  # @param value [Object]
494
521
  # @return [void]
@@ -4,6 +4,23 @@
4
4
  # @since 0.2.0
5
5
  module Qonfig::Settings::Builder
6
6
  class << self
7
+ # @param data_set [Qonfig::DataSet]
8
+ # @param assignements [Block]
9
+ # @yield [settings, validator]
10
+ # @yieldparam settings [Qonfig::DataSet::Settings]
11
+ # @yieldparam validator [Qonfig::Validation::Validators::Composite]
12
+ # @return [void]
13
+ #
14
+ # @api private
15
+ # @since 0.21.0
16
+ def build(data_set, &assignements)
17
+ validator = build_validator(data_set)
18
+ settings = build_definitions(data_set)
19
+ yield(settings, validator)
20
+ validator.validate!
21
+ build_state(data_set)
22
+ end
23
+
7
24
  # @param data_set [Qonfig::DataSet]
8
25
  # @return [Qonfig::Settings]
9
26
  #
@@ -30,16 +47,23 @@ module Qonfig::Settings::Builder
30
47
 
31
48
  private
32
49
 
50
+ # @param data_set [Qonfig::DataSet]
51
+ # @return [Qonfig::Validation::Validators::Composite]
52
+ #
53
+ # @api private
54
+ # @since 0.21.0
55
+ def build_validator(data_set)
56
+ Qonfig::Validation::Validators::Composite.new(data_set)
57
+ end
58
+
33
59
  # @param data_set [Qonfig::DataSet]
34
60
  # @return [Qonfig::Settings::Callbacks]
35
61
  #
36
62
  # @api private
37
63
  # @since 0.13.0
38
64
  def build_mutation_callbacks(data_set)
39
- validation_callback = proc { data_set.validate! }
40
-
41
65
  Qonfig::Settings::Callbacks.new.tap do |callbacks|
42
- callbacks.add(validation_callback)
66
+ callbacks.add(Qonfig::Settings::Callbacks::Validation.new(data_set))
43
67
  end
44
68
  end
45
69
  end
@@ -3,6 +3,8 @@
3
3
  # @api private
4
4
  # @since 0.13.0
5
5
  class Qonfig::Settings::Callbacks
6
+ require_relative 'callbacks/validation'
7
+
6
8
  # @api private
7
9
  # @since 0.13.0
8
10
  include Enumerable
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.21.0
5
+ class Qonfig::Settings::Callbacks::Validation
6
+ # @param data_set [Qonfig::DataSet]
7
+ # @return [void]
8
+ #
9
+ # @api private
10
+ # @since 0.21.0
11
+ def initialize(data_set)
12
+ @data_set = data_set
13
+ end
14
+
15
+ # @return [void]
16
+ #
17
+ # @api private
18
+ # @since 0.21.0
19
+ def call
20
+ data_set.validate!
21
+ end
22
+
23
+ private
24
+
25
+ # @return [Qonfig::DataSet]
26
+ #
27
+ # @api private
28
+ # @since 0.21.0
29
+ attr_reader :data_set
30
+ end
@@ -61,6 +61,14 @@ class Qonfig::Settings::KeyMatcher
61
61
  @pattern_matcher = build_pattern_matcher(scope_pattern)
62
62
  end
63
63
 
64
+ # @return [Boolean]
65
+ #
66
+ # @api private
67
+ # @since 0.21.0
68
+ def generic?
69
+ scope_pattern == GENERIC_PART_PATTERN || scope_pattern == INFINITE_PART_PATTERN
70
+ end
71
+
64
72
  # @param setting_key_pattern [String]
65
73
  # @return [Boolean]
66
74
  #
@@ -5,5 +5,5 @@ module Qonfig
5
5
  #
6
6
  # @api public
7
7
  # @since 0.1.0
8
- VERSION = '0.20.0'
8
+ VERSION = '0.21.0'
9
9
  end
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.20.0
4
+ version: 0.21.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: 2019-11-30 00:00:00.000000000 Z
11
+ date: 2019-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coveralls
@@ -154,11 +154,14 @@ files:
154
154
  - lib/qonfig/commands/instantiation.rb
155
155
  - lib/qonfig/commands/instantiation/freeze_state.rb
156
156
  - lib/qonfig/commands/instantiation/values_file.rb
157
+ - lib/qonfig/compacted.rb
158
+ - lib/qonfig/compacted/constructor.rb
157
159
  - lib/qonfig/configurable.rb
158
160
  - lib/qonfig/data_set.rb
159
161
  - lib/qonfig/data_set/class_builder.rb
160
162
  - lib/qonfig/data_set/lock.rb
161
163
  - lib/qonfig/dsl.rb
164
+ - lib/qonfig/dsl/inheritance.rb
162
165
  - lib/qonfig/errors.rb
163
166
  - lib/qonfig/imports.rb
164
167
  - lib/qonfig/imports/abstract.rb
@@ -177,8 +180,10 @@ files:
177
180
  - lib/qonfig/plugins/abstract.rb
178
181
  - lib/qonfig/plugins/access_mixin.rb
179
182
  - lib/qonfig/plugins/pretty_print.rb
183
+ - lib/qonfig/plugins/pretty_print/compacted.rb
180
184
  - lib/qonfig/plugins/pretty_print/data_set.rb
181
185
  - lib/qonfig/plugins/pretty_print/mixin.rb
186
+ - lib/qonfig/plugins/pretty_print/settings.rb
182
187
  - lib/qonfig/plugins/registry.rb
183
188
  - lib/qonfig/plugins/toml.rb
184
189
  - lib/qonfig/plugins/toml/commands/definition/expose_toml.rb
@@ -194,6 +199,7 @@ files:
194
199
  - lib/qonfig/settings.rb
195
200
  - lib/qonfig/settings/builder.rb
196
201
  - lib/qonfig/settings/callbacks.rb
202
+ - lib/qonfig/settings/callbacks/validation.rb
197
203
  - lib/qonfig/settings/key_guard.rb
198
204
  - lib/qonfig/settings/key_matcher.rb
199
205
  - lib/qonfig/settings/lock.rb