scout-gear 7.1.0 → 7.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +65 -2
  3. data/VERSION +1 -1
  4. data/bin/scout +5 -1
  5. data/lib/rbbt-scout.rb +5 -0
  6. data/lib/scout/concurrent_stream.rb +13 -8
  7. data/lib/scout/config.rb +168 -0
  8. data/lib/scout/exceptions.rb +5 -3
  9. data/lib/scout/indiferent_hash/options.rb +1 -0
  10. data/lib/scout/indiferent_hash.rb +4 -2
  11. data/lib/scout/log/color.rb +3 -2
  12. data/lib/scout/log/progress/report.rb +1 -0
  13. data/lib/scout/log/progress/util.rb +66 -1
  14. data/lib/scout/log/progress.rb +5 -3
  15. data/lib/scout/log.rb +3 -2
  16. data/lib/scout/misc/helper.rb +31 -0
  17. data/lib/scout/misc/monitor.rb +4 -1
  18. data/lib/scout/misc/system.rb +15 -0
  19. data/lib/scout/misc.rb +2 -0
  20. data/lib/scout/named_array.rb +68 -0
  21. data/lib/scout/open/stream.rb +58 -33
  22. data/lib/scout/path/find.rb +27 -3
  23. data/lib/scout/path/util.rb +7 -4
  24. data/lib/scout/persist/serialize.rb +7 -14
  25. data/lib/scout/persist.rb +46 -12
  26. data/lib/scout/resource/produce.rb +7 -94
  27. data/lib/scout/resource/software.rb +176 -0
  28. data/lib/scout/semaphore.rb +8 -1
  29. data/lib/scout/tsv/dumper.rb +112 -0
  30. data/lib/scout/tsv/index.rb +161 -0
  31. data/lib/scout/tsv/open.rb +128 -0
  32. data/lib/scout/tsv/parser.rb +230 -30
  33. data/lib/scout/tsv/path.rb +13 -0
  34. data/lib/scout/tsv/persist/adapter.rb +367 -0
  35. data/lib/scout/tsv/persist/fix_width_table.rb +324 -0
  36. data/lib/scout/tsv/persist/serialize.rb +117 -0
  37. data/lib/scout/tsv/persist/tokyocabinet.rb +113 -0
  38. data/lib/scout/tsv/persist.rb +13 -0
  39. data/lib/scout/tsv/traverse.rb +143 -0
  40. data/lib/scout/tsv/util/filter.rb +303 -0
  41. data/lib/scout/tsv/util/process.rb +73 -0
  42. data/lib/scout/tsv/util/select.rb +220 -0
  43. data/lib/scout/tsv/util.rb +82 -0
  44. data/lib/scout/tsv.rb +16 -3
  45. data/lib/scout/work_queue/worker.rb +4 -4
  46. data/lib/scout/work_queue.rb +22 -7
  47. data/lib/scout/workflow/definition.rb +101 -4
  48. data/lib/scout/workflow/step/config.rb +18 -0
  49. data/lib/scout/workflow/step/dependencies.rb +40 -0
  50. data/lib/scout/workflow/step/file.rb +15 -0
  51. data/lib/scout/workflow/step/info.rb +35 -4
  52. data/lib/scout/workflow/step/progress.rb +14 -0
  53. data/lib/scout/workflow/step/provenance.rb +148 -0
  54. data/lib/scout/workflow/step.rb +71 -17
  55. data/lib/scout/workflow/task.rb +10 -5
  56. data/lib/scout/workflow/usage.rb +3 -1
  57. data/lib/scout/workflow.rb +11 -3
  58. data/lib/scout-gear.rb +1 -0
  59. data/lib/scout.rb +1 -0
  60. data/scout-gear.gemspec +64 -10
  61. data/scout_commands/find +1 -1
  62. data/scout_commands/workflow/task +16 -9
  63. data/scout_commands/workflow/task_old +2 -2
  64. data/share/software/install_helpers +523 -0
  65. data/test/scout/log/test_progress.rb +0 -2
  66. data/test/scout/misc/test_system.rb +21 -0
  67. data/test/scout/open/test_stream.rb +160 -1
  68. data/test/scout/path/test_find.rb +14 -7
  69. data/test/scout/resource/test_software.rb +24 -0
  70. data/test/scout/test_config.rb +66 -0
  71. data/test/scout/test_meta_extension.rb +10 -0
  72. data/test/scout/test_named_array.rb +19 -0
  73. data/test/scout/test_persist.rb +96 -0
  74. data/test/scout/test_tmpfile.rb +1 -1
  75. data/test/scout/test_tsv.rb +50 -1
  76. data/test/scout/test_work_queue.rb +41 -13
  77. data/test/scout/tsv/persist/test_adapter.rb +44 -0
  78. data/test/scout/tsv/persist/test_fix_width_table.rb +134 -0
  79. data/test/scout/tsv/persist/test_tokyocabinet.rb +92 -0
  80. data/test/scout/tsv/test_dumper.rb +44 -0
  81. data/test/scout/tsv/test_index.rb +156 -0
  82. data/test/scout/tsv/test_open.rb +9 -0
  83. data/test/scout/tsv/test_parser.rb +114 -3
  84. data/test/scout/tsv/test_persist.rb +43 -0
  85. data/test/scout/tsv/test_traverse.rb +116 -0
  86. data/test/scout/tsv/test_util.rb +23 -0
  87. data/test/scout/tsv/util/test_filter.rb +188 -0
  88. data/test/scout/tsv/util/test_process.rb +47 -0
  89. data/test/scout/tsv/util/test_select.rb +44 -0
  90. data/test/scout/work_queue/test_worker.rb +66 -9
  91. data/test/scout/workflow/step/test_dependencies.rb +25 -0
  92. data/test/scout/workflow/step/test_info.rb +15 -17
  93. data/test/scout/workflow/step/test_load.rb +19 -21
  94. data/test/scout/workflow/step/test_provenance.rb +25 -0
  95. data/test/scout/workflow/test_step.rb +206 -10
  96. data/test/scout/workflow/test_task.rb +0 -3
  97. data/test/test_helper.rb +9 -1
  98. metadata +50 -6
