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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d4c885cb45d09a4268faf157c86945257ffff5e9581a12379c8ef01576df1137
4
- data.tar.gz: 139acd30f3c496710ad5d07bf1760833d7069b5dc23ea364c90d739c3eec022b
3
+ metadata.gz: eb2395b2a2bf76b7d8b86eda8feb6ead04cff838c4b2a91d157fe796b4221e8c
4
+ data.tar.gz: 046f488594f017991f0255ca9b6b5a1d030ec180541ab0ff5e88b0d872261d92
5
5
  SHA512:
6
- metadata.gz: 8e6e5899f32ceca3fb0422f568a0696667ed6ee2da0e6ede474fbf9e71fc4a37eadb12b08a8e64524a8ef366e84d351b9ae48f0652f43602a5a76d847e272027
7
- data.tar.gz: ec65ba53e4026ee33242883dd2f42058214b3f0bd8d384ba833c952fd0b0391c24e349ad6b3b89b33914d14d9dbed259773c2a5dea24e01a200f956f05365595
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.84207)
5
- activesupport (~> 6.0)
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 (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.15.0)
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.5.4)
137
135
 
138
136
  PLATFORMS
139
137
  ruby
@@ -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/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 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.84207
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-12 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