tty-table 0.7.0 → 0.12.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.
Files changed (151) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +57 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +165 -94
  5. data/lib/tty-table.rb +1 -5
  6. data/lib/tty/table.rb +102 -42
  7. data/lib/tty/table/alignment_set.rb +3 -6
  8. data/lib/tty/table/border.rb +57 -68
  9. data/lib/tty/table/border/ascii.rb +17 -17
  10. data/lib/tty/table/border/null.rb +20 -22
  11. data/lib/tty/table/border/row_line.rb +4 -3
  12. data/lib/tty/table/border/unicode.rb +17 -17
  13. data/lib/tty/table/border_dsl.rb +28 -25
  14. data/lib/tty/table/border_options.rb +50 -25
  15. data/lib/tty/table/column_constraint.rb +29 -17
  16. data/lib/tty/table/{column_set.rb → columns.rb} +44 -69
  17. data/lib/tty/table/empty.rb +2 -0
  18. data/lib/tty/table/error.rb +1 -1
  19. data/lib/tty/table/field.rb +43 -35
  20. data/lib/tty/table/header.rb +7 -5
  21. data/lib/tty/table/indentation.rb +16 -25
  22. data/lib/tty/table/operation/alignment.rb +10 -8
  23. data/lib/tty/table/operation/escape.rb +2 -3
  24. data/lib/tty/table/operation/filter.rb +1 -1
  25. data/lib/tty/table/operation/padding.rb +4 -12
  26. data/lib/tty/table/operation/truncation.rb +4 -4
  27. data/lib/tty/table/operation/wrapped.rb +4 -4
  28. data/lib/tty/table/operations.rb +4 -15
  29. data/lib/tty/table/options.rb +2 -4
  30. data/lib/tty/table/orientation.rb +5 -5
  31. data/lib/tty/table/orientation/horizontal.rb +1 -1
  32. data/lib/tty/table/orientation/vertical.rb +1 -1
  33. data/lib/tty/table/renderer.rb +40 -35
  34. data/lib/tty/table/renderer/ascii.rb +4 -4
  35. data/lib/tty/table/renderer/basic.rb +85 -88
  36. data/lib/tty/table/renderer/unicode.rb +3 -3
  37. data/lib/tty/table/row.rb +10 -8
  38. data/lib/tty/table/transformation.rb +2 -2
  39. data/lib/tty/table/validatable.rb +25 -7
  40. data/lib/tty/table/version.rb +3 -3
  41. metadata +33 -283
  42. data/.gitignore +0 -14
  43. data/.rspec +0 -3
  44. data/.travis.yml +0 -24
  45. data/CODE_OF_CONDUCT.md +0 -49
  46. data/Gemfile +0 -18
  47. data/Rakefile +0 -8
  48. data/benchmarks/speed.rb +0 -41
  49. data/spec/spec_helper.rb +0 -50
  50. data/spec/unit/access_spec.rb +0 -86
  51. data/spec/unit/add_row_spec.rb +0 -28
  52. data/spec/unit/alignment_set/each_spec.rb +0 -17
  53. data/spec/unit/alignment_set/new_spec.rb +0 -27
  54. data/spec/unit/alignment_set/to_ary_spec.rb +0 -14
  55. data/spec/unit/alignment_spec.rb +0 -71
  56. data/spec/unit/border/ascii/rendering_spec.rb +0 -90
  57. data/spec/unit/border/new_spec.rb +0 -27
  58. data/spec/unit/border/null/rendering_spec.rb +0 -130
  59. data/spec/unit/border/options/from_spec.rb +0 -38
  60. data/spec/unit/border/options/new_spec.rb +0 -14
  61. data/spec/unit/border/unicode/rendering_spec.rb +0 -63
  62. data/spec/unit/border_options/new_spec.rb +0 -20
  63. data/spec/unit/border_options/update_spec.rb +0 -18
  64. data/spec/unit/column_constraint/enforce_spec.rb +0 -70
  65. data/spec/unit/column_constraint/widths_spec.rb +0 -35
  66. data/spec/unit/column_set/extract_widths_spec.rb +0 -48
  67. data/spec/unit/column_set/total_width_spec.rb +0 -15
  68. data/spec/unit/column_set/widths_from_spec.rb +0 -51
  69. data/spec/unit/data_spec.rb +0 -12
  70. data/spec/unit/each_spec.rb +0 -26
  71. data/spec/unit/each_with_index_spec.rb +0 -51
  72. data/spec/unit/empty_spec.rb +0 -23
  73. data/spec/unit/eql_spec.rb +0 -34
  74. data/spec/unit/field/equality_spec.rb +0 -51
  75. data/spec/unit/field/length_spec.rb +0 -35
  76. data/spec/unit/field/lines_spec.rb +0 -21
  77. data/spec/unit/field/new_spec.rb +0 -29
  78. data/spec/unit/field/width_spec.rb +0 -23
  79. data/spec/unit/filter_spec.rb +0 -22
  80. data/spec/unit/header/call_spec.rb +0 -30
  81. data/spec/unit/header/color_spec.rb +0 -19
  82. data/spec/unit/header/equality_spec.rb +0 -51
  83. data/spec/unit/header/height_spec.rb +0 -27
  84. data/spec/unit/header/new_spec.rb +0 -16
  85. data/spec/unit/header/set_spec.rb +0 -20
  86. data/spec/unit/header/to_ary_spec.rb +0 -14
  87. data/spec/unit/header_spec.rb +0 -13
  88. data/spec/unit/indentation/indent_spec.rb +0 -21
  89. data/spec/unit/new_spec.rb +0 -73
  90. data/spec/unit/operation/alignment/call_spec.rb +0 -39
  91. data/spec/unit/operation/escape/call_spec.rb +0 -15
  92. data/spec/unit/operation/filter/call_spec.rb +0 -16
  93. data/spec/unit/operation/truncation/call_spec.rb +0 -30
  94. data/spec/unit/operation/wrapped/call_spec.rb +0 -40
  95. data/spec/unit/operations/new_spec.rb +0 -30
  96. data/spec/unit/options/access_spec.rb +0 -14
  97. data/spec/unit/options_spec.rb +0 -25
  98. data/spec/unit/orientation_spec.rb +0 -145
  99. data/spec/unit/padding_spec.rb +0 -117
  100. data/spec/unit/properties_spec.rb +0 -25
  101. data/spec/unit/render_repeat_spec.rb +0 -42
  102. data/spec/unit/render_spec.rb +0 -63
  103. data/spec/unit/render_with_spec.rb +0 -106
  104. data/spec/unit/renderer/ascii/coloring_spec.rb +0 -70
  105. data/spec/unit/renderer/ascii/indentation_spec.rb +0 -41
  106. data/spec/unit/renderer/ascii/multiline_spec.rb +0 -101
  107. data/spec/unit/renderer/ascii/padding_spec.rb +0 -88
  108. data/spec/unit/renderer/ascii/render_spec.rb +0 -68
  109. data/spec/unit/renderer/ascii/resizing_spec.rb +0 -114
  110. data/spec/unit/renderer/ascii/separator_spec.rb +0 -28
  111. data/spec/unit/renderer/basic/alignment_spec.rb +0 -88
  112. data/spec/unit/renderer/basic/coloring_spec.rb +0 -61
  113. data/spec/unit/renderer/basic/extract_column_widths_spec.rb +0 -28
  114. data/spec/unit/renderer/basic/filter_spec.rb +0 -53
  115. data/spec/unit/renderer/basic/indentation_spec.rb +0 -48
  116. data/spec/unit/renderer/basic/multiline_spec.rb +0 -74
  117. data/spec/unit/renderer/basic/new_spec.rb +0 -26
  118. data/spec/unit/renderer/basic/options_spec.rb +0 -52
  119. data/spec/unit/renderer/basic/padding_spec.rb +0 -76
  120. data/spec/unit/renderer/basic/render_spec.rb +0 -57
  121. data/spec/unit/renderer/basic/resizing_spec.rb +0 -96
  122. data/spec/unit/renderer/basic/separator_spec.rb +0 -43
  123. data/spec/unit/renderer/basic/truncation_spec.rb +0 -35
  124. data/spec/unit/renderer/basic/wrapping_spec.rb +0 -40
  125. data/spec/unit/renderer/border_spec.rb +0 -104
  126. data/spec/unit/renderer/render_spec.rb +0 -36
  127. data/spec/unit/renderer/select_spec.rb +0 -22
  128. data/spec/unit/renderer/unicode/coloring_spec.rb +0 -70
  129. data/spec/unit/renderer/unicode/indentation_spec.rb +0 -41
  130. data/spec/unit/renderer/unicode/padding_spec.rb +0 -61
  131. data/spec/unit/renderer/unicode/render_spec.rb +0 -68
  132. data/spec/unit/renderer/unicode/separator_spec.rb +0 -26
  133. data/spec/unit/renderer_spec.rb +0 -19
  134. data/spec/unit/rotate_spec.rb +0 -86
  135. data/spec/unit/row/access_spec.rb +0 -25
  136. data/spec/unit/row/call_spec.rb +0 -45
  137. data/spec/unit/row/data_spec.rb +0 -26
  138. data/spec/unit/row/each_spec.rb +0 -31
  139. data/spec/unit/row/equality_spec.rb +0 -73
  140. data/spec/unit/row/height_spec.rb +0 -27
  141. data/spec/unit/row/new_spec.rb +0 -41
  142. data/spec/unit/row/to_ary_spec.rb +0 -14
  143. data/spec/unit/to_s_spec.rb +0 -56
  144. data/spec/unit/transformation/extract_tuples_spec.rb +0 -35
  145. data/spec/unit/utf_spec.rb +0 -33
  146. data/spec/unit/validatable/validate_options_spec.rb +0 -33
  147. data/spec/unit/validatable_spec.rb +0 -32
  148. data/tasks/console.rake +0 -10
  149. data/tasks/coverage.rake +0 -11
  150. data/tasks/spec.rake +0 -29
  151. data/tty-table.gemspec +0 -30
