tty 0.0.4 → 0.0.5

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 (35) hide show
  1. data/.travis.yml +1 -1
  2. data/README.md +19 -7
  3. data/lib/tty.rb +10 -0
  4. data/lib/tty/support/equatable.rb +1 -0
  5. data/lib/tty/support/unicode.rb +36 -0
  6. data/lib/tty/table.rb +3 -3
  7. data/lib/tty/table/border.rb +104 -0
  8. data/lib/tty/table/border/ascii.rb +41 -0
  9. data/lib/tty/table/border/null.rb +49 -0
  10. data/lib/tty/table/border/unicode.rb +41 -0
  11. data/lib/tty/table/column_set.rb +77 -0
  12. data/lib/tty/table/operation/alignment.rb +2 -0
  13. data/lib/tty/table/operation/alignment_set.rb +4 -58
  14. data/lib/tty/table/operation/truncation.rb +15 -19
  15. data/lib/tty/table/operation/wrapped.rb +34 -0
  16. data/lib/tty/table/renderer.rb +8 -11
  17. data/lib/tty/table/renderer/ascii.rb +15 -0
  18. data/lib/tty/table/renderer/basic.rb +21 -34
  19. data/lib/tty/table/renderer/unicode.rb +2 -2
  20. data/lib/tty/vector.rb +117 -0
  21. data/lib/tty/version.rb +1 -1
  22. data/spec/tty/table/border/ascii/rendering_spec.rb +49 -0
  23. data/spec/tty/table/border/new_spec.rb +21 -0
  24. data/spec/tty/table/border/null/rendering_spec.rb +49 -0
  25. data/spec/tty/table/border/unicode/rendering_spec.rb +49 -0
  26. data/spec/tty/table/column_set/extract_widths_spec.rb +26 -0
  27. data/spec/tty/table/operation/alignment_set/align_rows_spec.rb +4 -4
  28. data/spec/tty/table/operation/alignment_set/new_spec.rb +1 -1
  29. data/spec/tty/table/operation/wrapped/wrap_spec.rb +22 -0
  30. data/spec/tty/table/properties_spec.rb +3 -0
  31. data/spec/tty/table/renderer/basic/render_spec.rb +144 -33
  32. data/spec/tty/table/renderer/pick_renderer_spec.rb +25 -0
  33. data/spec/tty/table/to_s_spec.rb +51 -0
  34. data/spec/tty/vector/new_spec.rb +47 -0
  35. metadata +35 -8
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module TTY
4
- VERSION = "0.0.4"
4
+ VERSION = "0.0.5"
5
5
  end
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Border::ASCII, '#rendering' do
6
+
7
+ subject { described_class.new row }
8
+
9
+ context 'with empty row' do
10
+ let(:row) { [] }
11
+
12
+ it 'draws top line' do
13
+ subject.top_line.should == "++"
14
+ end
15
+
16
+ it 'draws middle line' do
17
+ subject.separator.should == "++"
18
+ end
19
+
20
+ it 'draw bottom line' do
21
+ subject.bottom_line.should == "++"
22
+ end
23
+
24
+ it 'draws row line' do
25
+ subject.row_line.should == "||"
26
+ end
27
+ end
28
+
29
+ context 'with row' do
30
+ let(:row) { ['a1', 'a2', 'a3'] }
31
+
32
+ it 'draws top line' do
33
+ subject.top_line.should == "+--+--+--+"
34
+ end
35
+
36
+ it 'draw middle line' do
37
+ subject.separator.should == "+--+--+--+"
38
+ end
39
+
40
+ it 'draw bottom line' do
41
+ subject.bottom_line.should == "+--+--+--+"
42
+ end
43
+
44
+ it 'draws row line' do
45
+ subject.row_line.should == "|a1|a2|a3|"
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Border, '#new' do
6
+ subject { klass.new }
7
+
8
+ context '' do
9
+ let(:klass) { described_class }
10
+
11
+ specify { expect {subject }.to raise_error(NotImplementedError) }
12
+ end
13
+
14
+ context '' do
15
+ let(:klass) { Class.new }
16
+
17
+ specify { expect {subject }.to_not raise_error(NotImplementedError) }
18
+
19
+ it { should be_instance_of klass }
20
+ end
21
+ end
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Border::Null, '#rendering' do
6
+
7
+ subject { described_class.new row }
8
+
9
+ context 'with empty row' do
10
+ let(:row) { [] }
11
+
12
+ it 'draws top line' do
13
+ subject.top_line.should be_nil
14
+ end
15
+
16
+ it 'draws middle line' do
17
+ subject.separator.should be_nil
18
+ end
19
+
20
+ it 'draw bottom line' do
21
+ subject.bottom_line.should be_nil
22
+ end
23
+
24
+ it 'draws row line' do
25
+ subject.row_line.should == ''
26
+ end
27
+ end
28
+
29
+ context 'with row' do
30
+ let(:row) { ['a1', 'a2', 'a3'] }
31
+
32
+ it 'draws top line' do
33
+ subject.top_line.should be_nil
34
+ end
35
+
36
+ it 'draw middle line' do
37
+ subject.separator.should be_nil
38
+ end
39
+
40
+ it 'draw bottom line' do
41
+ subject.bottom_line.should be_nil
42
+ end
43
+
44
+ it 'draws row line' do
45
+ subject.row_line.should == 'a1 a2 a3'
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Border::Unicode, '#rendering' do
6
+
7
+ subject { described_class.new row }
8
+
9
+ context 'with empty row' do
10
+ let(:row) { [] }
11
+
12
+ it 'draws top line' do
13
+ subject.top_line.should == "┌┐"
14
+ end
15
+
16
+ it 'draws middle line' do
17
+ subject.separator.should == "├┤"
18
+ end
19
+
20
+ it 'draw bottom line' do
21
+ subject.bottom_line.should == "└┘"
22
+ end
23
+
24
+ it 'draws row line' do
25
+ subject.row_line.should == "││"
26
+ end
27
+ end
28
+
29
+ context 'with row' do
30
+ let(:row) { ['a1', 'a2', 'a3'] }
31
+
32
+ it 'draws top line' do
33
+ subject.top_line.should == "┌──┬──┬──┐"
34
+ end
35
+
36
+ it 'draw middle line' do
37
+ subject.separator.should == "├──┼──┼──┤"
38
+ end
39
+
40
+ it 'draw bottom line' do
41
+ subject.bottom_line.should == "└──┴──┴──┘"
42
+ end
43
+
44
+ it 'draws row line' do
45
+ subject.row_line.should == "│a1│a2│a3│"
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::ColumnSet, '#extract_widths!' do
6
+
7
+ let(:header) { ['h1', 'h2', 'h3'] }
8
+ let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
9
+
10
+ let(:table) {
11
+ stub(:table, :column_widths => column_widths,
12
+ :header => header, :to_a => rows).as_null_object
13
+ }
14
+
15
+ subject { described_class.new table }
16
+
17
+ context 'with column_widths' do
18
+ let(:column_widths) { [5,5,5] }
19
+
20
+ it '' do
21
+ subject.extract_widths!
22
+ subject.column_widths.should == column_widths
23
+ end
24
+
25
+ end
26
+ end
@@ -14,7 +14,7 @@ describe TTY::Table::Operation::AlignmentSet, '#align_rows' do
14
14
 
