bbk-utils 1.0.1.89770 → 1.0.1.97958

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9a7afa5a8879bb88c539dd0d11b2c4e57321cfb729de3bd5fe1e31d4becea87
4
- data.tar.gz: d57ebc66b8468c354b0124dc3ada3eba12738b67863d3bab9010c562fdf8a8df
3
+ metadata.gz: 5a9dd5f6805e9488cae5ff150b2f7ea51a8eca58336d43428f16a6f7a34990cf
4
+ data.tar.gz: 3d6f9115d2e8def51a08249497a52b4750c6b7ccf6c62bd83d7ceb163f3153ee
5
5
  SHA512:
6
- metadata.gz: b0adb7b4527d8bff9241d7c6bc7da35749cfbc872dcfc1cf1d68efb4752a4c479a950cf26da1a8dc9a2b68137f743fbc152fc9daa2e1887208663ec2683b0d6c
7
- data.tar.gz: 22e33eac745da9ba63d698218013ce1621dd7a75e4a6ca63030e0566699ec8a206f144b0552fee4c1b0b7f8e6f9f502450cf2559f60514e66c8a19163cbc715a
6
+ metadata.gz: 97152af15bb34e112bba23897a836428fec883b5b7b8017bbbe8d241a058d3b0b00685cad35c18f089e5a5abcb08ca46ea81dad9311e01dd2703eabae5e0f4a9
7
+ data.tar.gz: cae731d7f2cb468e5b311e889db29d04ee82cae9b7b956099cc03ecdde90a9a42ea9f7437d87ef4263af84346513e59f3970c8da7a6d2ff436ada6373ad29ad8
data/Gemfile.lock CHANGED
@@ -1,19 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bbk-utils (1.0.1.89770)
5
- activesupport (~> 6.0)
4
+ bbk-utils (1.0.1.97958)
5
+ activesupport (>= 6.0)
6
6
  russian
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (6.1.6)
11
+ activesupport (7.0.3.1)
12
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
13
  i18n (>= 1.6, < 2)
14
14
  minitest (>= 5.1)
15
15
  tzinfo (~> 2.0)
16
- zeitwerk (~> 2.3)
17
16
  addressable (2.8.0)
18
17
  public_suffix (>= 2.0.2, < 5.0)
19
18
  ansi (1.5.0)
@@ -49,7 +48,7 @@ GEM
49
48
  kwalify (0.7.2)
50
49
  launchy (2.5.0)
51
50
  addressable (~> 2.7)
52
- minitest (5.16.2)
51
+ minitest (5.16.3)
53
52
  parallel (1.21.0)
54
53
  parser (3.0.3.1)
55
54
  ast (~> 2.4.1)
@@ -125,7 +124,7 @@ GEM
125
124
  unicode-display_width (>= 1.1.1, < 3)
126
125
  thread_safe (0.3.6)
127
126
  tty-which (0.4.2)
128
- tzinfo (2.0.4)
127
+ tzinfo (2.0.5)
129
128
  concurrent-ruby (~> 1.0)
130
129
  unicode-display_width (2.1.0)
131
130
  virtus (1.0.5)
@@ -133,7 +132,6 @@ GEM
133
132
  coercible (~> 1.0)
134
133
  descendants_tracker (~> 0.0, >= 0.0.3)
135
134
  equalizer (~> 0.0, >= 0.0.9)
136
- zeitwerk (2.6.0)
137
135
 
138
136
  PLATFORMS
139
137
  ruby
@@ -4,7 +4,12 @@ module BBK
4
4
  module Utils
5
5
  class Config
6
6
 
7
+ PREFIX_SEP = '_'.freeze
8
+
7
9
  attr_accessor :store, :name
10
+ attr_reader :prefix, :env_prefix, :parent
11
+
12
+ class KeyError < StandardError; end
8
13
 
9
14
  class BooleanCaster
10
15
 
@@ -29,8 +34,8 @@ module BBK
29
34
 
30
35
  end
31
36
 
32
- def self.instance
33
- @instance ||= new
37
+ def self.instance(prefix: nil)
38
+ @instance ||= new(prefix: prefix)
34
39
  end
