qbash 0.4.5 → 0.4.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ca64f77c050b51b02164ffab0c532d6d915fe0ba76ed4d311894b150eac963f
4
- data.tar.gz: 4082a2f3aadf655a8fe6a6b7df67a85212f0fe9b8221bf64a26329abdfb8218a
3
+ metadata.gz: 82c7e31d5dacedf2c9404dca242f7983bf04c70e784454c5930895f6b27d53b6
4
+ data.tar.gz: 21340fe8ac7609a80d34d57e5e47658336bb7d0f094f5d1c5773d3e447b5cbfc
5
5
  SHA512:
6
- metadata.gz: 80535d4feebc803f62b1da69da63f2412330cc8f21a8ca9a5cfc344535b2c15c6816df65fcaa16db40efff702b8628dcd7817a4b93003a423b8928ea3df82d25
7
- data.tar.gz: 609155111977c724663a6ba5c6a90718252d0c520f608c3dcadf0abc80dc0bf5d135f27a1204cfc9a002371461c9ff2e8cff85b9862dc6404fc2baf0a9a70932
6
+ metadata.gz: c979a339e3b9a15ec37ef0cbca27c9d673b9aeb33ad05a1d39c8c410b0b4510f417d12358f798f6a5a48ec81a24eb1df994d612305289ec0ad0133a6ef61d398
7
+ data.tar.gz: 135b0f98ddbab247eb0689d6166bf93358e9eee3ab4f60bce6500f197a031eb48f01b195d0cc23f5bc1f3eab281e574dbbdcf34df868886b3ea8e46a03225fee
data/Gemfile CHANGED
@@ -6,7 +6,7 @@
6
6
  source 'https://rubygems.org'
7
7
  gemspec
8
8
 
9
- gem 'cucumber', '~>9.2', require: false
9
+ gem 'cucumber', '~>10.0', require: false
10
10
  gem 'minitest', '~>5.25', require: false
11
11
  gem 'minitest-reporters', '~>1.7', require: false
12
12
  gem 'net-ping', '~>2.0', require: false
@@ -14,11 +14,11 @@ gem 'rake', '~>13.2', require: false
14
14
  gem 'random-port', '~>0.0', require: false
15
15
  gem 'rdoc', '~>6.13', require: false
16
16
  gem 'rubocop', '~>1.73', require: false
17
- gem 'rubocop-minitest', '>0', require: false
18
- gem 'rubocop-performance', '>0', require: false
19
- gem 'rubocop-rake', '>0', require: false
17
+ gem 'rubocop-minitest', '~>0.38', require: false
18
+ gem 'rubocop-performance', '~>1.25', require: false
19
+ gem 'rubocop-rake', '~>0.7', require: false
20
20
  gem 'simplecov', '~>0.22', require: false
21
- gem 'simplecov-cobertura', '~>2.1', require: false
21
+ gem 'simplecov-cobertura', '~>3.0', require: false
22
22
  gem 'w3c_validators', '~>1.3', require: false
23
23
  gem 'webmock', '~>3.25', require: false
24
24
  gem 'yard', '~>0.9', require: false
data/Gemfile.lock CHANGED
@@ -14,43 +14,45 @@ GEM
14
14
  public_suffix (>= 2.0.2, < 7.0)
15
15
  ansi (1.5.0)
16
16
  ast (2.4.3)
17
- backtrace (0.4.0)
18
- bigdecimal (3.1.9)
17
+ backtrace (0.4.1)
18
+ base64 (0.3.0)
19
+ bigdecimal (3.3.1)
19
20
  builder (3.3.0)
20
- crack (1.0.0)
21
+ crack (1.0.1)
21
22
  bigdecimal
22
23
  rexml
23
- cucumber (9.2.1)
24
+ cucumber (10.1.1)
25
+ base64 (~> 0.2)
24
26
  builder (~> 3.2)
25
27
  cucumber-ci-environment (> 9, < 11)
