tb 0.9 → 1.0

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/README +13 -11
  3. data/lib/tb.rb +14 -6
  4. data/lib/tb/catreader.rb +2 -2
  5. data/lib/tb/cmd_consecutive.rb +6 -2
  6. data/lib/tb/cmd_crop.rb +22 -3
  7. data/lib/tb/cmd_cross.rb +24 -0
  8. data/lib/tb/cmd_cut.rb +20 -10
  9. data/lib/tb/cmd_git.rb +20 -7
  10. data/lib/tb/cmd_group.rb +32 -0
  11. data/lib/tb/cmd_gsub.rb +21 -0
  12. data/lib/tb/cmd_join.rb +28 -0
  13. data/lib/tb/cmd_ls.rb +9 -0
  14. data/lib/tb/cmd_melt.rb +15 -0
  15. data/lib/tb/cmd_mheader.rb +15 -0
  16. data/lib/tb/cmd_nest.rb +27 -6
  17. data/lib/tb/cmd_newfield.rb +19 -2
  18. data/lib/tb/cmd_rename.rb +20 -0
  19. data/lib/tb/{cmd_grep.rb → cmd_search.rb} +37 -23
  20. data/lib/tb/cmd_shape.rb +69 -25
  21. data/lib/tb/cmd_sort.rb +20 -0
  22. data/lib/tb/cmd_tar.rb +38 -0
  23. data/lib/tb/cmd_to_json.rb +2 -2
  24. data/lib/tb/cmd_to_ltsv.rb +3 -3
  25. data/lib/tb/cmd_to_pnm.rb +3 -3
  26. data/lib/tb/cmd_to_tsv.rb +3 -3
  27. data/lib/tb/cmd_to_yaml.rb +3 -3
  28. data/lib/tb/cmd_unmelt.rb +15 -0
  29. data/lib/tb/cmd_unnest.rb +31 -7
  30. data/lib/tb/cmdmain.rb +2 -0
  31. data/lib/tb/cmdtop.rb +1 -1
  32. data/lib/tb/cmdutil.rb +9 -62
  33. data/lib/tb/csv.rb +21 -79
  34. data/lib/tb/enumerable.rb +42 -68
  35. data/lib/tb/enumerator.rb +15 -7
  36. data/lib/tb/{fieldset.rb → hashreader.rb} +37 -56
  37. data/lib/tb/hashwriter.rb +54 -0
  38. data/lib/tb/headerreader.rb +108 -0
  39. data/lib/tb/headerwriter.rb +116 -0
  40. data/lib/tb/json.rb +17 -15
  41. data/lib/tb/ltsv.rb +35 -96
  42. data/lib/tb/ndjson.rb +63 -0
  43. data/lib/tb/numericreader.rb +66 -0
  44. data/lib/tb/numericwriter.rb +61 -0
  45. data/lib/tb/pnm.rb +206 -200
  46. data/lib/tb/ropen.rb +54 -59
  47. data/lib/tb/tsv.rb +39 -71
  48. data/sample/excel2csv +24 -25
  49. data/sample/poi-xls2csv.rb +13 -14
  50. data/tb.gemspec +154 -0
  51. data/test/test_cmd_cat.rb +28 -6
  52. data/test/test_cmd_consecutive.rb +8 -3
  53. data/test/test_cmd_cut.rb +14 -4
  54. data/test/test_cmd_git_log.rb +50 -50
  55. data/test/test_cmd_grep.rb +6 -6
  56. data/test/test_cmd_gsub.rb +7 -2
  57. data/test/test_cmd_ls.rb +70 -62
  58. data/test/test_cmd_shape.rb +43 -6
  59. data/test/test_cmd_svn_log.rb +26 -27
  60. data/test/test_cmd_to_csv.rb +10 -5
  61. data/test/test_cmd_to_json.rb +16 -0
  62. data/test/test_cmd_to_ltsv.rb +2 -2
  63. data/test/test_cmd_to_pp.rb +7 -2
  64. data/test/test_csv.rb +74 -62
  65. data/test/test_ex_enumerable.rb +0 -1
  66. data/test/test_fileenumerator.rb +3 -3
  67. data/test/test_headercsv.rb +43 -0
  68. data/test/test_json.rb +2 -2
  69. data/test/test_ltsv.rb +22 -17
  70. data/test/test_ndjson.rb +62 -0
  71. data/test/test_numericcsv.rb +36 -0
  72. data/test/test_pnm.rb +69 -70
  73. data/test/test_reader.rb +27 -124
  74. data/test/test_tbenum.rb +18 -18
  75. data/test/test_tsv.rb +21 -32
  76. data/test/util_tbtest.rb +12 -0
  77. metadata +41 -19
  78. data/lib/tb/basic.rb +0 -1070
  79. data/lib/tb/reader.rb +0 -106
  80. data/lib/tb/record.rb +0 -158
  81. data/test/test_basic.rb +0 -403
  82. data/test/test_fieldset.rb +0 -42
  83. data/test/test_record.rb +0 -61
