rbbt-util 5.8.0 → 5.8.1
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/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
|