26
- cucumber-core (> 13, < 14)
27
- cucumber-cucumber-expressions (~> 17.0)
28
- cucumber-gherkin (> 24, < 28)
28
+ cucumber-core (> 15, < 17)
29
+ cucumber-cucumber-expressions (> 17, < 19)
29
30
  cucumber-html-formatter (> 20.3, < 22)
30
- cucumber-messages (> 19, < 25)
31
31
  diff-lcs (~> 1.5)
32
+ logger (~> 1.6)
32
33
  mini_mime (~> 1.1)
33
34
  multi_test (~> 1.1)
34
- sys-uname (~> 1.2)
35
+ sys-uname (~> 1.3)
35
36
  cucumber-ci-environment (10.0.1)
36
- cucumber-core (13.0.3)
37
- cucumber-gherkin (>= 27, < 28)
38
- cucumber-messages (>= 20, < 23)
39
- cucumber-tag-expressions (> 5, < 7)
40
- cucumber-cucumber-expressions (17.1.0)
37
+ cucumber-core (15.3.0)
38
+ cucumber-gherkin (> 27, < 35)
39
+ cucumber-messages (> 26, < 30)
40
+ cucumber-tag-expressions (> 5, < 9)
41
+ cucumber-cucumber-expressions (18.0.1)
41
42
  bigdecimal
42
- cucumber-gherkin (27.0.0)
43
- cucumber-messages (>= 19.1.4, < 23)
44
- cucumber-html-formatter (21.9.0)
43
+ cucumber-gherkin (34.0.0)
44
+ cucumber-messages (> 25, < 29)
45
+ cucumber-html-formatter (21.15.1)
45
46
  cucumber-messages (> 19, < 28)
46
- cucumber-messages (22.0.0)
47
- cucumber-tag-expressions (6.1.2)
47
+ cucumber-messages (27.2.0)
48
+ cucumber-tag-expressions (8.0.0)
48
49
  date (3.4.1)
49
- diff-lcs (1.6.1)
50
+ diff-lcs (1.6.2)
50
51
  docile (1.4.1)
51
- elapsed (0.0.1)
52
- loog (> 0)
53
- tago (> 0)
52
+ elapsed (0.2.0)
53
+ loog (~> 0.6)
54
+ tago (~> 0.1)
55
+ erb (5.1.1)
54
56
  ffi (1.17.2-aarch64-linux-gnu)
55
57
  ffi (1.17.2-arm-linux-gnu)
56
58
  ffi (1.17.2-arm64-darwin)
@@ -58,16 +60,17 @@ GEM
58
60
  ffi (1.17.2-x86-linux-gnu)
59
61
  ffi (1.17.2-x86_64-darwin)
60
62
  ffi (1.17.2-x86_64-linux-gnu)
61
- hashdiff (1.1.2)
62
- json (2.11.3)
63
- language_server-protocol (3.17.0.4)
63
+ hashdiff (1.2.1)
64
+ json (2.15.1)
65
+ language_server-protocol (3.17.0.5)
64
66
  lint_roller (1.1.0)
65
67
  logger (1.7.0)
66
68
  loog (0.6.1)
67
69
  logger (~> 1.0)
70
+ memoist3 (1.0.0)
68
71
  mini_mime (1.1.5)
69
- mini_portile2 (2.8.8)
70
- minitest (5.25.5)
72
+ mini_portile2 (2.8.9)
73
+ minitest (5.26.0)
71
74
  minitest-reporters (1.7.1)
72
75
  ansi
73
76
  builder
@@ -75,40 +78,42 @@ GEM
75
78
  ruby-progressbar
76
79
  multi_test (1.1.0)
77
80
  net-ping (2.0.8)
78
- nokogiri (1.18.8)
81
+ nokogiri (1.18.10)
79
82
  mini_portile2 (~> 2.8.2)
80
83
  racc (~> 1.4)
81
- nokogiri (1.18.8-aarch64-linux-gnu)
84
+ nokogiri (1.18.10-aarch64-linux-gnu)
82
85
  racc (~> 1.4)
83
- nokogiri (1.18.8-arm-linux-gnu)
86
+ nokogiri (1.18.10-arm-linux-gnu)
84
87
  racc (~> 1.4)
