terminal-table 1.7.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cfb17272e7d15b11623d2e7db0b5ee5cece62345
4
- data.tar.gz: 01f29016e517f64038ef5da9428cbcdb59a9e192
2
+ SHA256:
3
+ metadata.gz: 9e955f9096ab89f2568bd233c53dcb58d38172fceff26123d1ff60a8af951e71
4
+ data.tar.gz: 5c46d6e5cdeb4d233901374a5a5671768731e01ba246ee87ebc04788ea48de11
5
5
  SHA512:
6
- metadata.gz: a924d05a9e389acf1e7b5a7eeb6bbc706ae7ca5742d0fb94380dfbadc6de281eb5a8fe81e831379be7201bdde49cbb3d598cc446ce26a830ae3f71b54998cf07
7
- data.tar.gz: 9e1d3a3cb750e9074679cfe06bdbd08271a11c64c0783a9847853edbacc622322cc7df499a1afd8849f79173e04ff7955e258aa19079795f6afaffb22d81d291
6
+ metadata.gz: d11bc2fbcfec5b822035e97b0c6e2e5393c06b54770b53dd0067f7120fd55a2382f9027186bd0ac2633c926788347df794a0672cdfd476c14754e310f2d1608b
7
+ data.tar.gz: 7f69a5f7c6282defa0e2d9aebec91ab549a6d577520d8cc2d1d32116831234e36d9def50ee9d5995c900e0c8a82057f2a13e943164f259e85d09e7797008c599
@@ -0,0 +1,28 @@
1
+ name: CI
2
+ on: [push]
3
+
4
+ jobs:
5
+ test:
6
+ if: "!contains(github.event.head_commit.message, 'ci skip')"
7
+
8
+ continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
9
+
10
+ strategy:
11
+ fail-fast: false
12
+
13
+ matrix:
14
+ os: [ubuntu]
15
+ ruby: [2.4, 2.5, 2.6, 2.7]
16
+
17
+ runs-on: ${{ matrix.os }}-latest
18
+
19
+ steps:
20
+ - uses: actions/checkout@v2
21
+
22
+ - uses: ruby/setup-ruby@v1
23
+ with:
24
+ bundler-cache: true
25
+ ruby-version: ${{ matrix.ruby }}
26
+
27
+ - run: bundle install
28
+ - run: bundle exec rspec
data/.gitignore CHANGED
@@ -3,4 +3,5 @@ pkg
3
3
  tmp
4
4
  *.cache
5
5
  doc
6
- Gemfile.lock
6
+ vendor
7
+ /.bundle
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in test-gem.gemspec
4
4
  gemspec
