tty-table 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +104 -98
  5. data/lib/tty-table.rb +1 -1
  6. data/lib/tty/table.rb +70 -34
  7. data/lib/tty/table/alignment_set.rb +1 -3
  8. data/lib/tty/table/border.rb +50 -57
  9. data/lib/tty/table/border/ascii.rb +16 -16
  10. data/lib/tty/table/border/null.rb +19 -22
  11. data/lib/tty/table/border/row_line.rb +3 -2
  12. data/lib/tty/table/border/unicode.rb +16 -16
  13. data/lib/tty/table/border_dsl.rb +24 -22
  14. data/lib/tty/table/border_options.rb +32 -27
  15. data/lib/tty/table/column_constraint.rb +12 -9
  16. data/lib/tty/table/columns.rb +6 -6
  17. data/lib/tty/table/field.rb +46 -28
  18. data/lib/tty/table/header.rb +5 -5
  19. data/lib/tty/table/indentation.rb +7 -4
  20. data/lib/tty/table/operation/alignment.rb +1 -1
  21. data/lib/tty/table/operation/escape.rb +1 -2
  22. data/lib/tty/table/operation/padding.rb +1 -1
  23. data/lib/tty/table/operation/truncation.rb +1 -1
  24. data/lib/tty/table/operation/wrapped.rb +1 -1
  25. data/lib/tty/table/options.rb +1 -1
  26. data/lib/tty/table/orientation.rb +4 -4
  27. data/lib/tty/table/renderer.rb +8 -8
  28. data/lib/tty/table/renderer/ascii.rb +2 -2
  29. data/lib/tty/table/renderer/basic.rb +37 -40
  30. data/lib/tty/table/renderer/unicode.rb +1 -1
  31. data/lib/tty/table/row.rb +7 -7
  32. data/lib/tty/table/validatable.rb +23 -7
  33. data/lib/tty/table/version.rb +1 -1
  34. metadata +23 -272
  35. data/Rakefile +0 -10
  36. data/examples/alignment.rb +0 -10
  37. data/examples/basic.rb +0 -6
  38. data/examples/orientation.rb +0 -13
  39. data/examples/padding.rb +0 -15
  40. data/examples/resize.rb +0 -15
  41. data/spec/spec_helper.rb +0 -50
  42. data/spec/unit/access_spec.rb +0 -84
  43. data/spec/unit/add_row_spec.rb +0 -26
  44. data/spec/unit/alignment_set/each_spec.rb +0 -15
  45. data/spec/unit/alignment_set/new_spec.rb +0 -25
  46. data/spec/unit/alignment_set/to_ary_spec.rb +0 -12
  47. data/spec/unit/alignment_spec.rb +0 -69
  48. data/spec/unit/border/ascii/rendering_spec.rb +0 -88
  49. data/spec/unit/border/new_spec.rb +0 -25
  50. data/spec/unit/border/null/rendering_spec.rb +0 -128
  51. data/spec/unit/border/options/from_spec.rb +0 -36
  52. data/spec/unit/border/options/new_spec.rb +0 -12
  53. data/spec/unit/border/unicode/rendering_spec.rb +0 -61
  54. data/spec/unit/border_options/new_spec.rb +0 -18
  55. data/spec/unit/border_options/update_spec.rb +0 -16
  56. data/spec/unit/column_constraint/enforce_spec.rb +0 -68
  57. data/spec/unit/column_constraint/widths_spec.rb +0 -33
  58. data/spec/unit/columns/extract_widths_spec.rb +0 -41
  59. data/spec/unit/columns/total_width_spec.rb +0 -11
  60. data/spec/unit/columns/widths_from_spec.rb +0 -49
  61. data/spec/unit/data_spec.rb +0 -10
  62. data/spec/unit/each_spec.rb +0 -24
  63. data/spec/unit/each_with_index_spec.rb +0 -49
  64. data/spec/unit/empty_spec.rb +0 -21
  65. data/spec/unit/eql_spec.rb +0 -32
  66. data/spec/unit/field/equality_spec.rb +0 -49
  67. data/spec/unit/field/length_spec.rb +0 -33
  68. data/spec/unit/field/lines_spec.rb +0 -19
  69. data/spec/unit/field/new_spec.rb +0 -27
  70. data/spec/unit/field/width_spec.rb +0 -21
  71. data/spec/unit/filter_spec.rb +0 -20
  72. data/spec/unit/header/call_spec.rb +0 -28
  73. data/spec/unit/header/color_spec.rb +0 -17
  74. data/spec/unit/header/equality_spec.rb +0 -49
  75. data/spec/unit/header/height_spec.rb +0 -25
  76. data/spec/unit/header/new_spec.rb +0 -13
  77. data/spec/unit/header/set_spec.rb +0 -18
  78. data/spec/unit/header/to_ary_spec.rb +0 -12
  79. data/spec/unit/header_spec.rb +0 -11
  80. data/spec/unit/indentation/indent_spec.rb +0 -15
  81. data/spec/unit/new_spec.rb +0 -71
  82. data/spec/unit/operation/alignment/call_spec.rb +0 -37
  83. data/spec/unit/operation/escape/call_spec.rb +0 -13
  84. data/spec/unit/operation/filter/call_spec.rb +0 -14
  85. data/spec/unit/operation/truncation/call_spec.rb +0 -28
  86. data/spec/unit/operation/wrapped/call_spec.rb +0 -38
  87. data/spec/unit/operations/new_spec.rb +0 -28
  88. data/spec/unit/options/access_spec.rb +0 -12
  89. data/spec/unit/options_spec.rb +0 -23
  90. data/spec/unit/orientation_spec.rb +0 -143
  91. data/spec/unit/padding_spec.rb +0 -115
  92. data/spec/unit/properties_spec.rb +0 -23
  93. data/spec/unit/render_repeat_spec.rb +0 -39
  94. data/spec/unit/render_spec.rb +0 -61
  95. data/spec/unit/render_with_spec.rb +0 -104
  96. data/spec/unit/renderer/ascii/coloring_spec.rb +0 -83
  97. data/spec/unit/renderer/ascii/indentation_spec.rb +0 -39
  98. data/spec/unit/renderer/ascii/multiline_spec.rb +0 -99
  99. data/spec/unit/renderer/ascii/padding_spec.rb +0 -115
  100. data/spec/unit/renderer/ascii/render_spec.rb +0 -66
  101. data/spec/unit/renderer/ascii/resizing_spec.rb +0 -112
  102. data/spec/unit/renderer/ascii/separator_spec.rb +0 -38
  103. data/spec/unit/renderer/basic/alignment_spec.rb +0 -86
  104. data/spec/unit/renderer/basic/coloring_spec.rb +0 -59
  105. data/spec/unit/renderer/basic/extract_column_widths_spec.rb +0 -26
  106. data/spec/unit/renderer/basic/filter_spec.rb +0 -51
  107. data/spec/unit/renderer/basic/indentation_spec.rb +0 -46
  108. data/spec/unit/renderer/basic/multiline_spec.rb +0 -72
  109. data/spec/unit/renderer/basic/new_spec.rb +0 -24
  110. data/spec/unit/renderer/basic/options_spec.rb +0 -50
  111. data/spec/unit/renderer/basic/padding_spec.rb +0 -74
  112. data/spec/unit/renderer/basic/render_spec.rb +0 -55
  113. data/spec/unit/renderer/basic/resizing_spec.rb +0 -94
  114. data/spec/unit/renderer/basic/separator_spec.rb +0 -41
  115. data/spec/unit/renderer/basic/single_row_separator_spec.rb +0 -80
  116. data/spec/unit/renderer/basic/truncation_spec.rb +0 -33
  117. data/spec/unit/renderer/basic/wrapping_spec.rb +0 -38
  118. data/spec/unit/renderer/border_spec.rb +0 -102
  119. data/spec/unit/renderer/render_spec.rb +0 -34
  120. data/spec/unit/renderer/select_spec.rb +0 -20
  121. data/spec/unit/renderer/unicode/coloring_spec.rb +0 -68
  122. data/spec/unit/renderer/unicode/indentation_spec.rb +0 -39
  123. data/spec/unit/renderer/unicode/padding_spec.rb +0 -59
  124. data/spec/unit/renderer/unicode/render_spec.rb +0 -66
  125. data/spec/unit/renderer/unicode/separator_spec.rb +0 -36
  126. data/spec/unit/renderer_spec.rb +0 -17
  127. data/spec/unit/rotate_spec.rb +0 -84
  128. data/spec/unit/row/access_spec.rb +0 -23
  129. data/spec/unit/row/call_spec.rb +0 -43
  130. data/spec/unit/row/data_spec.rb +0 -24
  131. data/spec/unit/row/each_spec.rb +0 -29
  132. data/spec/unit/row/equality_spec.rb +0 -71
  133. data/spec/unit/row/height_spec.rb +0 -25
  134. data/spec/unit/row/new_spec.rb +0 -39
  135. data/spec/unit/row/to_ary_spec.rb +0 -12
  136. data/spec/unit/to_s_spec.rb +0 -56
  137. data/spec/unit/transformation/extract_tuples_spec.rb +0 -33
  138. data/spec/unit/utf_spec.rb +0 -31
  139. data/spec/unit/validatable/validate_options_spec.rb +0 -31
  140. data/spec/unit/validatable_spec.rb +0 -30
  141. data/tasks/console.rake +0 -11
  142. data/tasks/coverage.rake +0 -11
  143. data/tasks/spec.rake +0 -29
  144. data/tty-table.gemspec +0 -41
