tb 0.1 → 0.2
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/README +156 -5
- data/bin/tb +2 -1110
- data/lib/tb.rb +4 -2
- data/lib/tb/catreader.rb +131 -0
- data/lib/tb/cmd_cat.rb +65 -0
- data/lib/tb/cmd_consecutive.rb +79 -0
- data/lib/tb/cmd_crop.rb +105 -0
- data/lib/tb/cmd_cross.rb +119 -0
- data/lib/tb/cmd_csv.rb +42 -0
- data/lib/tb/cmd_cut.rb +77 -0
- data/lib/tb/cmd_grep.rb +76 -0
- data/lib/tb/cmd_group.rb +82 -0
- data/lib/tb/cmd_gsub.rb +77 -0
- data/lib/tb/cmd_help.rb +98 -0
- data/lib/tb/cmd_join.rb +81 -0
- data/lib/tb/cmd_json.rb +60 -0
- data/lib/tb/cmd_ls.rb +273 -0
- data/lib/tb/cmd_mheader.rb +77 -0
- data/lib/tb/cmd_newfield.rb +59 -0
- data/lib/tb/cmd_pnm.rb +43 -0
- data/lib/tb/cmd_pp.rb +70 -0
- data/lib/tb/cmd_rename.rb +58 -0
- data/lib/tb/cmd_shape.rb +67 -0
- data/lib/tb/cmd_sort.rb +58 -0
- data/lib/tb/cmd_svn_log.rb +158 -0
- data/lib/tb/cmd_tsv.rb +43 -0
- data/lib/tb/cmd_yaml.rb +47 -0
- data/lib/tb/cmdmain.rb +45 -0
- data/lib/tb/cmdtop.rb +58 -0
- data/lib/tb/cmdutil.rb +327 -0
- data/lib/tb/csv.rb +30 -6
- data/lib/tb/fieldset.rb +39 -41
- data/lib/tb/pager.rb +132 -0
- data/lib/tb/pnm.rb +357 -0
- data/lib/tb/reader.rb +18 -128
- data/lib/tb/record.rb +3 -3
- data/lib/tb/ropen.rb +70 -0
- data/lib/tb/{pathfinder.rb → search.rb} +69 -34
- data/lib/tb/tsv.rb +29 -1
- data/sample/colors.ppm +0 -0
- data/sample/gradation.pgm +0 -0
- data/sample/langs.csv +46 -0
- data/sample/tbplot +293 -0
- data/test-all-cov.rb +65 -0
- data/test-all.rb +5 -0
- data/test/test_basic.rb +99 -2
- data/test/test_catreader.rb +27 -0
- data/test/test_cmd_cat.rb +118 -0
- data/test/test_cmd_consecutive.rb +90 -0
- data/test/test_cmd_crop.rb +101 -0
- data/test/test_cmd_cross.rb +113 -0
- data/test/test_cmd_csv.rb +129 -0
- data/test/test_cmd_cut.rb +100 -0
- data/test/test_cmd_grep.rb +89 -0
- data/test/test_cmd_group.rb +181 -0
- data/test/test_cmd_gsub.rb +103 -0
- data/test/test_cmd_help.rb +190 -0
- data/test/test_cmd_join.rb +197 -0
- data/test/test_cmd_json.rb +75 -0
- data/test/test_cmd_ls.rb +203 -0
- data/test/test_cmd_mheader.rb +86 -0
- data/test/test_cmd_newfield.rb +63 -0
- data/test/test_cmd_pnm.rb +35 -0
- data/test/test_cmd_pp.rb +62 -0
- data/test/test_cmd_rename.rb +91 -0
- data/test/test_cmd_shape.rb +50 -0
- data/test/test_cmd_sort.rb +105 -0
- data/test/test_cmd_tsv.rb +67 -0
- data/test/test_cmd_yaml.rb +55 -0
- data/test/test_cmdtty.rb +154 -0
- data/test/test_cmdutil.rb +43 -0
- data/test/test_csv.rb +10 -0
- data/test/test_fieldset.rb +42 -0
- data/test/test_pager.rb +142 -0
- data/test/test_pnm.rb +374 -0
- data/test/test_reader.rb +147 -0
- data/test/test_record.rb +49 -0
- data/test/test_search.rb +575 -0
- data/test/test_tsv.rb +7 -0
- metadata +108 -5
- data/lib/tb/qtsv.rb +0 -93
data/test/test_cmd_pp.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tb/cmdtop'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
class TestTbCmdPP < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Tb::Cmd.reset_option
|
8
|
+
@curdir = Dir.pwd
|
9
|
+
@tmpdir = Dir.mktmpdir
|
10
|
+
Dir.chdir @tmpdir
|
11
|
+
end
|
12
|
+
def teardown
|
13
|
+
Tb::Cmd.reset_option
|
14
|
+
Dir.chdir @curdir
|
15
|
+
FileUtils.rmtree @tmpdir
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_basic
|
19
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
20
|
+
a,b,c
|
21
|
+
0,1,2
|
22
|
+
4,5,6
|
23
|
+
End
|
24
|
+
Tb::Cmd.main_pp(['-o', o="o.pp", i])
|
25
|
+
assert_equal(<<-"End".gsub(/\s/, ''), File.read(o).gsub(/\s/, ''))
|
26
|
+
{ "a" => "0", "b" => "1", "c" => "2" }
|
27
|
+
{ "a" => "4", "b" => "5", "c" => "6" }
|
28
|
+
End
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_extend
|
32
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
33
|
+
a,b
|
34
|
+
0,1,2,3
|
35
|
+
End
|
36
|
+
Tb::Cmd.main_pp(['-o', o="o.pp", i])
|
37
|
+
assert_equal(<<-"End".gsub(/\s/, ''), File.read(o).gsub(/\s/, ''))
|
38
|
+
{ "a" => "0", "b" => "1", "1" => "2", "2" => "3" }
|
39
|
+
End
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_twofile
|
43
|
+
File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
44
|
+
a,b
|
45
|
+
1,2
|
46
|
+
3,4
|
47
|
+
End
|
48
|
+
File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
49
|
+
b,a
|
50
|
+
5,6
|
51
|
+
7,8
|
52
|
+
End
|
53
|
+
Tb::Cmd.main_pp(['-o', o="o.csv", i1, i2])
|
54
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
55
|
+
{"a"=>"1", "b"=>"2"}
|
56
|
+
{"a"=>"3", "b"=>"4"}
|
57
|
+
{"b"=>"5", "a"=>"6"}
|
58
|
+
{"b"=>"7", "a"=>"8"}
|
59
|
+
End
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tb/cmdtop'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
class TestTbCmdRename < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Tb::Cmd.reset_option
|
8
|
+
@curdir = Dir.pwd
|
9
|
+
@tmpdir = Dir.mktmpdir
|
10
|
+
Dir.chdir @tmpdir
|
11
|
+
end
|
12
|
+
def teardown
|
13
|
+
Tb::Cmd.reset_option
|
14
|
+
Dir.chdir @curdir
|
15
|
+
FileUtils.rmtree @tmpdir
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_basic
|
19
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
20
|
+
a,b,c,d
|
21
|
+
0,1,2,3
|
22
|
+
4,5,6,7
|
23
|
+
8,9,a,b
|
24
|
+
c,d,e,f
|
25
|
+
End
|
26
|
+
Tb::Cmd.main_rename(['-o', o="o.csv", 'b,x,c,b', i])
|
27
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
28
|
+
a,x,b,d
|
29
|
+
0,1,2,3
|
30
|
+
4,5,6,7
|
31
|
+
8,9,a,b
|
32
|
+
c,d,e,f
|
33
|
+
End
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_no_rename_fields
|
37
|
+
exc = assert_raise(SystemExit) { Tb::Cmd.main_rename([]) }
|
38
|
+
assert(!exc.success?)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_empty
|
42
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
43
|
+
a,b,c,d
|
44
|
+
0,1,2,3
|
45
|
+
4,5,6,7
|
46
|
+
8,9,a,b
|
47
|
+
c,d,e,f
|
48
|
+
End
|
49
|
+
Tb::Cmd.main_rename(['-o', o="o.csv", '', i])
|
50
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
51
|
+
a,b,c,d
|
52
|
+
0,1,2,3
|
53
|
+
4,5,6,7
|
54
|
+
8,9,a,b
|
55
|
+
c,d,e,f
|
56
|
+
End
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_twofile
|
60
|
+
File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
61
|
+
a,b
|
62
|
+
1,2
|
63
|
+
3,4
|
64
|
+
End
|
65
|
+
File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
66
|
+
b,a
|
67
|
+
5,6
|
68
|
+
7,8
|
69
|
+
End
|
70
|
+
Tb::Cmd.main_rename(['-o', o="o.csv", 'a,c', i1, i2])
|
71
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
72
|
+
c,b
|
73
|
+
1,2
|
74
|
+
3,4
|
75
|
+
6,5
|
76
|
+
8,7
|
77
|
+
End
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_field_not_found
|
81
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
82
|
+
a,b
|
83
|
+
1,2
|
84
|
+
3,4
|
85
|
+
End
|
86
|
+
exc = assert_raise(SystemExit) { Tb::Cmd.main_rename(['-o', "o.csv", 'z,c', i]) }
|
87
|
+
assert(!exc.success?)
|
88
|
+
assert_match(/field not found/, exc.message)
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tb/cmdtop'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
class TestTbCmdShape < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Tb::Cmd.reset_option
|
8
|
+
@curdir = Dir.pwd
|
9
|
+
@tmpdir = Dir.mktmpdir
|
10
|
+
Dir.chdir @tmpdir
|
11
|
+
end
|
12
|
+
def teardown
|
13
|
+
Tb::Cmd.reset_option
|
14
|
+
Dir.chdir @curdir
|
15
|
+
FileUtils.rmtree @tmpdir
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_basic
|
19
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
20
|
+
a,b,c
|
21
|
+
0,1
|
22
|
+
4,5,6,7
|
23
|
+
End
|
24
|
+
Tb::Cmd.main_shape(['-o', o="o.csv", i])
|
25
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
26
|
+
header_fields,min_fields,max_fields,records,filename
|
27
|
+
3,2,4,2,i.csv
|
28
|
+
End
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_twofile
|
32
|
+
File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
33
|
+
a
|
34
|
+
1
|
35
|
+
3
|
36
|
+
End
|
37
|
+
File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
38
|
+
b,a
|
39
|
+
5,6
|
40
|
+
7,8
|
41
|
+
End
|
42
|
+
Tb::Cmd.main_shape(['-o', o="o.csv", i1, i2])
|
43
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
44
|
+
header_fields,min_fields,max_fields,records,filename
|
45
|
+
1,1,1,2,i1.csv
|
46
|
+
2,2,2,2,i2.csv
|
47
|
+
End
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tb/cmdtop'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
class TestTbCmdSort < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Tb::Cmd.reset_option
|
8
|
+
@curdir = Dir.pwd
|
9
|
+
@tmpdir = Dir.mktmpdir
|
10
|
+
Dir.chdir @tmpdir
|
11
|
+
end
|
12
|
+
def teardown
|
13
|
+
Tb::Cmd.reset_option
|
14
|
+
Dir.chdir @curdir
|
15
|
+
FileUtils.rmtree @tmpdir
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_basic
|
19
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
20
|
+
a,b
|
21
|
+
1,4
|
22
|
+
0,3
|
23
|
+
3,2
|
24
|
+
End
|
25
|
+
Tb::Cmd.main_sort(['-o', o="o.csv", i])
|
26
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
27
|
+
a,b
|
28
|
+
0,3
|
29
|
+
1,4
|
30
|
+
3,2
|
31
|
+
End
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_numeric
|
35
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
36
|
+
a,b
|
37
|
+
1,4
|
38
|
+
0,3
|
39
|
+
3,2
|
40
|
+
End
|
41
|
+
Tb::Cmd.main_sort(['-o', o="o.csv", '-N', i])
|
42
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
43
|
+
0,3
|
44
|
+
1,4
|
45
|
+
3,2
|
46
|
+
a,b
|
47
|
+
End
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_opt_f
|
51
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
52
|
+
a,b
|
53
|
+
1,4
|
54
|
+
0,3
|
55
|
+
3,2
|
56
|
+
End
|
57
|
+
Tb::Cmd.main_sort(['-o', o="o.csv", '-f', 'b', i])
|
58
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
59
|
+
a,b
|
60
|
+
3,2
|
61
|
+
0,3
|
62
|
+
1,4
|
63
|
+
End
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_cmp
|
67
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
68
|
+
a,b,c
|
69
|
+
10,a20b0,11
|
70
|
+
1,2e1,3
|
71
|
+
4,,6
|
72
|
+
7,8,9
|
73
|
+
End
|
74
|
+
Tb::Cmd.main_sort(['-o', o="o.csv", '-f', 'b', i])
|
75
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
76
|
+
a,b,c
|
77
|
+
4,,6
|
78
|
+
7,8,9
|
79
|
+
1,2e1,3
|
80
|
+
10,a20b0,11
|
81
|
+
End
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_twofile
|
85
|
+
File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
86
|
+
a,b
|
87
|
+
1,2
|
88
|
+
3,4
|
89
|
+
End
|
90
|
+
File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
91
|
+
b,a
|
92
|
+
5,0
|
93
|
+
7,8
|
94
|
+
End
|
95
|
+
Tb::Cmd.main_sort(['-o', o="o.csv", i1, i2])
|
96
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
97
|
+
a,b
|
98
|
+
0,5
|
99
|
+
1,2
|
100
|
+
3,4
|
101
|
+
8,7
|
102
|
+
End
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tb/cmdtop'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
class TestTbCmdTSV < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Tb::Cmd.reset_option
|
8
|
+
@curdir = Dir.pwd
|
9
|
+
@tmpdir = Dir.mktmpdir
|
10
|
+
Dir.chdir @tmpdir
|
11
|
+
end
|
12
|
+
def teardown
|
13
|
+
Tb::Cmd.reset_option
|
14
|
+
Dir.chdir @curdir
|
15
|
+
FileUtils.rmtree @tmpdir
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_basic
|
19
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
20
|
+
a,b,c
|
21
|
+
0,1,2
|
22
|
+
4,5,6
|
23
|
+
End
|
24
|
+
Tb::Cmd.main_tsv(['-o', o="o.tsv", i])
|
25
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
26
|
+
a\tb\tc
|
27
|
+
0\t1\t2
|
28
|
+
4\t5\t6
|
29
|
+
End
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_numeric
|
33
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
34
|
+
a,b,c
|
35
|
+
0,1,2
|
36
|
+
4,5,6
|
37
|
+
End
|
38
|
+
Tb::Cmd.main_tsv(['-o', o="o.tsv", '-N', i])
|
39
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
40
|
+
a\tb\tc
|
41
|
+
0\t1\t2
|
42
|
+
4\t5\t6
|
43
|
+
End
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_twofile
|
47
|
+
File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
48
|
+
a,b
|
49
|
+
1,2
|
50
|
+
3,4
|
51
|
+
End
|
52
|
+
File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
53
|
+
b,a
|
54
|
+
5,6
|
55
|
+
7,8
|
56
|
+
End
|
57
|
+
Tb::Cmd.main_tsv(['-o', o="o.csv", i1, i2])
|
58
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
|
59
|
+
a\tb
|
60
|
+
1\t2
|
61
|
+
3\t4
|
62
|
+
6\t5
|
63
|
+
8\t7
|
64
|
+
End
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tb/cmdtop'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
class TestTbCmdYAML < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Tb::Cmd.reset_option
|
8
|
+
@curdir = Dir.pwd
|
9
|
+
@tmpdir = Dir.mktmpdir
|
10
|
+
Dir.chdir @tmpdir
|
11
|
+
end
|
12
|
+
def teardown
|
13
|
+
Tb::Cmd.reset_option
|
14
|
+
Dir.chdir @curdir
|
15
|
+
FileUtils.rmtree @tmpdir
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_basic
|
19
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
20
|
+
a,b,c
|
21
|
+
0,1,2
|
22
|
+
4,5,6
|
23
|
+
End
|
24
|
+
Tb::Cmd.main_yaml(['-o', o="o.yaml", i])
|
25
|
+
assert_equal(
|
26
|
+
[
|
27
|
+
{'a' => '0', 'b' => '1', 'c' => '2'},
|
28
|
+
{'a' => '4', 'b' => '5', 'c' => '6'},
|
29
|
+
],
|
30
|
+
YAML.load(File.read(o)))
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_twofile
|
34
|
+
File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
35
|
+
a,b
|
36
|
+
1,2
|
37
|
+
3,4
|
38
|
+
End
|
39
|
+
File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
40
|
+
b,a
|
41
|
+
5,6
|
42
|
+
7,8
|
43
|
+
End
|
44
|
+
Tb::Cmd.main_yaml(['-o', o="o.csv", i1, i2])
|
45
|
+
assert_equal(
|
46
|
+
[
|
47
|
+
{'a' => '1', 'b' => '2'},
|
48
|
+
{'a' => '3', 'b' => '4'},
|
49
|
+
{'a' => '6', 'b' => '5'},
|
50
|
+
{'a' => '8', 'b' => '7'},
|
51
|
+
],
|
52
|
+
YAML.load(File.read(o)))
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/test/test_cmdtty.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tb/cmdtop'
|
3
|
+
require 'tmpdir'
|
4
|
+
begin
|
5
|
+
require 'pty'
|
6
|
+
require 'io/console'
|
7
|
+
rescue LoadError
|
8
|
+
end
|
9
|
+
|
10
|
+
class TestTbCmdTTY < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
Tb::Cmd.reset_option
|
13
|
+
@curdir = Dir.pwd
|
14
|
+
@tmpdir = Dir.mktmpdir
|
15
|
+
Dir.chdir @tmpdir
|
16
|
+
end
|
17
|
+
def teardown
|
18
|
+
Tb::Cmd.reset_option
|
19
|
+
Dir.chdir @curdir
|
20
|
+
FileUtils.rmtree @tmpdir
|
21
|
+
end
|
22
|
+
|
23
|
+
def with_env(k, v)
|
24
|
+
save = ENV[k]
|
25
|
+
begin
|
26
|
+
ENV[k] = v
|
27
|
+
yield
|
28
|
+
ensure
|
29
|
+
ENV[k] = save
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def with_stdout(io)
|
34
|
+
save = STDOUT.dup
|
35
|
+
STDOUT.reopen(io)
|
36
|
+
begin
|
37
|
+
yield
|
38
|
+
ensure
|
39
|
+
STDOUT.reopen(save)
|
40
|
+
save.close
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def reader_thread(io)
|
45
|
+
Thread.new {
|
46
|
+
r = ''
|
47
|
+
loop {
|
48
|
+
begin
|
49
|
+
r << io.readpartial(4096)
|
50
|
+
rescue EOFError, Errno::EIO
|
51
|
+
break
|
52
|
+
end
|
53
|
+
}
|
54
|
+
r
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_ttyout_multiscreen
|
59
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
60
|
+
a,b,c
|
61
|
+
0,1,2
|
62
|
+
4,5,6
|
63
|
+
End
|
64
|
+
with_env('PAGER', 'sed "s/^/foo:/"') {
|
65
|
+
PTY.open {|m, s|
|
66
|
+
s.raw!
|
67
|
+
s.winsize = [2, 80]
|
68
|
+
th = reader_thread(m)
|
69
|
+
with_stdout(s) {
|
70
|
+
Tb::Cmd.main_csv([i])
|
71
|
+
}
|
72
|
+
s.close
|
73
|
+
result = th.value
|
74
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
|
75
|
+
foo:a,b,c
|
76
|
+
foo:0,1,2
|
77
|
+
foo:4,5,6
|
78
|
+
End
|
79
|
+
}
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_ttyout_singlescreen
|
84
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
85
|
+
a,b,c
|
86
|
+
0,1,2
|
87
|
+
4,5,6
|
88
|
+
End
|
89
|
+
with_env('PAGER', 'sed "s/^/foo:/"') {
|
90
|
+
PTY.open {|m, s|
|
91
|
+
s.raw!
|
92
|
+
s.winsize = [24, 80]
|
93
|
+
th = reader_thread(m)
|
94
|
+
with_stdout(s) {
|
95
|
+
Tb::Cmd.main_csv([i])
|
96
|
+
}
|
97
|
+
s.close
|
98
|
+
result = th.value
|
99
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
|
100
|
+
a,b,c
|
101
|
+
0,1,2
|
102
|
+
4,5,6
|
103
|
+
End
|
104
|
+
}
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_ttyout_tab
|
109
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
110
|
+
a,b,c
|
111
|
+
0,\t,2
|
112
|
+
End
|
113
|
+
with_env('PAGER', 'sed "s/^/foo:/"') {
|
114
|
+
PTY.open {|m, s|
|
115
|
+
s.raw!
|
116
|
+
s.winsize = [3, 10]
|
117
|
+
th = reader_thread(m)
|
118
|
+
with_stdout(s) {
|
119
|
+
Tb::Cmd.main_csv([i])
|
120
|
+
}
|
121
|
+
s.close
|
122
|
+
result = th.value
|
123
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
|
124
|
+
foo:a,b,c
|
125
|
+
foo:0,\t,2
|
126
|
+
End
|
127
|
+
}
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_ttyout_nottysize
|
132
|
+
File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
|
133
|
+
a,b,c
|
134
|
+
0,1,2
|
135
|
+
End
|
136
|
+
with_env('PAGER', 'sed "s/^/foo:/"') {
|
137
|
+
PTY.open {|m, s|
|
138
|
+
s.raw!
|
139
|
+
s.winsize = [0, 0]
|
140
|
+
th = reader_thread(m)
|
141
|
+
with_stdout(s) {
|
142
|
+
Tb::Cmd.main_csv([i])
|
143
|
+
}
|
144
|
+
s.close
|
145
|
+
result = th.value
|
146
|
+
assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
|
147
|
+
a,b,c
|
148
|
+
0,1,2
|
149
|
+
End
|
150
|
+
}
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
end if defined?(PTY) && defined?(PTY.open)
|