scout-gear 7.1.0 → 7.3.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 (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
+