console_table 0.2.2 → 0.2.3
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/console_table.gemspec +1 -1
- data/console_table_screenshot.png +0 -0
- data/examples/purchases.rb +41 -0
- data/examples/stocks.rb +48 -0
- data/lib/console_table.rb +5 -2
- data/test/test_console_table.rb +126 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20cc9ca26b036bfe447968e6e351a9c701a22e56
|
4
|
+
data.tar.gz: 3dff948fbf2f07604b93189d323b6d55a69efba3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1da3fe51b14f347d17e7670840d00a13c73599e4642518f9ae94769205dc74c222676fbad746b3c4719d476c8125131eaa4a2aac6f94b1d38606f462ad4b5bd0
|
7
|
+
data.tar.gz: 920c48265acf2873c2ff40e86d17ea250a6ef8641b278bc4af148e380951984c625d50dd0c904b646ee3c50f0f2a9301c0ae2f31042db981ebd0033e96ed16fd
|
data/console_table.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "console_table"
|
7
|
-
spec.version = "0.2.
|
7
|
+
spec.version = "0.2.3"
|
8
8
|
spec.authors = ["Rod Hilton"]
|
9
9
|
spec.email = ["consoletable@rodhilton.com"]
|
10
10
|
spec.summary = %q{Simplifies printing tables of information to commandline consoles}
|
Binary file
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'console_table'
|
2
|
+
require 'faker'
|
3
|
+
require 'colorize'
|
4
|
+
|
5
|
+
# Just a goofy example that simulates a big table of purchase data.
|
6
|
+
|
7
|
+
layout = [
|
8
|
+
{size: 6, title: "Pur.#"},
|
9
|
+
{size: 20, title: "Customer"},
|
10
|
+
{size: 13, title: "Product Code"},
|
11
|
+
{size: "*", title: "Product Name", ellipsize: true},
|
12
|
+
{size: 5, title: "Price", justify: :right},
|
13
|
+
{size: 3, title: "Qty"},
|
14
|
+
{size: 8, title: "Date"},
|
15
|
+
{size: 11, title: "Profit/Loss", justify: :right}
|
16
|
+
]
|
17
|
+
|
18
|
+
sum = 0
|
19
|
+
|
20
|
+
ConsoleTable.define(layout, :title=>"Product Purchases".upcase.bold.green.underline) do |table|
|
21
|
+
(0..25).each do |i|
|
22
|
+
name = Faker::Name.name
|
23
|
+
profit = (rand(1*100000)-30000)/100.00
|
24
|
+
table << [
|
25
|
+
sprintf("%010d", rand(1..999999999)).blue,
|
26
|
+
name,
|
27
|
+
Faker::Code.ean.red,
|
28
|
+
Faker::Commerce.product_name,
|
29
|
+
sprintf("%#.2f", Faker::Commerce.price).bold.green,
|
30
|
+
rand(1..20).to_s.magenta,
|
31
|
+
Faker::Date.backward(14).strftime("%m/%d/%y").yellow,
|
32
|
+
sprintf("%#.2f", profit).colorize(profit < 0 ? :red : :green)
|
33
|
+
]
|
34
|
+
|
35
|
+
sum = sum + profit
|
36
|
+
|
37
|
+
sleep(rand(1..10)/20.0)
|
38
|
+
end
|
39
|
+
|
40
|
+
table.footer << "Total Profit: #{sprintf("%#.2f", sum).to_s.colorize(sum < 0 ? :red : :green)}"
|
41
|
+
end
|
data/examples/stocks.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'console_table'
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'net/http'
|
5
|
+
require 'open-uri'
|
6
|
+
require 'colorize'
|
7
|
+
|
8
|
+
symbols = ["YHOO", "AAPL", "GOOG", "MSFT", "C", "MMM", "KO", "WMT", "GM", "IBM", "MCD", "VZ", "HD", "DIS", "INTC"]
|
9
|
+
|
10
|
+
params = symbols.collect{|s| "\"#{s}\"" }.join(",")
|
11
|
+
url = "http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol in (#{params})&env=http://datatables.org/alltables.env&format=json"
|
12
|
+
uri = URI.parse(URI::encode(url))
|
13
|
+
response = Net::HTTP.get_response(uri)
|
14
|
+
json = JSON.parse(response.body)
|
15
|
+
|
16
|
+
table_config = [
|
17
|
+
{:key=>:symbol, :title=>"Symbol", :size=>6},
|
18
|
+
{:key=>:name, :title=>"Name", :size=>17},
|
19
|
+
{:key=>:price, :title=>"Price", :size=>5, :justify=>:right},
|
20
|
+
{:key=>:change, :title=>"Change", :size=>7, :justify=>:right},
|
21
|
+
{:key=>:recommendation, :title=>"Recommendation", :size=>15, :justify=>:right}
|
22
|
+
]
|
23
|
+
|
24
|
+
ConsoleTable.define(table_config, :title=>"Stock Prices") do |table|
|
25
|
+
|
26
|
+
json["query"]["results"]["quote"].each do |j|
|
27
|
+
change = j["ChangeRealtime"]
|
28
|
+
if change.start_with?("+")
|
29
|
+
change = change.green
|
30
|
+
else
|
31
|
+
change = change.red
|
32
|
+
end
|
33
|
+
|
34
|
+
recommendation = (rand() <= 0.5) ? "BUY!".white.on_green.bold.underline : "Sell".yellow
|
35
|
+
|
36
|
+
table << [
|
37
|
+
j["Symbol"].magenta,
|
38
|
+
j["Name"],
|
39
|
+
j["LastTradePriceOnly"],
|
40
|
+
change,
|
41
|
+
recommendation
|
42
|
+
]
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
table.footer << "Recommendations randomly generated"
|
47
|
+
|
48
|
+
end
|
data/lib/console_table.rb
CHANGED
@@ -65,6 +65,7 @@ module ConsoleTable
|
|
65
65
|
@left_margin = options[:left_margin] || 0
|
66
66
|
@right_margin = options[:right_margin] || 0
|
67
67
|
@headings = options[:headings].nil? ? true : options[:headings]
|
68
|
+
@ellipse = options[:ellipse] || "..."
|
68
69
|
|
69
70
|
#Set outline, just the upper and lower lines
|
70
71
|
if @borders
|
@@ -335,8 +336,10 @@ module ConsoleTable
|
|
335
336
|
uncolorized = uncolorize(text)
|
336
337
|
if uncolorized.length > length
|
337
338
|
|
339
|
+
ellipsize = false if uncolorize(@ellipse).length >= length
|
340
|
+
|
338
341
|
if ellipsize
|
339
|
-
goal_length = length-
|
342
|
+
goal_length = length-uncolorize(@ellipse).length
|
340
343
|
else
|
341
344
|
goal_length = length
|
342
345
|
end
|
@@ -367,7 +370,7 @@ module ConsoleTable
|
|
367
370
|
current_index = current_index + 1
|
368
371
|
end
|
369
372
|
|
370
|
-
final_string_parts <<
|
373
|
+
final_string_parts << @ellipse if ellipsize
|
371
374
|
final_string_parts << "\e[0m" if color_active
|
372
375
|
|
373
376
|
final_string_parts.join("")
|
data/test/test_console_table.rb
CHANGED
@@ -7,6 +7,9 @@ require 'minitest/autorun'
|
|
7
7
|
#--
|
8
8
|
# TODO: if you're doing center or right-justification, should it trim from the sides or
|
9
9
|
# from the left, respectively?
|
10
|
+
# TODO: "compact" option, which when true makes tables output like they do here, but when
|
11
|
+
# compact is FALSE and borders is true, there's an extra space between the | and the text
|
12
|
+
# but only in the middle - on the sides the | goes up against the margin
|
10
13
|
#++
|
11
14
|
class ConsoleTableTest < Minitest::Test
|
12
15
|
|
@@ -1471,6 +1474,129 @@ Fake:... Fake: 1
|
|
1471
1474
|
assert_output_equal expected, @mock_out.string
|
1472
1475
|
end
|
1473
1476
|
|
1477
|
+
def test_can_custom_ellipse
|
1478
|
+
table_config = [
|
1479
|
+
{:key => :col1, :size => 10, :title => "Column 1", :ellipsize=>true},
|
1480
|
+
{:key => :col2, :size => 10, :title => "Column 2", :ellipsize=>true, :justify=>:right},
|
1481
|
+
]
|
1482
|
+
|
1483
|
+
ConsoleTable.define(table_config, :width => 100, :ellipse=>"…", :output=>@mock_out) do |table|
|
1484
|
+
table << {
|
1485
|
+
:col1 => "Row 1, Column 1",
|
1486
|
+
:col2 => "Row 1, Column 2"
|
1487
|
+
}
|
1488
|
+
|
1489
|
+
table << {
|
1490
|
+
:col1 => {text: "Row 2, Column 1", :ellipsize=>false},
|
1491
|
+
:col2 => {text: "Row 2, Column 1", :ellipsize=>false}
|
1492
|
+
}
|
1493
|
+
end
|
1494
|
+
|
1495
|
+
expected=<<-END
|
1496
|
+
=====================
|
1497
|
+
Column 1 Column 2
|
1498
|
+
---------------------
|
1499
|
+
Row 1, Co… Row 1, Co…
|
1500
|
+
Row 2, Col Row 2, Col
|
1501
|
+
=====================
|
1502
|
+
END
|
1503
|
+
|
1504
|
+
assert_output_equal expected, @mock_out.string
|
1505
|
+
end
|
1506
|
+
|
1507
|
+
def test_can_use_colorized_custom_ellipse_for_some_reason
|
1508
|
+
table_config = [
|
1509
|
+
{:key => :col1, :size => 10, :title => "Column 1", :ellipsize=>true},
|
1510
|
+
{:key => :col2, :size => 10, :title => "Column 2", :ellipsize=>true, :justify=>:right},
|
1511
|
+
]
|
1512
|
+
|
1513
|
+
ConsoleTable.define(table_config, :width => 100, :ellipse=>"…".red, :output=>@mock_out) do |table|
|
1514
|
+
table << {
|
1515
|
+
:col1 => "Row 1, Column 1",
|
1516
|
+
:col2 => "Row 1, Column 2"
|
1517
|
+
}
|
1518
|
+
|
1519
|
+
table << {
|
1520
|
+
:col1 => {text: "Row 2, Column 1", :ellipsize=>false},
|
1521
|
+
:col2 => {text: "Row 2, Column 1", :ellipsize=>false}
|
1522
|
+
}
|
1523
|
+
end
|
1524
|
+
|
1525
|
+
expected=<<-END
|
1526
|
+
=====================
|
1527
|
+
Column 1 Column 2
|
1528
|
+
---------------------
|
1529
|
+
Row 1, Co… Row 1, Co…
|
1530
|
+
Row 2, Col Row 2, Col
|
1531
|
+
=====================
|
1532
|
+
END
|
1533
|
+
|
1534
|
+
assert_includes @mock_out.string, "\e[0;31;49m…\e[0m"
|
1535
|
+
|
1536
|
+
assert_output_equal expected, @mock_out.string
|
1537
|
+
end
|
1538
|
+
|
1539
|
+
def test_can_use_extra_long_ellipse
|
1540
|
+
table_config = [
|
1541
|
+
{:key => :col1, :size => 10, :title => "Column 1", :ellipsize=>true},
|
1542
|
+
{:key => :col2, :size => 10, :title => "Column 2", :ellipsize=>true, :justify=>:right},
|
1543
|
+
]
|
1544
|
+
|
1545
|
+
ConsoleTable.define(table_config, :width => 100, :ellipse=>" (cont)", :output=>@mock_out) do |table|
|
1546
|
+
table << {
|
1547
|
+
:col1 => "Row 1, Column 1",
|
1548
|
+
:col2 => "Row 1, Column 2"
|
1549
|
+
}
|
1550
|
+
|
1551
|
+
table << {
|
1552
|
+
:col1 => {text: "Row 2, Column 1", :ellipsize=>false},
|
1553
|
+
:col2 => {text: "Row 2, Column 1", :ellipsize=>false}
|
1554
|
+
}
|
1555
|
+
end
|
1556
|
+
|
1557
|
+
expected=<<-END
|
1558
|
+
=====================
|
1559
|
+
Column 1 Column 2
|
1560
|
+
---------------------
|
1561
|
+
Row (cont) Row (cont)
|
1562
|
+
Row 2, Col Row 2, Col
|
1563
|
+
=====================
|
1564
|
+
END
|
1565
|
+
|
1566
|
+
|
1567
|
+
assert_output_equal expected, @mock_out.string
|
1568
|
+
end
|
1569
|
+
|
1570
|
+
def test_ellipse_char_too_long_for_area_is_ignored_entirely
|
1571
|
+
table_config = [
|
1572
|
+
{:key => :col1, :size => 10, :title => "Column 1", :ellipsize=>true},
|
1573
|
+
{:key => :col2, :size => 10, :title => "Column 2", :ellipsize=>true, :justify=>:right},
|
1574
|
+
]
|
1575
|
+
|
1576
|
+
ConsoleTable.define(table_config, :width => 100, :ellipse=>" (this is a long ellipse)", :output=>@mock_out) do |table|
|
1577
|
+
table << {
|
1578
|
+
:col1 => "Row 1, Column 1",
|
1579
|
+
:col2 => "Row 1, Column 2"
|
1580
|
+
}
|
1581
|
+
|
1582
|
+
table << {
|
1583
|
+
:col1 => {text: "Row 2, Column 1", :ellipsize=>false},
|
1584
|
+
:col2 => {text: "Row 2, Column 1", :ellipsize=>false}
|
1585
|
+
}
|
1586
|
+
end
|
1587
|
+
|
1588
|
+
expected=<<-END
|
1589
|
+
=====================
|
1590
|
+
Column 1 Column 2
|
1591
|
+
---------------------
|
1592
|
+
Row 1, Col Row 1, Col
|
1593
|
+
Row 2, Col Row 2, Col
|
1594
|
+
=====================
|
1595
|
+
END
|
1596
|
+
|
1597
|
+
assert_output_equal expected, @mock_out.string
|
1598
|
+
end
|
1599
|
+
|
1474
1600
|
private
|
1475
1601
|
def assert_output_equal(expected, actual)
|
1476
1602
|
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.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rod Hilton
|
@@ -111,6 +111,8 @@ files:
|
|
111
111
|
- Rakefile
|
112
112
|
- console_table.gemspec
|
113
113
|
- console_table_screenshot.png
|
114
|
+
- examples/purchases.rb
|
115
|
+
- examples/stocks.rb
|
114
116
|
- lib/console_table.rb
|
115
117
|
- test/test_console_table.rb
|
116
118
|
homepage: https://github.com/rodhilton/console_table
|