terminal-table 1.8.0 → 3.0.1

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.
@@ -7,9 +7,10 @@ module Terminal
7
7
  attr_reader :headings
8
8
 
9
9
  ##
10
- # Generates a ASCII table with the given _options_.
10
+ # Generates a ASCII/Unicode table with the given _options_.
11
11
 
12
12
  def initialize options = {}, &block
13
+ @elaborated = false
13
14
  @headings = []
14
15
  @rows = []
15
16
  @column_widths = []
@@ -29,6 +30,7 @@ module Terminal
29
30
  r = rows
30
31
  column(n).each_with_index do |col, i|
31
32
  cell = r[i][n]
33
+ next unless cell
32
34
  cell.alignment = alignment unless cell.alignment?
33
35
  end
34
36
  end
@@ -46,12 +48,12 @@ module Terminal
46
48
  ##
47
49
  # Add a separator.
48
50
 
49
- def add_separator
50
- self << :separator
51
+ def add_separator(border_type: :div)
52
+ @rows << Separator.new(self, border_type: border_type)
51
53
  end
52
54
 
53
55
  def cell_spacing
54
- cell_padding + style.border_y.length
56
+ cell_padding + style.border_y_width
55
57
  end
56
58
 
57
59
  def cell_padding
@@ -118,28 +120,57 @@ module Terminal
118
120
  end
119
121
 
120
122
  ##
121
- # Render the table.
123
+ # Elaborate rows to form an Array of Rows and Separators with adjacency properties added.
124
+ #
125
+ # This is separated from the String rendering so that certain features may be tweaked
126
+ # before the String is built.
122
127
 
123
- def render
124
- separator = Separator.new(self)
125
- buffer = style.border_top ? [separator] : []
128
+ def elaborate_rows
129
+
130
+ buffer = style.border_top ? [Separator.new(self, border_type: :top, implicit: true)] : []
126
131
  unless @title.nil?
127
132
  buffer << Row.new(self, [title_cell_options])
128
- buffer << separator
133
+ buffer << Separator.new(self, implicit: true)
129
134
  end
130
135
  @headings.each do |row|
131
136
  unless row.cells.empty?
132
137
  buffer << row
133
- buffer << separator
138
+ buffer << Separator.new(self, border_type: :double, implicit: true)
134
139
  end
135
140
  end
136
141
  if style.all_separators
137
- buffer += @rows.product([separator]).flatten
142
+ @rows.each_with_index do |row, idx|
143
+ # last separator is bottom, others are :div
144
+ border_type = (idx == @rows.size - 1) ? :bot : :div
145
+ buffer << row
146
+ buffer << Separator.new(self, border_type: border_type, implicit: true)
147
+ end
138
148
  else
139
149
  buffer += @rows
140
- buffer << separator if style.border_bottom
150
+ buffer << Separator.new(self, border_type: :bot, implicit: true) if style.border_bottom
151
+ end
152
+
153
+ # After all implicit Separators are inserted we need to save off the
154
+ # adjacent rows so that we can decide what type of intersections to use
155
+ # based on column spans in the adjacent row(s).
156
+ buffer.each_with_index do |r, idx|
157
+ if r.is_a?(Separator)
158
+ prev_row = idx > 0 ? buffer[idx - 1] : nil
159
+ next_row = buffer.fetch(idx + 1, nil)
160
+ r.save_adjacent_rows(prev_row, next_row)
161
+ end
141
162
  end
142
- buffer.map { |r| style.margin_left + r.render.rstrip }.join("\n")
163
+
164
+ @elaborated = true
165
+ @rows = buffer
166
+ end
167
+
168
+ ##
169
+ # Render the table.
170
+
171
+ def render
172
+ elaborate_rows unless @elaborated
173
+ @rows.map { |r| style.margin_left + r.render.rstrip }.join("\n")
143
174
  end
144
175
  alias :to_s :render
145
176
 
@@ -181,7 +212,7 @@ module Terminal
181
212
  private
182
213
 
183
214
  def columns_width
184
- column_widths.inject(0) { |s, i| s + i + cell_spacing } + style.border_y.length
215
+ column_widths.inject(0) { |s, i| s + i + cell_spacing } + style.border_y_width
185
216
  end
