tty 0.0.7 → 0.0.8
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.
- 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
data/lib/tty.rb
CHANGED
@@ -16,6 +16,7 @@ require 'tty/text'
|
|
16
16
|
require 'tty/vector'
|
17
17
|
require 'tty/shell'
|
18
18
|
require 'tty/coercer'
|
19
|
+
require 'tty/logger'
|
19
20
|
|
20
21
|
require 'tty/coercer/range'
|
21
22
|
require 'tty/coercer/integer'
|
@@ -34,10 +35,19 @@ require 'tty/terminal/color'
|
|
34
35
|
require 'tty/terminal/echo'
|
35
36
|
require 'tty/terminal/home'
|
36
37
|
|
38
|
+
require 'tty/system/which'
|
39
|
+
|
37
40
|
require 'tty/text/wrapping'
|
38
41
|
require 'tty/text/truncation'
|
39
42
|
|
43
|
+
require 'tty/table/field'
|
44
|
+
require 'tty/table/header'
|
45
|
+
require 'tty/table/row'
|
46
|
+
require 'tty/table/options'
|
47
|
+
|
40
48
|
require 'tty/table/border'
|
49
|
+
require 'tty/table/border_dsl'
|
50
|
+
require 'tty/table/border_options'
|
41
51
|
require 'tty/table/border/unicode'
|
42
52
|
require 'tty/table/border/ascii'
|
43
53
|
require 'tty/table/border/null'
|
@@ -47,6 +57,7 @@ require 'tty/table/orientation'
|
|
47
57
|
require 'tty/table/orientation/horizontal'
|
48
58
|
require 'tty/table/orientation/vertical'
|
49
59
|
|
60
|
+
require 'tty/table/operations'
|
50
61
|
require 'tty/table/operation/alignment_set'
|
51
62
|
require 'tty/table/operation/alignment'
|
52
63
|
require 'tty/table/operation/truncation'
|
@@ -57,6 +68,9 @@ module TTY
|
|
57
68
|
# Raised when the argument type is different from expected
|
58
69
|
class TypeError < ArgumentError; end
|
59
70
|
|
71
|
+
# Raised when the operation is not implemented
|
72
|
+
class NoImplementationError < NotImplementedError; end
|
73
|
+
|
60
74
|
# Raised when the required argument is not supplied
|
61
75
|
class ArgumentRequired < ArgumentError; end
|
62
76
|
|
@@ -72,6 +86,13 @@ module TTY
|
|
72
86
|
# Raised when the passed in validation argument is of wrong type
|
73
87
|
class ValidationCoercion < TypeError; end
|
74
88
|
|
89
|
+
# Raised when the attribute is unknown
|
90
|
+
class UnknownAttributeError < IndexError; end
|
91
|
+
|
92
|
+
|
93
|
+
# An empty array used as a default value
|
94
|
+
EMPTY_ARRAY = Array.new.freeze
|
95
|
+
|
75
96
|
class << self
|
76
97
|
|
77
98
|
# Return terminal instance
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Logger, '#new' do
|
6
|
+
let(:object) { described_class }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
|
9
|
+
subject { object.new options }
|
10
|
+
|
11
|
+
context 'when default' do
|
12
|
+
let(:options) { {:namespace => ''} }
|
13
|
+
|
14
|
+
its(:level) { should eql object::ALL }
|
15
|
+
|
16
|
+
its(:output) { should eql $stderr }
|
17
|
+
|
18
|
+
its(:timestamp_format) { should eql '%Y-%m-%d %T' }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when custom' do
|
22
|
+
let(:options) { {
|
23
|
+
:namespace => 'tty::color',
|
24
|
+
:level => 2,
|
25
|
+
:output => output,
|
26
|
+
:timestamp_format => "%dd" } }
|
27
|
+
|
28
|
+
its(:namespace) { should eql 'tty::color' }
|
29
|
+
|
30
|
+
its(:level) { should eql 2 }
|
31
|
+
|
32
|
+
its(:output) { should eql output }
|
33
|
+
|
34
|
+
its(:timestamp_format) { should eql '%dd' }
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Logger, '#valid_level' do
|
6
|
+
let(:object) { described_class }
|
7
|
+
|
8
|
+
subject { object.valid_level?(level) }
|
9
|
+
|
10
|
+
context 'when level is nil' do
|
11
|
+
let(:level) { nil }
|
12
|
+
|
13
|
+
it { should be_false }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when level is non numeric' do
|
17
|
+
let(:level) { 'a' }
|
18
|
+
|
19
|
+
it { should be_false }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when level is not a valid number' do
|
23
|
+
let(:level) { -1 }
|
24
|
+
|
25
|
+
it { should be_false }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when level is valid number' do
|
29
|
+
let(:level) { 0 }
|
30
|
+
|
31
|
+
it { should be_true }
|
32
|
+
end
|
33
|
+
end
|
@@ -9,6 +9,8 @@ describe TTY::System, '#platform' do
|
|
9
9
|
|
10
10
|
it { should respond_to(:unix?) }
|
11
11
|
|
12
|
+
it { should respond_to(:which) }
|
13
|
+
|
12
14
|
it 'checks if windows' do
|
13
15
|
RbConfig::CONFIG.stub(:[]).with('host_os').and_return 'windows'
|
14
16
|
subject.windows?.should be_true
|
@@ -18,4 +20,10 @@ describe TTY::System, '#platform' do
|
|
18
20
|
RbConfig::CONFIG.stub(:[]).with('host_os').and_return 'darwin'
|
19
21
|
subject.unix?.should be_true
|
20
22
|
end
|
23
|
+
|
24
|
+
it 'delegates to which' do
|
25
|
+
command = 'ruby'
|
26
|
+
TTY::System::Which.should_receive(:new).with(command)
|
27
|
+
subject.which(command)
|
28
|
+
end
|
21
29
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe TTY::System::Which, '#which' do
|
5
|
+
let(:path) { "/usr/local/bin:/usr/local/git/bin" }
|
6
|
+
let(:extension) { '.bat' }
|
7
|
+
|
8
|
+
context 'without extension' do
|
9
|
+
before {
|
10
|
+
ENV.stub(:[]).with('PATHEXT').and_return(nil)
|
11
|
+
ENV.stub(:[]).with('PATH').and_return(path)
|
12
|
+
}
|
13
|
+
|
14
|
+
it 'finds command' do
|
15
|
+
File.stub(:executable?) { true }
|
16
|
+
expect(subject.which("ruby")).to eql "/usr/local/bin/ruby"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "doesn't find command" do
|
20
|
+
File.stub(:executable?) { false }
|
21
|
+
expect(subject.which("ruby")).to be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'with extension' do
|
26
|
+
before {
|
27
|
+
ENV.stub(:[]).with('PATHEXT').and_return(extension)
|
28
|
+
ENV.stub(:[]).with('PATH').and_return(path)
|
29
|
+
}
|
30
|
+
|
31
|
+
it 'finds command' do
|
32
|
+
File.stub(:executable?) { true }
|
33
|
+
expect(subject.which("ruby")).to eql "/usr/local/bin/ruby.bat"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "doesn't find command" do
|
37
|
+
File.stub(:executable?) { false }
|
38
|
+
expect(subject.which("ruby")).to be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -3,8 +3,9 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe TTY::Table, 'access' do
|
6
|
+
let(:header) { [:head1, :head2] }
|
6
7
|
let(:rows) { [['a1', 'a2'], ['b1', 'b2']] }
|
7
|
-
subject { TTY::Table.new :rows => rows }
|
8
|
+
subject { TTY::Table.new :rows => rows, :header => header }
|
8
9
|
|
9
10
|
it { should respond_to(:element) }
|
10
11
|
|
@@ -49,6 +50,16 @@ describe TTY::Table, 'access' do
|
|
49
50
|
end
|
50
51
|
|
51
52
|
context '#column' do
|
53
|
+
it "gets based on header name" do
|
54
|
+
subject.column(:head1).should eql ['a1', 'b1']
|
55
|
+
end
|
56
|
+
|
57
|
+
it "yields based on header name" do
|
58
|
+
yielded = []
|
59
|
+
subject.column(:head1) { |el| yielded << el }
|
60
|
+
expect(yielded).to eql(['a1', 'b1'])
|
61
|
+
end
|
62
|
+
|
52
63
|
it 'returns nil for wrong index' do
|
53
64
|
subject.column(11).should be_nil
|
54
65
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table, '#<<' do
|
6
|
+
let(:rows) { ['a', 'b', 'c'] }
|
7
|
+
let(:object) { described_class }
|
8
|
+
|
9
|
+
subject(:table) { object[rows] }
|
10
|
+
|
11
|
+
context 'with primitive values' do
|
12
|
+
let(:row) { [1, 2, 3] }
|
13
|
+
|
14
|
+
it 'extracts values correctly' do
|
15
|
+
table << row
|
16
|
+
expect(table.to_a.last).to eql(row)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with complex values' do
|
21
|
+
let(:row) { [1, { :value => 2 }, 3] }
|
22
|
+
|
23
|
+
it 'extracts values correctly' do
|
24
|
+
table << row
|
25
|
+
expect(table.to_a.last).to eql([1,2,3])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -3,18 +3,23 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe TTY::Table::Border, '#new' do
|
6
|
-
|
6
|
+
let(:row) { [] }
|
7
|
+
subject(:instance) { klass.new row }
|
7
8
|
|
8
9
|
context 'when abstract' do
|
9
10
|
let(:klass) { described_class }
|
10
11
|
|
11
|
-
specify { expect {
|
12
|
+
specify { expect { instance }.to raise_error(NotImplementedError) }
|
12
13
|
end
|
13
14
|
|
14
15
|
context 'when concrete' do
|
15
|
-
let(:klass) {
|
16
|
+
let(:klass) {
|
17
|
+
Class.new do
|
18
|
+
def initialize(row); end
|
19
|
+
end
|
20
|
+
}
|
16
21
|
|
17
|
-
specify { expect {
|
22
|
+
specify { expect { instance }.to_not raise_error(NotImplementedError) }
|
18
23
|
|
19
24
|
it { should be_instance_of klass }
|
20
25
|
end
|
@@ -3,8 +3,9 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe TTY::Table::Border::Null, '#rendering' do
|
6
|
+
let(:border) { nil }
|
6
7
|
|
7
|
-
subject { described_class.new row }
|
8
|
+
subject { described_class.new row, border }
|
8
9
|
|
9
10
|
context 'with empty row' do
|
10
11
|
let(:row) { [] }
|
@@ -46,4 +47,41 @@ describe TTY::Table::Border::Null, '#rendering' do
|
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
50
|
+
context 'with border' do
|
51
|
+
let(:row) { ['a1', 'a2', 'a3'] }
|
52
|
+
let(:border) { { :characters => {
|
53
|
+
'top' => '=',
|
54
|
+
'top_mid' => '=',
|
55
|
+
'top_left' => '=',
|
56
|
+
'top_right' => '=',
|
57
|
+
'bottom' => '=',
|
58
|
+
'bottom_mid' => '=',
|
59
|
+
'bottom_left' => '=',
|
60
|
+
'bottom_right' => '=',
|
61
|
+
'mid' => '=',
|
62
|
+
'mid_mid' => '=',
|
63
|
+
'mid_left' => '=',
|
64
|
+
'mid_right' => '=',
|
65
|
+
'left' => '=',
|
66
|
+
'center' => '=',
|
67
|
+
'right' => '='
|
68
|
+
} } }
|
69
|
+
|
70
|
+
it 'draws top line' do
|
71
|
+
expect(subject.top_line).to eql '=========='
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'draws separator line' do
|
75
|
+
expect(subject.separator).to eql '=========='
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'draws bottom line' do
|
79
|
+
expect(subject.bottom_line).to eql '=========='
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'draws row line' do
|
83
|
+
expect(subject.row_line).to eql '=a1=a2=a3='
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
49
87
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::BorderOptions, '#from' do
|
6
|
+
|
7
|
+
subject(:options) { described_class.from object }
|
8
|
+
|
9
|
+
context 'when empty hash' do
|
10
|
+
let(:object) { {} }
|
11
|
+
|
12
|
+
it { expect(options.style).to be_nil }
|
13
|
+
|
14
|
+
it { expect(options.separator).to be_nil }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when hash' do
|
18
|
+
let(:object) { { :style => :red, :separator => :none } }
|
19
|
+
|
20
|
+
it { expect(options).to be_kind_of(described_class) }
|
21
|
+
|
22
|
+
it { expect(options.style).to eql :red }
|
23
|
+
|
24
|
+
it { expect(options.separator).to eql :none }
|
25
|
+
|
26
|
+
it { expect(options.characters).to eql({}) }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when other BorderOptions' do
|
30
|
+
let(:object) { described_class.new(nil, nil, :blue) }
|
31
|
+
|
32
|
+
it { expect(options).to eql object }
|
33
|
+
|
34
|
+
it { expect(options.characters).to eql({}) }
|
35
|
+
|
36
|
+
it { expect(options.style).to eql :blue }
|
37
|
+
end
|
38
|
+
|
39
|
+
end # from
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::BorderOptions, '.new' do
|
6
|
+
|
7
|
+
subject(:options) { described_class.new }
|
8
|
+
|
9
|
+
its(:characters) { should eql({}) }
|
10
|
+
|
11
|
+
its(:separator) { should be_nil }
|
12
|
+
|
13
|
+
its(:style) { should be_nil }
|
14
|
+
|
15
|
+
end # new
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table, 'with style' 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 :style => :red
|
16
|
+
expect(table.border.style).to eql :red
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sets through attribute" do
|
20
|
+
table.border.style = :red
|
21
|
+
expect(table.border.style).to eql :red
|
22
|
+
end
|
23
|
+
|
24
|
+
it "renders without color" do
|
25
|
+
table.to_s.should == <<-EOS.normalize
|
26
|
+
h1 h2 h3
|
27
|
+
a1 a2 a3
|
28
|
+
b1 b2 b3
|
29
|
+
EOS
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when ascii' do
|
34
|
+
let(:renderer) { :ascii }
|
35
|
+
let(:red) { "\e[31m" }
|
36
|
+
let(:clear) { "\e[0m" }
|
37
|
+
|
38
|
+
it "renders border in color" do
|
39
|
+
table.border.style= :red
|
40
|
+
|
41
|
+
table.to_s.should == <<-EOS.normalize
|
42
|
+
#{red}+--+--+--+#{clear}
|
43
|
+
#{red}|#{clear}h1#{red}|#{clear}h2#{red}|#{clear}h3#{red}|#{clear}
|
44
|
+
#{red}+--+--+--+#{clear}
|
45
|
+
#{red}|#{clear}a1#{red}|#{clear}a2#{red}|#{clear}a3#{red}|#{clear}
|
46
|
+
#{red}|#{clear}b1#{red}|#{clear}b2#{red}|#{clear}b3#{red}|#{clear}
|
47
|
+
#{red}+--+--+--+#{clear}
|
48
|
+
EOS
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when unicode' do
|
53
|
+
let(:renderer) { :unicode }
|
54
|
+
let(:red) { "\e[31m" }
|
55
|
+
let(:clear) { "\e[0m" }
|
56
|
+
|
57
|
+
it "renders each row" do
|
58
|
+
table.border.style= :red
|
59
|
+
table.to_s.should == <<-EOS.normalize
|
60
|
+
#{red}┌──┬──┬──┐#{clear}
|
61
|
+
#{red}│#{clear}h1#{red}│#{clear}h2#{red}│#{clear}h3#{red}│#{clear}
|
62
|
+
#{red}├──┼──┼──┤#{clear}
|
63
|
+
#{red}│#{clear}a1#{red}│#{clear}a2#{red}│#{clear}a3#{red}│#{clear}
|
64
|
+
#{red}│#{clear}b1#{red}│#{clear}b2#{red}│#{clear}b3#{red}│#{clear}
|
65
|
+
#{red}└──┴──┴──┘#{clear}
|
66
|
+
EOS
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table, '#border' do
|
6
|
+
let(:header) { ['h1', 'h2', 'h3'] }
|
7
|
+
let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
|
8
|
+
let(:border) { nil }
|
9
|
+
|
10
|
+
subject(:table) { described_class.new header, rows, :renderer => renderer, :border => border }
|
11
|
+
|
12
|
+
context 'when default' do
|
13
|
+
let(:renderer) { :basic }
|
14
|
+
let(:border) { { :characters => {'top' => '-'}, :style => :red } }
|
15
|
+
|
16
|
+
it 'specifies border at initialization' do
|
17
|
+
expect(table.border.style).to eql(:red)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'specifies border in hash' do
|
21
|
+
table.border border
|
22
|
+
expect(table.border.characters['top']).to eql('-')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'specifies border in characters attribute' do
|
26
|
+
table.border.characters = {'top' => '-'}
|
27
|
+
expect(table.border.characters['top']).to eql('-')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'specifies border in block' do
|
31
|
+
table.border do
|
32
|
+
mid '='
|
33
|
+
mid_mid ' '
|
34
|
+
end
|
35
|
+
|
36
|
+
table.to_s.should == <<-EOS.normalize
|
37
|
+
h1 h2 h3
|
38
|
+
== == ==
|
39
|
+
a1 a2 a3
|
40
|
+
b1 b2 b3
|
41
|
+
EOS
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when ascii' do
|
46
|
+
let(:renderer) { :ascii }
|
47
|
+
|
48
|
+
it 'specifies border in block' do
|
49
|
+
table.border do
|
50
|
+
mid '='
|
51
|
+
mid_mid '='
|
52
|
+
mid_left '='
|
53
|
+
mid_right '='
|
54
|
+
end
|
55
|
+
|
56
|
+
table.to_s.should == <<-EOS.normalize
|
57
|
+
+--+--+--+
|
58
|
+
|h1|h2|h3|
|
59
|
+
==========
|
60
|
+
|a1|a2|a3|
|
61
|
+
|b1|b2|b3|
|
62
|
+
+--+--+--+
|
63
|
+
EOS
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'specifies border as hash' do
|
67
|
+
table.border({ :characters => {
|
68
|
+
'mid' => '=',
|
69
|
+
'mid_mid' => '=',
|
70
|
+
'mid_left' => '=',
|
71
|
+
'mid_right' => '=',
|
72
|
+
}})
|
73
|
+
|
74
|
+
table.to_s.should == <<-EOS.normalize
|
75
|
+
+--+--+--+
|
76
|
+
|h1|h2|h3|
|
77
|
+
==========
|
78
|
+
|a1|a2|a3|
|
79
|
+
|b1|b2|b3|
|
80
|
+
+--+--+--+
|
81
|
+
EOS
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when unicode' do
|
86
|
+
let(:renderer) { :unicode }
|
87
|
+
|
88
|
+
it 'specifies border in block' do
|
89
|
+
table.border do
|
90
|
+
mid '='
|
91
|
+
mid_mid '='
|
92
|
+
mid_left '='
|
93
|
+
mid_right '='
|
94
|
+
end
|
95
|
+
|
96
|
+
table.to_s.should == <<-EOS.normalize
|
97
|
+
┌──┬──┬──┐
|
98
|
+
│h1│h2│h3│
|
99
|
+
==========
|
100
|
+
│a1│a2│a3│
|
101
|
+
│b1│b2│b3│
|
102
|
+
└──┴──┴──┘
|
103
|
+
EOS
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end # border
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table, '#each_with_index' do
|
6
|
+
let(:object) { described_class.new header, rows }
|
7
|
+
let(:header) { ['Header1', 'Header2'] }
|
8
|
+
let(:rows) { [['a1', 'a2'], ['b1', 'b2']] }
|
9
|
+
|
10
|
+
context 'with no block' do
|
11
|
+
subject { object.each_with_index }
|
12
|
+
it { should be_instance_of(to_enum.class) }
|
13
|
+
|
14
|
+
it 'yields the expected values' do
|
15
|
+
subject.to_a.should eql(object.to_a)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'with block' do
|
20
|
+
subject { object.each_with_index { |el, row, col| yields << [el, row, col]}}
|
21
|
+
let(:yields) { [] }
|
22
|
+
let(:expected) { [['a1', 0, 0], ['a2', 0, 1], ['b1', 1, 0], ['b2', 1, 1]] }
|
23
|
+
|
24
|
+
it "" do
|
25
|
+
expect { subject }.to change { yields }.
|
26
|
+
from( [] ).
|
27
|
+
to( expected )
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Field, '#==' do
|
6
|
+
let(:value) { '1' }
|
7
|
+
let(:object) { described_class.new(value) }
|
8
|
+
|
9
|
+
subject { object == other }
|
10
|
+
|
11
|
+
context 'with the same object' do
|
12
|
+
let(:other) { object }
|
13
|
+
|
14
|
+
it { should be_true }
|
15
|
+
|
16
|
+
it 'is symmetric' do
|
17
|
+
should eql(other == object)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with an equivalent object' do
|
22
|
+
let(:other) { object.dup }
|
23
|
+
|
24
|
+
it { should be_true }
|
25
|
+
|
26
|
+
it 'is symmetric' do
|
27
|
+
should 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(value) }
|
33
|
+
|
34
|
+
it { should be_true }
|
35
|
+
|
36
|
+
it 'is symmetric' do
|
37
|
+
should eql(other == object)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with an object having a different value' do
|
42
|
+
let(:other_value) { '2' }
|
43
|
+
let(:other) { described_class.new(other_value) }
|
44
|
+
|
45
|
+
it { should be_false }
|
46
|
+
|
47
|
+
it 'is symmetric' do
|
48
|
+
should eql(other == object)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe TTY::Table::Field, '#new' 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
|
+
it { should be_instance_of(object) }
|
14
|
+
|
15
|
+
its(:value) { should == value }
|
16
|
+
|
17
|
+
its(:height) { should == 1 }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with hash value' do
|
21
|
+
let(:value) { { :value => 'foo' } }
|
22
|
+
|
23
|
+
it { should be_instance_of(object) }
|
24
|
+
|
25
|
+
its(:value) { should == 'foo' }
|
26
|
+
|
27
|
+
its(:height) { should == 1 }
|
28
|
+
end
|
29
|
+
end
|