@@ -1,5 +1 @@
1
- # encoding: utf-8
2
-
3
- require 'tty/table/error'
4
- require 'tty/table/version'
5
- require 'tty/table'
1
+ require_relative "tty/table"
@@ -1,23 +1,22 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'equatable'
4
- require 'forwardable'
5
- require 'necromancer'
3
+ require "forwardable"
6
4
 
7
- require 'tty/table/column_set'
8
- require 'tty/table/header'
9
- require 'tty/table/orientation'
10
- require 'tty/table/row'
11
- require 'tty/table/renderer'
12
- require 'tty/table/transformation'
13
- require 'tty/table/validatable'
5
+ require_relative "table/columns"
6
+ require_relative "table/header"
7
+ require_relative "table/orientation"
8
+ require_relative "table/row"
9
+ require_relative "table/renderer"
10
+ require_relative "table/transformation"
11
+ require_relative "table/validatable"
12
+ require_relative "table/version"
14
13
 
15
14
  module TTY
16
15
  # A core class intended for storing data in a structured, tabular form.
17
16
  # Once the data is stored in a TTY::Table various operations can be performed
18
17
  # before the information is dumped into a stdout.
19
18
  class Table
20
- include Comparable, Enumerable, Validatable, Equatable
19
+ include Comparable, Enumerable, Validatable
21
20
  extend Forwardable
