tty-table 0.7.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
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,6 +1,6 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'verse'
3
+ require "strings"
4
4
 
5
5
  module TTY
6
6
  class Table
@@ -19,10 +19,14 @@ module TTY
19
19
 
20
20
  # Evaluate alignment of the provided row
21
21
  #
22
+ # @param [TTY::Table::Field] field
23
+ # the table field
24
+ #
22
25
  # @param [Array] row
23
26
  # the table row
24
- # @param [Hash] options
25
- # the table options
27
+ #
28
+ # @param [Integer] col
29
+ # the table column index
26
30
  #
27
31
  # @return [TTY::Table::Field]
28
32
  #
@@ -42,18 +46,16 @@ module TTY
42
46
  # @param [TTY::Table::Field] field
43
47
  # the table field
44
48
  #
45
- # @param [Integer] co
49
+ # @param [Integer] col
46
50
  # the table column index
47
51
  #
48
- # @param [Hash] options
49
- #
50
52
  # @return [TTY::Table::Field]
51
53
  #
52
54
  # @api private
53
55
  def align_field(field, col)
54
56
  column_width = widths[col]
55
57
  direction = field.alignment || alignments[col] || DEFAULT
56
- Verse.align(field.content, column_width, direction)
58
+ Strings.align(field.content, column_width, direction: direction)
57
59
  end
58
60
  end # Alignment
59
61
  end # Operation
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module TTY
4
4
  class Table
@@ -7,7 +7,6 @@ module TTY
7
7
  #
8
8
  # @api private
9
9
  class Escape
10
-
11
10
  # Escape special characters in a table field
12
11
  #
13
12
  # @param [TTY::Table::Field] field
@@ -21,7 +20,7 @@ module TTY
21
20
  # @api public
22
21
  def call(field, row, col)
23
22
  field.content.gsub(/(\t|\r|\n)/) do |val|
24
- val.dump.gsub('"', '')
23
+ val.dump.gsub('"', "")
25
24
  end
26
25
  end
27
26
  end # Escape
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module TTY
4
4
  class Table
@@ -1,6 +1,6 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'verse'
3
+ require "strings"
4
4
 
5
5
  module TTY
6
6
  class Table
@@ -11,9 +11,7 @@ module TTY
11
11
  class Padding
12
12
  # Initialize a Padding operation
13
13
  #
14
- # @param [Verse::Padder] padding
15
- #
16
- # @param [Array[Integer]] widths
14
+ # @param [Strings::Padder] padding
17
15
  #
18
16
  # @api public
19
17
  def initialize(padding)
@@ -25,17 +23,11 @@ module TTY
25
23
  # @param [TTY::Table::Field] field
26
24
  # the table field
27
25
  #
28
- # @param [Integer] row
29
- # the field row index
30
- #
31
- # @param [Integer] col
32
- # the field column index
33
- #
34
26
  # @return [TTY::Table::Field]
35
27
  #
36
28
  # @api public
37
29
  def call(field, *)
38
- Verse.pad(field.content, padding)
30
+ Strings.pad(field.content, padding)
39
31
  end
40
32
 
41
33
  protected
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'verse'
3
+ require "strings"
4
4
 
5
5
  module TTY
6
6
  class Table
@@ -34,8 +34,8 @@ module TTY
34
34
  #
35
35
  # @api public
36
36
  def call(field, row, col)
37
- width = widths[col] || field.width
38
- Verse.truncate(field.content, width)
37
+ column_width = widths[col] || field.width
38
+ Strings.truncate(field.content, column_width)
39
39
  end
40
40
  end # Truncation
41
41
  end # Operation
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'verse'
3
+ require "strings"
4
4
 
5
5
  module TTY
6
6
  class Table
@@ -33,8 +33,8 @@ module TTY
33
33
  #
34
34
  # @api public
35
35
  def call(field, row, col)
36
- width = widths[col] || field.width
37
- Verse.wrap(field.content, width)
36
+ column_width = widths[col] || field.width
37
+ Strings.wrap(field.content, column_width)
38
38
  end
39
39
  end # Wrapped
40
40
  end # Operation
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module TTY
4
4
  class Table
@@ -8,14 +8,8 @@ module TTY
8
8
  class Operations
9
9
  # Initialize Operations
10
10
  #
11
- # @param [TTY::Table] table
12
- # the table to perform operations on
13
- #
14
- # @return [Object]
15
- #
16
11
  # @api public
17
- def initialize(table)
18
- @table = table
12
+ def initialize
19
13
  @operations = Hash.new { |hash, key| hash[key] = [] }
20
14
  end