@@ -0,0 +1,43 @@
1
+ require 'tb'
2
+ require 'test/unit'
3
+
4
+ class TestTbHeaderCSV < Test::Unit::TestCase
5
+ def test_reader
6
+ csv = <<-'End'.gsub(/^\s*/, '')
7
+ A,B,C
8
+ a,b,c
9
+ d,e,f
10
+ End
11
+ reader = Tb::HeaderCSVReader.new(StringIO.new(csv))
12
+ assert_equal({"A"=>"a", "B"=>"b", "C"=>"c"}, reader.get_hash)
13
+ assert_equal({"A"=>"d", "B"=>"e", "C"=>"f"}, reader.get_hash)
14
+ assert_equal(nil, reader.get_hash)
15
+ assert_equal(nil, reader.get_hash)
16
+ end
17
+
18
+ def test_writer
19
+ arys = []
20
+ writer = Tb::HeaderCSVWriter.new(arys)
21
+ assert_equal([], arys)
22
+ writer.put_hash({"A"=>"a", "B"=>"b", "C"=>"c"})
23
+ assert_equal([], arys)
24
+ writer.put_hash({"A"=>"d", "B"=>"e", "C"=>"f"})
25
+ assert_equal([], arys)
26
+ writer.finish
27
+ assert_equal(["A,B,C\n", "a,b,c\n", "d,e,f\n"], arys)
28
+ end
29
+
30
+ def test_writer_known_header
31
+ arys = []
32
+ writer = Tb::HeaderCSVWriter.new(arys)
33
+ writer.header_generator = lambda { %w[A B C] }
34
+ assert_equal([], arys)
35
+ writer.put_hash({"A"=>"a", "B"=>"b", "C"=>"c"})
36
+ assert_equal(["A,B,C\n", "a,b,c\n"], arys)
37
+ writer.put_hash({"A"=>"d", "B"=>"e", "C"=>"f"})
38
+ assert_equal(["A,B,C\n", "a,b,c\n", "d,e,f\n"], arys)
39
+ writer.finish
40
+ assert_equal(["A,B,C\n", "a,b,c\n", "d,e,f\n"], arys)
41
+ end
42
+
43
+ end
@@ -3,13 +3,13 @@ require 'test/unit'
3
3
 
4
4
  class TestTbJSON < Test::Unit::TestCase
5
5
  def test_parse
6
- r = Tb::JSONReader.new('[{"a":1, "b":2}, {"a":3, "b":4}]')
6
+ r = Tb::JSONReader.new(StringIO.new('[{"a":1, "b":2}, {"a":3, "b":4}]'))
7
7
  result = []
8
8
  r.with_header {|header|
9
9
  result << header
10
10
  }.each {|obj|
11
11
  result << obj
12
12
  }
13
- assert_equal([nil, {"a"=>1, "b"=>2}, {"a"=>3, "b"=>4}], result)
13
+ assert_equal([%w[a b], {"a"=>1, "b"=>2}, {"a"=>3, "b"=>4}], result)
14
14
  end
15
15
  end
@@ -2,6 +2,17 @@ require 'tb'
2
2
  require 'test/unit'
3
3
 
4
4
  class TestTbLTSV < Test::Unit::TestCase