22
21
 
23
22
  # The table header
@@ -37,21 +36,21 @@ module TTY
37
36
 
38
37
  # The table orientation out of :horizontal and :vertical
39
38
  #
40
- # @reutrn [TTY::Table::Orientation]
39
+ # @return [TTY::Table::Orientation]
41
40
  #
42
41
  # @api public
43
42
  attr_reader :orientation
44
43
 
45
44
  # The table original row count
46
45
  #
47
- # @reutrn [Integer]
46
+ # @return [Integer]
48
47
  #
49
48
  # @api public
50
49
  attr_reader :original_rows
51
50
 
52
51
  # The table original column count
53
52
  #
54
- # @reutrn [Integer]
53
+ # @return [Integer]
55
54
  #
56
55
  # @api public
57
56
  attr_reader :original_columns
@@ -63,7 +62,7 @@ module TTY
63
62
  # Create a new Table where each argument is a row
64
63
  #
65
64
  # @example
66
- # table = TTY::Table[['a1', 'a2'], ['b1', 'b2']]
65
+ # table = TTY::Table[["a1", "a2"], ["b1", "b2"]]
67
66
  #
68
67
  # @api public
69
68
  def self.[](*rows)
@@ -73,20 +72,20 @@ module TTY
73
72
  # Instantiate a new Table
