outstand-tty-command 0.10.0.pre
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 +7 -0
- data/CHANGELOG.md +156 -0
- data/LICENSE.txt +21 -0
- data/README.md +661 -0
- data/lib/tty-command.rb +1 -0
- data/lib/tty/command.rb +223 -0
- data/lib/tty/command/child_process.rb +221 -0
- data/lib/tty/command/cmd.rb +148 -0
- data/lib/tty/command/dry_runner.rb +27 -0
- data/lib/tty/command/exit_error.rb +31 -0
- data/lib/tty/command/printers/abstract.rb +54 -0
- data/lib/tty/command/printers/null.rb +16 -0
- data/lib/tty/command/printers/pretty.rb +83 -0
- data/lib/tty/command/printers/progress.rb +32 -0
- data/lib/tty/command/printers/quiet.rb +39 -0
- data/lib/tty/command/process_runner.rb +196 -0
- data/lib/tty/command/result.rb +89 -0
- data/lib/tty/command/truncator.rb +106 -0
- data/lib/tty/command/version.rb +7 -0
- metadata +129 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class Command
|
5
|
+
# Encapsulates the information on the command executed
|
6
|
+
#
|
7
|
+
# @api public
|
8
|
+
class Result
|
9
|
+
include Enumerable
|
10
|
+
|
11
|
+
# All data written out to process's stdout stream
|
12
|
+
attr_reader :out
|
13
|
+
alias stdout out
|
14
|
+
|
15
|
+
# All data written out to process's stdin stream
|
16
|
+
attr_reader :err
|
17
|
+
alias stderr err
|
18
|
+
|
19
|
+
# Total command execution time
|
20
|
+
attr_reader :runtime
|
21
|
+
|
22
|
+
# Create a result
|
23
|
+
#
|
24
|
+
# @api public
|
25
|
+
def initialize(status, out, err, runtime = 0.0)
|
26
|
+
@status = status
|
27
|
+
@out = out
|
28
|
+
@err = err
|
29
|
+
@runtime = runtime
|
30
|
+
end
|
31
|
+
|
32
|
+
# Enumerate over output lines
|
33
|
+
#
|
34
|
+
# @param [String] separator
|
35
|
+
#
|
36
|
+
# @api public
|
37
|
+
def each(separator = nil)
|
38
|
+
sep = separator || TTY::Command.record_separator
|
39
|
+
return unless @out
|
40
|
+
elements = @out.split(sep)
|
41
|
+
if block_given?
|
42
|
+
elements.each { |line| yield(line) }
|
43
|
+
else
|
44
|
+
elements.to_enum
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Information on how the process exited
|
49
|
+
#
|
50
|
+
# @api public
|
51
|
+
def exit_status
|
52
|
+
@status
|
53
|
+
end
|
54
|
+
alias exitstatus exit_status
|
55
|
+
alias status exit_status
|
56
|
+
|
57
|
+
def to_i
|
58
|
+
@status
|
59
|
+
end
|
60
|
+
|
61
|
+
def to_s
|
62
|
+
@status.to_s
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_ary
|
66
|
+
[@out, @err]
|
67
|
+
end
|
68
|
+
|
69
|
+
def exited?
|
70
|
+
@status != nil
|
71
|
+
end
|
72
|
+
alias complete? exited?
|
73
|
+
|
74
|
+
def success?
|
75
|
+
exited? ? @status.zero? : false
|
76
|
+
end
|
77
|
+
|
78
|
+
def failure?
|
79
|
+
!success?
|
80
|
+
end
|
81
|
+
alias failed? failure?
|
82
|
+
|
83
|
+
def ==(other)
|
84
|
+
return false unless other.is_a?(TTY::Command::Result)
|
85
|
+
@status == other.to_i && to_ary == other.to_ary
|
86
|
+
end
|
87
|
+
end # Result
|
88
|
+
end # Command
|
89
|
+
end # TTY
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class Command
|
5
|
+
# Retains the first N bytes and the last N bytes from written content
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
class Truncator
|
9
|
+
# Default maximum byte size for prefix & suffix
|
10
|
+
DEFAULT_SIZE = 32 << 10
|
11
|
+
|
12
|
+
# Create a Truncator
|
13
|
+
#
|
14
|
+
# @param [Hash] options
|
15
|
+
# @option options [Number] max_size
|
16
|
+
#
|
17
|
+
# @api public
|
18
|
+
def initialize(options = {})
|
19
|
+
@max_size = options.fetch(:max_size) { DEFAULT_SIZE }
|
20
|
+
@prefix = ''
|
21
|
+
@suffix = ''
|
22
|
+
@skipped = 0
|
23
|
+
end
|
24
|
+
|
25
|
+
# Write content
|
26
|
+
#
|
27
|
+
# @param [String] content
|
28
|
+
# the content to write
|
29
|
+
#
|
30
|
+
# @return [nil]
|
31
|
+
#
|
32
|
+
# @api public
|
33
|
+
def write(content)
|
34
|
+
content = content.to_s.dup
|
35
|
+
|
36
|
+
content, @prefix = append(content, @prefix)
|
37
|
+
|
38
|
+
if (over = (content.bytesize - @max_size)) > 0
|
39
|
+
content = content.byteslice(over..-1)
|
40
|
+
@skipped += over
|
41
|
+
end
|
42
|
+
|
43
|
+
content, @suffix = append(content, @suffix)
|
44
|
+
|
45
|
+
# suffix is full but we still have content to write
|
46
|
+
while content.bytesize > 0
|
47
|
+
content = copy(content, @suffix)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
alias << write
|
51
|
+
|
52
|
+
# Truncated representation of the content
|
53
|
+
#
|
54
|
+
# @return [String]
|
55
|
+
#
|
56
|
+
# @api public
|
57
|
+
def read
|
58
|
+
return @prefix if @suffix.empty?
|
59
|
+
|
60
|
+
if @skipped.zero?
|
61
|
+
return @prefix << @suffix
|
62
|
+
end
|
63
|
+
|
64
|
+
@prefix + "\n... omitting #{@skipped} bytes ...\n" + @suffix
|
65
|
+
end
|
66
|
+
alias to_s read
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# Copy minimum bytes from source to destination
|
71
|
+
#
|
72
|
+
# @return [String]
|
73
|
+
# the remaining content
|
74
|
+
#
|
75
|
+
# @api private
|
76
|
+
def copy(value, dest)
|
77
|
+
bytes = value.bytesize
|
78
|
+
n = bytes < dest.bytesize ? bytes : dest.bytesize
|
79
|
+
|
80
|
+
head, tail = dest.byteslice(0...n), dest.byteslice(n..-1)
|
81
|
+
dest.replace("#{tail}#{value[0...n]}")
|
82
|
+
@skipped += head.bytesize
|
83
|
+
value.byteslice(n..-1)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Append value to destination
|
87
|
+
#
|
88
|
+
# @param [String] value
|
89
|
+
#
|
90
|
+
# @param [String] dst
|
91
|
+
#
|
92
|
+
# @api private
|
93
|
+
def append(value, dst)
|
94
|
+
remain = @max_size - dst.bytesize
|
95
|
+
remaining = ''
|
96
|
+
if remain > 0
|
97
|
+
value_bytes = value.to_s.bytesize
|
98
|
+
offset = value_bytes < remain ? value_bytes : remain
|
99
|
+
remaining = value.byteslice(0...offset)
|
100
|
+
value = value.byteslice(offset..-1)
|
101
|
+
end
|
102
|
+
[value, dst + remaining]
|
103
|
+
end
|
104
|
+
end # Truncator
|
105
|
+
end # Command
|
106
|
+
end # TTY
|
metadata
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: outstand-tty-command
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.10.0.pre
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Piotr Murach
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-09-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pastel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.5.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.5.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
description: Execute shell commands with pretty output logging and capture their stdout,
|
70
|
+
stderr and exit status. Redirect stdin, stdout and stderr of each command to a file
|
71
|
+
or a string.
|
72
|
+
email:
|
73
|
+
- piotr@piotrmurach.com
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files:
|
77
|
+
- README.md
|
78
|
+
- CHANGELOG.md
|
79
|
+
- LICENSE.txt
|
80
|
+
files:
|
81
|
+
- CHANGELOG.md
|
82
|
+
- LICENSE.txt
|
83
|
+
- README.md
|
84
|
+
- lib/tty-command.rb
|
85
|
+
- lib/tty/command.rb
|
86
|
+
- lib/tty/command/child_process.rb
|
87
|
+
- lib/tty/command/cmd.rb
|
88
|
+
- lib/tty/command/dry_runner.rb
|
89
|
+
- lib/tty/command/exit_error.rb
|
90
|
+
- lib/tty/command/printers/abstract.rb
|
91
|
+
- lib/tty/command/printers/null.rb
|
92
|
+
- lib/tty/command/printers/pretty.rb
|
93
|
+
- lib/tty/command/printers/progress.rb
|
94
|
+
- lib/tty/command/printers/quiet.rb
|
95
|
+
- lib/tty/command/process_runner.rb
|
96
|
+
- lib/tty/command/result.rb
|
97
|
+
- lib/tty/command/truncator.rb
|
98
|
+
- lib/tty/command/version.rb
|
99
|
+
homepage: https://piotrmurach.github.io/tty
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
metadata:
|
103
|
+
allowed_push_host: https://rubygems.org
|
104
|
+
bug_tracker_uri: https://github.com/piotrmurach/tty-command/issues
|
105
|
+
changelog_uri: https://github.com/piotrmurach/tty-command/blob/master/CHANGELOG.md
|
106
|
+
documentation_uri: https://www.rubydoc.info/gems/tty-command
|
107
|
+
homepage_uri: https://piotrmurach.github.io/tty
|
108
|
+
source_code_uri: https://github.com/piotrmurach/tty-command
|
109
|
+
post_install_message:
|
110
|
+
rdoc_options: []
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.0.0
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 1.3.1
|
123
|
+
requirements: []
|
124
|
+
rubygems_version: 3.1.2
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: Execute shell commands with pretty output logging and capture their stdout,
|
128
|
+
stderr and exit status.
|
129
|
+
test_files: []
|