5
+ def parse_ltsv(ltsv)
6
+ Tb::LTSVReader.new(StringIO.new(ltsv)).to_a
7
+ end
8
+
9
+ def generate_ltsv(ary)
10
+ writer = Tb::LTSVWriter.new(out = '')
11
+ ary.each {|h| writer.put_hash h }
12
+ writer.finish
13
+ out
14
+ end
15
+
5
16
  def test_escape_and_unescape
6
17
  0x00.upto(0x7f) {|c|
7
18
  s = [c].pack("C")
@@ -11,38 +22,32 @@ class TestTbLTSV < Test::Unit::TestCase
11
22
  end
12
23
 
13
24
  def test_parse
14
- r = Tb::LTSVReader.new("a:1\tb:2\na:3\tb:4\n")
25
+ r = Tb::LTSVReader.new(StringIO.new("a:1\tb:2\na:3\tb:4\n"))
15
26
  result = []
16
27
  r.with_header {|header|
17
28
  result << header
18
29
  }.each {|obj|
19
30
  result << obj
20
31
  }
21
- assert_equal([nil, {"a"=>"1", "b"=>"2"}, {"a"=>"3", "b"=>"4"}], result)
32
+ assert_equal([%w[a b], {"a"=>"1", "b"=>"2"}, {"a"=>"3", "b"=>"4"}], result)
22
33
  end
23
34
 
24
35
  def test_parse2
25
- ltsv = "a:1\tb:2\n"
26
- t = Tb.parse_ltsv(ltsv)
27
- records = []
28
- t.each_record {|record|
29
- records << record.to_h_with_reserved
30
- }
36
+ t = parse_ltsv("a:1\tb:2\n")
31
37
  assert_equal(
32
- [{"_recordid"=>0, "a"=>"1", "b"=>"2"}],
33
- records)
38
+ [{"a"=>"1", "b"=>"2"}],
39
+ t)
34
40
  end
35
41
 
36
42
  def test_generate_ltsv
37
- tbl = Tb.new %w[a b], %w[foo bar]
38
- tbl.generate_ltsv(out="")
39
- assert_equal("a:foo\tb:bar\n", out)
43
+ t = [{'a' => 'foo', 'b' => 'bar'}]
44
+ assert_equal("a:foo\tb:bar\n", generate_ltsv(t))
40
45
  end
41
46
 
42
- def test_generate_ltsv_with_block
43
- tbl = Tb.new %w[a b], %w[foo bar], %w[q w]
44
- tbl.generate_ltsv(out="") {|recids| recids.reverse }
45
- assert_equal("a:q\tb:w\na:foo\tb:bar\n", out)
47
+ def test_generate_ltsv2
48
+ t = [{'a' => 'foo', 'b' => 'bar'},
49
+ {'a' => 'q', 'b' => 'w'}]
50
+ assert_equal("a:foo\tb:bar\na:q\tb:w\n", generate_ltsv(t))
46
51
  end
47
52
 
48
53
  end