@@ -9,8 +9,9 @@ module TTY
9
9
  #
10
10
  # @api public
11
11
  def colorize(border, style)
12
- colorized_chars = border.set_color(style, right, center, left)
13
- self.right, self.center, self.left = colorized_chars
12
+ self.right = border.set_color(style, right)
13
+ self.center = border.set_color(style, center)
14
+ self.left = border.set_color(style, left)
14
15
  end
15
16
  end # RowLine
16
17
  end # Border
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../border'
3
+ require_relative "../border"
4
4
 
5
5
  module TTY
6
6
  class Table
@@ -11,21 +11,21 @@ module TTY
11
11
  class Unicode < Border
12
12
 
13
13
  def_border do
14
- top ''
15
- top_mid ''
16
- top_left ''
17
- top_right ''
18
- bottom ''
19
- bottom_mid ''
20
- bottom_left ''
21
- bottom_right ''
22
- mid ''
23
- mid_mid ''
24
- mid_left ''
25
- mid_right ''
26
- left ''
27
- center ''
28
- right ''
14
+ top ""
15
+ top_mid ""
16
+ top_left ""
17
+ top_right ""
18
+ bottom ""
19
+ bottom_mid ""
20
+ bottom_left ""
21
+ bottom_right ""
22
+ mid ""
23
+ mid_mid ""
24
+ mid_left ""
25
+ mid_right ""
26
+ left ""
27
+ center ""
28
+ right ""
29
29
  end
