console_table 0.1.7 → 0.2.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/README.md +10 -8
- data/console_table.gemspec +3 -2
- data/lib/console_table.rb +48 -35
- data/test/test_console_table.rb +85 -5
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d31ea023e41a11349f456744423ec4ebf540102c
|
4
|
+
data.tar.gz: cba32a643b607437ece928dbed1dd818ea64d0ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b607321df3045b48f45ca3e77570def4fa316d221d853a594c62b6bd689d9b93b493bc7a50ca420214d63f4cca97f96d7d674ce4e08b4463c0749f102daee9b8
|
7
|
+
data.tar.gz: 9382b05787a3453d447d00dc8e83a0a6bd5ec09d55553d69ae31af8409058640b61086ac90a9ffc75575ff9abac35ed254cd33db27422ae3cb2cfc5ab7dd11ac
|
data/README.md
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
[](https://rubygems.org/gems/console_table) [](https://travis-ci.org/rodhilton/console_table)
|
1
|
+
ConsoleTable [](https://rubygems.org/gems/console_table) [](https://travis-ci.org/rodhilton/console_table)
|
2
|
+
=========
|
4
3
|
|
5
4
|
ConsoleTable is a helper class that allows you to print data to a console in a clean, table-like fashion. It's intended for use
|
6
5
|
in commandline applications with information-dense output. It checks your terminal window size (or COLUMNS environment variable) to ensure
|
@@ -214,6 +213,7 @@ You can also add a title and a footer to the table, or indent the entire table w
|
|
214
213
|
|
215
214
|
```ruby
|
216
215
|
require 'console_table'
|
216
|
+
require 'colorize'
|
217
217
|
|
218
218
|
table_config = [
|
219
219
|
{:key=>:title, :size=>15, :title=>"Movie Title"},
|
@@ -224,23 +224,23 @@ table_config = [
|
|
224
224
|
|
225
225
|
ConsoleTable.define(table_config, :left_margin=>5, :right_margin=>10, :title=>"Movie Killers") do |table|
|
226
226
|
table << {
|
227
|
-
:title=>"Friday the 13th"
|
227
|
+
:title=>"Friday the 13th",
|
228
228
|
:name=>{:text=>"Jason's Mom", :justify=>:left},
|
229
|
-
:release_date=>"05-09-80".blue
|
229
|
+
:release_date=>"05-09-80".blue,
|
230
230
|
:tagline=>{:text=>"They were warned...They are doomed...And on Friday the 13th, nothing will save them.", :ellipsize=>true}
|
231
231
|
}
|
232
232
|
|
233
233
|
table << {
|
234
234
|
:title=>"Halloween".white.on_red,
|
235
235
|
:name=>{:text=>"Michael Meyers", :justify=>:left},
|
236
|
-
:release_date=>"10-25-80".blue
|
236
|
+
:release_date=>"10-25-80".blue,
|
237
237
|
:tagline=>{:text=>"Everyone is entitled to one good scare", :ellipsize=>true}
|
238
238
|
}
|
239
239
|
|
240
240
|
table << {
|
241
|
-
:title=>{:text=>"Nightmare on Elm St."}
|
241
|
+
:title=>{:text=>"Nightmare on Elm St."},
|
242
242
|
:name=>{:text=>"Freddy Krueger", :justify=>:left},
|
243
|
-
:release_date=>{text: "11-16-84".blue}
|
243
|
+
:release_date=>{text: "11-16-84".blue},
|
244
244
|
:tagline=>{:text=>"A scream that wakes you up, might be your own", :ellipsize=>true}
|
245
245
|
}
|
246
246
|
|
@@ -251,6 +251,7 @@ ConsoleTable.define(table_config, :left_margin=>5, :right_margin=>10, :title=>"M
|
|
251
251
|
end
|
252
252
|
```
|
253
253
|
|
254
|
+
which yields:
|
254
255
|
|
255
256
|
```
|
256
257
|
=================================================================
|
@@ -412,6 +413,7 @@ end
|
|
412
413
|
```
|
413
414
|
|
414
415
|
Which yields:
|
416
|
+
|
415
417
|
```
|
416
418
|
================================================================================
|
417
419
|
Name DOB Title
|
data/console_table.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'console_table'
|
4
|
+
# require 'console_table'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "console_table"
|
8
|
-
spec.version =
|
8
|
+
spec.version = "0.2.0"
|
9
9
|
spec.authors = ["Rod Hilton"]
|
10
10
|
spec.email = ["consoletable@rodhilton.com"]
|
11
11
|
spec.summary = %q{Simplifies printing tables of information to commandline consoles}
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
+
spec.add_development_dependency 'simplecov', '~> 0.9'
|
20
21
|
spec.add_development_dependency "bundler", "~> 1.5"
|
21
22
|
spec.add_development_dependency 'rake', '~> 0'
|
22
23
|
spec.add_development_dependency 'minitest', '~> 5.5'
|
data/lib/console_table.rb
CHANGED
@@ -1,6 +1,24 @@
|
|
1
|
+
# ConsoleTable allows you to define a table with columns set to specific sizes,
|
2
|
+
# and then give that table rows of data which it will format into a view that fits
|
3
|
+
# inside a terminal/console.
|
4
|
+
#
|
5
|
+
# Author:: Rod Hilton
|
6
|
+
# License:: MIT
|
7
|
+
#
|
8
|
+
#--
|
9
|
+
# TODO: it's a little weird how, if a footer is too long, it simply doesn't print at all.
|
10
|
+
# This seems like not what someone would want to have happen.
|
11
|
+
# Could we take footer lines and split them every X characters where X is the working
|
12
|
+
# width, then use those? Long lines effectively wrap, but not on word boundaries
|
13
|
+
# TODO: if you're doing center or right-justification, should it trim from the sides or
|
14
|
+
# from the left, respectively?
|
15
|
+
#++
|
16
|
+
|
1
17
|
module ConsoleTable
|
2
|
-
VERSION = "0.1.
|
18
|
+
VERSION = "0.1.8"
|
3
19
|
|
20
|
+
# Define a console table. Requires a table layout which specifies column information
|
21
|
+
# like sizes, titles, and key names.
|
4
22
|
def self.define(layout, options={}, &block)
|
5
23
|
table = ConsoleTableClass.new(layout, options)
|
6
24
|
table.send(:print_header)
|
@@ -9,8 +27,11 @@ module ConsoleTable
|
|
9
27
|
end
|
10
28
|
|
11
29
|
class ConsoleTableClass
|
30
|
+
|
31
|
+
# Add strings to the footer array to have them formatted when the table closes
|
12
32
|
attr_reader :footer
|
13
33
|
|
34
|
+
# Add rows to the table. Prints immediately, consult documentation for examples
|
14
35
|
def <<(options)
|
15
36
|
print(options)
|
16
37
|
end
|
@@ -92,6 +113,30 @@ module ConsoleTable
|
|
92
113
|
end
|
93
114
|
end
|
94
115
|
|
116
|
+
def print_footer()
|
117
|
+
if should_print_footer
|
118
|
+
print_line
|
119
|
+
end
|
120
|
+
|
121
|
+
footer_lines.each do |line|
|
122
|
+
if uncolorize(line).length <= @working_width
|
123
|
+
@out.print " " * @left_margin
|
124
|
+
@out.print "|" if @borders
|
125
|
+
@out.print format(@working_width, line, false, :right)
|
126
|
+
@out.print "|" if @borders
|
127
|
+
@out.print "\n"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
if should_print_footer
|
132
|
+
print_line("=", "*", true)
|
133
|
+
else
|
134
|
+
print_line("=", "*", false)
|
135
|
+
end if @outline
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
|
95
140
|
def print_headings()
|
96
141
|
@headings_printed = true
|
97
142
|
|
@@ -137,30 +182,6 @@ module ConsoleTable
|
|
137
182
|
end
|
138
183
|
end
|
139
184
|
|
140
|
-
#TODO: it's a little weird how, if a footer is too long, it simply doesn't print at all. This seems like not what someone would want to have happen.
|
141
|
-
#Could we take footer lines and split them every X characters where X is the working width, then use those? Long lines effectively wrap, but not on word boundaries
|
142
|
-
def print_footer()
|
143
|
-
if should_print_footer
|
144
|
-
print_line
|
145
|
-
end
|
146
|
-
|
147
|
-
footer_lines.each do |line|
|
148
|
-
if uncolorize(line).length <= @working_width
|
149
|
-
@out.print " " * @left_margin
|
150
|
-
@out.print "|" if @borders
|
151
|
-
@out.print format(@working_width, line, false, :right)
|
152
|
-
@out.print "|" if @borders
|
153
|
-
@out.print "\n"
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
if should_print_footer
|
158
|
-
print_line("=", "*", true)
|
159
|
-
else
|
160
|
-
print_line("=", "*", false)
|
161
|
-
end if @outline
|
162
|
-
end
|
163
|
-
|
164
185
|
def should_print_footer
|
165
186
|
footer_lines.length > 0 && footer_lines.any? { |l| uncolorize(l).length <= @working_width }
|
166
187
|
end
|
@@ -321,7 +342,6 @@ module ConsoleTable
|
|
321
342
|
string.gsub(/\e\[\d[^m]*?m/m, "")
|
322
343
|
end
|
323
344
|
|
324
|
-
#TODO: if you're doing center or right-justification, should it trim from the sides or from the left, respectively?
|
325
345
|
def format(length, text, ellipsize=false, justify=:left)
|
326
346
|
uncolorized = uncolorize(text)
|
327
347
|
if uncolorized.length > length
|
@@ -354,8 +374,6 @@ module ConsoleTable
|
|
354
374
|
color_active = true
|
355
375
|
end
|
356
376
|
final_string_parts << color_code
|
357
|
-
else
|
358
|
-
raise("Something very confusing happened")
|
359
377
|
end
|
360
378
|
current_index = current_index + 1
|
361
379
|
end
|
@@ -385,13 +403,8 @@ module ConsoleTable
|
|
385
403
|
@out.print "|" if @borders
|
386
404
|
|
387
405
|
if to_print.is_a? String
|
388
|
-
|
389
|
-
|
390
|
-
text = normalize(to_print[:text]) || ""
|
391
|
-
ellipsize = to_print[:ellipsize] || false
|
392
|
-
justify = to_print[:justify] || :left
|
393
|
-
|
394
|
-
@out.print format(@working_width, text, ellipsize, justify)
|
406
|
+
justify = infer_justify_from_string(to_print, :left)
|
407
|
+
@out.print format(@working_width, normalize(to_print), false, justify)
|
395
408
|
end
|
396
409
|
|
397
410
|
@out.print "|" if @borders
|
data/test/test_console_table.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start
|
4
|
+
|
2
5
|
require 'minitest/autorun'
|
3
|
-
#TODO: trimming from different sides depending on justification?
|
4
6
|
|
5
7
|
class ConsoleTableTest < Minitest::Test
|
6
8
|
|
7
|
-
require 'console_table'
|
8
|
-
require 'colorize'
|
9
9
|
|
10
10
|
def setup
|
11
|
+
require 'console_table'
|
12
|
+
require 'colorize'
|
11
13
|
@mock_out = StringIO.new
|
12
14
|
end
|
13
15
|
|
@@ -1260,8 +1262,6 @@ Row 2, Column 1 Row 2, Column 1
|
|
1260
1262
|
==========================================================
|
1261
1263
|
END
|
1262
1264
|
|
1263
|
-
puts @mock_out.string
|
1264
|
-
|
1265
1265
|
assert_output_equal expected, @mock_out.string
|
1266
1266
|
|
1267
1267
|
end
|
@@ -1288,6 +1288,86 @@ Row 2, Column 1 Row 2, Column 2
|
|
1288
1288
|
|
1289
1289
|
end
|
1290
1290
|
|
1291
|
+
def test_can_print_basically_anything
|
1292
|
+
table_config = [
|
1293
|
+
{:key => :col1, :size => 20, :title => "Column 1"}
|
1294
|
+
]
|
1295
|
+
|
1296
|
+
ConsoleTable.define(table_config, :width => 100, :output=>@mock_out) do |table|
|
1297
|
+
table << ["String"]
|
1298
|
+
table << [42]
|
1299
|
+
table << [0.3]
|
1300
|
+
table << [:why_not]
|
1301
|
+
table << [nil]
|
1302
|
+
|
1303
|
+
end
|
1304
|
+
|
1305
|
+
expected=<<-END
|
1306
|
+
====================
|
1307
|
+
Column 1
|
1308
|
+
--------------------
|
1309
|
+
String
|
1310
|
+
42
|
1311
|
+
0.3
|
1312
|
+
why_not
|
1313
|
+
|
1314
|
+
====================
|
1315
|
+
END
|
1316
|
+
|
1317
|
+
assert_output_equal expected, @mock_out.string
|
1318
|
+
end
|
1319
|
+
|
1320
|
+
def test_plain_line_can_be_justified
|
1321
|
+
table_config = [
|
1322
|
+
{:key => :col1, :size => 20, :title => "Column 1"}
|
1323
|
+
]
|
1324
|
+
|
1325
|
+
ConsoleTable.define(table_config, :width => 30, :output => @mock_out) do |table|
|
1326
|
+
table << ["One"]
|
1327
|
+
|
1328
|
+
table << "Plain line"
|
1329
|
+
table << "Plain line\t"
|
1330
|
+
table << "\tPlain line\t"
|
1331
|
+
table << "\tPlain line"
|
1332
|
+
|
1333
|
+
table << ["Two"]
|
1334
|
+
|
1335
|
+
end
|
1336
|
+
|
1337
|
+
expected=<<-END
|
1338
|
+
====================
|
1339
|
+
Column 1
|
1340
|
+
--------------------
|
1341
|
+
One
|
1342
|
+
Plain line
|
1343
|
+
Plain line
|
1344
|
+
Plain line
|
1345
|
+
Plain line
|
1346
|
+
Two
|
1347
|
+
====================
|
1348
|
+
END
|
1349
|
+
|
1350
|
+
assert_output_equal expected, @mock_out.string
|
1351
|
+
end
|
1352
|
+
|
1353
|
+
def test_trimming_without_cutting_off_color_doesnt_result_in_extra_color_reset
|
1354
|
+
ConsoleTable.define([30], :width => 30, :output => @mock_out) do |table|
|
1355
|
+
table << ["This is way too long and #{"will".red} be truncated"]
|
1356
|
+
end
|
1357
|
+
|
1358
|
+
expected=<<-END
|
1359
|
+
==============================
|
1360
|
+
Column 1
|
1361
|
+
------------------------------
|
1362
|
+
This is way too long and will
|
1363
|
+
==============================
|
1364
|
+
END
|
1365
|
+
|
1366
|
+
assert_includes @mock_out.string, "and \e[0;31;49mwill\e[0m \n"
|
1367
|
+
|
1368
|
+
assert_output_equal expected, @mock_out.string
|
1369
|
+
end
|
1370
|
+
|
1291
1371
|
private
|
1292
1372
|
def assert_output_equal(expected, actual)
|
1293
1373
|
expected_lines = expected.split("\n")
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rod Hilton
|
@@ -10,6 +10,20 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: simplecov
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.9'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|