rbbt-util 3.2.1 → 4.0.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 (85) hide show
  1. data/README.rdoc +65 -0
  2. data/bin/run_workflow.rb +142 -69
  3. data/lib/rbbt-util.rb +3 -3
  4. data/lib/rbbt.rb +12 -3
  5. data/lib/rbbt/annotations.rb +215 -0
  6. data/lib/rbbt/{util/fix_width_table.rb → fix_width_table.rb} +17 -13
  7. data/lib/rbbt/persist.rb +164 -0
  8. data/lib/rbbt/persist/tsv.rb +135 -0
  9. data/lib/rbbt/resource.rb +100 -0
  10. data/lib/rbbt/resource/path.rb +180 -0
  11. data/lib/rbbt/resource/rake.rb +48 -0
  12. data/lib/rbbt/resource/util.rb +111 -0
  13. data/lib/rbbt/resource/with_key.rb +28 -0
  14. data/lib/rbbt/tsv.rb +134 -0
  15. data/lib/rbbt/tsv/accessor.rb +345 -0
  16. data/lib/rbbt/tsv/attach.rb +183 -0
  17. data/lib/rbbt/tsv/attach/util.rb +277 -0
  18. data/lib/rbbt/{util/tsv/filters.rb → tsv/filter.rb} +76 -37
  19. data/lib/rbbt/tsv/index.rb +453 -0
  20. data/lib/rbbt/tsv/manipulate.rb +361 -0
  21. data/lib/rbbt/tsv/parser.rb +231 -0
  22. data/lib/rbbt/tsv/serializers.rb +79 -0
  23. data/lib/rbbt/tsv/util.rb +67 -0
  24. data/lib/rbbt/util/R.rb +3 -3
  25. data/lib/rbbt/util/chain_methods.rb +64 -0
  26. data/lib/rbbt/util/cmd.rb +17 -13
  27. data/lib/rbbt/util/excel2tsv.rb +4 -3
  28. data/lib/rbbt/util/log.rb +1 -0
  29. data/lib/rbbt/util/misc.rb +296 -285
  30. data/lib/rbbt/util/open.rb +9 -2
  31. data/lib/rbbt/util/persistence.rb +1 -1
  32. data/lib/rbbt/util/task/job.rb +3 -1
  33. data/lib/rbbt/workflow.rb +193 -0
  34. data/lib/rbbt/workflow/accessor.rb +249 -0
  35. data/lib/rbbt/workflow/annotate.rb +60 -0
  36. data/lib/rbbt/workflow/soap.rb +100 -0
  37. data/lib/rbbt/workflow/step.rb +102 -0
  38. data/lib/rbbt/workflow/task.rb +76 -0
  39. data/test/rbbt/resource/test_path.rb +12 -0
  40. data/test/rbbt/test_annotations.rb +106 -0
  41. data/test/rbbt/{util/test_fix_width_table.rb → test_fix_width_table.rb} +8 -9
  42. data/test/rbbt/test_resource.rb +66 -0
  43. data/test/rbbt/test_tsv.rb +332 -0
  44. data/test/rbbt/test_workflow.rb +102 -0
  45. data/test/rbbt/tsv/test_accessor.rb +163 -0
  46. data/test/rbbt/{util/tsv → tsv}/test_attach.rb +86 -43
  47. data/test/rbbt/{util/tsv/test_filters.rb → tsv/test_filter.rb} +31 -13
  48. data/test/rbbt/tsv/test_index.rb +284 -0
  49. data/test/rbbt/{util/tsv → tsv}/test_manipulate.rb +35 -105
  50. data/test/rbbt/util/test_R.rb +1 -1
  51. data/test/rbbt/util/test_chain_methods.rb +22 -0
  52. data/test/rbbt/util/test_filecache.rb +0 -1
  53. data/test/rbbt/util/test_misc.rb +97 -79
  54. data/test/rbbt/util/test_open.rb +1 -0
  55. data/test/rbbt/util/test_tmpfile.rb +1 -1
  56. data/test/rbbt/workflow/test_soap.rb +103 -0
  57. data/test/rbbt/workflow/test_step.rb +142 -0
  58. data/test/rbbt/workflow/test_task.rb +84 -0
  59. data/test/test_helper.rb +7 -7
  60. metadata +80 -54
  61. data/lib/rbbt/util/rake.rb +0 -176
  62. data/lib/rbbt/util/resource.rb +0 -355
  63. data/lib/rbbt/util/task.rb +0 -183
  64. data/lib/rbbt/util/tc_hash.rb +0 -324
  65. data/lib/rbbt/util/tsv.rb +0 -236
  66. data/lib/rbbt/util/tsv/accessor.rb +0 -312
  67. data/lib/rbbt/util/tsv/attach.rb +0 -416
  68. data/lib/rbbt/util/tsv/index.rb +0 -419
  69. data/lib/rbbt/util/tsv/manipulate.rb +0 -300
  70. data/lib/rbbt/util/tsv/misc.rb +0 -41
  71. data/lib/rbbt/util/tsv/parse.rb +0 -324
  72. data/lib/rbbt/util/tsv/resource.rb +0 -88
  73. data/lib/rbbt/util/workflow.rb +0 -135
  74. data/lib/rbbt/util/workflow/soap.rb +0 -116
  75. data/test/rbbt/util/test_persistence.rb +0 -201
  76. data/test/rbbt/util/test_rake.rb +0 -54
  77. data/test/rbbt/util/test_resource.rb +0 -77
  78. data/test/rbbt/util/test_task.rb +0 -133
  79. data/test/rbbt/util/test_tc_hash.rb +0 -144
  80. data/test/rbbt/util/test_tsv.rb +0 -221
  81. data/test/rbbt/util/test_workflow.rb +0 -135
  82. data/test/rbbt/util/tsv/test_accessor.rb +0 -150
  83. data/test/rbbt/util/tsv/test_index.rb +0 -241
  84. data/test/rbbt/util/tsv/test_parse.rb +0 -87
  85. data/test/rbbt/util/tsv/test_resource.rb +0 -9
