tty 0.1.2 → 0.1.3

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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -3
  3. data/CHANGELOG.md +5 -0
  4. data/README.md +42 -306
  5. data/lib/tty/{text → shell}/distance.rb +5 -27
  6. data/lib/tty/shell/suggestion.rb +42 -22
  7. data/lib/tty/version.rb +1 -1
  8. data/lib/tty.rb +2 -42
  9. data/spec/tty/{text → shell}/distance/distance_spec.rb +4 -4
  10. data/spec/tty/shell/distance/initialize_spec.rb +14 -0
  11. data/tty.gemspec +4 -3
  12. metadata +37 -269
  13. data/benchmarks/table.rb +0 -40
  14. data/lib/tty/table/border/ascii.rb +0 -32
  15. data/lib/tty/table/border/null.rb +0 -37
  16. data/lib/tty/table/border/row_line.rb +0 -18
  17. data/lib/tty/table/border/unicode.rb +0 -32
  18. data/lib/tty/table/border.rb +0 -222
  19. data/lib/tty/table/border_dsl.rb +0 -251
  20. data/lib/tty/table/border_options.rb +0 -53
  21. data/lib/tty/table/column_set.rb +0 -121
  22. data/lib/tty/table/columns.rb +0 -170
  23. data/lib/tty/table/error.rb +0 -18
  24. data/lib/tty/table/field.rb +0 -139
  25. data/lib/tty/table/header.rb +0 -133
  26. data/lib/tty/table/indentation.rb +0 -52
  27. data/lib/tty/table/operation/alignment.rb +0 -107
  28. data/lib/tty/table/operation/alignment_set.rb +0 -77
  29. data/lib/tty/table/operation/escape.rb +0 -30
  30. data/lib/tty/table/operation/filter.rb +0 -34
  31. data/lib/tty/table/operation/padding.rb +0 -95
  32. data/lib/tty/table/operation/truncation.rb +0 -55
  33. data/lib/tty/table/operation/wrapped.rb +0 -58
  34. data/lib/tty/table/operations.rb +0 -69
  35. data/lib/tty/table/orientation/horizontal.rb +0 -48
  36. data/lib/tty/table/orientation/vertical.rb +0 -38
  37. data/lib/tty/table/orientation.rb +0 -57
  38. data/lib/tty/table/padder.rb +0 -180
  39. data/lib/tty/table/renderer/ascii.rb +0 -16
  40. data/lib/tty/table/renderer/basic.rb +0 -294
  41. data/lib/tty/table/renderer/color.rb +0 -12
  42. data/lib/tty/table/renderer/unicode.rb +0 -21
  43. data/lib/tty/table/renderer.rb +0 -101
  44. data/lib/tty/table/row.rb +0 -217
  45. data/lib/tty/table/transformation.rb +0 -39
  46. data/lib/tty/table/validatable.rb +0 -64
  47. data/lib/tty/table.rb +0 -476
  48. data/lib/tty/text/truncation.rb +0 -99
  49. data/lib/tty/text/wrapping.rb +0 -118
  50. data/lib/tty/text.rb +0 -98
  51. data/spec/tty/table/access_spec.rb +0 -86
  52. data/spec/tty/table/add_row_spec.rb +0 -28
  53. data/spec/tty/table/border/ascii/rendering_spec.rb +0 -90
  54. data/spec/tty/table/border/new_spec.rb +0 -27
  55. data/spec/tty/table/border/null/rendering_spec.rb +0 -130
  56. data/spec/tty/table/border/options/from_spec.rb +0 -38
  57. data/spec/tty/table/border/options/new_spec.rb +0 -14
  58. data/spec/tty/table/border/unicode/rendering_spec.rb +0 -63
  59. data/spec/tty/table/border_options/new_spec.rb +0 -20
  60. data/spec/tty/table/border_options/update_spec.rb +0 -18
  61. data/spec/tty/table/column_set/extract_widths_spec.rb +0 -15
  62. data/spec/tty/table/column_set/total_width_spec.rb +0 -15
  63. data/spec/tty/table/column_set/widths_from_spec.rb +0 -51
  64. data/spec/tty/table/columns/enforce_spec.rb +0 -68
  65. data/spec/tty/table/columns/widths_spec.rb +0 -35
  66. data/spec/tty/table/data_spec.rb +0 -14
  67. data/spec/tty/table/each_spec.rb +0 -41
  68. data/spec/tty/table/each_with_index_spec.rb +0 -57
  69. data/spec/tty/table/empty_spec.rb +0 -23
  70. data/spec/tty/table/eql_spec.rb +0 -34
  71. data/spec/tty/table/field/equality_spec.rb +0 -51
  72. data/spec/tty/table/field/length_spec.rb +0 -21
  73. data/spec/tty/table/field/lines_spec.rb +0 -21
  74. data/spec/tty/table/field/new_spec.rb +0 -29
  75. data/spec/tty/table/field/width_spec.rb +0 -23
  76. data/spec/tty/table/filter_spec.rb +0 -23
  77. data/spec/tty/table/header/call_spec.rb +0 -30
  78. data/spec/tty/table/header/height_spec.rb +0 -27
  79. data/spec/tty/table/header/new_spec.rb +0 -25
  80. data/spec/tty/table/header/set_spec.rb +0 -20
  81. data/spec/tty/table/header/to_ary_spec.rb +0 -14
  82. data/spec/tty/table/header_spec.rb +0 -13
  83. data/spec/tty/table/indentation/insert_indent_spec.rb +0 -27
  84. data/spec/tty/table/initialize_spec.rb +0 -88
  85. data/spec/tty/table/operation/alignment/format_spec.rb +0 -47
  86. data/spec/tty/table/operation/alignment/new_spec.rb +0 -31
  87. data/spec/tty/table/operation/alignment_set/call_spec.rb +0 -39
  88. data/spec/tty/table/operation/alignment_set/each_spec.rb +0 -17
  89. data/spec/tty/table/operation/alignment_set/new_spec.rb +0 -27
  90. data/spec/tty/table/operation/alignment_set/to_ary_spec.rb +0 -14
  91. data/spec/tty/table/operation/escape/call_spec.rb +0 -16
  92. data/spec/tty/table/operation/filter/call_spec.rb +0 -17
  93. data/spec/tty/table/operation/truncation/call_spec.rb +0 -32
  94. data/spec/tty/table/operation/truncation/truncate_spec.rb +0 -22
  95. data/spec/tty/table/operation/wrapped/call_spec.rb +0 -33
  96. data/spec/tty/table/operation/wrapped/wrap_spec.rb +0 -23
  97. data/spec/tty/table/operations/new_spec.rb +0 -30
  98. data/spec/tty/table/options_spec.rb +0 -25
  99. data/spec/tty/table/orientation_spec.rb +0 -145
  100. data/spec/tty/table/padder/parse_spec.rb +0 -45
  101. data/spec/tty/table/padder/to_s_spec.rb +0 -14
  102. data/spec/tty/table/padding_spec.rb +0 -120
  103. data/spec/tty/table/properties_spec.rb +0 -25
  104. data/spec/tty/table/render_spec.rb +0 -63
  105. data/spec/tty/table/render_with_spec.rb +0 -106
  106. data/spec/tty/table/renderer/ascii/indentation_spec.rb +0 -41
  107. data/spec/tty/table/renderer/ascii/padding_spec.rb +0 -61
  108. data/spec/tty/table/renderer/ascii/render_spec.rb +0 -68
  109. data/spec/tty/table/renderer/ascii/resizing_spec.rb +0 -114
  110. data/spec/tty/table/renderer/ascii/separator_spec.rb +0 -28
  111. data/spec/tty/table/renderer/basic/alignment_spec.rb +0 -88
  112. data/spec/tty/table/renderer/basic/coloring_spec.rb +0 -46
  113. data/spec/tty/table/renderer/basic/extract_column_widths_spec.rb +0 -28
  114. data/spec/tty/table/renderer/basic/filter_spec.rb +0 -53
  115. data/spec/tty/table/renderer/basic/indentation_spec.rb +0 -48
  116. data/spec/tty/table/renderer/basic/multiline_content_spec.rb +0 -135
  117. data/spec/tty/table/renderer/basic/new_spec.rb +0 -22
  118. data/spec/tty/table/renderer/basic/options_spec.rb +0 -48
  119. data/spec/tty/table/renderer/basic/padding_spec.rb +0 -52
  120. data/spec/tty/table/renderer/basic/render_spec.rb +0 -57
  121. data/spec/tty/table/renderer/basic/resizing_spec.rb +0 -96
  122. data/spec/tty/table/renderer/basic/separator_spec.rb +0 -43
  123. data/spec/tty/table/renderer/basic/truncation_spec.rb +0 -35
  124. data/spec/tty/table/renderer/basic/wrapping_spec.rb +0 -40
  125. data/spec/tty/table/renderer/basic_spec.rb +0 -0
  126. data/spec/tty/table/renderer/border_spec.rb +0 -104
  127. data/spec/tty/table/renderer/render_spec.rb +0 -36
  128. data/spec/tty/table/renderer/select_spec.rb +0 -22
  129. data/spec/tty/table/renderer/style_spec.rb +0 -72
  130. data/spec/tty/table/renderer/unicode/indentation_spec.rb +0 -41
  131. data/spec/tty/table/renderer/unicode/padding_spec.rb +0 -61
  132. data/spec/tty/table/renderer/unicode/render_spec.rb +0 -68
  133. data/spec/tty/table/renderer/unicode/separator_spec.rb +0 -26
  134. data/spec/tty/table/renderer_spec.rb +0 -19
  135. data/spec/tty/table/rotate_spec.rb +0 -86
  136. data/spec/tty/table/row/access_spec.rb +0 -25
  137. data/spec/tty/table/row/call_spec.rb +0 -41
  138. data/spec/tty/table/row/data_spec.rb +0 -26
  139. data/spec/tty/table/row/each_spec.rb +0 -31
  140. data/spec/tty/table/row/equality_spec.rb +0 -73
  141. data/spec/tty/table/row/height_spec.rb +0 -27
  142. data/spec/tty/table/row/new_spec.rb +0 -41
  143. data/spec/tty/table/row/to_ary_spec.rb +0 -14
  144. data/spec/tty/table/to_s_spec.rb +0 -63
  145. data/spec/tty/table/transformation/extract_tuples_spec.rb +0 -35
  146. data/spec/tty/table/validatable/validate_options_spec.rb +0 -33
  147. data/spec/tty/table/validatable_spec.rb +0 -32
  148. data/spec/tty/text/distance/initialize_spec.rb +0 -14
  149. data/spec/tty/text/distance_spec.rb +0 -11
  150. data/spec/tty/text/truncate_spec.rb +0 -12
  151. data/spec/tty/text/truncation/initialize_spec.rb +0 -29
  152. data/spec/tty/text/truncation/truncate_spec.rb +0 -94
  153. data/spec/tty/text/wrap_spec.rb +0 -13
  154. data/spec/tty/text/wrapping/initialize_spec.rb +0 -25
  155. data/spec/tty/text/wrapping/wrap_spec.rb +0 -97