74
73
  #
75
74
  # @example of no header
76
- # table = Table.new [['a1', 'a2'], ['b1', 'b2']]
75
+ # table = Table.new [["a1", "a2"], ["b1", "b2"]]
77
76
  #
78
77
  # @example of direct parameters
79
- # rows = [['a1', 'a2'], ['b1', 'b2']]
80
- # table = Table.new ['Header 1', 'Header 2'], rows
78
+ # rows = [["a1", "a2"], ["b1", "b2"]]
79
+ # table = Table.new ["Header 1", "Header 2"], rows
81
80
  #
82
81
  # @example of parameters passed as options
83
- # rows = [['a1', 'a2'], ['b1', 'b2']]
84
- # table = Table.new header: ['Header 1', 'Header 2'], rows: rows
82
+ # rows = [["a1", "a2"], ["b1", "b2"]]
83
+ # table = Table.new header: ["Header 1", "Header 2"], rows: rows
85
84
  #
86
85
  # @example of parameters passed as hash
87
- # Table.new [{'Header1' => ['a1','a2'], 'Header2' => ['b1', 'b2'] }]}
86
+ # Table.new [{"Header1" => ["a1","a2"], "Header2" => ["b1", "b2"] }]}
88
87
  #
89
- # @param [Array[Symbol], Hash] *args
88
+ # @param [Array[Symbol], Hash] args
90
89
  #
91
90
  # @api public
92
91
  def self.new(*args, &block)
@@ -114,7 +113,6 @@ module TTY
114
113
  # @api private
115
114
  def initialize(options = {}, &block)
116
115
  validate_options! options
117
- @converter = Necromancer.new
118
116
  @header = (value = options[:header]) ? Header.new(value) : nil
119
117
  @rows = coerce(options.fetch(:rows) { Row.new([]) })
120
118
  @rotated = false
@@ -126,6 +124,15 @@ module TTY
126
124
  yield_or_eval(&block) if block_given?
127
125
  end
128
126
 
127
+ # Provides a list of rows to have separations applied
128
+ #
129
+ # @return [Array]
130
+ #
131
+ # @api public
132
+ def separators
133
+ @separators ||= []
134
+ end
135
+
129
136
  # Provides access to all table data
130
137
  #
131
138
  # @return [Array]
@@ -194,10 +201,10 @@ module TTY
194
201
  # @param [Integer] column_index
195
202
  #
196
203
  # @example
197
- # table = TTY::Table.new [['a1','a2'], ['b1','b2']]
198
- # table[0] # => ['a1','a2']
199
- # table[0,0] # => 'a1'
200
- # table[-1] # => ['b1','b2']
204
+ # table = TTY::Table.new [["a1","a2"], ["b1","b2"]]
205
+ # table[0] # => ["a1","a2"]
206
+ # table[0,0] # => "a1"
207
+ # table[-1] # => ["b1","b2"]
201
208
  #
202
209
  # @api public
203
210
  def [](row_index, column_index = false)
@@ -205,12 +212,12 @@ module TTY
205
212
  if row_index >= 0 && column_index >= 0
206
213
  rows.fetch(row_index) { return nil }[column_index]
207
214
  else
208
- fail TTY::Table::TupleMissing.new(row_index, column_index)
215
+ raise TTY::Table::TupleMissing.new(row_index, column_index)
209
216
  end
210
217
  end
211
- alias_method :at, :[]
212
- alias_method :element, :[]
213
- alias_method :component, :[]
218
+ alias at []
219
+ alias element []
220
+ alias component []
214
221
 
215
222
  # Set table value at row(i) and column(j)
216
223
  #
@@ -224,7 +231,7 @@ module TTY
224
231
  # When a block is given, the elements of that Array are iterated over.
225
232
  #
226
233
  # @example
227
- # rows = [['a1', 'a2'], ['b1', 'b2']]
234
+ # rows = [["a1", "a2"], ["b1", "b2"]]
228
235
  # table = TTY::Table.new rows: rows
229
236
  # table.row(1) { |row| ... }
230
237
  #
