qbash 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/Gemfile.lock +8 -7
- data/README.md +11 -3
- data/lib/qbash.rb +30 -19
- data/qbash.gemspec +2 -1
- data/test/test_qbash.rb +6 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 629198be7c8f09f07807f2fdc3f43b771df5d1b97ef33ae3a827c1d56a9ec98c
|
4
|
+
data.tar.gz: f7b85be41ea296b819d13e3f4cb23f9d0bfb8137de8f05cd6f10737e535c68a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 026321cb7140203439059803f02a305980c5c44b988c9ebab82522eb8ede41d9d45dad8c6b1d312fcf7a9ae2192cabd2a67b7305e98d8836fd25d5276ceb6a48
|
7
|
+
data.tar.gz: fd16b90f2af7f1a8ff116e0c1d95cc66a760e4c6c74fcc2763990d9ccf8b07517b6886277e81c8e18164db4c794ac7b619f5df98a20eed888b36fc0fbd300423
|
data/Gemfile
CHANGED
@@ -32,9 +32,9 @@ gem 'random-port', '~>0.0', require: false
|
|
32
32
|
gem 'rspec-rails', '7.0.1', require: false
|
33
33
|
gem 'rubocop', '1.66.1', require: false
|
34
34
|
gem 'rubocop-performance', '1.22.1', require: false
|
35
|
-
gem 'rubocop-rspec', '3.0
|
35
|
+
gem 'rubocop-rspec', '3.1.0', require: false
|
36
36
|
gem 'simplecov', '0.22.0', require: false
|
37
37
|
gem 'simplecov-cobertura', '2.1.0', require: false
|
38
38
|
gem 'w3c_validators', '1.3.7', require: false
|
39
|
-
gem 'webmock', '3.
|
39
|
+
gem 'webmock', '3.24.0', require: false
|
40
40
|
gem 'yard', '0.9.37', require: false
|
data/Gemfile.lock
CHANGED
@@ -5,6 +5,7 @@ PATH
|
|
5
5
|
backtrace (> 0)
|
6
6
|
elapsed (> 0)
|
7
7
|
loog (> 0)
|
8
|
+
tago (> 0)
|
8
9
|
|
9
10
|
GEM
|
10
11
|
remote: https://rubygems.org/
|
@@ -94,7 +95,7 @@ GEM
|
|
94
95
|
i18n (1.14.6)
|
95
96
|
concurrent-ruby (~> 1.0)
|
96
97
|
io-console (0.7.2)
|
97
|
-
irb (1.14.
|
98
|
+
irb (1.14.1)
|
98
99
|
rdoc (>= 4.0.0)
|
99
100
|
reline (>= 0.4.2)
|
100
101
|
json (2.7.2)
|
@@ -166,7 +167,7 @@ GEM
|
|
166
167
|
regexp_parser (2.9.2)
|
167
168
|
reline (0.5.10)
|
168
169
|
io-console (~> 0.5)
|
169
|
-
rexml (3.3.
|
170
|
+
rexml (3.3.8)
|
170
171
|
rspec-core (3.13.1)
|
171
172
|
rspec-support (~> 3.13.0)
|
172
173
|
rspec-expectations (3.13.3)
|
@@ -199,7 +200,7 @@ GEM
|
|
199
200
|
rubocop-performance (1.22.1)
|
200
201
|
rubocop (>= 1.48.1, < 2.0)
|
201
202
|
rubocop-ast (>= 1.31.1, < 2.0)
|
202
|
-
rubocop-rspec (3.0
|
203
|
+
rubocop-rspec (3.1.0)
|
203
204
|
rubocop (~> 1.61)
|
204
205
|
ruby-progressbar (1.13.0)
|
205
206
|
securerandom (0.3.1)
|
@@ -225,11 +226,11 @@ GEM
|
|
225
226
|
json (>= 1.8)
|
226
227
|
nokogiri (~> 1.6)
|
227
228
|
rexml (~> 3.2)
|
228
|
-
webmock (3.
|
229
|
+
webmock (3.24.0)
|
229
230
|
addressable (>= 2.8.0)
|
230
231
|
crack (>= 0.3.2)
|
231
232
|
hashdiff (>= 0.4.0, < 2.0.0)
|
232
|
-
webrick (1.8.
|
233
|
+
webrick (1.8.2)
|
233
234
|
yard (0.9.37)
|
234
235
|
zeitwerk (2.6.18)
|
235
236
|
|
@@ -253,11 +254,11 @@ DEPENDENCIES
|
|
253
254
|
rspec-rails (= 7.0.1)
|
254
255
|
rubocop (= 1.66.1)
|
255
256
|
rubocop-performance (= 1.22.1)
|
256
|
-
rubocop-rspec (= 3.0
|
257
|
+
rubocop-rspec (= 3.1.0)
|
257
258
|
simplecov (= 0.22.0)
|
258
259
|
simplecov-cobertura (= 2.1.0)
|
259
260
|
w3c_validators (= 1.3.7)
|
260
|
-
webmock (= 3.
|
261
|
+
webmock (= 3.24.0)
|
261
262
|
yard (= 0.9.37)
|
262
263
|
|
263
264
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -27,7 +27,7 @@ Then, you can use [qbash][qbash] global function:
|
|
27
27
|
|
28
28
|
```ruby
|
29
29
|
require 'qbash'
|
30
|
-
stdout = qbash('echo "Hello, world!"')
|
30
|
+
stdout = qbash('echo "Hello, world!"', log: $stdout)
|
31
31
|
```
|
32
32
|
|
33
33
|
If the command fails, an exception will be raised.
|
@@ -38,13 +38,13 @@ It's possible to provide the standard input and environment variables:
|
|
38
38
|
stdout = qbash('cat > $FILE', env: { 'FILE' => 'a.txt' }, stdin: 'Hello!')
|
39
39
|
```
|
40
40
|
|
41
|
-
It's possible to configure the logging facility too, with the help
|
41
|
+
It's possible to configure the logging facility too, for example, with the help
|
42
42
|
of the [loog](https://github.com/yegor256/loog) gem (the output
|
43
43
|
will be returned _and_ printed to the logger):
|
44
44
|
|
45
45
|
```ruby
|
46
46
|
require 'loog'
|
47
|
-
qbash('echo "Hello, world!"',
|
47
|
+
qbash('echo "Hello, world!"', log: Loog::VERBOSE)
|
48
48
|
```
|
49
49
|
|
50
50
|
You can also make it return both stdout and exit code, with the help
|
@@ -82,6 +82,14 @@ qbash("cat #{Shellwords.escape(file)}")
|
|
82
82
|
Without such an escaping, in this example, a space inside the `file`
|
83
83
|
will lead to an unpredicatable result of the execution.
|
84
84
|
|
85
|
+
You can also set the maximum time for the command:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
qbash("sleep 100", timeout: 4)
|
89
|
+
```
|
90
|
+
|
91
|
+
This command will raise exception after four seconds.
|
92
|
+
|
85
93
|
## How to contribute
|
86
94
|
|
87
95
|
Read
|
data/lib/qbash.rb
CHANGED
@@ -24,6 +24,7 @@ require 'backtrace'
|
|
24
24
|
require 'loog'
|
25
25
|
require 'open3'
|
26
26
|
require 'shellwords'
|
27
|
+
require 'tago'
|
27
28
|
|
28
29
|
# Execute one bash command.
|
29
30
|
#
|
@@ -37,14 +38,18 @@ module Kernel
|
|
37
38
|
#
|
38
39
|
# To escape arguments, use +Shellwords.escape()+ method.
|
39
40
|
#
|
41
|
+
# Read this <a href="https://github.com/yegor256/qbash">README</a> file for more details.
|
42
|
+
#
|
40
43
|
# @param [String] cmd The command to run, for example +echo "Hello, world!"+
|
41
44
|
# @param [String] stdin The +stdin+ to provide to the command
|
42
45
|
# @param [Hash] env Hash of environment variables
|
43
46
|
# @param [Loog|IO] log Logging facility with +.debug()+ method (or +$stdout+)
|
44
47
|
# @param [Array] accept List of accepted exit codes (accepts all if the list is empty)
|
45
48
|
# @param [Boolean] both If set to TRUE, the function returns an array +(stdout, code)+
|
49
|
+
# @param [Integer] timeout If it's set to non-NIL, the execution will fail after this number of seconds
|
46
50
|
# @return [String] Everything that was printed to the +stdout+ by the command
|
47
|
-
def qbash(cmd, stdin: '', env: {}, log: Loog::NULL, accept: [0], both: false)
|
51
|
+
def qbash(cmd, stdin: '', env: {}, log: Loog::NULL, accept: [0], both: false, timeout: nil)
|
52
|
+
cmd = cmd.join(' ') if cmd.is_a?(Array)
|
48
53
|
if log.respond_to?(:debug)
|
49
54
|
log.debug("+ #{cmd}")
|
50
55
|
else
|
@@ -52,26 +57,32 @@ module Kernel
|
|
52
57
|
end
|
53
58
|
buf = ''
|
54
59
|
e = 1
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
start = Time.now
|
61
|
+
thread =
|
62
|
+
Thread.new do
|
63
|
+
Open3.popen2e(env, "/bin/bash -c #{Shellwords.escape(cmd)}") do |sin, sout, thr|
|
64
|
+
sin.write(stdin)
|
65
|
+
sin.close
|
66
|
+
until sout.eof?
|
67
|
+
begin
|
68
|
+
ln = sout.gets
|
69
|
+
rescue IOError => e
|
70
|
+
ln = Backtrace.new(e).to_s
|
71
|
+
end
|
72
|
+
if log.respond_to?(:debug)
|
73
|
+
log.debug(ln)
|
74
|
+
else
|
75
|
+
log.print("#{ln}\n")
|
76
|
+
end
|
77
|
+
buf += ln
|
78
|
+
end
|
79
|
+
e = thr.value.to_i
|
80
|
+
if !accept.empty? && !accept.include?(e)
|
81
|
+
raise "The command '#{cmd}' failed with exit code ##{e} in #{start.ago}\n#{buf}"
|
82
|
+
end
|
64
83
|
end
|
65
|
-
if log.respond_to?(:debug)
|
66
|
-
log.debug(ln)
|
67
|
-
else
|
68
|
-
log.print("#{ln}\n")
|
69
|
-
end
|
70
|
-
buf += ln
|
71
84
|
end
|
72
|
-
|
73
|
-
raise "The command '#{cmd}' failed with exit code ##{e}\n#{buf}" if !accept.empty? && !accept.include?(e)
|
74
|
-
end
|
85
|
+
raise "Execution of #{cmd} timed out in #{start.ago}" if thread.join(timeout).nil?
|
75
86
|
return [buf, e] if both
|
76
87
|
buf
|
77
88
|
end
|
data/qbash.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
27
27
|
s.required_ruby_version = '>=3.2'
|
28
28
|
s.name = 'qbash'
|
29
|
-
s.version = '0.0.
|
29
|
+
s.version = '0.0.5'
|
30
30
|
s.license = 'MIT'
|
31
31
|
s.summary = 'Quick Executor of a BASH Command'
|
32
32
|
s.description =
|
@@ -42,5 +42,6 @@ Gem::Specification.new do |s|
|
|
42
42
|
s.add_dependency 'backtrace', '>0'
|
43
43
|
s.add_dependency 'elapsed', '>0'
|
44
44
|
s.add_dependency 'loog', '>0'
|
45
|
+
s.add_dependency 'tago', '>0'
|
45
46
|
s.metadata['rubygems_mfa_required'] = 'true'
|
46
47
|
end
|
data/test/test_qbash.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qbash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: tago
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: With the help of Open3 executes bash command and conveniently returns
|
56
70
|
its output and exit code
|
57
71
|
email: yegor256@gmail.com
|