@@ -0,0 +1,44 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+ class TestTSVAdapter < Test::Unit::TestCase
6
+ def test_get_set
7
+ tsv = TSV.setup({}, :type => :list, :key_field => "Key", :fields => %w(one two three))
8
+ tsv.type = :list
9
+ tsv.extend TSVAdapter
10
+ tsv["a"] = %w(1 2 3)
11
+
12
+ assert_equal %w(1 2 3) * "\t", tsv.dup["a"]
13
+ assert_equal %w(a), tsv.keys
14
+ assert_equal [%w(1 2 3)], tsv.collect{|k,v| v }
15
+ assert_equal [%w(1 2 3)], tsv.values
16
+
17
+ json = tsv.to_json
18
+ new = JSON.parse(json)
19
+ tsv.annotate(new)
20
+ new.extend TSVAdapter
21
+
22
+ tsv = new
23
+ assert_equal %w(1 2 3) * "\t", tsv.dup["a"]
24
+ assert_equal %w(a), tsv.keys
25
+ assert_equal [%w(1 2 3)], tsv.collect{|k,v| v }
26
+ assert_equal [%w(1 2 3)], tsv.values
27
+ assert_equal [["a", %w(1 2 3)]], tsv.sort
28
+
29
+ tsv["b"] = %w(11 22 33)
30
+ assert_equal [["a", %w(1 2 3)], ["b", %w(11 22 33)]], tsv.sort
31
+ assert_equal [["b", %w(11 22 33)], ["a", %w(1 2 3)]], tsv.sort_by{|k,v| -v[0].to_i }
32
+ end
33
+
34
+ def test_serializer
35
+ tsv = TSV.setup({}, :type => :list, :key_field => "Key", :fields => %w(one two three))
36
+ tsv.type = :list
37
+ tsv.extend TSVAdapter
38
+ tsv.serializer = :integer_array
39
+ tsv["a"] = [1, 2, 3]
40
+
41
+ assert_equal [1, 2, 3], tsv["a"]
42
+ end
43
+ end
44
+
@@ -0,0 +1,134 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+ class TestFixWidthTable < Test::Unit::TestCase
6
+ def load_data(data)
7
+ tsv = TSV.open(data, type: :list, :sep=>":", :cast => proc{|e| e =~ /(\s*)(_*)/; ($1.length..($1.length + $2.length - 1))})
8
+ tsv.add_field "Start" do |key, values|
9
+ values["Range"].first
10
+ end
11
+ tsv.add_field "End" do |key, values|
12
+ values["Range"].last
13
+ end
14
+
15
+ tsv = tsv.slice ["Start", "End"]
16
+
17
+ tsv
18
+ end
19
+
20
+ def test_options
21
+ TmpFile.with_file do |filename|
22
+ f = FixWidthTable.new filename, 100, true
23
+ f.close
24
+
25
+ f1 = FixWidthTable.new filename, 100, false
26
+
27
+ assert_equal true, f1.range
28
+ end
29
+ end
30
+
31
+ def test_add
32
+ TmpFile.with_file do |filename|
33
+ f = FixWidthTable.new filename, 100, true
34
+ f.add [1,2,0], "test1"
35
+ f.add [3,4,0], "test2"
36
+ f.read
37
+
38
+ assert_equal 1, f.idx_pos(0)
39
+ assert_equal 3, f.idx_pos(1)
40
+ assert_equal 2, f.idx_pos_end(0)
41
+ assert_equal 4, f.idx_pos_end(1)
42
+ assert_equal 0, f.idx_overlap(0)
43
+ assert_equal 0, f.idx_overlap(1)
44
+ assert_equal "test1", f.idx_value(0)
45
+ assert_equal "test2", f.idx_value(1)
46
+
47
+ end
48
+
49
+ end
50
+
51
+ def test_point
52
+ data =<<-EOF
53
+ #: :sep=/\\s+/#:type=:single#:cast=:to_i
54
+ #ID Pos
55
+ a 1
56
+ b 10
57
+ c 20
58
+ d 12
59
+ e 26
60
+ f 11
61
+ g 25
62
+ EOF
63
+ TmpFile.with_file(data) do |datafile|
64
+ tsv = TSV.open datafile
65
+ TmpFile.with_file do |filename|
66
+ f = FixWidthTable.new filename, 100, false
67
+ f.add_point tsv
68
+ f.read
69
+
70
+ assert_equal %w(), f[0].sort
71
+ assert_equal %w(b), f[10].sort
72
+ assert_equal %w(a b c d f), f[(0..20)].sort
73
+ end
74
+ end
75
+ end
76
+
77
+ def test_range
78
+ data =<<-EOF
79
+ ##012345678901234567890
80
+ #ID:Range
81
+ a: ______
82
+ b: ______
83
+ c: _______
84
+ d: ____
85
+ e: ______
86
+ f: ___
87
+ g: ____
88
+ EOF
89
+ TmpFile.with_file(data) do |datafile|
90
+ tsv = load_data(datafile)
91
+ TmpFile.with_file do |filename|
92
+ f = FixWidthTable.new filename, 100, true
93
+ f.add_range tsv
94
+ f.read
95
+
96
+ assert_equal %w(), f[0].sort
97
+ assert_equal %w(b), f[1].sort
98
+ assert_equal %w(), f[20].sort
99
+ assert_equal %w(), f[(20..100)].sort
100
+ assert_equal %w(a b d), f[3].sort
101
+ assert_equal %w(a b c d e), f[(3..4)].sort
102
+ assert_equal %w(a c e), f[7].sort
103
+ end
104
+ end
105
+ end
106
+
107
+
108
+ def test_range_pos
109
+ data =<<-EOF
110
+ ##012345678901234567890
111
+ #ID:Range
112
+ a: ______
113
+ b: ______
114
+ c: _______
115
+ d: ____
116
+ e: ______
117
+ f: ___
118
+ g: ____
119
+ EOF
120
+ TmpFile.with_file(data) do |datafile|
121
+ tsv = load_data(datafile)
122
+ TmpFile.with_file do |filename|
123
+ f = FixWidthTable.new filename, 100, true
124
+ f.add_range tsv
125
+ f.read
126
+
127
+ assert_equal %w(), f.overlaps(0).sort
128
+ assert_equal %w(1:6), f.overlaps(1).sort
129
+ assert_equal %w(1:6:b), f.overlaps(1, true).sort
130
+ end
131
+ end
132
+ end
133
+ end
134
+
@@ -0,0 +1,92 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+
6
+ class TestTSVTokyo < Test::Unit::TestCase
7
+ def test_tokyo
8
+ content =<<-'EOF'
9
+ #: :sep=/\s+/#:type=:double#:merge=:concat
10
+ #Id ValueA ValueB OtherID
11
+ row1 a|aa|aaa b Id1|Id2
12
+ row2 A B Id3
13
+ row2 a a id3
14
+ EOF
15
+
16
+ tsv = TmpFile.with_file(content) do |filename|
17
+ Persist.persist(__method__, :HDB) do
18
+ TSV.open(filename)
19
+ end
20
+ end
21
+
22
+ assert_equal %w(a aa aaa), tsv["row1"][0]
23
+
24
+ tsv_loaded = assert_nothing_raised do
25
+ TmpFile.with_file(content) do |filename|
26
+ Persist.persist(__method__, :HDB) do
27
+ raise
28
+ end
29
+ end
30
+ end
31
+
32
+ assert_equal %w(a aa aaa), tsv_loaded["row1"][0]
33
+ end
34
+
35
+ def test_custom_load
36
+ tsv = TSV.setup({}, :type => :double, :key_field => "Key", :fields => %w(Field1 Field2))
37
+
38
+ size = 100_000
39
+ (0..size).each do |i|
40
+ k = "key-#{i}"
41
+ values1 = 3.times.collect{|j| "value-#{i}-1-#{j}" }
42
+ values2 = 5.times.collect{|j| "value-#{i}-2-#{j}" }
43
+
44
+ tsv[k] = [values1, values2]
45
+ end
46
+
47
+ tc = Persist.persist(__method__, :HDB) do |file|
48
+ tsv
49
+ end
50
+
51
+ 100.times do
52
+ i = rand(size).floor
53
+ assert_equal tc["key-#{i}"], tsv["key-#{i}"]
54
+ end
55
+ end
56
+
57
+ def test_speed
58
+ tsv = TSV.setup({}, :type => :double, :key_field => "Key", :fields => %w(Field1 Field2))
59
+
60
+ size = 100_000
61
+ (0..size).each do |i|
62
+ k = "key-#{i}"
63
+ values1 = 3.times.collect{|j| "value-#{i}-1-#{j}" }
64
+ values2 = 5.times.collect{|j| "value-#{i}-2-#{j}" }
65
+
66
+ tsv[k] = [values1, values2]
67
+ end
68
+
69
+ tc = Persist.persist(__method__, :HDB) do |file|
70
+ data = ScoutCabinet.open(file, true, "HDB")
71
+ TSV.setup(data, :type => :double, :key_field => "Key", :fields => %w(Field1 Field2))
72
+ data.extend TSVAdapter
73
+ Log::ProgressBar.with_bar size do |b|
74
+ (0..size).each do |i|
75
+ b.tick
76
+ k = "key-#{i}"
77
+ values1 = 3.times.collect{|j| "value-#{i}-1-#{j}" }
78
+ values2 = 5.times.collect{|j| "value-#{i}-2-#{j}" }
79
+
80
+ data[k] = [values1, values2]
81
+ end
82
+ end
83
+ data
84
+ end
85
+
86
+ 100.times do
87
+ i = rand(size).floor
88
+ assert_equal tc["key-#{i}"], tsv["key-#{i}"]
89
+ end
90
+ end
91
+ end
92
+
@@ -0,0 +1,44 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+
6
+ class TestTSVDumper < Test::Unit::TestCase
7
+ def test_dumper
8
+ dumper = TSV::Dumper.new :key_field => "Key", :fields => %w(Field1 Field2), :type => :double
9
+ dumper.init
10
+ dumper.add "a", [["1", "11"], ["2", "22"]]
11
+ txt=<<-EOF
12
+ #: :type=:double
13
+ #Key\tField1\tField2
14
+ a\t1|11\t2|22
15
+ EOF
16
+ dumper.close
17
+ assert_equal txt, dumper.stream.read
18
+ end
19
+
20
+ def test_to_s
21
+ tsv = TSV.setup({}, :key_field => "Key", :fields => %w(Field1 Field2), :type => :double)
22
+ tsv["a"] = [["1", "11"], ["2", "22"]]
23
+ txt=<<-EOF
24
+ #: :type=:double
25
+ #Key\tField1\tField2
26
+ a\t1|11\t2|22
27
+ EOF
28
+ assert_equal txt, tsv.to_s
29
+ end
30
+
31
+ def test_raise
32
+ dumper = TSV::Dumper.new :key_field => "Key", :fields => %w(Field1 Field2), :type => :double
33
+ dumper.init
34
+ t = Thread.new do
35
+ dumper.add "a", [["1", "11"], ["2", "22"]]
36
+ dumper.abort ScoutException
37
+ end
38
+
39
+ assert_raise ScoutException do
40
+ dumper.stream.read
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,156 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+ class TestTSVIndex < Test::Unit::TestCase
6
+ def load_segment_data(data)
7
+ tsv = TSV.open(data, type: :list, :sep=>":", :cast => proc{|e| e =~ /(\s*)(_*)/; ($1.length..($1.length + $2.length - 1))})
8
+
9
+ tsv = tsv.add_field "Start" do |key, values|
10
+ values["Range"].first
11
+ end
12
+
13
+ tsv = tsv.add_field "End" do |key, values|
14
+ values["Range"].last
15
+ end
16
+
17
+ tsv = tsv.slice ["Start", "End"]
18
+
19
+ tsv
20
+ end
21
+
22
+ def test_index
23
+ content =<<-'EOF'
24
+ #: :sep=/\s+/#:type=:double#:merge=:concat
25
+ #Id ValueA ValueB OtherID
26
+ row1 a|aa|aaa b Id1|Id2
27
+ row2 A B Id3|a
28
+ row2 a b id3
29
+ EOF
30
+
31
+ TmpFile.with_file(content) do |filename|
32
+ index = TSV.index(filename, :target => "ValueB")
33
+ assert_equal 'b', index["row1"]
34
+ assert_equal 'b', index["a"]
35
+ assert_equal 'b', index["aaa"]
36
+ assert_equal 'B', index["A"]
37
+ end
38
+
39
+ TmpFile.with_file(content) do |filename|
40
+ index = TSV.index(filename, :target => "ValueB", :fields => ["OtherID"])
41
+ assert_equal 'B', index["a"]
42
+ assert_nil index["B"]
43
+ end
44
+ end
45
+
46
+ def test_from_tsv
47
+ content =<<-'EOF'
48
+ #: :sep=/\s+/#:type=:double#:merge=:concat
49
+ #Id ValueA ValueB OtherID
50
+ row1 a|aa|aaa b Id1|Id2
51
+ row2 A B Id3|a
52
+ row2 a b id3
53
+ EOF
54
+
55
+ TmpFile.with_file(content) do |filename|
56
+ tsv = TSV.open(filename)
57
+ index = TSV.index(tsv, :target => "ValueB", :fields => "OtherID")
58
+ assert_equal 'B', index["a"]
59
+ assert_nil index["B"]
60
+
61
+ index = tsv.index(:target => "ValueB", :fields => "OtherID")
62
+ assert_equal 'B', index["a"]
63
+ assert_nil index["B"]
64
+ end
65
+ end
66
+
67
+
68
+ def test_persist
69
+ content =<<-'EOF'
70
+ #: :sep=/\s+/#:type=:double#:merge=:concat
71
+ #Id ValueA ValueB OtherID
72
+ row1 a|aa|aaa b Id1|Id2
73
+ row2 A B Id3|a
74
+ row2 a b id3
75
+ EOF
76
+ tsv = TmpFile.with_file(content) do |filename|
77
+ index = TSV.index(filename, :target => "ValueB", :persist => true)
78
+ assert_equal 'b', index["row1"]
79
+ assert_equal 'b', index["a"]
80
+ assert_equal 'b', index["aaa"]
81
+ assert_equal 'B', index["A"]
82
+ end
83
+ end
84
+
85
+ def test_range_index
86
+ data =<<-EOF
87
+ # 012345678901234567890
88
+ #ID:Range
89
+ a: ______
90
+ b: ______
91
+ c: _______
92
+ d: ____
93
+ e: ______
94
+ f: ___
95
+ g: ____
96
+ EOF
97
+ TmpFile.with_file(data) do |datafile|
98
+ tsv = load_segment_data(datafile)
99
+ f = tsv.range_index("Start", "End", :persist => true)
100
+
101
+ assert_equal %w(), f[0].sort
102
+ assert_equal %w(b), f[1].sort
103
+ assert_equal %w(), f[20].sort
104
+ assert_equal %w(), f[(20..100)].sort
105
+ assert_equal %w(a b d), f[3].sort
106
+ assert_equal %w(a b c d e), f[(3..4)].sort
107
+ end
108
+ end
109
+
110
+ def test_range_index_persistent
111
+ data =<<-EOF
112
+ # 012345678901234567890
113
+ #ID:Range
114
+ a: ______
115
+ b: ______
116
+ c: _______
117
+ d: ____
118
+ e: ______
119
+ f: ___
120
+ g: ____
121
+ EOF
122
+ TmpFile.with_file(data) do |datafile|
123
+ load_segment_data(datafile)
124
+ TmpFile.with_file(load_segment_data(datafile).to_s) do |tsvfile|
125
+ f = TSV.range_index(tsvfile, "Start", "End", :persist => true)
126
+
127
+ assert_equal %w(), f[0].sort
128
+ assert_equal %w(b), f[1].sort
129
+ assert_equal %w(), f[20].sort
130
+ assert_equal %w(), f[(20..100)].sort
131
+ assert_equal %w(a b d), f[3].sort
132
+ assert_equal %w(a b c d e), f[(3..4)].sort
133
+ end
134
+ end
135
+ end
136
+
137
+
138
+ def __test_speed
139
+ content =<<-'EOF'
140
+ #: :sep=/\s+/#:type=:double#:merge=:concat
141
+ #Id ValueA ValueB OtherID
142
+ row1 a|aa|aaa b Id1|Id2
143
+ row2 A B Id3|a
144
+ row2 a b id3
145
+ EOF
146
+ tsv = TmpFile.with_file(content) do |filename|
147
+ Misc.benchmark 1000 do
148
+ TSV.index(filename, :target => "ValueB")
149
+ end
150
+ Misc.benchmark 1000 do
151
+ TSV.index(filename, :target => "ValueB", order: false)
152
+ end
153
+ end
154
+ end
155
+ end
156
+
@@ -0,0 +1,9 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestOpenTraverse < Test::Unit::TestCase
5
+ def test_true
6
+ assert true
7
+ end
8
+ end
9
+
@@ -12,6 +12,15 @@ class TestTSVParser < Test::Unit::TestCase
12
12
  assert_equal (1..10).collect{|v| v.to_s }, values