30
30
 
31
31
  end # Unicode
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
3
+ require "forwardable"
4
4
 
5
- require_relative 'border_options'
5
+ require_relative "border_options"
6
6
 
7
7
  module TTY
8
8
  class Table
@@ -29,9 +29,8 @@ module TTY
29
29
  # @return [undefined]
30
30
  #
31
31
  # @api private
32
- def initialize(characters = nil, &block)
33
- @options = TTY::Table::BorderOptions.new
34
- @options.characters = characters if characters
32
+ def initialize(border_opts = nil, &block)
33
+ @options = TTY::Table::BorderOptions.from(border_opts)
35
34
  yield_or_eval(&block) if block_given?
36
35
  end
37
36
 
@@ -45,6 +44,7 @@ module TTY
45
44
  # @api public
46
45
  def style(value = (not_set = true))
47
46
  return options.style if not_set
47
+
48
48
  options.style = value
49
49
  end
50
50
 
@@ -56,8 +56,10 @@ module TTY
56
56
  # @return [undefined]
57
57
  #
58
58
  # @api public
59
- def separator(value)
60
- value ? options.separator = value : options.separator
59
+ def separator(value = (not_set = true))
60
+ return options.separator if not_set
61
+
62
+ options.separator = value
61
63
  end
62
64
 
63
65
  # Set top border character
@@ -69,7 +71,7 @@ module TTY
69
71
  #
70
72
  # @api public
71
73
  def top(value)
72
- options.characters['top'] = value
74
+ characters["top"] = value
73
75
  end
74
76
 
75
77
  # Set top middle border character
@@ -81,7 +83,7 @@ module TTY
81
83
  #