@@ -0,0 +1,62 @@
1
+ require 'tb'
2
+ require 'test/unit'
3
+
4
+ class TestTbNDJSON < Test::Unit::TestCase
5
+ def parse_ndjson(ndjson)
6
+ Tb::NDJSONReader.new(StringIO.new(ndjson)).to_a
7
+ end
8
+
9
+ def generate_ndjson(ary)
10
+ writer = Tb::NDJSONWriter.new(out = '')
11
+ ary.each {|h| writer.put_hash h }
12
+ writer.finish
13
+ out
14
+ end
15
+
16
+ def test_reader
17
+ ndjson = <<-'End'
18
+ {"A":"a","B":"b","C":"c"}
19
+ {"A":"d","B":"e","C":"f"}
20
+ End
21
+ reader = Tb::NDJSONReader.new(StringIO.new(ndjson))
22
+ assert_equal({"A"=>"a", "B"=>"b", "C"=>"c"}, reader.get_hash)
23
+ assert_equal({"A"=>"d", "B"=>"e", "C"=>"f"}, reader.get_hash)
24
+ assert_equal(nil, reader.get_hash)
25
+ assert_equal(nil, reader.get_hash)
26
+ end
27
+
28
+ def test_reader_header
29
+ ndjson = <<-'End'
30
+ {"A":"a"}
31
+ {"A":"d","B":"e","C":"f"}
32
+ End
33
+ reader = Tb::NDJSONReader.new(StringIO.new(ndjson))
34
+ assert_equal(%w[A B C], reader.get_named_header)
35
+ assert_equal({"A"=>"a"}, reader.get_hash)
36
+ assert_equal({"A"=>"d", "B"=>"e", "C"=>"f"}, reader.get_hash)
37
+ assert_equal(nil, reader.get_hash)
38
+ assert_equal(nil, reader.get_hash)
39
+ end
40
+
41
+ def test_writer
42
+ arys = []
43
+ writer = Tb::NDJSONWriter.new(arys)
44
+ writer.header_generator = lambda { flunk }
45
+ assert_equal([], arys)
46
+ writer.put_hash({"A"=>"a", "B"=>"b", "C"=>"c"})
47
+ assert_equal(['{"A":"a","B":"b","C":"c"}'+"\n"], arys)
48
+ writer.put_hash({"A"=>"d", "B"=>"e", "C"=>"f"})
49
+ assert_equal(['{"A":"a","B":"b","C":"c"}'+"\n", '{"A":"d","B":"e","C":"f"}'+"\n"], arys)
50
+ writer.finish
51
+ assert_equal(['{"A":"a","B":"b","C":"c"}'+"\n", '{"A":"d","B":"e","C":"f"}'+"\n"], arys)
52
+ end
53
+
54
+ def test_newline_in_string
55
+ assert_equal('{"r":"\r","n":"\n"}'+"\n", generate_ndjson([{"r"=>"\r", "n"=>"\n"}]))
56
+ end
57
+
58
+ def test_empty_line
59
+ assert_equal([{"a"=>"1"}, {"a"=>"2"}], parse_ndjson('{"a":"1"}'+"\n\n" + '{"a":"2"}'+"\n"))
60
+ end
61
+
62
+ end
@@ -0,0 +1,36 @@
1
+ require 'tb'
2
+ require 'test/unit'
3
+
4
+ class TestTbNumericCSV < Test::Unit::TestCase
5
+ def test_reader
6
+ csv = <<-'End'.gsub(/^\s*/, '')
7
+ A,B,C
8
+ a,b,c
9
+ d,e,f
10
+ End
11
+ reader = Tb::NumericCSVReader.new(StringIO.new(csv))
12
+ assert_equal({"1"=>"A", "2"=>"B", "3"=>"C"}, reader.get_hash)
13
+ assert_equal({"1"=>"a", "2"=>"b", "3"=>"c"}, reader.get_hash)
14
+ assert_equal({"1"=>"d", "2"=>"e", "3"=>"f"}, reader.get_hash)
15
+ assert_equal(nil, reader.get_hash)
16
+ assert_equal(nil, reader.get_hash)
17
+ end
18
+
19
+ def test_writer
20
+ arys = []
21
+ writer = Tb::NumericCSVWriter.new(arys)
22
+ writer.put_hash({"1"=>"A", "2"=>"B", "3"=>"C"})
23
+ assert_equal(["A,B,C\n"], arys)
24
+ writer.put_hash({"1"=>"a", "2"=>"b", "3"=>"c"})
25
+ assert_equal(["A,B,C\n", "a,b,c\n"], arys)
26
+ writer.put_hash({"1"=>"d", "2"=>"e", "3"=>"f"})
27
+ assert_equal(["A,B,C\n", "a,b,c\n", "d,e,f\n"], arys)
28
+ end
29
+
30
+ def test_writer_invalid_field
31
+ arys = []
32
+ writer = Tb::NumericCSVWriter.new(arys)
33
+ assert_raise(ArgumentError) { writer.put_hash({"A"=>"1"}) }
34
+ end
35
+
36
+ end
@@ -5,9 +5,20 @@ require 'tmpdir'
5
5
  require 'test/unit'
6
6
 
7
7
  class TestTbPNM < Test::Unit::TestCase
8
+ def parse_pnm(pnm)
9
+ Tb::PNMReader.new(StringIO.new(pnm)).to_a
10
+ end
11
+
12
+ def generate_pnm(ary)
13
+ writer = Tb::PNMWriter.new(out = '')
14
+ ary.each {|h| writer.put_hash h }
15
+ writer.finish
16
+ out
17
+ end
18
+
8
19
  def test_parse_pbm_ascii
