bbk-utils 1.0.1.84207 → 1.0.1.97943
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 +98 -15
- data/lib/bbk/utils.rb +18 -0
- 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: eb2395b2a2bf76b7d8b86eda8feb6ead04cff838c4b2a91d157fe796b4221e8c
|
4
|
+
data.tar.gz: 046f488594f017991f0255ca9b6b5a1d030ec180541ab0ff5e88b0d872261d92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba1b4600ac72aa1dbb36ae7834288d664f6aceba8348a9911b96caa1b272300d2145e6b345b75b3176af8960cbadce6d0372250013a056632c5746e308964f39
|
7
|
+
data.tar.gz: 80eb064b959a9f704829852772e40c7f37643417a567fdf390b766b84e953bc111cfeb03d2ff1766a074a4792f1dd06e7dbbbea1a9397b28cd303ef48c66bf8c
|
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.97943)
|
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.
|
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.5.4)
|
137
135
|
|
138
136
|
PLATFORMS
|
139
137
|
ruby
|
data/lib/bbk/utils/config.rb
CHANGED
@@ -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
|
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
|
50
|
-
env: (key || env)
|
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
|
64
|
-
env: (key || env)
|
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
|
78
|
-
env: (key || env)
|
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
|
-
|
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 =
|
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 =
|
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
|
-
|
160
|
-
|
227
|
+
return nil if key.nil?
|
228
|
+
key.to_s.upcase
|
229
|
+
end
|
161
230
|
|
162
|
-
|
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/lib/bbk/utils.rb
CHANGED
@@ -17,6 +17,24 @@ module BBK
|
|
17
17
|
|
18
18
|
attr_accessor :logger
|
19
19
|
|
20
|
+
def gracefully_main
|
21
|
+
yield
|
22
|
+
0
|
23
|
+
rescue SignalException => e
|
24
|
+
if %w[INT TERM EXIT QUIT].include?(Signal.signame(e.signo))
|
25
|
+
0
|
26
|
+
else
|
27
|
+
logger.error "Signal: #{e.inspect}"
|
28
|
+
1
|
29
|
+
end
|
30
|
+
rescue StandardError => e
|
31
|
+
logger.error "Exception: #{e.inspect}. Backtrace: #{e.backtrace.inspect}"
|
32
|
+
1
|
33
|
+
rescue SystemExit => e
|
34
|
+
logger.error "System exit: #{e.inspect}. Backtrace: #{e.backtrace.inspect}"
|
35
|
+
e.status
|
36
|
+
end
|
37
|
+
|
20
38
|
end
|
21
39
|
|
22
40
|
self.logger = ::BBK::Utils::Logger.default
|
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.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-05
|
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
|