tty 0.0.9 → 0.0.10

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 (125) hide show
  1. data/.rspec +2 -1
  2. data/.travis.yml +3 -6
  3. data/README.md +232 -134
  4. data/lib/tty/plugins/plugin.rb +56 -0
  5. data/lib/tty/plugins.rb +75 -0
  6. data/lib/tty/shell/suggestion.rb +102 -0
  7. data/lib/tty/shell.rb +41 -14
  8. data/lib/tty/system/editor.rb +111 -0
  9. data/lib/tty/system/which.rb +13 -1
  10. data/lib/tty/system.rb +44 -28
  11. data/lib/tty/table/border/null.rb +0 -9
  12. data/lib/tty/table/border/row_line.rb +21 -0
  13. data/lib/tty/table/border.rb +63 -32
  14. data/lib/tty/table/border_dsl.rb +1 -1
  15. data/lib/tty/table/column_set.rb +16 -17
  16. data/lib/tty/table/field.rb +27 -7
  17. data/lib/tty/table/header.rb +18 -9
  18. data/lib/tty/table/operation/alignment_set.rb +20 -25
  19. data/lib/tty/table/operation/escape.rb +30 -0
  20. data/lib/tty/table/operation/filter.rb +36 -0
  21. data/lib/tty/table/operation/truncation.rb +22 -11
  22. data/lib/tty/table/operation/wrapped.rb +21 -10
  23. data/lib/tty/table/operations.rb +10 -8
  24. data/lib/tty/table/orientation/horizontal.rb +1 -1
  25. data/lib/tty/table/renderer/ascii.rb +3 -3
  26. data/lib/tty/table/renderer/basic.rb +135 -65
  27. data/lib/tty/table/renderer/color.rb +1 -4
  28. data/lib/tty/table/renderer/unicode.rb +3 -3
  29. data/lib/tty/table/renderer.rb +48 -61
  30. data/lib/tty/table/row.rb +30 -3
  31. data/lib/tty/table/transformation.rb +38 -0
  32. data/lib/tty/table/validatable.rb +7 -5
  33. data/lib/tty/table.rb +78 -99
  34. data/lib/tty/terminal/color.rb +2 -2
  35. data/lib/tty/terminal/echo.rb +1 -1
  36. data/lib/tty/terminal/pager/basic.rb +52 -0
  37. data/lib/tty/terminal/pager/system.rb +39 -0
  38. data/lib/tty/terminal/pager.rb +95 -0
  39. data/lib/tty/terminal.rb +30 -1
  40. data/lib/tty/version.rb +1 -1
  41. data/lib/tty.rb +41 -1
  42. data/spec/spec_helper.rb +20 -0
  43. data/spec/tty/plugins/find_spec.rb +28 -0
  44. data/spec/tty/plugins/load_spec.rb +20 -0
  45. data/spec/tty/plugins/plugin/load_spec.rb +30 -0
  46. data/spec/tty/plugins/plugin/new_spec.rb +18 -0
  47. data/spec/tty/shell/suggest_spec.rb +50 -0
  48. data/spec/tty/support/conversion_spec.rb +3 -3
  49. data/spec/tty/support/delegatable_spec.rb +1 -1
  50. data/spec/tty/support/equatable_spec.rb +6 -9
  51. data/spec/tty/system/editor/available_spec.rb +40 -0
  52. data/spec/tty/system/editor/build_spec.rb +40 -0
  53. data/spec/tty/system/editor/command_spec.rb +16 -0
  54. data/spec/tty/system/editor/executables_spec.rb +13 -0
  55. data/spec/tty/system/editor/invoke_spec.rb +38 -0
  56. data/spec/tty/system/editor/open_spec.rb +27 -0
  57. data/spec/tty/system/platform_spec.rb +4 -6
  58. data/spec/tty/system/which/which_spec.rb +48 -0
  59. data/spec/tty/system/which_spec.rb +8 -34
  60. data/spec/tty/table/border/ascii/rendering_spec.rb +19 -5
  61. data/spec/tty/table/border/new_spec.rb +1 -1
  62. data/spec/tty/table/border/null/rendering_spec.rb +24 -8
  63. data/spec/tty/table/border/unicode/rendering_spec.rb +19 -5
  64. data/spec/tty/table/column_set/extract_widths_spec.rb +4 -15
  65. data/spec/tty/table/column_set/total_width_spec.rb +15 -0
  66. data/spec/tty/table/data_spec.rb +14 -0
  67. data/spec/tty/table/each_spec.rb +17 -4
  68. data/spec/tty/table/each_with_index_spec.rb +34 -6
  69. data/spec/tty/table/field/length_spec.rb +21 -0
  70. data/spec/tty/table/field/lines_spec.rb +21 -0
  71. data/spec/tty/table/filter_spec.rb +23 -0
  72. data/spec/tty/table/header/call_spec.rb +1 -1
  73. data/spec/tty/table/header/height_spec.rb +27 -0
  74. data/spec/tty/table/initialize_spec.rb +6 -6
  75. data/spec/tty/table/operation/alignment_set/call_spec.rb +39 -0
  76. data/spec/tty/table/operation/escape/call_spec.rb +16 -0
  77. data/spec/tty/table/operation/filter/call_spec.rb +17 -0
  78. data/spec/tty/table/operation/truncation/call_spec.rb +15 -10
  79. data/spec/tty/table/operation/truncation/truncate_spec.rb +1 -1
  80. data/spec/tty/table/operation/wrapped/call_spec.rb +15 -10
  81. data/spec/tty/table/operation/wrapped/wrap_spec.rb +1 -1
  82. data/spec/tty/table/operations/new_spec.rb +4 -4
  83. data/spec/tty/table/options_spec.rb +0 -28
  84. data/spec/tty/table/orientation_spec.rb +5 -6
  85. data/spec/tty/table/properties_spec.rb +1 -4
  86. data/spec/tty/table/render_spec.rb +57 -0
  87. data/spec/tty/table/{renders_with_spec.rb → render_with_spec.rb} +29 -10
  88. data/spec/tty/table/renderer/ascii/render_spec.rb +68 -0
  89. data/spec/tty/table/renderer/ascii/separator_spec.rb +28 -0
  90. data/spec/tty/table/renderer/basic/alignment_spec.rb +18 -16
  91. data/spec/tty/table/renderer/basic/extract_column_widths_spec.rb +17 -12
  92. data/spec/tty/table/renderer/basic/filter_spec.rb +53 -0
  93. data/spec/tty/table/renderer/basic/multiline_content_spec.rb +135 -0
  94. data/spec/tty/table/renderer/basic/new_spec.rb +13 -2
  95. data/spec/tty/table/renderer/basic/options_spec.rb +48 -0
  96. data/spec/tty/table/renderer/basic/render_spec.rb +19 -121
  97. data/spec/tty/table/renderer/basic/separator_spec.rb +14 -48
  98. data/spec/tty/table/renderer/basic/truncation_spec.rb +35 -0
  99. data/spec/tty/table/renderer/basic/wrapping_spec.rb +40 -0
  100. data/spec/tty/table/{border_spec.rb → renderer/border_spec.rb} +17 -20
  101. data/spec/tty/table/renderer/select_spec.rb +22 -0
  102. data/spec/tty/table/{border → renderer}/style_spec.rb +13 -14
  103. data/spec/tty/table/renderer/unicode/render_spec.rb +68 -0
  104. data/spec/tty/table/renderer/unicode/separator_spec.rb +26 -0
  105. data/spec/tty/table/rotate_spec.rb +2 -3
  106. data/spec/tty/table/row/call_spec.rb +1 -1
  107. data/spec/tty/table/row/each_spec.rb +31 -0
  108. data/spec/tty/table/row/height_spec.rb +27 -0
  109. data/spec/tty/table/to_s_spec.rb +3 -3
  110. data/spec/tty/table/transformation/extract_tuples_spec.rb +35 -0
  111. data/spec/tty/table/validatable/validate_options_spec.rb +1 -2
  112. data/spec/tty/terminal/home_spec.rb +3 -3
  113. data/spec/tty/terminal/page_spec.rb +13 -0
  114. data/spec/tty/terminal/pager/available_spec.rb +40 -0
  115. data/spec/tty/terminal/pager/basic/page_spec.rb +54 -0
  116. data/spec/tty/terminal/pager/command_spec.rb +16 -0
  117. data/spec/tty/terminal/pager/executables_spec.rb +13 -0
  118. data/spec/tty/terminal/pager/page_spec.rb +47 -0
  119. data/spec/tty/terminal/pager/system/page_spec.rb +29 -0
  120. data/spec/tty/text/distance/distance_spec.rb +12 -0
  121. data/tty.gemspec +7 -3
  122. metadata +160 -27
  123. data/spec/tty/table/operation/alignment_set/align_rows_spec.rb +0 -53
  124. data/spec/tty/table/renderer/pick_renderer_spec.rb +0 -25
  125. data/spec/tty/table/renderer_spec.rb +0 -49