85
- nokogiri (1.18.8-arm64-darwin)
88
+ nokogiri (1.18.10-arm64-darwin)
86
89
  racc (~> 1.4)
87
- nokogiri (1.18.8-x64-mingw-ucrt)
90
+ nokogiri (1.18.10-x64-mingw-ucrt)
88
91
  racc (~> 1.4)
89
- nokogiri (1.18.8-x86_64-darwin)
92
+ nokogiri (1.18.10-x86_64-darwin)
90
93
  racc (~> 1.4)
91
- nokogiri (1.18.8-x86_64-linux-gnu)
94
+ nokogiri (1.18.10-x86_64-linux-gnu)
92
95
  racc (~> 1.4)
93
96
  parallel (1.27.0)
94
- parser (3.3.8.0)
97
+ parser (3.3.9.0)
95
98
  ast (~> 2.4.1)
96
99
  racc
97
- prism (1.4.0)
98
- psych (5.2.5)
100
+ prism (1.6.0)
101
+ psych (5.2.6)
99
102
  date
100
103
  stringio
101
104
  public_suffix (6.0.2)
102
105
  racc (1.8.1)
103
106
  rainbow (3.1.1)
104
- rake (13.2.1)
105
- random-port (0.7.5)
106
- tago (> 0)
107
- rdoc (6.13.1)
107
+ rake (13.3.0)
108
+ random-port (0.7.6)
109
+ tago (~> 0.0)
110
+ rdoc (6.15.0)
111
+ erb
108
112
  psych (>= 4.0.0)
109
- regexp_parser (2.10.0)
110
- rexml (3.4.1)
111
- rubocop (1.75.5)
113
+ tsort
114
+ regexp_parser (2.11.3)
115
+ rexml (3.4.4)
116
+ rubocop (1.81.6)
112
117
  json (~> 2.3)
113
118
  language_server-protocol (~> 3.17.0.2)
114
119
  lint_roller (~> 1.1.0)
@@ -116,20 +121,20 @@ GEM
116
121
  parser (>= 3.3.0.2)
117
122
  rainbow (>= 2.2.2, < 4.0)
118
123
  regexp_parser (>= 2.9.3, < 3.0)
119
- rubocop-ast (>= 1.44.0, < 2.0)
124
+ rubocop-ast (>= 1.47.1, < 2.0)
120
125
  ruby-progressbar (~> 1.7)
121
126
  unicode-display_width (>= 2.4.0, < 4.0)
122
- rubocop-ast (1.44.1)
127
+ rubocop-ast (1.47.1)
123
128
  parser (>= 3.3.7.2)
124
129
  prism (~> 1.4)
125
- rubocop-minitest (0.38.0)
130
+ rubocop-minitest (0.38.2)
126
131
  lint_roller (~> 1.1)
127
132
  rubocop (>= 1.75.0, < 2.0)
128
133
  rubocop-ast (>= 1.38.0, < 2.0)
129
- rubocop-performance (1.25.0)
134
+ rubocop-performance (1.26.1)
130
135
  lint_roller (~> 1.1)
131
136
  rubocop (>= 1.75.0, < 2.0)
132
- rubocop-ast (>= 1.38.0, < 2.0)
137
+ rubocop-ast (>= 1.47.1, < 2.0)
133
138
  rubocop-rake (0.7.1)
134
139
  lint_roller (~> 1.1)
135
140
  rubocop (>= 1.72.1)
@@ -138,18 +143,20 @@ GEM
138
143
  docile (~> 1.1)
139
144
  simplecov-html (~> 0.11)
140
145
  simplecov_json_formatter (~> 0.1)
141
- simplecov-cobertura (2.1.0)
146
+ simplecov-cobertura (3.1.0)
142
147
  rexml
143
148
  simplecov (~> 0.19)
144
- simplecov-html (0.13.1)
149
+ simplecov-html (0.13.2)
145
150
  simplecov_json_formatter (0.1.4)
146
151
  stringio (3.1.7)
147
- sys-uname (1.3.1)
152
+ sys-uname (1.4.1)
148
153
  ffi (~> 1.1)