9
20
  pbm = "P1\n2 3\n101101\n"
10
- t = Tb.parse_pnm(pbm)
21
+ t = parse_pnm(pbm)
11
22
  assert_equal(
12
23
  [
13
24
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P1"},
@@ -20,13 +31,13 @@ class TestTbPNM < Test::Unit::TestCase
20
31
  {"type"=>"pixel", "x"=>1, "y"=>1, "component"=>"V", "value"=>0.0},
21
32
  {"type"=>"pixel", "x"=>0, "y"=>2, "component"=>"V", "value"=>1.0},
22
33
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"V", "value"=>0.0}
23
- ], t.map {|rec| rec.to_h })
24
- assert_equal("P1\n2 3\n10\n11\n01\n", t.generate_pnm)
34
+ ], t)
35
+ assert_equal("P1\n2 3\n10\n11\n01\n", generate_pnm(t))
25
36
  end
26
37
 
27
38
  def test_parse_pbm_binary
28
39
  pbm = "P4\n2 3\n\x80\xc0\x40"
29
- t = Tb.parse_pnm(pbm)
40
+ t = parse_pnm(pbm)
30
41
  assert_equal(
31
42
  [
32
43
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P4"},
@@ -39,13 +50,13 @@ class TestTbPNM < Test::Unit::TestCase
39
50
  {"type"=>"pixel", "x"=>1, "y"=>1, "component"=>"V", "value"=>0.0},
40
51
  {"type"=>"pixel", "x"=>0, "y"=>2, "component"=>"V", "value"=>1.0},
41
52
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"V", "value"=>0.0}
42
- ], t.map {|rec| rec.to_h })
43
- assert_equal(pbm, t.generate_pnm)
53
+ ], t)
54
+ assert_equal(pbm, generate_pnm(t))
44
55
  end
45
56
 
46
57
  def test_parse_pgm_ascii
47
58
  pgm = "P2\n2 3\n255\n0 1\n100 101\n254 255\n"
48
- t = Tb.parse_pnm(pgm)
59
+ t = parse_pnm(pgm)
49
60
  assert_equal(
50
61
  [
51
62
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P2"},
@@ -58,13 +69,13 @@ class TestTbPNM < Test::Unit::TestCase
58
69
  {"type"=>"pixel", "x"=>1, "y"=>1, "component"=>"V", "value"=>101.0/255},
59
70
  {"type"=>"pixel", "x"=>0, "y"=>2, "component"=>"V", "value"=>254.0/255},
60
71
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"V", "value"=>255.0/255}
61
- ], t.map {|rec| rec.to_h })
62
- assert_equal(pgm, t.generate_pnm)
72
+ ], t)
73
+ assert_equal(pgm, generate_pnm(t))
63
74
  end
64
75
 
65
76
  def test_parse_pgm_binary
66
77
  pgm = "P5\n2 3\n255\n\x00\x01\x64\x65\xfe\xff"
67
- t = Tb.parse_pnm(pgm)
78
+ t = parse_pnm(pgm)
68
79
  assert_equal(
69
80
  [
70
81
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P5"},
@@ -77,13 +88,13 @@ class TestTbPNM < Test::Unit::TestCase
77
88
  {"type"=>"pixel", "x"=>1, "y"=>1, "component"=>"V", "value"=>101.0/255},
78
89
  {"type"=>"pixel", "x"=>0, "y"=>2, "component"=>"V", "value"=>254.0/255},
79
90
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"V", "value"=>255.0/255}
80
- ], t.map {|rec| rec.to_h })
81
- assert_equal(pgm, t.generate_pnm)
91
+ ], t)
92
+ assert_equal(pgm, generate_pnm(t))
82
93
  end
83
94
 
84
95
  def test_parse_ppm_ascii
85
96
  ppm = "P3\n2 3\n255\n0 1 2 3 4 5\n100 101 102 103 104 105\n250 251 252 253 254 255\n"
