bbk-utils 1.0.1.84207 → 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: 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