@@ -0,0 +1,163 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+ require 'rbbt/tsv'
3
+ require 'rbbt/util/tmpfile'
4
+ require 'test/unit'
5
+
6
+ class TestTSV < Test::Unit::TestCase
7
+
8
+ def _test_tsv
9
+ content =<<-EOF
10
+ #Id ValueA ValueB OtherID
11
+ row1 a|aa|aaa b Id1|Id2
12
+ row2 A B Id3
13
+ EOF
14
+
15
+ TmpFile.with_file(content) do |filename|
16
+ tsv = TSV.open(filename, :sep => /\s+/)
17
+ assert_equal 2, tsv.keys.length
18
+ assert_equal 2, tsv.values.length
19
+ assert_equal 2, tsv.collect.length
20
+ end
21
+ end
22
+
23
+ def _test_named_values
24
+ content =<<-EOF
25
+ #Id ValueA ValueB OtherID
26
+ row1 a|aa|aaa b Id1|Id2
27
+ row2 A B Id3
28
+ EOF
29
+
30
+ TmpFile.with_file(content) do |filename|
31
+ tsv = TSV.open(filename, :sep => /\s+/)
32
+ assert_equal ["A"], tsv["row2"]["ValueA"]
33
+ end
34
+ end
35
+
36
+ def _test_to_s
37
+ content =<<-EOF
38
+ #Id ValueA ValueB OtherID
39
+ row1 a|aa|aaa b Id1|Id2
40
+ row2 A B Id3
41
+ EOF
42
+
43
+ TmpFile.with_file(content) do |filename|
44
+ tsv = TSV.open(filename, :sep => /\s+/)
45
+ assert tsv.to_s =~ /row1\ta|aa|aaa/
46
+ assert tsv.to_s =~ /:type=:double/
47
+ end
48
+ end
49
+
50
+ def _test_entries
51
+ content =<<-EOF
52
+ #Id ValueA ValueB OtherID
53
+ row1 a|aa|aaa b Id1|Id2
54
+ row2 A B Id3
55
+ EOF
56
+
57
+ TmpFile.with_file(content) do |filename|
58
+ tsv = TSV.open(filename, :sep => /\s+/)
59
+ assert_equal filename, tsv.options[:filename]
60
+ end
61
+
62
+ end
63
+
64
+ def _test_marshal
65
+ content =<<-EOF
66
+ #Id ValueA ValueB OtherID
67
+ row1 a|aa|aaa b Id1|Id2
68
+ row2 A B Id3
69
+ EOF
70
+
71
+ TmpFile.with_file(content) do |filename|
72
+ tsv = TSV.open(filename, :sep => /\s+/, :persist_serializer => :marshal, :persist => true)
73
+ assert_equal filename, tsv.options[:filename]
74
+ end
75
+ end
76
+
77
+ def _test_zip_fields
78
+ a = [%w(1 2), %w(a b)]
79
+ assert_equal a, TSV.zip_fields(TSV.zip_fields(a))
80
+ end
81
+
82
+ def _test_indentify_fields
83
+ content =<<-EOF
84
+ #ID ValueA ValueB Comment
85
+ row1 a b c
86
+ row2 A B C
87
+ EOF
88
+
89
+ TmpFile.with_file(content) do |filename|
90
+ tsv = TSV.open(File.open(filename), :double, :sep => /\s/)
91
+ assert_equal :key, tsv.identify_field("ID")
92
+ end
93
+ end
94
+
95
+ def _test_sort
96
+ content =<<-EOF
97
+ #ID ValueA ValueB Comment
98
+ row1 a B c
99
+ row2 A b C
100
+ EOF
101
+
102
+ TmpFile.with_file(content) do |filename|
103
+ tsv = TSV.open(File.open(filename), :double, :sep => /\s/)
104
+ assert_equal %w(row2 row1), tsv.sort{|a,b|
105
+ a[1]["ValueA"] <=> b[1]["ValueA"]
106
+ }.collect{|k,v| k}
107
+ assert_equal %w(row1 row2), tsv.sort{|a,b|
108
+ a[1]["ValueB"] <=> b[1]["ValueB"]
109
+ }.collect{|k,v| k}
110
+ end
111
+ end
112
+
113
+ def _test_sort_by
114
+ content =<<-EOF
115
+ #ID ValueA ValueB Comment
116
+ row1 a B c
117
+ row2 A b C
118
+ EOF
119
+
120
+ TmpFile.with_file(content) do |filename|
121
+ tsv = TSV.open(File.open(filename), :list, :sep => /\s/)
122
+ assert_equal %w(row2 row1), tsv.sort_by("ValueA").collect{|k,v| k}
123
+ assert_equal %w(row1 row2), tsv.sort_by("ValueB").collect{|k,v| k}
124
+ end
125
+ end
126
+
127
+
128
+ def test_page
129
+ content =<<-EOF
130
+ #ID ValueA ValueB Comment
131
+ row1 a B f
132
+ row2 A b e
133
+ row3 A b d
134
+ row4 A b c
135
+ row5 A b b
136
+ row6 A b a
137
+ EOF
138
+
139
+ TmpFile.with_file(content) do |filename|
140
+ tsv = TSV.open(File.open(filename), :list, :sep => /\s/)
141
+ assert_equal 3, tsv.page(1,3).size
142
+ assert_equal %w(row1 row2 row3).sort, tsv.page(1,3).keys.sort
143
+ assert_equal %w(row6 row5 row4).sort, tsv.page(1,3, "Comment").keys.sort
144
+ assert_equal %w(row4 row3).sort, tsv.page(2,2, "Comment").keys.sort
145
+ end
146
+ end
147
+
148
+
149
+ def _test_sort_by_with_proc
150
+ content =<<-EOF
151
+ #Id ValueA ValueB OtherID Pos
152
+ row1 a|aa|aaa b Id1|Id2 2
153
+ row2 aA B Id3 1
154
+ row3 A|AA|AAA|AAA B Id3 3
155
+ EOF
156
+
157
+ TmpFile.with_file(content) do |filename|
158
+ tsv = TSV.open(File.open(filename), :sep => /\s+/)
159
+ assert_equal %w(row3 row1 row2), (tsv.sort_by("ValueA") do |key, value| value.length end).collect{|k,v| k}.reverse
160
+ end
161
+ end
162
+
163
+ end
@@ -1,6 +1,6 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
2
- require 'rbbt/util/tsv'
3
- require 'rbbt/util/tsv/attach'
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
+ require 'rbbt/tsv'
3
+ require 'rbbt/tsv/attach'
4
4
  require 'rbbt'