5
+
6
+ gem 'tins', '~> 1.0.0' # Ruby 1.9 compat
@@ -0,0 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ terminal-table (2.0.0)
5
+ unicode-display_width (~> 1.1, >= 1.1.1)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ coderay (1.1.3)
11
+ diff-lcs (1.4.4)
12
+ method_source (1.0.0)
13
+ pry (0.13.1)
14
+ coderay (~> 1.1)
15
+ method_source (~> 1.0)
16
+ rake (13.0.1)
17
+ rspec (3.9.0)
18
+ rspec-core (~> 3.9.0)
19
+ rspec-expectations (~> 3.9.0)
20
+ rspec-mocks (~> 3.9.0)
21
+ rspec-core (3.9.3)
22
+ rspec-support (~> 3.9.3)
23
+ rspec-expectations (3.9.3)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.9.0)
26
+ rspec-mocks (3.9.1)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.9.0)
29
+ rspec-support (3.9.4)
30
+ term-ansicolor (1.7.1)
31
+ tins (~> 1.0)
32
+ tins (1.0.1)
33
+ unicode-display_width (1.7.0)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ bundler (~> 2)
40
+ pry
41
+ rake (~> 13.0)
42
+ rspec (>= 3.0)
43
+ term-ansicolor
44
+ terminal-table!
45
+ tins (~> 1.0.0)
46
+
47
+ BUNDLED WITH
48
+ 2.1.4
@@ -1,3 +1,36 @@
1
+ 2.0.0 / 2020-10-28
2
+ ==================
3
+
4
+ - Drops official support for Ruby 1.9.x with and of life on 2015-02-23
5
+ - Drops official support for Ruby 2.0.x with and of life on 2016-02-24
6
+ - Drops official support for Ruby 2.1.x with and of life on 2017-03-31
7
+ - Drops official support for Ruby 2.2.x with and of life on 2018-03-31
8
+ - Drops official support for Ruby 2.3.x with and of life on 2019-03-31
9
+
10
+ 1.8.0 / 2017-05-16
11
+ ==================
12
+
13
+ * Top and bottom borders can be disabled (@kubakrzempek, #83)
14
+ * `unicode-display-width` dependency relaxes (@mvz, #88)
15
+
16
+ * Readme and docs fixes (@loualrid, #82 and @leoarnold, #86)
17
+ * Fixed some test-related warnings (@juanitofatas, #81 and @mvz, #89)
18
+
19
+ 1.7.3 / 2016-09-21
20
+ ==================
21
+
22
+ * Fixed compatibility issues for Ruby 1.9, 2.0, 2.1. (@vivekbisen, #80)
23
+
24
+ 1.7.2 / 2016-09-09
25
+ ==================
26
+
27
+ * Fix packing table to a minimal width (@vizv, #76)
28
+
29
+ 1.7.1 / 2016-08-29
30
+ ==================
31
+
32
+ * Update `unicode-display_width` to fix behavior with signal traps [#78, @jrmhaig]
33
+
1
34
  1.7.0 / 2016-08-29
2
35
  ==================
3
36
 
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2008-2017 TJ Holowaychuk <tj@vision-media.ca>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -1,3 +1,5 @@
1
+ {<img src="https://github.com/tj/terminal-table/workflows/CI/badge.svg" />}[https://github.com/tj/terminal-table/actions]
2
+
1
3
  = Terminal Table
2
4
 
3
5
  == Description
@@ -23,7 +25,7 @@ To generate a table, provide an array of arrays (which are interpreted as rows):
23
25
  rows << ['Two', 2]
24
26
  rows << ['Three', 3]
25
27
  table = Terminal::Table.new :rows => rows
26
-
28
+
27
29
  # > puts table
28
30
  #
29
31
  # +-------+---+
@@ -51,7 +53,7 @@ Adding rows one by one:
51
53
  end
52
54
 
53
55
  To add separators between rows:
54
-
56
+
55
57
  table = Terminal::Table.new do |t|
56
58
  t << ['One', 1]
57
59
  t << :separator
@@ -59,7 +61,7 @@ To add separators between rows:
59
61
  t.add_separator
60
62
  t.add_row ['Three', 3]
61
63
  end
62
-
64
+
63
65
  # > puts table
64
66
  #
65
67
  # +-------+---+
@@ -71,7 +73,7 @@ To add separators between rows:
71
73
  # +-------+---+
72
74
 
73
75
  Cells can handle multiline content:
74
-
76
+
75
77
  table = Terminal::Table.new do |t|
76
78
  t << ['One', 1]
77
79
  t << :separator
@@ -79,7 +81,7 @@ Cells can handle multiline content:
79
81
  t.add_separator
80
82
  t.add_row ['Three', 3]
81
83
  end
82
-
84
+
83
85
  # > puts table
84
86
  #
85
87
  # +--------+---+
@@ -96,7 +98,7 @@ Cells can handle multiline content:
96
98
  To add a head to the table:
97
99
 
98
100
  table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows
99
-
101
+
100
102
  # > puts table
101
103
  #
102
104
  # +-------+--------+
@@ -112,7 +114,7 @@ To add a head to the table:
112
114
  To add a title to the table:
113
115
 
114
116
  table = Terminal::Table.new :title => "Cheatsheet", :headings => ['Word', 'Number'], :rows => rows
115
-
117
+
116
118
  # > puts table
117
119
  #
118
120
  # +------------+--------+
@@ -130,7 +132,7 @@ To add a title to the table:
130
132
  To align the second column to the right:
131
133
 
132
134
  table.align_column(1, :right)
133
-
135
+
134
136
  # > puts table
135
137
  #
136
138
  # +-------+--------+
@@ -144,7 +146,7 @@ To align the second column to the right:
144
146
  To align an individual cell, you specify the cell value in a hash along the alignment:
145
147
 
146
148
  table << ["Four", {:value => 4.0, :alignment => :center}]
147
-
149
+
148
150
  # > puts table
149
151
  #
150
152
  # +-------+--------+
@@ -155,13 +157,13 @@ To align an individual cell, you specify the cell value in a hash along the alig
155
157
  # | Three | 3 |
156
158
  # | Four | 4.0 |
157
159
  # +-------+--------+
158
-
160
+
159
161
  === Style
160
162
 
161
163
  To specify style options:
162
-
164
+
163
165
  table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows, :style => {:width => 80}
164
-
166
+
165
167
  # > puts table
166
168
  #
167
169
  # +--------------------------------------+---------------------------------------+
@@ -173,9 +175,9 @@ To specify style options:
173
175
  # +--------------------------------------+---------------------------------------+
174
176
 
175
177
  And change styles on the fly:
176
-
178
+
177
179
  table.style = {:width => 40, :padding_left => 3, :border_x => "=", :border_i => "x"}
178
-
180
+
179
181
  # > puts table
180
182
  #
181
183
  # x====================x=================x
@@ -187,7 +189,41 @@ And change styles on the fly:
187
189
  # | Two | 2 |
188
190
  # | Three | 3 |
189
191
  # x====================x=================x
190
-
192
+
193
+ You can also use styles to add a separator after every row:
194
+
195
+ table = Terminal::Table.new do |t|
196
+ t.add_row [1, 'One']
197
+ t.add_row [2, 'Two']
198
+ t.add_row [3, 'Three']
199
+ t.style = {:all_separators => true}
200
+ end
201
+
202
+ # > puts table
203
+ #
204
+ # +---+-------+
205
+ # | 1 | One |
206
+ # +---+-------+
207
+ # | 2 | Two |
208
+ # +---+-------+
209
+ # | 3 | Three |
210
+ # +---+-------+
211
+
212
+ You can also use styles to disable top and bottom borders of the table
213
+
214
+ table = Terminal::Table.new do |t|
215
+ t.headings = ['id', 'name']
216
+ t.rows = [[1, 'One'], [2, 'Two'], [3, 'Three']]
217
+ t.style = { :border_top => false, :border_bottom => false }
218
+ end
219
+
220
+ # > puts table
221
+ # | id | name |
222
+ # +----+-------+
223
+ # | 1 | One |
224
+ # | 2 | Two |
225
+ # | 3 | Three |
226
+
191
227
  To change the default style options:
192
228
 
193
229
  Terminal::Table::Style.defaults = {:width => 80}
@@ -211,28 +247,3 @@ For more examples, please see the examples/examples.rb file included in the sour
211
247
  == Author
212
248
 
213
249
  TJ Holowaychuk <tj@vision-media.ca>
214
-
215
- == License
216
-
217
- (The MIT License)
218
-
219
- Copyright (c) 2008-2009 TJ Holowaychuk <tj@vision-media.ca>
220
-
221
- Permission is hereby granted, free of charge, to any person obtaining
222
- a copy of this software and associated documentation files (the
223
- 'Software'), to deal in the Software without restriction, including
224
- without limitation the rights to use, copy, modify, merge, publish,
225
- distribute, sublicense, an d/or sell copies of the Software, and to
226
- permit persons to whom the Software is furnished to do so, subject to
227
- the following conditions:
228
-
229
- The above copyright notice and this permission notice shall be
230
- included in all copies or substantial portions of the Software.
231
-
232
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
233
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
234
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
235
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
236
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
237
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
238
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,8 +1,14 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler'
2
+ Bundler.setup
3
+ Bundler::GemHelper.install_tasks
2
4
 
3
- desc "Run specs"
4
- task :spec do
5
- sh "bundle exec rspec -f progress"
5
+ require 'rake'
6
+ require 'rspec/core/rake_task'
7
+
8
+ desc "Run all examples"
9
+ RSpec::Core::RakeTask.new(:spec) do |t|
10
+ t.ruby_opts = %w[-w]
11
+ t.rspec_opts = %w[--color]
6
12
  end
7
13
 
8
14
  desc "Default: Run specs"
@@ -1,4 +1,4 @@
1
- require 'unicode/display_width'
1
+ require 'unicode/display_width/no_string_ext'
2
2
 
3
3
  module Terminal
4
4
  class Table
@@ -43,6 +43,10 @@ module Terminal
43
43
  end.join(y) + y
44
44
  end.join("\n")
45
45
  end
46
+
47
+ def number_of_columns
48
+ @cells.collect(&:colspan).inject(0, &:+)
49
+ end
46
50
  end
47
51
  end
48
52
  end
@@ -24,6 +24,7 @@ module Terminal
24
24
  class Style
25
25
  @@defaults = {
26
26
  :border_x => "-", :border_y => "|", :border_i => "+",
27
+ :border_top => true, :border_bottom => true,
27
28
  :padding_left => 1, :padding_right => 1,
28
29
  :margin_left => '',
29
30
  :width => nil, :alignment => nil,
@@ -33,6 +34,8 @@ module Terminal
33
34
  attr_accessor :border_x
34
35
  attr_accessor :border_y
35
36
  attr_accessor :border_i
37
+ attr_accessor :border_top
38
+ attr_accessor :border_bottom
36
39
 
37
40
  attr_accessor :padding_left
38
41
  attr_accessor :padding_right
@@ -62,6 +65,15 @@ module Terminal
62
65
  @@defaults = defaults.merge(options)
63
66
  end
64
67
  end
68
+
69
+ def on_change attr
70
+ method_name = :"#{attr}="
71
+ old_method = method method_name
72
+ define_singleton_method(method_name) do |value|
73
+ old_method.call value
74
+ yield attr.to_sym, value
75
+ end
76
+ end
65
77
  end
66
78
  end
67
79
  end
@@ -1,4 +1,4 @@
1
- require 'unicode/display_width'
1
+ require 'unicode/display_width/no_string_ext'
2
2
 
3
3
  module Terminal
4
4
  class Table
@@ -10,12 +10,16 @@ module Terminal
10
10
  # Generates a ASCII table with the given _options_.
11
11
 
12
12
  def initialize options = {}, &block
13
+ @headings = []
14
+ @rows = []
13
15
  @column_widths = []
14
16
  self.style = options.fetch :style, {}
15
17
  self.headings = options.fetch :headings, []
16
18
  self.rows = options.fetch :rows, []
17
19
  self.title = options.fetch :title, nil
18
20
  yield_or_eval(&block) if block
21
+
22
+ style.on_change(:width) { require_column_widths_recalc }
19
23
  end
20
24
 
21
25
  ##
@@ -25,6 +29,7 @@ module Terminal
25
29
  r = rows
26
30
  column(n).each_with_index do |col, i|
27
31
  cell = r[i][n]
32
+ next unless cell
28
33
  cell.alignment = alignment unless cell.alignment?
29
34
  end
30
35
  end
@@ -35,7 +40,7 @@ module Terminal
35
40
  def add_row array
36
41
  row = array == :separator ? Separator.new(self) : Row.new(self, array)
37
42
  @rows << row
38
- recalc_column_widths row
43
+ require_column_widths_recalc unless row.is_a?(Separator)
39
44
  end
40
45
  alias :<< :add_row
41
46
 
@@ -90,8 +95,7 @@ module Terminal
90
95
  # Return length of column _n_.
91
96
 
92
97
  def column_width n
93
- width = @column_widths[n] || 0
94
- width + additional_column_widths[n].to_i
98
+ column_widths[n] || 0
95
99
  end
96
100
  alias length_of_column column_width # for legacy support
97
101
 
@@ -99,7 +103,7 @@ module Terminal
99
103
  # Return total number of columns available.
100
104
 
101
105
  def number_of_columns
102
- headings_with_rows.map { |r| r.cells.size }.max
106
+ headings_with_rows.map { |r| r.number_of_columns }.max || 0
103
107
  end
104
108
 
105
109
  ##
@@ -109,7 +113,7 @@ module Terminal
109
113
  arrays = [arrays] unless arrays.first.is_a?(Array)
110
114
  @headings = arrays.map do |array|
111
115
  row = Row.new(self, array)
112
- recalc_column_widths row
116
+ require_column_widths_recalc
113
117
  row
114
118
  end
115
119
  end
@@ -119,7 +123,7 @@ module Terminal
119
123
 
120
124
  def render
121
125
  separator = Separator.new(self)
122
- buffer = [separator]
126
+ buffer = style.border_top ? [separator] : []
123
127
  unless @title.nil?
124
128
  buffer << Row.new(self, [title_cell_options])
125
129
  buffer << separator
@@ -134,7 +138,7 @@ module Terminal
134
138
  buffer += @rows.product([separator]).flatten
135
139
  else
136
140
  buffer += @rows
137
- buffer << separator
141
+ buffer << separator if style.border_bottom
138
142
  end
139
143
  buffer.map { |r| style.margin_left + r.render.rstrip }.join("\n")
140
144
  end
@@ -162,7 +166,7 @@ module Terminal
162
166
 
163
167
  def title=(title)
164
168
  @title = title
165
- recalc_column_widths Row.new(self, [title_cell_options])
169
+ require_column_widths_recalc
166
170
  end
167
171
 
168
172
  ##
@@ -178,42 +182,134 @@ module Terminal
178
182
  private
179
183
 
180
184
  def columns_width
181
- @column_widths.inject(0) { |s, i| s + i + cell_spacing } + style.border_y.length
185
+ column_widths.inject(0) { |s, i| s + i + cell_spacing } + style.border_y.length
182
186
  end
183
187
 
184
- def additional_column_widths
185
- return [] if style.width.nil?
186
- spacing = style.width - columns_width
187
- if spacing < 0
188
- raise "Table width exceeds wanted width of #{style.width} characters."
189
- else
190
- per_col = spacing / number_of_columns
191
- arr = (1...number_of_columns).to_a.map { |i| per_col }
192
- other_cols = arr.inject(0) { |s, i| s + i }
193
- arr << spacing - other_cols
194
- arr
188
+ def recalc_column_widths
189
+ @require_column_widths_recalc = false
190
+ n_cols = number_of_columns
191
+ space_width = cell_spacing
192
+ return if n_cols == 0
193
+
194
+ # prepare rows
195
+ all_rows = headings_with_rows
196
+ all_rows << Row.new(self, [title_cell_options]) unless @title.nil?
197
+
198
+ # DP states, dp[colspan][index][split_offset] => column_width.
199
+ dp = []
200
+
201
+ # prepare initial value for DP.
202
+ all_rows.each do |row|
203
+ index = 0
204
+ row.cells.each do |cell|
205
+ cell_value = cell.value_for_column_width_recalc
206
+ cell_width = Unicode::DisplayWidth.of(cell_value.to_s)
207
+ colspan = cell.colspan
208
+
209
+ # find column width from each single cell.
210
+ dp[colspan] ||= []
211
+ dp[colspan][index] ||= [0] # add a fake cell with length 0.
212
+ dp[colspan][index][colspan] ||= 0 # initialize column length to 0.
213
+
214
+ # the last index `colspan` means width of the single column (split
215
+ # at end of each column), not a width made up of multiple columns.
216
+ single_column_length = [cell_width, dp[colspan][index][colspan]].max
217
+ dp[colspan][index][colspan] = single_column_length
218
+
219
+ index += colspan
220
+ end
195
221
  end
196
- end
197
222
 
198
- def recalc_column_widths row
199
- return if row.is_a? Separator
200
- i = 0
201
- row.cells.each do |cell|
202
- colspan = cell.colspan
203
- cell_value = cell.value_for_column_width_recalc
204
- colspan.downto(1) do |j|
205
- cell_length = Unicode::DisplayWidth.of(cell_value.to_s)
206
- if colspan > 1
207
- spacing_length = cell_spacing * (colspan - 1)
208
- length_in_columns = (cell_length - spacing_length)
209
- cell_length = (length_in_columns.to_f / colspan).ceil
223
+ # run DP.
224
+ (1..n_cols).each do |colspan|
225
+ dp[colspan] ||= []
226
+ (0..n_cols-colspan).each do |index|
227
+ dp[colspan][index] ||= [1]
228
+ (1...colspan).each do |offset|
229
+ # processed level became reverse map from width => [offset, ...].
230
+ left_colspan = offset
231
+ left_index = index
232
+ left_width = dp[left_colspan][left_index].keys.first
233
+
234
+ right_colspan = colspan - left_colspan
235
+ right_index = index + offset
236
+ right_width = dp[right_colspan][right_index].keys.first
237
+
238
+ dp[colspan][index][offset] = left_width + right_width + space_width
239
+ end
240
+
241
+ # reverse map it for resolution (max width and short offset first).
242
+ rmap = {}
243
+ dp[colspan][index].each_with_index do |width, offset|
244
+ rmap[width] ||= []
245
+ rmap[width] << offset
210
246
  end
211
- if @column_widths[i].to_i < cell_length
212
- @column_widths[i] = cell_length
247
+
248
+ # sort reversely and store it back.
249
+ dp[colspan][index] = Hash[rmap.sort.reverse]
250
+ end
251
+ end
252
+
253
+ resolve = lambda do |colspan, full_width, index = 0|
254
+ # stop if reaches the bottom level.
255
+ return @column_widths[index] = full_width if colspan == 1
256
+
257
+ # choose best split offset for partition, or second best result
258
+ # if first one is not dividable.
259
+ candidate_offsets = dp[colspan][index].collect(&:last).flatten
260
+ offset = candidate_offsets[0]
261
+ offset = candidate_offsets[1] if offset == colspan
262
+
263
+ # prepare for next round.
264
+ left_colspan = offset
265
+ left_index = index
266
+ left_width = dp[left_colspan][left_index].keys.first
267
+
268
+ right_colspan = colspan - left_colspan
269
+ right_index = index + offset
270
+ right_width = dp[right_colspan][right_index].keys.first
271
+
272
+ # calculate reference column width, give remaining spaces to left.
273
+ total_non_space_width = full_width - (colspan - 1) * space_width
274
+ ref_column_width = total_non_space_width / colspan
275
+ remainder = total_non_space_width % colspan
276
+ rem_left_width = [remainder, left_colspan].min
277
+ rem_right_width = remainder - rem_left_width
278
+ ref_left_width = ref_column_width * left_colspan +
279
+ (left_colspan - 1) * space_width + rem_left_width
280
+ ref_right_width = ref_column_width * right_colspan +
281
+ (right_colspan - 1) * space_width + rem_right_width
282
+
283
+ # at most one width can be greater than the reference width.
284
+ if left_width <= ref_left_width and right_width <= ref_right_width
285
+ # use refernce width (evenly partition).
286
+ left_width = ref_left_width
287
+ right_width = ref_right_width
288
+ else
289
+ # the wider one takes its value, shorter one takes the rest.
290
+ if left_width > ref_left_width
291
+ right_width = full_width - left_width - space_width
292
+ else
293
+ left_width = full_width - right_width - space_width
213
294
  end
214
- i = i + 1
215
295
  end
296
+
297
+ # run next round.
298
+ resolve.call(left_colspan, left_width, left_index)
299
+ resolve.call(right_colspan, right_width, right_index)
300
+ end
301
+
302
+ full_width = dp[n_cols][0].keys.first
303
+ unless style.width.nil?
304
+ new_width = style.width - space_width - style.border_y.length
305
+ if new_width < full_width
306
+ raise "Table width exceeds wanted width " +
307
+ "of #{style.width} characters."
308
+ end
309
+ full_width = new_width
216
310
  end
311
+
312
+ resolve.call(n_cols, full_width)
217
313
  end
218
314
 
219
315
  ##
@@ -235,5 +331,14 @@ module Terminal
235
331
  def title_cell_options
236
332
  {:value => @title, :alignment => :center, :colspan => number_of_columns}
237
333
  end
334
+
335
+ def require_column_widths_recalc
336
+ @require_column_widths_recalc = true
337
+ end
338
+
339
+ def column_widths
340
+ recalc_column_widths if @require_column_widths_recalc
341
+ @column_widths
342
+ end
238
343
  end
239
344
  end
@@ -1,5 +1,5 @@
1
1
  module Terminal
2
2
  class Table
3
- VERSION = '1.7.0'
3
+ VERSION = '2.0.0'
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"
25
+ spec.add_runtime_dependency "unicode-display_width", ["~> 1.1", ">= 1.1.1"]
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.7.0
4
+ version: 2.0.0
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: 2016-08-29 00:00:00.000000000 Z
12
+ date: 2020-11-01 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
@@ -88,6 +88,9 @@ dependencies:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
90
  version: '1.1'
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: 1.1.1
91
94
  type: :runtime
92
95
  prerelease: false
93
96
  version_requirements: !ruby/object:Gem::Requirement
@@ -95,16 +98,22 @@ dependencies:
95
98
  - - "~>"
96
99
  - !ruby/object:Gem::Version
97
100
  version: '1.1'
98
- description:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 1.1.1
104
+ description:
99
105
  email:
100
106
  - tj@vision-media.ca
101
107
  executables: []
102
108
  extensions: []
103
109
  extra_rdoc_files: []
104
110
  files:
111
+ - ".github/workflows/ci.yml"
105
112
  - ".gitignore"
106
113
  - Gemfile
114
+ - Gemfile.lock
107
115
  - History.rdoc
116
+ - LICENSE.txt
108
117
  - Manifest
109
118
  - README.rdoc
110
119
  - Rakefile
@@ -124,7 +133,7 @@ homepage: https://github.com/tj/terminal-table
124
133
  licenses:
125
134
  - MIT
126
135
  metadata: {}
127
- post_install_message:
136
+ post_install_message:
128
137
  rdoc_options: []
129
138
  require_paths:
130
139
  - lib
@@ -139,9 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
148
  - !ruby/object:Gem::Version
140
149
  version: '0'
141
150
  requirements: []
142
- rubyforge_project:
143
- rubygems_version: 2.5.1
144
- signing_key:
151
+ rubygems_version: 3.1.4
152
+ signing_key:
145
153
  specification_version: 4
146
154
  summary: Simple, feature rich ascii table generation library
147
155
  test_files: []