82
84
  # @api public
83
85
  def top_mid(value)
84
- options.characters['top_mid'] = value
86
+ characters["top_mid"] = value
85
87
  end
86
88
 
87
89
  # Set top left corner border character
@@ -93,7 +95,7 @@ module TTY
93
95
  #
94
96
  # @api public
95
97
  def top_left(value)
96
- options.characters['top_left'] = value
98
+ characters["top_left"] = value
97
99
  end
98
100
 
99
101
  # Set top right corner border character
@@ -105,7 +107,7 @@ module TTY
105
107
  #
106
108
  # @api public
107
109
  def top_right(value)
108
- options.characters['top_right'] = value
110
+ characters["top_right"] = value
109
111
  end
110
112
 
111
113
  # Set bottom border character
@@ -117,7 +119,7 @@ module TTY
117
119
  #
118
120
  # @api public
119
121
  def bottom(value)
120
- options.characters['bottom'] = value
122
+ characters["bottom"] = value
121
123
  end
122
124
 
123
125
  # Set bottom middle border character
@@ -129,7 +131,7 @@ module TTY
129
131
  #
130
132
  # @api public
131
133
  def bottom_mid(value)
132
- options.characters['bottom_mid'] = value
134
+ characters["bottom_mid"] = value
133
135
  end
134
136
 
135
137
  # Set bottom left corner border character
@@ -141,7 +143,7 @@ module TTY
141
143
  #
142
144
  # @api public
143
145
  def bottom_left(value)
144
- options.characters['bottom_left'] = value
146
+ characters["bottom_left"] = value
145
147
  end
146
148
 
147
149
  # Set bottom right corner border character
@@ -153,7 +155,7 @@ module TTY
153
155
  #
154
156
  # @api public
155
157
  def bottom_right(value)
156
- options.characters['bottom_right'] = value
158
+ characters["bottom_right"] = value
157
159
  end
158
160
 
159
161
  # Set middle border character
@@ -165,7 +167,7 @@ module TTY
165
167
  #
166
168
  # @api public
167
169
  def mid(value)
168
- options.characters['mid'] = value
170
+ characters["mid"] = value
169
171
  end
170
172
 
171
173
  # Set middle border character
@@ -177,7 +179,7 @@ module TTY
177
179
  #
178
180
  # @api public
179
181
  def mid_mid(value)
180
- options.characters['mid_mid'] = value
182
+ characters["mid_mid"] = value
181
183
  end
182
184
 
183
185
  # Set middle left corner border character
@@ -189,7 +191,7 @@ module TTY
189
191
  #
190
192
  # @api public
191
193
  def mid_left(value)
192
- options.characters['mid_left'] = value
194
+ characters["mid_left"] = value
193
195
  end
194
196
 
195
197
  # Set middle right corner border character
@@ -201,7 +203,7 @@ module TTY
201
203
  #
202
204
  # @api public
203
205
  def mid_right(value)
204
- options.characters['mid_right'] = value
206
+ characters["mid_right"] = value
205
207
  end
206
208
 
207
209
  # Set left border character
@@ -213,7 +215,7 @@ module TTY
213
215
  #
214
216
  # @api public
215
217
  def left(value)
216
- options.characters['left'] = value
218
+ characters["left"] = value
217
219
  end
218
220
 
219
221
  # Set center border character
@@ -225,7 +227,7 @@ module TTY
225
227
  #
226
228
  # @api public
227
229
  def center(value)
228
- options.characters['center'] = value
230
+ characters["center"] = value
229
231
  end
230
232
 
231
233
  # Set right border character
@@ -237,7 +239,7 @@ module TTY
237
239
  #
238
240
  # @api public
239
241
  def right(value)
240
- options.characters['right'] = value
242
+ characters["right"] = value
241
243
  end
242
244
 
243
245
  private
@@ -7,49 +7,54 @@ module TTY
7
7
  # Used internally by {Table::Border} to manage options such as style
8
8
  #
9
9
  # @api private
10
- class BorderOptions < Struct.new(:characters, :separator, :style)
11
- # Initialize a BorderOptions
12
- #
13
- # @api public
14
- def initialize(*args)
15
- super(*args)
16
- self.characters = {} unless characters
17
- end
18
-
10
+ class BorderOptions
19
11
  # Create options instance from hash