5
5
 
6
6
  class TestAttach < Test::Unit::TestCase
@@ -19,11 +19,11 @@ row3 B Id3
19
19
 
20
20
  tsv1 = tsv2 = nil
21
21
  TmpFile.with_file(content1) do |filename|
22
- tsv1 = TSV.new(File.open(filename), :double, :sep => /\s+/)
22
+ tsv1 = TSV.open(File.open(filename), :double, :sep => /\s+/)
23
23
  end
24
24
 
25
25
  TmpFile.with_file(content2) do |filename|
26
- tsv2 = TSV.new(File.open(filename), :double, :sep => /\s+/)
26
+ tsv2 = TSV.open(File.open(filename), :double, :sep => /\s+/)
27
27
  end
28
28
 
29
29
  tsv1.attach_same_key tsv2, "OtherID"
@@ -32,7 +32,7 @@ row3 B Id3
32
32
  assert_equal %w(Id1 Id2), tsv1["row1"]["OtherID"]
33
33
 
34
34
  TmpFile.with_file(content1) do |filename|
35
- tsv1 = TSV.new(File.open(filename), :double, :sep => /\s+/)
35
+ tsv1 = TSV.open(File.open(filename), :double, :sep => /\s+/)
36
36
  end
37
37
 
38
38
  tsv1.attach_same_key tsv2
