console_table 0.1.1 → 0.1.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 +11 -10
- data/console_table.gemspec +1 -1
- data/lib/console_table.rb +56 -52
- data/test/test_console_table.rb +45 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8df10271a0fee5c99ea39e43b65df2b2f7d4f047
|
4
|
+
data.tar.gz: 210bf58871ea3015c9ce28944018d4049d4dc89b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d05a9e405b606cb76de88b09be313ceccd17d847bf5880a96a8c6693b26e15bd287981e72ffe5fd52ed4921243aa9d5d43d67a53b526789f88e213b869028f9
|
7
|
+
data.tar.gz: cbd331465a4707a54852801b57a0d5f00bce0bb5e4d82a1ef546022781239cb4e09ec51f4c2fdcad73da1c51ada46ae7dd25cad15ac7937dcfbc35a5becf4eba
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ It can be used to generate output similar to this screenshot:
|
|
9
9
|
|
10
10
|
![image](console_table_screenshot.png)
|
11
11
|
|
12
|
-
You're able to specify left/right/center text justification, headers, footers,
|
12
|
+
You're able to specify left/right/center text justification, headers, footers, and most importantly different sizes including exact character widths, screen percentages, and `*` for whatever is left. If the window resizes the class will notice and output all new lines with recalculated locations (previous lines are not re-printed).
|
13
13
|
|
14
14
|
**Note**: This project is _not_ like `hirb` and it makes no attempt to take any sort of ActiveRecord objects or an array of data and automatically fit the data to a nice table. It gives much, much more control over to the developer in how the output is formatted, but is much more difficult to work with as a trade-off - you will have to go through each element of your data set and manually munge it into the format needed by ConsoleTable to print a line. ConsoleTable is meant to save on a lot of math and calculation, but will do no analyzing of your data itself in order to format it, please consult the Usage section for more details.
|
15
15
|
|
@@ -123,8 +123,8 @@ table_config = [
|
|
123
123
|
|
124
124
|
ConsoleTable.define(table_config) do |table|
|
125
125
|
table << {
|
126
|
-
:name=>
|
127
|
-
:birthday=>
|
126
|
+
:name=>"Rod".colorize(:red) #Uses 'colorize' gem
|
127
|
+
:birthday=>"04-14-80".blue,
|
128
128
|
:nickname=>{:text=>"Chainsaw", :justify=>:left},
|
129
129
|
:motto=>{:text=>"This is a very long motto, I don't mind if it gets cut off but I'd like it to indicate as such with ellipses", :ellipsize=>true}
|
130
130
|
}
|
@@ -138,9 +138,10 @@ will output
|
|
138
138
|
Name DOB Nickname(s) Motto
|
139
139
|
-------------------------------------------------------------------------------
|
140
140
|
Rod 04-14-80 Chainsaw This is a very long motto, I don't...
|
141
|
+
===============================================================================
|
141
142
|
```
|
142
143
|
|
143
|
-
Due to limitations of this readme format, you'll have to take my word for it that the
|
144
|
+
Due to limitations of this readme format, you'll have to take my word for it that the colors placed by the 'colorize' gem are preserved, and that the table correctly handles resetting ANSI colors when truncating messages that have formatting.
|
144
145
|
|
145
146
|
You can also add a title and a footer to the table, or indent the entire table within the window using different options. Again, here's another example that should more-or-less speak for itself.
|
146
147
|
|
@@ -157,23 +158,23 @@ table_config = [
|
|
157
158
|
|
158
159
|
ConsoleTable.define(table_config, :left_margin=>5, :right_margin=>10, :title=>"Movie Killers") do |table|
|
159
160
|
table << {
|
160
|
-
:title=>
|
161
|
+
:title=>"Friday the 13th"
|
161
162
|
:name=>{:text=>"Jason's Mom", :justify=>:left},
|
162
|
-
:release_date=>
|
163
|
+
:release_date=>"05-09-80".blue
|
163
164
|
:tagline=>{:text=>"They were warned...They are doomed...And on Friday the 13th, nothing will save them.", :ellipsize=>true}
|
164
165
|
}
|
165
166
|
|
166
167
|
table << {
|
167
|
-
:title=>
|
168
|
+
:title=>"Halloween".white.on_red,
|
168
169
|
:name=>{:text=>"Michael Meyers", :justify=>:left},
|
169
|
-
:release_date=>
|
170
|
+
:release_date=>"10-25-80".blue
|
170
171
|
:tagline=>{:text=>"Everyone is entitled to one good scare", :ellipsize=>true}
|
171
172
|
}
|
172
173
|
|
173
174
|
table << {
|
174
|
-
:title=>{:text=>"Nightmare on Elm St."
|
175
|
+
:title=>{:text=>"Nightmare on Elm St."}
|
175
176
|
:name=>{:text=>"Freddy Krueger", :justify=>:left},
|
176
|
-
:release_date=>{text: "11-16-84"
|
177
|
+
:release_date=>{text: "11-16-84".blue}
|
177
178
|
:tagline=>{:text=>"A scream that wakes you up, might be your own", :ellipsize=>true}
|
178
179
|
}
|
179
180
|
|
data/console_table.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency 'rake', '~> 0'
|
22
22
|
spec.add_development_dependency 'simplecov', '~> 0.9'
|
23
23
|
spec.add_development_dependency 'minitest', '~> 5.5'
|
24
|
+
spec.add_development_dependency 'colorize', '~> 0.7'
|
24
25
|
|
25
|
-
spec.add_runtime_dependency 'colorize', '~> 0.7'
|
26
26
|
spec.add_runtime_dependency 'ruby-terminfo', '~> 0.1'
|
27
27
|
end
|
data/lib/console_table.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
require 'colorize'
|
2
1
|
require 'terminfo'
|
3
2
|
|
4
3
|
module ConsoleTable
|
5
|
-
VERSION = "0.1.
|
4
|
+
VERSION = "0.1.2"
|
6
5
|
|
7
6
|
def self.define(layout, options={}, &block)
|
8
7
|
table = ConsoleTableClass.new(layout, options)
|
@@ -58,11 +57,7 @@ module ConsoleTable
|
|
58
57
|
if not @title.nil? and @title.length <= @working_width
|
59
58
|
@out.print " "*@left_margin
|
60
59
|
@out.print "|" if @borders
|
61
|
-
|
62
|
-
right_side = (@working_width - @title.uncolorize.length) - left_side
|
63
|
-
@out.print " "*left_side
|
64
|
-
@out.print @title
|
65
|
-
@out.print " "*right_side
|
60
|
+
@out.print format(@working_width, @title, false, :center)
|
66
61
|
@out.print "|" if @borders
|
67
62
|
@out.print "\n"
|
68
63
|
print_line if @borders
|
@@ -98,7 +93,7 @@ module ConsoleTable
|
|
98
93
|
@out.print join_char
|
99
94
|
@column_widths.each_with_index do |column, i|
|
100
95
|
@out.print char*column[:size]
|
101
|
-
if
|
96
|
+
if edge_join_only and i < @column_widths.length - 1
|
102
97
|
@out.print char
|
103
98
|
else
|
104
99
|
@out.print join_char
|
@@ -118,11 +113,10 @@ module ConsoleTable
|
|
118
113
|
end
|
119
114
|
|
120
115
|
footer_lines.each do |line|
|
121
|
-
if line.
|
116
|
+
if uncolorize(line).length <= @working_width
|
122
117
|
@out.print " " * @left_margin
|
123
118
|
@out.print "|" if @borders
|
124
|
-
@out.print
|
125
|
-
@out.print line
|
119
|
+
@out.print format(@working_width, line, false, :right)
|
126
120
|
@out.print "|" if @borders
|
127
121
|
@out.print "\n"
|
128
122
|
end
|
@@ -136,7 +130,7 @@ module ConsoleTable
|
|
136
130
|
end
|
137
131
|
|
138
132
|
def should_print_footer
|
139
|
-
footer_lines.length > 0 && footer_lines.any? { |l| l.
|
133
|
+
footer_lines.length > 0 && footer_lines.any? { |l| uncolorize(l).length <= @working_width }
|
140
134
|
end
|
141
135
|
|
142
136
|
def footer_lines
|
@@ -144,7 +138,7 @@ module ConsoleTable
|
|
144
138
|
@footer.each do |line|
|
145
139
|
lines = line.split("\n")
|
146
140
|
lines.each do |l|
|
147
|
-
footer_lines << l.strip unless l.nil? or l.
|
141
|
+
footer_lines << l.strip unless l.nil? or uncolorize(l).strip == ""
|
148
142
|
end
|
149
143
|
end
|
150
144
|
footer_lines
|
@@ -152,7 +146,7 @@ module ConsoleTable
|
|
152
146
|
|
153
147
|
def print(options)
|
154
148
|
|
155
|
-
if
|
149
|
+
if options.is_a? String
|
156
150
|
print_plain(options)
|
157
151
|
return
|
158
152
|
end
|
@@ -181,36 +175,12 @@ module ConsoleTable
|
|
181
175
|
if to_print.is_a? String
|
182
176
|
@out.print format(column[:size], normalize(to_print), false, justify)
|
183
177
|
elsif to_print.is_a? Hash
|
184
|
-
color = to_print[:color] || :default
|
185
|
-
background = to_print[:background] || :default
|
186
178
|
text = normalize(to_print[:text]) || ""
|
187
179
|
ellipsize = to_print[:ellipsize] || false
|
188
|
-
highlight = to_print[:highlight]
|
189
180
|
justify = to_print[:justify] || justify #can override
|
190
|
-
mode = to_print[:mode] || :default
|
191
181
|
|
192
182
|
formatted=format(column[:size], text, ellipsize, justify)
|
193
183
|
|
194
|
-
if color != :default
|
195
|
-
formatted = formatted.colorize(color)
|
196
|
-
end
|
197
|
-
|
198
|
-
if background != :default
|
199
|
-
formatted = formatted.colorize(:background => background)
|
200
|
-
end
|
201
|
-
|
202
|
-
if mode != :default
|
203
|
-
formatted = formatted.colorize(:mode => mode)
|
204
|
-
end
|
205
|
-
|
206
|
-
unless highlight.nil?
|
207
|
-
highlight_regex = to_print[:highlight][:regex] || /wontbefoundbecauseit'sgobbledygookblahblahblahbah/
|
208
|
-
highlight_color = to_print[:highlight][:color] || :blue
|
209
|
-
highlight_background = to_print[:highlight][:background] || :default
|
210
|
-
|
211
|
-
formatted = formatted.gsub(highlight_regex, '\0'.colorize(:color => highlight_color, :background => highlight_background))
|
212
|
-
end
|
213
|
-
|
214
184
|
@out.print formatted
|
215
185
|
else
|
216
186
|
@out.print format(column[:size], normalize(to_print.to_s))
|
@@ -287,23 +257,64 @@ module ConsoleTable
|
|
287
257
|
@working_width = (@column_widths.inject(0) { |res, c| res+c[:size] }) + @column_widths.length - 1
|
288
258
|
end
|
289
259
|
|
260
|
+
|
261
|
+
def uncolorize(string)
|
262
|
+
string.gsub(/\e\[\d.*?m/m, "")
|
263
|
+
end
|
264
|
+
|
265
|
+
#TODO: if you're doing center or right-justification, should it trim from the sides or from the left, respectively?
|
290
266
|
def format(length, text, ellipsize=false, justify=:left)
|
291
|
-
|
267
|
+
uncolorized = uncolorize(text)
|
268
|
+
if uncolorized.length > length
|
269
|
+
|
292
270
|
if ellipsize
|
293
|
-
|
271
|
+
goal_length = length-3
|
294
272
|
else
|
295
|
-
|
273
|
+
goal_length = length
|
274
|
+
end
|
275
|
+
|
276
|
+
parts = text.scan(/(\e\[\d.*?m)|(.)/) #The idea here is to break the string up into control codes and single characters
|
277
|
+
#We're going to now count up until we hit goal length, but we're not going to ever count control codes against the count
|
278
|
+
#We're also going to keep track of if the last thing was a color code, so we know to reset if a color is "active"
|
279
|
+
|
280
|
+
#I can't think of a better way to do this, it's probably dumb
|
281
|
+
current_length = 0
|
282
|
+
current_index = 0
|
283
|
+
final_string_parts = []
|
284
|
+
color_active = false
|
285
|
+
|
286
|
+
while current_length < goal_length
|
287
|
+
color_code, regular_text = parts[current_index]
|
288
|
+
if not regular_text.nil?
|
289
|
+
current_length = current_length + 1
|
290
|
+
final_string_parts << regular_text
|
291
|
+
elsif not color_code.nil?
|
292
|
+
if color_code == "\e[0m"
|
293
|
+
color_active = false if color_active
|
294
|
+
else
|
295
|
+
color_active = true
|
296
|
+
end
|
297
|
+
final_string_parts << color_code
|
298
|
+
else
|
299
|
+
raise("Something very confusing happened")
|
300
|
+
end
|
301
|
+
current_index = current_index + 1
|
296
302
|
end
|
303
|
+
|
304
|
+
final_string_parts << "..." if ellipsize
|
305
|
+
final_string_parts << "\e[0m" if color_active
|
306
|
+
|
307
|
+
final_string_parts.join("")
|
297
308
|
else
|
298
309
|
if justify == :right
|
299
|
-
(" "*(length-
|
310
|
+
(" "*(length-uncolorized.length)) + text
|
300
311
|
elsif justify == :center
|
301
|
-
space = length-
|
312
|
+
space = length-uncolorized.length
|
302
313
|
left_side = space/2
|
303
314
|
right_side = space - left_side
|
304
315
|
(" " * left_side) + text + (" "*right_side)
|
305
316
|
else #assume left
|
306
|
-
text + (" "*(length-
|
317
|
+
text + (" "*(length-uncolorized.length))
|
307
318
|
end
|
308
319
|
end
|
309
320
|
end
|
@@ -317,18 +328,11 @@ module ConsoleTable
|
|
317
328
|
if to_print.is_a? String
|
318
329
|
@out.print format(@working_width, normalize(to_print))
|
319
330
|
elsif to_print.is_a? Hash
|
320
|
-
color = to_print[:color] || :default
|
321
|
-
background = to_print[:background] || :default
|
322
331
|
text = normalize(to_print[:text]) || ""
|
323
332
|
ellipsize = to_print[:ellipsize] || false
|
324
333
|
justify = to_print[:justify] || :left
|
325
|
-
mode = to_print[:mode] || :default
|
326
334
|
|
327
|
-
|
328
|
-
if text != :default or background != :default or mode != :default
|
329
|
-
formatted = formatted.colorize(:color => color, :background => background, :mode => mode)
|
330
|
-
end
|
331
|
-
@out.print formatted
|
335
|
+
@out.print format(@working_width, text, ellipsize, justify)
|
332
336
|
end
|
333
337
|
|
334
338
|
@out.print "|" if @borders
|
data/test/test_console_table.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'console_table'
|
3
|
+
require 'colorize'
|
3
4
|
|
4
5
|
class ConsoleTableTest < Minitest::Test
|
5
6
|
|
@@ -512,7 +513,7 @@ One Two
|
|
512
513
|
|
513
514
|
ConsoleTable.define(table_config, :left_margin=>10, :right_margin=>7, :width=> 100, :title=>"Test Title", :borders=>true, :output=>@mock_out) do |table|
|
514
515
|
(1..5).each do |row|
|
515
|
-
table << (1..4).collect{|i| "Row #{row}, Column #{i}"}
|
516
|
+
table << (1..4).collect{|i| "Row #{row}, Column #{i}".red}
|
516
517
|
end
|
517
518
|
|
518
519
|
table << "Plain line needs borders"
|
@@ -614,6 +615,48 @@ Row 5, Column 1 Row 5, Colu
|
|
614
615
|
assert_output_equal expected, @mock_out.string
|
615
616
|
end
|
616
617
|
|
618
|
+
def test_can_use_colors_without_affecting_layout
|
619
|
+
table_config = [
|
620
|
+
{:key=>:col1, :size=>10, :title=>"Column 1", :justify=>:left},
|
621
|
+
{:key=>:col2, :size=>10, :title=>"Column 2", :justify=>:center},
|
622
|
+
{:key=>:col3, :size=>10, :title=>"Column 3", :justify=>:right},
|
623
|
+
]
|
624
|
+
|
625
|
+
ConsoleTable.define(table_config, :width=> 120, :output=>@mock_out) do |table|
|
626
|
+
table << ["Short".blue, "Short".bold, "Short".red.on_blue]
|
627
|
+
|
628
|
+
table << ["Much much longer".blue, "Much much longer".bold, "Much much longer".red.on_blue]
|
629
|
+
|
630
|
+
table << [
|
631
|
+
{:text=>"Much much longer".blue, :ellipsize=>true},
|
632
|
+
{:text=>"Much much longer".underline, :ellipsize=>true},
|
633
|
+
{:text=>"Much much longer".on_magenta, :ellipsize=>true}
|
634
|
+
]
|
635
|
+
|
636
|
+
table << [
|
637
|
+
{:text=>"Much much longer".yellow, :ellipsize=>true},
|
638
|
+
{:text=>"Normal, should reset", :ellipsize=>true},
|
639
|
+
{:text=>"Much much longer".bold, :ellipsize=>true}
|
640
|
+
]
|
641
|
+
end
|
642
|
+
|
643
|
+
expected=<<-END
|
644
|
+
================================
|
645
|
+
Column 1 Column 2 Column 3
|
646
|
+
--------------------------------
|
647
|
+
Short Short Short
|
648
|
+
Much much Much much Much much
|
649
|
+
Much mu... Much mu... Much mu...
|
650
|
+
Much mu... Normal,... Much mu...
|
651
|
+
================================
|
652
|
+
END
|
653
|
+
|
654
|
+
assert_includes @mock_out.string, "\e[1;39;49mShort\e[0m" #Should have normal color codes
|
655
|
+
assert_includes @mock_out.string, "\e[0;33;49mMuch mu...\e[0m" #the cut-off one should keep the color code for ellipses, then reset
|
656
|
+
|
657
|
+
assert_output_equal expected, @mock_out.string
|
658
|
+
end
|
659
|
+
|
617
660
|
private
|
618
661
|
def assert_output_equal(expected, actual)
|
619
662
|
expected_lines = expected.split("\n")
|
@@ -621,7 +664,7 @@ Row 5, Column 1 Row 5, Colu
|
|
621
664
|
assert_equal expected_lines.length, actual_lines.length
|
622
665
|
expected_lines.each_with_index do |expected_line, i|
|
623
666
|
actual_line = actual_lines[i]
|
624
|
-
assert_equal expected_line.rstrip, actual_line.rstrip
|
667
|
+
assert_equal expected_line.uncolorize.rstrip, actual_line.uncolorize.rstrip
|
625
668
|
end
|
626
669
|
|
627
670
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: console_table
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rod Hilton
|
@@ -73,7 +73,7 @@ dependencies:
|
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0.7'
|
76
|
-
type: :
|
76
|
+
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|