@@ -5,10 +5,9 @@ require 'spec_helper'
5
5
  describe TTY::Table, 'orientation' do
6
6
  let(:header) { ['h1', 'h2', 'h3'] }
7
7
  let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
- let(:renderer) { :basic }
9
- let(:options) { { :orientation => orientation, :renderer => renderer } }
8
+ let(:options) { { :orientation => orientation } }
10
9
 
11
- subject { described_class.new header, rows, options }
10
+ subject { described_class.new(header, rows, options) }
12
11
 
13
12
  context 'when illegal option' do
14
13
  let(:orientation) { :accross }
@@ -26,7 +25,7 @@ describe TTY::Table, 'orientation' do
26
25
  it { expect(subject.header).to eql header }
27
26
 
28
27
  it 'preserves original rows' do
29
- expect(subject.to_a).to eql rows
28
+ expect(subject.to_a).to eql(subject.data)
30
29
  end
31
30
 
32
31
  context 'without border' do
@@ -43,7 +42,7 @@ describe TTY::Table, 'orientation' do
43
42
  let(:renderer) { :ascii }
44
43
 
45
44
  it 'diplays table' do
46
- subject.to_s.should == <<-EOS.normalize
45
+ subject.render(renderer).should == <<-EOS.normalize
47
46
  +--+--+--+