149
- tago (0.1.0)
150
- unicode-display_width (3.1.4)
151
- unicode-emoji (~> 4.0, >= 4.0.4)
152
- unicode-emoji (4.0.4)
154
+ memoist3 (~> 1.0.0)
155
+ tago (0.3.0)
156
+ tsort (0.2.0)
157
+ unicode-display_width (3.2.0)
158
+ unicode-emoji (~> 4.1)
159
+ unicode-emoji (4.1.0)
153
160
  w3c_validators (1.3.7)
154
161
  json (>= 1.8)
155
162
  nokogiri (~> 1.6)
@@ -171,7 +178,7 @@ PLATFORMS
171
178
  x86_64-linux
172
179
 
173
180
  DEPENDENCIES
174
- cucumber (~> 9.2)
181
+ cucumber (~> 10.0)
175
182
  minitest (~> 5.25)
176
183
  minitest-reporters (~> 1.7)
177
184
  net-ping (~> 2.0)
@@ -180,11 +187,11 @@ DEPENDENCIES
180
187
  random-port (~> 0.0)
181
188
  rdoc (~> 6.13)
182
189
  rubocop (~> 1.73)
183
- rubocop-minitest (> 0)
184
- rubocop-performance (> 0)
185
- rubocop-rake (> 0)
190
+ rubocop-minitest (~> 0.38)
191
+ rubocop-performance (~> 1.25)
192
+ rubocop-rake (~> 0.7)
186
193
  simplecov (~> 0.22)
187
- simplecov-cobertura (~> 2.1)
194
+ simplecov-cobertura (~> 3.0)
188
195
  w3c_validators (~> 1.3)
189
196
  webmock (~> 3.25)
190
197
  yard (~> 0.9)
