rbbt-util 5.8.0 → 5.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/resource/path.rb +4 -0
- data/lib/rbbt/tsv.rb +7 -62
- data/lib/rbbt/tsv/change_id.rb +8 -4
- data/lib/rbbt/tsv/parser.rb +138 -22
- data/lib/rbbt/util/log.rb +2 -1
- data/lib/rbbt/workflow/accessor.rb +26 -34
- data/lib/rbbt/workflow/step.rb +4 -3
- data/share/rbbt_commands/benchmark/tsv +10 -0
- data/share/rbbt_commands/stat/abs +43 -0
- data/share/rbbt_commands/stat/density +0 -5
- data/share/rbbt_commands/stat/log +43 -0
- data/test/rbbt/test_tsv.rb +0 -15
- data/test/rbbt/tsv/test_change_id.rb +8 -1
- data/test/rbbt/tsv/test_parser.rb +34 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5612376bb0b3bc5345a607fd72cfb4f744eeba8
|
4
|
+
data.tar.gz: 8d8d53efd7203512d28462d609bf6f52a1c492c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f858ffbc83f9a199a22c9c1a49b1d40f0de1f1ea8e9979820901040a23a9eb3c7077f354aac6260876c7f04941bd2a2eea976262f6b73a1a46687421fbc441f7
|
7
|
+
data.tar.gz: 3dd1ed9a2dcf25fa5939935f27ad026df16c10a8e464743122e7f6725f8317db82cdee7c5f01b5c7866a442aee9ac9cfc963eca6e276eba372bacc6749ee84d2
|
data/lib/rbbt/resource/path.rb
CHANGED
data/lib/rbbt/tsv.rb
CHANGED
@@ -110,20 +110,11 @@ module TSV
|
|
110
110
|
Parser.new stream, options
|
111
111
|
end
|
112
112
|
end
|
113
|
-
|
114
113
|
def self.parse(stream, data, options = {})
|
115
|
-
monitor, grep, invert_grep, head = Misc.process_options options, :monitor, :grep, :invert_grep, :head
|
116
|
-
|
117
|
-
parser = Parser.new stream, options
|
118
114
|
|
119
|
-
|
120
|
-
stream.rewind
|
121
|
-
stream = Open.grep(stream, grep, invert_grep)
|
122
|
-
parser.first_line = stream.gets
|
123
|
-
end
|
124
|
-
|
125
|
-
line = parser.rescue_first_line
|
115
|
+
parser = TSV::Parser.new stream, options
|
126
116
|
|
117
|
+
# dump with tchmgr
|
127
118
|
if defined? TokyoCabinet and TokyoCabinet::HDB === data and parser.straight and
|
128
119
|
data.close
|
129
120
|
begin
|
@@ -137,9 +128,11 @@ module TSV
|
|
137
128
|
data.write
|
138
129
|
end
|
139
130
|
|
131
|
+
# make TSV
|
140
132
|
data.extend TSV unless TSV === data
|
141
133
|
data.unnamed = true
|
142
134
|
|
135
|
+
# choose serializer
|
143
136
|
if data.serializer == :type
|
144
137
|
data.serializer = case
|
145
138
|
when parser.cast.nil?
|
@@ -155,59 +148,11 @@ module TSV
|
|
155
148
|
end
|
156
149
|
end
|
157
150
|
|
158
|
-
|
159
|
-
|
160
|
-
when stream.respond_to?(:size)
|
161
|
-
stream.size
|
162
|
-
else
|
163
|
-
stream.stat.size
|
164
|
-
end
|
165
|
-
desc = "Parsing Stream"
|
166
|
-
step = 100
|
167
|
-
if Hash === monitor
|
168
|
-
desc = monitor[:desc] if monitor.include? :desc
|
169
|
-
step = monitor[:step] if monitor.include? :step
|
170
|
-
end
|
171
|
-
progress_monitor = Progress::Bar.new(size, 0, step, desc)
|
172
|
-
else
|
173
|
-
progress_monitor = nil
|
174
|
-
end
|
175
|
-
|
176
|
-
line_num = 1
|
177
|
-
begin
|
178
|
-
while not line.nil?
|
179
|
-
begin
|
180
|
-
progress_monitor.tick(stream.pos) if progress_monitor
|
181
|
-
|
182
|
-
raise Parser::SKIP_LINE if line.empty?
|
183
|
-
|
184
|
-
line = Misc.fixutf8(line)
|
185
|
-
line = parser.process line
|
186
|
-
parts = parser.chop_line line
|
187
|
-
key, values = parser.get_values parts
|
188
|
-
values = parser.cast_values values if parser.cast?
|
189
|
-
parser.add_to_data data, key, values
|
190
|
-
line = stream.gets
|
191
|
-
line_num += 1
|
192
|
-
raise Parser::END_PARSING if head and line_num > head.to_i
|
193
|
-
rescue Parser::SKIP_LINE
|
194
|
-
begin
|
195
|
-
line = stream.gets
|
196
|
-
next
|
197
|
-
rescue IOError
|
198
|
-
break
|
199
|
-
end
|
200
|
-
rescue Parser::END_PARSING
|
201
|
-
break
|
202
|
-
rescue IOError
|
203
|
-
Log.exception $!
|
204
|
-
break
|
205
|
-
end
|
206
|
-
end
|
207
|
-
ensure
|
208
|
-
stream.close unless stream.closed?
|
151
|
+
parser.traverse(options) do |key,values|
|
152
|
+
parser.add_to_data data, key, values
|
209
153
|
end
|
210
154
|
|
155
|
+
# setup the TSV
|
211
156
|
parser.setup data
|
212
157
|
|
213
158
|
data.unnamed = false
|
data/lib/rbbt/tsv/change_id.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rbbt/tsv'
|
2
2
|
|
3
3
|
module TSV
|
4
|
-
def self.change_key(tsv, format, options = {})
|
4
|
+
def self.change_key(tsv, format, options = {}, &block)
|
5
5
|
options = Misc.add_defaults options, :persist => false, :identifiers => tsv.identifiers
|
6
6
|
|
7
7
|
identifiers, persist_input = Misc.process_options options, :identifiers, :persist_input
|
@@ -21,18 +21,20 @@ module TSV
|
|
21
21
|
|
22
22
|
tsv = tsv.to_flat if orig_type == :flat
|
23
23
|
|
24
|
+
tsv = tsv.to_list(&block) if orig_type == :list
|
25
|
+
|
24
26
|
tsv
|
25
27
|
else
|
26
28
|
tsv.reorder(format)
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
30
|
-
def change_key(format, options = {})
|
32
|
+
def change_key(format, options = {}, &block)
|
31
33
|
options = Misc.add_defaults options, :identifiers => self.identifiers
|
32
|
-
TSV.change_key(self, format, options)
|
34
|
+
TSV.change_key(self, format, options, &block)
|
33
35
|
end
|
34
36
|
|
35
|
-
def self.swap_id(tsv, field, format, options = {})
|
37
|
+
def self.swap_id(tsv, field, format, options = {}, &block)
|
36
38
|
options = Misc.add_defaults options, :persist => false, :identifiers => tsv.identifiers
|
37
39
|
|
38
40
|
identifiers, persist_input = Misc.process_options options, :identifiers, :persist
|
@@ -62,6 +64,8 @@ module TSV
|
|
62
64
|
|
63
65
|
tsv = tsv.to_flat if orig_type == :flat
|
64
66
|
|
67
|
+
tsv = tsv.to_list(&block) if orig_type == :list
|
68
|
+
|
65
69
|
tsv
|
66
70
|
end
|
67
71
|
|
data/lib/rbbt/tsv/parser.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rbbt/util/cmd'
|
2
2
|
module TSV
|
3
3
|
class Parser
|
4
|
-
attr_accessor :header_hash, :sep, :sep2, :type, :key_position, :field_positions, :cast, :key_field, :fields, :fix, :select, :serializer, :straight, :take_all, :zipped, :namespace, :first_line
|
4
|
+
attr_accessor :stream, :header_hash, :sep, :sep2, :type, :key_position, :field_positions, :cast, :key_field, :fields, :fix, :select, :serializer, :straight, :take_all, :zipped, :namespace, :first_line, :stream
|
5
5
|
|
6
6
|
class SKIP_LINE < Exception; end
|
7
7
|
class END_PARSING < Exception; end
|
@@ -52,9 +52,9 @@ module TSV
|
|
52
52
|
|
53
53
|
def process(line)
|
54
54
|
l = line.chomp
|
55
|
-
raise
|
55
|
+
raise SKIP_LINE if l[0] == "#"[0] or (Proc === @select and not @select.call l)
|
56
56
|
l = @fix.call l if Proc === @fix
|
57
|
-
raise
|
57
|
+
raise END_PARSING unless l
|
58
58
|
l
|
59
59
|
end
|
60
60
|
|
@@ -123,46 +123,66 @@ module TSV
|
|
123
123
|
def get_values_flat(parts)
|
124
124
|
if key_position and key_position != 0 and field_positions.nil?
|
125
125
|
value = parts.shift
|
126
|
-
keys = parts
|
126
|
+
keys = parts.dup
|
127
127
|
return [keys, [value]]
|
128
128
|
end
|
129
129
|
|
130
|
-
return parts.shift.split(@sep2, -1), parts.collect{|value| value.split(@sep2, -1)} if
|
130
|
+
return parts.shift.split(@sep2, -1).first, parts.collect{|value| value.split(@sep2, -1)}.flatten if
|
131
131
|
field_positions.nil? and (key_position.nil? or key_position == 0)
|
132
132
|
|
133
133
|
keys = parts[key_position].split(@sep2, -1)
|
134
134
|
|
135
135
|
if @take_all
|
136
|
-
values = parts.collect{|
|
136
|
+
values = parts.collect{|e| e.split(@sep2, -1) }.flatten
|
137
137
|
else
|
138
|
+
if field_positions.nil?
|
139
|
+
parts.delete_at key_position
|
140
|
+
values = parts.first
|
141
|
+
else
|
142
|
+
values = parts[field_positions.first]
|
143
|
+
end
|
138
144
|
|
139
|
-
values =
|
140
|
-
parts.tap{|o| o.delete_at key_position}
|
141
|
-
else
|
142
|
-
parts.values_at *field_positions
|
143
|
-
end.collect{|value| value.split(@sep2, -1)}
|
145
|
+
values = values.split(@sep2, -1)
|
144
146
|
end
|
145
|
-
|
147
|
+
|
148
|
+
[keys.first, values]
|
146
149
|
end
|
147
150
|
|
148
151
|
def add_to_data_no_merge_list(data, key, values)
|
149
152
|
data[key] = values unless data.include? key
|
153
|
+
nil
|
150
154
|
end
|
151
155
|
|
152
|
-
def
|
156
|
+
def add_to_data_flat_keys(data, keys, values)
|
153
157
|
keys.each do |key|
|
154
|
-
data[key] = values
|
158
|
+
data[key] = values unless data.include? key
|
155
159
|
end
|
160
|
+
nil
|
161
|
+
end
|
162
|
+
|
163
|
+
def add_to_data_flat(data, key, values)
|
164
|
+
data[key] = values unless data.include? key
|
165
|
+
nil
|
156
166
|
end
|
157
167
|
|
158
|
-
def add_to_data_flat_merge(data,
|
168
|
+
def add_to_data_flat_merge(data, key, values)
|
169
|
+
if data.include? key
|
170
|
+
data[key] = data[key].concat values
|
171
|
+
else
|
172
|
+
data[key] = values
|
173
|
+
end
|
174
|
+
nil
|
175
|
+
end
|
176
|
+
|
177
|
+
def add_to_data_flat_merge_keys(data, keys, values)
|
159
178
|
keys.each do |key|
|
160
179
|
if data.include? key
|
161
|
-
data[key] = data[key].concat values
|
180
|
+
data[key] = data[key].concat values
|
162
181
|
else
|
163
|
-
data[key] = values.
|
182
|
+
data[key] = values.dup
|
164
183
|
end
|
165
184
|
end
|
185
|
+
nil
|
166
186
|
end
|
167
187
|
|
168
188
|
def add_to_data_no_merge_double(data, keys, values)
|
@@ -170,6 +190,7 @@ module TSV
|
|
170
190
|
next if data.include? key
|
171
191
|
data[key] = values
|
172
192
|
end
|
193
|
+
nil
|
173
194
|
end
|
174
195
|
|
175
196
|
def add_to_data_merge(data, keys, values)
|
@@ -184,6 +205,7 @@ module TSV
|
|
184
205
|
data[key] = values
|
185
206
|
end
|
186
207
|
end
|
208
|
+
nil
|
187
209
|
end
|
188
210
|
|
189
211
|
def add_to_data_merge_zipped(data, keys, values)
|
@@ -207,6 +229,7 @@ module TSV
|
|
207
229
|
data[key] = values.collect{|v| [v]}
|
208
230
|
end
|
209
231
|
end
|
232
|
+
nil
|
210
233
|
end
|
211
234
|
|
212
235
|
def add_to_data_zipped(data, keys, values)
|
@@ -224,6 +247,7 @@ module TSV
|
|
224
247
|
next if data.include? key
|
225
248
|
data[key] = values.collect{|v| [v]}
|
226
249
|
end
|
250
|
+
nil
|
227
251
|
end
|
228
252
|
|
229
253
|
|
@@ -317,6 +341,7 @@ module TSV
|
|
317
341
|
def initialize(stream = nil, options = {})
|
318
342
|
@header_hash = Misc.process_options(options, :header_hash) || "#"
|
319
343
|
@sep = Misc.process_options(options, :sep) || "\t"
|
344
|
+
@stream = stream
|
320
345
|
|
321
346
|
header_options = parse_header(stream)
|
322
347
|
options = header_options.merge options
|
@@ -334,6 +359,9 @@ module TSV
|
|
334
359
|
merge = @zipped if merge.nil?
|
335
360
|
merge = false if merge.nil?
|
336
361
|
|
362
|
+
fields = options[:fields]
|
363
|
+
fix_fields(options)
|
364
|
+
|
337
365
|
case @type
|
338
366
|
when :double
|
339
367
|
self.instance_eval do alias get_values get_values_double end
|
@@ -363,18 +391,24 @@ module TSV
|
|
363
391
|
self.instance_eval do alias cast_values cast_values_list end
|
364
392
|
self.instance_eval do alias add_to_data add_to_data_no_merge_list end
|
365
393
|
when :flat
|
366
|
-
@take_all = true if
|
394
|
+
@take_all = true if field_positions.nil?
|
367
395
|
self.instance_eval do alias get_values get_values_flat end
|
368
396
|
self.instance_eval do alias cast_values cast_values_double end
|
369
397
|
if merge
|
370
|
-
|
398
|
+
if key_position and key_position != 0 and field_positions.nil?
|
399
|
+
self.instance_eval do alias add_to_data add_to_data_flat_merge_keys end
|
400
|
+
else
|
401
|
+
self.instance_eval do alias add_to_data add_to_data_flat_merge end
|
402
|
+
end
|
371
403
|
else
|
372
|
-
|
404
|
+
if key_position and key_position != 0 and field_positions.nil?
|
405
|
+
self.instance_eval do alias add_to_data add_to_data_flat_keys end
|
406
|
+
else
|
407
|
+
self.instance_eval do alias add_to_data add_to_data_flat end
|
408
|
+
end
|
373
409
|
end
|
374
410
|
end
|
375
411
|
|
376
|
-
fields = options[:fields]
|
377
|
-
fix_fields(options)
|
378
412
|
|
379
413
|
@straight = false if @sep != "\t" or not @cast.nil? or merge or (@type == :flat and fields)
|
380
414
|
end
|
@@ -388,5 +422,87 @@ module TSV
|
|
388
422
|
data.cast = @cast if Symbol === @cast
|
389
423
|
data
|
390
424
|
end
|
425
|
+
|
426
|
+
def traverse(options = {})
|
427
|
+
monitor, grep, invert_grep, head = Misc.process_options options, :monitor, :grep, :invert_grep, :head
|
428
|
+
raise "No block given in TSV::Parser#traverse" unless block_given?
|
429
|
+
|
430
|
+
stream = @stream
|
431
|
+
# get parser
|
432
|
+
|
433
|
+
# grep
|
434
|
+
if grep
|
435
|
+
stream.rewind
|
436
|
+
stream = Open.grep(stream, grep, invert_grep)
|
437
|
+
self.first_line = stream.gets
|
438
|
+
end
|
439
|
+
|
440
|
+
# first line
|
441
|
+
line = self.rescue_first_line
|
442
|
+
|
443
|
+
# setup monitor
|
444
|
+
if monitor and (stream.respond_to?(:size) or (stream.respond_to?(:stat) and stream.stat.respond_to? :size)) and stream.respond_to?(:pos)
|
445
|
+
size = case
|
446
|
+
when stream.respond_to?(:size)
|
447
|
+
stream.size
|
448
|
+
else
|
449
|
+
stream.stat.size
|
450
|
+
end
|
451
|
+
desc = "Parsing Stream"
|
452
|
+
step = 100
|
453
|
+
if Hash === monitor
|
454
|
+
desc = monitor[:desc] if monitor.include? :desc
|
455
|
+
step = monitor[:step] if monitor.include? :step
|
456
|
+
end
|
457
|
+
progress_monitor = Progress::Bar.new(size, 0, step, desc)
|
458
|
+
else
|
459
|
+
progress_monitor = nil
|
460
|
+
end
|
461
|
+
|
462
|
+
# parser
|
463
|
+
line_num = 1
|
464
|
+
begin
|
465
|
+
while not line.nil?
|
466
|
+
begin
|
467
|
+
progress_monitor.tick(stream.pos) if progress_monitor
|
468
|
+
|
469
|
+
raise SKIP_LINE if line.empty?
|
470
|
+
|
471
|
+
line = Misc.fixutf8(line)
|
472
|
+
line = self.process line
|
473
|
+
parts = self.chop_line line
|
474
|
+
key, values = self.get_values parts
|
475
|
+
values = self.cast_values values if self.cast?
|
476
|
+
|
477
|
+
yield key, values, self
|
478
|
+
|
479
|
+
line = stream.gets
|
480
|
+
line_num += 1
|
481
|
+
raise END_PARSING if head and line_num > head.to_i
|
482
|
+
rescue SKIP_LINE
|
483
|
+
begin
|
484
|
+
line = stream.gets
|
485
|
+
next
|
486
|
+
rescue IOError
|
487
|
+
break
|
488
|
+
end
|
489
|
+
rescue END_PARSING
|
490
|
+
break
|
491
|
+
rescue IOError
|
492
|
+
Log.exception $!
|
493
|
+
break
|
494
|
+
end
|
495
|
+
end
|
496
|
+
ensure
|
497
|
+
stream.close unless stream.closed?
|
498
|
+
end
|
499
|
+
|
500
|
+
self
|
501
|
+
end
|
502
|
+
|
503
|
+
def self.traverse(stream, options = {}, &block)
|
504
|
+
parser = Parser.new(stream, options)
|
505
|
+
parser.traverse(options, &block)
|
506
|
+
end
|
391
507
|
end
|
392
508
|
end
|
data/lib/rbbt/util/log.rb
CHANGED
@@ -31,10 +31,11 @@ module Log
|
|
31
31
|
return str || "" if nocolor
|
32
32
|
color = SEVERITY_COLOR[severity] if Fixnum === severity
|
33
33
|
color = Term::ANSIColor.send(severity) if Symbol === severity and Term::ANSIColor.respond_to? severity
|
34
|
+
color ||= ""
|
34
35
|
if str.nil?
|
35
36
|
color
|
36
37
|
else
|
37
|
-
color + str + color(0)
|
38
|
+
color + str + self.color(0)
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
@@ -94,29 +94,40 @@ class Step
|
|
94
94
|
set_info(:messages, (messages || []) << message)
|
95
95
|
end
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
97
|
+
def self.log(status, message, path, &block)
|
98
|
+
if block_given?
|
99
|
+
start = Time.now
|
100
|
+
Log.medium do
|
101
|
+
now = Time.now
|
102
|
+
str = "#{ Log.color :cyan, status.to_s }"
|
103
|
+
str << ": #{ message }" if message
|
104
|
+
str << " -- #{Log.color :blue, path.to_s}" if path
|
105
|
+
str
|
106
|
+
end
|
107
|
+
res = yield
|
108
|
+
eend = Time.now
|
104
109
|
Log.medium do
|
105
110
|
now = Time.now
|
106
|
-
str = "
|
107
|
-
|
111
|
+
str = "#{ Log.color :cyan, status.to_s } +#{Log.color :green, "%.1g" % (eend - start)}"
|
112
|
+
str << " -- #{Log.color :blue, path.to_s}" if path
|
108
113
|
str
|
109
114
|
end
|
110
|
-
|
111
|
-
|
115
|
+
res
|
116
|
+
else
|
117
|
+
Log.medium do
|
112
118
|
now = Time.now
|
113
|
-
str = "
|
114
|
-
|
119
|
+
str = "#{ Log.color :cyan, status.to_s }"
|
120
|
+
str << ": #{ message }" if message
|
121
|
+
str << " -- #{Log.color :blue, path.to_s}" if path
|
115
122
|
str
|
116
123
|
end
|
117
124
|
end
|
118
125
|
end
|
119
126
|
|
127
|
+
def log(status, message = nil, &block)
|
128
|
+
Step.log(status, message, path, &block)
|
129
|
+
end
|
130
|
+
|
120
131
|
def started?
|
121
132
|
Open.exists? info_file
|
122
133
|
end
|
@@ -225,27 +236,8 @@ end
|
|
225
236
|
|
226
237
|
module Workflow
|
227
238
|
|
228
|
-
|
229
|
-
|
230
|
-
@@last_log ||= Time.now
|
231
|
-
end
|
232
|
-
|
233
|
-
def log(status, message = nil)
|
234
|
-
if message
|
235
|
-
Log.medium do
|
236
|
-
now = Time.now
|
237
|
-
str = "+#{(now - last_log).to_i} #{ Log.color :cyan, status.to_s }: #{ message }"
|
238
|
-
@@last_log = now
|
239
|
-
str
|
240
|
-
end
|
241
|
-
else
|
242
|
-
Log.medium do
|
243
|
-
now = Time.now
|
244
|
-
str = "+#{(now - last_log).to_i} #{ Log.color :cyan, status.to_s }"
|
245
|
-
@@last_log = now
|
246
|
-
str
|
247
|
-
end
|
248
|
-
end
|
239
|
+
def log(status, message = nil, &block)
|
240
|
+
Step.log(status, message, nil, &block)
|
249
241
|
end
|
250
242
|
|
251
243
|
def task_info(name)
|
data/lib/rbbt/workflow/step.rb
CHANGED
@@ -41,9 +41,9 @@ class Step
|
|
41
41
|
class << self
|
42
42
|
attr_accessor :relay_step
|
43
43
|
alias original_log log
|
44
|
-
def log(status, message = nil
|
45
|
-
original_log(status, message
|
46
|
-
relay_step.log([task.name.to_s, status.to_s] * ">", message.nil? ? nil : [task.name.to_s, message] * ">"
|
44
|
+
def log(status, message = nil)
|
45
|
+
original_log(status, message)
|
46
|
+
relay_step.log([task.name.to_s, status.to_s] * ">", message.nil? ? nil : [task.name.to_s, message] * ">")
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -117,6 +117,7 @@ class Step
|
|
117
117
|
log(:error, "Exception processing dependency #{dependency.path}")
|
118
118
|
log(:error, "#{$!.class}: #{$!.message}")
|
119
119
|
log(:error, "backtrace: #{$!.backtrace.first}")
|
120
|
+
Log.exception $!
|
120
121
|
raise "Exception processing dependency #{dependency.path}"
|
121
122
|
end
|
122
123
|
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rbbt'
|
4
|
+
require 'rbbt/util/simpleopt'
|
5
|
+
|
6
|
+
require 'rbbt/util/R'
|
7
|
+
|
8
|
+
$0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
|
9
|
+
|
10
|
+
options = SOPT.setup <<EOF
|
11
|
+
Take absolute value
|
12
|
+
|
13
|
+
$ rbbt stat density <file>
|
14
|
+
|
15
|
+
Display summary information. Works with Tokyocabinet HDB and DBD as well.
|
16
|
+
|
17
|
+
-tch--tokyocabinet File is a TC HDB
|
18
|
+
-tcb--tokyocabinet_bd File is a TC BDB
|
19
|
+
-t--type* Type of tsv (single, list, double, flat)
|
20
|
+
-h--header_hash* Change the character used to mark the header line (defaults to #)
|
21
|
+
-f--field Field to change
|
22
|
+
-h--help Help
|
23
|
+
EOF
|
24
|
+
|
25
|
+
SOPT.usage if options[:help]
|
26
|
+
|
27
|
+
file = ARGV.shift
|
28
|
+
|
29
|
+
if file == '-' or file.nil?
|
30
|
+
file = STDIN
|
31
|
+
else
|
32
|
+
file = Open.open file
|
33
|
+
end
|
34
|
+
|
35
|
+
parser = TSV::Parser.new file, options
|
36
|
+
|
37
|
+
options[:fields] = [options.delete(:field) || 0]
|
38
|
+
puts TSV.header_lines(parser.key_field, parser.fields)
|
39
|
+
parser.traverse(options.merge(:type => :list)) do |k,v|
|
40
|
+
v = v.first
|
41
|
+
v = Array === v ? v.collect{|e| e.to_f.abs } : [v.to_f.abs]
|
42
|
+
puts [k,v].flatten * "\t"
|
43
|
+
end
|
@@ -16,10 +16,6 @@ Display summary information. Works with Tokyocabinet HDB and DBD as well.
|
|
16
16
|
|
17
17
|
-tch--tokyocabinet File is a TC HDB
|
18
18
|
-tcb--tokyocabinet_bd File is a TC BDB
|
19
|
-
-t--type* Type of tsv (single, list, double, flat)
|
20
|
-
-h--header_hash* Change the character used to mark the header line (defaults to #)
|
21
|
-
-k--key_field* Change the key field
|
22
|
-
-f--fields* Change the fields to load
|
23
19
|
-h--help Help
|
24
20
|
EOF
|
25
21
|
|
@@ -33,7 +29,6 @@ else
|
|
33
29
|
file = Open.open file
|
34
30
|
end
|
35
31
|
|
36
|
-
|
37
32
|
values = file.read.split("\n").collect{|v| v.to_f}
|
38
33
|
|
39
34
|
res = TmpFile.with_file do |tmp|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rbbt'
|
4
|
+
require 'rbbt/util/simpleopt'
|
5
|
+
|
6
|
+
require 'rbbt/util/R'
|
7
|
+
|
8
|
+
$0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
|
9
|
+
|
10
|
+
options = SOPT.setup <<EOF
|
11
|
+
Take logs
|
12
|
+
|
13
|
+
$ rbbt stat density <file>
|
14
|
+
|
15
|
+
Display summary information. Works with Tokyocabinet HDB and DBD as well.
|
16
|
+
|
17
|
+
-tch--tokyocabinet File is a TC HDB
|
18
|
+
-tcb--tokyocabinet_bd File is a TC BDB
|
19
|
+
-t--type* Type of tsv (single, list, double, flat)
|
20
|
+
-h--header_hash* Change the character used to mark the header line (defaults to #)
|
21
|
+
-f--field Field to change
|
22
|
+
-h--help Help
|
23
|
+
EOF
|
24
|
+
|
25
|
+
SOPT.usage if options[:help]
|
26
|
+
|
27
|
+
file = ARGV.shift
|
28
|
+
|
29
|
+
if file == '-' or file.nil?
|
30
|
+
file = STDIN
|
31
|
+
else
|
32
|
+
file = Open.open file
|
33
|
+
end
|
34
|
+
|
35
|
+
parser = TSV::Parser.new file, options
|
36
|
+
|
37
|
+
options[:fields] = [options.delete(:field) || 0]
|
38
|
+
puts TSV.header_lines(parser.key_field, parser.fields)
|
39
|
+
parser.traverse(options.merge(:type => :list)) do |k,v|
|
40
|
+
v = v.first
|
41
|
+
v = Array === v ? v.collect{|e| Math.log(e.to_f) } : [Math.log(v.to_f)]
|
42
|
+
puts [k,v].flatten * "\t"
|
43
|
+
end
|
data/test/rbbt/test_tsv.rb
CHANGED
@@ -54,21 +54,6 @@ row2 A B Id3
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
def test_headerless_fields
|
58
|
-
content =<<-EOF
|
59
|
-
#Id ValueA ValueB OtherID
|
60
|
-
row1 a|aa|aaa b Id1|Id2
|
61
|
-
row2 A B Id3
|
62
|
-
EOF
|
63
|
-
|
64
|
-
TmpFile.with_file(content) do |filename|
|
65
|
-
tsv = TSV.open(filename, :sep => /\s+/, :fields => 1)
|
66
|
-
assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
|
67
|
-
assert_equal :double, tsv.type
|
68
|
-
assert_equal [%w(a aa aaa)], tsv["row1"]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
57
|
def test_headerless_fields
|
73
58
|
content =<<-EOF
|
74
59
|
row1 a|aa|aaa b Id1|Id2
|
@@ -33,10 +33,17 @@ aa xx
|
|
33
33
|
def setup
|
34
34
|
@f1 = tsv(FILE1)
|
35
35
|
@f2 = tsv(FILE2)
|
36
|
+
@f3 = tsv(FILE2, :key_field => "Y")
|
36
37
|
@id = tsv(IDENTIFIERS)
|
37
38
|
end
|
38
39
|
|
39
|
-
def
|
40
|
+
def test_swap_id
|
41
|
+
@f3.identifiers = @id
|
42
|
+
assert_equal "a", @f3.swap_id("X","A")["y"]["A"]
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def test_change_key
|
40
47
|
@f1.identifiers = @id
|
41
48
|
assert @f1.change_key("X").include? "x"
|
42
49
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'test_helper.rb'))
|
2
|
+
require 'rbbt/tsv'
|
3
|
+
|
4
|
+
class TestTSVParser < Test::Unit::TestCase
|
5
|
+
def test_traverse
|
6
|
+
|
7
|
+
content =<<-EOF
|
8
|
+
row1 a|aa|aaa b Id1|Id2
|
9
|
+
EOF
|
10
|
+
|
11
|
+
TmpFile.with_file(content) do |filename|
|
12
|
+
TSV::Parser.traverse(Open.open(filename), :sep => /\s+/, :fields => [1], :type => :double) do |k,v|
|
13
|
+
assert_equal ["row1"], k
|
14
|
+
assert_equal [%w(a aa aaa)], v
|
15
|
+
end
|
16
|
+
|
17
|
+
TSV::Parser.traverse(Open.open(filename), :sep => /\s+/, :fields => [1], :type => :list) do |k,v|
|
18
|
+
assert_equal "row1", k
|
19
|
+
assert_equal ["a|aa|aaa"], v
|
20
|
+
end
|
21
|
+
|
22
|
+
TSV::Parser.traverse(Open.open(filename), :sep => /\s+/, :fields => [1], :type => :single) do |k,v|
|
23
|
+
assert_equal "row1", k
|
24
|
+
assert_equal "a|aa|aaa", v
|
25
|
+
end
|
26
|
+
|
27
|
+
TSV::Parser.traverse(Open.open(filename), :sep => /\s+/, :fields => [1], :type => :flat) do |k,v|
|
28
|
+
assert_equal "row1", k
|
29
|
+
assert_equal %w(a aa aaa), v
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.8.
|
4
|
+
version: 5.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -200,6 +200,7 @@ files:
|
|
200
200
|
- share/rbbt_commands/app/start
|
201
201
|
- share/rbbt_commands/app/template
|
202
202
|
- share/rbbt_commands/benchmark/pthrough
|
203
|
+
- share/rbbt_commands/benchmark/tsv
|
203
204
|
- share/rbbt_commands/color
|
204
205
|
- share/rbbt_commands/conf/web_user/add
|
205
206
|
- share/rbbt_commands/conf/web_user/list
|
@@ -211,7 +212,9 @@ files:
|
|
211
212
|
- share/rbbt_commands/resource/find
|
212
213
|
- share/rbbt_commands/resource/get
|
213
214
|
- share/rbbt_commands/resource/produce
|
215
|
+
- share/rbbt_commands/stat/abs
|
214
216
|
- share/rbbt_commands/stat/density
|
217
|
+
- share/rbbt_commands/stat/log
|
215
218
|
- share/rbbt_commands/study/task
|
216
219
|
- share/rbbt_commands/system/purge
|
217
220
|
- share/rbbt_commands/system/report
|
@@ -264,6 +267,7 @@ files:
|
|
264
267
|
- test/rbbt/tsv/test_index.rb
|
265
268
|
- test/rbbt/tsv/test_manipulate.rb
|
266
269
|
- test/rbbt/tsv/test_parallel.rb
|
270
|
+
- test/rbbt/tsv/test_parser.rb
|
267
271
|
- test/rbbt/tsv/test_util.rb
|
268
272
|
- test/rbbt/util/concurrency/processes/test_socket.rb
|
269
273
|
- test/rbbt/util/concurrency/test_processes.rb
|
@@ -357,6 +361,7 @@ test_files:
|
|
357
361
|
- test/rbbt/tsv/test_parallel.rb
|
358
362
|
- test/rbbt/tsv/test_index.rb
|
359
363
|
- test/rbbt/tsv/test_change_id.rb
|
364
|
+
- test/rbbt/tsv/test_parser.rb
|
360
365
|
- test/rbbt/tsv/test_util.rb
|
361
366
|
- test/rbbt/tsv/test_accessor.rb
|
362
367
|
- test/rbbt/tsv/test_filter.rb
|