output_mode 1.2.2 → 1.3.0
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 +4 -4
- data/bin/demo +22 -2
- data/lib/output_mode/outputs/templated.rb +36 -6
- data/lib/output_mode/tldr/show.rb +14 -7
- data/lib/output_mode/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aba3d3f1c1ef5bd16dc8397b9500218ccc652af7dc6c11d85dfbb16cd7ec0ee0
|
|
4
|
+
data.tar.gz: 9568bee91c9a89576fa24a97e8d0fba2cbf86f28fb4d2f6ede3093b773bade17
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 409dc9ad72f0a1771ad325995905bde702dcae4d3839b983c7cf02a5ace8927ef9cecc70954666dbce3a634b144d0ee8e8bf3f7981a55edcc52c480545ce36eb
|
|
7
|
+
data.tar.gz: 8663a174778b268e3ea596a81856ff2f53b3a4d3387e68e329bddb38f6d3e002bfc8838d3634304a7680cf8a998db99468dc18b210356259522b1c69aea34d00
|
data/bin/demo
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
require "bundler/setup"
|
|
29
29
|
require "output_mode"
|
|
30
|
+
require 'erb'
|
|
30
31
|
|
|
31
32
|
module DemoIndex
|
|
32
33
|
extend OutputMode::TLDR::Index
|
|
@@ -47,13 +48,25 @@ module DemoShow
|
|
|
47
48
|
register_callable(header: 'Standard') { 'always visible' }
|
|
48
49
|
register_callable(header: 'Verbose', verbose: true) { 'verbose visible' }
|
|
49
50
|
register_callable(header: 'Simplified', verbose: false) { 'simplified visible' }
|
|
50
|
-
register_callable(header: 'Yes/True') { true }
|
|
51
|
-
register_callable(header: 'No/False') { false }
|
|
51
|
+
register_callable(header: 'Yes/True', section: :boolean) { true }
|
|
52
|
+
register_callable(header: 'No/False', section: :boolean) { false }
|
|
52
53
|
register_callable(header: 'Missing') { nil }
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
data = [1, 2, 3]
|
|
56
57
|
|
|
58
|
+
other_template = ERB.new(<<~TEMPLATE, nil, '-')
|
|
59
|
+
# Non boolean values
|
|
60
|
+
<% each(:other) do |value, field:, padding:, **_| -%>
|
|
61
|
+
<%= padding -%><%= pastel.blue.bold field -%><%= pastel.bold ':' -%> <%= pastel.green value %>
|
|
62
|
+
<% end -%>
|
|
63
|
+
|
|
64
|
+
# Boolean Values
|
|
65
|
+
<% each(:boolean) do |value, field:, padding:, **_| -%>
|
|
66
|
+
<%= padding -%><%= pastel.blue.bold field -%><%= pastel.bold ':' -%> <%= pastel.green value %>
|
|
67
|
+
<% end -%>
|
|
68
|
+
TEMPLATE
|
|
69
|
+
|
|
57
70
|
puts <<~EOF
|
|
58
71
|
#==============================================================================
|
|
59
72
|
#==============================================================================
|
|
@@ -122,4 +135,11 @@ puts <<~EOF
|
|
|
122
135
|
# Demo ASCII Index
|
|
123
136
|
#==============================================================================
|
|
124
137
|
#{DemoShow.build_output(ascii: true).render(*data)}
|
|
138
|
+
|
|
139
|
+
#==============================================================================
|
|
140
|
+
# Group the boolean value separately
|
|
141
|
+
# NOTE: This only occurs in interactive mode
|
|
142
|
+
# Non-Interactive sessions have a fix order
|
|
143
|
+
#==============================================================================
|
|
144
|
+
#{DemoShow.build_output(template: other_template).render(*data)}
|
|
125
145
|
EOF
|
|
@@ -38,9 +38,23 @@ module OutputMode
|
|
|
38
38
|
# @yieldparam field: An optional field header for the value
|
|
39
39
|
# @yieldparam padding: A padding string which will right align the +field+
|
|
40
40
|
# @yieldparam **config TBA
|
|
41
|
-
def each
|
|
42
|
-
|
|
43
|
-
output.
|
|
41
|
+
def each(section = nil)
|
|
42
|
+
# Select the indices for the relevant section
|
|
43
|
+
indices = (0...output.procs.length).to_a
|
|
44
|
+
if section
|
|
45
|
+
indices.select! do |idx|
|
|
46
|
+
output.index_selector(:sections, idx) == section
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Find the max field length
|
|
51
|
+
max = indices.map do |idx|
|
|
52
|
+
output.index_selector(:fields, idx).to_s.length
|
|
53
|
+
end.max
|
|
54
|
+
|
|
55
|
+
# Yield each selected attribute
|
|
56
|
+
indices.each do |idx|
|
|
57
|
+
value = generated[idx]
|
|
44
58
|
field = output.index_selector(:fields, idx)
|
|
45
59
|
padding = ' ' * (max - field.to_s.length)
|
|
46
60
|
yield(value, field: field, padding: padding)
|
|
@@ -61,6 +75,12 @@ module OutputMode
|
|
|
61
75
|
def pastel
|
|
62
76
|
@pastel ||= Pastel.new(enabled: colorize)
|
|
63
77
|
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def generated
|
|
82
|
+
@generated ||= output.generate(model)
|
|
83
|
+
end
|
|
64
84
|
end
|
|
65
85
|
|
|
66
86
|
# @!attribute [r] erb
|
|
@@ -68,7 +88,8 @@ module OutputMode
|
|
|
68
88
|
# @!attribute [r] separator
|
|
69
89
|
# @!attribute [r] fields
|
|
70
90
|
# @!attribute [r] colorize
|
|
71
|
-
|
|
91
|
+
# @!attribute [r] sections
|
|
92
|
+
attr_reader :erb, :fields, :separator, :colorize, :sections
|
|
72
93
|
|
|
73
94
|
# Create a new +output+ which will render using +ERB+. The provided +template+ should
|
|
74
95
|
# only render the +output+ for a single +entry+ (aka model, record, data object, etc).
|
|
@@ -84,23 +105,32 @@ module OutputMode
|
|
|
84
105
|
#
|
|
85
106
|
# @overload initialize(*procs, template: nil, fields: nil, seperator: "\n", yes: 'true', no: 'false', **config)
|
|
86
107
|
# @param [Array] *procs see {OutputMode::Output#initialize}
|
|
87
|
-
# @param [String] template: A string to be converted into +ERB+
|
|
88
108
|
# @param [ERB] template: The +template+ object used by the renderer
|
|
89
109
|
# @param [Array] fields: An optional array of field headers that map to the procs, repeating the last value if required
|
|
90
110
|
# @param fields: A static value to use as all field headers
|
|
91
111
|
# @param separator: The character(s) used to join the "entries" together
|
|
92
112
|
# @param colorize: Flags if the caller wants the colorized version, this maybe ignored by +template+
|
|
113
|
+
# @param sections: An optional array that groups the procs into sections. This is ignored by default
|
|
93
114
|
# @param [Hash] **config see {OutputMode::Output#initialize}
|
|
94
115
|
def initialize(*procs,
|
|
95
116
|
template: nil,
|
|
96
117
|
fields: nil,
|
|
97
118
|
separator: "\n",
|
|
98
119
|
colorize: false,
|
|
120
|
+
sections: nil,
|
|
99
121
|
**config)
|
|
100
|
-
@erb =
|
|
122
|
+
@erb = case template
|
|
123
|
+
when String
|
|
124
|
+
ERB.new(template, nil, '-')
|
|
125
|
+
when ERB
|
|
126
|
+
template
|
|
127
|
+
else
|
|
128
|
+
DEFAULT_ERB
|
|
129
|
+
end
|
|
101
130
|
@fields = fields
|
|
102
131
|
@separator = separator
|
|
103
132
|
@colorize = colorize
|
|
133
|
+
@sections = sections
|
|
104
134
|
super(*procs, **config)
|
|
105
135
|
end
|
|
106
136
|
|
|
@@ -35,9 +35,10 @@ module OutputMode
|
|
|
35
35
|
# @overload register_callable(header:, verbose: true)
|
|
36
36
|
# @param header: The human readable key to the field, uses the term 'header' for consistency
|
|
37
37
|
# @param verbose: Whether the field will be shown in the verbose output
|
|
38
|
+
# @param section: Define the grouping a callable belongs to. Ignored by default
|
|
38
39
|
# @yieldparam model The subject the column is describing, some sort of data model
|
|
39
|
-
def register_callable(header:, verbose: nil, &b)
|
|
40
|
-
super(modes: { verbose: verbose }, header: header, &b)
|
|
40
|
+
def register_callable(header:, verbose: nil, section: :other, &b)
|
|
41
|
+
super(modes: { verbose: verbose }, header: header, section: section, &b)
|
|
41
42
|
end
|
|
42
43
|
alias_method :register_attribute, :register_callable
|
|
43
44
|
|
|
@@ -60,9 +61,11 @@ module OutputMode
|
|
|
60
61
|
# for consumption by machines. This output ignores the provided +verbose+
|
|
61
62
|
# flag as it is always verbose.
|
|
62
63
|
#
|
|
64
|
+
# The +template+ overrides the default erb template for the output
|
|
65
|
+
#
|
|
63
66
|
# An interative/ non-interactive output can be forced by setting the
|
|
64
67
|
# +interactive+ flag to +true+/+false+ respectively
|
|
65
|
-
def build_output(verbose: false, ascii: false, interactive: nil)
|
|
68
|
+
def build_output(verbose: false, ascii: false, interactive: nil, template: nil)
|
|
66
69
|
callables = if verbose || !$stdout.tty?
|
|
67
70
|
# Filter out columns that are explicitly not verbose
|
|
68
71
|
output_callables.select { |o| o.verbose?(true) }
|
|
@@ -73,15 +76,19 @@ module OutputMode
|
|
|
73
76
|
|
|
74
77
|
if interactive || (interactive.nil? && $stdout.tty?)
|
|
75
78
|
# Creates the human readable output
|
|
76
|
-
opts =
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
79
|
+
opts = if ascii
|
|
80
|
+
{ yes: 'yes', no: 'no', colorize: false }
|
|
81
|
+
else
|
|
82
|
+
{ yes: '✓', no: '✕', colorize: TTY::Color.color? }
|
|
80
83
|
end
|
|
81
84
|
|
|
85
|
+
sections = callables.map { |o| o.config[:section] }
|
|
86
|
+
|
|
82
87
|
Outputs::Templated.new(*callables,
|
|
83
88
|
fields: callables.map { |c| c.config.fetch(:header, 'missing') },
|
|
84
89
|
default: '(none)',
|
|
90
|
+
sections: sections,
|
|
91
|
+
template: template,
|
|
85
92
|
**opts)
|
|
86
93
|
else
|
|
87
94
|
# Creates the machine readable output
|
data/lib/output_mode/version.rb
CHANGED