21
15
 
@@ -55,14 +49,14 @@ module TTY
55
49
  # @return [TTY::Table]
56
50
  #
57
51
  # @api public
58
- def run_operations(*args)
52
+ def apply_to(table, *args)
59
53
  operation_types = args
60
54
  table.data.each_with_index do |row, row_i|
61
55
  row.fields.each_with_index do |field, col_i|
62
56
  field.reset!
63
57
  operation_types.each do |type|
64
58
  operations[type].each do |operation|
65
- field.content = operation.call(field, row_i, col_i)
59
+ field.content = operation.(field, row_i, col_i)
66
60
  end
67
61
  end
68
62
  end
@@ -71,11 +65,6 @@ module TTY
71
65
 
72
66
  protected
73
67
 
74
- # The table
75
- #
76
- # @api private
77
- attr_reader :table
78
-
79
68
  # Available operations
80
69
  #
81
70
  # @return [Hash]
@@ -1,10 +1,9 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'delegate'
3
+ require "delegate"
4
4
 
5
5
  module TTY
6
6
  class Table
7
-
8
7
  # Structure for holding table options with indifferent access
9
8
  class Options < DelegateClass(Hash)
10
9
 
@@ -25,6 +24,5 @@ module TTY
25
24
  end
26
25
 
27
26
  end # Options
28
-
29
27
  end # Table
30
28
  end # TTY
@@ -1,7 +1,7 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'tty/table/orientation/horizontal'
4
- require 'tty/table/orientation/vertical'
3
+ require_relative "orientation/horizontal"
4
+ require_relative "orientation/vertical"
5
5
 
6
6
  module TTY
7
7
  class Table
@@ -33,8 +33,8 @@ module TTY
33
33
  when /v|ert(ical)?/i
34
34
  Vertical.new :vertical
35
35
  else
36
- fail InvalidOrientationError,
37
- 'orientation must be one of :horizontal, :vertical'
36
+ raise InvalidOrientationError,
37
+ "orientation must be one of :horizontal, :vertical"
38
38
  end
39
39
  end
40
40
 
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module TTY
4
4
  class Table
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module TTY
4
4
  class Table
@@ -1,17 +1,18 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'tty/table/renderer/basic'
4
- require 'tty/table/renderer/ascii'
5
- require 'tty/table/renderer/unicode'
3
+ require_relative "error"
4
+ require_relative "renderer/basic"
5
+ require_relative "renderer/ascii"
6
+ require_relative "renderer/unicode"
6
7
 
7
8
  module TTY
8
9
  class Table
9
- # A class responsible for rendering tabular data
10
+ # A module responsible for selecting tabule data renderer
10
11
  #
11
12
  # Used internally by {Table} to render table content out.
12
13
  #
13
14
  # @api private