86
- t = Tb.parse_pnm(ppm)
97
+ t = parse_pnm(ppm)
87
98
  assert_equal(
88
99
  [
89
100
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P3"},
@@ -108,13 +119,13 @@ class TestTbPNM < Test::Unit::TestCase
108
119
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"R", "value"=>253.0/255},
109
120
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"G", "value"=>254.0/255},
110
121
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"B", "value"=>255.0/255}
111
- ], t.map {|rec| rec.to_h })
112
- assert_equal(ppm, t.generate_pnm)
122
+ ], t)
123
+ assert_equal(ppm, generate_pnm(t))
113
124
  end
114
125
 
115
126
  def test_parse_ppm_binary
116
127
  ppm = "P6\n2 3\n255\n\x00\x01\x02\x03\x04\x05\x64\x65\x66\x67\x68\x69\xfa\xfb\xfc\xfd\xfe\xff"
117
- t = Tb.parse_pnm(ppm)
128
+ t = parse_pnm(ppm)
118
129
  assert_equal(
119
130
  [
120
131
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P6"},
@@ -139,13 +150,13 @@ class TestTbPNM < Test::Unit::TestCase
139
150
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"R", "value"=>253.0/255},
140
151
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"G", "value"=>254.0/255},
141
152
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"B", "value"=>255.0/255}
142
- ], t.map {|rec| rec.to_h })
143
- assert_equal(ppm, t.generate_pnm)
153
+ ], t)
154
+ assert_equal(ppm, generate_pnm(t))
144
155
  end
145
156
 
146
157
  def test_parse_ppm_binary2
147
158
  ppm = "P6\n2 3\n65535\n\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff"
148
- t = Tb.parse_pnm(ppm)
159
+ t = parse_pnm(ppm)
149
160
  assert_equal(
150
161
  [
151
162
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P6"},
@@ -170,13 +181,13 @@ class TestTbPNM < Test::Unit::TestCase
170
181
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"R", "value"=>253.0/65535},
171
182
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"G", "value"=>254.0/65535},
172
183
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"B", "value"=>255.0/65535}
173
- ], t.map {|rec| rec.to_h })
174
- assert_equal(ppm, t.generate_pnm)
184
+ ], t)
185
+ assert_equal(ppm, generate_pnm(t))
175
186
  end
176
187
 
177
188
  def test_parse_pbm_comment
178
189
  pbm = "P1\n\#foo\n2 3\n101101\n"
179
- t = Tb.parse_pnm(pbm)
190
+ t = parse_pnm(pbm)
180
191
  assert_equal(
181
192
  [
182
193
  {"type"=>"meta", "component"=>"pnm_type", "value"=>"P1"},
@@ -190,124 +201,112 @@ class TestTbPNM < Test::Unit::TestCase
190
201
  {"type"=>"pixel", "x"=>1, "y"=>1, "component"=>"V", "value"=>0.0},
191
202
  {"type"=>"pixel", "x"=>0, "y"=>2, "component"=>"V", "value"=>1.0},
192
203
  {"type"=>"pixel", "x"=>1, "y"=>2, "component"=>"V", "value"=>0.0}
193
- ], t.map {|rec| rec.to_h })
194
- assert_equal("P1\n\#foo\n2 3\n10\n11\n01\n", t.generate_pnm)
204
+ ], t)
205
+ assert_equal("P1\n\#foo\n2 3\n10\n11\n01\n", generate_pnm(t))
195
206
  end
196
207
 
197
208
  def test_parse_pbm_ascii_wide
198
209
  pbm = "P1\n71 3\n" + "0" * (71 * 3)
199
- t = Tb.parse_pnm(pbm)
200
- assert_equal("P1\n71 3\n" + ("0"*70+"\n0\n")*3, t.generate_pnm)
210
+ t = parse_pnm(pbm)
211
+ assert_equal("P1\n71 3\n" + ("0"*70+"\n0\n")*3, generate_pnm(t))
201
212
  end
202
213
 
203
214
  def test_parse_pgm_ascii_wide
204
215
  pgm = "P2\n40 3\n255\n" + "0 " * (40*3)