20
12
  #
21
13
  # @api public
22
- def self.from(value)
23
- value ? new.update(value) : new
14
+ def self.from(options)
15
+ return new if options.nil?
16
+
17
+ opts = case options
18
+ when self.class
19
+ options.to_hash
20
+ else
21
+ options
22
+ end
23
+ new(**opts)
24
24
  end
25
25
 
26
- # Set all accessors with hash attributes
27
- #
28
- # @param [Hash, BorderOptions] obj
26
+ attr_accessor :characters
27
+
28
+ attr_accessor :separator
29
+
30
+ attr_accessor :style
31
+
32
+ # Initialize a BorderOptions
29
33
  #
30
- # @return [BorderOptions]
34
+ # @param [String] style
35
+ # the style like :red
36
+ # @param [String] separator
37
+ # the separator character
38
+ # @param [Hash] characters
39
+ # the border characters
31
40
  #
32
41
  # @api public
33
- def update(obj)
34
- obj.each_pair do |key, value|
35
- send("#{key}=", value)
36
- end
37
- self
42
+ def initialize(characters: {}, separator: nil, style: nil)
43
+ @characters = characters
44
+ @separator = separator
45
+ @style = style
38
46
  end
39
47
 
40
48
  # Convert to hash
41
49
  #
50
+ # @return [Hash]
51
+ #
42
52
  # @api public
43
53
  def to_hash
44
- hash = {}
45
- members.each do |key|
46
- value = send(key)
47
- hash[key.to_sym] = value if value
48
- end
49
- hash
54
+ { characters: characters, separator: separator, style: style }
50
55
  end
51
56
 
52
- # return true if there should be a separator AFTER this line
57
+ # Check if there should be a separator AFTER this line
53
58
  #
54
59
  # @param [Integer] line
55
60
  #
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'border/null'
4
- require_relative 'columns'
5
- require_relative 'error'
3
+ require_relative "border/null"
4
+ require_relative "columns"
5
+ require_relative "error"
6
6
 
7
7
  module TTY
8
8
  class Table
@@ -111,9 +111,8 @@ module TTY
111
111
  #
112
112
  # @api private
113
113
  def rotate
114
- Kernel.warn 'The table size exceeds the currently set width.' \
115
- 'To avoid error either. Defaulting to vertical ' \
116
- 'orientation.'
114
+ Kernel.warn "The table size exceeds the currently set width." \
115
+ "Defaulting to vertical orientation."
117
116
  table.orientation = :vertical
118
117
  table.rotate
119
118
  Columns.widths_from(table)
@@ -141,7 +140,11 @@ module TTY
141
140
  ratio = ((natural_width - renderer.width) / column_size.to_f).ceil
142
141
 
143
142
  widths = (0...column_size).reduce([]) do |lengths, col|
144
- lengths + [renderer.column_widths[col] - ratio]
143
+ width = (renderer.column_widths[col] - ratio)
144
+ # basically ruby 2.4 Numeric#clamp
145
+ width = width < minimum_width ? minimum_width : width
146
+ width = width > renderer.width ? renderer.width : width
147
+ lengths << width
145
148
  end
146
149
  distribute_extra_width(widths)
147
150
  end
@@ -154,8 +157,8 @@ module TTY
154
157
  def assert_minimum_width
155
158
  width = renderer.width
156
159
  return unless width <= minimum_width
157
- fail ResizeError, "Table's width is too small to contain the content " \
158
- "(min width #{minimum_width}, currently set #{width})"
160
+ raise ResizeError, "Table's width is too small to contain the content " \
161
+ "(min width #{minimum_width}, currently set #{width})"
159
162
  end
160
163
 
161
164
  # Distribute remaining width to meet the total width requirement.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'error'
3
+ require_relative "error"
4
4
 
5
5
  module TTY
6
6
  class Table
@@ -69,7 +69,7 @@ module TTY
69
69
  when NilClass
70
70
  extract_widths(table.data)
71
71
  else
72
- fail TypeError, 'Invalid type for column widths'
72
+ raise TypeError, "Invalid type for column widths"
73
73
  end
74
74
  end
75
75
  module_function :widths_from
@@ -85,12 +85,12 @@ module TTY
85
85
  # @api public