35
40
 
36
41
  class << self
@@ -40,14 +45,23 @@ module BBK
40
45
 
41
46
  end
42
47
 
43
- def initialize(name = nil)
48
+ def initialize(name: nil, prefix: nil, parent: nil)
44
49
  @name = name
45
50
  @store = {}
51
+ @parent = parent
52
+ @subconfigs = []
53
+ @prefix = normalize_key(prefix)
54
+ @prefixes = if parent.nil?
55
+ [@prefix]
56
+ else
57
+ parent.prefixes.dup + [@prefix]
58
+ end.compact
59
+ @env_prefix = normalize_key(@prefixes.join(PREFIX_SEP))
46
60
  end
47
61
 
48
62
  def map(env, file, required: true, desc: nil, bool: false, key: nil)
49
- @store[env.to_s.upcase] = {
50
- env: (key || env).to_s.upcase,
63
+ @store[full_prefixed_key(env)] = {
64
+ env: full_prefixed_key(key || env),
51
65
  file: file,
52
66
  required: required,
53
67
  desc: desc,
@@ -60,8 +74,8 @@ module BBK
60
74
  raise ArgumentError.new('Specified type and bool') if bool && type.present?
61
75
 
62
76
  type = BBK::Config::BooleanCaster.singleton_method(:cast) if bool
63
- @store[env.to_s.upcase] = {
64
- env: (key || env).to_s.upcase,
77
+ @store[full_prefixed_key(env)] = {
78
+ env: full_prefixed_key(key || env),
65
79
  file: nil,
66
80
  required: true,
67
81
  desc: desc,
@@ -74,8 +88,8 @@ module BBK
74
88
  raise ArgumentError.new('Specified type and bool') if bool && type.present?
75
89
 
76
90
  type = BBK::Utils::Config::BooleanCaster.singleton_method(:cast) if bool
77
- @store[env.to_s.upcase] = {
78
- env: (key || env).to_s.upcase,
91
+ @store[full_prefixed_key(env)] = {
92
+ env: full_prefixed_key(key || env),
79
93
  file: nil,
80
94
  required: false,
81
95
  default: default,
@@ -89,10 +103,22 @@ module BBK
89
103
  @store.each_value do |item|
90
104
  process(source, item)
91
105
  end
106
+ @subconfigs.each {|sub| sub.run!(source)}
107
+ nil
108
+ end
109
+
110
+ def subconfig(prefix: , name: nil)
111
+ raise ArgumentError.new("Subconfig with prefix #{prefix} already exists") if @subconfigs.any? {|sub| sub.prefix == prefix.to_s }
112
+ sub = self.class.new(name: name, prefix: prefix, parent: self)
113
+ @subconfigs << sub
114
+ if block_given?
115
+ yield sub
116
+ end
117
+ sub
92
118
  end
93
119
 
94
120
  def [](key)
95
- @store[normalize_key(key)][:value]
121
+ self.get(key, search_up: true, search_down: true)[:value]
96
122
  end
97
123
 
98
124
  def []=(key, value)
@@ -109,19 +135,20 @@ module BBK
109
135
  end
110
136
 
111
137
  def fetch(key, default = nil)
112
- # store.fetch(key.to_s.upcase, default)
113
- if (field = store[key.to_s.upcase]).present? && field.key?(:value)
114
- field[:value]
138
+ if (rec = self.get(key, search_up: true, search_down: true)) && rec.key?(:value)
139
+ rec[:value]
115
140
  else
116
141
  default
117
142
  end
143
+ rescue KeyError
144
+ default
118
145
  end
119
146
 
120
147
  def to_s
121
148
  result = StringIO.new
122
149
  result.puts "Environment variables#{@name ? " for #{@name}" : ''}:"
123
150
  padding = ' ' * 3
124
- sorted = @store.values.sort_by do |item|
151
+ sorted = store_with_subconfigs.values.sort_by do |item|
125
152
  [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1]
126
153
  end
127
154
 
@@ -136,7 +163,7 @@ module BBK
136
163
  end
137
164
 
138
165
  def as_json(*_args)
139
- values = @store.values.sort_by do |item|
166
+ values = store_with_subconfigs.sort_by do |item|
140
167
  [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1]
141
168
  end.reduce({}) do |ret, item|
142
169
  ret.merge(item[:env] => item)
@@ -153,13 +180,72 @@ module BBK
153
180
  JSON.parse(to_json).to_yaml
154
181
  end
155
182
 
183
+ def root?
184
+ @parent.nil?
185
+ end
186
+
187
+ protected
188
+
189
+ def prefixes
190
+ @prefixes
191
+ end
192
+
193
+ def get(key, search_up: false, search_down: false)
194
+ normalized_key = normalize_key(key)
195
+ if @store.key?(normalized_key)
196
+ return @store[normalized_key]
197
+ end
198
+ prefix_key = full_prefixed_key(key)
199
+ if @store.key?(prefix_key)
200
+ return @store[prefix_key]
201
+ end
202
+ if search_down
203
+ sub_prefixed_keys(key).each do |pref_key|
204
+ if @store.key?(pref_key)
205
+ return @store[pref_key]
206
+ end
207
+
208
+ subconf = @subconfigs.find {|sub| pref_key.starts_with?(sub.env_prefix)}
209
+ next if subconf.nil?
210
+ return subconf.get(pref_key, search_up: false, search_down: true)
211
+ end
212
+ end
213
+ if search_up && @parent
214
+ return @parent.get(key, search_up: true, search_down: false)
215
+ end
216
+ raise KeyError.new("There is no such key: #{key} in config!")
217
+ end
218
+
219
+ def store_with_subconfigs
220
+ res = @store.dup
221
+ @subconfigs.each do |sub|
222
+ res = res.merge(sub.store_with_subconfigs)
223
+ end
224
+ res
225
+ end
226
+
156
227
  private
157
228
 
158
229
  def normalize_key(key)
159
- k = key.to_s.upcase
160
- raise "There is no such key: #{k} in config!" unless @store.key?(k)
230
+ return nil if key.nil?
231
+ key.to_s.upcase
232
+ end
161
233
 
162
- k
234
+ def full_prefixed_key(key)
235
+ p_key = if env_prefix.empty?
236
+ [key.to_s]
237
+ else
238
+ [env_prefix, key.to_s]
239
+ end.join(PREFIX_SEP)
240
+ normalize_key(p_key)
241
+ end
242
+
243
+ def sub_prefixed_keys(key)
244
+ Enumerator.new do |yielder|
245
+ @prefixes.size.downto(0).each do |last_index|
246
+ yielder << [*@prefixes[0...last_index], normalize_key(key)].compact.join(PREFIX_SEP)
247
+ end
248
+ end
163
249
  end
164
250
 
165
251
  def process(source, item)
data/sig/bbk/config.rbs CHANGED
@@ -24,7 +24,7 @@ module BBK
24
24
 
25
25
  def self.instance: () -> instance
26
26
 
27
- def initialize: (?String name) -> void
27
+ def initialize: (?name: String?, ?prefix: String?, ?parent: BBK::Utils::Config?) -> void
28
28
  def map: (envSource env, String file, ?required: bool, ?desc: String, ?bool: bool, ?key: String) -> void
29
29
  def require: (envSource env, ?desc: String?, ?bool: bool, ?type: typeCaster, ?key: String?) -> void
30
30
  def optional: (envSource env, ?default: untyped, ?desc: String, ?bool: bool, ?type: typeCaster, ?key: String) -> void
@@ -41,7 +41,7 @@ module BBK
41
41
 
42
42
  private
43
43
 
44
- def normalize_key: (string key) -> String
44
+ def normalize_key: (String? key) -> String?
45
45
  def process: (envSource source, configItem item) -> void
46
46
 
47
47
  def required!: (configItem item) -> void
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bbk-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1.89770
4
+ version: 1.0.1.97958
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samoilenko Yuri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-08 00:00:00.000000000 Z
11
+ date: 2022-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '6.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '6.0'
27
27
  - !ruby/object:Gem::Dependency