scout-gear 7.2.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.
- checksums.yaml +4 -4
- data/.vimproject +37 -3
- data/VERSION +1 -1
- data/lib/scout/concurrent_stream.rb +9 -8
- data/lib/scout/exceptions.rb +1 -0
- data/lib/scout/log/color.rb +0 -1
- data/lib/scout/log/progress/util.rb +65 -0
- data/lib/scout/misc/helper.rb +31 -0
- data/lib/scout/misc/monitor.rb +1 -1
- data/lib/scout/misc.rb +1 -0
- data/lib/scout/open/stream.rb +21 -27
- data/lib/scout/persist.rb +42 -28
- data/lib/scout/semaphore.rb +8 -1
- data/lib/scout/tsv/dumper.rb +13 -8
- data/lib/scout/tsv/index.rb +127 -15
- data/lib/scout/tsv/open.rb +128 -0
- data/lib/scout/tsv/parser.rb +70 -43
- data/lib/scout/tsv/path.rb +4 -4
- data/lib/scout/tsv/persist/adapter.rb +52 -33
- data/lib/scout/tsv/persist/fix_width_table.rb +324 -0
- data/lib/scout/tsv/persist/serialize.rb +117 -0
- data/lib/scout/tsv/persist/tokyocabinet.rb +3 -3
- data/lib/scout/tsv/persist.rb +0 -2
- data/lib/scout/tsv/traverse.rb +130 -35
- data/lib/scout/tsv/util/filter.rb +303 -0
- data/lib/scout/tsv/util/process.rb +73 -0
- data/lib/scout/tsv/util/select.rb +220 -0
- data/lib/scout/tsv/util.rb +77 -19
- data/lib/scout/tsv.rb +2 -2
- data/lib/scout/work_queue/worker.rb +1 -1
- data/lib/scout/workflow/definition.rb +8 -0
- data/lib/scout/workflow/step/info.rb +4 -0
- data/lib/scout/workflow/step/progress.rb +14 -0
- data/lib/scout/workflow/step.rb +10 -5
- data/lib/scout/workflow/task.rb +8 -4
- data/lib/scout/workflow/usage.rb +2 -0
- data/scout-gear.gemspec +33 -10
- data/scout_commands/workflow/task +3 -2
- data/scout_commands/workflow/task_old +2 -2
- data/test/scout/open/test_stream.rb +1 -1
- data/test/scout/test_persist.rb +61 -0
- data/test/scout/test_tmpfile.rb +1 -1
- data/test/scout/test_tsv.rb +10 -1
- data/test/scout/test_work_queue.rb +1 -0
- data/test/scout/tsv/persist/test_adapter.rb +10 -0
- data/test/scout/tsv/persist/test_fix_width_table.rb +134 -0
- data/test/scout/tsv/test_index.rb +94 -2
- data/test/scout/tsv/test_open.rb +9 -0
- data/test/scout/tsv/test_parser.rb +28 -3
- data/test/scout/tsv/test_persist.rb +7 -0
- data/test/scout/tsv/test_traverse.rb +110 -3
- data/test/scout/tsv/test_util.rb +23 -0
- data/test/scout/tsv/util/test_filter.rb +188 -0
- data/test/scout/tsv/util/test_process.rb +47 -0
- data/test/scout/tsv/util/test_select.rb +44 -0
- data/test/scout/work_queue/test_worker.rb +63 -6
- data/test/scout/workflow/step/test_load.rb +3 -3
- data/test/scout/workflow/test_step.rb +10 -10
- data/test/test_helper.rb +3 -1
- metadata +19 -6
@@ -1,8 +1,25 @@
|
|
1
1
|
require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
|
2
2
|
require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
|
3
3
|
|
4
|
+
require 'scout/tsv'
|
4
5
|
class TestTSVIndex < Test::Unit::TestCase
|
5
|
-
def
|
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
|
6
23
|
content =<<-'EOF'
|
7
24
|
#: :sep=/\s+/#:type=:double#:merge=:concat
|
8
25
|
#Id ValueA ValueB OtherID
|
@@ -20,12 +37,34 @@ row2 a b id3
|
|
20
37
|
end
|
21
38
|
|
22
39
|
TmpFile.with_file(content) do |filename|
|
23
|
-
index = TSV.index(filename, :target => "ValueB", :fields => "OtherID")
|
40
|
+
index = TSV.index(filename, :target => "ValueB", :fields => ["OtherID"])
|
24
41
|
assert_equal 'B', index["a"]
|
25
42
|
assert_nil index["B"]
|
26
43
|
end
|
27
44
|
end
|
28
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
|
+
|
29
68
|
def test_persist
|
30
69
|
content =<<-'EOF'
|
31
70
|
#: :sep=/\s+/#:type=:double#:merge=:concat
|
@@ -43,6 +82,59 @@ row2 a b id3
|
|
43
82
|
end
|
44
83
|
end
|
45
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
|
+
|
46
138
|
def __test_speed
|
47
139
|
content =<<-'EOF'
|
48
140
|
#: :sep=/\s+/#:type=:double#:merge=:concat
|
@@ -29,15 +29,16 @@ class TestTSVParser < Test::Unit::TestCase
|
|
29
29
|
assert_equal (1..10).collect{|v| [v,v] }, values
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
32
|
+
def ___test_benchmark
|
33
33
|
num = 10_000
|
34
34
|
txt = num.times.inject(nil) do |acc,i|
|
35
35
|
(acc.nil? ? "" : acc << "\n") << (0..10).collect{|v| v == 0 ? i : [v,v] * "|" } * "\t"
|
36
36
|
end
|
37
37
|
|
38
38
|
txt = StringIO.new(([txt] * (10))*"\n")
|
39
|
-
Misc.benchmark
|
40
|
-
|
39
|
+
Misc.benchmark 5 do
|
40
|
+
txt.rewind
|
41
|
+
#Misc.profile do
|
41
42
|
data = TSV.parse_stream(txt, fix: true, type: :double, bar: true, merge: :concat)
|
42
43
|
assert_equal num, data.size
|
43
44
|
assert_equal 20, data['1'][0].length
|
@@ -170,4 +171,28 @@ k a|A b|B
|
|
170
171
|
|
171
172
|
assert_equal [["k", [%w(b B)]]], values
|
172
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
|
+
|
173
198
|
end
|
@@ -23,6 +23,13 @@ row2 a a id3
|
|
23
23
|
assert_include tsv.keys, 'row1'
|
24
24
|
assert_include tsv.keys, 'row2'
|
25
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
|
+
|
26
33
|
assert_nothing_raised do
|
27
34
|
tsv = Persist.persist("TEST Persist TSV", :tsv) do
|
28
35
|
raise
|
@@ -1,9 +1,116 @@
|
|
1
1
|
require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
|
2
2
|
require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
require 'scout/tsv'
|
5
|
+
|
6
|
+
class TestTSVTraverse < Test::Unit::TestCase
|
7
|
+
def test_tsv_traverse_double
|
8
|
+
content =<<-'EOF'
|
9
|
+
#: :sep=/\s+/#:type=:double
|
10
|
+
#Id ValueA ValueB OtherID
|
11
|
+
row1 a|aa|aaa b Id1|Id2
|
12
|
+
row2 A B Id3
|
13
|
+
row2 AA BB Id33
|
14
|
+
EOF
|
15
|
+
|
16
|
+
sss 0
|
17
|
+
tsv = TmpFile.with_file(content) do |filename|
|
18
|
+
TSV.open(filename, :persist => true)
|
19
|
+
end
|
20
|
+
|
21
|
+
res = {}
|
22
|
+
tsv.traverse :key, %w(OtherID ValueB) do |k,v|
|
23
|
+
res[k] = v
|
24
|
+
end
|
25
|
+
assert_equal [%w(Id3 Id33), %w(B BB)], res["row2"]
|
26
|
+
|
27
|
+
res = {}
|
28
|
+
tsv.traverse :key, %w(OtherID ValueB), type: :list do |k,v|
|
29
|
+
res[k] = v
|
30
|
+
end
|
31
|
+
assert_equal ["Id3", "B"], res["row2"]
|
32
|
+
|
33
|
+
res = {}
|
34
|
+
tsv.traverse "OtherID", %w(Id ValueB), one2one: true do |k,v|
|
35
|
+
res[k] = v
|
36
|
+
end
|
37
|
+
assert_equal [[nil], %w(BB)], res["Id33"]
|
38
|
+
|
39
|
+
res = {}
|
40
|
+
tsv.traverse "OtherID", %w(Id ValueB), one2one: true, type: :list do |k,v|
|
41
|
+
res[k] = v
|
42
|
+
end
|
43
|
+
assert_equal ["row2", "B"], res["Id3"]
|
44
|
+
assert_equal [nil, "BB"], res["Id33"]
|
45
|
+
|
46
|
+
tsv.traverse "OtherID", %w(Id ValueB), one2one: false, type: :list do |k,v|
|
47
|
+
res[k] = v
|
48
|
+
end
|
49
|
+
assert_equal ["row2", "B"], res["Id3"]
|
50
|
+
assert_equal [nil, "BB"], res["Id33"]
|
51
|
+
|
52
|
+
res = {}
|
53
|
+
key_name, field_names = tsv.traverse "OtherID" do |k,v|
|
54
|
+
res[k] = v
|
55
|
+
end
|
56
|
+
assert_equal "OtherID", key_name
|
57
|
+
assert_equal %w(Id ValueA ValueB), field_names
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_tsv_traverse_list
|
61
|
+
content =<<-'EOF'
|
62
|
+
#: :sep=/\s+/#:type=:list
|
63
|
+
#Id ValueA ValueB OtherID
|
64
|
+
row1 a b Id1
|
65
|
+
row2 A B Id3
|
66
|
+
EOF
|
67
|
+
|
68
|
+
tsv = TmpFile.with_file(content) do |filename|
|
69
|
+
TSV.open(filename, :persist => true)
|
70
|
+
end
|
71
|
+
|
72
|
+
res = {}
|
73
|
+
tsv.traverse :key, %w(OtherID ValueB) do |k,v|
|
74
|
+
res[k] = v
|
75
|
+
end
|
76
|
+
assert_equal ["Id3", "B"], res["row2"]
|
77
|
+
|
78
|
+
res = {}
|
79
|
+
tsv.traverse :key, %w(OtherID ValueB), type: :double do |k,v|
|
80
|
+
res[k] = v
|
81
|
+
end
|
82
|
+
assert_equal [%w(Id3), %w(B)], res["row2"]
|
83
|
+
|
84
|
+
res = {}
|
85
|
+
tsv.traverse :key, %w(OtherID ValueB), type: :flat do |k,v|
|
86
|
+
res[k] = v
|
87
|
+
end
|
88
|
+
assert_equal %w(Id3 B), res["row2"]
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_tsv_traverse_single
|
92
|
+
content =<<-'EOF'
|
93
|
+
#: :sep=/\s+/#:type=:single
|
94
|
+
#Id ValueA
|
95
|
+
row1 a
|
96
|
+
row2 A
|
97
|
+
EOF
|
98
|
+
|
99
|
+
tsv = TmpFile.with_file(content) do |filename|
|
100
|
+
TSV.open(filename, :persist => true)
|
101
|
+
end
|
102
|
+
|
103
|
+
res = {}
|
104
|
+
tsv.traverse "ValueA", %w(Id) do |k,v|
|
105
|
+
res[k] = v
|
106
|
+
end
|
107
|
+
assert_equal "row1", res["a"]
|
108
|
+
|
109
|
+
res = {}
|
110
|
+
tsv.traverse "ValueA", %w(Id), type: :double do |k,v|
|
111
|
+
res[k] = v
|
112
|
+
end
|
113
|
+
assert_equal [["row1"]], res["a"]
|
7
114
|
end
|
8
115
|
end
|
9
116
|
|
data/test/scout/tsv/test_util.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
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 TestTSVUtil < Test::Unit::TestCase
|
6
|
+
def test_open_persist
|
7
|
+
content =<<-'EOF'
|
8
|
+
#: :sep=/\s+/#:type=:double#:merge=:concat
|
9
|
+
#Id ValueA ValueB OtherID
|
10
|
+
row1 a|aa|aaa b Id1|Id2
|
11
|
+
row2 A B Id3
|
12
|
+
row2 a a id3
|
13
|
+
EOF
|
14
|
+
|
15
|
+
tsv = TmpFile.with_file(content) do |filename|
|
16
|
+
TSV.open(filename, :sep => " " )
|
17
|
+
end
|
18
|
+
assert_equal %w(row1 row2), tsv.collect{|k,v| k }
|
19
|
+
assert NamedArray === tsv.collect{|k,v| v }.first
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,188 @@
|
|
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 TestTSVFilters < Test::Unit::TestCase
|
6
|
+
def test_collect
|
7
|
+
content1 =<<-EOF
|
8
|
+
#: :sep=/\\s+/#:case_insensitive=false
|
9
|
+
#Id ValueA ValueB
|
10
|
+
row1 a|aa|aaa b
|
11
|
+
row2 A B
|
12
|
+
EOF
|
13
|
+
|
14
|
+
TmpFile.with_file(content1) do |filename|
|
15
|
+
tsv = TSV.open filename
|
16
|
+
assert_equal 2, tsv.collect.size
|
17
|
+
tsv.filter
|
18
|
+
tsv.add_filter "field:ValueA", ["A"]
|
19
|
+
assert_equal 1, tsv.collect.size
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_through
|
24
|
+
content1 =<<-EOF
|
25
|
+
#: :sep=/\\s+/#:case_insensitive=false
|
26
|
+
#Id ValueA ValueB
|
27
|
+
row1 a|aa|aaa b
|
28
|
+
row2 A B
|
29
|
+
EOF
|
30
|
+
|
31
|
+
TmpFile.with_file(content1) do |filename|
|
32
|
+
tsv = TSV.open filename
|
33
|
+
tsv.filter
|
34
|
+
tsv.add_filter "field:ValueA", ["A"]
|
35
|
+
elem = []
|
36
|
+
tsv.through do |k,v| elem << k end
|
37
|
+
assert_equal 1, elem.size
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_2_filters
|
42
|
+
content1 =<<-EOF
|
43
|
+
#: :sep=/\\s+/#:case_insensitive=false
|
44
|
+
#Id ValueA ValueB
|
45
|
+
row1 a|aa|aaa b
|
46
|
+
row2 A B
|
47
|
+
row3 A C
|
48
|
+
EOF
|
49
|
+
|
50
|
+
TmpFile.with_file(content1) do |filename|
|
51
|
+
tsv = TSV.open filename
|
52
|
+
tsv.filter
|
53
|
+
tsv.add_filter "field:ValueA", ["A"]
|
54
|
+
|
55
|
+
elem = []
|
56
|
+
tsv.through do |k,v| elem << k end
|
57
|
+
assert_equal 2, elem.size
|
58
|
+
assert_equal ["row2", "row3"], elem.sort
|
59
|
+
|
60
|
+
tsv.add_filter "field:ValueB", ["C"]
|
61
|
+
|
62
|
+
elem = []
|
63
|
+
tsv.through do |k,v| elem << k end
|
64
|
+
assert_equal 1, elem.size
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_filter_persistence
|
69
|
+
content1 =<<-EOF
|
70
|
+
#: :sep=/\\s+/#:case_insensitive=false
|
71
|
+
#Id ValueA ValueB
|
72
|
+
row1 a|aa|aaa b
|
73
|
+
row2 A B
|
74
|
+
row3 A C
|
75
|
+
EOF
|
76
|
+
|
77
|
+
TmpFile.with_file(content1) do |filename|
|
78
|
+
tsv = TSV.open filename
|
79
|
+
tsv.filter
|
80
|
+
tsv.add_filter "field:ValueA", ["A"], tmpdir.fieldValueA.find(:user)
|
81
|
+
|
82
|
+
elem = []
|
83
|
+
tsv.through do |k,v| elem << k end
|
84
|
+
assert_equal 2, elem.size
|
85
|
+
|
86
|
+
tsv.add_filter "field:ValueB", ["C"]
|
87
|
+
|
88
|
+
elem = []
|
89
|
+
tsv.through do |k,v| elem << k end
|
90
|
+
assert_equal 1, elem.size
|
91
|
+
|
92
|
+
tsv = TSV.open filename
|
93
|
+
tsv.filter
|
94
|
+
tsv.add_filter "field:ValueA", ["A"], tmpdir.fieldValueA.find(:user)
|
95
|
+
|
96
|
+
elem = []
|
97
|
+
tsv.through do |k,v| elem << k end
|
98
|
+
assert_equal 2, elem.size
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def __test_filter_persistence_update
|
103
|
+
content1 =<<-EOF
|
104
|
+
#: :sep=/\\s+/#:case_insensitive=false
|
105
|
+
#Id ValueA ValueB
|
106
|
+
row1 a|aa|aaa b
|
107
|
+
row2 A B
|
108
|
+
EOF
|
109
|
+
|
110
|
+
TmpFile.with_file(content1) do |filename|
|
111
|
+
tsv = TSV.open filename
|
112
|
+
tsv.filter
|
113
|
+
tsv.add_filter "field:ValueA", ["A"], Scout.tmp.test.Filter.fieldValueA.find(:user)
|
114
|
+
|
115
|
+
elem = []
|
116
|
+
tsv.through do |k,v| elem << k end
|
117
|
+
assert_equal 1, elem.size
|
118
|
+
|
119
|
+
tsv["row3"] = [["A"], ["C"]]
|
120
|
+
|
121
|
+
elem = []
|
122
|
+
tsv.through do |k,v| elem << k end
|
123
|
+
assert_equal 2, elem.size
|
124
|
+
|
125
|
+
tsv.add_filter "field:ValueB", ["C"]
|
126
|
+
|
127
|
+
elem = []
|
128
|
+
tsv.through do |k,v| elem << k end
|
129
|
+
assert_equal 1, elem.size
|
130
|
+
|
131
|
+
tsv = TSV.open filename
|
132
|
+
tsv.filter
|
133
|
+
tsv.add_filter "field:ValueA", ["A"], Scout.tmp.test.Filter.fieldValueA.find(:user)
|
134
|
+
|
135
|
+
elem = []
|
136
|
+
tsv.through do |k,v| elem << k end
|
137
|
+
assert_equal 1, elem.size
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_delete
|
142
|
+
content =<<-EOF
|
143
|
+
#ID ValueA ValueB Comment
|
144
|
+
row1 a b c
|
145
|
+
row2 A B C
|
146
|
+
EOF
|
147
|
+
|
148
|
+
TmpFile.with_file(content) do |filename|
|
149
|
+
tsv = TSV.open(File.open(filename), type: :double, :sep => /\s/)
|
150
|
+
assert_equal 2, tsv.keys.length
|
151
|
+
tsv.delete "row2"
|
152
|
+
assert_equal 1, tsv.keys.length
|
153
|
+
|
154
|
+
tsv = TSV.open(File.open(filename), type: :double, :sep => /\s/)
|
155
|
+
tsv.filter
|
156
|
+
tsv.add_filter "field:ValueA", ["A"]
|
157
|
+
|
158
|
+
assert_equal 1, tsv.keys.length
|
159
|
+
assert_equal ["row2"], tsv.keys
|
160
|
+
|
161
|
+
tsv.delete "row2"
|
162
|
+
assert_equal 0, tsv.keys.length
|
163
|
+
|
164
|
+
tsv.pop_filter
|
165
|
+
assert_equal ["row1"], tsv.keys
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_filename
|
170
|
+
content1 =<<-EOF
|
171
|
+
#: :sep=/\\s+/#:case_insensitive=false
|
172
|
+
#Id ValueA ValueB
|
173
|
+
row1 a|aa|aaa b
|
174
|
+
row2 A B
|
175
|
+
EOF
|
176
|
+
|
177
|
+
TmpFile.with_file(content1) do |filename|
|
178
|
+
tsv = TSV.open filename
|
179
|
+
tsv.filter
|
180
|
+
tsv.add_filter "field:ValueA", ["A"]
|
181
|
+
assert tsv.filename =~ /ValueA/
|
182
|
+
tsv.pop_filter
|
183
|
+
assert tsv.filename !~ /ValueA/
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
@@ -0,0 +1,47 @@
|
|
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 TestTSVProcess < Test::Unit::TestCase
|
6
|
+
def test_process
|
7
|
+
content =<<-'EOF'
|
8
|
+
#: :sep=/\s+/#:type=:double
|
9
|
+
#Id ValueA ValueB OtherID
|
10
|
+
row1 a|aa|aaa b Id1|Id2
|
11
|
+
row2 A B Id3
|
12
|
+
row2 AA BB Id33
|
13
|
+
EOF
|
14
|
+
|
15
|
+
tsv = TmpFile.with_file(content) do |filename|
|
16
|
+
TSV.open(filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
tsv.process "ValueA" do |v|
|
20
|
+
v.collect{|e| e.upcase }
|
21
|
+
end
|
22
|
+
|
23
|
+
assert_equal %w(A AA AAA), tsv["row1"][0]
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_add_field
|
27
|
+
content =<<-'EOF'
|
28
|
+
#: :sep=/\s+/#:type=:double
|
29
|
+
#Id ValueA ValueB OtherID
|
30
|
+
row1 a|aa|aaa b Id1|Id2
|
31
|
+
row2 A B Id3
|
32
|
+
row2 AA BB Id33
|
33
|
+
EOF
|
34
|
+
|
35
|
+
tsv = TmpFile.with_file(content) do |filename|
|
36
|
+
TSV.open(filename)
|
37
|
+
end
|
38
|
+
|
39
|
+
tsv.add_field "ValueC" do |k,v|
|
40
|
+
v[0].collect{|e| e.gsub("a", "c").gsub("A", "C") }
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_equal %w(c cc ccc), tsv["row1"]["ValueC"]
|
44
|
+
assert_equal %w(C CC), tsv["row2"]["ValueC"]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -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 TestTSVSelect < Test::Unit::TestCase
|
6
|
+
def test_select
|
7
|
+
content =<<-'EOF'
|
8
|
+
#: :sep=/\s+/#:type=:double
|
9
|
+
#Id ValueA ValueB OtherID
|
10
|
+
row1 a|aa|aaa b Id1|Id2
|
11
|
+
row2 A B Id3
|
12
|
+
row2 AA BB Id33
|
13
|
+
EOF
|
14
|
+
|
15
|
+
tsv = TmpFile.with_file(content) do |filename|
|
16
|
+
TSV.open(filename, :persist => true)
|
17
|
+
end
|
18
|
+
|
19
|
+
s = tsv.select do |k,v|
|
20
|
+
k.include? "2"
|
21
|
+
end
|
22
|
+
|
23
|
+
assert_equal ['row2'], s.keys
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_reorder
|
27
|
+
content =<<-'EOF'
|
28
|
+
#: :sep=/\s+/#:type=:double
|
29
|
+
#Id ValueA ValueB OtherID
|
30
|
+
row1 a1|a2 b1|b2 Id1|Id2
|
31
|
+
row2 A1|A3 B1|B3 Id1|Id3
|
32
|
+
EOF
|
33
|
+
|
34
|
+
tsv = TmpFile.with_file(content) do |filename|
|
35
|
+
TSV.open(filename)
|
36
|
+
end
|
37
|
+
|
38
|
+
r = tsv.reorder "OtherID", %w(ValueB Id)
|
39
|
+
|
40
|
+
assert_equal %w(row1 row2), r["Id1"]["Id"]
|
41
|
+
assert_equal %w(row2), r["Id3"]["Id"]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|