tb 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
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,113 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdCross < 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
+ name,year,observ
21
+ aaaa,2000,1
22
+ bbbb,2001,3
23
+ bbbb,2000,4
24
+ cccc,2002,5
25
+ End
26
+ Tb::Cmd.main_cross(['-o', o="o.csv", 'name', 'year', i])
27
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
28
+ name,aaaa,bbbb,cccc
29
+ year,count,count,count
30
+ 2000,1,1,
31
+ 2001,,1,
32
+ 2002,,,1
33
+ End
34
+ end
35
+
36
+ def test_no_hkey_fields
37
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_cross([]) }
38
+ assert(!exc.success?)
39
+ end
40
+
41
+ def test_no_vkey_fields
42
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_cross(['hk']) }
43
+ assert(!exc.success?)
44
+ end
45
+
46
+ def test_compact
47
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
48
+ name,year,observ
49
+ aaaa,2000,1
50
+ bbbb,2001,3
51
+ bbbb,2000,4
52
+ cccc,2002,5
53
+ End
54
+ Tb::Cmd.main_cross(['-o', o="o.csv", 'name', 'year', '-c', i])
55
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
56
+ year,aaaa,bbbb,cccc
57
+ 2000,1,1,
58
+ 2001,,1,
59
+ 2002,,,1
60
+ End
61
+ end
62
+
63
+ def test_sum
64
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
65
+ name,year,observ
66
+ aaaa,2000,1
67
+ bbbb,2001,3
68
+ bbbb,2000,4
69
+ cccc,2002,5
70
+ aaaa,2000,2
71
+ End
72
+ Tb::Cmd.main_cross(['-o', o="o.csv", 'name', 'year', '-a', 'sum(observ)', i])
73
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
74
+ name,aaaa,bbbb,cccc
75
+ year,sum(observ),sum(observ),sum(observ)
76
+ 2000,3,4,
77
+ 2001,,3,
78
+ 2002,,,5
79
+ End
80
+ end
81
+
82
+ def test_twofile
83
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
84
+ a,b
85
+ 1,2
86
+ 3,4
87
+ End
88
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
89
+ b,a
90
+ 5,6
91
+ 7,8
92
+ End
93
+ Tb::Cmd.main_cross(['-o', o="o.csv", 'a', 'b', i1, i2])
94
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
95
+ a,1,3,6,8
96
+ b,count,count,count,count
97
+ 2,1,,,
98
+ 4,,1,,
99
+ 5,,,1,
100
+ 7,,,,1
101
+ End
102
+ end
103
+
104
+ def test_invalid_aggregator
105
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
106
+ a,b
107
+ 1,2
108
+ 3,4
109
+ End
110
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_cross(['-o', "o.csv", 'a', 'b', '-a', 'foo', i]) }
111
+ assert(!exc.success?)
112
+ end
113
+ end
@@ -0,0 +1,129 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdCSV < 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.tsv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
20
+ a\tb\tc
21
+ 0\t1\t2
22
+ 4\t5\t6
23
+ End
24
+ Tb::Cmd.main_csv(['-o', o="o.csv", i])
25
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
26
+ a,b,c
27
+ 0,1,2
28
+ 4,5,6
29
+ End
30
+ end
31
+
32
+ def test_complement_header
33
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
34
+ a,b
35
+ 0,1,2
36
+ 4,5,6
37
+ End
38
+ Tb::Cmd.main_csv(['-o', o="o.csv", i])
39
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
40
+ a,b,1
41
+ 0,1,2
42
+ 4,5,6
43
+ End
44
+ end
45
+
46
+ def test_numeric
47
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
48
+ a
49
+ 0,1,2
50
+ 4,5,6
51
+ End
52
+ Tb::Cmd.main_csv(['-o', o="o.csv", '-N', i])
53
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
54
+ a,,
55
+ 0,1,2
56
+ 4,5,6
57
+ End
58
+ end
59
+
60
+ def test_noarg
61
+ File.open(i="i.tsv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
62
+ a,b,c
63
+ 0,1,2
64
+ 4,5,6
65
+ End
66
+ save = STDIN.dup
67
+ input = File.open(i)
68
+ STDIN.reopen(input)
69
+ Tb::Cmd.main_csv(['-o', o="o.csv"])
70
+ STDIN.reopen(save)
71
+ save.close
72
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
73
+ a,b,c
74
+ 0,1,2
75
+ 4,5,6
76
+ End
77
+ ensure
78
+ save.close if save && !save.closed?
79
+ input.close if input && !input.closed?
80
+ end
81
+
82
+ def test_pipeout
83
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
84
+ a,b,c
85
+ 0,1,2
86
+ 4,5,6
87
+ End
88
+ r, w = IO.pipe
89
+ th = Thread.new { r.read }
90
+ save = STDOUT.dup
91
+ STDOUT.reopen(w)
92
+ w.close
93
+ Tb::Cmd.main_csv([i])
94
+ STDOUT.reopen(save)
95
+ save.close
96
+ result = th.value
97
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
98
+ a,b,c
99
+ 0,1,2
100
+ 4,5,6
101
+ End
102
+ ensure
103
+ r.close if r && !r.closed?
104
+ w.close if w && !w.closed?
105
+ save.close if save && !save.closed?
106
+ end
107
+
108
+ def test_twofile
109
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
110
+ a,b
111
+ 1,2
112
+ 3,4
113
+ End
114
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
115
+ b,a
116
+ 5,6
117
+ 7,8
118
+ End
119
+ Tb::Cmd.main_csv(['-o', o="o.csv", i1, i2])
120
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
121
+ a,b
122
+ 1,2
123
+ 3,4
124
+ 6,5
125
+ 8,7
126
+ End
127
+ end
128
+
129
+ end
@@ -0,0 +1,100 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdCut < 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_cut(['-o', o="o.csv", 'b,d', i])
27
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
28
+ b,d
29
+ 1,3
30
+ 5,7
31
+ 9,b
32
+ d,f
33
+ End
34
+ end
35
+
36
+ def test_no_cut_fields
37
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_cut([]) }
38
+ assert(!exc.success?)
39
+ end
40
+
41
+ def test_opt_v
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_cut(['-o', o="o.csv", '-v', 'b,d', i])
50
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
51
+ a,c
52
+ 0,2
53
+ 4,6
54
+ 8,a
55
+ c,e
56
+ End
57
+ end
58
+
59
+ def test_extend
60
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
61
+ a,b
62
+ 0,1,2,3
63
+ End
64
+ Tb::Cmd.main_cut(['-o', o="o.csv", 'a,2,1', i])
65
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
66
+ a,2,1
67
+ 0,3,2
68
+ End
69
+ end
70
+
71
+ def test_unextendable
72
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
73
+ a,b
74
+ 0,1,2,3
75
+ End
76
+ assert_raise(ArgumentError) { Tb::Cmd.main_cut(['-o', "o.csv", '0', i]) }
77
+ end
78
+
79
+ def test_twofile
80
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
81
+ a,b
82
+ 1,2
83
+ 3,4
84
+ End
85
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
86
+ b,a
87
+ 5,6
88
+ 7,8
89
+ End
90
+ Tb::Cmd.main_cut(['-o', o="o.csv", 'a', i1, i2])
91
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
92
+ a
93
+ 1
94
+ 3
95
+ 6
96
+ 8
97
+ End
98
+ end
99
+
100
+ end
@@ -0,0 +1,89 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdGrep < 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_grep(['-o', o="o.csv", '[6f]', i])
27
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
28
+ a,b,c,d
29
+ 4,5,6,7
30
+ c,d,e,f
31
+ End
32
+ end
33
+
34
+ def test_no_regexp
35
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_grep([]) }
36
+ assert(!exc.success?)
37
+ end
38
+
39
+ def test_opt_e
40
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
41
+ a,b,c,d
42
+ 0,1,2,3
43
+ 4,5,6,7
44
+ 8,9,a,b
45
+ c,d,e,f
46
+ End
47
+ Tb::Cmd.main_grep(['-o', o="o.csv", '-e', '[6f]', i])
48
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
49
+ a,b,c,d
50
+ 4,5,6,7
51
+ c,d,e,f
52
+ End
53
+ end
54
+
55
+ def test_ruby_pred
56
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
57
+ a,b,c,d
58
+ 0,1,2,3
59
+ 4,5,6,7
60
+ 8,9,a,b
61
+ c,d,e,f
62
+ End
63
+ Tb::Cmd.main_grep(['-o', o="o.csv", '--ruby', '_["b"] == "5"', i])
64
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
65
+ a,b,c,d
66
+ 4,5,6,7
67
+ End
68
+ end
69
+
70
+ def test_twofile
71
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
72
+ a,b
73
+ 1,2
74
+ 3,4
75
+ End
76
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
77
+ b,a
78
+ 5,6
79
+ 7,8
80
+ End
81
+ Tb::Cmd.main_grep(['-o', o="o.csv", '[46]', i1, i2])
82
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
83
+ a,b
84
+ 3,4
85
+ 6,5
86
+ End
87
+ end
88
+
89
+ end
@@ -0,0 +1,181 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdGroup < 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
+ x,5,6,y
26
+ End
27
+ Tb::Cmd.main_group(['-o', o="o.csv", 'b,c', '-a', 'count', i])
28
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
29
+ b,c,count
30
+ 1,2,1
31
+ 5,6,2
32
+ 9,a,1
33
+ d,e,1
34
+ End
35
+ end
36
+
37
+ def test_no_keyfields
38
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_group([]) }
39
+ assert(!exc.success?)
40
+ end
41
+
42
+ def test_sum
43
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
44
+ a,b,c,d
45
+ 0,1,2,3
46
+ 4,5,6,7
47
+ 8,9,4,1
48
+ c,d,5,2.5
49
+ x,5,6,3
50
+ End
51
+ Tb::Cmd.main_group(['-o', o="o.csv", 'b', '-a', 'sum(d)', i])
52
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
53
+ b,sum(d)
54
+ 1,3
55
+ 5,10
56
+ 9,1
57
+ d,2.5
58
+ End
59
+ end
60
+
61
+ def test_max
62
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
63
+ a,b,c,d
64
+ 0,1,2,3
65
+ 4,5,6,7
66
+ 8,9,4,1
67
+ c,d,5,2.5
68
+ x,5,6,3
69
+ End
70
+ Tb::Cmd.main_group(['-o', o="o.csv", 'b', '-a', 'max(d)', i])
71
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
72
+ b,max(d)
73
+ 1,3
74
+ 5,7
75
+ 9,1
76
+ d,2.5
77
+ End
78
+ end
79
+
80
+ def test_min
81
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
82
+ a,b,c,d
83
+ 0,1,2,3
84
+ 4,5,6,7
85
+ 8,9,4,1
86
+ c,d,5,2.5
87
+ x,5,6,3
88
+ End
89
+ Tb::Cmd.main_group(['-o', o="o.csv", 'b', '-a', 'min(d)', i])
90
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
91
+ b,min(d)
92
+ 1,3
93
+ 5,3
94
+ 9,1
95
+ d,2.5
96
+ End
97
+ end
98
+
99
+ def test_avg
100
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
101
+ a,b,c,d
102
+ 0,1,2,3
103
+ 4,5,6,7
104
+ 8,9,4,1
105
+ c,d,5,2.5
106
+ x,5,6,3
107
+ End
108
+ Tb::Cmd.main_group(['-o', o="o.csv", 'b', '-a', 'avg(d)', i])
109
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
110
+ b,avg(d)
111
+ 1,3.0
112
+ 5,5.0
113
+ 9,1.0
114
+ d,2.5
115
+ End
116
+ end
117
+
118
+ def test_values
119
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
120
+ a,b
121
+ A,1
122
+ A,2
123
+ B,3
124
+ A,1
125
+ End
126
+ Tb::Cmd.main_group(['-o', o="o.csv", 'a', '-a', 'values(b)', i])
127
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
128
+ a,values(b)
129
+ A,"1,2,1"
130
+ B,3
131
+ End
132
+ end
133
+
134
+ def test_uniquevalues
135
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
136
+ a,b
137
+ A,1
138
+ A,2
139
+ B,3
140
+ A,1
141
+ End
142
+ Tb::Cmd.main_group(['-o', o="o.csv", 'a', '-a', 'uniquevalues(b)', i])
143
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
144
+ a,uniquevalues(b)
145
+ A,"1,2"
146
+ B,3
147
+ End
148
+ end
149
+
150
+ def test_twofile
151
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
152
+ a,b
153
+ 1,2
154
+ 3,4
155
+ End
156
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
157
+ b,a
158
+ 5,6
159
+ 7,8
160
+ End
161
+ Tb::Cmd.main_group(['-o', o="o.csv", 'a', '-a', 'count', i1, i2])
162
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
163
+ a,count
164
+ 1,1
165
+ 3,1
166
+ 6,1
167
+ 8,1
168
+ End
169
+ end
170
+
171
+ def test_invalid_aggregator
172
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
173
+ a,b
174
+ 1,2
175
+ 3,4
176
+ End
177
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_group(['-o', "o.csv", 'a', '-a', 'foo', i]) }
178
+ assert(!exc.success?)
179
+ end
180
+
181
+ end