186
217
 
187
218
  def recalc_column_widths
@@ -300,7 +331,7 @@ module Terminal
300
331
 
301
332
  full_width = dp[n_cols][0].keys.first
302
333
  unless style.width.nil?
303
- new_width = style.width - space_width - style.border_y.length
334
+ new_width = style.width - space_width - style.border_y_width
304
335
  if new_width < full_width
305
336
  raise "Table width exceeds wanted width " +
306
337
  "of #{style.width} characters."
@@ -0,0 +1,13 @@
1
+ module Terminal
2
+ class Table
3
+ module Util
4
+ # removes all ANSI escape sequences (e.g. color)
5
+ def ansi_escape(line)
6
+ line.to_s.gsub(/\x1b(\[|\(|\))[;?0-9]*[0-9A-Za-z]/, '').
7
+ gsub(/\x1b(\[|\(|\))[;?0-9]*[0-9A-Za-z]/, '').
8
+ gsub(/(\x03|\x1a)/, '')
9
+ end
10
+ module_function :ansi_escape
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  module Terminal
2
2
  class Table
3
- VERSION = '1.8.0'
3
+ VERSION = '3.0.1'
4
4
  end
5
5
  end
@@ -16,11 +16,11 @@ Gem::Specification.new do |spec|
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  spec.require_paths = ["lib"]
18
18
 
19
- spec.add_development_dependency "bundler", "~> 1.10"
20
- spec.add_development_dependency "rake", "~> 10.0"
19
+ spec.add_development_dependency "bundler", "~> 2"
20
+ spec.add_development_dependency "rake", "~> 13.0"
21
21
  spec.add_development_dependency "rspec", ">= 3.0"
22
22
  spec.add_development_dependency "term-ansicolor"
23
23
  spec.add_development_dependency "pry"
24
24
 
25
- spec.add_runtime_dependency "unicode-display_width", ["~> 1.1", ">= 1.1.1"]
25
+ spec.add_runtime_dependency "unicode-display_width", [">= 1.1.1", "< 3"]
26
26
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terminal-table
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - TJ Holowaychuk
8
8
  - Scott J. Goldman
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-05-17 00:00:00.000000000 Z
12
+ date: 2021-05-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -17,28 +17,28 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.10'
20
+ version: '2'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '1.10'
27
+ version: '2'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '10.0'
34
+ version: '13.0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '10.0'
41
+ version: '13.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -85,38 +85,48 @@ dependencies:
85
85
  name: unicode-display_width
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - "~>"
89
- - !ruby/object:Gem::Version
90
- version: '1.1'
91
88
  - - ">="
92
89
  - !ruby/object:Gem::Version
93
90
  version: 1.1.1
91
+ - - "<"
92
+ - !ruby/object:Gem::Version
93
+ version: '3'
94
94
  type: :runtime
95
95
  prerelease: false
96
96
  version_requirements: !ruby/object:Gem::Requirement
97
97
  requirements:
98
- - - "~>"
99
- - !ruby/object:Gem::Version
100
- version: '1.1'
101
98
  - - ">="
102
99
  - !ruby/object:Gem::Version
103
100
  version: 1.1.1
104
- description:
101
+ - - "<"
102
+ - !ruby/object:Gem::Version
103
+ version: '3'
104
+ description:
105
105
  email:
106
106
  - tj@vision-media.ca
107
107
  executables: []
108
108
  extensions: []
109
109
  extra_rdoc_files: []
110
110
  files:
111
+ - ".github/workflows/ci.yml"
111
112
  - ".gitignore"
112
113
  - Gemfile
114
+ - Gemfile.lock
113
115
  - History.rdoc
114
116
  - LICENSE.txt
115
117
  - Manifest
116
- - README.rdoc
118
+ - README.md
117
119
  - Rakefile
118
120
  - Todo.rdoc
121
+ - examples/data.csv
119
122
  - examples/examples.rb
123
+ - examples/examples_unicode.rb
124
+ - examples/issue100.rb
125
+ - examples/issue111.rb
126
+ - examples/issue118.rb
127
+ - examples/issue95.rb
128
+ - examples/show_csv_table.rb
129
+ - examples/strong_separator.rb
120
130
  - lib/terminal-table.rb
121
131
  - lib/terminal-table/cell.rb
122
132
  - lib/terminal-table/import.rb
@@ -125,13 +135,14 @@ files:
125
135
  - lib/terminal-table/style.rb
126
136
  - lib/terminal-table/table.rb
127
137
  - lib/terminal-table/table_helper.rb
138
+ - lib/terminal-table/util.rb
128
139
  - lib/terminal-table/version.rb
129
140
  - terminal-table.gemspec
130
141
  homepage: https://github.com/tj/terminal-table
131
142
  licenses:
132
143
  - MIT
133
144
  metadata: {}
134
- post_install_message:
145
+ post_install_message:
135
146
  rdoc_options: []
136
147
  require_paths:
137
148
  - lib
@@ -146,9 +157,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
157
  - !ruby/object:Gem::Version
147
158
  version: '0'
148
159
  requirements: []
149
- rubyforge_project:
150
- rubygems_version: 2.6.11
151
- signing_key:
160
+ rubygems_version: 3.2.3
161
+ signing_key:
152
162
  specification_version: 4
153
163
  summary: Simple, feature rich ascii table generation library
154
164
  test_files: []
data/README.rdoc DELETED
@@ -1,247 +0,0 @@
1
- = Terminal Table
2
-
3
- == Description
4
-
5
- Terminal Table is a fast and simple, yet feature rich ASCII table generator written in Ruby.
6
-
7
- == Installation
8
-
9
- $ gem install terminal-table
10
-
11
- == Usage
12
-
13
- === Basics
14
-
15
- To use Terminal Table:
16
-
17
- require 'terminal-table'
18
-
19
- To generate a table, provide an array of arrays (which are interpreted as rows):
20
-
21
- rows = []
22
- rows << ['One', 1]
23
- rows << ['Two', 2]
24
- rows << ['Three', 3]
25
- table = Terminal::Table.new :rows => rows
26
-
27
- # > puts table
28
- #
29
- # +-------+---+
30
- # | One | 1 |
31
- # | Two | 2 |
32
- # | Three | 3 |
33
- # +-------+---+
34
-
35
-
36
- The constructor can also be given a block which is either yielded the Table object or instance evaluated:
37
-
38
- table = Terminal::Table.new do |t|
39
- t.rows = rows
40
- end
41
-
42
- table = Terminal::Table.new do
43
- self.rows = rows
44
- end
45
-
46
- Adding rows one by one:
47
-
48
- table = Terminal::Table.new do |t|
49
- t << ['One', 1]
50
- t.add_row ['Two', 2]
51
- end
52
-
53
- To add separators between rows:
54
-
55
- table = Terminal::Table.new do |t|
56
- t << ['One', 1]
57
- t << :separator
58
- t.add_row ['Two', 2]
59
- t.add_separator
60
- t.add_row ['Three', 3]
61
- end
62
-
63
- # > puts table
64
- #
65
- # +-------+---+
66
- # | One | 1 |
67
- # +-------+---+
68
- # | Two | 2 |
69
- # +-------+---+
70
- # | Three | 3 |
71
- # +-------+---+
72
-
73
- Cells can handle multiline content:
74
-
75
- table = Terminal::Table.new do |t|
76
- t << ['One', 1]
77
- t << :separator
78
- t.add_row ["Two\nDouble", 2]
79
- t.add_separator
80
- t.add_row ['Three', 3]
81
- end
82
-
83
- # > puts table
84
- #
85
- # +--------+---+
86
- # | One | 1 |
87
- # +--------+---+
88
- # | Two | 2 |
89
- # | Double | |
90
- # +--------+---+
91
- # | Three | 3 |
92
- # +--------+---+
93
-
94
- === Head
95
-
96
- To add a head to the table:
97
-
98
- table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows
99
-
100
- # > puts table
101
- #
102
- # +-------+--------+
103
- # | Word | Number |
104
- # +-------+--------+
105
- # | One | 1 |
106
- # | Two | 2 |
107
- # | Three | 3 |
108
- # +-------+--------+
109
-
110
- === Title
111
-
112
- To add a title to the table:
113
-
114
- table = Terminal::Table.new :title => "Cheatsheet", :headings => ['Word', 'Number'], :rows => rows
115
-
116
- # > puts table
117
- #
118
- # +------------+--------+
119
- # | Cheatsheet |
120
- # +------------+--------+
121
- # | Word | Number |
122
- # +------------+--------+
123
- # | One | 1 |
124
- # | Two | 2 |
125
- # | Three | 3 |
126
- # +------------+--------+
127
-
128
- === Alignment
129
-
130
- To align the second column to the right:
131
-
132
- table.align_column(1, :right)
133
-
134
- # > puts table
135
- #
136
- # +-------+--------+
137
- # | Word | Number |
138
- # +-------+--------+
139
- # | One | 1 |
140
- # | Two | 2 |
141
- # | Three | 3 |
142
- # +-------+--------+
143
-
144
- To align an individual cell, you specify the cell value in a hash along the alignment:
145
-
146
- table << ["Four", {:value => 4.0, :alignment => :center}]
147
-
148
- # > puts table
149
- #
150
- # +-------+--------+
151
- # | Word | Number |
152
- # +-------+--------+
153
- # | One | 1 |
154
- # | Two | 2 |
155
- # | Three | 3 |
156
- # | Four | 4.0 |
157
- # +-------+--------+
158
-
159
- === Style
160
-
161
- To specify style options:
162
-
163
- table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows, :style => {:width => 80}
164
-
165
- # > puts table
166
- #
167
- # +--------------------------------------+---------------------------------------+
168
- # | Word | Number |
169
- # +--------------------------------------+---------------------------------------+
170
- # | One | 1 |
171
- # | Two | 2 |
172
- # | Three | 3 |
173
- # +--------------------------------------+---------------------------------------+
174
-
175
- And change styles on the fly:
176
-
177
- table.style = {:width => 40, :padding_left => 3, :border_x => "=", :border_i => "x"}
178
-
179
- # > puts table
180
- #
181
- # x====================x=================x
182
- # | Cheatsheet |
183
- # x====================x=================x
184
- # | Word | Number |
185
- # x====================x=================x
186
- # | One | 1 |
187
- # | Two | 2 |
188
- # | Three | 3 |
189
- # x====================x=================x
190
-
191
- You can also use styles to add a separator after every row:
192
-
193
- table = Terminal::Table.new do |t|
194
- t.add_row [1, 'One']
195
- t.add_row [2, 'Two']
196
- t.add_row [3, 'Three']
197
- t.style = {:all_separators => true}
198
- end
199
-
200
- # > puts table
201
- #
202
- # +---+-------+
203
- # | 1 | One |
204
- # +---+-------+
205
- # | 2 | Two |
206
- # +---+-------+
207
- # | 3 | Three |
208
- # +---+-------+
209
-
210
- You can also use styles to disable top and bottom borders of the table
211
-
212
- table = Terminal::Table.new do |t|
213
- t.headings = ['id', 'name']
214
- t.rows = [[1, 'One'], [2, 'Two'], [3, 'Three']]
215
- t.style = { :border_top => false, :border_bottom => false }
216
- end
217
-
218
- # > puts table
219
- # | id | name |
220
- # +----+-------+
221
- # | 1 | One |
222
- # | 2 | Two |
223
- # | 3 | Three |
224
-
225
- To change the default style options:
226
-
227
- Terminal::Table::Style.defaults = {:width => 80}
228
-
229
- All Table objects created afterwards will inherit these defaults.
230
-
231
- === Constructor options and setter methods
232
-
233
- Valid options for the constructor are :rows, :headings, :style and :title - and all options can also be set on the created table object by their setter method:
234
-
235
- table = Terminal::Table.new
236
- table.title = "Cheatsheet"
237
- table.headings = ['Word', 'Number']
238
- table.rows = rows
239
- table.style = {:width => 40}
240
-
241
- == More examples
242
-
243
- For more examples, please see the examples/examples.rb file included in the source distribution.
244
-
245
- == Author
246
-
247
- TJ Holowaychuk <tj@vision-media.ca>