48
47
  |h1|h2|h3|
49
48
  +--+--+--+
@@ -84,7 +83,7 @@ describe TTY::Table, 'orientation' do
84
83
  let(:renderer) { :ascii }
85
84
 
86
85
  it 'diplays table' do
87
- subject.to_s.should == <<-EOS.normalize
86
+ subject.render(renderer).should == <<-EOS.normalize
88
87
  +--+--+--+
89
88
  |h1|a1|b1|
90
89
  |h2|a2|b2|
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
 
5
5
  describe TTY::Table, 'properties' do
6
6
  let(:rows) {[['a1', 'a2', 'a3'], ['b1', 'b2', 'c3']] }
7
- subject { described_class.new :rows => rows, :renderer => :basic }
7
+ subject { described_class.new rows }
8
8
 
9
9
  its(:width) { should == 6 }
10
10
 
@@ -14,8 +14,6 @@ describe TTY::Table, 'properties' do
14
14
 
15
15
  its(:size) { should == [2,3] }
16
16
 
17
- its(:width) { should == 6 }
18
-
19
17
  context 'no size' do
20
18
  let(:rows) { [] }
21
19
 
@@ -23,5 +21,4 @@ describe TTY::Table, 'properties' do
23
21
 
24
22
  its(:column_size) { should == 0 }
25
23
  end
26
-
27
24
  end
