bbk-utils 1.0.0.68936

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 240b6b327994eab2d451b2ac4f95d37bb518f57fa9af862a2880fda8398e98d2
4
+ data.tar.gz: 98322898dbb34a0589bcf15ae4f4ff9207be3bb49813ef04aefd7afe3a72c38b
5
+ SHA512:
6
+ metadata.gz: dfe5e0990e39e9c1c72396c02f380bf7ce48c8806b771d64479b876e579eb30935db9670d0938fa6851f590130b8306251d7bb580c1cc9f205a73700a2e0d5bf
7
+ data.tar.gz: 626c05b816608d581bbb7897d85bd923d54d31e5d487af6fac1bf68682a74aaf198c7d6247eff230e847a318d9de750264160adc41c972a55aef17285f60942c
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bbk-utils.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,135 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ bbk-utils (1.0.0.68936)
5
+ activesupport
6
+ russian
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (6.1.4.1)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 1.6, < 2)
14
+ minitest (>= 5.1)
15
+ tzinfo (~> 2.0)
16
+ zeitwerk (~> 2.3)
17
+ addressable (2.8.0)
18
+ public_suffix (>= 2.0.2, < 5.0)
19
+ ansi (1.5.0)
20
+ ast (2.4.2)
21
+ axiom-types (0.1.1)
22
+ descendants_tracker (~> 0.0.4)
23
+ ice_nine (~> 0.11.0)
24
+ thread_safe (~> 0.3, >= 0.3.1)
25
+ byebug (11.1.3)
26
+ coercible (1.0.0)
27
+ descendants_tracker (~> 0.0.1)
28
+ concurrent-ruby (1.1.9)
29
+ descendants_tracker (0.0.4)
30
+ thread_safe (~> 0.3, >= 0.3.1)
31
+ diff-lcs (1.4.4)
32
+ docile (1.4.0)
33
+ equalizer (0.0.11)
34
+ erubis (2.7.0)
35
+ faker (2.19.0)
36
+ i18n (>= 1.6, < 2)
37
+ flay (2.12.1)
38
+ erubis (~> 2.7.0)
39
+ path_expander (~> 1.0)
40
+ ruby_parser (~> 3.0)
41
+ sexp_processor (~> 4.0)
42
+ flog (4.6.4)
43
+ path_expander (~> 1.0)
44
+ ruby_parser (~> 3.1, > 3.1.0)
45
+ sexp_processor (~> 4.8)
46
+ i18n (1.8.11)
47
+ concurrent-ruby (~> 1.0)
48
+ ice_nine (0.11.2)
49
+ kwalify (0.7.2)
50
+ launchy (2.5.0)
51
+ addressable (~> 2.7)
52
+ minitest (5.14.4)
53
+ parser (3.0.3.1)
54
+ ast (~> 2.4.1)
55
+ path_expander (1.1.0)
56
+ public_suffix (4.0.6)
57
+ rainbow (3.0.0)
58
+ rake (12.3.3)
59
+ reek (6.0.6)
60
+ kwalify (~> 0.7.0)
61
+ parser (~> 3.0.0)
62
+ rainbow (>= 2.0, < 4.0)
63
+ rspec (3.10.0)
64
+ rspec-core (~> 3.10.0)
65
+ rspec-expectations (~> 3.10.0)
66
+ rspec-mocks (~> 3.10.0)
67
+ rspec-core (3.10.1)
68
+ rspec-support (~> 3.10.0)
69
+ rspec-expectations (3.10.1)
70
+ diff-lcs (>= 1.2.0, < 2.0)
71
+ rspec-support (~> 3.10.0)
72
+ rspec-mocks (3.10.2)
73
+ diff-lcs (>= 1.2.0, < 2.0)
74
+ rspec-support (~> 3.10.0)
75
+ rspec-support (3.10.3)
76
+ rspec_junit_formatter (0.4.1)
77
+ rspec-core (>= 2, < 4, != 2.12.0)
78
+ ruby_parser (3.18.1)
79
+ sexp_processor (~> 4.16)
80
+ rubycritic (4.6.1)
81
+ flay (~> 2.8)
82
+ flog (~> 4.4)
83
+ launchy (>= 2.0.0)
84
+ parser (>= 2.6.0)
85
+ rainbow (~> 3.0)
86
+ reek (~> 6.0, < 7.0)
87
+ ruby_parser (~> 3.8)
88
+ simplecov (>= 0.17.0)
89
+ tty-which (~> 0.4.0)
90
+ virtus (~> 1.0)
91
+ russian (0.6.0)
92
+ i18n (>= 0.5.0)
93
+ sexp_processor (4.16.0)
94
+ simplecov (0.21.2)
95
+ docile (~> 1.1)
96
+ simplecov-html (~> 0.11)
97
+ simplecov_json_formatter (~> 0.1)
98
+ simplecov-console (0.9.1)
99
+ ansi
100
+ simplecov
101
+ terminal-table
102
+ simplecov-html (0.12.3)
103
+ simplecov_json_formatter (0.1.3)
104
+ terminal-table (3.0.2)
105
+ unicode-display_width (>= 1.1.1, < 3)
106
+ thread_safe (0.3.6)
107
+ tty-which (0.4.2)
108
+ tzinfo (2.0.4)
109
+ concurrent-ruby (~> 1.0)
110
+ unicode-display_width (2.1.0)
111
+ virtus (1.0.5)
112
+ axiom-types (~> 0.1)
113
+ coercible (~> 1.0)
114
+ descendants_tracker (~> 0.0, >= 0.0.3)
115
+ equalizer (~> 0.0, >= 0.0.9)
116
+ zeitwerk (2.5.1)
117
+
118
+ PLATFORMS
119
+ ruby
120
+ x86_64-linux
121
+
122
+ DEPENDENCIES
123
+ bbk-utils!
124
+ bundler (~> 2.0)
125
+ byebug
126
+ faker (~> 2.4)
127
+ rake (~> 12.0)
128
+ rspec (~> 3.0)
129
+ rspec_junit_formatter
130
+ rubycritic
131
+ simplecov
132
+ simplecov-console
133
+
134
+ BUNDLED WITH
135
+ 2.2.32
data/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # BBK::Utils
2
+
3
+ Common classes for BBK library stack.
4
+
5
+ ## Installation
6
+
7
+ ### Terminal
8
+
9
+ ```bash
10
+ gem install bbk-utils
11
+ ```
12
+
13
+ ### Gemfile
14
+
15
+ ```ruby
16
+ gem 'bbk-utils'
17
+ ```
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'bbk/utils'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,223 @@
1
+ module BBK
2
+ class Config
3
+ attr_accessor :store, :name
4
+
5
+ class BooleanCaster
6
+
7
+ FALSE_VALUES = [
8
+ false, 0,
9
+ "0", :"0",
10
+ "f", :f,
11
+ "F", :F,
12
+ "false", :false,
13
+ "FALSE", :FALSE,
14
+ "off", :off,
15
+ "OFF", :OFF,
16
+ ].to_set.freeze
17
+
18
+ def self.cast(value)
19
+ if value.nil? || value == ''
20
+ nil
21
+ else
22
+ !FALSE_VALUES.include?(value)
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.instance
28
+ @instance ||= new
29
+ end
30
+
31
+ class << self
32
+ delegate :map, :require, :optional, :run!, :[], :[]=, :content, :to_s, :to_json, :as_json, :to_yaml, :fetch, to: :instance
33
+ end
34
+
35
+ def initialize(name = nil)
36
+ @name = name
37
+ @store = {}
38
+ end
39
+
40
+ def map(env, file, required: true, desc: nil, bool: false, key: nil)
41
+ @store[env.to_s.upcase] = {
42
+ env: (key || env).to_s.upcase,
43
+ file: file,
44
+ required: required,
45
+ desc: desc,
46
+ bool: bool
47
+ }
48
+ end
49
+
50
+ def require(env, desc: nil, bool: false, type: nil, key: nil)
51
+ raise ArgumentError.new('Specified type and bool') if bool && type.present?
52
+
53
+ type = BBK::Config::BooleanCaster.singleton_method(:cast) if bool
54
+ @store[env.to_s.upcase] = {
55
+ env: (key || env).to_s.upcase,
56
+ required: true,
57
+ desc: desc,
58
+ bool: bool,
59
+ type: type
60
+ }
61
+ end
62
+
63
+ def optional(env, default: nil, desc: nil, bool: false, type: nil, key: nil)
64
+ raise ArgumentError.new('Specified type and bool') if bool && type.present?
65
+
66
+ type = BBK::Config::BooleanCaster.singleton_method(:cast) if bool
67
+ @store[env.to_s.upcase] = {
68
+ env: (key || env).to_s.upcase,
69
+ required: false,
70
+ default: default,
71
+ desc: desc,
72
+ type: type
73
+ }
74
+ end
75
+
76
+ def run!(source = ENV)
77
+ @store.values.each do |item|
78
+ process(source, item)
79
+ end
80
+ end
81
+
82
+ def [](key)
83
+ @store[normalize_key(key)][:value]
84
+ end
85
+
86
+ def []=(key, value)
87
+ @store[normalize_key(key)][:value] = value
88
+ end
89
+
90
+ def content(key)
91
+ item = @store[normalize_key(key)]
92
+ if (file = item[:file])
93
+ File.read(file)
94
+ else
95
+ item[:value]
96
+ end
97
+ end
98
+
99
+ def fetch(key, default = nil)
100
+ # store.fetch(key.to_s.upcase, default)
101
+ if (field = store[key.to_s.upcase]).present? && field.key?(:value)
102
+ field[:value]
103
+ else
104
+ default
105
+ end
106
+ end
107
+
108
+ def to_s
109
+ result = StringIO.new
110
+ result.puts "Environment variables#{@name ? " for #{@name}" : ''}:"
111
+ padding = ' ' * 3
112
+ sorted = @store.values.sort_by { |item| [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1] }
113
+
114
+ sorted.each do |item|
115
+ if item[:file]
116
+ result.puts print_file_item(item, padding)
117
+ else
118
+ result.puts print_item(item, padding)
119
+ end
120
+ end
121
+ result.string
122
+ end
123
+
124
+ def as_json(*_args)
125
+ values = @store.values.sort_by do |item|
126
+ [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1]
127
+ end.reduce({}) do |ret, item|
128
+ ret.merge(item[:env] => item)
129
+ end
130
+
131
+ @name ? { @name => values } : values
132
+ end
133
+
134
+ def to_json(*_args)
135
+ JSON.pretty_generate(as_json)
136
+ end
137
+
138
+ def to_yaml(*_args)
139
+ JSON.parse(to_json).to_yaml
140
+ end
141
+
142
+ private
143
+
144
+ def normalize_key(key)
145
+ k = key.to_s.upcase
146
+ raise "There is no such key: #{k} in config!" unless @store.key?(k)
147
+
148
+ k
149
+ end
150
+
151
+ def process(source, item)
152
+ content = source.fetch(item[:env], item[:default])
153
+
154
+ # Если данные есть, либо указан тип (нужно для того чтобы переменная была нужного типа)
155
+ if content.present? || item[:type].present?
156
+ if file = item[:file]
157
+ dirname = File.dirname(file)
158
+ FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
159
+ File.write(file, content)
160
+ item[:value] = file
161
+ else
162
+ item[:value] = if (type = item[:type])
163
+ if type.respond_to? :call
164
+ type.call(content)
165
+ else
166
+ type.new(content)
167
+ end
168
+ else
169
+ content
170
+ end
171
+ end
172
+ elsif item[:required]
173
+ required!(item)
174
+ else
175
+ item[:value] = content
176
+ end
177
+ rescue => e
178
+ msg = "Failed processing #{item[:env]} parameter. #{e.inspect}"
179
+ if $logger
180
+ $logger.error msg
181
+ else
182
+ puts msg
183
+ end
184
+ raise
185
+ end
186
+
187
+ def required!(item)
188
+ raise "ENV [#{item[:env]}] is required!"
189
+ end
190
+
191
+ def print_file_item(item, padding)
192
+ line = padding + 'File ' + wrap_required(item)
193
+ line = if item[:desc].present?
194
+ line.ljust(50) + ' ' + item[:desc]
195
+ else
196
+ line
197
+ end
198
+
199
+ line + "\n" + (padding * 2) + '-> ' + item[:file].inspect
200
+ end
201
+
202
+ def print_item(item, padding)
203
+ line = padding + wrap_required(item)
204
+ line += " (=#{item[:default]})" if item[:default].present?
205
+
206
+ line = if item[:desc].present?
207
+ line.ljust(50) + ' ' + item[:desc]
208
+ else
209
+ line
210
+ end
211
+
212
+ line + "\n" + (padding * 2) + '-> ' + item[:value].inspect
213
+ end
214
+
215
+ def wrap_required(item)
216
+ if item[:required]
217
+ "<#{item[:env]}>"
218
+ else
219
+ "[#{item[:env]}]"
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,34 @@
1
+ require 'openssl'
2
+
3
+ module BBK
4
+ class Crypt
5
+ def self.full_check(key_path, cert_path, *cacert_chain)
6
+ errors = []
7
+ errors << 'Invalid key and cert pair' unless valid_key_cert?(key_path, cert_path)
8
+ errors << 'Invalid cert and cacert pair' unless valid_cert_sign?(cert_path, *cacert_chain.compact)
9
+ if errors.empty?
10
+ nil
11
+ else
12
+ errors
13
+ end
14
+ end
15
+
16
+ def self.valid_key_cert?(key_path, cert_path)
17
+ raise "Key file #{key_path} not exists" unless File.exist? key_path
18
+ raise "Cert file #{cert_path} not exists" unless File.exist? cert_path
19
+
20
+ key = OpenSSL::PKey::RSA.new(File.read(key_path))
21
+ cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
22
+ cert.check_private_key(key)
23
+ end
24
+
25
+ def self.valid_cert_sign?(cert_path, *ca_certs_paths)
26
+ raise "Cert file #{cert_path} not exists" unless File.exist? cert_path
27
+ raise "Not all files in ca chain #{ca_certs_paths} exists" unless ca_certs_paths.all? { |pth| File.exist? pth }
28
+
29
+ store = ca_certs_paths.reduce(OpenSSL::X509::Store.new) { |st, c| st.add_file(c) }
30
+ cert = OpenSSL::X509::Certificate.new File.read(cert_path)
31
+ store.verify(cert)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+ require 'uri'
3
+
4
+ module BBK
5
+ module EnvHelper
6
+ def self.prepare_database_envs(env)
7
+ uri = build_uri_with_defaults(env)
8
+ apply_env_from_uri(env, uri)
9
+ env
10
+ end
11
+
12
+ def self.prepare_mq_envs(env)
13
+ apply_mq_env_from_uri(env, build_mq_uri_with_defaults(env))
14
+ env
15
+ end
16
+
17
+ def self.build_uri_with_defaults(env)
18
+ ::URI.parse(env['DATABASE_URL'] || '').tap do |uri|
19
+ uri.scheme = env.fetch('DATABASE_ADAPTER', uri.scheme) || 'postgresql'
20
+ uri.user = env.fetch('DATABASE_USER', uri.user) || 'postgres'
21
+ uri.password = env.fetch('DATABASE_PASS', uri.password)
22
+ uri.hostname = env.fetch('DATABASE_HOST', uri.hostname) || 'db'
23
+ uri.port = env.fetch('DATABASE_PORT', uri.port) || 5432
24
+
25
+ name = env.fetch('DATABASE_NAME', uri.path) || ''
26
+ name = "/#{name}" unless name.start_with?('/')
27
+ uri.path = name
28
+
29
+ if uri.query
30
+ params = URI.decode_www_form(uri.query).to_h
31
+ params['pool'] = env.fetch('DATABASE_POOL', params['pool'])
32
+ uri.query = URI.encode_www_form(params)
33
+ end
34
+
35
+ end
36
+ end
37
+
38
+ def self.apply_env_from_uri(env, uri)
39
+ env['DATABASE_URL'] = uri.to_s
40
+ env['DATABASE_ADAPTER'] = uri.scheme
41
+ env['DATABASE_USER'] = uri.user
42
+ env['DATABASE_PASS'] = uri.password
43
+ env['DATABASE_HOST'] = uri.hostname
44
+ env['DATABASE_PORT'] = uri.port.to_s
45
+ env['DATABASE_NAME'] = uri.path[1..-1]
46
+
47
+ if uri.query
48
+ params = URI.decode_www_form(uri.query).to_h
49
+ env['DATABASE_POOL'] = params['pool']
50
+ end
51
+
52
+ end
53
+
54
+ def self.build_mq_uri_with_defaults(env)
55
+ # Only first MQ_URL selected as template if any
56
+ url = [env.fetch('MQ_URL', '').split(/[;\|]/)].flatten.select(&:present?).first || ''
57
+
58
+ # all hosts if form of list fills url template
59
+ hosts = [env.fetch('MQ_HOST', URI.parse(url).hostname || 'mq').split(/[;\|]/)].flatten.select(&:present?).uniq
60
+
61
+ hosts.map do |host|
62
+ URI.parse(url).tap do |uri|
63
+ uri.scheme = uri.scheme || 'amqps'
64
+ uri.hostname = host
65
+ uri.port = env.fetch('MQ_PORT', uri.port) || 5671
66
+ uri.user = env.fetch('MQ_USER', uri.user)
67
+ uri.password = env.fetch('MQ_PASS', uri.password)
68
+
69
+ vhost = [env.fetch('MQ_VHOST', uri.path), '/'].find(&:present?)
70
+ vhost = "/#{vhost}" unless vhost.start_with?('/')
71
+
72
+ uri.path = vhost
73
+ end
74
+ end
75
+ end
76
+
77
+ def self.apply_mq_env_from_uri(env, uris)
78
+ uri = uris.first
79
+
80
+ env['MQ_URL'] = uris.map(&:to_s).join(';')
81
+ env['MQ_HOST'] = uris.map(&:hostname).join(';')
82
+ env['MQ_PORT'] = uri.port.to_s
83
+ env['MQ_PASS'] = uri.password
84
+ env['MQ_USER'] = uri.user
85
+ vhost = if uri.path == '/'
86
+ uri.path
87
+ else
88
+ uri.path.gsub(%r{\A/}, '')
89
+ end
90
+ env['MQ_VHOST'] = vhost
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,15 @@
1
+ require 'logger'
2
+
3
+ module BBK
4
+ class LogFormatter < ::Logger::Formatter
5
+ FORMAT = "%5s [%sUTC #%d] (%s)[%s]: %s\n".freeze
6
+ def call(severity, time, progname, msg)
7
+ line = msg2str(msg).gsub("\n", '\\n')
8
+ format(FORMAT, severity, format_datetime(time.utc), Process.pid, progname, thread_id, line)
9
+ end
10
+
11
+ def thread_id
12
+ [Thread.current.object_id.to_s, Thread.current.name].compact.join('@')
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+ require 'active_support/tagged_logging'
5
+ require 'bbk/utils/log_formatter'
6
+
7
+ module BBK
8
+ class Logger < ::Logger
9
+ DEFAULT_NAME = 'bbk'
10
+ DEFAULT_LEVEL = Logger::Severity::DEBUG
11
+
12
+ def self.new(*args, **kwargs)
13
+ instance = super
14
+ ActiveSupport::TaggedLogging.new(instance)
15
+ end
16
+
17
+ def initialize(progname, level, io: STDOUT)
18
+ io.sync = true
19
+ super(io)
20
+ self.progname = progname
21
+
22
+ if level.is_a?(Integer)
23
+ self.level = level
24
+ else
25
+ level = level.to_s.upcase
26
+ level = level.present? ? level : 'INFO'
27
+ self.level = Logger.const_get(level)
28
+ end
29
+
30
+ self.formatter = LogFormatter.new
31
+ info "Using LOG_LEVEL=#{level}"
32
+ end
33
+
34
+ def silence(*_args)
35
+ yield self
36
+ end
37
+
38
+ def self.default
39
+ if @default
40
+ @default
41
+ else
42
+ @default = new(DEFAULT_NAME, 'UNKNOWN')
43
+ @default.level = DEFAULT_LEVEL
44
+ @default
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bbk/utils/logger'
4
+
5
+ module BBK
6
+ class ProxyLogger
7
+ attr_reader :tags, :logger
8
+
9
+ def initialize(logger, tags:)
10
+ @logger = logger
11
+ @tagged = @logger.respond_to?(:tagged)
12
+ @tags = [tags].flatten
13
+ end
14
+
15
+ def add_tags(*tags)
16
+ @tags += tags.flatten
17
+ @tags = @tags.uniq
18
+ end
19
+
20
+ def method_missing(method, *args, &block)
21
+ super unless logger.respond_to?(method)
22
+
23
+ if @tagged
24
+ current_tags = tags - logger.formatter.current_tags
25
+ logger.tagged(current_tags) { logger.send(method, *args, &block) }
26
+ else
27
+ logger.send(method, *args, &block)
28
+ end
29
+ end
30
+
31
+ def respond_to?(*args)
32
+ logger.send(:respond_to?, *args) || super
33
+ end
34
+
35
+ def respond_to_missing?(method_name, include_private = false)
36
+ logger.send(:respond_to_missing?, method_name, include_private) || super
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ module BBK
2
+ module Utils
3
+ VERSION = '1.0.0'.freeze
4
+ end
5
+ end
@@ -0,0 +1,29 @@
1
+ require 'securerandom'
2
+ require 'russian'
3
+
4
+ module BBK
5
+ module Xml
6
+ MTOM_ID_FIRST_LETTERS = %w[a b c d e f].freeze
7
+
8
+ ##
9
+ # Метод для генерации идентификатора вложения подставляемого сервисом в xml вида сведений.
10
+ # Который затем в сервисе smev3 будет заменен на реальный идентификатор вложения в ftp хранилище.
11
+ def self.build_substitution_id(id)
12
+ "@{#{id}}"
13
+ end
14
+
15
+ # Создает attachment_id который можно указывать в AttachmentContent в качестве идентификатора
16
+ def self.generate_mtom_attachment_id
17
+ id = SecureRandom.uuid
18
+ id[0] = MTOM_ID_FIRST_LETTERS.sample
19
+ id
20
+ end
21
+
22
+ def self.normalize_slug(name, href)
23
+ href_uri = URI.parse(href)
24
+ # href_slug = [href_uri.scheme, href_uri.host, *href_uri.path.gsub('.', '-').split('/')].select(&:present?).join('-')
25
+ href_slug = [href_uri.scheme, href_uri.host, *href_uri.path.split('/'), href_uri.query].select(&:present?).join('-').gsub(/[\.&]/, '-')
26
+ Russian.translit "#{name}_#{href_slug}"
27
+ end
28
+ end
29
+ end
data/lib/bbk/utils.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'bbk/utils/config'
4
+ require 'bbk/utils/crypt'
5
+ require 'bbk/utils/logger'
6
+ require 'bbk/utils/proxy_logger'
7
+ require 'bbk/utils/version'
8
+ require 'bbk/utils/xml'
9
+ require 'bbk/utils/env_helper'
10
+
11
+ module BBK
12
+ module Utils
13
+ class << self
14
+ attr_accessor :logger
15
+
16
+ end
17
+
18
+ self.logger = ::Logger.new(STDOUT)
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bbk-utils
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.68936
5
+ platform: ruby
6
+ authors:
7
+ - Samoilenko Yuri
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-11-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: russian
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faker
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '12.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '12.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec_junit_formatter
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubycritic
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov-console
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Support classes for BBK stack
168
+ email:
169
+ - kinnalru@gmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - Gemfile
175
+ - Gemfile.lock
176
+ - README.md
177
+ - bin/console
178
+ - bin/setup
179
+ - lib/bbk/utils.rb
180
+ - lib/bbk/utils/config.rb
181
+ - lib/bbk/utils/crypt.rb
182
+ - lib/bbk/utils/env_helper.rb
183
+ - lib/bbk/utils/log_formatter.rb
184
+ - lib/bbk/utils/logger.rb
185
+ - lib/bbk/utils/proxy_logger.rb
186
+ - lib/bbk/utils/version.rb
187
+ - lib/bbk/utils/xml.rb
188
+ homepage:
189
+ licenses: []
190
+ metadata: {}
191
+ post_install_message:
192
+ rdoc_options: []
193
+ require_paths:
194
+ - lib
195
+ required_ruby_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ requirements: []
206
+ rubygems_version: 3.2.32
207
+ signing_key:
208
+ specification_version: 4
209
+ summary: Support classes for BBK stack
210
+ test_files: []