@@ -1,170 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Table
5
- # A class responsible for enforcing column constraints.
6
- #
7
- # Used internally by {Renderer::Basic} to enforce correct column widths.
8
- #
9
- # @api private
10
- class Columns
11
-
12
- attr_reader :table
13
-
14
- attr_reader :renderer
15
-
16
- MIN_WIDTH = 1
17
-
18
- BORDER_WIDTH = 1
19
-
20
- # Initialize a Columns
21
- #
22
- # @param [TTY::Table::Renderer] renderer
23
- #
24
- # @api public
25
- def initialize(renderer)
26
- @renderer = renderer
27
- @table = renderer.table
28
- end
29
-
30
- # Estimate outside border size
31
- #
32
- # @return [Integer]
33
- #
34
- # @api public
35
- def outside_border_size
36
- renderer.border_class == TTY::Table::Border::Null ? 0 : 2
37
- end
38
-
39
- # Total border size
40
- #
41
- # @return [Integer]
42
- #
43
- # @api public
44
- def border_size
45
- BORDER_WIDTH * (table.column_size - 1) + outside_border_size
46
- end
47
-
48
- # Estimate minimum table width to be able to display content
49
- #
50
- # @return [Integer]
51
- #
52
- # @api public
53
- def minimum_width
54
- table.column_size * MIN_WIDTH + border_size
55
- end
56
-
57
- # Return column's natural unconstrained widths
58
- #
59
- # @return [Integer]
60
- #
61
- # @api public
62
- def natural_width
63
- renderer.column_widths.inject(0, &:+) + border_size
64
- end
65
-
66
- # Return the constrained column widths.
67
- #
68
- # Account for table field widths and any user defined
69
- # constraints on the table width.
70
- #
71
- # @api public
72
- def enforce
73
- assert_minimum_width
74
-
75
- unless renderer.padding.empty?
76
- renderer.column_widths = adjust_padding
77
- end
78
-
79
- if natural_width <= renderer.width
80
- renderer.column_widths = expand if renderer.resize
81
- else
82
- if renderer.resize
83
- renderer.column_widths = shrink
84
- else
85
- rotate
86
- renderer.column_widths = ColumnSet.widths_from(table)
87
- end
88
- end
89
- end
90
-
91
- # Adjust column widths to account for padding whitespace
92
- #
93
- # @api private
94
- def adjust_padding
95
- padding = renderer.padding
96
- column_size = table.column_size
97
-
98
- (0...column_size).reduce([]) do |lengths, col|
99
- lengths + [padding.left + renderer.column_widths[col] + padding.right]
100
- end
101
- end
102
-
103
- # Rotate table to vertical orientation and print information to stdout
104
- #
105
- # @api private
106
- def rotate
107
- TTY.shell.warn 'The table size exceeds the currently set width.' \
108
- 'To avoid error either. Defaulting to vertical ' \
109
- 'orientation.'
110
- table.orientation = :vertical
111
- table.rotate
112
- end
113
-
114
- # Expand column widths to match the requested width
115
- #
116
- # @api private
117
- def expand
118
- column_size = table.column_size
119
- ratio = ((renderer.width - natural_width) / column_size.to_f).floor
120
-
121
- widths = (0...column_size).reduce([]) do |lengths, col|
122
- lengths + [renderer.column_widths[col] + ratio]
123
- end
124
- distribute_extra_width(widths)
125
- end
126
-
127
- # Shrink column widths to match the requested width
128
- #
129
- # @api private
130
- def shrink
131
- column_size = table.column_size
132
- ratio = ((natural_width - renderer.width) / column_size.to_f).ceil
133
-
134
- widths = (0...column_size).reduce([]) do |lengths, col|
135
- lengths + [renderer.column_widths[col] - ratio]
136
- end
137
- distribute_extra_width(widths)
138
- end
139
-
140
- # Assert minimum width for the table content
141
- #
142
- # @raise [TTY::ResizeError]
143
- #
144
- # @api private
145
- def assert_minimum_width
146
- width = renderer.width
147
- return unless width <= minimum_width
148
- fail ResizeError, "Table's width is too small to contain the content " \
149
- "(min width #{minimum_width}, currently set #{width})"
150
- end
151
-
152
- # Distribute remaining width to meet the total width requirement.
153
- #
154
- # @param [Array[Integer]] widths
155
- #
156
- # @api private
157
- def distribute_extra_width(widths)
158
- column_size = table.column_size
159
- extra_width = renderer.width - (widths.reduce(:+) + border_size)
160
- per_field_width = extra_width / column_size
161
- remaining_width = extra_width % column_size
162
- extra = [1] * remaining_width + [0] * (column_size - remaining_width)
163
-
164
- widths.map.with_index do |width, index|
165
- width + per_field_width + extra[index]
166
- end
167
- end
168
- end # Columns
169
- end # Table
170
- end # TTY
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Table
5
- # Raised when inserting into table with a mismatching row(s)
6
- class DimensionMismatchError < ArgumentError; end
7
-
8
- # Raised when reading non-existent element from a table
9
- class TupleMissing < IndexError
10
- attr_reader :i, :j
11
-
12
- def initialize(i, j)
13
- @i, @j = i, j
14
- super("element at(#{i},#{j}) not found")
15
- end
16
- end
17
- end # Table
18
- end # TTY
@@ -1,139 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Table
5
- # A class that represents a unique element in a table.
6
- #
7
- # Used internally by {Table::Row} to define internal structure.
8
- #
9
- # @api private
10
- class Field
11
- include Equatable
12
-
13
- # The value inside the field
14
- #
15
- # @api public
16
- attr_reader :value
17
-
18
- # The name for the value
19
- #
20
- # @api public
21
- attr_reader :name
22
-
23
- # TODO: Change to :content to separate value from formatted string
24
- attr_writer :value
25
-
26
- # The field value width
27
- #
28
- # @api public
29
- attr_reader :width
30
-
31
- # Number of columns this field spans. Defaults to 1.
32
- #
33
- attr_reader :colspan
34
-
35
- # Number of rows this field spans. Defaults to 1.
36
- #
37
- attr_reader :rowspan
38
-
39
- attr_reader :align
40
-
41
- # Initialize a Field
42
- #
43
- # @example
44
- # field = TTY::Table::Field.new 'a1'
45
- # field.value # => a1
46
- #
47
- # @example
48
- # field = TTY::Table::Field.new value: 'a1'
49
- # field.value # => a1
50
- #
51
- # @example
52
- # field = TTY::Table::Field.new value: 'a1', align: :center
53
- # field.value # => a1
54
- # field.align # => :center
55
- #
56
- # @api private
57
- def initialize(value)
58
- options = extract_options(value)
59
- @width = options.fetch(:width) { @value.to_s.size }
60
- @align = options.fetch(:align) { nil }
61
- @colspan = options.fetch(:colspan) { 1 }
62
- @rowspan = options.fetch(:rowspan) { 1 }
63
- end
64
-
65
- # Extract options and set value
66
- #
67
- # @api private
68
- def extract_options(value)
69
- if value.class <= Hash
70
- options = value
71
- @value = options.fetch(:value)
72
- else
73
- @value = value
74
- options = {}
75
- end
76
- options
77
- end
78
-
79
- # Return the width this field would normally have bar other contraints
80
- #
81
- # @api public
82
- def value_width
83
- @width
84
- end
85
-
86
- def value_height
87
- @height
88
- end
89
-
90
- # Return number of lines this value spans.
91
- #
92
- # A distinction is being made between escaped and non-escaped strings.
93
- #
94
- # @return [Array[String]]
95
- #
96
- # @api public
97
- def lines
98
- escaped = value.to_s.scan(/(\\n|\\t|\\r)/)
99
- escaped.empty? ? value.to_s.split(/\n/, -1) : [value.to_s]
100
- end
101
-
102
- # If the string contains unescaped new lines then the longest token
103
- # deterimines the actual field length.
104
- #
105
- # @return [Integer]
106
- #
107
- # @api public
108
- def length
109
- (lines.max_by(&:length) || '').size
110
- end
111
-
112
- # Extract the number of lines this value spans
113
- #
114
- # @return [Integer]
115
- #
116
- # @api public
117
- def height
118
- lines.size
119
- end
120
-
121
- def chars
122
- value.chars
123
- end
124
-
125
- # Render value inside this field box
126
- #
127
- # @api public
128
- def render
129
- end
130
-
131
- # Return field value
132
- #
133
- # @api public
134
- def to_s
135
- value
136
- end
137
- end # Field
138
- end # Table
139
- end # TTY
@@ -1,133 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'tty/vector'
4
- require 'forwardable'
5
-
6
- module TTY
7
- class Table
8
- # Convert an Array row into Header
9
- #
10
- # @return [TTY::Table::Header]
11
- #
12
- # @api private
13
- def to_header(row)
14
- Header.new(row)
15
- end
16
-
17
- # A set of header elements that correspond to values in each row
18
- class Header < Vector
19
- include Equatable
20
- extend Forwardable
21
-
22
- def_delegators :@attributes, :join, :map, :map!
23
-
24
- # The header attributes
25
- #
26
- # @return [Array]
27
- #
28
- # @api private
29
- attr_reader :attributes
30
- alias :fields :attributes
31
-
32
- # Initialize a Header
33
- #
34
- # @return [undefined]
35
- #
36
- # @api public
37
- def initialize(attributes = [])
38
- @attributes = attributes.map { |attr| to_field(attr) }
39
- @attribute_for = Hash[@attributes.each_with_index.map.to_a]
40
- end
41
-
42
- # Instantiates a new field
43
- #
44
- # @param [String,Hash] attribute
45
- # the attribute value to convert to field object
46
- #
47
- # @api public
48
- def to_field(attribute = nil)
49
- Field.new(attribute)
50
- end
51
-
52
- # Lookup a column in the header given a name
53
- #
54
- # @param [Integer, String] attribute
55
- # the attribute to look up by
56
- #
57
- # @api public
58
- def [](attribute)
59
- case attribute
60
- when Integer
61
- @attributes[attribute].value
62
- else
63
- @attribute_for.fetch(to_field(attribute)) do |header_name|
64
- fail UnknownAttributeError,
65
- "the header '#{header_name.value}' is unknown"
66
- end
67
- end
68
- end
69
-
70
- # Lookup attribute without evaluation
71
- #
72
- # @api public
73
- def call(attribute)
74
- @attributes[attribute]
75
- end
76
-
77
- # Set value at index
78
- #
79
- # @example
80
- # header[attribute] = value
81
- #
82
- # @api public
83
- def []=(attribute, value)
84
- attributes[attribute] = to_field(value)
85
- end
86
-
87
- # Size of the header
88
- #
89
- # @return [Integer]
90
- #
91
- # @api public
92
- def size
93
- to_ary.size
94
- end
95
- alias :length :size
96
-
97
- # Find maximum header height
98
- #
99
- # @return [Integer]
100
- #
101
- # @api public
102
- def height
103
- attributes.map { |field| field.height }.max
104
- end
105
-
106
- # Convert the Header into an Array
107
- #
108
- # @return [Array]
109
- #
110
- # @api public
111
- def to_ary
112
- attributes.map { |attr| attr.value if attr }
113
- end
114
-
115
- # Check if this header is equivalent to another header
116
- #
117
- # @return [Boolean]
118
- #
119
- # @api public
120
- def ==(other)
121
- to_a == other.to_a
122
- end
123
- alias :eql? :==
124
-
125
- # Provide an unique hash value
126
- #
127
- # @api public
128
- def to_hash
129
- to_a.hash
130
- end
131
- end # Header
132
- end # Table
133
- end # TTY
@@ -1,52 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Table
5
- # A class responsible for indenting table representation
6
- class Indentation
7
-
8
- attr_reader :renderer
9
-
10
- # Initialize an Indentation
11
- #
12
- # @api public
13
- def initialize(renderer)
14
- @renderer = renderer
15
- end
16
-
17
- # Create indentation
18
- #
19
- # @api public
20
- def indentation
21
- ' ' * renderer.indent
22
- end
23
-
24
- # Return a table part with indentation inserted
25
- #
26
- # @param [#map, #to_s] part
27
- # the rendered table part
28
- #
29
- # @api public
30
- def insert_indent(part)
31
- if part.respond_to?(:to_a)
32
- part.map { |line| insert_indentation(line) }
33
- else
34
- insert_indentation(part)
35
- end
36
- end
37
-
38
- private
39
-
40
- # Insert indentation into a table renderd line
41
- #
42
- # @param [#to_a, #to_s] line
43
- # the rendered table line
44
- #
45
- # @api public
46
- def insert_indentation(line)
47
- line = line.is_a?(Array) ? line[0] : line
48
- line.insert(0, indentation) if line
49
- end
50
- end # Indentation
51
- end # Table
52
- end # TTY
@@ -1,107 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Table
5
- module Operation
6
- # A class representing an alignment of cell data.
7
- #
8
- # @api private
9
- class Alignment
10
- include TTY::Coercion
11
-
12
- LEFT = :left.freeze
13
-
14
- RIGHT = :right.freeze
15
-
16
- CENTER = :center.freeze
17
-
18
- # Hold the type of alignment
19
- #
20
- # @api private
21
- attr_reader :type
22
-
23
- # Initialize an Alignment
24
- #
25
- # @return [self]
26
- #
27
- # @raise [TypeError]
28
- # raise if the alignment is not supported type
29
- #
30
- # @api private
31
- def initialize(type = nil)
32
- @type = coerce_to((type || LEFT), Symbol, :to_sym)
33
- assert_valid_type
34
- end
35
-
36
- # Assert the type is valid
37
- #
38
- # @return [undefined]
39
- #
40
- # @raise [TypeError]
41
- # raise if the alignment is not supported type
42
- #
43
- # @api private
44
- def assert_valid_type
45
- return if supported.include?(type)
46
- fail TypeError, "Alignment must be one of: #{supported.join(' ')}"
47
- end
48
-
49
- # List supported alignment types
50
- #
51
- # @return [Array]
52
- # valid alignments
53
- #
54
- # @api private
55
- def supported
56
- [LEFT, RIGHT, CENTER]
57
- end
58
-
59
- # Format field with a given alignment
60
- #
61
- # @param [Object] field
62
- #
63
- # @param [Integer] column_width
64
- #
65
- # @param [String] space
66
- #
67
- # @return [String] aligned
68
- #
69
- # @api public
70
- def format(field, column_width, space = '')
71
- case type
72
- when :left
73
- "%-#{column_width}s#{space}" % field.to_s
74
- when :right
75
- "%#{column_width}s#{space}" % field.to_s
76
- when :center
77
- center_align field, column_width, space
78
- end
79
- end
80
-
81
- private
82
-
83
- # Center aligns field
84
- #
85
- # @param [Object] field
86
- #
87
- # @param [Integer] column_width
88
- #
89
- # @param [String] space
90
- #
91
- # @return [String] aligned
92
- #
93
- # @api private
94
- def center_align(field, column_width, space)
95
- chars = field.to_s.chars.to_a
96
- if column_width >= chars.size
97
- right = ((pad_length = column_width - chars.length).to_f / 2).ceil
98
- left = pad_length - right
99
- [' ' * left, field, ' ' * right, space].join
100
- else
101
- "#{field}#{space}"
102
- end
103
- end
104
- end # Alignment
105
- end # Operation
106
- end # Table
107
- end # TTY
@@ -1,77 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Table
5
- module Operation
6
- # A class which responsiblity is to align table rows and header.
7
- class AlignmentSet < Vector
8
-
9
- attr_reader :widths
10
-
11
- # Initialize an AlignmentSet
12
- #
13
- # @api private
14
- def initialize(aligns, widths = nil)
15
- @converter = Necromancer.new
16
- @elements = @converter.convert(aligns).to(:array)
17
- @widths = widths
18
- end
19
-
20
- # Lookup an alignment by index
21
- #
22
- # @param [Integer]
23
- #
24
- # @return [Symbol] alignment
25
- #
26
- # @api public
27
- def [](index)
28
- elements.fetch(index, :left)
29
- end
30
-
31
- # Return each alignment in an Array
32
- #
33
- # @return [Array]
34
- #
35
- # @api private
36
- def alignments
37
- map { |alignment| alignment }
38
- end
39
-
40
- # Evaluate alignment of the provided row
41
- #
42
- # @param [Array] row
43
- # the table row
44
- # @param [Hash] options
45
- # the table options
46
- #
47
- # @return [TTY::Table::Field]
48
- #
49
- # @api public
50
- def call(field, row, col)
51
- align_field(field, col)
52
- end
53
-
54
- private
55
-
56
- # Align each field in a row
57
- #
58
- # @param [TTY::Table::Field] field
59
- # the table field
60
- #
61
- # @param [Integer] col
62
- # the table column index
63
- #
64
- # @param [Hash] options
65
- #
66
- # @return [TTY::Table::Field]
67
- #
68
- # @api private
69
- def align_field(field, col)
70
- column_width = widths[col]
71
- alignment = Alignment.new(field.align || self[col])
72
- field.value = alignment.format(field, column_width)
73
- end
74
- end # AlignmentSet
75
- end # Operation
76
- end # Table
77
- end # TTY