@@ -41,11 +41,11 @@ row3 B Id3
41
41
 
42
42
  tsv1 = tsv2 = nil
43
43
  TmpFile.with_file(content1) do |filename|
44
- tsv1 = TSV.new(File.open(filename), :list, :sep => /\s+/)
44
+ tsv1 = TSV.open(File.open(filename), :list, :sep => /\s+/)
45
45
  end
46
46
 
47
47
  TmpFile.with_file(content2) do |filename|
48
- tsv2 = TSV.new(File.open(filename), :double, :sep => /\s+/)
48
+ tsv2 = TSV.open(File.open(filename), :double, :sep => /\s+/)
49
49
  end
50
50
 
51
51
  tsv1.attach_same_key tsv2, "OtherID"
@@ -69,11 +69,11 @@ B Id3
69
69
 
70
70
  tsv1 = tsv2 = nil
71
71
  TmpFile.with_file(content1) do |filename|
72
- tsv1 = TSV.new(File.open(filename), :double, :sep => /\s+/)
72
+ tsv1 = TSV.open(File.open(filename), :double, :sep => /\s+/)
73
73
  end
74
74
 
75
75
  TmpFile.with_file(content2) do |filename|
76
- tsv2 = TSV.new(File.open(filename), :double, :sep => /\s+/)
76
+ tsv2 = TSV.open(File.open(filename), :double, :sep => /\s+/)
77
77
  end
78
78
 
79
79
  tsv1.attach_source_key tsv2, "ValueB"
@@ -82,7 +82,7 @@ B Id3
82
82
  assert_equal %w(Id1 Id2), tsv1["row1"]["OtherID"]
83
83
 
84
84
  TmpFile.with_file(content1) do |filename|
85
- tsv1 = TSV.new(File.open(filename), :list, :sep => /\s+/)
85
+ tsv1 = TSV.open(File.open(filename), :list, :sep => /\s+/)
86
86
  end
