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,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