data/REUSE.toml CHANGED
@@ -10,6 +10,7 @@ path = [
10
10
  ".pdd",
11
11
  "**.json",
12
12
  "**.md",
13
+ "**.png",
13
14
  "**.txt",
14
15
  "**/.DS_Store",
15
16
  "**/.gitignore",
data/lib/qbash.rb CHANGED
@@ -7,7 +7,6 @@ require 'backtrace'
7
7
  require 'logger'
8
8
  require 'loog'
9
9
  require 'open3'
10
- require 'shellwords'
11
10
  require 'tago'
12
11
 
13
12
  # Execute one bash command.
@@ -112,14 +111,15 @@ module Kernel
112
111
  buf = ''
113
112
  e = 1
114
113
  start = Time.now
115
- bash = ['exec', '/bin/bash'] + opts + ['-c', Shellwords.escape(cmd)]
116
- Open3.popen2e(env, bash.join(' ')) do |sin, sout, ctrl|
114
+ bash = ['/bin/bash'] + opts + ['-c', cmd]
115
+ Open3.popen2e(env, *bash) do |sin, sout, ctrl|
117
116
  pid = ctrl.pid
118
117
  logit["+ #{cmd} /##{pid}"]
119
118
  consume =
120
119
  lambda do
121
120
  loop do
122
- break if sout.eof?
121
+ sleep 0.001
122
+ break if sout.closed? || sout.eof?
123
123
  ln = sout.gets # together with the \n at the end
124
124
  next if ln.nil?
125
125
  next if ln.empty?
data/qbash.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
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.4.5'
12
+ s.version = '0.4.6'
13
13
  s.license = 'MIT'
14
14
  s.summary = 'Quick Executor of a BASH Command'
15
15
  s.description =
@@ -17,8 +17,8 @@ Gem::Specification.new do |s|
17
17
  'returns its output and exit code'
18
18
  s.authors = ['Yegor Bugayenko']
19
19
  s.email = 'yegor256@gmail.com'
20
- s.homepage = 'http://github.com/yegor256/qbash'
21
- s.files = `git ls-files`.split($RS)
20
+ s.homepage = 'https://github.com/yegor256/qbash'
21
+ s.files = `git ls-files | grep -v -E '^(test/|\\.|renovate)'`.split($RS)
22
22
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
23
23
  s.rdoc_options = ['--charset=UTF-8']
24
24
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qbash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -74,22 +74,6 @@ extra_rdoc_files:
74
74
  - LICENSE.txt
75
75
  - README.md
76
76
  files:
77
- - ".0pdd.yml"
78
- - ".gitattributes"
79
- - ".github/workflows/actionlint.yml"
80
- - ".github/workflows/codecov.yml"
81
- - ".github/workflows/copyrights.yml"
82
- - ".github/workflows/markdown-lint.yml"
83
- - ".github/workflows/pdd.yml"
84
- - ".github/workflows/rake.yml"
85
- - ".github/workflows/reuse.yml"
86
- - ".github/workflows/typos.yml"
87
- - ".github/workflows/xcop.yml"
88
- - ".github/workflows/yamllint.yml"
89
- - ".gitignore"
90
- - ".pdd"
91
- - ".rubocop.yml"
92
- - ".rultor.yml"
93
77
  - Gemfile
94
78
  - Gemfile.lock
95
79
  - LICENSE.txt
@@ -99,10 +83,7 @@ files:
99
83
  - Rakefile
100
84
  - lib/qbash.rb
101
85
  - qbash.gemspec
102
- - renovate.json
103
- - test/test__helper.rb
104
- - test/test_qbash.rb
105
- homepage: http://github.com/yegor256/qbash
86
+ homepage: https://github.com/yegor256/qbash
106
87
  licenses:
107
88
  - MIT
108
89
  metadata:
@@ -122,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
103
  - !ruby/object:Gem::Version
123
104
  version: '0'
124
105
  requirements: []
125
- rubygems_version: 3.6.7
106
+ rubygems_version: 3.6.9
126
107
  specification_version: 4
127
108
  summary: Quick Executor of a BASH Command
128
109
  test_files: []
data/.0pdd.yml DELETED
@@ -1,8 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- errors:
5
- - yegor256@gmail.com
6
- # alerts:
7
- # github:
8
- # - yegor256
data/.gitattributes DELETED
@@ -1,7 +0,0 @@
1
- # Check out all text files in UNIX format, with LF as end of line
2
- # Don't change this file. If you have any ideas about it, please
3
- # submit a separate issue about it and we'll discuss.
4
-
5
- * text=auto eol=lf
6
- *.java ident
7
- *.xml ident
@@ -1,25 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: actionlint
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- actionlint:
15
- timeout-minutes: 15
16
- runs-on: ubuntu-24.04
17
- steps:
18
- - uses: actions/checkout@v4
19
- - name: Download actionlint
20
- id: get_actionlint
21
- run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
22
- shell: bash
23
- - name: Check workflow files
24
- run: ${{ steps.get_actionlint.outputs.executable }} -color
25
- shell: bash
@@ -1,25 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: codecov
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- jobs:
11
- codecov:
12
- timeout-minutes: 15
13
- runs-on: ubuntu-24.04
14
- steps:
15
- - uses: actions/checkout@v4
16
- - uses: ruby/setup-ruby@v1
17
- with:
18
- ruby-version: 3.3
19
- bundler-cache: true
20
- - run: bundle config set --global path "$(pwd)/vendor/bundle"
21
- - run: bundle install --no-color
22
- - run: bundle exec rake
23
- - uses: codecov/codecov-action@v5
24
- with:
25
- token: ${{ secrets.CODECOV_TOKEN }}
@@ -1,19 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: copyrights
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- copyrights:
15
- timeout-minutes: 15
16
- runs-on: ubuntu-24.04
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: yegor256/copyrights-action@0.0.8
@@ -1,23 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: markdown-lint
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- paths-ignore: ['paper/**', 'sandbox/**']
14
- concurrency:
15
- group: markdown-lint-${{ github.ref }}
16
- cancel-in-progress: true
17
- jobs:
18
- markdown-lint:
19
- timeout-minutes: 15
20
- runs-on: ubuntu-24.04
21
- steps:
22
- - uses: actions/checkout@v4
23
- - uses: articulate/actions-markdownlint@v1
@@ -1,19 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: pdd
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- pdd:
15
- timeout-minutes: 15
16
- runs-on: ubuntu-24.04
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: volodya-lombrozo/pdd-action@master
@@ -1,28 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: rake
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- rake:
15
- strategy:
16
- matrix:
17
- os: [ubuntu-24.04, macos-15]
18
- ruby: [3.3]
19
- runs-on: ${{ matrix.os }}
20
- steps:
21
- - uses: actions/checkout@v4
22
- - uses: ruby/setup-ruby@v1
23
- with:
24
- ruby-version: ${{ matrix.ruby }}
25
- bundler-cache: true
26
- - run: bundle config set --global path "$(pwd)/vendor/bundle"
27
- - run: bundle install --no-color
28
- - run: bundle exec rake
@@ -1,19 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: reuse
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- reuse:
15
- timeout-minutes: 15
16
- runs-on: ubuntu-24.04
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: fsfe/reuse-action@v5
@@ -1,19 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: typos
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- typos:
15
- timeout-minutes: 15
16
- runs-on: ubuntu-24.04
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: crate-ci/typos@v1.32.0
@@ -1,19 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: xcop
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- xcop:
15
- timeout-minutes: 15
16
- runs-on: ubuntu-24.04
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: g4s8/xcop-action@master
@@ -1,19 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- name: yamllint
6
- 'on':
7
- push:
8
- branches:
9
- - master
10
- pull_request:
11
- branches:
12
- - master
13
- jobs:
14
- yamllint:
15
- timeout-minutes: 15
16
- runs-on: ubuntu-24.04
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: ibiqlik/action-yamllint@v3
data/.gitignore DELETED
@@ -1,13 +0,0 @@
1
- .bundle/
2
- .DS_Store
3
- .idea/
4
- .yardoc/
5
- *.gem
6
- coverage/
7
- doc/
8
- node_modules/
9
- rdoc/
10
- temp/
11
- vendor/
12
-
13
- **/.claude/settings.local.json
data/.pdd DELETED
@@ -1,7 +0,0 @@
1
- --source=.
2
- --verbose
3
- --exclude target/**/*
4
- --exclude coverage/**/*
5
- --rule min-words:20
6
- --rule min-estimate:15
7
- --rule max-estimate:90
data/.rubocop.yml DELETED
@@ -1,52 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- AllCops:
5
- Exclude:
6
- - 'bin/**/*'
7
- - 'assets/**/*'
8
- - 'vendor/**/*'
9
- DisplayCopNames: true
10
- TargetRubyVersion: 3.2
11
- SuggestExtensions: false
12
- NewCops: enable
13
- plugins:
14
- - rubocop-minitest
15
- - rubocop-performance
16
- - rubocop-rake
17
- Minitest/EmptyLineBeforeAssertionMethods:
18
- Enabled: false
19
- Metrics/ParameterLists:
20
- Enabled: false
21
- Style/GlobalVars:
22
- Enabled: false
23
- Metrics/MethodLength:
24
- Enabled: false
25
- Gemspec/RequiredRubyVersion:
26
- Enabled: false
27
- Style/ClassAndModuleChildren:
28
- Enabled: false
29
- Layout/MultilineMethodCallIndentation:
30
- Enabled: false
31
- Metrics/AbcSize:
32
- Enabled: false
33
- Metrics/ClassLength:
34
- Enabled: false
35
- Metrics/BlockLength:
36
- Enabled: false
37
- Metrics/CyclomaticComplexity:
38
- Enabled: false
39
- Metrics/PerceivedComplexity:
40
- Enabled: false
41
- Layout/EmptyLineAfterGuardClause:
42
- Enabled: false
43
- Layout/CaseIndentation:
44
- Enabled: false
45
- Naming/MethodParameterName:
46
- MinNameLength: 2
47
- Layout/EndOfLine:
48
- EnforcedStyle: lf
49
- Layout/MultilineAssignmentLayout:
50
- Enabled: true
51
- Layout/FirstHashElementIndentation:
52
- EnforcedStyle: consistent
data/.rultor.yml DELETED
@@ -1,26 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
2
- # SPDX-License-Identifier: MIT
3
- ---
4
- # yamllint disable rule:line-length
5
- docker:
6
- image: yegor256/ruby
7
- assets:
8
- rubygems.yml: yegor256/home#assets/rubygems.yml
9
- install: |
10
- pdd -f /dev/null
11
- bundle install --no-color
12
- release:
13
- pre: false
14
- script: |-
15
- [[ "${tag}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || exit -1
16
- bundle exec rake
17
- rm -rf *.gem
18
- sed -i "s/0\.0\.0/${tag}/g" qbash.gemspec
19
- git add qbash.gemspec
20
- git commit -m "version set to ${tag}"
21
- gem build qbash.gemspec
22
- chmod 0600 ../rubygems.yml
23
- gem push *.gem --config-file ../rubygems.yml
24
- merge:
25
- script: |-
26
- bundle exec rake
data/renovate.json DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
- "extends": [
4
- "config:base"
5
- ]
6
- }
data/test/test__helper.rb DELETED
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
- # SPDX-License-Identifier: MIT
5
-
6
- $stdout.sync = true
7
-
8
- require 'simplecov'
9
- require 'simplecov-cobertura'
10
- unless SimpleCov.running || ENV['PICKS']
11
- SimpleCov.command_name('test')
12
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
13
- [
14
- SimpleCov::Formatter::HTMLFormatter,
15
- SimpleCov::Formatter::CoberturaFormatter
16
- ]
17
- )
18
- SimpleCov.minimum_coverage 95
19
- SimpleCov.minimum_coverage_by_file 95
20
- SimpleCov.start do
21
- add_filter 'test/'
22
- add_filter 'vendor/'
23
- add_filter 'target/'
24
- track_files 'lib/**/*.rb'
25
- track_files '*.rb'
26
- end
27
- end
28
-
29
- require 'minitest/autorun'
30
- require 'minitest/reporters'
31
- Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new]
data/test/test_qbash.rb DELETED
@@ -1,191 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'minitest/autorun'
7
- require 'tmpdir'
8
- require 'loog'
9
- require 'logger'
10
- require 'shellwords'
11
- require_relative 'test__helper'
12
- require_relative '../lib/qbash'
13
-
14
- # Test.
15
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
16
- # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
17
- # License:: MIT
18
- class TestQbash < Minitest::Test
19
- def test_basic_run
20
- Dir.mktmpdir do |home|
21
- qbash("cd #{Shellwords.escape(home)}; echo $FOO | cat > a.txt", env: { 'FOO' => '42' })
22
- assert_path_exists(File.join(home, 'a.txt'))
23
- assert_equal("42\n", File.read(File.join(home, 'a.txt')))
24
- end
25
- end
26
-
27
- def test_command_as_array
28
- assert_equal('123', qbash(['printf 1;', 'printf 2;', 'printf', 3]))
29
- end
30
-
31
- def test_log_to_console
32
- qbash('echo Hello world!', log: $stdout)
33
- end
34
-
35
- def test_log_to_loog
36
- [Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR].each do |level|
37
- qbash('echo Hello world!', log: Loog::NULL, level:)
38
- end
39
- end
40
-
41
- def test_skip_nil
42
- assert_equal('Hi!', qbash(['printf', nil, 'Hi!', '']))
43
- end
44
-
45
- def test_log_to_nil
46
- assert_equal("yes\n", qbash('echo yes', log: nil))
47
- end
48
-
49
- def test_accept_zero
50
- qbash('echo hi', accept: nil)
51
- end
52
-
53
- def test_with_stdin
54
- Dir.mktmpdir do |home|
55
- f = File.join(home, 'a b c.txt')
56
- qbash("cat > #{Shellwords.escape(f)}", stdin: 'hello')
57
- assert_path_exists(f)
58
- assert_equal('hello', File.read(f))
59
- end
60
- end
61
-
62
- def test_with_special_symbols
63
- assert_equal("'hi'\n", qbash("echo \"'hi'\""))
64
- end
65
-
66
- def test_with_error
67
- Dir.mktmpdir do |home|
68
- assert_raises(StandardError) { qbash("cat #{Shellwords.escape(File.join(home, 'b.txt'))}") }
69
- end
70
- end
71
-
72
- def test_fails_when_nil_env
73
- assert_raises(StandardError) { qbash('echo hi', env: { a: nil }) }
74
- end
75
-
76
- def test_ignore_errors
77
- Dir.mktmpdir do |home|
78
- qbash("cat #{Shellwords.escape(File.join(home, 'b.txt'))}", accept: nil)
79
- end
80
- end
81
-
82
- def test_lets_exception_float_up
83
- assert_raises(StandardError) do
84
- qbash('sleep 767676', accept: nil, log: $stdout) do
85
- raise 'intentional'
86
- end
87
- end
88
- end
89
-
90
- def test_kills_in_thread
91
- Thread.new do
92
- qbash('sleep 9999', accept: nil) do |pid|
93
- Process.kill('KILL', pid)
94
- end
95
- end.join
96
- end
97
-
98
- def test_truly_kills
99
- qbash('sleep 9876543', accept: nil) do
100
- sleep(0.1)
101
- end
102
- refute_empty(qbash('ps ax | grep -v 9876543'))
103
- end
104
-
105
- def test_executes_without_sh_only_bash
106
- qbash('sleep 89898989', accept: nil) do
107
- refute_empty(qbash('ps ax | grep -v "sh -c exec /bin/bash -c sleep 89898989" | grep -v grep'))
108
- refute_empty(qbash('ps ax | grep "sleep 89898989" | grep -v grep'))
109
- sleep(0.1)
110
- end
111
- end
112
-
113
- def test_logs_in_background
114
- stdout = nil
115
- buf = Loog::Buffer.new
116
- Dir.mktmpdir do |home|
117
- flag = File.join(home, 'started.txt')
118
- cmd = "while true; do date; touch #{Shellwords.escape(flag)}; sleep 0.001; done"
119
- Thread.new do
120
- stdout =
121
- qbash(cmd, log: buf, accept: nil) do |pid|
122
- loop { break if File.exist?(flag) }
123
- Process.kill('KILL', pid)
124
- end
125
- end.join
126
- end
127
- refute_empty(buf.to_s)
128
- refute_empty(stdout)
129
- refute_includes(stdout, "\n\n")
130
- refute_includes(buf.to_s, "\n\n")
131
- end
132
-
133
- def test_logs_multi_line_print
134
- buf = Loog::Buffer.new
135
- pid = nil
136
- qbash('echo one; echo two', log: buf, accept: nil) do |i|
137
- sleep(0.1)
138
- pid = i
139
- end
140
- assert_equal(buf.to_s, "+ echo one; echo two /##{pid}\n##{pid}: one\n##{pid}: two\n")
141
- end
142
-
143
- def test_logs_multi_line_to_console
144
- console = FakeConsole.new
145
- pid = nil
146
- qbash('echo one; echo two', log: console, accept: nil) do |i|
147
- sleep(0.1)
148
- pid = i
149
- end
150
- assert_equal(console.to_s, "+ echo one; echo two /##{pid}\n##{pid}: one\n##{pid}: two\n")
151
- end
152
-
153
- def test_with_both
154
- Dir.mktmpdir do |home|
155
- stdout, code = qbash("cat #{Shellwords.escape(File.join(home, 'foo.txt'))}", accept: nil, both: true)
156
- assert_predicate(code, :positive?)
157
- refute_empty(stdout)
158
- end
159
- end
160
-
161
- def test_exists_after_background_stop
162
- stop = false
163
- pid = nil
164
- t =
165
- Thread.new do
166
- qbash('trap "" TERM; sleep 10', accept: nil) do |id|
167
- pid = id
168
- loop { break if stop }
169
- end
170
- end
171
- t.abort_on_exception = true
172
- sleep(0.01)
173
- stop = true
174
- refute(t.join(0.1))
175
- t.kill
176
- end
177
-
178
- class FakeConsole
179
- def initialize
180
- @buf = ''
181
- end
182
-
183
- def to_s
184
- @buf
185
- end
186
-
187
- def print(ln)
188
- @buf += ln
189
- end
190
- end
191
- end