bbk-utils 1.0.1.89770 → 1.0.1.97958

Sign up to get free protection for your applications and to get access to all the features.
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