bbk-utils 1.0.1.93642 → 1.0.1.97943

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: b0cbd3ef94543f7d959795c36ac3da87c82ddb206b76caea9c9e346f6397eb47
4
- data.tar.gz: d5e7333ad1c1d5cb3257ee72439dad699943def60f5ad6fcc293e705a32854d0
3
+ metadata.gz: eb2395b2a2bf76b7d8b86eda8feb6ead04cff838c4b2a91d157fe796b4221e8c
4
+ data.tar.gz: 046f488594f017991f0255ca9b6b5a1d030ec180541ab0ff5e88b0d872261d92
5
5
  SHA512:
6
- metadata.gz: 59e943a64751d2128141a00ac0f9a7003ec7797dbdd8da0358f5bf6f19c20ee572a85c211d80633840cc23edef971cad0f6fbf471fdae5475b39d31b7f3fd9c9
7
- data.tar.gz: 7f0c7a20f9308973b85ce992b1f4fd0f21f1bb66f0043a9eac0b2b84a125d49ca7d20b059c71e16889ca3426a249ab3c077e9eb98f424d6178a95edebae58d47
6
+ metadata.gz: ba1b4600ac72aa1dbb36ae7834288d664f6aceba8348a9911b96caa1b272300d2145e6b345b75b3176af8960cbadce6d0372250013a056632c5746e308964f39
7
+ data.tar.gz: 80eb064b959a9f704829852772e40c7f37643417a567fdf390b766b84e953bc111cfeb03d2ff1766a074a4792f1dd06e7dbbbea1a9397b28cd303ef48c66bf8c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bbk-utils (1.0.1.93642)
4
+ bbk-utils (1.0.1.97943)
5
5
  activesupport (>= 6.0)
6
6
  russian
7
7
 
@@ -4,7 +4,10 @@ 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
8
11
 
9
12
  class BooleanCaster
10
13
 
@@ -29,8 +32,8 @@ module BBK
29
32
 
30
33
  end
31
34
 
32
- def self.instance
33
- @instance ||= new
35
+ def self.instance(prefix: nil)
36
+ @instance ||= new(prefix: prefix)
34
37
  end
35
38
 
36
39
  class << self
@@ -40,14 +43,23 @@ module BBK
40
43
 
41
44
  end
42
45
 
43
- def initialize(name = nil)
46
+ def initialize(name: nil, prefix: nil, parent: nil)
44
47
  @name = name
45
48
  @store = {}
49
+ @parent = parent
50
+ @subconfigs = []
51
+ @prefix = normalize_key(prefix)
52
+ @prefixes = if parent.nil?
53
+ [@prefix]
54
+ else
55
+ parent.prefixes.dup + [@prefix]
56
+ end.compact
57
+ @env_prefix = normalize_key(@prefixes.join(PREFIX_SEP))
46
58
  end
47
59
 
48
60
  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,