205
- t = Tb.parse_pnm(pgm)
206
- assert_equal("P2\n40 3\n255\n" + ("0 "*34 + "0\n" + "0 "*4 + "0\n")*3, t.generate_pnm)
216
+ t = parse_pnm(pgm)
217
+ assert_equal("P2\n40 3\n255\n" + ("0 "*34 + "0\n" + "0 "*4 + "0\n")*3, generate_pnm(t))
207
218
  end
208
219
 
209
220
  def test_parse_invalid
210
221
  invalid = "foo"
211
- assert_raise(ArgumentError) { Tb.parse_pnm(invalid) }
222
+ assert_raise(ArgumentError) { parse_pnm(invalid) }
212
223
  end
213
224
 
214
225
  def test_parse_too_short
215
226
  too_short = "P1\n2 3\n10110\n"
216
- assert_raise(ArgumentError) { Tb.parse_pnm(too_short) }
227
+ assert_raise(ArgumentError) { parse_pnm(too_short) }
217
228
  end
218
229
 
219
230
  def test_generate_invalid_fields
220
- t = Tb.new %w[foo], [1]
221
- assert_raise(ArgumentError) { t.generate_pnm }
231
+ t = [{ "foo" => 1 }]
232
+ assert_raise(ArgumentError) { generate_pnm(t) }
222
233
  end
223
234
 
224
235
  def test_generate_inconsistent_color_component
225
- t = Tb.new %w[x y component value], [nil, nil, 'V', 1.0], [nil, nil, 'R', 1.0]
226
- assert_raise(ArgumentError) { t.generate_pnm }
236
+ t = [{'component' => 'V', 'value' => 1.0}, {'component' => 'R'}]
237
+ assert_raise(ArgumentError) { generate_pnm(t) }
227
238
  end
228
239
 
229
240
  def test_generate_complement
230
- t = Tb.new %w[x y component value]
231
- [
241
+ t = [
232
242
  {"x"=>0, "y"=>0, "component"=>"V", "value"=>0.0},
233
243
  {"x"=>1, "y"=>0, "component"=>"V", "value"=>1.0},
234
244
  {"x"=>0, "y"=>1, "component"=>"V", "value"=>0.0},
235
245
  {"x"=>1, "y"=>1, "component"=>"V", "value"=>0.0},
236
246
  {"x"=>0, "y"=>2, "component"=>"V", "value"=>1.0},
237
247
  {"x"=>1, "y"=>2, "component"=>"V", "value"=>0.0}
238
- ].each {|h| t.insert h }
239
- assert_equal("P4\n2 3\n\x80\xc0\x40", t.generate_pnm)
248
+ ]
249
+ assert_equal("P4\n2 3\n\x80\xc0\x40", generate_pnm(t))
240
250
  end
241
251
 
242
252
  def test_generate_complement2
243
- t = Tb.new %w[x y component value]
244
- [
253
+ t = [
245
254
  {"x"=>0, "y"=>0, "component"=>"V", "value"=>1.0/65535},
246
255
  {"x"=>1, "y"=>0, "component"=>"V", "value"=>1.0},
247
256
  {"x"=>0, "y"=>1, "component"=>"V", "value"=>0.0},
248
257
  {"x"=>1, "y"=>1, "component"=>"V", "value"=>0.0},
249
258
  {"x"=>0, "y"=>2, "component"=>"V", "value"=>1.0},
250
259
  {"x"=>1, "y"=>2, "component"=>"V", "value"=>0.0}
251
- ].each {|h| t.insert h }
252
- assert_equal("P5\n2 3\n65535\n\x00\x01\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00", t.generate_pnm)
260
+ ]
261
+ assert_equal("P5\n2 3\n65535\n\x00\x01\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00", generate_pnm(t))
253
262
  end
254
263
 
255
264
  def test_generate_complement1
256
- t = Tb.new %w[x y component value]
257
- [
265
+ t = [
258
266
  {"x"=>0, "y"=>0, "component"=>"V", "value"=>1.0/255},
259
267
  {"x"=>1, "y"=>0, "component"=>"V", "value"=>1.0},
260
268
  {"x"=>0, "y"=>1, "component"=>"V", "value"=>0.0},
261
269
  {"x"=>1, "y"=>1, "component"=>"V", "value"=>0.0},
262
270
  {"x"=>0, "y"=>2, "component"=>"V", "value"=>1.0},
263
271
  {"x"=>1, "y"=>2, "component"=>"V", "value"=>0.0}
264
- ].each {|h| t.insert h }
265
- assert_equal("P5\n2 3\n255\n\x01\xff\x00\x00\xff\x00", t.generate_pnm)
272
+ ]
273
+ assert_equal("P5\n2 3\n255\n\x01\xff\x00\x00\xff\x00", generate_pnm(t))
266
274
  end