@@ -251,7 +258,7 @@ module TTY
251
258
  #
252
259
  # @example
253
260
  # header = [:h1, :h2]
254
- # rows = [ ['a1', 'a2'], ['b1', 'b2'] ]
261
+ # rows = [ ["a1", "a2"], ["b1", "b2"] ]
255
262
  # table = TTY::Table.new :rows => rows, :header => header
256
263
  # table.column(1)
257
264
  # table.column(1) { |element| ... }
@@ -285,9 +292,12 @@ module TTY
285
292
  #
286
293
  # @api public
287
294
  def <<(row)
288
- rows_copy = rows.dup
289
- assert_row_sizes rows_copy << row
290
- rows << to_row(row)
295
+ if row == Border::SEPARATOR
296
+ separators << columns_size - (header ? 0 : 2)
297
+ else
298
+ assert_row_size(row, rows)
299
+ rows << to_row(row)
300
+ end
291
301
  self
292
302
  end
293
303
 
@@ -339,6 +349,7 @@ module TTY
339
349
  def columns_size
340
350
  rows.size > 0 ? rows[0].size : 0
341
351
  end
352
+ alias columns_count columns_size
342
353
 
343
354
  # Return the number of rows
344
355
  #
@@ -370,7 +381,7 @@ module TTY
370
381
  #
371
382
  # @api public
372
383
  def width
373
- ColumnSet.new(self).total_width
384
+ Columns.total_width(data)
374
385
  end
375
386
 
376
387
  # Return true if this is an empty table, i.e. if the number of
@@ -427,10 +438,12 @@ module TTY
427
438
 
428
439
  # Render a given table using custom border class.
429
440
  #
430
- # @param [TTY::Table::Border]
441
+ # @param [TTY::Table::Border] border_class
431
442
  #
432
443
  # @param [Symbol] renderer_type
433
444
  #
445
+ # @param [Hash] options
446
+ #
434
447
  # @yield [renderer]
435
448
  #
436
449
  # @yieldparam [TTY::Table::Renderer] renderer
@@ -455,15 +468,62 @@ module TTY
455
468
  # This coercion mechanism is used by Table to handle Enumerable types
456
469
  # and force them into array type.
457
470
  #
458
- # @param [Enumerable] object
471
+ # @param [Enumerable] rows
459
472
  # the object to coerce
460
473
  #
461
474
  # @return [Array]
462
475
  #
463
476
  # @api public
464
477
  def coerce(rows)
465
- rows = @converter.convert(rows).to(:array)
466
- rows.map { |row| to_row(row, header) }
478
+ coerced_rows = []
479
+ Array(rows).each do |row|
480
+ if row == Border::SEPARATOR
481
+ separators << coerced_rows.length - (header ? 0 : 1)
482
+ else
483
+ coerced_rows << to_row(row, header)
484
+ end
485
+ end
486
+ coerced_rows
487
+ end
488
+
489
+ # Compare table for equality of header and rows attributes
490
+ #
491
+ # @return [Boolean]
492
+ #
493
+ # @api public
494
+ def eql?(other)
495
+ instance_of?(other.class) &&
496
+ header.eql?(other.header) && rows.eql?(other.rows)
497
+ end
498
+
499
+ # Compare table for equivalence of header and rows attributes
500
+ #
501
+ # @return [Boolean]
502
+ #
503
+ # @api public
504
+ def ==(other)
505
+ other.is_a?(self.class) &&
506
+ header == other.header && rows == other.rows
507
+ end
508
+
509
+ # Inspect this instance attributes
510
+ #
511
+ # @return [String]
512
+ #
513
+ # @api public
514
+ def inspect
515
+ "#<#{self.class.name} header=#{header.inspect} rows=#{rows.inspect} " \
516
+ "original_rows=#{original_rows.inspect} " \
517
+ "original_columns=#{original_columns.inspect}>"
518
+ end
519
+
520
+ # Hash for this instance and its attributes
521
+ #
522
+ # @return [Numeric]
523
+ #
524
+ # @api public
525
+ def hash
526
+ [self.class, header, rows].hash
467
527
  end
468
528
 
469
529
  private
@@ -1,6 +1,4 @@
1
- # encoding: utf-8
2
-
3
- require 'necromancer'
1
+ # frozen_string_literal: true
4
2
 