61
+ @store[full_prefixed_key(env)] = {
62
+ env: full_prefixed_key(key || env),
51
63
  file: file,
52
64
  required: required,
53
65
  desc: desc,
@@ -60,8 +72,8 @@ module BBK
60
72
  raise ArgumentError.new('Specified type and bool') if bool && type.present?
61
73
 
62
74
  type = BBK::Config::BooleanCaster.singleton_method(:cast) if bool
63
- @store[env.to_s.upcase] = {
64
- env: (key || env).to_s.upcase,
75
+ @store[full_prefixed_key(env)] = {
76
+ env: full_prefixed_key(key || env),
65
77
  file: nil,
66
78
  required: true,
67
79
  desc: desc,
@@ -74,8 +86,8 @@ module BBK
74
86
  raise ArgumentError.new('Specified type and bool') if bool && type.present?
75
87
 
76
88
  type = BBK::Utils::Config::BooleanCaster.singleton_method(:cast) if bool
77
- @store[env.to_s.upcase] = {
78
- env: (key || env).to_s.upcase,
89
+ @store[full_prefixed_key(env)] = {
90
+ env: full_prefixed_key(key || env),
79
91
  file: nil,
80
92
  required: false,
81
93
  default: default,
@@ -89,10 +101,22 @@ module BBK
89
101
  @store.each_value do |item|
90
102
  process(source, item)
91
103
  end
104
+ @subconfigs.each {|sub| sub.run!(source)}
105
+ nil
106
+ end
107
+
108
+ def subconfig(prefix: , name: nil)
109
+ raise ArgumentError.new("Subconfig with prefix #{prefix} already exists") if @subconfigs.any? {|sub| sub.prefix == prefix.to_s }
110
+ sub = self.class.new(name: name, prefix: prefix, parent: self)
111
+ @subconfigs << sub
112
+ if block_given?
113
+ yield sub
114
+ end
115
+ sub
92
116
  end
93
117
 
94
118
  def [](key)
95
- @store[normalize_key(key)][:value]
119
+ self.get(key, search_up: true, search_down: true)
96
120
  end
97
121
 
98
122
  def []=(key, value)
@@ -121,7 +145,7 @@ module BBK
121
145
  result = StringIO.new
122
146
  result.puts "Environment variables#{@name ? " for #{@name}" : ''}:"
123
147
  padding = ' ' * 3
124
- sorted = @store.values.sort_by do |item|
148
+ sorted = store_with_subconfigs.values.sort_by do |item|
125
149
  [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1]
126
150
  end
127
151
 
@@ -136,7 +160,7 @@ module BBK
136
160
  end
137
161
 
138
162
  def as_json(*_args)
139
- values = @store.values.sort_by do |item|
163
+ values = store_with_subconfigs.sort_by do |item|
140
164
  [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1]
141
165
  end.reduce({}) do |ret, item|
142
166
  ret.merge(item[:env] => item)
@@ -153,13 +177,72 @@ module BBK
153
177
  JSON.parse(to_json).to_yaml
154
178
  end
155
179
 
180
+ def root?
181
+ @parent.nil?
182
+ end
183
+
184
+ protected
185
+
186
+ def prefixes
187
+ @prefixes
188
+ end
189
+
190
+ def get(key, search_up: false, search_down: false)
191
+ normalized_key = normalize_key(key)
192
+ if @store.key?(normalized_key)
193
+ return @store[normalized_key][:value]
194
+ end
195
+ prefix_key = full_prefixed_key(key)
196
+ if @store.key?(prefix_key)
197
+ return @store[prefix_key][:value]
198
+ end
199
+ if search_down
200
+ sub_prefixed_keys(key).each do |pref_key|
201
+ if @store.key?(pref_key)
202
+ return @store[pref_key][:value]
203
+ end
204
+
205
+ subconf = @subconfigs.find {|sub| pref_key.starts_with?(sub.env_prefix)}
206
+ next if subconf.nil?
207
+ return subconf.get(pref_key, search_up: false, search_down: true)
208
+ end
209
+ end
210
+ if search_up && @parent
211
+ return @parent.get(key, search_up: true, search_down: false)
212
+ end
213
+ raise "There is no such key: #{key} in config!"
214
+ end
215
+
216
+ def store_with_subconfigs
217
+ res = @store.dup
218
+ @subconfigs.each do |sub|
219
+ res = res.merge(sub.store_with_subconfigs)
220
+ end
221
+ res
222
+ end
223
+
156
224
  private
157
225
 
158
226
  def normalize_key(key)
159
- k = key.to_s.upcase
160
- raise "There is no such key: #{k} in config!" unless @store.key?(k)
227
+ return nil if key.nil?
228
+ key.to_s.upcase
229
+ end
161
230
 
162
- k
231
+ def full_prefixed_key(key)
232
+ p_key = if env_prefix.empty?
233
+ [key.to_s]
234
+ else
235
+ [env_prefix, key.to_s]
236
+ end.join(PREFIX_SEP)
237
+ normalize_key(p_key)
238
+ end
239
+
240
+ def sub_prefixed_keys(key)
241
+ Enumerator.new do |yielder|
242
+ @prefixes.size.downto(0).each do |last_index|
243
+ yielder << [*@prefixes[0...last_index], normalize_key(key)].compact.join(PREFIX_SEP)
244
+ end
245
+ end
163
246
  end
164
247
 
165
248
  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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bbk-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1.93642
4
+ version: 1.0.1.97943
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-08-18 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