13
13
  end
14
14
 
15
+ def test_parse_line_key
16
+ line = (0..10).to_a * "\t"
17
+ key, values = TSV.parse_line(line, key: 2)
18
+
19
+ assert_equal "2", key
20
+ assert_equal %w(0 1 3 4 5 6 7 8 9 10), values
21
+ end
22
+
23
+
15
24
  def test_parse_double
16
25
  line = (0..10).collect{|v| v == 0 ? v : [v,v] * "|" } * "\t"
17
26
  key, values = TSV.parse_line(line, type: :double, cast: :to_i)
@@ -20,15 +29,16 @@ class TestTSVParser < Test::Unit::TestCase
20
29
  assert_equal (1..10).collect{|v| [v,v] }, values
21
30
  end
22
31
 
23
- def __test_benchmark
32
+ def ___test_benchmark
24
33
  num = 10_000
25
34
  txt = num.times.inject(nil) do |acc,i|
26
35
  (acc.nil? ? "" : acc << "\n") << (0..10).collect{|v| v == 0 ? i : [v,v] * "|" } * "\t"
27
36
  end
28
37
 
29
38
  txt = StringIO.new(([txt] * (10))*"\n")
30
- Misc.benchmark 1 do
31
- #Misc.profile do
39
+ Misc.benchmark 5 do
40
+ txt.rewind
41
+ #Misc.profile do
32
42
  data = TSV.parse_stream(txt, fix: true, type: :double, bar: true, merge: :concat)