15
15
  it { should be_instance_of(Array) }
16
16
 
17
- it { should == [['a1 ', 'a2 '], ['b1 ', 'b2 ']] }
17
+ it { should == [['a1 ', 'a2 '], ['b1 ', 'b2 ']] }
18
18
  end
19
19
 
20
20
  context 'aligned with column widths and alignments' do
@@ -23,7 +23,7 @@ describe TTY::Table::Operation::AlignmentSet, '#align_rows' do
23
23
 
24
24
  it { should be_instance_of(Array) }
25
25
 
26
- it { should == [[' a1 ', 'a2 '], [' b1 ', 'b2 ']] }
26
+ it { should == [[' a1', 'a2 '], [' b1', 'b2 ']] }
27
27
  end
28
28
 
29
29
  context 'aligned with no column widths and no alignments' do
@@ -32,7 +32,7 @@ describe TTY::Table::Operation::AlignmentSet, '#align_rows' do
32
32
 
33
33
  it { should be_instance_of(Array) }
34
34
 
35
- it { should == [['a1 ', 'a2'], ['b1 ', 'b2']] }
35
+ it { should == [['a1', 'a2'], ['b1', 'b2']] }
36
36
  end
37
37
 
38
38
  context 'aligned with no column widths and alignments' do
@@ -41,6 +41,6 @@ describe TTY::Table::Operation::AlignmentSet, '#align_rows' do
41
41
 
