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.
Files changed (81) hide show
  1. data/README +156 -5
  2. data/bin/tb +2 -1110
  3. data/lib/tb.rb +4 -2
  4. data/lib/tb/catreader.rb +131 -0
  5. data/lib/tb/cmd_cat.rb +65 -0
  6. data/lib/tb/cmd_consecutive.rb +79 -0
  7. data/lib/tb/cmd_crop.rb +105 -0
  8. data/lib/tb/cmd_cross.rb +119 -0
  9. data/lib/tb/cmd_csv.rb +42 -0
  10. data/lib/tb/cmd_cut.rb +77 -0
  11. data/lib/tb/cmd_grep.rb +76 -0
  12. data/lib/tb/cmd_group.rb +82 -0
  13. data/lib/tb/cmd_gsub.rb +77 -0
  14. data/lib/tb/cmd_help.rb +98 -0
  15. data/lib/tb/cmd_join.rb +81 -0
  16. data/lib/tb/cmd_json.rb +60 -0
  17. data/lib/tb/cmd_ls.rb +273 -0
  18. data/lib/tb/cmd_mheader.rb +77 -0
  19. data/lib/tb/cmd_newfield.rb +59 -0
  20. data/lib/tb/cmd_pnm.rb +43 -0
  21. data/lib/tb/cmd_pp.rb +70 -0
  22. data/lib/tb/cmd_rename.rb +58 -0
  23. data/lib/tb/cmd_shape.rb +67 -0
  24. data/lib/tb/cmd_sort.rb +58 -0
  25. data/lib/tb/cmd_svn_log.rb +158 -0
  26. data/lib/tb/cmd_tsv.rb +43 -0
  27. data/lib/tb/cmd_yaml.rb +47 -0
  28. data/lib/tb/cmdmain.rb +45 -0
  29. data/lib/tb/cmdtop.rb +58 -0
  30. data/lib/tb/cmdutil.rb +327 -0
  31. data/lib/tb/csv.rb +30 -6
  32. data/lib/tb/fieldset.rb +39 -41
  33. data/lib/tb/pager.rb +132 -0
  34. data/lib/tb/pnm.rb +357 -0
  35. data/lib/tb/reader.rb +18 -128
  36. data/lib/tb/record.rb +3 -3
  37. data/lib/tb/ropen.rb +70 -0
  38. data/lib/tb/{pathfinder.rb → search.rb} +69 -34
  39. data/lib/tb/tsv.rb +29 -1
  40. data/sample/colors.ppm +0 -0
  41. data/sample/gradation.pgm +0 -0
  42. data/sample/langs.csv +46 -0
  43. data/sample/tbplot +293 -0
  44. data/test-all-cov.rb +65 -0
  45. data/test-all.rb +5 -0
  46. data/test/test_basic.rb +99 -2
  47. data/test/test_catreader.rb +27 -0
  48. data/test/test_cmd_cat.rb +118 -0
  49. data/test/test_cmd_consecutive.rb +90 -0
  50. data/test/test_cmd_crop.rb +101 -0
  51. data/test/test_cmd_cross.rb +113 -0
  52. data/test/test_cmd_csv.rb +129 -0
  53. data/test/test_cmd_cut.rb +100 -0
  54. data/test/test_cmd_grep.rb +89 -0
  55. data/test/test_cmd_group.rb +181 -0
  56. data/test/test_cmd_gsub.rb +103 -0
  57. data/test/test_cmd_help.rb +190 -0
  58. data/test/test_cmd_join.rb +197 -0
  59. data/test/test_cmd_json.rb +75 -0
  60. data/test/test_cmd_ls.rb +203 -0
  61. data/test/test_cmd_mheader.rb +86 -0
  62. data/test/test_cmd_newfield.rb +63 -0
  63. data/test/test_cmd_pnm.rb +35 -0
  64. data/test/test_cmd_pp.rb +62 -0
  65. data/test/test_cmd_rename.rb +91 -0
  66. data/test/test_cmd_shape.rb +50 -0
  67. data/test/test_cmd_sort.rb +105 -0
  68. data/test/test_cmd_tsv.rb +67 -0
  69. data/test/test_cmd_yaml.rb +55 -0
  70. data/test/test_cmdtty.rb +154 -0
  71. data/test/test_cmdutil.rb +43 -0
  72. data/test/test_csv.rb +10 -0
  73. data/test/test_fieldset.rb +42 -0
  74. data/test/test_pager.rb +142 -0
  75. data/test/test_pnm.rb +374 -0
  76. data/test/test_reader.rb +147 -0
  77. data/test/test_record.rb +49 -0
  78. data/test/test_search.rb +575 -0
  79. data/test/test_tsv.rb +7 -0
  80. metadata +108 -5
  81. data/lib/tb/qtsv.rb +0 -93
@@ -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
@@ -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)