@@ -0,0 +1,57 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table, '#render' do
6
+ let(:object) { described_class }
7
+ let(:header) { ['h1', 'h2'] }
8
+ let(:rows) { [['a1', 'a2'], ['b1', 'b2']] }
9
+ let(:basic_renderer) { TTY::Table::Renderer::Basic }
10
+ let(:ascii_renderer) { TTY::Table::Renderer::ASCII }
11
+
12
+ subject(:table) { object.new header, rows }
13
+
14
+ it { should respond_to(:render) }
15
+
16
+ context 'with block' do
17
+ it 'allows to modify renderer in a block' do
18
+ expected = nil
19
+ block = lambda { |renderer| expected = renderer }
20
+ table.render(&block)
21
+ expect(expected).to be_kind_of(basic_renderer)
22
+ end
23
+
24
+ it 'sets renderer as block parameter' do
25
+ expected = nil
26
+ block = lambda { |renderer| expected = renderer }
27
+ table.render(:ascii, &block)
28
+ expect(expected).to be_kind_of(ascii_renderer)
29
+ end
30
+
31
+ it 'sets parameter on renderer' do
32
+ result = table.render :ascii do |renderer|
33
+ renderer.border.style = :red
34
+ end
35
+ result.should == <<-EOS.normalize
36
+ \e[31m+--+--+\e[0m
37
+ \e[31m|\e[0mh1\e[31m|\e[0mh2\e[31m|\e[0m
38
+ \e[31m+--+--+\e[0m
39
+ \e[31m|\e[0ma1\e[31m|\e[0ma2\e[31m|\e[0m
40
+ \e[31m|\e[0mb1\e[31m|\e[0mb2\e[31m|\e[0m
41
+ \e[31m+--+--+\e[0m
42
+ EOS
43
+ end
44
+ end
45
+
46
+ context 'with params' do
47
+ it 'sets params without renderer' do
48
+ TTY::Table::Renderer.should_receive(:render).with(table, {renderer: :basic})
49
+ table.render(:basic)
50
+ end
51
+
52
+ it 'sets params with renderer' do
53
+ TTY::Table::Renderer.should_receive(:render).with(table, {})
54
+ table.render
55
+ end
56
+ end
57
+ end
@@ -2,19 +2,19 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe TTY::Table, '#renders_with' do
5
+ describe TTY::Table, '#render_with' do
6
6
  let(:header) { ['h1', 'h2', 'h3'] }
7
- let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
- let(:table) { described_class.new header, rows }
7
+ let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
+ let(:table) { described_class.new header, rows }
9
9
 
10
10
  context 'with invalid border class' do
11
11
  it "doesn't inherit from TTY::Table::Border" do
12
- expect { table.renders_with String }.to raise_error(TTY::TypeError)
12
+ expect { table.render_with String }.to raise_error(TTY::TypeError)
13
13
  end
14
14
 
15
15
  it "doesn't implement def_border" do
16
16
  klass = Class.new(TTY::Table::Border)
17
- expect { table.renders_with klass }.to raise_error(TTY::NoImplementationError)
17
+ expect { table.render_with klass }.to raise_error(TTY::NoImplementationError)
18
18
  end
19
19
  end
20
20
 
@@ -42,8 +42,7 @@ describe TTY::Table, '#renders_with' do
42
42
  }
43
43
 
44
44
  it 'displays custom border' do
45
- table.renders_with MyBorder
46
- table.to_s.should == <<-EOS.normalize
45
+ table.render_with(MyBorder).should == <<-EOS.normalize
47
46
  *==*==*==*
48
47
  $h1$h2$h3$
49
48
  *==*==*==*
@@ -70,8 +69,7 @@ describe TTY::Table, '#renders_with' do
70
69
  }
71
70
 
72
71
  it 'displays border' do
73
- table.renders_with MyBorder
74
- table.to_s.should == <<-EOS.normalize
72
+ table.render_with(MyBorder).should == <<-EOS.normalize
75
73
  $h1$h2$h3$
76
74
  $a1$a2$a3$
77
75
  $b1$b2$b3$
@@ -80,4 +78,25 @@ describe TTY::Table, '#renders_with' do
80
78
  end
81
79
  end
82
80
 
83
- end # renders_with
81
+ context 'with renderer' do
82
+ before {
83
+ class MyBorder < TTY::Table::Border
84
+ def_border do
85
+ left '|'
86
+ right '|'
87
+ end
88
+ end
89
+ }
90
+
91
+ it 'displays border' do
92
+ result = table.render_with MyBorder do |renderer|
93
+ renderer.border.style = :red
94
+ end
95
+ result.should == <<-EOS.normalize
96
+ \e[31m|\e[0mh1\e[31m\e[0mh2\e[31m\e[0mh3\e[31m|\e[0m
97
+ \e[31m|\e[0ma1\e[31m\e[0ma2\e[31m\e[0ma3\e[31m|\e[0m
98
+ \e[31m|\e[0mb1\e[31m\e[0mb2\e[31m\e[0mb3\e[31m|\e[0m
99
+ EOS
100
+ end
101
+ end
102
+ end # render_with
@@ -0,0 +1,68 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Renderer::ASCII, '#render' do
6
+ let(:header) { ['h1', 'h2', 'h3'] }
7
+ let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
+ let(:table) { TTY::Table.new header, rows }
9
+
10
+ subject { described_class.new(table) }
11
+
12
+ context 'only rows' do
13
+ let(:table) { TTY::Table.new rows }
14
+
15
+ it 'display table rows' do
16
+ subject.render.should == <<-EOS.normalize
17
+ +--+--+--+
18
+ |a1|a2|a3|
19
+ |b1|b2|b3|
20
+ +--+--+--+
21
+ EOS
22
+ end
23
+ end
24
+
25
+ context 'with header' do
26
+ it 'displays table with header' do
27
+ subject.render.should == <<-EOS.normalize
28
+ +--+--+--+
29
+ |h1|h2|h3|
30
+ +--+--+--+
31
+ |a1|a2|a3|
32
+ |b1|b2|b3|
33
+ +--+--+--+
34
+ EOS
35
+ end
36
+ end
37
+
38
+ context 'with short header' do
39
+ let(:header) { ['h1', 'h2'] }
40
+ let(:rows) { [['aaa1', 'a2'], ['b1', 'bb1']] }
41
+
42
+ it 'displays table according to widths' do
43
+ subject.render.should == <<-EOS.normalize
44
+ +----+---+
45
+ |h1 |h2 |
46
+ +----+---+
47
+ |aaa1|a2 |
48
+ |b1 |bb1|
49
+ +----+---+
50
+ EOS
51
+ end
52
+ end
53
+
54
+ context 'with long header' do
55
+ let(:header) { ['header1', 'header2', 'header3'] }
56
+
57
+ it 'header greater than row sizes' do
58
+ subject.render.should == <<-EOS.normalize
59
+ +-------+-------+-------+
60
+ |header1|header2|header3|
61
+ +-------+-------+-------+
62
+ |a1 |a2 |a3 |
63
+ |b1 |b2 |b3 |
64
+ +-------+-------+-------+
65
+ EOS
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Renderer::ASCII, 'with separator' do
6
+ let(:header) { ['h1', 'h2', 'h3'] }
7
+ let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
+ let(:table) { TTY::Table.new(header, rows) }
9
+
10
+ let(:object) { described_class.new table }
11
+
12
+ subject(:renderer) { object }
13
+
14
+ context 'when ascii' do
15
+ it "renders each row" do
16
+ renderer.border.separator= :each_row
17
+ renderer.render.should == <<-EOS.normalize
18
+ +--+--+--+
19
+ |h1|h2|h3|
20
+ +--+--+--+
21
+ |a1|a2|a3|
22
+ +--+--+--+
23
+ |b1|b2|b3|
24
+ +--+--+--+
25
+ EOS
26
+ end
27
+ end
28
+ end
@@ -2,20 +2,22 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe TTY::Table, 'alignment' do
5
+ describe TTY::Table::Renderer::Basic, 'alignment' do
6
6
  let(:header) { ['h1', 'h2', 'h3'] }
7
7
  let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
8
  let(:options) { { :renderer => :basic, :column_aligns => column_aligns }}
9
9
 
10
- subject(:table) { described_class.new header, rows, options }
10
+ let(:table) { TTY::Table.new(header, rows) }
11
+
12
+ subject(:renderer) { described_class.new table, options }
11
13
 
12
14
  context 'with default' do
13
15
  let(:header) { ['h1', 'h2'] }
14
- let(:rows) { [['aaaaa', 'a'], ['b', 'bbbbb']] }
16
+ let(:rows) { [['aaaaa', 'a'], ['b', 'bbbbb']] }
15
17
  let(:column_aligns) { nil }
16
18
 
17
19
  it 'aligns left by default' do
18
- table.to_s.should == <<-EOS.normalize
20
+ renderer.render.should == <<-EOS.normalize
19
21
  h1 h2
20
22
  aaaaa a
21
23
  b bbbbb
@@ -28,7 +30,7 @@ describe TTY::Table, 'alignment' do
28
30
  let(:column_aligns) { [:left, :center, :right] }
29
31
 
30
32
  it 'aligns headers' do
31
- table.to_s.should == <<-EOS.normalize
33
+ renderer.render.should == <<-EOS.normalize
32
34
  header1 head2 h3
33
35
  a1 a2 a3
34
36
  b1 b2 b3
@@ -42,7 +44,7 @@ describe TTY::Table, 'alignment' do
42
44
  let(:column_aligns) { [:left, :right] }
43
45
 
44
46
  it 'aligns table rows' do
45
- table.to_s.should == <<-EOS.normalize
47
+ renderer.render.to_s.should == <<-EOS.normalize
46
48
  aaaaa a
47
49
  b bbbbb
48
50
  EOS
@@ -52,15 +54,17 @@ describe TTY::Table, 'alignment' do
52
54
  context 'with individual field aligns' do
53
55
  let(:header) { ['header1', 'header2', 'header3'] }
54
56
  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|
57
+ let(:options) { { :column_aligns => column_aligns, :renderer => :basic } }
58
+ let(:table) {
59
+ TTY::Table.new :header => header do |t|
59
60
  t << ['a1', 'a2', 'a3']
60
61
  t << ['b1', {:value => 'b2', :align => :right}, 'b3']
61
62
  t << ['c1', 'c2', {:value => 'c3', :align => :center}]
62
63
  end
63
- table.to_s.should == <<-EOS.normalize
64
+ }
65
+
66
+ it "takes individual fields over global aligns" do
67
+ renderer.render.should == <<-EOS.normalize
64
68
  header1 header2 header3
65
69
  a1 a2 a3
66
70
  b1 b2 b3
@@ -71,17 +75,15 @@ describe TTY::Table, 'alignment' do
71
75
 
72
76
  context 'with aligned header' do
73
77
  let(:rows) { [['aaaaa1', 'a2', 'aaa3'], ['b1', 'bbbb2', 'bb3']] }
78
+ let(:header) {['h1', {:value => 'h2', :align => :right}, {:value => 'h3', :align => :center}] }
79
+ let(:options) { { :renderer => :basic } }
74
80
 
75
81
  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
82
+ renderer.render.should == <<-EOS.normalize
80
83
  h1 h2 h3
81
84
  aaaaa1 a2 aaa3
82
85
  b1 bbbb2 bb3
83
86
  EOS
84
87
  end
85
-
86
88
  end
87
89
  end
@@ -3,21 +3,26 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe TTY::Table::Renderer::Basic, '#extract_column_widths' do
6
- let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
6
+ let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
7
+ let(:object) { described_class.new(table) }
7
8
 
8
- subject { described_class.new }
9
+ subject { object.render }
9
10
 
10
- it 'calculates column widths' do
11
- rows = [['a1a', 'a2a2a2'], ['b1b1b', 'b2b2']]
12
- table = TTY::Table.new rows, :renderer => :basic
13
- subject.render(table)
14
- table.column_widths.should == [5,6]
11
+ context 'with rows only' do
12
+ let(:rows) { [['a1a', 'a2a2a2'], ['b1b1b', 'b2b2']] }
13
+ let(:table) { TTY::Table.new rows }
14
+
15
+ it 'calculates column widths' do
16
+ object.column_widths.should == [5,6]
17
+ end
15
18
  end
16
19
 
17
- it 'calcualtes column widths with header' do
18
- header = ['header1', 'head2', 'h3']
19
- table = TTY::Table.new header, rows
20
- subject.render(table)
21
- table.column_widths.should == [7,5,2]
20
+ context 'with header' do
21
+ let(:header) { ['header1', 'head2', 'h3'] }
22
+ let(:table) { TTY::Table.new header, rows }
23
+
24
+ it 'calcualtes column widths with header' do
25
+ object.column_widths.should == [7,5,2]
26
+ end
22
27
  end
23
28
  end
@@ -0,0 +1,53 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Renderer::Basic, 'filter' do
6
+ let(:header) { ['h1', 'h2', 'h3'] }
7
+ let(:rows) { [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']] }
8
+ let(:table) { TTY::Table.new(header, rows) }
9
+
10
+ subject(:renderer) { described_class.new(table, {filter: filter}) }
11
+
12
+ context 'with header' do
13
+ context 'filtering only rows' do
14
+ let(:filter) { Proc.new { |val, row, col|
15
+ (col == 1 and row > 0) ? val.capitalize : val
16
+ }
17
+ }
18
+
19
+ it 'filters only rows' do
20
+ subject.render.should == <<-EOS.normalize
21
+ h1 h2 h3
22
+ a1 A2 a3
23
+ b1 B2 b3
24
+ EOS
25
+ end
26
+ end
27
+
28
+ context 'filtering header and rows' do
29
+ let(:filter) { Proc.new { |val, row, col| col == 1 ? val.capitalize : val }}
30
+
31
+ it 'filters only rows' do
32
+ subject.render.should == <<-EOS.normalize
33
+ h1 H2 h3
34
+ a1 A2 a3
35
+ b1 B2 b3
36
+ EOS
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'without header' do
42
+ let(:header) { nil }
43
+
44
+ let(:filter) { Proc.new { |val, row, col| col == 1 ? val.capitalize : val } }
45
+
46
+ it 'filters only rows' do
47
+ subject.render.should == <<-EOS.normalize
48
+ a1 A2 a3
49
+ b1 B2 b3
50
+ EOS
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,135 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Renderer::Basic, 'with multiline content' do
6
+ let(:header) { nil }
7
+ let(:object) { described_class }
8
+ let(:table) { TTY::Table.new header, rows }
9
+
10
+ subject(:renderer) { object.new table }
11
+
12
+ context 'with escaping' do
13
+ let(:rows) { [ ["First", '1'], ["Multiline\nContent", '2'], ["Third", '3']] }
14
+
15
+ context 'without border' do
16
+ it "renders single line" do
17
+ table.render(multiline: false).should == <<-EOS.normalize
18
+ First 1
19
+ Multiline\\nContent 2
20
+ Third 3
21
+ EOS
22
+ end
23
+ end
24
+
25
+ context 'with column widths' do
26
+ it "renders single line" do
27
+ table.render(multiline: false, column_widths: [8,1]).should == <<-EOS.normalize
28
+ First 1
29
+ Multili… 2
30
+ Third 3
31
+ EOS
32
+ end
33
+ end
34
+
35
+ context 'with border' do
36
+ it "renders single line" do
37
+ table.render(:ascii, multiline: false).should == <<-EOS.normalize
38
+ +------------------+-+
39
+ |First |1|
40
+ |Multiline\\nContent|2|
41
+ |Third |3|
42
+ +------------------+-+
43
+ EOS
44
+ end
45
+ end
46
+
47
+ context 'with header' do
48
+ let(:header) { ["Multi\nHeader", "header2"] }
49
+
50
+ it "renders header" do
51
+ table.render(:ascii, multiline: false).should == <<-EOS.normalize
52
+ +------------------+-------+
53
+ |Multi\\nHeader |header2|
54
+ +------------------+-------+
55
+ |First |1 |
56
+ |Multiline\\nContent|2 |
57
+ |Third |3 |
58
+ +------------------+-------+
59
+ EOS
60
+ end
61
+ end
62
+ end
63
+
64
+ context 'without escaping' do
65
+ let(:rows) { [ ["First", '1'], ["Multi\nLine\nContent", '2'], ["Third", '3']] }
66
+
67
+ context 'without border' do
68
+ it "renders every line" do
69
+ table.render(multiline: true).should == <<-EOS.normalize
70
+ First 1
71
+ Multi 2
72
+ Line
73
+ Content
74
+ Third 3
75
+ EOS
76
+ end
77
+ end
78
+
79
+ context 'with column widths' do
80
+ it "renders multiline" do
81
+ table.render(multiline: true, column_widths: [8,1]).should == <<-EOS.normalize
82
+ First 1
83
+ Multi 2
84
+ Line
85
+ Content
86
+ Third 3
87
+ EOS
88
+ end
89
+
90
+ it 'wraps multi line' do
91
+ table.render(multiline: true, column_widths: [5,1]).should == <<-EOS.normalize
92
+ First 1
93
+ Multi 2
94
+ Line
95
+ Conte
96
+ nt
97
+ Third 3
98
+ EOS
99
+ end
100
+ end
101
+
102
+ context 'with border' do
103
+ it "renders every line" do
104
+ table.render(:ascii, multiline: true).should == <<-EOS.normalize
105
+ +-------+-+
106
+ |First |1|
107
+ |Multi |2|
108
+ |Line | |
109
+ |Content| |
110
+ |Third |3|
111
+ +-------+-+
112
+ EOS
113
+ end
114
+ end
115
+
116
+ context 'with header' do
117
+ let(:header) { ["Multi\nHeader", "header2"] }
118
+
119
+ it "renders header" do
120
+ table.render(:ascii, multiline: true).should == <<-EOS.normalize
121
+ +-------+-------+
122
+ |Multi |header2|
123
+ |Header | |
124
+ +-------+-------+
125
+ |First |1 |
126
+ |Multi |2 |
127
+ |Line | |
128
+ |Content| |
129
+ |Third |3 |
130
+ +-------+-------+
131
+ EOS
132
+ end
133
+ end
134
+ end
135
+ end
@@ -3,9 +3,20 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe TTY::Table::Renderer::Basic do
6
+ let(:header) { ['h1'] }
7
+ let(:rows) { [['a1']] }
6
8
 
7
- subject { described_class.new }
9
+ subject(:renderer) { described_class }
8
10
 
9
- it { should respond_to(:render) }
11
+ context 'without table' do
12
+ let(:table) { nil }
10
13
 
14
+ it { expect { renderer.new(table) }.to raise_error(TTY::ArgumentRequired) }
15
+ end
16
+
17
+ context 'with table' do
18
+ let(:table) { TTY::Table.new(header, rows) }
19
+
20
+ it { expect { renderer.new(table) }.not_to raise_error }
21
+ end
11
22
  end
@@ -0,0 +1,48 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Table::Renderer::Basic, 'options' do
6
+ let(:rows) { [['a1', 'a2'], ['b1', 'b2']] }
7
+ let(:object) { described_class }
8
+ let(:table) { TTY::Table.new(rows) }
9
+ let(:widths) { nil }
10
+ let(:aligns) { [] }
11
+ let(:options) {
12
+ {
13
+ :column_widths => widths,
14
+ :column_aligns => aligns,
15
+ :renderer => :basic
16
+ }
17
+ }
18
+
19
+ subject { object.new table, options }
20
+
21
+ its(:border) { should be_kind_of TTY::Table::BorderOptions }
22
+
23
+ its(:column_widths) { should be_empty }
24
+
25
+ its(:column_aligns) { should eql(aligns) }
26
+
27
+ it { subject.column_aligns.to_a.should be_empty }
28
+
29
+ context '#column_widths' do
30
+ let(:widths) { [10, 10] }
31
+
32
+ its(:column_widths) { should == widths }
33
+ end
34
+
35
+ context '#column_widths empty' do
36
+ let(:widths) { [] }
37
+
38
+ it { expect { subject }.to raise_error(TTY::InvalidArgument) }
39
+ end
40
+
41
+ context '#column_aligns' do
42
+ let(:aligns) { [:center, :center] }
43
+
44
+ it 'unwraps original array' do
45
+ subject.column_aligns.to_a.should == aligns
46
+ end
47
+ end
48
+ end