87
87
 
88
88
  tsv1.attach_source_key tsv2, "ValueB"
@@ -113,15 +113,15 @@ row2 E
113
113
 
114
114
  tsv1 = tsv2 = index = nil
115
115
  TmpFile.with_file(content1) do |filename|
116
- tsv1 = TSV.new(File.open(filename), :double, :sep => /\s+/)
116
+ tsv1 = TSV.open(File.open(filename), :double, :sep => /\s+/)
117
117
  end
118
118
 
119
119
  TmpFile.with_file(content2) do |filename|
120
- tsv2 = TSV.new(File.open(filename), :double, :sep => /\s+/)
120
+ tsv2 = TSV.open(File.open(filename), :double, :sep => /\s+/)
121
121
  end
122
122
 
123
123
  TmpFile.with_file(content_index) do |filename|
124
- index = TSV.new(File.open(filename), :flat, :sep => /\s+/)
124
+ index = TSV.open(File.open(filename), :flat, :sep => /\s+/)
125
125
  end
126
126
 
127
127
  tsv1.attach_index tsv2, index
@@ -130,7 +130,7 @@ row2 E
130
130
  assert_equal %w(Id1 Id2), tsv1["row1"]["OtherID"]
131
131
 
132
132
  TmpFile.with_file(content1) do |filename|
133
- tsv1 = TSV.new(File.open(filename), :list, :sep => /\s+/)
133
+ tsv1 = TSV.open(File.open(filename), :list, :sep => /\s+/)
134
134
  end
135
135
 
136
136
  tsv1.attach_index tsv2, index
@@ -159,15 +159,15 @@ B Id3
159
159
  EOF
160
160
  tsv1 = tsv2 = tsv3 = nil
161
161
  TmpFile.with_file(content1) do |filename|
162
- tsv1 = TSV.new(File.open(filename), :double, :sep => /\s+/)
162
+ tsv1 = TSV.open(File.open(filename), :double, :sep => /\s+/)
163
163
  end
164
164
 
165
165
  TmpFile.with_file(content2) do |filename|
166
- tsv2 = TSV.new(File.open(filename), :double, :sep => /\s+/)
166
+ tsv2 = TSV.open(File.open(filename), :double, :sep => /\s+/)
167
167
  end
168
168
 
169
169
  TmpFile.with_file(content3) do |filename|
170
- tsv3 = TSV.new(File.open(filename), :double, :sep => /\s+/)
170
+ tsv3 = TSV.open(File.open(filename), :double, :sep => /\s+/)
171
171
  end
172
172
 
173
173
  tsv1.attach tsv2, "OtherID"
@@ -176,7 +176,7 @@ B Id3
176
176
  assert_equal %w(Id1 Id2), tsv1["row1"]["OtherID"]
177
177
 
178
178
  TmpFile.with_file(content1) do |filename|
179
- tsv1 = TSV.new(File.open(filename), :double, :sep => /\s+/)
179
+ tsv1 = TSV.open(File.open(filename), :double, :sep => /\s+/)
180
180
  end
181
181
 
182
182
  tsv1.attach tsv3
@@ -188,12 +188,14 @@ B Id3
188
188
 
189
189
  def test_attach_using_index
190
190
  content1 =<<-EOF
191
+ #: :sep=/\\s+/
191
192
  #Id ValueA ValueB
192
193
  row1 a|aa|aaa b
193
194
  row2 A B
194
195
  EOF
195
196
 
196
197
  content2 =<<-EOF
198
+ #: :sep=/\\s+/
197
199
  #ValueE OtherID
198
200
  e Id1|Id2
199
201
  E Id3
@@ -206,19 +208,19 @@ row1 e
206
208
  row2 E
207
209
  EOF
208
210
 