14
- class Renderer
15
+ module Renderer
15
16
  RENDERER_MAPPER = {
16
17
  ascii: TTY::Table::Renderer::ASCII,
17
18
  basic: TTY::Table::Renderer::Basic,
@@ -20,18 +21,19 @@ module TTY
20
21
 
21
22
  # Select renderer class based on string name.
22
23
  #
23
- # The possible values for renderer are
24
+ # The possible values for type are
24
25
  # [:basic, :ascii, :unicode]
25
26
  #
26
- # @param [Symbol] renderer
27
- # the renderer used for displaying table
27
+ # @param [Symbol] type
28
+ # the renderer type used for displaying table
28
29
  #
29
30
  # @return [TTY::Table::Renderer]
30
31
  #
31
32
  # @api private
32
- def self.select(type)
33
+ def select(type)
33
34
  RENDERER_MAPPER[type || :basic]
34
35
  end
36
+ module_function :select
35
37
 
36
38
  # Raises an error if provided border class is of wrong type or has invalid
37
39
  # implementation
@@ -43,17 +45,38 @@ module TTY
43
45
  # raised when border class does not implement core methods
44
46
  #
45
47
  # @api public
46
- def self.assert_border_class(border_class)
48
+ def assert_border_class(border_class)
47
49
  return unless border_class
48
50
  unless border_class <= TTY::Table::Border
49
- fail TypeError,
50
- "#{border_class} should inherit from TTY::Table::Border"
51
+ raise TypeError,
52
+ "#{border_class} should inherit from TTY::Table::Border"
51
53
  end
52
54
  unless border_class.characters
53
- fail NoImplementationError,
54
- "#{border_class} should implement def_border"
55
+ raise NoImplementationError,
56
+ "#{border_class} should implement def_border"
55
57
  end
56
58
  end
59
+ module_function :assert_border_class
60
+
61
+ # Render a given table and return the string representation.
62
+ #
63
+ # @param [TTY::Table] table
64
+ # the table to be rendered
65
+ #
66
+ # @param [Hash] options
67
+ # the options to render the table with
68
+ # @option options [String] :renderer
69
+ # used to format table output
70
+ #
71
+ # @return [String]
72
+ #
73
+ # @api public
74
+ def render(table, options = {}, &block)
75
+ renderer = select(options[:renderer]).new(table, options)
76
+ yield renderer if block_given?
77
+ renderer.render
78
+ end
79
+ module_function :render
57
80
 
58
81
  # Add custom border for the renderer
59
82
  #
@@ -70,30 +93,12 @@ module TTY
70
93
  # raise if the klass does not implement def_border
71
94
  #
72
95
  # @api public
73
- def self.render_with(border_class, table, options = {}, &block)
96
+ def render_with(border_class, table, options = {}, &block)
74
97
  assert_border_class(border_class)
75
98
  options[:border_class] = border_class if border_class
76
99
  render(table, options, &block)
77
100
  end
78
-
79
- # Render a given table and return the string representation.
80
- #
81
- # @param [TTY::Table] table
82
- # the table to be rendered
83
- #
84
- # @param [Hash] options
85
- # the options to render the table with
86
- # @option options [String] :renderer
87
- # used to format table output
88
- #
89
- # @return [String]
90
- #
91
- # @api public
92
- def self.render(table, options = {}, &block)
93
- renderer = select(options[:renderer]).new(table, options)
94
- yield renderer if block_given?
95
- renderer.render
96
- end
101
+ module_function :render_with
97
102
  end # Renderer
98
103
  end # Table
99
104
  end # TTY
@@ -1,11 +1,11 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'tty/table/border/ascii'
4
- require 'tty/table/renderer/basic'
3
+ require_relative "../border/ascii"
4
+ require_relative "../renderer/basic"
5
5
 
6
6
  module TTY
7
7
  class Table
8
- class Renderer
8
+ module Renderer
9
9
  class ASCII < Basic
10
10
  # Create ASCII renderer
11
11
  #
@@ -1,28 +1,27 @@
1
- # encoding: utf-8
2
-
3
- require 'tty-screen'
4
- require 'verse'
5
-
6
- require 'tty/table/alignment_set'
7
- require 'tty/table/border_dsl'
8
- require 'tty/table/border_options'
9
- require 'tty/table/border/null'
10
- require 'tty/table/column_constraint'
11
- require 'tty/table/column_set'
12
- require 'tty/table/header'
13
- require 'tty/table/indentation'
14
- require 'tty/table/operations'
15
- require 'tty/table/operation/alignment'
16
- require 'tty/table/operation/truncation'
17
- require 'tty/table/operation/wrapped'
18
- require 'tty/table/operation/filter'
19
- require 'tty/table/operation/escape'
20
- require 'tty/table/operation/padding'
21
- require 'tty/table/validatable'
1
+ # frozen_string_literal: true
2
+
3
+ require "strings"
4
+ require "tty-screen"
5
+
6
+ require_relative "../alignment_set"
7
+ require_relative "../border_dsl"
8
+ require_relative "../border/null"
9
+ require_relative "../column_constraint"
10
+ require_relative "../columns"
11
+ require_relative "../header"
12
+ require_relative "../indentation"
13
+ require_relative "../operations"
14
+ require_relative "../operation/alignment"
15
+ require_relative "../operation/truncation"
16
+ require_relative "../operation/wrapped"
17
+ require_relative "../operation/filter"
18
+ require_relative "../operation/escape"
19
+ require_relative "../operation/padding"
20
+ require_relative "../validatable"
22
21
 
23
22
  module TTY
24
23
  class Table
25
- class Renderer
24
+ module Renderer
26
25
  # Renders table without any border styles.
27
26
  #
28
27
  # @api private
@@ -70,7 +69,7 @@ module TTY
70
69
  # @api public
71
70
  attr_reader :indent
72
71
 
73
- # The table totabl width
72
+ # The table total width
74
73
  #
75
74
  # @return [Integer]
76
75
  #
@@ -113,16 +112,19 @@ module TTY
113
112
  def initialize(table, options = {})
114
113
  @table = assert_table_type(table)
115
114
  @multiline = options.fetch(:multiline) { false }
116
- @border = TTY::Table::BorderOptions.from(options.delete(:border))
115
+ @border = BorderDSL.new(options.delete(:border)).options
116
+ unless @table.separators.empty?
117
+ @border.separator ||= @table.separators
118
+ end
117
119
  @column_widths = options.fetch(:column_widths, nil)
118
120
  alignment = Array(options[:alignment]) * table.columns_size
119
- @alignments = TTY::Table::AlignmentSet.new(options[:alignments] || alignment)
121
+ @alignments = AlignmentSet.new(options[:alignments] || alignment)
120
122
  @filter = options.fetch(:filter) { proc { |val, _| val } }
121
123
  @width = options.fetch(:width) { TTY::Screen.width }
122
124
  @border_class = options.fetch(:border_class) { Border::Null }
123
125
  @indent = options.fetch(:indent) { 0 }
124
126
  @resize = options.fetch(:resize) { false }
125
- @padding = Verse::Padder.parse(options[:padding])
127
+ @padding = Strings::Padder.parse(options[:padding])
126
128
  end
127
129
 
128
130
  # Parses supplied column widths, if not present
@@ -132,7 +134,7 @@ module TTY
132
134
  #
133
135
  # @api public
134
136
  def column_widths
135
- @column_widths = ColumnSet.widths_from(table, @column_widths)
137
+ @column_widths = Columns.widths_from(table, @column_widths)
136
138
  end
137
139
 
138
140
  # Store border characters, style and separator for the table rendering
@@ -143,17 +145,13 @@ module TTY
143
145
  # block representing border options
144
146
  #
145
147
  # @api public
146
- def border(options=(not_set=true), &block)
147
- @border = TTY::Table::BorderOptions.new unless @border
148
- if block_given?
149
- border_dsl = TTY::Table::BorderDSL.new(&block)
150
- @border = border_dsl.options
151
- elsif !not_set
152
- @border = TTY::Table::BorderOptions.from(options)
153
- end
154
- @border
148
+ def border(border_opts = (not_set = true), &block)
149
+ return @border if not_set && !block_given?
150
+
151
+ border_opts = {} if not_set
152
+ @border = BorderDSL.new(border_opts, &block).options
155
153
  end
156
- alias_method :border=, :border
154
+ alias border= border
157
155
 
158
156
  # Change the value of indentation
159
157
  #
@@ -162,7 +160,7 @@ module TTY
162
160
  #
163
161
  # @api public
164
162
  def indent=(value)
165
- @indentation.indentation = value
163
+ @indent = value
166
164
  end
167
165
 
168
166
  # Sets the output padding,
@@ -172,7 +170,7 @@ module TTY
172
170
  #
173
171
  # @api public
174
172
  def padding=(value)
175
- @padding = Verse::Padder.parse(value)
173
+ @padding = Strings::Padder.parse(value)
176
174
  end
177
175
 
178
176
  # Renders table as string with border
@@ -188,32 +186,48 @@ module TTY
188
186
  def render
189
187
  return if table.empty?
190
188
 
191
- @operations = TTY::Table::Operations.new(table)
192
- @operations.add(:escape, Operation::Escape.new)
193
- @operations.run_operations(:escape) unless multiline
189
+ operations = TTY::Table::Operations.new
190
+ operations.add(:escape, Operation::Escape.new)
191
+ operations.apply_to(table, :escape) unless multiline
192
+
194
193
  column_constraint = ColumnConstraint.new(table, self)
195
194
  @column_widths = column_constraint.enforce
196
- add_operations(@column_widths)
195
+ widths_without_padding = @column_widths.map do |_width|
196
+ _width - padding.left - padding.right
197
+ end
198
+ create_operations(widths_without_padding).each do |op|
199
+ operations.add(*op)
200
+ end
201
+ operations.apply_to(table, *select_operations)
202
+
203
+ render_data.compact.join("\n")
204
+ end
205
+
206
+ # Select applicable operations for this table
207
+ #
208
+ # @api private
209
+ def select_operations
197
210
  ops = []
198
211
  ops << :escape unless multiline
199
212
  ops << :alignment
200
213
  ops << (multiline ? :wrapping : :truncation)
201
214
  ops << :padding
202
215
  ops << :filter
203
- @operations.run_operations(*ops)
204
-
205
- render_data.compact.join("\n")
206
216
  end
207
217
 
208
- # Initialize and add operations
218
+ # Initialize operations
219
+ #
220
+ # @return [Array[String, Operation]]
209
221
  #
210
222
  # @api private
211
- def add_operations(widths)
212
- @operations.add(:alignment, Operation::Alignment.new(alignments, widths))
213
- @operations.add(:filter, Operation::Filter.new(filter))
214
- @operations.add(:truncation, Operation::Truncation.new(widths))
215
- @operations.add(:wrapping, Operation::Wrapped.new(widths))
216
- @operations.add(:padding, Operation::Padding.new(padding))
223
+ def create_operations(widths)
224
+ [
225
+ [:alignment, Operation::Alignment.new(alignments, widths)],
226
+ [:filter, Operation::Filter.new(filter)],
227
+ [:truncation, Operation::Truncation.new(widths)],
228
+ [:wrapping, Operation::Wrapped.new(widths)],
229
+ [:padding, Operation::Padding.new(padding)]
230
+ ]
217
231
  end
218
232
 
219
233
  protected
@@ -225,33 +239,17 @@ module TTY
225
239
  # @api public
226
240
  attr_reader :table
227
241
 
228
- # Initializes indentation
229
- #
230
- # @return [TTY::Table::Indentation]
231
- #
232
- # @api private
233
- def indentation
234
- @indentation ||= TTY::Table::Indentation.new(indent)
235
- end
236
-
237
- # Delegate indentation insertion
238
- #
239
- # @api public
240
- def insert_indent(line)
241
- indentation.indent(line)
242
- end
243
-
244
242
  # Render table data
245
243
  #
246
244
  # @api private
247
245
  def render_data
248
246
  first_row = table.first
249
- data_border = border_class.new(column_widths, padding, border)
247
+ data_border = border_class.new(column_widths, border)
250
248
  header = render_header(first_row, data_border)
251
249
  rows_with_border = render_rows(data_border)
252
250
  bottom_line = data_border.bottom_line
253
251
 
254
- insert_indent(bottom_line) if bottom_line
252
+ bottom_line = Indentation.indent(bottom_line, @indent) if bottom_line
255
253
 
256
254
  [header, rows_with_border, bottom_line].compact
257
255
  end
@@ -261,7 +259,7 @@ module TTY
261
259
  # @param [TTY::Table::Row, TTY::Table::Header] row
262
260
  # the first row in the table
263
261
  #
264
- # @param [TTY::Table::Border] data_boder
262
+ # @param [TTY::Table::Border] data_border
265
263
  # the border for this table
266
264
  #
267
265
  # @return [String]
@@ -269,17 +267,17 @@ module TTY
269
267
  # @api private
270
268
  def render_header(row, data_border)
271
269
  top_line = data_border.top_line
272
- if row.is_a?(TTY::Table::Header)
273
- header = [top_line, data_border.row_line(row), data_border.separator]
274
- insert_indent(header.compact)
275
- else
276
- top_line
270
+ return top_line unless row.is_a?(TTY::Table::Header)
271
+ header = [top_line, data_border.row_line(row)]
272
+ if !border.separator || border.separator?(0)
273
+ header << data_border.middle_line
277
274
  end
275
+ Indentation.indent(header.compact, @indent)
278
276
  end
279
277
 
280
278
  # Format the rows
281
279
  #
282
- # @param [TTY::Table::Border] data_boder
280
+ # @param [TTY::Table::Border] data_border
283
281
  # the border for this table
284
282
  #
285
283
  # @return [Arrays[String]]
@@ -288,8 +286,9 @@ module TTY
288
286
  def render_rows(data_border)
289
287
  rows = table.rows
290
288
  size = rows.size
289
+ offset = table.first.is_a?(TTY::Table::Header) ? 1 : 0
291
290
  rows.each_with_index.map do |row, index|
292
- render_row(row, data_border, size != (index += 1))
291
+ render_row(row, index+offset, data_border, size != (index + 1))
293
292
  end
294
293
  end
295
294
 
@@ -298,21 +297,19 @@ module TTY
298
297
  # @param [Array] row
299
298
  # a row to decorate
300
299
  #
301
- # @param [TTY::Table::Border] data_boder
300
+ # @param [TTY::Table::Border] data_border
302
301
  # the border for this table
303
302
  #
304
- # @param [Boolean] is_last_row
303
+ # @param [Boolean] is_not_last_row
305
304
  #
306
305
  # @api private
307
- def render_row(row, data_border, is_last_row)
308
- separator = data_border.separator
306
+ def render_row(row, index, data_border, is_not_last_row)
309
307
  row_line = data_border.row_line(row)
310
-
311
- if (border.separator == TTY::Table::Border::EACH_ROW) && is_last_row
312
- insert_indent([row_line, separator])
313
- else
314
- insert_indent(row_line)
308
+ line = [row_line]
309
+ if border.separator?(index) && is_not_last_row
310
+ line << data_border.middle_line
315
311
  end
312
+ Indentation.indent(line, @indent)
316
313
  end
317
314
  end # Basic
318
315
  end # Renderer