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,23 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Field, '#width' do
6
- let(:object) { described_class }
7
-
8
- let(:instance) { object.new(value) }
9
-
10
- subject { instance.width }
11
-
12
- context 'with only value' do
13
- let(:value) { 'foo' }
14
-
15
- it { is_expected.to eql(3) }
16
- end
17
-
18
- context 'with hash value' do
19
- let(:value) { "foo\nbaar" }
20
-
21
- it { is_expected.to eql(7) }
22
- end
23
- end
@@ -1,22 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table, '#filter' do
6
- let(:header) { ['h1', 'h2', 'h3'] }
7
- let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
-
9
- subject(:table) { described_class.new(header, rows) }
10
-
11
- it 'filters fields' do
12
- expect(table.render do |renderer|
13
- renderer.filter = proc do |val, row, col|
14
- (col == 1 && row > 0) ? val.capitalize : val
15
- end
16
- end).to eq unindent(<<-EOS)
17
- h1 h2 h3
18
- a1 A2 a3
19
- b1 B2 b3
20
- EOS
21
- end
22
- end
@@ -1,30 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Header, '#call' do
6
- let(:object) { described_class.new(attributes) }
7
- let(:attributes) { [:id, :name, :age] }
8
-
9
- subject { object[attribute] }
10
-
11
- context 'with a known attribute' do
12
- context 'when symbol' do
13
- let(:attribute) { :age }
14
-
15
- it { is_expected.to eq(2) }
16
- end
17
-
18
- context 'when integer' do
19
- let(:attribute) { 1 }
20
-
21
- it { is_expected.to eq(:name) }
22
- end
23
- end
24
-
25
- context 'with an unknown attribute' do
26
- let(:attribute) { :mine }
27
-
28
- it { expect { subject }.to raise_error(TTY::Table::UnknownAttributeError, "the header 'mine' is unknown")}
29
- end
30
- end
@@ -1,19 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Header, 'color' do
6
-
7
- context 'when default' do
8
-
9
- end
10
-
11
- context 'when ascii' do
12
- let(:renderer) { :ascii }
13
- let(:red) { "\e[31m" }
14
- let(:clear) { "\e[0m" }
15
-
16
- xit 'renders header background in color' do
17
- end
18
- end
19
- end
@@ -1,51 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Header, '#==' do
6
- let(:attributes) { [:id, :name] }
7
- let(:object) { described_class.new(attributes) }
8
-
9
- subject { object == other }
10
-
11
- context 'with the same object' do
12
- let(:other) { object }
13
-
14
- it { is_expected.to eql(true) }
15
-
16
- it 'is symmetric' do
17
- is_expected.to eql(other == object)
18
- end
19
- end
20
-
21
- context 'with an equivalent object' do
22
- let(:other) { object.dup }
23
-
24
- it { is_expected.to eql(true) }
25
-
26
- it 'is symmetric' do
27
- is_expected.to eql(other == object)
28
- end
29
- end
30
-
31
- context 'with an equivalent object of subclass' do
32
- let(:other) { Class.new(described_class).new(attributes) }
33
-
34
- it { is_expected.to eql(true) }
35
-
36
- it 'is symmetric' do
37
- is_expected.to eql(other == object)
38
- end
39
- end
40
-
41
- context 'with an object having different attributes' do
42
- let(:other_attributes) { [:text] }
43
- let(:other) { described_class.new(other_attributes) }
44
-
45
- it { is_expected.to eql(false) }
46
-
47
- it 'is symmetric' do
48
- is_expected.to eql(other == object)
49
- end
50
- end
51
- end
@@ -1,27 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Header, '#height' do
6
- let(:object) { described_class.new header }
7
-
8
- subject { object.height }
9
-
10
- context 'single row' do
11
- let(:header) { ['h1', 'h1'] }
12
-
13
- it { expect(subject).to eql(1) }
14
- end
15
-
16
- context 'non escaped multiline' do
17
- let(:header) { ["h1\nh1\nh1", 'h2'] }
18
-
19
- it { expect(subject).to eql(3)}
20
- end
21
-
22
- context 'escaped multiline' do
23
- let(:header) { ["h1\\h1\\h1", 'h2'] }
24
-
25
- it { expect(subject).to eql(1) }
26
- end
27
- end
@@ -1,16 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Header, '#new' do
6
-
7
- it "is empty without arguments" do
8
- header = TTY::Table::Header.new
9
- expect(header).to be_empty
10
- end
11
-
12
- it "isn't empty with attributes" do
13
- header = TTY::Table::Header.new [:id, :name, :age]
14
- expect(header.to_a).to eq([:id, :name, :age])
15
- end
16
- end
@@ -1,20 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Header, '#set' do
6
- let(:object) { described_class }
7
- let(:attributes) { [:id, :name, :age] }
8
-
9
- subject(:header) { object.new }
10
-
11
- it 'sets the value' do
12
- header[0] = :id
13
- expect(header[0]).to eql(:id)
14
- end
15
-
16
- it 'gets the value' do
17
- head = object.new [{value: :id}]
18
- expect(head[0]).to eq(:id)
19
- end
20
- end
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Header, '#to_ary' do
6
- let(:object) { described_class.new(attributes) }
7
- let(:attributes) { [:id, :name, :age] }
8
-
9
- subject { object.to_ary }
10
-
11
- it { is_expected.to be_instance_of(Array) }
12
-
13
- it { is_expected.to eq(attributes) }
14
- end
@@ -1,13 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table, '#header' do
6
- let(:header) { [:header1, :header2] }
7
- let(:rows) { [['a1', 'a2'], ['b1', 'b2']] }
8
- let(:object) { described_class }
9
-
10
- subject(:table) { object.new header, rows }
11
-
12
- it { expect(table.header).to be_instance_of(TTY::Table::Header) }
13
- end
@@ -1,21 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Indentation, '.indent' do
6
- let(:indent) { 2 }
7
-
8
- subject(:indentation) { described_class.new(indent) }
9
-
10
- context 'when enumerable' do
11
- it 'inserts indentation for each element' do
12
- expect(indentation.indent(['line1'])).to eql([' line1'])
13
- end
14
- end
15
-
16
- context 'when string' do
17
- it 'inserts indentation' do
18
- expect(indentation.indent('line1')).to eql(' line1')
19
- end
20
- end
21
- end
@@ -1,73 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table, '#new' do
6
- it { is_expected.to be_kind_of(Enumerable) }
7
-
8
- it { is_expected.to be_kind_of(Comparable) }
9
-
10
- context 'with rows only' do
11
- it 'allows hash like syntax for rows' do
12
- table = TTY::Table[['a1','a2'], ['b1', 'b2']]
13
- expect(table.to_a).to eql([['a1','a2'], ['b1', 'b2']])
14
- end
15
-
16
- it 'allows for array' do
17
- table = TTY::Table.new [['a1','a2'], ['b1','b2']]
18
- expect(table.to_a).to eql([['a1','a2'], ['b1','b2']])
19
- end
20
-
21
- it 'allows for :rows key' do
22
- table = TTY::Table.new rows: [['a1','a2'], ['b1','b2']]
23
- expect(table.to_a).to eql([['a1','a2'], ['b1','b2']])
24
- end
25
-
26
- it 'allows for rows in a block' do
27
- table = TTY::Table.new do |t|
28
- t << ['a1', 'a2']
29
- t << ['b1', 'b2']
30
- end
31
- expect(table.to_a).to eql([['a1','a2'],['b1','b2']])
32
- end
33
-
34
- it 'allows to add rows after initialization' do
35
- table = TTY::Table.new
36
- table << ['a1','a2']
37
- table << ['b1','b2']
38
- expect(table.to_a).to eql([['a1','a2'],['b1','b2']])
39
- end
40
-
41
- it 'allows for chaining rows' do
42
- table = TTY::Table.new
43
- table << ['a1','a2'] << ['b1','b2']
44
- expect(table.to_a).to eql([['a1','a2'],['b1','b2']])
45
- end
46
- end
47
-
48
- context 'with header and rows' do
49
- it 'permits header and rows' do
50
- table = TTY::Table.new ['h1','h2'], [['a1','a2'],['b1','b2']]
51
- expect(table.to_a).to eql([['h1','h2'], ['a1','a2'], ['b1','b2']])
52
- end
53
-
54
- it 'permits only header with :header key' do
55
- table = TTY::Table.new header: ['h1','h2']
56
- expect(table.to_a).to eql([['h1','h2']])
57
- end
58
- end
59
-
60
- context 'with header and rows as hash' do
61
- it 'permits header as key and rows as hash values' do
62
- table = TTY::Table.new [{'h1' => ['a1','a2'], 'h2' => ['b1','b2']}]
63
- expect(table.to_a).to eql([['h1','h2'], ['a1','a2'], ['b1','b2']])
64
- end
65
- end
66
-
67
- context 'coercion' do
68
- it 'converts row arguments from hash to array' do
69
- table = TTY::Table.new rows: {a: 1, b: 2}
70
- expect(table.to_a).to eql([[:a,1],[:b,2]])
71
- end
72
- end
73
- end
@@ -1,39 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Operation::Alignment, '#call' do
6
- let(:object) { described_class.new alignments, widths }
7
- let(:value) { 'a1' }
8
- let(:field) { TTY::Table::Field.new(value)}
9
-
10
- subject { object.call(field, 0, 0) }
11
-
12
- context 'aligned with column widths and no alignments' do
13
- let(:alignments) { [] }
14
- let(:widths) { [4, 4] }
15
-
16
- it { is_expected.to eq("#{value} ") }
17
- end
18
-
19
- context 'aligned with column widths and alignments' do
20
- let(:alignments) { [:right, :left] }
21
- let(:widths) { [4, 4] }
22
-
23
- it { is_expected.to eq(" #{value}") }
24
- end
25
-
26
- context 'aligned with no column widths and no alignments' do
27
- let(:alignments) { [] }
28
- let(:widths) { [] }
29
-
30
- it { is_expected.to eq("#{value}") }
31
- end
32
-
33
- context 'aligned with no column widths and alignments' do
34
- let(:alignments) { [:right, :left] }
35
- let(:widths) { [] }
36
-
37
- it { is_expected.to eq("#{value}") }
38
- end
39
- end
@@ -1,15 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Operation::Escape, '#call' do
6
- let(:object) { described_class }
7
- let(:text) { "太丸\nゴシ\tック体\r" }
8
- let(:field) { TTY::Table::Field.new(text) }
9
-
10
- subject(:operation) { object.new }
11
-
12
- it 'changes field value' do
13
- expect(operation.call(field, 0, 0)).to eql("太丸\\nゴシ\\tック体\\r")
14
- end
15
- end
@@ -1,16 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Operation::Filter, '#call' do
6
- let(:object) { described_class }
7
- let(:field) { TTY::Table::Field.new('a1') }
8
- let(:filter) { Proc.new { |val, row, col| 'new' } }
9
- let(:value) { 'new' }
10
-
11
- subject(:operation) { object.new(filter) }
12
-
13
- it 'changes field value' do
14
- expect(operation.call(field, 0, 0)).to eql(value)
15
- end
16
- end
@@ -1,30 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Table::Operation::Truncation, '#call' do
6
- let(:text) { '太丸ゴシック体' }
7
- let(:field) { TTY::Table::Field.new(text) }
8
-
9
- subject(:operation) { described_class.new(column_widths) }
10
-
11
- context 'without column width' do
12
- let(:column_widths) { [] }
13
-
14
- it "truncates string" do
15
- expect(operation.call(field, 0, 0)).to eql(text)
16
- end
17
- end
18
-
19
- context 'with column width ' do
20
- let(:column_widths) { [6, 8] }
21
-
22
- it "truncates string for 0 column" do
23
- expect(operation.call(field, 0, 0)).to eql('太丸…')
24
- end
25
-
26
- it "truncates string for 1 column" do
27
- expect(operation.call(field, 0, 1)).to eql('太丸ゴ…')
28
- end
29
- end
30
- end