209
- Rbbt.tmp.test.test1.data.define_as_string content1
210
- Rbbt.tmp.test.test2.data.define_as_string content2
211
- Rbbt.tmp.test.test2.identifiers.define_as_string content_index
211
+ Rbbt.claim Rbbt.tmp.test.test1.data, :string, content1
212
+ Rbbt.claim Rbbt.tmp.test.test2.data, :string, content2
213
+ Rbbt.claim Rbbt.tmp.test.test2.identifiers, :string, content_index
212
214
 
213
215
  tsv1 = tsv2 = nil
214
216
 
215
217
  tsv1 = Rbbt.tmp.test.test1.data.tsv :double, :sep => /\s+/
216
218
  tsv2 = Rbbt.tmp.test.test2.data.tsv :double, :sep => /\s+/
217
219
 
218
- tsv2.identifiers = Rbbt.tmp.test.test2.identifiers.produce
219
-
220
- tsv1.attach tsv2, "OtherID", :in_namespace => false
220
+ tsv2.identifiers = Rbbt.tmp.test.test2.identifiers.produce.find.to_s
221
221
 
222
+ tsv1.attach tsv2, :fields => ["OtherID"], :persist_input => true
223
+
222
224
  assert_equal tsv1.fields,%w(ValueA ValueB OtherID)
223
225
  assert_equal %w(Id1 Id2), tsv1["row1"]["OtherID"]
224
226
  end
@@ -247,24 +249,25 @@ row2 E
247
249
 
248
250
  tsv1 = tsv2 = identifiers = nil
249
251
  TmpFile.with_file(content1) do |filename|
250
- tsv1 = TSV.new(File.open(filename), :key => "Id")
252
+ tsv1 = TSV.open(Path.setup(filename), :key => "Id")
251
253
  end
252
254
 
253
255
  TmpFile.with_file(content2) do |filename|
254
- tsv2 = TSV.new(File.open(filename), :double)
256
+ tsv2 = TSV.open(Path.setup(filename), :double)
255
257
  end
256
258
 
257
259
  TmpFile.with_file(content_identifiers) do |filename|
258
- identifiers = TSV.new(File.open(filename), :flat, :sep => /\s+/)
260
+ identifiers = TSV.open(Path.setup(filename), :flat, :sep => /\s+/)
259
261
  end
260
262
 
261
263
  tsv1.identifiers = identifiers
264
+
262
265
  tsv1.attach tsv2
263
266
 
264
267
  assert_equal %w(ValueA ValueB ValueE), tsv1.fields
265
268
  end
266
269
 
267
- def test_paste
270
+ def test_merge_different_rows
268
271
  file1 =<<-EOF
269
272
  row6 dd dd ee
270
273
  row1 a b c
@@ -287,12 +290,12 @@ row6 dd dd ee
287
290
  EOF
288
291
 
289
292
  TmpFile.with_file do |f|
290
- TSV.paste(StringIO.new(file1), StringIO.new(file2), f, " ")
293
+ TSV.merge_different_fields(StringIO.new(file1), StringIO.new(file2), f, " ")
291
294
  assert_equal result, Open.read(f)
292
295
  end
293
296
  end
294
297
 
295
- def test_paste
298
+ def test_merge_different_rows_tsv
296
299
  file1 =<<-EOF
297
300
  row6 dd dd ee
298
301
  row1 a b c
@@ -315,14 +318,14 @@ row6 dd dd ee
315
318
  EOF
316
319
 
317
320
  TmpFile.with_file do |f|
318
- tsv1 = TSV.new StringIO.new(file1), :sep => " "
319
- tsv2 = TSV.new StringIO.new(file2), :sep => " "
320
- tsv_r = tsv1.paste tsv2
321
+ tsv1 = TSV.open StringIO.new(file1), :sep => " "
322
+ tsv2 = TSV.open StringIO.new(file2), :sep => " "
323
+ tsv_r = tsv1.merge_different_fields tsv2
321
324
  assert_equal result, tsv_r.to_s(tsv_r.keys.sort, true).gsub(/\t/,' ')
322
325
  end
323
326
  end
324
327
 
325
- def test_paste_merge
328
+ def test_merge_different_rows_split_lines
326
329
  file1 =<<-EOF