5
3
  module TTY
6
4
  class Table
@@ -19,8 +17,7 @@ module TTY
19
17
  #
20
18
  # @api private
21
19
  def initialize(alignments)
22
- @converter = Necromancer.new
23
- @alignments = @converter.convert(alignments).to(:array).map(&:to_sym)
20
+ @alignments = Array(alignments).map(&:to_sym)
24
21
  end
25
22
 
26
23
  # Iterate over each element in the alignment set
@@ -40,7 +37,7 @@ module TTY
40
37
 
41
38
  # Lookup an alignment by index
42
39
  #
43
- # @param [Integer]
40
+ # @param [Integer] index
44
41
  #
45
42
  # @return [Symbol] alignment
46
43
  #
@@ -1,26 +1,26 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'equatable'
4
- require 'pastel'
5
- require 'verse'
3
+ require "pastel"
4
+ require "strings"
6
5
 
7
- require 'tty/table/border_options'
8
- require 'tty/table/border_dsl'
9
- require 'tty/table/border/row_line'
6
+ require_relative "border_dsl"
7
+ require_relative "border/row_line"
8
+ require_relative "error"
10
9
 
11
10
  module TTY
12
11
  class Table
13
12
  # Abstract base class that is responsible for building the table border.
14
13
  class Border
15
- include Equatable
14
+ EMPTY_CHAR = ""
16
15
 
17
- EMPTY_CHAR = ''.freeze
18
-
19
- SPACE_CHAR = ' '.freeze
16
+ SPACE_CHAR = " "
20
17
 
21
18
  # Represent a separtor on each row
22
19
  EACH_ROW = :each_row
23
20
 
21
+ # specify a separator as a row
22
+ SEPARATOR = :separator
23
+
24
24
  class << self
25
25
  # Store characters for border
26
26
  #
@@ -28,40 +28,40 @@ module TTY
28
28
  attr_accessor :characters
29
29
  end
30
30
 
31
+ # Define border characters
32
+ #
33
+ # @param [Hash] characters
34
+ # the border characters
35
+ #
36
+ # @return [Hash]
37
+ #
38
+ # @api public
39
+ def self.def_border(characters = (not_set = true), &block)
40
+ return self.characters = characters unless not_set
41
+
42
+ dsl = BorderDSL.new(&block)
43
+ self.characters = dsl.characters
44
+ end
45
+
31
46
  # Instantiate a new object
32
47
  #
33
48
  # @param [Array] column_widths
34
49
  # the table column widths
35
50
  #
36
- # @param [BorderOptions] options
51
+ # @param [BorderOptions] border_opts
37
52
  #
38
53
  # @return [Object]
39
54
  #
40
55
  # @api private
41
- def initialize(column_widths, padding, options = nil)
56
+ def initialize(column_widths, border_opts = nil)
42
57
  if self.class == Border
43
- fail NotImplementedError, "#{self} is an abstract class"
44
- else
45
- @widths = column_widths
46
- @padding = Verse::Padder.parse(padding)
47
- @border_options = TTY::Table::BorderOptions.from options
48
- @color = Pastel.new
58
+ raise NotImplementedError, "#{self} is an abstract class"
49
59
  end
50
- end
51
-
52
- # Define border characters
53
- #
54
- # @param [Hash] characters
55
- # the border characters
56
- #
57
- # @return [Hash]
58
- #
59
- # @api public
60
- def self.def_border(characters=(not_set=true), &block)
61
- return self.characters = characters unless not_set
62
60
 
63
- dsl = TTY::Table::BorderDSL.new(&block)
64
- self.characters = dsl.characters
61
+ @widths = column_widths
62
+ @dsl = BorderDSL.new(border_opts)
63
+ @characters = self.class.characters.merge(@dsl.characters)
64
+ @color = Pastel.new
65
65
  end
66
66
 
67
67
  # Retrive individual character by type
@@ -73,13 +73,7 @@ module TTY
73
73
  #
74
74
  # @api private
75
75
  def [](type)
76
- characters = self.class.characters
77
- chars = if border_options.nil?
78
- characters
79
- else
80
- characters.merge(border_options.characters)
81
- end
82
- chars[type] || EMPTY_CHAR
76
+ @characters[type] || EMPTY_CHAR
83
77
  end
