output_mode 1.1.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/bin/demo +71 -6
- data/lib/output_mode/outputs/tabulated.rb +52 -4
- data/lib/output_mode/tldr/index.rb +55 -9
- data/lib/output_mode/tldr/show.rb +43 -7
- data/lib/output_mode/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec56475261c0c87de303f06bb9d5c046c71b39a5cdecaaab8c2a6ba0fc9d1602
|
4
|
+
data.tar.gz: 6912cc2ae659c9c1ea89c0d2fe38b03537f3de9f54d6b981fc958c4519f78bcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e439ef9c8b4a68bc567d1d7b01d38b0582a85de7e08355c301a6012ef0c95c6c42af1f2c4ee4088cd2edd64566956d9b8e4a3ad94b48eded57f3cfafa0b987d
|
7
|
+
data.tar.gz: 321eed2286b0e87ef5f45b2336a8a4c95e477258a00744087bafd85fbd3dfad1a3ee2f8b220cddcaf0a9e6193301de1e708e1890aaf10a5497c08ea4f44e150e
|
data/README.md
CHANGED
data/bin/demo
CHANGED
@@ -1,21 +1,42 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#==============================================================================
|
3
|
-
#
|
3
|
+
# Copyright 2020 William McCumstie
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
18
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
19
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
20
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
21
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
22
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
23
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
24
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
25
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
4
26
|
#==============================================================================
|
5
27
|
|
6
|
-
|
7
28
|
require "bundler/setup"
|
8
29
|
require "output_mode"
|
9
30
|
|
10
31
|
module DemoIndex
|
11
32
|
extend OutputMode::TLDR::Index
|
12
33
|
|
13
|
-
register_callable(header: 'Integer') { |i| i }
|
14
|
-
register_callable(header: 'Standard') { 'always visible' }
|
34
|
+
register_callable(header: 'Integer', row_color: [:yellow, :bold]) { |i| i }
|
35
|
+
register_callable(header: 'Standard', header_color: [:strikethrough] ) { 'always visible' }
|
15
36
|
register_callable(header: 'Verbose', verbose: true) { 'verbose visible' }
|
16
37
|
register_callable(header: 'Simplified', verbose: false) { 'simplified visible' }
|
17
38
|
register_callable(header: 'Yes/True') { true }
|
18
|
-
register_callable(header: 'No/False') { false }
|
39
|
+
register_callable(header: 'No/False', row_color: [:clear]) { false }
|
19
40
|
register_callable(header: 'Missing') { nil }
|
20
41
|
end
|
21
42
|
|
@@ -34,6 +55,12 @@ end
|
|
34
55
|
data = [1, 2, 3]
|
35
56
|
|
36
57
|
puts <<~EOF
|
58
|
+
#==============================================================================
|
59
|
+
#==============================================================================
|
60
|
+
# INDEX OUTPUTS
|
61
|
+
#==============================================================================
|
62
|
+
#==============================================================================
|
63
|
+
|
37
64
|
#==============================================================================
|
38
65
|
# Demo Verbose Index
|
39
66
|
#==============================================================================
|
@@ -45,6 +72,29 @@ puts <<~EOF
|
|
45
72
|
#==============================================================================
|
46
73
|
#{DemoIndex.build_output(verbose: false).render(*data)}
|
47
74
|
|
75
|
+
#==============================================================================
|
76
|
+
# Force Interactive
|
77
|
+
# Always print as if the shell is interactive
|
78
|
+
#==============================================================================
|
79
|
+
#{DemoIndex.build_output(interactive: true).render(*data)}
|
80
|
+
|
81
|
+
#==============================================================================
|
82
|
+
# Force Non-Interactive
|
83
|
+
# Always print as if the shell is non-interactive
|
84
|
+
#==============================================================================
|
85
|
+
#{DemoIndex.build_output(interactive: false).render(*data)}
|
86
|
+
|
87
|
+
#==============================================================================
|
88
|
+
# Demo ASCII Index
|
89
|
+
#==============================================================================
|
90
|
+
#{DemoIndex.build_output(ascii: true).render(*data)}
|
91
|
+
|
92
|
+
#==============================================================================
|
93
|
+
#==============================================================================
|
94
|
+
# SHOW OUTPUTS
|
95
|
+
#==============================================================================
|
96
|
+
#==============================================================================
|
97
|
+
|
48
98
|
#==============================================================================
|
49
99
|
# Demo Verbose Show
|
50
100
|
#==============================================================================
|
@@ -55,6 +105,21 @@ puts <<~EOF
|
|
55
105
|
# NOTE: Disabled for non-interactive shell, shows the verbose output instead
|
56
106
|
#==============================================================================
|
57
107
|
#{DemoShow.build_output(verbose: false).render(*data)}
|
58
|
-
EOF
|
59
108
|
|
109
|
+
#==============================================================================
|
110
|
+
# Force Interactive
|
111
|
+
# Always print as if the shell is interactive
|
112
|
+
#==============================================================================
|
113
|
+
#{DemoShow.build_output(interactive: true).render(*data)}
|
114
|
+
|
115
|
+
#==============================================================================
|
116
|
+
# Force Non-Interactive
|
117
|
+
# Always print as if the shell is non-interactive
|
118
|
+
#==============================================================================
|
119
|
+
#{DemoShow.build_output(interactive: false).render(*data)}
|
60
120
|
|
121
|
+
#==============================================================================
|
122
|
+
# Demo ASCII Index
|
123
|
+
#==============================================================================
|
124
|
+
#{DemoShow.build_output(ascii: true).render(*data)}
|
125
|
+
EOF
|
@@ -29,14 +29,20 @@ require 'tty-table'
|
|
29
29
|
module OutputMode
|
30
30
|
module Outputs
|
31
31
|
class Tabulated < Output
|
32
|
-
attr_reader :renderer, :header, :default, :block, :yes, :no
|
33
|
-
|
34
32
|
# @!attribute [r] renderer
|
35
33
|
# @return [Symbol] the renderer type, see: https://github.com/piotrmurach/tty-table#32-renderer
|
36
34
|
# @!attribute [r] header
|
37
35
|
# @return [Array] An optional header row for the table
|
38
36
|
# @!attribute [r] block
|
39
37
|
# @return [#call] an optional block of code that configures the renderer
|
38
|
+
# @!attribute [r] colorize
|
39
|
+
# @return [Boolean] enable or disabled the colorization
|
40
|
+
# @!attribute [r] header_color
|
41
|
+
# @return An optional header color or array of colors
|
42
|
+
# @!attribute [r] row_color
|
43
|
+
# @return An optional data color or array of colors
|
44
|
+
attr_reader :renderer, :header, :default, :block, :yes, :no,
|
45
|
+
:header_color, :row_color, :colorize
|
40
46
|
|
41
47
|
# @return [Hash] additional options to +TTY::Table+ renderer
|
42
48
|
# @see https://github.com/piotrmurach/tty-table#33-options
|
@@ -50,12 +56,18 @@ module OutputMode
|
|
50
56
|
# @yieldparam tty_table_renderer [TTY::Table::Renderer::Base] optional access the underlining TTY::Table renderer
|
51
57
|
def initialize(*procs,
|
52
58
|
renderer: :unicode,
|
59
|
+
colorize: false,
|
53
60
|
header: nil,
|
61
|
+
header_color: nil,
|
62
|
+
row_color: nil,
|
54
63
|
**config,
|
55
64
|
&block)
|
56
65
|
@header = header
|
57
66
|
@renderer = renderer
|
58
67
|
@block = block
|
68
|
+
@header_color = header_color
|
69
|
+
@row_color = row_color
|
70
|
+
@colorize = colorize
|
59
71
|
super(*procs, **config)
|
60
72
|
end
|
61
73
|
|
@@ -63,10 +75,46 @@ module OutputMode
|
|
63
75
|
# @see OutputMode::Outputs::Base#render
|
64
76
|
# @see https://github.com/piotrmurach/tty-table
|
65
77
|
def render(*data)
|
66
|
-
table = TTY::Table.new header:
|
67
|
-
data.each { |d| table << generate(d) }
|
78
|
+
table = TTY::Table.new header: processed_header
|
79
|
+
data.each { |d| table << process_row(generate(d)) }
|
68
80
|
table.render(renderer, **config, &block) || ''
|
69
81
|
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# Colorizes the header when requested
|
86
|
+
def processed_header
|
87
|
+
header&.each_with_index&.map do |h, idx|
|
88
|
+
color = index_selector(:header_color, idx)
|
89
|
+
case color
|
90
|
+
when nil
|
91
|
+
h.to_s
|
92
|
+
when Array
|
93
|
+
pastel.decorate(h.to_s, *color)
|
94
|
+
else
|
95
|
+
pastel.decorate(h.to_s, color)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Colorizes the row when requested
|
101
|
+
def process_row(data)
|
102
|
+
data.each_with_index.map do |d, idx|
|
103
|
+
color = index_selector(:row_color, idx)
|
104
|
+
case color
|
105
|
+
when NilClass
|
106
|
+
d.to_s
|
107
|
+
when Array
|
108
|
+
pastel.decorate(d.to_s, *color)
|
109
|
+
else
|
110
|
+
pastel.decorate(d.to_s, color)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def pastel
|
116
|
+
@pastel ||= Pastel::Color.new(enabled: colorize)
|
117
|
+
end
|
70
118
|
end
|
71
119
|
end
|
72
120
|
end
|
@@ -1,7 +1,31 @@
|
|
1
1
|
#==============================================================================
|
2
|
-
#
|
2
|
+
# Copyright 2020 William McCumstie
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
15
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
16
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
17
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
18
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
19
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
20
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
21
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
22
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
23
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
24
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
3
25
|
#==============================================================================
|
4
26
|
|
27
|
+
require 'tty-color'
|
28
|
+
|
5
29
|
module OutputMode
|
6
30
|
module TLDR
|
7
31
|
module Index
|
@@ -11,9 +35,12 @@ module OutputMode
|
|
11
35
|
# @overload register_callable(header:, verbose: true)
|
12
36
|
# @param header: The column's header field when displaying to humans
|
13
37
|
# @param verbose: Whether the column will be shown in the verbose output
|
38
|
+
# @param header_color: Override the default color for the header
|
39
|
+
# @param row_color: Override the default color for the row
|
14
40
|
# @yieldparam model The subject the column is describing, some sort of data model
|
15
|
-
def register_callable(header:, verbose: nil, &b)
|
16
|
-
super(modes: { verbose: verbose }, header: header,
|
41
|
+
def register_callable(header:, verbose: nil, header_color: nil, row_color: nil, &b)
|
42
|
+
super(modes: { verbose: verbose }, header: header,
|
43
|
+
header_color: header_color, row_color: row_color, &b)
|
17
44
|
end
|
18
45
|
alias_method :register_column, :register_callable
|
19
46
|
|
@@ -21,6 +48,12 @@ module OutputMode
|
|
21
48
|
# +$stdout+ as part of it's output class discovery logic. It does not
|
22
49
|
# print to the output directly
|
23
50
|
#
|
51
|
+
# The +ascii+ flag disables the unicode formatting in interactive shells.
|
52
|
+
# Non interactive shells use ASCII by default.
|
53
|
+
#
|
54
|
+
# The +verbose+ flag toggles the simplified and verbose outputs in the
|
55
|
+
# interactive output. Non-interactive outputs are always verbose
|
56
|
+
#
|
24
57
|
# If +$stdout+ is an interactive shell (aka a TTY), then it will display using
|
25
58
|
# {OutputMode::Outputs::Tabulated}. This is intended for human consumption
|
26
59
|
# and will obey the provided +verbose+ flag.
|
@@ -29,26 +62,39 @@ module OutputMode
|
|
29
62
|
# {OutputMode::Outputs::Delimited} using tab delimiters. This is intended
|
30
63
|
# for consumption by machines. This output ignores the provided +verbose+
|
31
64
|
# flag as it is always verbose.
|
32
|
-
|
65
|
+
#
|
66
|
+
# An interative/ non-interactive output can be forced by setting the
|
67
|
+
# +interactive+ flag to +true+/+false+ respectively
|
68
|
+
def build_output(verbose: false, ascii: false, interactive: nil, header_color: [:blue, :bold], row_color: :green)
|
33
69
|
callables = if verbose || !$stdout.tty?
|
34
70
|
# Filter out columns that are explicitly not verbose
|
35
|
-
output_callables.select(
|
71
|
+
output_callables.select { |o| o.verbose?(true) }
|
36
72
|
else
|
37
73
|
# Filter out columns that are explicitly verbose
|
38
74
|
output_callables.reject(&:verbose?)
|
39
75
|
end
|
40
76
|
|
41
|
-
if $stdout.tty?
|
77
|
+
if interactive || (interactive.nil? && $stdout.tty?)
|
42
78
|
# Creates the human readable output
|
79
|
+
opts = if ascii
|
80
|
+
{ yes: 'yes', no: 'no', renderer: :ascii }
|
81
|
+
else
|
82
|
+
{
|
83
|
+
yes: '✓', no: '✕', renderer: :unicode, colorize: TTY::Color.color?,
|
84
|
+
header_color: callables.map { |c| c.config[:header_color] || header_color },
|
85
|
+
row_color: callables.map { |c| c.config[:row_color] || row_color }
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
43
89
|
Outputs::Tabulated.new(*callables,
|
44
90
|
header: callables.map { |c| c.config.fetch(:header, 'missing') },
|
45
|
-
renderer: :unicode,
|
46
91
|
padding: [0,1],
|
47
92
|
default: '(none)',
|
48
|
-
|
93
|
+
**opts
|
94
|
+
)
|
49
95
|
else
|
50
96
|
# Creates the machine readable output
|
51
|
-
Outputs::Delimited.new(*callables, col_sep: "\t", yes: '
|
97
|
+
Outputs::Delimited.new(*callables, col_sep: "\t", yes: 'yes', no: 'no', default: '')
|
52
98
|
end
|
53
99
|
end
|
54
100
|
end
|
@@ -1,5 +1,27 @@
|
|
1
1
|
#==============================================================================
|
2
|
-
#
|
2
|
+
# Copyright 2020 William McCumstie
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
15
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
16
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
17
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
18
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
19
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
20
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
21
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
22
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
23
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
24
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
3
25
|
#==============================================================================
|
4
26
|
|
5
27
|
require 'tty-color'
|
@@ -23,6 +45,12 @@ module OutputMode
|
|
23
45
|
# +$stdout+ as part of it's output class discovery logic. It does not
|
24
46
|
# print to the io directly
|
25
47
|
#
|
48
|
+
# The +ascii+ flag disables the unicode formatting in interactive shells.
|
49
|
+
# Non interactive shells use ASCII by default.
|
50
|
+
#
|
51
|
+
# The +verbose+ flag toggles the simplified and verbose outputs in the
|
52
|
+
# interactive output. Non-interactive outputs are always verbose
|
53
|
+
#
|
26
54
|
# If +$stdout+ is an interactive shell (aka a TTY), then it will display using
|
27
55
|
# {OutputMode::Outputs::Templated}. This is intended for human consumption
|
28
56
|
# and will obey the provided +verbose+ flag.
|
@@ -31,25 +59,33 @@ module OutputMode
|
|
31
59
|
# {OutputMode::Outputs::Delimited} using tab delimiters. This is intended
|
32
60
|
# for consumption by machines. This output ignores the provided +verbose+
|
33
61
|
# flag as it is always verbose.
|
34
|
-
|
62
|
+
#
|
63
|
+
# An interative/ non-interactive output can be forced by setting the
|
64
|
+
# +interactive+ flag to +true+/+false+ respectively
|
65
|
+
def build_output(verbose: false, ascii: false, interactive: nil)
|
35
66
|
callables = if verbose || !$stdout.tty?
|
36
67
|
# Filter out columns that are explicitly not verbose
|
37
|
-
output_callables.select(
|
68
|
+
output_callables.select { |o| o.verbose?(true) }
|
38
69
|
else
|
39
70
|
# Filter out columns that are explicitly verbose
|
40
71
|
output_callables.reject(&:verbose?)
|
41
72
|
end
|
42
73
|
|
43
|
-
if $stdout.tty?
|
74
|
+
if interactive || (interactive.nil? && $stdout.tty?)
|
44
75
|
# Creates the human readable output
|
76
|
+
opts = if ascii
|
77
|
+
{ yes: 'yes', no: 'no', colorize: false }
|
78
|
+
else
|
79
|
+
{ yes: '✓', no: '✕', colorize: TTY::Color.color? }
|
80
|
+
end
|
81
|
+
|
45
82
|
Outputs::Templated.new(*callables,
|
46
83
|
fields: callables.map { |c| c.config.fetch(:header, 'missing') },
|
47
|
-
colorize: TTY::Color.color?,
|
48
84
|
default: '(none)',
|
49
|
-
|
85
|
+
**opts)
|
50
86
|
else
|
51
87
|
# Creates the machine readable output
|
52
|
-
Outputs::Delimited.new(*callables, col_sep: "\t", yes: '
|
88
|
+
Outputs::Delimited.new(*callables, col_sep: "\t", yes: 'yes', no: 'no', default: '')
|
53
89
|
end
|
54
90
|
end
|
55
91
|
end
|
data/lib/output_mode/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: output_mode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William McCumsite
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tty-table
|