327
330
  row6,dd,dd,ee
328
331
  row1,a,b,c
@@ -336,23 +339,34 @@ row1,d,e
336
339
  row2,D,E
337
340
  row4,x,y
338
341
  EOF
339
- result =<<-EOF
342
+
343
+ # Might be slightly different ...
344
+ result1 =<<-EOF
340
345
  row1,aa|a,bb|b,cc|c,d,e
341
346
  row2,A,B,C,D,E
342
347
  row20,,,,rr,rr
343
348
  row3,1,2,3,,
344
349
  row4,,,,x,y
350
+ row6,dd,dd,ee,,
351
+ EOF
352
+ result2 =<<-EOF
353
+ row1,a|aa,b|bb,c|cc,d,e
354
+ row2,A,B,C,D,E
355
+ row20,,,,rr,rr
356
+ row3,1,2,3,,
357
+ row4,,,,x,y
345
358
  row6,dd,dd,ee,,
346
359
  EOF
347
360
 
348
361
  TmpFile.with_file do |f|
349
- TSV.paste_merge StringIO.new(file1), StringIO.new(file2), f, ','
362
+ TSV.merge_different_fields StringIO.new(file1), StringIO.new(file2), f, ','
350
363
 
351
- assert_equal result, Open.read(f)
364
+ # ... so check for either
365
+ assert(Open.read(f) == result1 || Open.read(f) == result2)
352
366
  end
353
367
  end
354
368
 
355
- def test_paste
369
+ def test_merge_different_rows_split_lines_tsv
356
370
  file1 =<<-EOF
357
371
  row6,dd,dd,ee
358
372
  row1,a,b,c
@@ -376,9 +390,9 @@ row6,dd,dd,ee,,
376
390
  EOF
377
391
 
378
392
  TmpFile.with_file do |f|
379
- data1 = TSV.new StringIO.new(file1), :sep => ',', :merge => true
380
- data2 = TSV.new StringIO.new(file2), :sep => ',', :merge => true
381
- data3 = data1.paste(data2)
393
+ data1 = TSV.open StringIO.new(file1), :sep => ',', :merge => true
394
+ data2 = TSV.open StringIO.new(file2), :sep => ',', :merge => true
395
+ data3 = data1.merge_different_fields(data2)
382
396
  data3.each do |key, list|
383
397
  list.each do |l| l.replace l.sort_by{|v| v.length}.reverse end
384
398
  end
@@ -396,12 +410,41 @@ row3,1,2,3
396
410
  EOF
397
411
  TmpFile.with_file(file1) do |input|
398
412
  TmpFile.with_file() do |output|
399
- TSV.merge_rows Open.open(input), output
413
+ TSV.merge_row_fields Open.open(input), output
400
414
  assert Open.read(output) =~ /a|aa/
401
415
  end
402
416
  end
403
417
 
404
418
 
405
419
  end
420
+
421
+ def test_one2one
422
+ content1 =<<-EOF
423
+ #Id ValueA ValueB
424
+ row1 a|aa|aaa b
425
+ row2 A B
426
+ row3 A b|bb
427
+ EOF
428
+
429
+ content2 =<<-EOF
430
+ #ValueB OtherID
431
+ b Id1|Id2
432
+ B Id3
433
+ bb Id4
434
+ EOF
435
+ tsv1 = tsv2 = nil
436
+ TmpFile.with_file(content1) do |filename|
437
+ tsv1 = TSV.open(File.open(filename), :double, :sep => /\s+/)
438
+ end
439
+
440
+ TmpFile.with_file(content2) do |filename|
441
+ tsv2 = TSV.open(File.open(filename), :double, :sep => /\s+/)
442
+ end
443
+
444
+ tsv1.attach tsv2, :one2one => true
445
+
446
+ assert_equal %w(ValueA ValueB OtherID), tsv1.fields
447
+ assert_equal %w(Id1 Id4), tsv1["row3"]["OtherID"]
448
+ end
406
449
  end
407
450