tty-command 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +9 -0
- data/examples/bash.rb +2 -2
- data/examples/basic.rb +2 -2
- data/examples/env.rb +3 -3
- data/examples/logger.rb +2 -2
- data/examples/output.rb +2 -2
- data/examples/pty.rb +3 -1
- data/examples/redirect_stderr.rb +2 -2
- data/examples/redirect_stdin.rb +2 -2
- data/examples/redirect_stdout.rb +2 -2
- data/examples/stdin_input.rb +2 -2
- data/examples/threaded.rb +3 -1
- data/examples/timeout.rb +7 -3
- data/examples/timeout_input.rb +2 -2
- data/examples/wait.rb +2 -2
- data/lib/tty/command/process_runner.rb +3 -0
- data/lib/tty/command/version.rb +1 -1
- data/spec/spec_helper.rb +78 -0
- data/spec/unit/binmode_spec.rb +27 -0
- data/spec/unit/cmd_spec.rb +152 -0
- data/spec/unit/dry_run_spec.rb +42 -0
- data/spec/unit/exit_error_spec.rb +25 -0
- data/spec/unit/input_spec.rb +11 -0
- data/spec/unit/output_spec.rb +25 -0
- data/spec/unit/printer_spec.rb +50 -0
- data/spec/unit/printers/custom_spec.rb +48 -0
- data/spec/unit/printers/null_spec.rb +36 -0
- data/spec/unit/printers/pretty_spec.rb +172 -0
- data/spec/unit/printers/progress_spec.rb +45 -0
- data/spec/unit/printers/quiet_spec.rb +71 -0
- data/spec/unit/pty_spec.rb +60 -0
- data/spec/unit/redirect_spec.rb +104 -0
- data/spec/unit/result_spec.rb +64 -0
- data/spec/unit/ruby_spec.rb +20 -0
- data/spec/unit/run_spec.rb +161 -0
- data/spec/unit/test_spec.rb +11 -0
- data/spec/unit/timeout_spec.rb +36 -0
- data/spec/unit/truncator_spec.rb +73 -0
- data/tty-command.gemspec +1 -1
- metadata +24 -10
- data/.gitignore +0 -9
- data/.rspec +0 -4
- data/.travis.yml +0 -29
- data/CODE_OF_CONDUCT.md +0 -49
- data/Gemfile +0 -14
- data/appveyor.yml +0 -26
- data/benchmarks/memory.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 01a539add505698f2073117f6df6c957e09dbeb349b6eae684eccf121d3a8a2b
|
4
|
+
data.tar.gz: eae4769195fd22d266c9c76093b9f85e3b8faeb61152197d5af65e3e435dfa83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3a44386dd5eb460ca3d8c7740f7c7e0660f6aeda18f0e0c7c4d67bfb30e962f4e96f34509584c5e7120d69fd415c2321b0b61d997f2f12cad101f63dfed5a93
|
7
|
+
data.tar.gz: 022477365445a4da55e3ee87c4d3c23305003e6da7d7c94b6de7857e409396e4105596584ea66a7c904d7f5f5725716527e6a353391e1a97ea78928fcb1052d0
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.8.2] - 2018-08-07
|
4
|
+
|
5
|
+
### Changed
|
6
|
+
* Change gemspec to load only required files
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
* Fix issue with Ruby greater than 2.5.0 displaying thread error traceback by default
|
10
|
+
|
3
11
|
## [v0.8.1] - 2018-05-20
|
4
12
|
|
5
13
|
### Changed
|
@@ -115,6 +123,7 @@
|
|
115
123
|
|
116
124
|
* Initial implementation and release
|
117
125
|
|
126
|
+
[v0.8.2]: https://github.com/piotrmurach/tty-command/compare/v0.8.1...v0.8.2
|
118
127
|
[v0.8.1]: https://github.com/piotrmurach/tty-command/compare/v0.8.0...v0.8.1
|
119
128
|
[v0.8.0]: https://github.com/piotrmurach/tty-command/compare/v0.7.0...v0.8.0
|
120
129
|
[v0.7.0]: https://github.com/piotrmurach/tty-command/compare/v0.6.0...v0.7.0
|
data/examples/bash.rb
CHANGED
data/examples/basic.rb
CHANGED
data/examples/env.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../lib/tty-command'
|
4
4
|
|
5
5
|
cmd = TTY::Command.new
|
6
6
|
|
7
|
-
out,
|
7
|
+
out, _ = cmd.run("env | grep FOO", env: { 'FOO' =>'hello'})
|
8
8
|
|
9
9
|
puts "Result: #{out}"
|
data/examples/logger.rb
CHANGED
data/examples/output.rb
CHANGED
data/examples/pty.rb
CHANGED
data/examples/redirect_stderr.rb
CHANGED
data/examples/redirect_stdin.rb
CHANGED
data/examples/redirect_stdout.rb
CHANGED
data/examples/stdin_input.rb
CHANGED
data/examples/threaded.rb
CHANGED
data/examples/timeout.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../lib/tty-command'
|
4
4
|
|
5
5
|
cmd = TTY::Command.new
|
6
6
|
|
7
|
-
|
7
|
+
begin
|
8
|
+
cmd.run("while test 1; do echo 'hello'; sleep 1; done", timeout: 5, signal: :KILL)
|
9
|
+
rescue TTY::Command::TimeoutExceeded
|
10
|
+
puts 'BOOM!'
|
11
|
+
end
|
data/examples/timeout_input.rb
CHANGED
data/examples/wait.rb
CHANGED
data/lib/tty/command/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
if RUBY_VERSION > '1.9' and (ENV['COVERAGE'] || ENV['TRAVIS'])
|
2
|
+
require 'simplecov'
|
3
|
+
require 'coveralls'
|
4
|
+
|
5
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
Coveralls::SimpleCov::Formatter
|
8
|
+
]
|
9
|
+
|
10
|
+
SimpleCov.start do
|
11
|
+
command_name 'spec'
|
12
|
+
add_filter 'spec'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'tty-command'
|
17
|
+
|
18
|
+
module TestHelpers
|
19
|
+
module Paths
|
20
|
+
def gem_root
|
21
|
+
File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
22
|
+
end
|
23
|
+
|
24
|
+
def dir_path(*args)
|
25
|
+
path = File.join(gem_root, *args)
|
26
|
+
FileUtils.mkdir_p(path) unless ::File.exist?(path)
|
27
|
+
File.realpath(path)
|
28
|
+
end
|
29
|
+
|
30
|
+
def tmp_path(*args)
|
31
|
+
File.expand_path(File.join(dir_path('tmp'), *args))
|
32
|
+
end
|
33
|
+
|
34
|
+
def fixtures_path(*args)
|
35
|
+
File.expand_path(File.join(dir_path('spec/fixtures'), *args))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module Platform
|
40
|
+
def jruby?
|
41
|
+
RUBY_PLATFORM == "java"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
RSpec.configure do |config|
|
47
|
+
config.include(TestHelpers::Paths)
|
48
|
+
config.include(TestHelpers::Platform)
|
49
|
+
|
50
|
+
config.after(:each, type: :cli) do
|
51
|
+
FileUtils.rm_rf(tmp_path)
|
52
|
+
end
|
53
|
+
|
54
|
+
config.expect_with :rspec do |expectations|
|
55
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
56
|
+
end
|
57
|
+
|
58
|
+
config.mock_with :rspec do |mocks|
|
59
|
+
mocks.verify_partial_doubles = true
|
60
|
+
end
|
61
|
+
|
62
|
+
# Limits the available syntax to the non-monkey patched syntax that is recommended.
|
63
|
+
config.disable_monkey_patching!
|
64
|
+
|
65
|
+
# This setting enables warnings. It's recommended, but in some cases may
|
66
|
+
# be too noisy due to issues in dependencies.
|
67
|
+
config.warnings = true
|
68
|
+
|
69
|
+
if config.files_to_run.one?
|
70
|
+
config.default_formatter = 'doc'
|
71
|
+
end
|
72
|
+
|
73
|
+
config.profile_examples = 2
|
74
|
+
|
75
|
+
config.order = :random
|
76
|
+
|
77
|
+
Kernel.srand config.seed
|
78
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
RSpec.describe TTY::Command, '#run' do
|
2
|
+
it "encodes output as unicode by default" do
|
3
|
+
output = StringIO.new
|
4
|
+
cmd = TTY::Command.new(output: output)
|
5
|
+
out, _ = cmd.run("echo '昨夜のコンサートは'")
|
6
|
+
|
7
|
+
expect(out.encoding).to eq(Encoding::UTF_8)
|
8
|
+
# expect(out.chomp).to eq("昨夜のコンサートは")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "encodes output as binary" do
|
12
|
+
output = StringIO.new
|
13
|
+
cmd = TTY::Command.new(output: output)
|
14
|
+
out, _ = cmd.run("echo '昨夜のコンサートは'", binmode: true)
|
15
|
+
|
16
|
+
expect(out.encoding).to eq(Encoding::BINARY)
|
17
|
+
#expect(out.chomp).to eq("\xE6\x98\xA8\xE5\xA4\x9C\xE3\x81\xAE\xE3\x82\xB3\xE3\x83\xB3\xE3\x82\xB5\xE3\x83\xBC\xE3\x83\x88\xE3\x81\xAF".force_encoding(Encoding::BINARY))
|
18
|
+
end
|
19
|
+
|
20
|
+
it "encodes all commands output as binary" do
|
21
|
+
output = StringIO.new
|
22
|
+
cmd = TTY::Command.new(output: output, binmode: true)
|
23
|
+
out, _ = cmd.run("echo 'hello'")
|
24
|
+
|
25
|
+
expect(out.encoding).to eq(Encoding::BINARY)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
RSpec.describe TTY::Command::Cmd, '::new' do
|
4
|
+
it "requires at least command argument" do
|
5
|
+
expect {
|
6
|
+
TTY::Command::Cmd.new({})
|
7
|
+
}.to raise_error(ArgumentError, /Cmd requires command argument/)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "requires non empty command argument" do
|
11
|
+
expect {
|
12
|
+
TTY::Command::Cmd.new(nil)
|
13
|
+
}.to raise_error(ArgumentError, /No command provided/)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "accepts a command" do
|
17
|
+
cmd = TTY::Command::Cmd.new(:echo)
|
18
|
+
expect(cmd.command).to eq('echo')
|
19
|
+
expect(cmd.argv).to eq([])
|
20
|
+
expect(cmd.options).to eq({})
|
21
|
+
expect(cmd.to_command).to eq('echo')
|
22
|
+
end
|
23
|
+
|
24
|
+
it "accepts a command as heredoc" do
|
25
|
+
cmd = TTY::Command::Cmd.new <<-EOHEREDOC
|
26
|
+
if [[ $? -eq 0]]; then
|
27
|
+
echo "Bash it!"
|
28
|
+
fi
|
29
|
+
EOHEREDOC
|
30
|
+
expect(cmd.argv).to eq([])
|
31
|
+
expect(cmd.options).to eq({})
|
32
|
+
expect(cmd.to_command).to eq([
|
33
|
+
" if [[ $? -eq 0]]; then",
|
34
|
+
" echo \"Bash it!\"",
|
35
|
+
" fi\n"
|
36
|
+
].join("\n"))
|
37
|
+
end
|
38
|
+
|
39
|
+
it "accepts command as [cmdname, arg1, ...]" do
|
40
|
+
cmd = TTY::Command::Cmd.new(:echo, '-n', 'hello')
|
41
|
+
expect(cmd.command).to eq('echo')
|
42
|
+
expect(cmd.argv).to eq(['-n', 'hello'])
|
43
|
+
expect(cmd.to_command).to eq('echo -n hello')
|
44
|
+
end
|
45
|
+
|
46
|
+
it "accepts command as [[cmdname, argv0], arg1, ...]" do
|
47
|
+
cmd = TTY::Command::Cmd.new([:echo, '-n'], 'hello')
|
48
|
+
expect(cmd.command).to eq('echo')
|
49
|
+
expect(cmd.argv).to eq(['-n', 'hello'])
|
50
|
+
expect(cmd.to_command).to eq('echo -n hello')
|
51
|
+
end
|
52
|
+
|
53
|
+
it "accepts command with environment as [cmdname, arg1, ..., opts]" do
|
54
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', env: {foo: 'bar'})
|
55
|
+
expect(cmd.to_command).to eq(%{( export FOO=\"bar\" ; echo hello )})
|
56
|
+
end
|
57
|
+
|
58
|
+
it "accepts command with multiple environment keys" do
|
59
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', env: {foo: 'a', bar: 'b'})
|
60
|
+
expect(cmd.to_command).to eq(%{( export FOO=\"a\" BAR=\"b\" ; echo hello )})
|
61
|
+
end
|
62
|
+
|
63
|
+
it "accepts command with environemnt string keys" do
|
64
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', env: {'FOO_bar' => 'a', bar: 'b'})
|
65
|
+
expect(cmd.to_command).to eq(%{( export FOO_bar=\"a\" BAR=\"b\" ; echo hello )})
|
66
|
+
end
|
67
|
+
|
68
|
+
it "escapes environment values" do
|
69
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', env: {foo: 'abc"def'})
|
70
|
+
expect(cmd.to_command).to eq(%{( export FOO=\"abc\\\"def\" ; echo hello )})
|
71
|
+
end
|
72
|
+
|
73
|
+
it "accepts environment as first argument" do
|
74
|
+
cmd = TTY::Command::Cmd.new({'FOO' => true, 'BAR' => 1}, :echo, 'hello')
|
75
|
+
expect(cmd.to_command).to eq(%{( export FOO=\"true\" BAR=\"1\" ; echo hello )})
|
76
|
+
end
|
77
|
+
|
78
|
+
it "runs command in specified directory" do
|
79
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', chdir: '/tmp')
|
80
|
+
expect(cmd.to_command).to eq("cd /tmp && echo hello")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "runs command in specified directory with environment" do
|
84
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', chdir: '/tmp', env: {foo: 'bar'})
|
85
|
+
expect(cmd.to_command).to eq(%{cd /tmp && ( export FOO=\"bar\" ; echo hello )})
|
86
|
+
end
|
87
|
+
|
88
|
+
it "runs command as a user" do
|
89
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', user: 'piotrmurach')
|
90
|
+
expect(cmd.to_command).to eq("sudo -u piotrmurach -- sh -c 'echo hello'")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "runs command as a group" do
|
94
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', group: 'devs')
|
95
|
+
expect(cmd.to_command).to eq("sg devs -c \\\"echo hello\\\"")
|
96
|
+
end
|
97
|
+
|
98
|
+
it "runs command as a user in a group" do
|
99
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', user: 'piotrmurach', group: 'devs')
|
100
|
+
expect(cmd.to_command).to eq("sudo -u piotrmurach -- sh -c 'sg devs -c \\\"echo hello\\\"'")
|
101
|
+
end
|
102
|
+
|
103
|
+
it "runs command with umask" do
|
104
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', umask: '077')
|
105
|
+
expect(cmd.to_command).to eq("umask 077 && echo hello")
|
106
|
+
end
|
107
|
+
|
108
|
+
it "runs command with umask, chdir" do
|
109
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', umask: '077', chdir: '/tmp')
|
110
|
+
expect(cmd.to_command).to eq("cd /tmp && umask 077 && echo hello")
|
111
|
+
end
|
112
|
+
|
113
|
+
it "runs command with umask, chdir & user" do
|
114
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', umask: '077', chdir: '/tmp', user: 'piotrmurach')
|
115
|
+
expect(cmd.to_command).to eq("cd /tmp && umask 077 && sudo -u piotrmurach -- sh -c 'echo hello'")
|
116
|
+
end
|
117
|
+
|
118
|
+
it "runs command with umask, user, chdir and env" do
|
119
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello', umask: '077', chdir: '/tmp', user: 'piotrmurach', env: {foo: 'bar'})
|
120
|
+
expect(cmd.to_command).to eq(%{cd /tmp && umask 077 && ( export FOO=\"bar\" ; sudo -u piotrmurach FOO=\"bar\" -- sh -c 'echo hello' )})
|
121
|
+
end
|
122
|
+
|
123
|
+
it "provides unique identifier" do
|
124
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello')
|
125
|
+
expect(cmd.uuid).to match(/^\w{8}$/)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "converts command to hash" do
|
129
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello')
|
130
|
+
expect(cmd.to_hash).to include({
|
131
|
+
command: 'echo',
|
132
|
+
argv: ['hello']
|
133
|
+
})
|
134
|
+
end
|
135
|
+
|
136
|
+
it "escapes arguments that need escaping" do
|
137
|
+
cmd = TTY::Command::Cmd.new(:echo, 'hello world')
|
138
|
+
expect(cmd.to_hash).to include({
|
139
|
+
command: 'echo',
|
140
|
+
argv: ["hello\\ world"]
|
141
|
+
})
|
142
|
+
end
|
143
|
+
|
144
|
+
it "escapes special characters in split arguments" do
|
145
|
+
args = %w(git for-each-ref --format='%(refname)' refs/heads/)
|
146
|
+
cmd = TTY::Command::Cmd.new(*args)
|
147
|
+
expect(cmd.to_hash).to include({
|
148
|
+
command: 'git',
|
149
|
+
argv: ["for-each-ref", "--format\\=\\'\\%\\(refname\\)\\'", "refs/heads/"]
|
150
|
+
})
|
151
|
+
end
|
152
|
+
end
|