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 +4 -4
- data/Gemfile.lock +5 -7
- data/lib/bbk/utils/config.rb +104 -18
- data/sig/bbk/config.rbs +2 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a9dd5f6805e9488cae5ff150b2f7ea51a8eca58336d43428f16a6f7a34990cf
|
4
|
+
data.tar.gz: 3d6f9115d2e8def51a08249497a52b4750c6b7ccf6c62bd83d7ceb163f3153ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
5
|
-
activesupport (
|
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 (
|
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.
|
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.
|
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
|
data/lib/bbk/utils/config.rb
CHANGED
@@ -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
|
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
|
50
|
-
env: (key || env)
|
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
|
64
|
-
env: (key || env)
|
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
|
78
|
-
env: (key || env)
|
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
|
-
|
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
|
-
|
113
|
-
|
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 =
|
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 =
|
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
|
-
|
160
|
-
|
230
|
+
return nil if key.nil?
|
231
|
+
key.to_s.upcase
|
232
|
+
end
|
161
233
|
|
162
|
-
|
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
|
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: (
|
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.
|
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-
|
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
|