267
275
 
268
276
  def test_generate_complement_ppm
269
- t = Tb.new %w[x y component value]
270
- [
277
+ t = [
271
278
  {"x"=>0, "y"=>0, "component"=>"R", "value"=>0.0},
272
279
  {"x"=>0, "y"=>0, "component"=>"G", "value"=>1.0},
273
280
  {"x"=>0, "y"=>0, "component"=>"B", "value"=>1.0},
274
- ].each {|h| t.insert h }
275
- assert_equal("P6\n1 1\n255\n\x00\xff\xff", t.generate_pnm)
281
+ ]
282
+ assert_equal("P6\n1 1\n255\n\x00\xff\xff", generate_pnm(t))
276
283
  end
277
284
 
278
285
  def test_generate_overrange
279
- t = Tb.new %w[x y component value]
280
- [
286
+ t = [
281
287
  {"x"=>0, "y"=>0, "component"=>"V", "value"=>-0.5},
282
288
  {"x"=>0, "y"=>1, "component"=>"V", "value"=>1.5},
283
- ].each {|h| t.insert h }
284
- assert_equal("P5\n1 2\n255\n\x00\xff", t.generate_pnm)
289
+ ]
290
+ assert_equal("P5\n1 2\n255\n\x00\xff", generate_pnm(t))
285
291
  end
286
292
 
287
293
  def test_invalid_pnm_type
288
- t = Tb.new %w[x y component value], [nil, nil, 'pnm_type', "foo"]
289
- assert_raise(ArgumentError) { t.generate_pnm }
294
+ t = [{'component' => 'pnm_type', 'value' => "foo"}]
295
+ assert_raise(ArgumentError) { generate_pnm(t) }
290
296
  end
291
297
 
292
298
  def test_invalid_comment
293
- t = Tb.new %w[x y component value], [nil, nil, 'comment', "\n"]
294
- assert_raise(ArgumentError) { t.generate_pnm }
295
- end
296
-
297
- def test_load_pnm
298
- Dir.mktmpdir {|d|
299
- File.open(fn="#{d}/foo.pbm", "w") {|f| f << "P4\n1 1\n\0" }
300
- t = Tb.load_pnm(fn)
301
- assert_equal({"type"=>"meta", "component"=>"pnm_type", "value"=>"P4"}, t.get_record(0).to_h)
302
- }
299
+ t = [{'component' => 'comment', 'value' => "\n"}]
300
+ assert_raise(ArgumentError) { generate_pnm(t) }
303
301
  end
304
302
 
305
303
  def test_pnmreader_to_a
306
304
  pbm = "P1\n2 3\n101101\n"
307
- r = Tb::PNMReader.new(pbm)
305
+ r = Tb::PNMReader.new(StringIO.new(pbm))
306
+ header = r.get_named_header
307
+ assert_equal(["type", "x", "y", "component", "value"], header)
308
308
  assert_equal(
309
- [["type", "x", "y", "component", "value"],
310
- ["meta", nil, nil, "pnm_type", "P1"],
309
+ [["meta", nil, nil, "pnm_type", "P1"],
311
310
  ["meta", nil, nil, "width", 2],
312
311
  ["meta", nil, nil, "height", 3],
313
312
  ["meta", nil, nil, "max", 1],
@@ -317,7 +316,7 @@ class TestTbPNM < Test::Unit::TestCase
317
316
  ["pixel", 1, 1, "V", 0.0],
318
317
  ["pixel", 0, 2, "V", 1.0],
319
318
  ["pixel", 1, 2, "V", 0.0]],
320
- r.to_a)
319
+ r.to_a.map {|h| h.values_at(*header) })
321
320
  end
322
321
 
323
322
  def test_reader_open