84
78
 
85
79
  # Check if border color is set
@@ -88,7 +82,7 @@ module TTY
88
82
  #
89
83
  # @api public
90
84
  def color?
91
- border_options && border_options.style
85
+ !!@dsl.style
92
86
  end
93
87
 
94
88
  # A line spanning all columns marking top of a table.
@@ -114,7 +108,7 @@ module TTY
114
108
  # @return [String]
115
109
  #
116
110
  # @api private
117
- def separator
111
+ def middle_line
118
112
  (result = render(:mid)).empty? ? nil : result
119
113
  end
120
114
 
@@ -127,30 +121,27 @@ module TTY
127
121
  #
128
122
  # @api public
129
123
  def row_line(row)
130
- line = RowLine.new(self['left'], self['center'], self['right'])
131
- line.colorize(self, border_options.style) if color?
124
+ line = RowLine.new(self["left"], self["center"], self["right"])
125
+ line.colorize(self, @dsl.style) if color?
132
126
 
133
127
  result = row_heights(row, line)
134
128
  result.empty? ? EMPTY_CHAR : result
135
129
  end
136
130
 
137
- # Set color on characters
131
+ # Set color for a string
138
132
  #
139
133
  # @param [Symbol] color
140
134
  #
141
- # @param [Array[String]] array of strings
135
+ # @param [String] string
136
+ # the string to color
142
137
  #
143
- # @return [Array[String]]
138
+ # @return [String]
144
139
  #
145
140
  # @api public
146
- def set_color(color, *strings)
147
- strings.map do |string|
148
- if string.gsub(/\s+/, '').empty?
149
- string
150
- else
151
- @color.decorate(string, color)
152
- end
153
- end
141
+ def set_color(color, string)
142
+ return string if string.gsub(/\s+/, EMPTY_CHAR).empty?
143
+
144
+ @color.decorate(string, color)
154
145
  end
155
146
 
156
147
  protected
@@ -163,12 +154,9 @@ module TTY
163
154
  # The table custom border options including styling
164
155
  #
165
156
  # @api private
166
- attr_reader :border_options
167
-
168
- # The padding to apply to each field
169
- #
170
- # @api private
171
- attr_reader :padding
157
+ def border_options
158
+ @dsl.options
159
+ end
172
160
 
173
161
  # Separate multiline string into individual rows with border.
174
162
  #
@@ -193,7 +181,7 @@ module TTY
193
181
  # @param [TTY::Table::Row] row
194
182
  # the table row
195
183
  #
196
- # @param [Integer] line
184
+ # @param [Integer] line_index
197
185
  # the index for current line inside multiline
198
186
  #
199
187
  # @param [TTY::Table::Border::RowLine] line
@@ -205,14 +193,16 @@ module TTY
205
193
  line.left + row.fields.each_with_index.map do |field, index|
206
194
  direction = field.alignment || :left
207
195
  field_content = field.lines[line_index] || SPACE_CHAR * field.length
208
- Verse.align(field_content, widths[index], direction)
196
+ Strings.align(field_content, widths[index], direction: direction)
209
197
  end.join(line.center) + line.right
210
198
  end
211
199
 
212
200
  # Generate particular border type
213
201
  #
214
202
  # @param [String] type
215
- # border type one of [:top, :bottom, :mid]
203
+ # border type one of :top, :bottom and :mid
204
+ #
205
+ # @return [String]
216
206
  #
217
207
  # @api private
218
208
  def render(type)
@@ -224,7 +214,8 @@ module TTY
224
214
  self["#{type}_mid"])
225
215
 
226
216
  return line unless color?
227
- set_color(border_options.style, line).join
217
+
218
+ set_color(@dsl.style, line)
228
219
  end
229
220
 
230
221
  # Generate a border string
@@ -236,9 +227,7 @@ module TTY
236
227
  #
237
228
  # @api private
238
229
  def render_line(line, left, right, intersection)
239
- left + widths.map do |width|
240
- line * (padding.left + width + padding.right)
241
- end.join(intersection) + right
230
+ left + widths.map { |width| line * width }.join(intersection) + right
242
231
  end
243
232
  end # Border
244
233
  end # Table