42
42
  it { should be_instance_of(Array) }
43
43
 
44
- it { should == [['a1 ', 'a2'], ['b1 ', 'b2']] }
44
+ it { should == [['a1', 'a2'], ['b1', 'b2']] }
45
45
  end
46
46
  end
@@ -8,7 +8,7 @@ describe TTY::Table::Operation::AlignmentSet, '#new' do
8
8
  subject { object.new(argument) }
9
9
 
10
10
  context 'with no argument' do
11
- let(:argument) { nil }
11
+ let(:argument) { [] }
12
12
 
13
13
  it { should be_kind_of(Enumerable) }
14
14
 
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Operation::Wrapped, '#wrap' do
6
+ let(:instance) { described_class.new }
7
+ let(:text) { 'ラドクリフ、マラソン五輪代表に1万m出場にも含み' }
8
+
9
+ subject { instance.wrap(text, width) }
10
+
11
+ context 'without wrapping' do
12
+ let(:width) { 8 }
13
+
14
+ it { should == "ラドクリフ、マラ\nソン五輪代表に1\n万m出場にも含み" }
15
+ end
16
+
17
+ context 'with wrapping' do
18
+ let(:width) { 100 }
19
+
20
+ it { should == text }
21
+ end
22
+ end
@@ -14,6 +14,8 @@ describe TTY::Table, 'properties' do
14
14
 
15
15
  its(:size) { should == [2,3] }
16
16
 
17
+ its(:width) { should == 6 }
18
+
17
19
  context 'no size' do
18
20
  let(:rows) { [] }
19
21
 
@@ -21,4 +23,5 @@ describe TTY::Table, 'properties' do
21
23
 
22
24
  its(:column_size) { should == 0 }
23
25
  end
26
+
24
27
  end
@@ -6,43 +6,154 @@ describe TTY::Table::Renderer::Basic, '#render' do
6
6
  let(:header) { ['h1', 'h2', 'h3'] }
7
7
  let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
8
 
9
- it 'displays table without styling' do
10
- table = TTY::Table.new :renderer => :basic
11
- table << rows[0] << rows[1]
12
- table.to_s.should == <<-EOS.normalize
13
- a1 a2 a3
14
- b1 b2 b3
15
- EOS
16
- end
9
+ subject { described_class.new }
10
+
11
+ context 'without border' do
12
+
13
+ it 'displays table without styling' do
14
+ table = TTY::Table.new rows
15
+ subject.render(table).should == <<-EOS.normalize
16
+ a1 a2 a3
17
+ b1 b2 b3
18
+ EOS
19
+ end
20
+
21
+ it 'displays table with header' do
22
+ table = TTY::Table.new header, rows
23
+ subject.render(table).should == <<-EOS.normalize
24
+ h1 h2 h3
25
+ a1 a2 a3
26
+ b1 b2 b3
27
+ EOS
28
+ end
29
+
30
+ it 'displays table according to widths' do
31
+ header = ['h1', 'h2']
32
+ rows = [['aaa1', 'a2'], ['b1', 'bb1']]
33
+ table = TTY::Table.new header, rows
34
+ subject.render(table).should == <<-EOS.normalize
35
+ h1 h2
36
+ aaa1 a2
37
+ b1 bb1
38
+ EOS
39
+ end
40
+
41
+ it 'header greater than row sizes' do
42
+ header = ['header1', 'header2', 'header3']
43
+ table = TTY::Table.new header, rows
44
+ subject.render(table).should == <<-EOS.normalize
45
+ header1 header2 header3
46
+ a1 a2 a3
47
+ b1 b2 b3
48
+ EOS
49
+ end
17
50
 
18
- it 'displays table with header' do
19
- table = TTY::Table.new :header => header, :renderer => :basic
20
- table << rows[0] << rows[1]
21
- table.to_s.should == <<-EOS.normalize
22
- h1 h2 h3
23
- a1 a2 a3
24
- b1 b2 b3
25
- EOS
26
51
  end
27
52
 
