tty 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +0 -1
- data/README.md +141 -23
- data/benchmarks/table.rb +5 -0
- data/lib/tty/logger.rb +71 -0
- data/lib/tty/support/equatable.rb +6 -2
- data/lib/tty/system/which.rb +41 -0
- data/lib/tty/system.rb +8 -0
- data/lib/tty/table/border/ascii.rb +15 -16
- data/lib/tty/table/border/null.rb +9 -4
- data/lib/tty/table/border/unicode.rb +15 -16
- data/lib/tty/table/border.rb +69 -9
- data/lib/tty/table/border_dsl.rb +247 -0
- data/lib/tty/table/border_options.rb +52 -0
- data/lib/tty/table/field.rb +101 -0
- data/lib/tty/table/header.rb +115 -0
- data/lib/tty/table/operation/alignment_set.rb +14 -10
- data/lib/tty/table/operation/truncation.rb +19 -13
- data/lib/tty/table/operation/wrapped.rb +20 -9
- data/lib/tty/table/operations.rb +69 -0
- data/lib/tty/table/renderer/basic.rb +35 -26
- data/lib/tty/table/renderer.rb +13 -1
- data/lib/tty/table/row.rb +174 -0
- data/lib/tty/table.rb +96 -21
- data/lib/tty/text/truncation.rb +1 -1
- data/lib/tty/vector.rb +8 -7
- data/lib/tty/version.rb +1 -1
- data/lib/tty.rb +21 -0
- data/spec/tty/logger/new_spec.rb +36 -0
- data/spec/tty/logger/valid_level_spec.rb +33 -0
- data/spec/tty/system/platform_spec.rb +8 -0
- data/spec/tty/system/which_spec.rb +41 -0
- data/spec/tty/table/access_spec.rb +12 -1
- data/spec/tty/table/add_row_spec.rb +28 -0
- data/spec/tty/table/border/new_spec.rb +9 -4
- data/spec/tty/table/border/null/rendering_spec.rb +39 -1
- data/spec/tty/table/border/options/from_spec.rb +39 -0
- data/spec/tty/table/border/options/new_spec.rb +15 -0
- data/spec/tty/table/border/style_spec.rb +70 -0
- data/spec/tty/table/border_spec.rb +107 -0
- data/spec/tty/table/each_with_index_spec.rb +30 -0
- data/spec/tty/table/field/equality_spec.rb +51 -0
- data/spec/tty/table/field/new_spec.rb +29 -0
- data/spec/tty/table/field/width_spec.rb +21 -0
- data/spec/tty/table/header/call_spec.rb +30 -0
- data/spec/tty/table/header/new_spec.rb +25 -0
- data/spec/tty/table/header/set_spec.rb +15 -0
- data/spec/tty/table/header/to_ary_spec.rb +14 -0
- data/spec/tty/table/header_spec.rb +14 -0
- data/spec/tty/table/operation/alignment_set/align_rows_spec.rb +8 -1
- data/spec/tty/table/operation/truncation/call_spec.rb +27 -0
- data/spec/tty/table/operation/wrapped/call_spec.rb +27 -0
- data/spec/tty/table/operations/new_spec.rb +32 -0
- data/spec/tty/table/options_spec.rb +17 -9
- data/spec/tty/table/renderer/basic/alignment_spec.rb +76 -29
- data/spec/tty/table/renderer/basic/separator_spec.rb +99 -0
- data/spec/tty/table/renderer_spec.rb +7 -1
- data/spec/tty/table/renders_with_spec.rb +35 -28
- data/spec/tty/table/rotate_spec.rb +1 -0
- data/spec/tty/table/row/access_spec.rb +25 -0
- data/spec/tty/table/row/call_spec.rb +41 -0
- data/spec/tty/table/row/data_spec.rb +26 -0
- data/spec/tty/table/row/equality_spec.rb +73 -0
- data/spec/tty/table/row/new_spec.rb +41 -0
- data/spec/tty/table/row/to_ary_spec.rb +14 -0
- data/spec/tty/text/truncation/truncate_spec.rb +6 -0
- metadata +72 -10
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Field, '#width' do
|
6
|
+
let(:object) { described_class }
|
7
|
+
|
8
|
+
subject { object.new value }
|
9
|
+
|
10
|
+
context 'with only value' do
|
11
|
+
let(:value) { 'foo' }
|
12
|
+
|
13
|
+
its(:width) { should == 3 }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'with hash value' do
|
17
|
+
let(:value) { "foo\nbaar" }
|
18
|
+
|
19
|
+
its(:width) { should == 8 }
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Header, '#call' do
|
6
|
+
let(:object) { described_class.new(attributes) }
|
7
|
+
let(:attributes) { [:id, :name, :age] }
|
8
|
+
|
9
|
+
subject { object.call(attribute) }
|
10
|
+
|
11
|
+
context 'with a known attribute' do
|
12
|
+
context 'when symbol' do
|
13
|
+
let(:attribute) { :age }
|
14
|
+
|
15
|
+
it { should == 2 }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when integer' do
|
19
|
+
let(:attribute) { 1 }
|
20
|
+
|
21
|
+
it { should == :name }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'with an unknown attribute' do
|
26
|
+
let(:attribute) { :mine }
|
27
|
+
|
28
|
+
specify { expect { subject }.to raise_error(TTY::UnknownAttributeError, "the header 'mine' is unknown")}
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Header, '#new' do
|
6
|
+
let(:object) { described_class }
|
7
|
+
|
8
|
+
context 'with no arguments' do
|
9
|
+
subject { object.new }
|
10
|
+
|
11
|
+
it { should be_instance_of(object) }
|
12
|
+
|
13
|
+
it { should be_empty }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'with attributes' do
|
17
|
+
subject { object.new(attributes) }
|
18
|
+
|
19
|
+
let(:attributes) { ['id', 'name', 'age'] }
|
20
|
+
|
21
|
+
it { should be_instance_of(object) }
|
22
|
+
|
23
|
+
it { should == attributes }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Header, '#set' do
|
6
|
+
let(:object) { described_class }
|
7
|
+
let(:attributes) { [:id, :name, :age] }
|
8
|
+
|
9
|
+
subject { object.new }
|
10
|
+
|
11
|
+
it 'sets the value' do
|
12
|
+
subject[0] = :id
|
13
|
+
expect(subject[0]).to eql(:id)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
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 { should be_instance_of(Array) }
|
12
|
+
|
13
|
+
it { should == attributes }
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table, '#header' do
|
6
|
+
|
7
|
+
let(:header) { [:header1, :header2] }
|
8
|
+
let(:rows) { [['a1', 'a2'], ['b1', 'b2']] }
|
9
|
+
let(:object) { described_class }
|
10
|
+
|
11
|
+
subject { object.new header, rows }
|
12
|
+
|
13
|
+
its(:header) { should be_instance_of TTY::Table::Header }
|
14
|
+
end
|
@@ -2,9 +2,16 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
+
def to_field(value)
|
6
|
+
TTY::Table::Field.new(value)
|
7
|
+
end
|
8
|
+
|
5
9
|
describe TTY::Table::Operation::AlignmentSet, '#align_rows' do
|
6
10
|
let(:object) { described_class.new alignments }
|
7
|
-
let(:rows) {
|
11
|
+
let(:rows) {
|
12
|
+
[[to_field('a1'), to_field('a2')],
|
13
|
+
[to_field('b1'), to_field('b2')]]
|
14
|
+
}
|
8
15
|
|
9
16
|
subject { object.align_rows rows, :column_widths => widths }
|
10
17
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Operation::Truncation, '#call' do
|
6
|
+
let(:object) { described_class.new }
|
7
|
+
let(:text) { '太丸ゴシック体' }
|
8
|
+
let(:row) { [TTY::Table::Field.new(text), TTY::Table::Field.new(text)] }
|
9
|
+
|
10
|
+
context 'without column width' do
|
11
|
+
it "truncates string" do
|
12
|
+
object.call(row)
|
13
|
+
expect(row[0]).to eql(text)
|
14
|
+
expect(row[1]).to eql(text)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with column width ' do
|
19
|
+
let(:column_widths) { [3, 6] }
|
20
|
+
|
21
|
+
it "truncates string" do
|
22
|
+
object.call(row, :column_widths => column_widths)
|
23
|
+
expect(row[0]).to eql('太丸…')
|
24
|
+
expect(row[1]).to eql('太丸ゴシッ…')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Operation::Wrapped, '#call' do
|
6
|
+
let(:object) { described_class.new }
|
7
|
+
let(:text) { 'ラドクリフ、マラソン五輪代表に1万m出場にも含み' }
|
8
|
+
let(:row) { [TTY::Table::Field.new(text), TTY::Table::Field.new(text)] }
|
9
|
+
|
10
|
+
context 'without column width' do
|
11
|
+
it "doesn't wrap string" do
|
12
|
+
object.call(row)
|
13
|
+
expect(row[0]).to eql(text)
|
14
|
+
expect(row[1]).to eql(text)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with column width' do
|
19
|
+
let(:column_widths) { [12, 14] }
|
20
|
+
|
21
|
+
it "truncates string" do
|
22
|
+
object.call(row, :column_widths => column_widths)
|
23
|
+
expect(row[0]).to eql("ラドクリフ、マラソン五輪\n代表に1万m出場にも含み")
|
24
|
+
expect(row[1]).to eql("ラドクリフ、マラソン五輪代表\nに1万m出場にも含み")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Operations, '#new' do
|
6
|
+
let(:object) { described_class }
|
7
|
+
let(:row) { [1,2,3] }
|
8
|
+
let(:table) { TTY::Table.new :rows => [row] }
|
9
|
+
let(:callable) {
|
10
|
+
Class.new do
|
11
|
+
def call(row, options)
|
12
|
+
row.map! { |r| r + 1}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
}
|
16
|
+
let(:instance) { callable.new }
|
17
|
+
|
18
|
+
subject { object.new table }
|
19
|
+
|
20
|
+
before {
|
21
|
+
subject.add_operation(:alignment, instance)
|
22
|
+
}
|
23
|
+
|
24
|
+
it 'stores away operations' do
|
25
|
+
expect(subject.operations[:alignment]).to include(instance)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'runs selected operations' do
|
29
|
+
subject.run_operations(:alignment, row)
|
30
|
+
expect(row).to eql([2,3,4])
|
31
|
+
end
|
32
|
+
end
|
@@ -6,22 +6,30 @@ describe TTY::Table, 'options' do
|
|
6
6
|
let(:rows) { [['a1', 'a2'], ['b1', 'b2']] }
|
7
7
|
let(:widths) { nil }
|
8
8
|
let(:aligns) { [] }
|
9
|
-
let(:object) {
|
10
|
-
|
9
|
+
let(:object) { described_class }
|
10
|
+
let(:options) {
|
11
|
+
{
|
11
12
|
:column_widths => widths,
|
12
13
|
:column_aligns => aligns,
|
13
14
|
:renderer => :basic
|
15
|
+
}
|
14
16
|
}
|
15
17
|
|
16
|
-
subject { object.
|
18
|
+
subject { object.new rows, options }
|
17
19
|
|
18
|
-
its(:
|
20
|
+
its(:header) { should be_nil }
|
19
21
|
|
20
|
-
its(:
|
22
|
+
its(:rows) { should == rows }
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
its(:border) { should be_kind_of TTY::Table::BorderOptions }
|
25
|
+
|
26
|
+
its(:orientation) { should be_kind_of TTY::Table::Orientation::Horizontal }
|
27
|
+
|
28
|
+
its(:column_widths) { should be_empty }
|
29
|
+
|
30
|
+
its(:column_aligns) { should eql(aligns) }
|
31
|
+
|
32
|
+
it { subject.column_aligns.to_a.should be_empty }
|
25
33
|
|
26
34
|
context '#column_widths' do
|
27
35
|
let(:widths) { [10, 10] }
|
@@ -39,7 +47,7 @@ describe TTY::Table, 'options' do
|
|
39
47
|
let(:aligns) { [:center, :center] }
|
40
48
|
|
41
49
|
it 'unwraps original array' do
|
42
|
-
subject.
|
50
|
+
subject.column_aligns.to_a.should == aligns
|
43
51
|
end
|
44
52
|
end
|
45
53
|
end
|
@@ -2,39 +2,86 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe TTY::Table
|
5
|
+
describe TTY::Table, 'alignment' do
|
6
6
|
let(:header) { ['h1', 'h2', 'h3'] }
|
7
|
-
let(:rows)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
7
|
+
let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
|
8
|
+
let(:options) { { :renderer => :basic, :column_aligns => column_aligns }}
|
9
|
+
|
10
|
+
subject(:table) { described_class.new header, rows, options }
|
11
|
+
|
12
|
+
context 'with default' do
|
13
|
+
let(:header) { ['h1', 'h2'] }
|
14
|
+
let(:rows) { [['aaaaa', 'a'], ['b', 'bbbbb']] }
|
15
|
+
let(:column_aligns) { nil }
|
16
|
+
|
17
|
+
it 'aligns left by default' do
|
18
|
+
table.to_s.should == <<-EOS.normalize
|
19
|
+
h1 h2
|
20
|
+
aaaaa a
|
21
|
+
b bbbbb
|
22
|
+
EOS
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'with different headers' do
|
27
|
+
let(:header) { ['header1', 'head2', 'h3'] }
|
28
|
+
let(:column_aligns) { [:left, :center, :right] }
|
29
|
+
|
30
|
+
it 'aligns headers' do
|
31
|
+
table.to_s.should == <<-EOS.normalize
|
32
|
+
header1 head2 h3
|
33
|
+
a1 a2 a3
|
34
|
+
b1 b2 b3
|
35
|
+
EOS
|
36
|
+
end
|
18
37
|
end
|
19
38
|
|
20
|
-
|
21
|
-
header
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
39
|
+
context 'with different aligns' do
|
40
|
+
let(:header) { nil }
|
41
|
+
let(:rows) { [['aaaaa', 'a'], ['b', 'bbbbb']] }
|
42
|
+
let(:column_aligns) { [:left, :right] }
|
43
|
+
|
44
|
+
it 'aligns table rows' do
|
45
|
+
table.to_s.should == <<-EOS.normalize
|
46
|
+
aaaaa a
|
47
|
+
b bbbbb
|
48
|
+
EOS
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'with individual field aligns' do
|
53
|
+
let(:header) { ['header1', 'header2', 'header3'] }
|
54
|
+
let(:column_aligns) { [:left, :center, :right] }
|
55
|
+
|
56
|
+
it "takes individual fields over global aligns" do
|
57
|
+
options = {:header => header, :column_aligns => column_aligns, :renderer => :basic}
|
58
|
+
table = described_class.new options do |t|
|
59
|
+
t << ['a1', 'a2', 'a3']
|
60
|
+
t << ['b1', {:value => 'b2', :align => :right}, 'b3']
|
61
|
+
t << ['c1', 'c2', {:value => 'c3', :align => :center}]
|
62
|
+
end
|
63
|
+
table.to_s.should == <<-EOS.normalize
|
64
|
+
header1 header2 header3
|
65
|
+
a1 a2 a3
|
66
|
+
b1 b2 b3
|
67
|
+
c1 c2 c3
|
68
|
+
EOS
|
69
|
+
end
|
29
70
|
end
|
30
71
|
|
31
|
-
|
32
|
-
rows
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
72
|
+
context 'with aligned header' do
|
73
|
+
let(:rows) { [['aaaaa1', 'a2', 'aaa3'], ['b1', 'bbbb2', 'bb3']] }
|
74
|
+
|
75
|
+
it "aligns headres" do
|
76
|
+
header = ['h1', {:value => 'h2', :align => :right}, {:value => 'h3', :align => :center}]
|
77
|
+
options = {:header => header, :renderer => :basic, :rows => rows }
|
78
|
+
table = described_class.new options
|
79
|
+
table.to_s.should == <<-EOS.normalize
|
80
|
+
h1 h2 h3
|
81
|
+
aaaaa1 a2 aaa3
|
82
|
+
b1 bbbb2 bb3
|
83
|
+
EOS
|
84
|
+
end
|
85
|
+
|
39
86
|
end
|
40
87
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table, 'with separator' 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, :renderer => renderer }
|
10
|
+
|
11
|
+
context 'when default' do
|
12
|
+
let(:renderer) { :basic }
|
13
|
+
|
14
|
+
it "sets through hash" do
|
15
|
+
table.border :separator => :each_row
|
16
|
+
expect(table.border.separator).to eql(:each_row)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sets through attribute" do
|
20
|
+
table.border.separator= :each_row
|
21
|
+
expect(table.border.separator).to eql(:each_row)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sets through block" do
|
25
|
+
table.border do
|
26
|
+
separator :each_row
|
27
|
+
end
|
28
|
+
expect(table.border.separator).to eql(:each_row)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "renders each row" do
|
32
|
+
table.border.separator= :each_row
|
33
|
+
table.to_s.should == <<-EOS.normalize
|
34
|
+
h1 h2 h3
|
35
|
+
|
36
|
+
a1 a2 a3
|
37
|
+
|
38
|
+
b1 b2 b3
|
39
|
+
EOS
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when ascii' do
|
44
|
+
let(:renderer) { :ascii }
|
45
|
+
|
46
|
+
it "renders each row" do
|
47
|
+
table.border.separator= :each_row
|
48
|
+
table.to_s.should == <<-EOS.normalize
|
49
|
+
+--+--+--+
|
50
|
+
|h1|h2|h3|
|
51
|
+
+--+--+--+
|
52
|
+
|a1|a2|a3|
|
53
|
+
+--+--+--+
|
54
|
+
|b1|b2|b3|
|
55
|
+
+--+--+--+
|
56
|
+
EOS
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'with specific separator' do
|
60
|
+
let(:header) { ['h1', 'h2'] }
|
61
|
+
let(:rows) { [['a1', 'a2'], ['b1', 'b2'], ['c1', 'c2']] }
|
62
|
+
|
63
|
+
it 'custom separator' do
|
64
|
+
pending
|
65
|
+
table.border.separator= [2]
|
66
|
+
table.to_s.should == <<-EOS.normalize
|
67
|
+
+--+--+
|
68
|
+
|h1|h2|
|
69
|
+
+--+--+
|
70
|
+
|a1|a2|
|
71
|
+
|b1|b2|
|
72
|
+
+--+--+
|
73
|
+
|c1|c2|
|
74
|
+
+--+--+
|
75
|
+
EOS
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when unicode' do
|
83
|
+
let(:renderer) { :unicode }
|
84
|
+
|
85
|
+
it "renders each row" do
|
86
|
+
table.border.separator= :each_row
|
87
|
+
table.to_s.should == <<-EOS.normalize
|
88
|
+
┌──┬──┬──┐
|
89
|
+
│h1│h2│h3│
|
90
|
+
├──┼──┼──┤
|
91
|
+
│a1│a2│a3│
|
92
|
+
├──┼──┼──┤
|
93
|
+
│b1│b2│b3│
|
94
|
+
└──┴──┴──┘
|
95
|
+
EOS
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
@@ -4,6 +4,7 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe TTY::Table, '#renderer' do
|
6
6
|
let(:basic_renderer) { TTY::Table::Renderer::Basic }
|
7
|
+
let(:ascii_renderer) { TTY::Table::Renderer::ASCII }
|
7
8
|
let(:unicode_renderer) { TTY::Table::Renderer::Unicode }
|
8
9
|
|
9
10
|
before do
|
@@ -25,7 +26,12 @@ describe TTY::Table, '#renderer' do
|
|
25
26
|
table.renderer.should be_kind_of(basic_renderer)
|
26
27
|
end
|
27
28
|
|
28
|
-
it 'allows to set instance renderer' do
|
29
|
+
it 'allows to set ascii instance renderer' do
|
30
|
+
table = TTY::Table.new :renderer => :ascii
|
31
|
+
expect(table.renderer).to be_kind_of(ascii_renderer)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'allows to set unicode instance renderer' do
|
29
35
|
table = TTY::Table.new :renderer => :unicode
|
30
36
|
table.renderer.should be_kind_of(unicode_renderer)
|
31
37
|
end
|
@@ -7,32 +7,41 @@ describe TTY::Table, '#renders_with' do
|
|
7
7
|
let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
|
8
8
|
let(:table) { described_class.new header, rows }
|
9
9
|
|
10
|
+
context 'with invalid border class' do
|
11
|
+
it "doesn't inherit from TTY::Table::Border" do
|
12
|
+
expect { table.renders_with String }.to raise_error(TTY::TypeError)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "doesn't implement def_border" do
|
16
|
+
klass = Class.new(TTY::Table::Border)
|
17
|
+
expect { table.renders_with klass }.to raise_error(TTY::NoImplementationError)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
10
21
|
context 'with complete border' do
|
11
|
-
|
22
|
+
before {
|
12
23
|
class MyBorder < TTY::Table::Border
|
13
24
|
def_border do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
25
|
+
top '='
|
26
|
+
top_mid '*'
|
27
|
+
top_left '*'
|
28
|
+
top_right '*'
|
29
|
+
bottom '='
|
30
|
+
bottom_mid '*'
|
31
|
+
bottom_left '*'
|
32
|
+
bottom_right '*'
|
33
|
+
mid '='
|
34
|
+
mid_mid '*'
|
35
|
+
mid_left '*'
|
36
|
+
mid_right '*'
|
37
|
+
left '$'
|
38
|
+
center '$'
|
39
|
+
right '$'
|
30
40
|
end
|
31
41
|
end
|
32
42
|
}
|
33
43
|
|
34
44
|
it 'displays custom border' do
|
35
|
-
border_class
|
36
45
|
table.renders_with MyBorder
|
37
46
|
table.to_s.should == <<-EOS.normalize
|
38
47
|
*==*==*==*
|
@@ -46,23 +55,21 @@ describe TTY::Table, '#renders_with' do
|
|
46
55
|
end
|
47
56
|
|
48
57
|
context 'with incomplete border' do
|
49
|
-
|
58
|
+
before {
|
50
59
|
class MyBorder < TTY::Table::Border
|
51
60
|
def_border do
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
}
|
61
|
+
bottom ' '
|
62
|
+
bottom_mid '*'
|
63
|
+
bottom_left '*'
|
64
|
+
bottom_right '*'
|
65
|
+
left '$'
|
66
|
+
center '$'
|
67
|
+
right '$'
|
60
68
|
end
|
61
69
|
end
|
62
70
|
}
|
63
71
|
|
64
72
|
it 'displays border' do
|
65
|
-
border_class
|
66
73
|
table.renders_with MyBorder
|
67
74
|
table.to_s.should == <<-EOS.normalize
|
68
75
|
$h1$h2$h3$
|
@@ -64,6 +64,7 @@ describe TTY::Table, '#rotate' do
|
|
64
64
|
it 'rotates the rows and header back' do
|
65
65
|
subject.orientation = :vertical
|
66
66
|
subject.rotate
|
67
|
+
expect(subject.orientation).to be_a TTY::Table::Orientation::Vertical
|
67
68
|
subject.orientation = :horizontal
|
68
69
|
expect(subject.rotate.to_a).to eql rows
|
69
70
|
expect(subject.header).to eql header
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Row, '#access' do
|
6
|
+
let(:object) { described_class.new [] }
|
7
|
+
|
8
|
+
before { object[attribute] = value}
|
9
|
+
|
10
|
+
subject { object[attribute] }
|
11
|
+
|
12
|
+
context 'when integer' do
|
13
|
+
let(:attribute) { 0 }
|
14
|
+
let(:value) { 1 }
|
15
|
+
|
16
|
+
it { should == 1 }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when symbol' do
|
20
|
+
let(:attribute) { :id }
|
21
|
+
let(:value) { 1 }
|
22
|
+
|
23
|
+
it { should == 1 }
|
24
|
+
end
|
25
|
+
end
|