33
43
  assert_equal num, data.size
34
44
  assert_equal 20, data['1'][0].length
@@ -84,4 +94,105 @@ k a|A b|B
84
94
  tsv = TSV.parse(header)
85
95
  assert_equal 'a', tsv['k'][0][0]
86
96
  end
97
+
98
+ def test_parse_fields
99
+ content =<<-EOF
100
+ #: :sep=" "#:type=:double
101
+ #Key ValueA ValueB
102
+ k a|A b|B
103
+ EOF
104
+ content = StringIO.new content
105
+
106
+ tsv = TSV.parse(content, fields: %w(ValueB))
107
+ assert_equal [%w(b B)], tsv['k']
108
+ assert_equal %w(ValueB), tsv.fields
109
+
110
+ content.rewind
111
+
112
+ tsv = TSV.parse(content, fields: %w(ValueB ValueA))
113
+ assert_equal [%w(b B), %w(a A)], tsv['k']
114
+ assert_equal %w(ValueB ValueA), tsv.fields
115
+
116
+ content.rewind
117
+
118
+ tsv = TSV.parse(content, fields: %w(ValueB Key))
119
+ assert_equal [%w(b B), %w(k)], tsv['k']
120
+ end
121
+
122
+ def test_parse_key
123
+ content =<<-EOF
124
+ #: :sep=" "#:type=:double
125
+ #Key ValueA ValueB
126
+ k a|A b|B
127
+ EOF
128
+ content = StringIO.new content
129
+
130
+ tsv = TSV.parse(content, key_field: "ValueB")
131
+ assert_equal %w(b B), tsv.keys
132
+ assert_equal %w(a A), tsv["B"][1]
133
+
134
+ content.rewind
135
+
136
+ tsv = TSV.parse(content, key_field: "ValueB", one2one: true, type: :double)
137
+ assert_equal %w(b B), tsv.keys
138
+ assert_equal %w(A), tsv["B"][1]
139
+
140
+ content.rewind
141
+
142
+ tsv = TSV.parse(content, key_field: "ValueB", one2one: true, type: :list)
143
+ assert_equal %w(b B), tsv.keys
144
+ assert_equal "a", tsv["b"][1]
145
+ assert_equal "A", tsv["B"][1]
146
+ assert_equal "k", tsv["b"][0]
147
+ assert_equal "k", tsv["B"][0]
148
+
149
+ content.rewind
150
+
151
+ tsv = TSV.parse(content, key_field: "ValueB", one2one: true, type: :list)
152
+ assert_equal %w(b B), tsv.keys
153
+ assert_equal "A", tsv["B"][1]
154
+ end
155
+
156
+ def test_parser_class
157
+ content =<<-EOF
158
+ Key ValueA ValueB
159
+ k a|A b|B
160
+ EOF
161
+ content = StringIO.new content
162
+
163
+ parser = TSV::Parser.new content, sep: " ", header_hash: ''
164
+
165
+ assert_equal "Key", parser.key_field
166
+
167
+ values = []
168
+ parser.traverse fields: %w(ValueB), type: :double do |k,v|
169
+ values << [k,v]
170
+ end
171
+
172
+ assert_equal [["k", [%w(b B)]]], values
173
+ end
174
+
175
+
176
+ def test_parse_persist_serializer
177
+ content =<<-EOF
178
+ Key ValueA ValueB
179
+ k 1 2
180
+ EOF
181
+ content = StringIO.new content
182
+
183
+ TmpFile.with_file do |db|
184
+ data = ScoutCabinet.open db, true, "HDB"
185
+ TSV.parse content, sep: " ", header_hash: '', data: data, cast: :to_i, type: :list
186
+ assert_equal [1, 2], data["k"]
187
+ end
188
+
189
+ TmpFile.with_file do |db|
190
+ content.rewind
191
+ data = ScoutCabinet.open db, true, "HDB"
192
+ TSV.parse content, sep: " ", header_hash: '', data: data, cast: :to_i, type: :list, serializer: :float_array
193
+ assert_equal [1.0, 2.0], data["k"]
194
+ end
195
+
196
+ end
197
+
87
198
  end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+
6
+ class TestTSVPersist < Test::Unit::TestCase
7
+ def test_persist
8
+ content =<<-'EOF'
9
+ #: :sep=/\s+/#:type=:double#:merge=:concat
10
+ #Id ValueA ValueB OtherID
11
+ row1 a|aa|aaa b Id1|Id2
12
+ row2 A B Id3
13
+ row2 a a id3
14
+ EOF
15
+
16
+
17
+ tsv = Persist.persist("TEST Persist TSV", :tsv) do
18
+ TmpFile.with_file(content) do |filename|
19
+ TSV.open(filename)
20
+ end
21
+ end
22
+
23
+ assert_include tsv.keys, 'row1'
24
+ assert_include tsv.keys, 'row2'
25
+
26
+ tsv = Persist.persist("TEST Persist TSV", :tsv) do
27
+ TmpFile.with_file(content) do |filename|
28
+ TSV.open(filename)
29
+ end
30
+ end
31
+
32
+
33
+ assert_nothing_raised do
34
+ tsv = Persist.persist("TEST Persist TSV", :tsv) do
35
+ raise
36
+ end
37
+ end
38
+
39
+ assert_include tsv.keys, 'row1'
40
+ assert_include tsv.keys, 'row2'
41
+ end
42
+ end
43
+