86
86
  def assert_widths(column_widths, table_widths)
87
87
  if column_widths.empty?
88
- fail InvalidArgument, 'Value for :column_widths must be ' \
89
- 'a non-empty array'
88
+ raise InvalidArgument, "Value for :column_widths must be " \
89
+ "a non-empty array"
90
90
  end
91
91
  if column_widths.size != table_widths
92
- fail InvalidArgument, 'Value for :column_widths must match ' \
93
- 'table column count'
92
+ raise InvalidArgument, "Value for :column_widths must match " \
93
+ "table column count"
94
94
  end
95
95
  end
96
96
  module_function :assert_widths
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'equatable'
4
- require 'pastel'
5
- require 'strings'
3
+ require "strings"
6
4
 
7
5
  module TTY
8
6
  class Table
@@ -13,32 +11,15 @@ module TTY
13
11
  #
14
12
  # @api private
15
13
  class Field
16
- include Equatable
17
-
18
14
  # The value inside the field
19
15
  #
20
16
  # @api public
21
- attr_reader :value
17
+ attr_accessor :value
22
18
 
23
19
  # The formatted value inside the field used for display
24
20
  #
25
21
  # @api public
26
- attr_reader :content
27
-
28
- # The name for the value
29
- #
30
- # @api public
31
- attr_reader :name
32
-
33
- # The actual value
34
- #
35
- # @api public
36
- attr_writer :value
37
-
38
- # The formatted string
39
- #
40
- # @api public
41
- attr_writer :content
22
+ attr_accessor :content
42
23
 
43
24
  # Number of columns this field spans. Defaults to 1.
44
25
  #
@@ -58,15 +39,15 @@ module TTY
58
39
  # Initialize a Field
59
40
  #
60
41
  # @example
61
- # field = TTY::Table::Field.new 'a1'
42
+ # field = TTY::Table::Field.new "a1"
62
43
  # field.value # => a1
63
44
  #
64
45
  # @example
65
- # field = TTY::Table::Field.new value: 'a1'
46
+ # field = TTY::Table::Field.new value: "a1"
66
47
  # field.value # => a1
67
48
  #
68
49
  # @example
69
- # field = TTY::Table::Field.new value: 'a1', alignment: :center
50
+ # field = TTY::Table::Field.new value: "a1", alignment: :center
70
51
  # field.value # => a1
71
52
  # field.alignment # => :center
72
53
  #
@@ -75,9 +56,9 @@ module TTY
75
56
  @value, options = extract_options(value)
76
57
  @content = @value.to_s
77
58
  @width = options[:width]
78
- @alignment = options.fetch(:alignment) { nil }
79
- @colspan = options.fetch(:colspan) { 1 }
80
- @rowspan = options.fetch(:rowspan) { 1 }
59
+ @alignment = options.fetch(:alignment, nil)
60
+ @colspan = options.fetch(:colspan, 1)
61
+ @rowspan = options.fetch(:rowspan, 1)
81
62
  end
82
63
 
83
64
  # Extract options and set value
@@ -152,6 +133,43 @@ module TTY
152
133
  def to_s
153
134
  content
154
135
  end
136
+
137
+ # Compare fields for equality of value attribute
138
+ #
139
+ # @return [Boolean]
140
+ #
141
+ # @api public
142
+ def eql?(other)
143
+ instance_of?(other.class) && value.eql?(other.value)
144
+ end
145
+
146
+ # Compare fields for equivalence of value attribute
147
+ #
148
+ # @return [Boolean]
149
+ #
150
+ # @api public
151
+ def ==(other)
152
+ other.is_a?(self.class) && value == other.value
153
+ end
154
+
155
+ # Inspect this instance attributes
156
+ #
157
+ # @return [String]
158
+ #
159
+ # @api public
160
+ def inspect
161
+ "#<#{self.class.name} value=#{value.inspect} " \
162
+ "rowspan=#{rowspan.inspect} colspan=#{colspan.inspect}>"
163
+ end
164
+
165
+ # Hash for this instance and its attributes
166
+ #
167
+ # @return [Numeric]
168
+ #
169
+ # @api public
170
+ def hash
171
+ [self.class, value].hash
172
+ end
155
173
  end # Field
156
174
  end # Table
157
175
  end # TTY