terminal-table 1.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.
- data/History.rdoc +26 -0
- data/Manifest +25 -0
- data/README.rdoc +151 -0
- data/Rakefile +15 -0
- data/Todo.rdoc +15 -0
- data/examples/examples.rb +66 -0
- data/lib/terminal-table.rb +31 -0
- data/lib/terminal-table/cell.rb +32 -0
- data/lib/terminal-table/core_ext.rb +39 -0
- data/lib/terminal-table/heading.rb +10 -0
- data/lib/terminal-table/import.rb +5 -0
- data/lib/terminal-table/table.rb +191 -0
- data/lib/terminal-table/table_helper.rb +53 -0
- data/lib/terminal-table/version.rb +6 -0
- data/spec/cell_spec.rb +19 -0
- data/spec/core_ext_spec.rb +19 -0
- data/spec/import_spec.rb +11 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/table_helper_spec.rb +18 -0
- data/spec/table_spec.rb +296 -0
- data/tasks/docs.rake +13 -0
- data/tasks/gemspec.rake +3 -0
- data/tasks/spec.rake +25 -0
- data/terminal-table.gemspec +30 -0
- metadata +95 -0
data/History.rdoc
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
=== 1.2.0 / 2009-08-06
|
3
|
+
|
4
|
+
* Added colspan support to table
|
5
|
+
|
6
|
+
=== 1.1.0 / 2009-08-06
|
7
|
+
|
8
|
+
* Added colspan support to table
|
9
|
+
|
10
|
+
=== 1.1.0 / 2009-07-13
|
11
|
+
|
12
|
+
* Added Table#==
|
13
|
+
|
14
|
+
=== 1.0.5 / 2009-03-14
|
15
|
+
|
16
|
+
* Allowing nil to be passed to table for headings
|
17
|
+
* Revised doc to show that rows can be splatted now
|
18
|
+
* Misc refactoring
|
19
|
+
|
20
|
+
=== 1.0.3 / 2009-01-15
|
21
|
+
|
22
|
+
* Moved yield or eval to Terminal::Table initialize where it belongs
|
23
|
+
|
24
|
+
=== 1.0.0 / 2009-01-13
|
25
|
+
|
26
|
+
* Initial release
|
data/Manifest
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
examples/examples.rb
|
2
|
+
History.rdoc
|
3
|
+
lib/terminal-table/cell.rb
|
4
|
+
lib/terminal-table/core_ext.rb
|
5
|
+
lib/terminal-table/heading.rb
|
6
|
+
lib/terminal-table/import.rb
|
7
|
+
lib/terminal-table/table.rb
|
8
|
+
lib/terminal-table/table_helper.rb
|
9
|
+
lib/terminal-table/version.rb
|
10
|
+
lib/terminal-table.rb
|
11
|
+
Manifest
|
12
|
+
Rakefile
|
13
|
+
README.rdoc
|
14
|
+
spec/cell_spec.rb
|
15
|
+
spec/core_ext_spec.rb
|
16
|
+
spec/import_spec.rb
|
17
|
+
spec/spec.opts
|
18
|
+
spec/spec_helper.rb
|
19
|
+
spec/table_helper_spec.rb
|
20
|
+
spec/table_spec.rb
|
21
|
+
tasks/docs.rake
|
22
|
+
tasks/gemspec.rake
|
23
|
+
tasks/spec.rake
|
24
|
+
terminal-table.gemspec
|
25
|
+
Todo.rdoc
|
data/README.rdoc
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
|
2
|
+
= Terminal Table
|
3
|
+
|
4
|
+
Simple, feature rich ASCII table generator.
|
5
|
+
|
6
|
+
== Installation:
|
7
|
+
|
8
|
+
Install [Gemcutter](http://gemcutter.org) then execute:
|
9
|
+
$ sudo gem install terminal-table
|
10
|
+
|
11
|
+
== Features:
|
12
|
+
|
13
|
+
* Fast
|
14
|
+
* Simple
|
15
|
+
* Optional headings
|
16
|
+
* Alignment of columns, headings, or cells
|
17
|
+
* Supports column span
|
18
|
+
* Easy modification of table strings (+, -, |)
|
19
|
+
|
20
|
+
== Examples:
|
21
|
+
|
22
|
+
require 'rubygems'
|
23
|
+
require 'terminal-table/import'
|
24
|
+
|
25
|
+
puts table(['a', 'b'], [1, 2], [3, 4])
|
26
|
+
|
27
|
+
t = table ['a', 'b']
|
28
|
+
t << [1, 2]
|
29
|
+
t << [3, 4]
|
30
|
+
puts t
|
31
|
+
|
32
|
+
user_table = table do |t|
|
33
|
+
t.headings = 'First Name', 'Last Name', 'Email'
|
34
|
+
t << ['TJ', 'Holowaychuk', 'tj@vision-media.ca']
|
35
|
+
t << ['Bob', 'Someone', 'bob@vision-media.ca']
|
36
|
+
t << ['Joe', 'Whatever', 'joe@vision-media.ca']
|
37
|
+
end
|
38
|
+
puts user_table
|
39
|
+
|
40
|
+
user_table = table do
|
41
|
+
self.headings = 'First Name', 'Last Name', 'Email'
|
42
|
+
add_row ['TJ', 'Holowaychuk', { :value => 'tj@vision-media.ca', :align => :right }]
|
43
|
+
add_row ['Bob', 'Someone', 'bob@vision-media.ca']
|
44
|
+
add_row ['Joe', 'Whatever', 'joe@vision-media.ca']
|
45
|
+
align_column 1, :center
|
46
|
+
end
|
47
|
+
puts user_table
|
48
|
+
|
49
|
+
puts
|
50
|
+
user_table = table do
|
51
|
+
self.headings = ['First Name', 'Last Name', {:value => 'Phones', :colspan => 2, :alignment => :center}]
|
52
|
+
add_row ['Bob', 'Someone', '123', '456']
|
53
|
+
add_row ['TJ', 'Holowaychuk', {:value => "No phones", :colspan => 2, :alignment => :center}]
|
54
|
+
add_row ['Joe', 'Whatever', '4324', '343242']
|
55
|
+
end
|
56
|
+
puts user_table
|
57
|
+
|
58
|
+
rows = []
|
59
|
+
rows << ['Lines', 100]
|
60
|
+
rows << ['Comments', 20]
|
61
|
+
rows << ['Ruby', 70]
|
62
|
+
rows << ['JavaScript', 30]
|
63
|
+
puts table([nil, 'Lines'], *rows)
|
64
|
+
|
65
|
+
rows = []
|
66
|
+
rows << ['Lines', 100]
|
67
|
+
rows << ['Comments', 20]
|
68
|
+
rows << ['Ruby', 70]
|
69
|
+
rows << ['JavaScript', 30]
|
70
|
+
puts table(nil, *rows)
|
71
|
+
|
72
|
+
== Results:
|
73
|
+
|
74
|
+
+---+---+
|
75
|
+
| a | b |
|
76
|
+
+---+---+
|
77
|
+
| 1 | 2 |
|
78
|
+
| 3 | 4 |
|
79
|
+
+---+---+
|
80
|
+
|
81
|
+
+---+---+
|
82
|
+
| a | b |
|
83
|
+
+---+---+
|
84
|
+
| 1 | 2 |
|
85
|
+
| 3 | 4 |
|
86
|
+
+---+---+
|
87
|
+
|
88
|
+
+------------+-------------+---------------------+
|
89
|
+
| First Name | Last Name | Email |
|
90
|
+
+------------+-------------+---------------------+
|
91
|
+
| TJ | Holowaychuk | tj@vision-media.ca |
|
92
|
+
| Bob | Someone | bob@vision-media.ca |
|
93
|
+
| Joe | Whatever | joe@vision-media.ca |
|
94
|
+
+------------+-------------+---------------------+
|
95
|
+
|
96
|
+
+------------+-----------------------------+---------------------+
|
97
|
+
| First Name | Last Name | Email |
|
98
|
+
+------------+-----------------------------+---------------------+
|
99
|
+
| TJ | Holowaychuk | tj@vision-media.ca |
|
100
|
+
| Bob | Someone | bob@vision-media.ca |
|
101
|
+
| Joe | Whatever | joe@vision-media.ca |
|
102
|
+
+------------+-----------------------------+---------------------+
|
103
|
+
|
104
|
+
+------------+-------------+-----------+--------+
|
105
|
+
| First Name | Last Name | Phones |
|
106
|
+
+------------+-------------+-----------+--------+
|
107
|
+
| Bob | Someone | 123 | 456 |
|
108
|
+
| TJ | Holowaychuk | No phones |
|
109
|
+
| Joe | Whatever | 4324 | 343242 |
|
110
|
+
+------------+-------------+-----------+--------+
|
111
|
+
|
112
|
+
+------------+-------+
|
113
|
+
| | Lines |
|
114
|
+
+------------+-------+
|
115
|
+
| Lines | 100 |
|
116
|
+
| Comments | 20 |
|
117
|
+
| Ruby | 70 |
|
118
|
+
| JavaScript | 30 |
|
119
|
+
+------------+-------+
|
120
|
+
|
121
|
+
+------------+-----+
|
122
|
+
| Lines | 100 |
|
123
|
+
| Comments | 20 |
|
124
|
+
| Ruby | 70 |
|
125
|
+
| JavaScript | 30 |
|
126
|
+
+------------+-----+
|
127
|
+
|
128
|
+
== License:
|
129
|
+
|
130
|
+
(The MIT License)
|
131
|
+
|
132
|
+
Copyright (c) 2008-2009 TJ Holowaychuk <tj@vision-media.ca>
|
133
|
+
|
134
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
135
|
+
a copy of this software and associated documentation files (the
|
136
|
+
'Software'), to deal in the Software without restriction, including
|
137
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
138
|
+
distribute, sublicense, an d/or sell copies of the Software, and to
|
139
|
+
permit persons to whom the Software is furnished to do so, subject to
|
140
|
+
the following conditions:
|
141
|
+
|
142
|
+
The above copyright notice and this permission notice shall be
|
143
|
+
included in all copies or substantial portions of the Software.
|
144
|
+
|
145
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
146
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
147
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
148
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
149
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
150
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
151
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake'
|
4
|
+
require 'echoe'
|
5
|
+
require './lib/terminal-table.rb'
|
6
|
+
|
7
|
+
Echoe.new("terminal-table", Terminal::Table::VERSION) do |p|
|
8
|
+
p.author = "TJ Holowaychuk"
|
9
|
+
p.email = "tj@vision-media.ca"
|
10
|
+
p.summary = "Simple, feature rich ascii table generation library"
|
11
|
+
p.url = "http://github.com/visionmedia/terminal-table"
|
12
|
+
p.runtime_dependencies = []
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir['tasks/**/*.rake'].sort.each { |lib| load lib }
|
data/Todo.rdoc
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
+
require 'terminal-table/import'
|
4
|
+
|
5
|
+
puts
|
6
|
+
puts table(['a', 'b'], [1, 2], [3, 4])
|
7
|
+
|
8
|
+
puts
|
9
|
+
t = table ['a', 'b']
|
10
|
+
t << [1, 2]
|
11
|
+
t << [3, 4]
|
12
|
+
puts t
|
13
|
+
|
14
|
+
puts
|
15
|
+
user_table = table do |t|
|
16
|
+
t.headings = 'First Name', 'Last Name', 'Email'
|
17
|
+
t << %w( TJ Holowaychuk tj@vision-media.ca )
|
18
|
+
t << %w( Bob Someone bob@vision-media.ca )
|
19
|
+
t << %w( Joe Whatever bob@vision-media.ca )
|
20
|
+
end
|
21
|
+
puts user_table
|
22
|
+
|
23
|
+
puts
|
24
|
+
user_table = table do
|
25
|
+
self.headings = 'First Name', 'Last Name', 'Email'
|
26
|
+
add_row ['TJ', 'Holowaychuk', ['tj@vision-media.ca', :right]]
|
27
|
+
add_row ['Bob', 'Someone', 'bob@vision-media.ca']
|
28
|
+
add_row ['Joe', 'Whatever', 'joe@vision-media.ca']
|
29
|
+
align_column 1, :center
|
30
|
+
end
|
31
|
+
puts user_table
|
32
|
+
|
33
|
+
puts
|
34
|
+
user_table = table do
|
35
|
+
self.headings = ['First Name', 'Last Name', {:value => 'Phones', :colspan => 2, :alignment => :center}]
|
36
|
+
add_row ['Bob', 'Someone', '123', '456']
|
37
|
+
add_row ['TJ', 'Holowaychuk', {:value => "No phones", :colspan => 2, :alignment => :center}]
|
38
|
+
add_row ['Joe', 'Whatever', '4324', '343242']
|
39
|
+
end
|
40
|
+
puts user_table
|
41
|
+
|
42
|
+
rows = []
|
43
|
+
rows << ['Lines', 100]
|
44
|
+
rows << ['Comments', 20]
|
45
|
+
rows << ['Ruby', 70]
|
46
|
+
rows << ['JavaScript', 30]
|
47
|
+
puts table([nil, 'Lines'], *rows)
|
48
|
+
|
49
|
+
rows = []
|
50
|
+
rows << ['Lines', 100]
|
51
|
+
rows << ['Comments', 20]
|
52
|
+
rows << ['Ruby', 70]
|
53
|
+
rows << ['JavaScript', 30]
|
54
|
+
puts table(nil, *rows)
|
55
|
+
|
56
|
+
|
57
|
+
Terminal::Table::X = '='
|
58
|
+
Terminal::Table::Y = '!'
|
59
|
+
Terminal::Table::I = '*'
|
60
|
+
|
61
|
+
rows = []
|
62
|
+
rows << [nil, nil, nil]
|
63
|
+
rows << [nil, ':)', nil]
|
64
|
+
rows << [nil, nil, nil]
|
65
|
+
puts table(nil, *rows)
|
66
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008-2009 TJ Holowaychuk <tj@vision-media.ca>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
$:.unshift File.dirname(__FILE__)
|
25
|
+
|
26
|
+
require 'terminal-table/version'
|
27
|
+
require 'terminal-table/core_ext'
|
28
|
+
require 'terminal-table/table'
|
29
|
+
require 'terminal-table/cell'
|
30
|
+
require 'terminal-table/heading'
|
31
|
+
require 'terminal-table/table_helper'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
module Terminal
|
3
|
+
class Table
|
4
|
+
class Cell
|
5
|
+
|
6
|
+
attr_accessor :value, :alignment, :colspan
|
7
|
+
|
8
|
+
def initialize width, params
|
9
|
+
@width = width
|
10
|
+
@alignment = :left
|
11
|
+
@colspan = 1
|
12
|
+
|
13
|
+
if params.is_a? Hash
|
14
|
+
@value = params[:value]
|
15
|
+
@alignment = params[:alignment] unless params[:alignment].nil?
|
16
|
+
@colspan = params[:colspan] unless params[:colspan].nil?
|
17
|
+
else
|
18
|
+
@value = params
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def render
|
23
|
+
" #{value.to_s} ".align alignment, @width + 2
|
24
|
+
end
|
25
|
+
alias :to_s :render
|
26
|
+
|
27
|
+
def length
|
28
|
+
@value.to_s.length + 2
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
class String
|
3
|
+
|
4
|
+
##
|
5
|
+
# Align to +position+, which may be :left, :right, or :center.
|
6
|
+
|
7
|
+
def align position, length
|
8
|
+
send position, length
|
9
|
+
end
|
10
|
+
alias_method :left, :ljust
|
11
|
+
alias_method :right, :rjust
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
module Enumerable
|
16
|
+
def map_with_index &block
|
17
|
+
result = []
|
18
|
+
each_with_index { |v, i| result << yield(v, i) }
|
19
|
+
result
|
20
|
+
end
|
21
|
+
alias :collect_with_index :map_with_index
|
22
|
+
end
|
23
|
+
|
24
|
+
class Object
|
25
|
+
|
26
|
+
##
|
27
|
+
# Yields or instance_eval's a +block+ depending on the arity of a block
|
28
|
+
# in order to support both types of block syntax for DSL's.
|
29
|
+
|
30
|
+
def yield_or_eval &block
|
31
|
+
return unless block
|
32
|
+
if block.arity > 0
|
33
|
+
yield self
|
34
|
+
else
|
35
|
+
self.instance_eval &block
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
|
2
|
+
module Terminal
|
3
|
+
|
4
|
+
##
|
5
|
+
# Generates an ASCII table for terminal usage.
|
6
|
+
#
|
7
|
+
# This class can be used in many ways, however ultimately you should
|
8
|
+
# require 'terminal-table/import' (which requires terminal-table itself) to use
|
9
|
+
# the Kernel helper method which is easier, and cleaner to use. View Object#table
|
10
|
+
# for examples.
|
11
|
+
#
|
12
|
+
# === Examples:
|
13
|
+
#
|
14
|
+
# table = Terminal::Table.new
|
15
|
+
# table.headings = ['Characters', { :value => 'Nums', :align => :right }]
|
16
|
+
# table << [{ :value => 'a', :align => :center }, 1]
|
17
|
+
# table << ['b', 222222222222222]
|
18
|
+
# table << ['c', 3]
|
19
|
+
# puts table.render # or simply puts table
|
20
|
+
#
|
21
|
+
# +------------+-----------------+
|
22
|
+
# | Characters | Nums |
|
23
|
+
# +------------+-----------------+
|
24
|
+
# | a | 1 |
|
25
|
+
# | b | 222222222222222 |
|
26
|
+
# | c | 3 |
|
27
|
+
# +------------+-----------------+
|
28
|
+
#
|
29
|
+
|
30
|
+
class Table
|
31
|
+
|
32
|
+
#--
|
33
|
+
# Exceptions
|
34
|
+
#++
|
35
|
+
|
36
|
+
class Error < StandardError; end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Table characters, x axis, y axis, and intersection.
|
40
|
+
|
41
|
+
X, Y, I = '-', '|', '+'
|
42
|
+
|
43
|
+
attr_accessor :headings, :rows
|
44
|
+
|
45
|
+
##
|
46
|
+
# Generates a ASCII table.
|
47
|
+
|
48
|
+
def initialize options = {}, &block
|
49
|
+
@headings = options.fetch :headings, []
|
50
|
+
@rows = options.fetch :rows, []
|
51
|
+
yield_or_eval &block if block_given?
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# Render the table. Often you will simply call _puts_ with an
|
56
|
+
# instance in order to output it to the terminal.
|
57
|
+
|
58
|
+
def render
|
59
|
+
buffer = seperator << "\n"
|
60
|
+
if has_headings?
|
61
|
+
buffer << Y + headings.map_with_index do |heading, i|
|
62
|
+
width = 0
|
63
|
+
if heading.is_a?(Hash) and !heading[:colspan].nil?
|
64
|
+
i.upto(i + heading[:colspan] - 1) do |col|
|
65
|
+
width += length_of_column(col)
|
66
|
+
end
|
67
|
+
width += (heading[:colspan] - 1) * (Y.length + 2)
|
68
|
+
else
|
69
|
+
width = length_of_column(i)
|
70
|
+
end
|
71
|
+
Heading.new( width, heading).render
|
72
|
+
end.join(Y) + Y
|
73
|
+
buffer << "\n#{seperator}\n"
|
74
|
+
end
|
75
|
+
buffer << rows.map do |row|
|
76
|
+
Y + row.map_with_index do |cell, i|
|
77
|
+
width = 0
|
78
|
+
if cell.is_a?(Hash) and !cell[:colspan].nil?
|
79
|
+
i.upto(i + cell[:colspan] - 1) do |col|
|
80
|
+
width += length_of_column(col)
|
81
|
+
end
|
82
|
+
width += (cell[:colspan] - 1) * (Y.length + 2)
|
83
|
+
else
|
84
|
+
width = length_of_column(i)
|
85
|
+
end
|
86
|
+
Cell.new(width, cell).render
|
87
|
+
end.join(Y) + Y
|
88
|
+
end.join("\n")
|
89
|
+
buffer << "\n#{seperator}\n"
|
90
|
+
end
|
91
|
+
alias :to_s :render
|
92
|
+
|
93
|
+
##
|
94
|
+
# Create a seperator based on colum lengths.
|
95
|
+
|
96
|
+
def seperator
|
97
|
+
I + columns.collect_with_index do |col, i|
|
98
|
+
X * (length_of_column(i) + 2)
|
99
|
+
end.join(I) + I
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# Add a row.
|
104
|
+
|
105
|
+
def add_row row
|
106
|
+
rows << row
|
107
|
+
end
|
108
|
+
alias :<< :add_row
|
109
|
+
|
110
|
+
##
|
111
|
+
# Weither or not any headings are present, since they are optional.
|
112
|
+
|
113
|
+
def has_headings?
|
114
|
+
!headings.empty?
|
115
|
+
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# Return +n+ column.
|
119
|
+
|
120
|
+
def column n
|
121
|
+
rows.map { |row| row[n] }.compact
|
122
|
+
end
|
123
|
+
|
124
|
+
##
|
125
|
+
# Return +n+ column including headings.
|
126
|
+
|
127
|
+
def column_with_headings n
|
128
|
+
headings_with_rows.map { |row| row[n] }.compact
|
129
|
+
end
|
130
|
+
|
131
|
+
##
|
132
|
+
# Return columns.
|
133
|
+
|
134
|
+
def columns
|
135
|
+
(0..number_of_columns-1).map { |n| column n }
|
136
|
+
end
|
137
|
+
|
138
|
+
##
|
139
|
+
# Return the largest cell found within column +n+.
|
140
|
+
|
141
|
+
def largest_cell_in_column n
|
142
|
+
column_with_headings(n).sort_by { |cell| Cell.new(0, cell).length }.last
|
143
|
+
end
|
144
|
+
|
145
|
+
##
|
146
|
+
# Return length of column +n+.
|
147
|
+
|
148
|
+
def length_of_column n
|
149
|
+
largest_cell = largest_cell_in_column(n)
|
150
|
+
if largest_cell.is_a? Hash
|
151
|
+
largest_cell[:value].length# - 2
|
152
|
+
else
|
153
|
+
largest_cell.to_s.length
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# Return total number of columns available.
|
159
|
+
|
160
|
+
def number_of_columns
|
161
|
+
return rows.first.length unless rows.empty?
|
162
|
+
raise Error, 'your table needs some rows.'
|
163
|
+
end
|
164
|
+
|
165
|
+
##
|
166
|
+
# Align column +n+ to +alignment+ of :center, :left, or :right.
|
167
|
+
|
168
|
+
def align_column n, alignment
|
169
|
+
column(n).each_with_index do |col, i|
|
170
|
+
@rows[i][n] = {:value => col, :alignment => alignment} unless col.is_a? Hash
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
##
|
175
|
+
# Return headings combined with rows.
|
176
|
+
|
177
|
+
def headings_with_rows
|
178
|
+
[headings] + rows
|
179
|
+
end
|
180
|
+
|
181
|
+
##
|
182
|
+
# Check if +other+ is equal to self. +other+ is considered equal
|
183
|
+
# if it contains the same headings and rows.
|
184
|
+
|
185
|
+
def == other
|
186
|
+
if other.respond_to?(:headings) && other.respond_to?(:rows)
|
187
|
+
headings == other.headings && rows == other.rows
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Terminal
|
2
|
+
class Table
|
3
|
+
module TableHelper
|
4
|
+
##
|
5
|
+
# Generates a Terminal::Table object.
|
6
|
+
#
|
7
|
+
# === Examples:
|
8
|
+
#
|
9
|
+
# puts table(['a', 'b'], [1, 2], [3, 4])
|
10
|
+
#
|
11
|
+
# # OR
|
12
|
+
#
|
13
|
+
# t = table ['a', 'b']
|
14
|
+
# t << [1, 2]
|
15
|
+
# t << [3, 4]
|
16
|
+
# puts t
|
17
|
+
#
|
18
|
+
# # OR
|
19
|
+
#
|
20
|
+
# user_table = table do |t|
|
21
|
+
# t.headings = 'First Name', 'Last Name', 'Email'
|
22
|
+
# t << ['TJ', 'Holowaychuk', 'tj@vision-media.ca']
|
23
|
+
# t << ['Bob', 'Someone', 'bob@vision-media.ca']
|
24
|
+
# t << ['Joe', 'Whatever', 'joe@vision-media.ca']
|
25
|
+
# end
|
26
|
+
# puts user_table
|
27
|
+
#
|
28
|
+
# # OR
|
29
|
+
#
|
30
|
+
# user_table = table do
|
31
|
+
# self.headings = 'First Name', 'Last Name', 'Email'
|
32
|
+
# add_row ['TJ', 'Holowaychuk', 'tj@vision-media.ca']
|
33
|
+
# add_row ['Bob', 'Someone', 'bob@vision-media.ca']
|
34
|
+
# add_row ['Joe', 'Whatever', 'joe@vision-media.ca']
|
35
|
+
# end
|
36
|
+
# puts user_table
|
37
|
+
#
|
38
|
+
# # OR
|
39
|
+
#
|
40
|
+
# rows = []
|
41
|
+
# rows << ['Lines', 100]
|
42
|
+
# rows << ['Comments', 20]
|
43
|
+
# rows << ['Ruby', 70]
|
44
|
+
# rows << ['JavaScript', 30]
|
45
|
+
# puts table(nil, *rows)
|
46
|
+
#
|
47
|
+
|
48
|
+
def table headings = [], *rows, &block
|
49
|
+
Terminal::Table.new :headings => headings.to_a, :rows => rows, &block
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/spec/cell_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
|
2
|
+
|
3
|
+
describe Terminal::Table do
|
4
|
+
|
5
|
+
Cell = Terminal::Table::Cell
|
6
|
+
|
7
|
+
it "should default alignment to the left" do
|
8
|
+
cell = Cell.new 0, 'foo'
|
9
|
+
cell.value.should == 'foo'
|
10
|
+
cell.alignment.should == :left
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should override alignment" do
|
14
|
+
cell = Cell.new 0, {:value => 'foo', :alignment => :center}
|
15
|
+
cell.value.should == 'foo'
|
16
|
+
cell.alignment.should == :center
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
|
2
|
+
|
3
|
+
describe String do
|
4
|
+
|
5
|
+
describe "#align" do
|
6
|
+
it "should center" do
|
7
|
+
'foo'.align(:center, 10).should == ' foo '
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should align left" do
|
11
|
+
'foo'.align(:left, 10).should == 'foo '
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should align right" do
|
15
|
+
'foo'.align(:right, 10).should == ' foo'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/spec/import_spec.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
|
2
|
+
require "terminal-table/import"
|
3
|
+
|
4
|
+
describe Object do
|
5
|
+
describe "#table" do
|
6
|
+
it "should allow creation of a terminal table" do
|
7
|
+
table(['foo', 'bar'], ['a', 'b'], [1, 2]).
|
8
|
+
should be_instance_of(Terminal::Table)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
|
2
|
+
|
3
|
+
module Terminal
|
4
|
+
describe Table::TableHelper do
|
5
|
+
before do
|
6
|
+
@obj = Class.new do
|
7
|
+
include Table::TableHelper
|
8
|
+
end.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#table" do
|
12
|
+
it "should allow creation of a terminal table" do
|
13
|
+
table = @obj.table(['foo', 'bar'], ['a', 'b'], [1, 2])
|
14
|
+
table.should be_instance_of(Terminal::Table)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/spec/table_spec.rb
ADDED
@@ -0,0 +1,296 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
|
2
|
+
|
3
|
+
module Terminal
|
4
|
+
describe Table do
|
5
|
+
before :each do
|
6
|
+
@table = Table.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should select columns" do
|
10
|
+
@table << ['foo', 'bar']
|
11
|
+
@table << ['big foo', 'big foo bar']
|
12
|
+
@table.column(1).should == ['bar', 'big foo bar']
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should count columns" do
|
16
|
+
@table << [1, 2, 3]
|
17
|
+
@table.number_of_columns.should == 3
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should iterate columns" do
|
21
|
+
@table << [1, 2, 3]
|
22
|
+
@table << [4, 5, 6]
|
23
|
+
@table.columns.should == [[1, 4], [2, 5], [3, 6]]
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should select columns" do
|
27
|
+
@table.headings = ['one', 'two']
|
28
|
+
@table << ['foo', 'bar']
|
29
|
+
@table << ['big foo', 'big foo bar']
|
30
|
+
@table.column(1).should == ['bar', 'big foo bar']
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should select columns when using hashes" do
|
34
|
+
@table.headings = ['one', 'two']
|
35
|
+
@table.rows = [[{ :value => 'a', :align => :left }, 1], ['b', 2], ['c', 3]]
|
36
|
+
@table.column(0).should == [{ :value => 'a', :align => :left }, 'b', 'c']
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should select largest cell in a column" do
|
40
|
+
@table << ['foo', 'bar']
|
41
|
+
@table << ['big foo', 'big foo bar']
|
42
|
+
@table.largest_cell_in_column(1).should == 'big foo bar'
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should find column length" do
|
46
|
+
@table << ['foo', 'bar', 'a']
|
47
|
+
@table << ['big foo', 'big foo bar']
|
48
|
+
@table.length_of_column(1).should == 11
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should find column length with headings" do
|
52
|
+
@table.headings = ['one', 'super long heading']
|
53
|
+
@table << ['foo', 'bar', 'a']
|
54
|
+
@table << ['big foo', 'big foo bar']
|
55
|
+
@table.length_of_column(1).should == 18
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should render seperators" do
|
59
|
+
@table.headings = ['Char', 'Num']
|
60
|
+
@table << ['a', 1]
|
61
|
+
@table.seperator.should == '+------+-----+'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should bitch and complain when you have no rows" do
|
65
|
+
lambda { @table.render }.should raise_error(Terminal::Table::Error)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should render properly" do
|
69
|
+
@table.headings = ['Char', 'Num']
|
70
|
+
@table << ['a', 1]
|
71
|
+
@table << ['b', 2]
|
72
|
+
@table << ['c', 3]
|
73
|
+
@table.render.should == <<-EOF.deindent
|
74
|
+
+------+-----+
|
75
|
+
| Char | Num |
|
76
|
+
+------+-----+
|
77
|
+
| a | 1 |
|
78
|
+
| b | 2 |
|
79
|
+
| c | 3 |
|
80
|
+
+------+-----+
|
81
|
+
EOF
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should render properly without headings" do
|
85
|
+
@table << ['a', 1]
|
86
|
+
@table << ['b', 2]
|
87
|
+
@table << ['c', 3]
|
88
|
+
@table.render.should == <<-EOF.deindent
|
89
|
+
+---+---+
|
90
|
+
| a | 1 |
|
91
|
+
| b | 2 |
|
92
|
+
| c | 3 |
|
93
|
+
+---+---+
|
94
|
+
EOF
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should render properly using block syntax" do
|
98
|
+
table = Terminal::Table.new do |t|
|
99
|
+
t << ['a', 1]
|
100
|
+
t << ['b', 2]
|
101
|
+
t << ['c', 3]
|
102
|
+
end
|
103
|
+
table.render.should == <<-EOF.deindent
|
104
|
+
+---+---+
|
105
|
+
| a | 1 |
|
106
|
+
| b | 2 |
|
107
|
+
| c | 3 |
|
108
|
+
+---+---+
|
109
|
+
EOF
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should render properly using instance_eval block syntax" do
|
113
|
+
table = Terminal::Table.new do
|
114
|
+
add_row ['a', 1]
|
115
|
+
add_row ['b', 2]
|
116
|
+
add_row ['c', 3]
|
117
|
+
end
|
118
|
+
table.render.should == <<-EOF.deindent
|
119
|
+
+---+---+
|
120
|
+
| a | 1 |
|
121
|
+
| b | 2 |
|
122
|
+
| c | 3 |
|
123
|
+
+---+---+
|
124
|
+
EOF
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should allows a hash of options for creation" do
|
128
|
+
headings = ['Char', 'Num']
|
129
|
+
rows = [['a', 1], ['b', 2], ['c', 3]]
|
130
|
+
Terminal::Table.new(:rows => rows, :headings => headings).render.should == <<-EOF.deindent
|
131
|
+
+------+-----+
|
132
|
+
| Char | Num |
|
133
|
+
+------+-----+
|
134
|
+
| a | 1 |
|
135
|
+
| b | 2 |
|
136
|
+
| c | 3 |
|
137
|
+
+------+-----+
|
138
|
+
EOF
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should flex for large cells" do
|
142
|
+
@table.headings = ['Just some characters', 'Num']
|
143
|
+
@table.rows = [['a', 1], ['b', 2], ['c', 3]]
|
144
|
+
@table.render.should == <<-EOF.deindent
|
145
|
+
+----------------------+-----+
|
146
|
+
| Just some characters | Num |
|
147
|
+
+----------------------+-----+
|
148
|
+
| a | 1 |
|
149
|
+
| b | 2 |
|
150
|
+
| c | 3 |
|
151
|
+
+----------------------+-----+
|
152
|
+
EOF
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should allow alignment of headings and cells" do
|
156
|
+
@table.headings = ['Characters', {:value => 'Nums', :alignment => :right} ]
|
157
|
+
@table << [{:value => 'a', :alignment => :center}, 1]
|
158
|
+
@table << ['b', 222222222222222]
|
159
|
+
@table << ['c', 3]
|
160
|
+
@table.render.should == <<-EOF.deindent
|
161
|
+
+------------+-----------------+
|
162
|
+
| Characters | Nums |
|
163
|
+
+------------+-----------------+
|
164
|
+
| a | 1 |
|
165
|
+
| b | 222222222222222 |
|
166
|
+
| c | 3 |
|
167
|
+
+------------+-----------------+
|
168
|
+
EOF
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should align columns, but allow specifics to remain" do
|
173
|
+
@table.headings = ['Just some characters', 'Num']
|
174
|
+
@table.rows = [[{:value => 'a', :alignment => :left}, 1], ['b', 2], ['c', 3]]
|
175
|
+
@table.align_column 0, :center
|
176
|
+
@table.align_column 1, :right
|
177
|
+
@table.render.should == <<-EOF.deindent
|
178
|
+
+----------------------+-----+
|
179
|
+
| Just some characters | Num |
|
180
|
+
+----------------------+-----+
|
181
|
+
| a | 1 |
|
182
|
+
| b | 2 |
|
183
|
+
| c | 3 |
|
184
|
+
+----------------------+-----+
|
185
|
+
EOF
|
186
|
+
end
|
187
|
+
|
188
|
+
describe "#==" do
|
189
|
+
it "should be equal to itself" do
|
190
|
+
t = Table.new
|
191
|
+
t.should == t
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should be equal with two empty tables" do
|
195
|
+
table_one = Table.new
|
196
|
+
table_two = Table.new
|
197
|
+
|
198
|
+
table_one.should == table_two
|
199
|
+
table_two.should == table_one
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should not be equal with different headings" do
|
203
|
+
table_one = Table.new
|
204
|
+
table_two = Table.new
|
205
|
+
|
206
|
+
table_one.headings << "a"
|
207
|
+
|
208
|
+
table_one.should_not == table_two
|
209
|
+
table_two.should_not == table_one
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should not be equal with different rows" do
|
213
|
+
table_one = Table.new
|
214
|
+
table_two = Table.new
|
215
|
+
|
216
|
+
table_one.rows << "a"
|
217
|
+
|
218
|
+
table_one.should_not == table_two
|
219
|
+
table_two.should_not == table_one
|
220
|
+
end
|
221
|
+
|
222
|
+
it "should not be equal if the other object does not respond_to? :headings" do
|
223
|
+
table_one = Table.new
|
224
|
+
table_two = Object.new
|
225
|
+
table_two.stub!(:rows).and_return([])
|
226
|
+
table_one.should_not == table_two
|
227
|
+
end
|
228
|
+
|
229
|
+
it "should not be equal if the other object does not respond_to? :rows" do
|
230
|
+
table_one = Table.new
|
231
|
+
table_two = Object.new
|
232
|
+
table_two.stub!(:rows).and_return([])
|
233
|
+
table_one.should_not == table_two
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should handle colspan inside heading" do
|
238
|
+
@table.headings = ['one', { :value => 'two', :alignment => :center, :colspan => 2}]
|
239
|
+
@table.rows = [['a', 1, 2], ['b', 3, 4], ['c', 3, 4]]
|
240
|
+
@table.render.should == <<-EOF.deindent
|
241
|
+
+-----+-----+---+
|
242
|
+
| one | two |
|
243
|
+
+-----+-----+---+
|
244
|
+
| a | 1 | 2 |
|
245
|
+
| b | 3 | 4 |
|
246
|
+
| c | 3 | 4 |
|
247
|
+
+-----+-----+---+
|
248
|
+
EOF
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should handle colspan inside cells" do
|
252
|
+
@table.headings = ['one', 'two', 'three']
|
253
|
+
@table.rows = [['a', 1, 2], ['b', 3, 4], ['c', {:value => "joined", :colspan => 2,:alignment => :center}]]
|
254
|
+
@table.render.should == <<-EOF.deindent
|
255
|
+
+-----+--------+-------+
|
256
|
+
| one | two | three |
|
257
|
+
+-----+--------+-------+
|
258
|
+
| a | 1 | 2 |
|
259
|
+
| b | 3 | 4 |
|
260
|
+
| c | joined |
|
261
|
+
+-----+--------+-------+
|
262
|
+
EOF
|
263
|
+
end
|
264
|
+
|
265
|
+
|
266
|
+
it "should handle colspan 1" do
|
267
|
+
@table.headings = ['name', { :value => 'values', :colspan => 1}]
|
268
|
+
@table.rows = [['a', 1], ['b', 4], ['c', 7]]
|
269
|
+
@table.render.should == <<-EOF.deindent
|
270
|
+
+------+--------+
|
271
|
+
| name | values |
|
272
|
+
+------+--------+
|
273
|
+
| a | 1 |
|
274
|
+
| b | 4 |
|
275
|
+
| c | 7 |
|
276
|
+
+------+--------+
|
277
|
+
EOF
|
278
|
+
end
|
279
|
+
|
280
|
+
it "should handle big colspan" do
|
281
|
+
@table.headings = ['name', { :value => 'values', :alignment => :right, :colspan => 3}]
|
282
|
+
@table.headings = ['name', { :value => 'values', :colspan => 3}]
|
283
|
+
@table.rows = [['a', 1, 2, 3], ['b', 4, 5, 6], ['c', 7, 8, 9]]
|
284
|
+
|
285
|
+
@table.render.should == <<-EOF.deindent
|
286
|
+
+------+--------+---+---+
|
287
|
+
| name | values |
|
288
|
+
+------+--------+---+---+
|
289
|
+
| a | 1 | 2 | 3 |
|
290
|
+
| b | 4 | 5 | 6 |
|
291
|
+
| c | 7 | 8 | 9 |
|
292
|
+
+------+--------+---+---+
|
293
|
+
EOF
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
data/tasks/docs.rake
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
namespace :docs do
|
3
|
+
|
4
|
+
desc 'Remove rdoc products'
|
5
|
+
task :remove => [:clobber_docs]
|
6
|
+
|
7
|
+
desc 'Build docs, and open in browser for viewing (specify BROWSER)'
|
8
|
+
task :open => [:docs] do
|
9
|
+
browser = ENV["BROWSER"] || "safari"
|
10
|
+
sh "open -a #{browser} doc/index.html"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
data/tasks/gemspec.rake
ADDED
data/tasks/spec.rake
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
desc "Run all specifications"
|
5
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
6
|
+
t.libs << "lib"
|
7
|
+
t.spec_opts = ["--color", "--require", "spec/spec_helper.rb"]
|
8
|
+
end
|
9
|
+
|
10
|
+
namespace :spec do
|
11
|
+
|
12
|
+
desc "Run all specifications verbosely"
|
13
|
+
Spec::Rake::SpecTask.new(:verbose) do |t|
|
14
|
+
t.libs << "lib"
|
15
|
+
t.spec_opts = ["--color", "--format", "specdoc", "--require", "spec/spec_helper.rb"]
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Run specific specification verbosely (specify SPEC)"
|
19
|
+
Spec::Rake::SpecTask.new(:select) do |t|
|
20
|
+
t.libs << "lib"
|
21
|
+
t.spec_files = [ENV["SPEC"]]
|
22
|
+
t.spec_opts = ["--color", "--format", "specdoc", "--require", "spec/spec_helper.rb"]
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{terminal-table}
|
5
|
+
s.version = "1.2.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["TJ Holowaychuk"]
|
9
|
+
s.date = %q{2009-10-10}
|
10
|
+
s.description = %q{Simple, feature rich ascii table generation library}
|
11
|
+
s.email = %q{tj@vision-media.ca}
|
12
|
+
s.extra_rdoc_files = ["lib/terminal-table/cell.rb", "lib/terminal-table/core_ext.rb", "lib/terminal-table/heading.rb", "lib/terminal-table/import.rb", "lib/terminal-table/table.rb", "lib/terminal-table/table_helper.rb", "lib/terminal-table/version.rb", "lib/terminal-table.rb", "README.rdoc", "tasks/docs.rake", "tasks/gemspec.rake", "tasks/spec.rake"]
|
13
|
+
s.files = ["examples/examples.rb", "History.rdoc", "lib/terminal-table/cell.rb", "lib/terminal-table/core_ext.rb", "lib/terminal-table/heading.rb", "lib/terminal-table/import.rb", "lib/terminal-table/table.rb", "lib/terminal-table/table_helper.rb", "lib/terminal-table/version.rb", "lib/terminal-table.rb", "Manifest", "Rakefile", "README.rdoc", "spec/cell_spec.rb", "spec/core_ext_spec.rb", "spec/import_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/table_helper_spec.rb", "spec/table_spec.rb", "tasks/docs.rake", "tasks/gemspec.rake", "tasks/spec.rake", "terminal-table.gemspec", "Todo.rdoc"]
|
14
|
+
s.homepage = %q{http://github.com/visionmedia/terminal-table}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Terminal-table", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{terminal-table}
|
18
|
+
s.rubygems_version = %q{1.3.5}
|
19
|
+
s.summary = %q{Simple, feature rich ascii table generation library}
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
26
|
+
else
|
27
|
+
end
|
28
|
+
else
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: terminal-table
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- TJ Holowaychuk
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-10 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Simple, feature rich ascii table generation library
|
17
|
+
email: tj@vision-media.ca
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- lib/terminal-table/cell.rb
|
24
|
+
- lib/terminal-table/core_ext.rb
|
25
|
+
- lib/terminal-table/heading.rb
|
26
|
+
- lib/terminal-table/import.rb
|
27
|
+
- lib/terminal-table/table.rb
|
28
|
+
- lib/terminal-table/table_helper.rb
|
29
|
+
- lib/terminal-table/version.rb
|
30
|
+
- lib/terminal-table.rb
|
31
|
+
- README.rdoc
|
32
|
+
- tasks/docs.rake
|
33
|
+
- tasks/gemspec.rake
|
34
|
+
- tasks/spec.rake
|
35
|
+
files:
|
36
|
+
- examples/examples.rb
|
37
|
+
- History.rdoc
|
38
|
+
- lib/terminal-table/cell.rb
|
39
|
+
- lib/terminal-table/core_ext.rb
|
40
|
+
- lib/terminal-table/heading.rb
|
41
|
+
- lib/terminal-table/import.rb
|
42
|
+
- lib/terminal-table/table.rb
|
43
|
+
- lib/terminal-table/table_helper.rb
|
44
|
+
- lib/terminal-table/version.rb
|
45
|
+
- lib/terminal-table.rb
|
46
|
+
- Manifest
|
47
|
+
- Rakefile
|
48
|
+
- README.rdoc
|
49
|
+
- spec/cell_spec.rb
|
50
|
+
- spec/core_ext_spec.rb
|
51
|
+
- spec/import_spec.rb
|
52
|
+
- spec/spec.opts
|
53
|
+
- spec/spec_helper.rb
|
54
|
+
- spec/table_helper_spec.rb
|
55
|
+
- spec/table_spec.rb
|
56
|
+
- tasks/docs.rake
|
57
|
+
- tasks/gemspec.rake
|
58
|
+
- tasks/spec.rake
|
59
|
+
- terminal-table.gemspec
|
60
|
+
- Todo.rdoc
|
61
|
+
has_rdoc: true
|
62
|
+
homepage: http://github.com/visionmedia/terminal-table
|
63
|
+
licenses: []
|
64
|
+
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options:
|
67
|
+
- --line-numbers
|
68
|
+
- --inline-source
|
69
|
+
- --title
|
70
|
+
- Terminal-table
|
71
|
+
- --main
|
72
|
+
- README.rdoc
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
version:
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: "1.2"
|
86
|
+
version:
|
87
|
+
requirements: []
|
88
|
+
|
89
|
+
rubyforge_project: terminal-table
|
90
|
+
rubygems_version: 1.3.5
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: Simple, feature rich ascii table generation library
|
94
|
+
test_files: []
|
95
|
+
|