bbk-utils 1.0.0.68936

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 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: []