28
- it 'displays table according to widths' do
29
- header = ['h1', 'h2']
30
- rows = [['aaa1', 'a2'], ['b1', 'bb1']]
31
- table = TTY::Table.new header, rows, :renderer => :basic
32
- table.to_s.should == <<-EOS.normalize
33
- h1 h2
34
- aaa1 a2
35
- b1 bb1
36
- EOS
53
+ context 'with ASCII border' do
54
+ let(:border) { TTY::Table::Border::ASCII }
55
+
56
+ it 'display table rows' do
57
+ table = TTY::Table.new rows
58
+ subject.render(table, border).should == <<-EOS.normalize
59
+ +--+--+--+
60
+ |a1|a2|a3|
61
+ |b1|b2|b3|
62
+ +--+--+--+
63
+ EOS
64
+ end
65
+
66
+ it 'displays table with header' do
67
+ table = TTY::Table.new header, rows
68
+ subject.render(table, border).should == <<-EOS.normalize
69
+ +--+--+--+
70
+ |h1|h2|h3|
71
+ +--+--+--+
72
+ |a1|a2|a3|
73
+ |b1|b2|b3|
74
+ +--+--+--+
75
+ EOS
76
+ end
77
+
78
+ it 'displays table according to widths' do
79
+ header = ['h1', 'h2']
80
+ rows = [['aaa1', 'a2'], ['b1', 'bb1']]
81
+ table = TTY::Table.new header, rows
82
+ subject.render(table, border).should == <<-EOS.normalize
83
+ +----+---+
84
+ |h1 |h2 |
85
+ +----+---+
86
+ |aaa1|a2 |
87
+ |b1 |bb1|
88
+ +----+---+
89
+ EOS
90
+ end
91
+
92
+ it 'header greater than row sizes' do
93
+ header = ['header1', 'header2', 'header3']
94
+ table = TTY::Table.new header, rows
95
+ subject.render(table, border).should == <<-EOS.normalize
96
+ +-------+-------+-------+
97
+ |header1|header2|header3|
98
+ +-------+-------+-------+
99
+ |a1 |a2 |a3 |
100
+ |b1 |b2 |b3 |
101
+ +-------+-------+-------+
102
+ EOS
103
+ end
37
104
  end
38
105
 
39
- it 'header greater than row sizes' do
40
- header = ['header1', 'header2', 'header3']
41
- table = TTY::Table.new header, rows, :renderer => :basic
42
- table.to_s.should == <<-EOS.normalize
43
- header1 header2 header3
44
- a1 a2 a3
45
- b1 b2 b3
46
- EOS
106
+ context 'with Unicode border' do
107
+ let(:border) { TTY::Table::Border::Unicode }
108
+
109
+ it 'display table rows' do
110
+ table = TTY::Table.new rows
111
+ subject.render(table, border).should == <<-EOS.normalize
112
+ ┌──┬──┬──┐
113
+ │a1│a2│a3│
114
+ │b1│b2│b3│
115
+ └──┴──┴──┘
116
+ EOS
117
+ end
118
+
119
+ it 'displays table with header' do
120
+ table = TTY::Table.new header, rows
121
+ subject.render(table, border).should == <<-EOS.normalize
122
+ ┌──┬──┬──┐
123
+ │h1│h2│h3│
124
+ ├──┼──┼──┤
125
+ │a1│a2│a3│
126
+ │b1│b2│b3│
127
+ └──┴──┴──┘
128
+ EOS
129
+ end
130
+
131
+ it 'displays table according to widths' do
132
+ header = ['h1', 'h2']
133
+ rows = [['aaa1', 'a2'], ['b1', 'bb1']]
134
+ table = TTY::Table.new header, rows
135
+ subject.render(table, border).should == <<-EOS.normalize
136
+ ┌────┬───┐
137
+ │h1 │h2 │
138
+ ├────┼───┤
139
+ │aaa1│a2 │
140
+ │b1 │bb1│
141
+ └────┴───┘
142
+ EOS
143
+ end
144
+
145
+ it 'header greater than row sizes' do
146
+ header = ['header1', 'header2', 'header3']
147
+ table = TTY::Table.new header, rows
148
+ subject.render(table, border).to_s.should == <<-EOS.normalize
149
+ ┌───────┬───────┬───────┐
150
+ │header1│header2│header3│
151
+ ├───────┼───────┼───────┤
152
+ │a1 │a2 │a3 │
153
+ │b1 │b2 │b3 │
154
+ └───────┴───────┴───────┘
155
+ EOS
156
+ end
47
157
  end
158
+
48
159
  end