qbash 0.8.3 → 0.8.4
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 +1 -0
- data/Gemfile.lock +18 -14
- data/Rakefile +2 -2
- data/lib/qbash.rb +36 -19
- data/qbash.gemspec +7 -9
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e16623b1c48dc17b9ce7589800fd59da736e73b0eb4faa620dcd51a6ebb88524
|
|
4
|
+
data.tar.gz: 26e03a152a2ceb3d47f44abf9b36853b70b0ddfde4bb00ee2bac300b96f8e10b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e14d97c0a8ac90796f1747fa97d698c5e07dbf9626d65db1d8d10ef343d49d04051375df52f3babfc40b8adb1314f22e8fd80cb1e198a41adfc9a40d4e6e2602
|
|
7
|
+
data.tar.gz: e309cc6c08336d8dd368b3b550b07049091c8fefde0fde081b6af28793cb019b95666d9dff525f8d169a18889ecbd68d99fccf57451dfdf4c3994a72d6857de4
|
data/Gemfile
CHANGED
|
@@ -14,6 +14,7 @@ gem 'rake', '~>13.2', require: false
|
|
|
14
14
|
gem 'random-port', '~>0.0', require: false
|
|
15
15
|
gem 'rdoc', '~>7.0', require: false
|
|
16
16
|
gem 'rubocop', '~>1.73', require: false
|
|
17
|
+
gem 'rubocop-elegant', '~>0.5', require: false
|
|
17
18
|
gem 'rubocop-minitest', '~>0.38', require: false
|
|
18
19
|
gem 'rubocop-performance', '~>1.25', require: false
|
|
19
20
|
gem 'rubocop-rake', '~>0.7', require: false
|
data/Gemfile.lock
CHANGED
|
@@ -16,7 +16,7 @@ GEM
|
|
|
16
16
|
ast (2.4.3)
|
|
17
17
|
backtrace (0.4.1)
|
|
18
18
|
base64 (0.3.0)
|
|
19
|
-
bigdecimal (4.1.
|
|
19
|
+
bigdecimal (4.1.2)
|
|
20
20
|
builder (3.3.0)
|
|
21
21
|
crack (1.0.1)
|
|
22
22
|
bigdecimal
|
|
@@ -40,7 +40,7 @@ GEM
|
|
|
40
40
|
cucumber-tag-expressions (> 6, < 9)
|
|
41
41
|
cucumber-cucumber-expressions (19.0.0)
|
|
42
42
|
bigdecimal
|
|
43
|
-
cucumber-gherkin (39.
|
|
43
|
+
cucumber-gherkin (39.1.0)
|
|
44
44
|
cucumber-messages (>= 31, < 33)
|
|
45
45
|
cucumber-html-formatter (23.1.0)
|
|
46
46
|
cucumber-messages (> 23, < 33)
|
|
@@ -54,7 +54,7 @@ GEM
|
|
|
54
54
|
loog (~> 0.6)
|
|
55
55
|
tago (~> 0.1)
|
|
56
56
|
ellipsized (0.3.0)
|
|
57
|
-
erb (6.0.
|
|
57
|
+
erb (6.0.4)
|
|
58
58
|
ffi (1.17.4-aarch64-linux-gnu)
|
|
59
59
|
ffi (1.17.4-arm-linux-gnu)
|
|
60
60
|
ffi (1.17.4-arm64-darwin)
|
|
@@ -63,7 +63,7 @@ GEM
|
|
|
63
63
|
ffi (1.17.4-x86_64-darwin)
|
|
64
64
|
ffi (1.17.4-x86_64-linux-gnu)
|
|
65
65
|
hashdiff (1.2.1)
|
|
66
|
-
json (2.19.
|
|
66
|
+
json (2.19.5)
|
|
67
67
|
language_server-protocol (3.17.0.5)
|
|
68
68
|
lint_roller (1.1.0)
|
|
69
69
|
logger (1.7.0)
|
|
@@ -73,7 +73,7 @@ GEM
|
|
|
73
73
|
memoist3 (1.0.0)
|
|
74
74
|
mini_mime (1.1.5)
|
|
75
75
|
mini_portile2 (2.8.9)
|
|
76
|
-
minitest (6.0.
|
|
76
|
+
minitest (6.0.6)
|
|
77
77
|
drb (~> 2.0)
|
|
78
78
|
prism (~> 1.5)
|
|
79
79
|
minitest-reporters (1.8.0)
|
|
@@ -83,22 +83,22 @@ GEM
|
|
|
83
83
|
ruby-progressbar
|
|
84
84
|
multi_test (1.1.0)
|
|
85
85
|
net-ping (2.0.8)
|
|
86
|
-
nokogiri (1.19.
|
|
86
|
+
nokogiri (1.19.3)
|
|
87
87
|
mini_portile2 (~> 2.8.2)
|
|
88
88
|
racc (~> 1.4)
|
|
89
|
-
nokogiri (1.19.
|
|
89
|
+
nokogiri (1.19.3-aarch64-linux-gnu)
|
|
90
90
|
racc (~> 1.4)
|
|
91
|
-
nokogiri (1.19.
|
|
91
|
+
nokogiri (1.19.3-arm-linux-gnu)
|
|
92
92
|
racc (~> 1.4)
|
|
93
|
-
nokogiri (1.19.
|
|
93
|
+
nokogiri (1.19.3-arm64-darwin)
|
|
94
94
|
racc (~> 1.4)
|
|
95
|
-
nokogiri (1.19.
|
|
95
|
+
nokogiri (1.19.3-x64-mingw-ucrt)
|
|
96
96
|
racc (~> 1.4)
|
|
97
|
-
nokogiri (1.19.
|
|
97
|
+
nokogiri (1.19.3-x86_64-darwin)
|
|
98
98
|
racc (~> 1.4)
|
|
99
|
-
nokogiri (1.19.
|
|
99
|
+
nokogiri (1.19.3-x86_64-linux-gnu)
|
|
100
100
|
racc (~> 1.4)
|
|
101
|
-
parallel (2.0
|
|
101
|
+
parallel (2.1.0)
|
|
102
102
|
parser (3.3.11.1)
|
|
103
103
|
ast (~> 2.4.1)
|
|
104
104
|
racc
|
|
@@ -118,7 +118,7 @@ GEM
|
|
|
118
118
|
tsort
|
|
119
119
|
regexp_parser (2.12.0)
|
|
120
120
|
rexml (3.4.4)
|
|
121
|
-
rubocop (1.86.
|
|
121
|
+
rubocop (1.86.2)
|
|
122
122
|
json (~> 2.3)
|
|
123
123
|
language_server-protocol (~> 3.17.0.2)
|
|
124
124
|
lint_roller (~> 1.1.0)
|
|
@@ -132,6 +132,9 @@ GEM
|
|
|
132
132
|
rubocop-ast (1.49.1)
|
|
133
133
|
parser (>= 3.3.7.2)
|
|
134
134
|
prism (~> 1.7)
|
|
135
|
+
rubocop-elegant (0.5.0)
|
|
136
|
+
lint_roller (~> 1.1)
|
|
137
|
+
rubocop (~> 1.75)
|
|
135
138
|
rubocop-minitest (0.39.1)
|
|
136
139
|
lint_roller (~> 1.1)
|
|
137
140
|
rubocop (>= 1.75.0, < 2.0)
|
|
@@ -197,6 +200,7 @@ DEPENDENCIES
|
|
|
197
200
|
random-port (~> 0.0)
|
|
198
201
|
rdoc (~> 7.0)
|
|
199
202
|
rubocop (~> 1.73)
|
|
203
|
+
rubocop-elegant (~> 0.5)
|
|
200
204
|
rubocop-minitest (~> 0.38)
|
|
201
205
|
rubocop-performance (~> 1.25)
|
|
202
206
|
rubocop-rake (~> 0.7)
|
data/Rakefile
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'rake'
|
|
4
|
+
require 'rake/clean'
|
|
3
5
|
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
6
|
# SPDX-License-Identifier: MIT
|
|
5
7
|
|
|
6
8
|
require 'rubygems'
|
|
7
|
-
require 'rake'
|
|
8
|
-
require 'rake/clean'
|
|
9
9
|
|
|
10
10
|
def name
|
|
11
11
|
@name ||= File.basename(Dir['*.gemspec'].first, '.*')
|
data/lib/qbash.rb
CHANGED
|
@@ -8,6 +8,7 @@ require 'logger'
|
|
|
8
8
|
require 'loog'
|
|
9
9
|
require 'open3'
|
|
10
10
|
require 'tago'
|
|
11
|
+
require 'time'
|
|
11
12
|
|
|
12
13
|
# Execute one bash command.
|
|
13
14
|
#
|
|
@@ -81,7 +82,7 @@ module Kernel
|
|
|
81
82
|
# # Useful on Windows where /bin/bash is not available
|
|
82
83
|
# qbash('dir C:\\', raw: true)
|
|
83
84
|
#
|
|
84
|
-
# For
|
|
85
|
+
# For commands with multiple arguments, you can use +Shellwords.escape()+ to
|
|
85
86
|
# properly escape each argument.
|
|
86
87
|
#
|
|
87
88
|
# == Stderr Handling
|
|
@@ -112,10 +113,14 @@ module Kernel
|
|
|
112
113
|
# @param [String] chdir Directory to change to before running the command (or +nil+ to use current directory)
|
|
113
114
|
# @param [Boolean] raw If +true+, run the command via the system shell instead of +/bin/bash+
|
|
114
115
|
# @return [String] Everything that was printed to the +stdout+ by the command
|
|
115
|
-
def qbash(
|
|
116
|
-
|
|
116
|
+
def qbash(
|
|
117
|
+
*cmd, opts: [], stdin: '', env: {},
|
|
118
|
+
stdout: Loog::NULL, stderr: nil,
|
|
119
|
+
accept: [0], both: false,
|
|
120
|
+
level: Logger::DEBUG, chdir: nil, raw: false
|
|
121
|
+
)
|
|
117
122
|
stderr ||= stdout
|
|
118
|
-
env.each { |k, v| raise "env[#{k}] is nil" if v.nil? }
|
|
123
|
+
env.each { |k, v| raise(ArgumentError, "env[#{k}] is nil") if v.nil? }
|
|
119
124
|
env = env.transform_values(&:to_s)
|
|
120
125
|
cmd = cmd.reject { |a| a.nil? || (a.is_a?(String) && a.empty?) }.join(' ')
|
|
121
126
|
mtd =
|
|
@@ -129,17 +134,17 @@ module Kernel
|
|
|
129
134
|
when Logger::ERROR
|
|
130
135
|
:error
|
|
131
136
|
else
|
|
132
|
-
raise "Unknown log level #{level}"
|
|
137
|
+
raise(ArgumentError, "Unknown log level #{level}")
|
|
133
138
|
end
|
|
134
139
|
printer =
|
|
135
140
|
lambda do |target, msg|
|
|
136
141
|
msg = msg.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?').gsub(/\n$/, '')
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
unless target.nil?
|
|
143
|
+
if target.respond_to?(mtd)
|
|
144
|
+
target.__send__(mtd, msg)
|
|
145
|
+
else
|
|
146
|
+
target.print("#{msg}\n")
|
|
147
|
+
end
|
|
143
148
|
end
|
|
144
149
|
end
|
|
145
150
|
buf = +''
|
|
@@ -152,13 +157,13 @@ module Kernel
|
|
|
152
157
|
bash = ['/bin/bash'] + opts + ['-c', cmd]
|
|
153
158
|
chdir.nil? ? [env, *bash] : [env, *bash, { chdir: }]
|
|
154
159
|
end
|
|
155
|
-
Open3.
|
|
160
|
+
Open3.__send__(:popen3, *popen) do |sin, sout, serr, ctrl|
|
|
156
161
|
pid = ctrl.pid
|
|
157
162
|
printer[stderr, "+ #{cmd} /##{pid}"]
|
|
158
163
|
consume =
|
|
159
164
|
lambda do |stream, target, buffer|
|
|
160
165
|
loop do
|
|
161
|
-
sleep
|
|
166
|
+
sleep(0.001)
|
|
162
167
|
break if stream.closed? || stream.eof?
|
|
163
168
|
ln = stream.gets
|
|
164
169
|
next if ln.nil?
|
|
@@ -176,7 +181,7 @@ module Kernel
|
|
|
176
181
|
watch = Thread.new { consume.call(sout, stdout, buf) }
|
|
177
182
|
watch.abort_on_exception = true
|
|
178
183
|
begin
|
|
179
|
-
yield
|
|
184
|
+
yield(pid)
|
|
180
185
|
ensure
|
|
181
186
|
sout.close
|
|
182
187
|
serr&.close
|
|
@@ -192,8 +197,7 @@ module Kernel
|
|
|
192
197
|
attempt += 1
|
|
193
198
|
rescue Errno::ESRCH
|
|
194
199
|
if attempt > 1
|
|
195
|
-
printer[stderr,
|
|
196
|
-
"Process ##{pid} reacted to SIGTERM, after #{attempt} attempts and #{since.ago}"]
|
|
200
|
+
printer[stderr, "Process ##{pid} reacted to SIGTERM, after #{attempt} attempts and #{since.ago}"]
|
|
197
201
|
end
|
|
198
202
|
break
|
|
199
203
|
end
|
|
@@ -214,11 +218,24 @@ module Kernel
|
|
|
214
218
|
end
|
|
215
219
|
end
|
|
216
220
|
status = ctrl.value
|
|
217
|
-
|
|
221
|
+
if status.nil?
|
|
222
|
+
raise(
|
|
223
|
+
StandardError,
|
|
224
|
+
"The command '#{cmd}' wait status is unavailable in #{start.ago}\n#{buf}"
|
|
225
|
+
)
|
|
226
|
+
end
|
|
218
227
|
e = status.exitstatus || (status.termsig ? 128 + status.termsig : nil)
|
|
219
228
|
if !accept.nil? && !accept.include?(e)
|
|
220
|
-
|
|
221
|
-
|
|
229
|
+
raise(
|
|
230
|
+
StandardError,
|
|
231
|
+
"The command '#{cmd}' failed (#{
|
|
232
|
+
if status.signaled?
|
|
233
|
+
"killed by signal #{status.termsig}"
|
|
234
|
+
else
|
|
235
|
+
"exit code ##{e}"
|
|
236
|
+
end
|
|
237
|
+
}) in #{start.ago}\n#{buf}"
|
|
238
|
+
)
|
|
222
239
|
end
|
|
223
240
|
end
|
|
224
241
|
return [buf, e] if both
|
data/qbash.gemspec
CHANGED
|
@@ -6,15 +6,13 @@
|
|
|
6
6
|
require 'English'
|
|
7
7
|
|
|
8
8
|
Gem::Specification.new do |s|
|
|
9
|
-
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to?
|
|
9
|
+
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to?(:required_rubygems_version=)
|
|
10
10
|
s.required_ruby_version = '>=3.2'
|
|
11
11
|
s.name = 'qbash'
|
|
12
|
-
s.version = '0.8.
|
|
12
|
+
s.version = '0.8.4'
|
|
13
13
|
s.license = 'MIT'
|
|
14
14
|
s.summary = 'Quick Executor of a BASH Command'
|
|
15
|
-
s.description =
|
|
16
|
-
'With the help of Open3 executes bash command and conveniently ' \
|
|
17
|
-
'returns its output and exit code'
|
|
15
|
+
s.description = 'With the help of Open3 executes bash command and conveniently returns its output and exit code'
|
|
18
16
|
s.authors = ['Yegor Bugayenko']
|
|
19
17
|
s.email = 'yegor256@gmail.com'
|
|
20
18
|
s.homepage = 'https://github.com/yegor256/qbash'
|
|
@@ -22,9 +20,9 @@ Gem::Specification.new do |s|
|
|
|
22
20
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
23
21
|
s.rdoc_options = ['--charset=UTF-8']
|
|
24
22
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
|
25
|
-
s.add_dependency
|
|
26
|
-
s.add_dependency
|
|
27
|
-
s.add_dependency
|
|
28
|
-
s.add_dependency
|
|
23
|
+
s.add_dependency('backtrace', '>0')
|
|
24
|
+
s.add_dependency('elapsed', '>0')
|
|
25
|
+
s.add_dependency('loog', '>0')
|
|
26
|
+
s.add_dependency('tago', '>0')
|
|
29
27
|
s.metadata['rubygems_mfa_required'] = 'true'
|
|
30
28
|
end
|