rbbt-util 5.4.1 → 5.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/bin/rbbt_monitor.rb +8 -4
- data/lib/rbbt.rb +4 -11
- data/lib/rbbt/annotations.rb +4 -1
- data/lib/rbbt/association.rb +218 -157
- data/lib/rbbt/association/index.rb +92 -0
- data/lib/rbbt/association/item.rb +44 -0
- data/lib/rbbt/entity.rb +4 -0
- data/lib/rbbt/fix_width_table.rb +14 -9
- data/lib/rbbt/knowledge_base.rb +269 -0
- data/lib/rbbt/persist.rb +1 -1
- data/lib/rbbt/persist/tsv.rb +22 -2
- data/lib/rbbt/resource.rb +0 -1
- data/lib/rbbt/resource/path.rb +1 -1
- data/lib/rbbt/resource/util.rb +0 -1
- data/lib/rbbt/tsv.rb +15 -14
- data/lib/rbbt/tsv/accessor.rb +21 -16
- data/lib/rbbt/tsv/attach.rb +5 -5
- data/lib/rbbt/tsv/attach/util.rb +4 -2
- data/lib/rbbt/tsv/change_id.rb +67 -0
- data/lib/rbbt/tsv/index.rb +5 -3
- data/lib/rbbt/tsv/manipulate.rb +83 -37
- data/lib/rbbt/tsv/parser.rb +2 -1
- data/lib/rbbt/tsv/util.rb +2 -0
- data/lib/rbbt/util/cmd.rb +1 -2
- data/lib/rbbt/util/log.rb +42 -38
- data/lib/rbbt/util/misc.rb +134 -46
- data/lib/rbbt/util/open.rb +3 -17
- data/lib/rbbt/util/semaphore.rb +8 -2
- data/lib/rbbt/workflow.rb +31 -46
- data/lib/rbbt/workflow/accessor.rb +1 -1
- data/lib/rbbt/workflow/step.rb +5 -3
- data/share/rbbt_commands/workflow/server +1 -0
- data/share/rbbt_commands/workflow/task +12 -2
- data/test/rbbt/association/test_index.rb +36 -0
- data/test/rbbt/test_annotations.rb +5 -4
- data/test/rbbt/test_association.rb +40 -13
- data/test/rbbt/test_knowledge_base.rb +103 -0
- data/test/rbbt/test_workflow.rb +4 -2
- data/test/rbbt/tsv/test_change_id.rb +43 -0
- data/test/rbbt/tsv/test_index.rb +2 -1
- data/test/rbbt/tsv/test_manipulate.rb +51 -0
- data/test/rbbt/util/test_misc.rb +21 -1
- data/test/test_helper.rb +8 -4
- metadata +12 -86
data/lib/rbbt/tsv/parser.rb
CHANGED
@@ -18,6 +18,7 @@ module TSV
|
|
18
18
|
|
19
19
|
line = stream.gets
|
20
20
|
raise "Empty content" if line.nil?
|
21
|
+
line = Misc.fixutf8 line
|
21
22
|
line.chomp!
|
22
23
|
|
23
24
|
# Process options line
|
@@ -33,7 +34,7 @@ module TSV
|
|
33
34
|
|
34
35
|
# Process fields line
|
35
36
|
|
36
|
-
if line and line =~ /^#{@header_hash}/
|
37
|
+
if line and Misc.fixutf8(line) =~ /^#{@header_hash}/
|
37
38
|
line.chomp!
|
38
39
|
@fields = line.split(@sep)
|
39
40
|
@key_field = @fields.shift
|
data/lib/rbbt/tsv/util.rb
CHANGED
@@ -69,6 +69,8 @@ module TSV
|
|
69
69
|
pos ||= :key if key_field == field
|
70
70
|
Log.medium "Field #{ field } was not found. Options: #{fields * ", "}" if pos.nil?
|
71
71
|
pos
|
72
|
+
when key_field == field
|
73
|
+
:key
|
72
74
|
else
|
73
75
|
raise "No fields specified in TSV.identify_field" if fields.nil?
|
74
76
|
Log.medium "Field #{ field } was not found. Options: (#{key_field}), #{fields * ", "}"
|
data/lib/rbbt/util/cmd.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'rbbt/util/misc'
|
2
1
|
require 'rbbt/util/log'
|
3
2
|
require 'stringio'
|
4
3
|
|
@@ -99,7 +98,7 @@ module CMD
|
|
99
98
|
end
|
100
99
|
|
101
100
|
def self.cmd(cmd, options = {}, &block)
|
102
|
-
options
|
101
|
+
options[:stderr] ||= Log::DEBUG
|
103
102
|
in_content = options.delete(:in)
|
104
103
|
stderr = options.delete(:stderr)
|
105
104
|
pipe = options.delete(:pipe)
|
data/lib/rbbt/util/log.rb
CHANGED
@@ -17,54 +17,48 @@ module Log
|
|
17
17
|
@logfile = nil
|
18
18
|
end
|
19
19
|
|
20
|
-
#def self.severity=(severity)
|
21
|
-
# @severity = severity
|
22
|
-
#end
|
23
|
-
|
24
|
-
#def self.severity
|
25
|
-
# @severity
|
26
|
-
#end
|
27
|
-
|
28
20
|
SEVERITY_COLOR = ["0;37m", "0;32m", "0;33m", "0;31m","0;37m", "0;32m", "0;33m"].collect{|e| "\033[#{e}"}
|
29
21
|
|
30
|
-
def self.log(message, severity = MEDIUM)
|
31
|
-
message ||=
|
22
|
+
def self.log(message = nil, severity = MEDIUM, &block)
|
23
|
+
message ||= block
|
32
24
|
severity_color = SEVERITY_COLOR[severity]
|
33
25
|
font_color = {false => "\033[0;37m", true => "\033[0m"}[severity >= INFO]
|
34
26
|
|
35
|
-
if severity
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
27
|
+
return if severity < self.severity
|
28
|
+
message = message.call if Proc === message
|
29
|
+
return if message.nil? or message.empty?
|
30
|
+
|
31
|
+
str = "\033[0;37m#{Time.now.strftime("[%m/%d/%y-%H:%M:%S]")}#{severity_color}[#{severity.to_s}]\033[0m:#{font_color} " << message.strip << "\033[0m"
|
32
|
+
STDERR.puts str
|
33
|
+
logfile.puts str unless logfile.nil?
|
40
34
|
end
|
41
35
|
|
42
|
-
def self.debug(message)
|
43
|
-
log(message, DEBUG)
|
36
|
+
def self.debug(message = nil, &block)
|
37
|
+
log(message, DEBUG, &block)
|
44
38
|
end
|
45
39
|
|
46
|
-
def self.low(message)
|
47
|
-
log(message, LOW)
|
40
|
+
def self.low(message = nil, &block)
|
41
|
+
log(message, LOW, &block)
|
48
42
|
end
|
49
43
|
|
50
|
-
def self.medium(message)
|
51
|
-
log(message, MEDIUM)
|
44
|
+
def self.medium(message = nil, &block)
|
45
|
+
log(message, MEDIUM, &block)
|
52
46
|
end
|
53
47
|
|
54
|
-
def self.high(message)
|
55
|
-
log(message, HIGH)
|
48
|
+
def self.high(message = nil, &block)
|
49
|
+
log(message, HIGH, &block)
|
56
50
|
end
|
57
51
|
|
58
|
-
def self.info(message)
|
59
|
-
log(message, INFO)
|
52
|
+
def self.info(message = nil, &block)
|
53
|
+
log(message, INFO, &block)
|
60
54
|
end
|
61
55
|
|
62
|
-
def self.warn(message)
|
63
|
-
log(message, WARN)
|
56
|
+
def self.warn(message = nil, &block)
|
57
|
+
log(message, WARN, &block)
|
64
58
|
end
|
65
59
|
|
66
|
-
def self.error(message)
|
67
|
-
log(message, ERROR)
|
60
|
+
def self.error(message = nil, &block)
|
61
|
+
log(message, ERROR, &block)
|
68
62
|
end
|
69
63
|
|
70
64
|
|
@@ -84,16 +78,26 @@ module Log
|
|
84
78
|
end
|
85
79
|
end
|
86
80
|
|
87
|
-
def ddd(message, file = $stdout)
|
88
|
-
Log.debug "DEVEL: " << caller.first
|
89
|
-
Log.debug ""
|
90
|
-
Log.debug "=> " << message.inspect
|
91
|
-
Log.debug ""
|
92
|
-
end
|
93
|
-
|
94
81
|
def ppp(message)
|
95
|
-
|
82
|
+
stack = caller
|
83
|
+
puts "#{Log::SEVERITY_COLOR[1]}PRINT:#{Log::SEVERITY_COLOR[0]} " << stack.first
|
96
84
|
puts ""
|
97
|
-
puts "=> " << message
|
85
|
+
puts "=> " << message
|
98
86
|
puts ""
|
99
87
|
end
|
88
|
+
|
89
|
+
def ddd(message, file = $stdout)
|
90
|
+
stack = caller
|
91
|
+
Log.debug{"#{Log::SEVERITY_COLOR[1]}DEVEL:#{Log::SEVERITY_COLOR[0]} " << stack.first}
|
92
|
+
Log.debug{""}
|
93
|
+
Log.debug{"=> " << message.inspect}
|
94
|
+
Log.debug{""}
|
95
|
+
end
|
96
|
+
|
97
|
+
def fff(object)
|
98
|
+
stack = caller
|
99
|
+
Log.debug{"#{Log::SEVERITY_COLOR[1]}FINGERPRINT:#{Log::SEVERITY_COLOR[0]} " << stack.first}
|
100
|
+
Log.debug{""}
|
101
|
+
Log.debug{require 'rbbt/util/misc'; "=> " << Misc.fingerprint(object) }
|
102
|
+
Log.debug{""}
|
103
|
+
end
|
data/lib/rbbt/util/misc.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
require 'lockfile'
|
2
|
-
require 'rbbt/util/chain_methods'
|
3
|
-
require 'rbbt/resource/path'
|
4
|
-
require 'rbbt/annotations'
|
5
2
|
require 'net/smtp'
|
6
|
-
require 'narray'
|
7
3
|
require 'digest/md5'
|
8
4
|
|
9
5
|
class Hash
|
@@ -16,6 +12,12 @@ class Hash
|
|
16
12
|
end
|
17
13
|
end
|
18
14
|
|
15
|
+
module LaterString
|
16
|
+
def to_s
|
17
|
+
yield
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
19
21
|
module Misc
|
20
22
|
class FieldNotFoundError < StandardError;end
|
21
23
|
|
@@ -201,10 +203,48 @@ module Misc
|
|
201
203
|
filename
|
202
204
|
end
|
203
205
|
|
206
|
+
def self.fingerprint(obj)
|
207
|
+
case obj
|
208
|
+
when nil
|
209
|
+
"nil"
|
210
|
+
when Symbol
|
211
|
+
":" << obj.to_s
|
212
|
+
when String
|
213
|
+
if obj.length > 100
|
214
|
+
"'" << obj[0..20-1] << "<...#{obj.length}...>" << obj[-10..-1] << " " << "'"
|
215
|
+
else
|
216
|
+
"'" << obj << "'"
|
217
|
+
end
|
218
|
+
when Array
|
219
|
+
if (length = obj.length) > 10
|
220
|
+
"[#{length}-" << (obj.values_at(0,1, length / 2, -2, -1).collect{|e| fingerprint(e)} * ",") << "]"
|
221
|
+
else
|
222
|
+
"[" << (obj.collect{|e| fingerprint(e) } * ",") << "]"
|
223
|
+
end
|
224
|
+
when TSV
|
225
|
+
obj.with_unnamed do
|
226
|
+
"TSV:{"<< fingerprint(obj.all_fields|| []).inspect << "," << fingerprint(obj.keys).inspect << "}"
|
227
|
+
end
|
228
|
+
when Hash
|
229
|
+
if obj.length > 10
|
230
|
+
"H:{"<< fingerprint(obj.keys) << "," << fingerprint(obj.values) << "}"
|
231
|
+
else
|
232
|
+
new = "{"
|
233
|
+
obj.each do |k,v|
|
234
|
+
new << k.to_s << '=>' << fingerprint(v) << ' '
|
235
|
+
end
|
236
|
+
new << "}"
|
237
|
+
end
|
238
|
+
else
|
239
|
+
obj.to_s
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
|
204
244
|
def self.remove_long_items(obj)
|
205
245
|
case
|
206
246
|
when TSV === obj
|
207
|
-
remove_long_items(obj.
|
247
|
+
remove_long_items((obj.all_fields || []) + obj.keys.sort)
|
208
248
|
when (Array === obj and obj.length > ARRAY_MAX_LENGTH)
|
209
249
|
remove_long_items(obj[0..ARRAY_MAX_LENGTH-2] << "TRUNCATED at #{ ARRAY_MAX_LENGTH } (#{obj.length})")
|
210
250
|
when (Hash === obj and obj.length > ARRAY_MAX_LENGTH)
|
@@ -310,7 +350,6 @@ module Misc
|
|
310
350
|
def self.send_email(from, to, subject, message, options = {})
|
311
351
|
IndiferentHash.setup(options)
|
312
352
|
options = Misc.add_defaults options, :from_alias => nil, :to_alias => nil, :server => 'localhost', :port => 25, :user => nil, :pass => nil, :auth => :login
|
313
|
-
IndiferentHash.setup(options)
|
314
353
|
|
315
354
|
server, port, user, pass, from_alias, to_alias, auth = Misc.process_options options, :server, :port, :user, :pass, :from_alias, :to_alias, :auth
|
316
355
|
|
@@ -406,6 +445,7 @@ end
|
|
406
445
|
}
|
407
446
|
|
408
447
|
def self.fast_align(reference, sequence)
|
448
|
+
require 'narray'
|
409
449
|
init_gap = -1
|
410
450
|
gap = -2
|
411
451
|
diff = -2
|
@@ -486,11 +526,35 @@ end
|
|
486
526
|
end
|
487
527
|
|
488
528
|
def self.is_filename?(string)
|
489
|
-
return true if
|
529
|
+
return true if string.respond_to? :exists
|
490
530
|
return true if String === string and string.length < 265 and File.exists? string
|
491
531
|
return false
|
492
532
|
end
|
493
533
|
|
534
|
+
def self.sorted_array_hits(a1, a2)
|
535
|
+
e1, e2 = a1.shift, a2.shift
|
536
|
+
counter = 0
|
537
|
+
match = []
|
538
|
+
while true
|
539
|
+
break if e1.nil? or e2.nil?
|
540
|
+
case e1 <=> e2
|
541
|
+
when 0
|
542
|
+
match << counter
|
543
|
+
e1, e2 = a1.shift, a2.shift
|
544
|
+
counter += 1
|
545
|
+
when -1
|
546
|
+
while not e1.nil? and e1 < e2
|
547
|
+
e1 = a1.shift
|
548
|
+
counter += 1
|
549
|
+
end
|
550
|
+
when 1
|
551
|
+
e2 = a2.shift
|
552
|
+
e2 = a2.shift while not e2.nil? and e2 < e1
|
553
|
+
end
|
554
|
+
end
|
555
|
+
match
|
556
|
+
end
|
557
|
+
|
494
558
|
def self.intersect_sorted_arrays(a1, a2)
|
495
559
|
e1, e2 = a1.shift, a2.shift
|
496
560
|
intersect = []
|
@@ -542,6 +606,33 @@ end
|
|
542
606
|
new
|
543
607
|
end
|
544
608
|
|
609
|
+
def self.binary_include?(array, elem)
|
610
|
+
upper = array.size - 1
|
611
|
+
lower = 0
|
612
|
+
|
613
|
+
return -1 if upper < lower
|
614
|
+
|
615
|
+
while(upper >= lower) do
|
616
|
+
idx = lower + (upper - lower) / 2
|
617
|
+
value = array[idx]
|
618
|
+
|
619
|
+
case elem <=> value
|
620
|
+
when 0
|
621
|
+
return true
|
622
|
+
when -1
|
623
|
+
upper = idx - 1
|
624
|
+
when 1
|
625
|
+
lower = idx + 1
|
626
|
+
else
|
627
|
+
raise "Cannot compare #{[elem.inspect, value.inspect] * " with "}"
|
628
|
+
end
|
629
|
+
end
|
630
|
+
|
631
|
+
return false
|
632
|
+
end
|
633
|
+
|
634
|
+
|
635
|
+
|
545
636
|
def self.array2hash(array, default = nil)
|
546
637
|
hash = {}
|
547
638
|
array.each do |key, value|
|
@@ -748,10 +839,11 @@ end
|
|
748
839
|
|
749
840
|
def self.html_tag(tag, content = nil, params = {})
|
750
841
|
attr_str = hash_to_html_tag_attributes(params)
|
842
|
+
attr_str = " " << attr_str if String === attr_str and attr_str != ""
|
751
843
|
html = if content.nil?
|
752
|
-
"<#{ tag }
|
844
|
+
"<#{ tag }#{attr_str}/>"
|
753
845
|
else
|
754
|
-
"<#{ tag }
|
846
|
+
"<#{ tag }#{attr_str}>#{ content }</#{ tag }>"
|
755
847
|
end
|
756
848
|
|
757
849
|
html
|
@@ -982,7 +1074,7 @@ end
|
|
982
1074
|
|
983
1075
|
end
|
984
1076
|
|
985
|
-
str << "_" << hash2md5(v.info) if Annotated === v
|
1077
|
+
str << "_" << hash2md5(v.info) if defined? Annotated and Annotated === v
|
986
1078
|
end
|
987
1079
|
hash.unnamed = unnamed if hash.respond_to? :unnamed
|
988
1080
|
|
@@ -1099,7 +1191,7 @@ end
|
|
1099
1191
|
chunks
|
1100
1192
|
end
|
1101
1193
|
|
1102
|
-
# Divides the array into
|
1194
|
+
# Divides the array into chunks of +num+ same size by placing one
|
1103
1195
|
# element in each chunk iteratively.
|
1104
1196
|
def self.ordered_divide(array, num)
|
1105
1197
|
last = array.length - 1
|
@@ -1120,6 +1212,7 @@ end
|
|
1120
1212
|
|
1121
1213
|
def self.snake_case(string)
|
1122
1214
|
return nil if string.nil?
|
1215
|
+
string = string.to_s if Symbol === string
|
1123
1216
|
string.
|
1124
1217
|
gsub(/([A-Z]{2,})([A-Z][a-z])/,'\1_\2').
|
1125
1218
|
gsub(/([a-z])([A-Z])/,'\1_\2').
|
@@ -1187,54 +1280,49 @@ class RBBTError < StandardError
|
|
1187
1280
|
end
|
1188
1281
|
|
1189
1282
|
module IndiferentHash
|
1190
|
-
|
1191
|
-
self.
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
when
|
1200
|
-
|
1201
|
-
when
|
1202
|
-
|
1283
|
+
|
1284
|
+
def self.setup(hash)
|
1285
|
+
hash.extend IndiferentHash
|
1286
|
+
end
|
1287
|
+
|
1288
|
+
def [](key)
|
1289
|
+
res = super(key) and return res
|
1290
|
+
|
1291
|
+
case key
|
1292
|
+
when Symbol, Module
|
1293
|
+
super(key.to_s)
|
1294
|
+
when String
|
1295
|
+
super(key.to_sym)
|
1203
1296
|
else
|
1204
|
-
|
1297
|
+
super(key)
|
1205
1298
|
end
|
1206
1299
|
end
|
1207
1300
|
|
1208
|
-
def
|
1209
|
-
|
1210
|
-
key_list.each{|key| res << indiferent_get_brackets(key)}
|
1211
|
-
res
|
1301
|
+
def values_at(*key_list)
|
1302
|
+
key_list.inject([]){|acc,key| acc << self[key]}
|
1212
1303
|
end
|
1213
1304
|
|
1214
|
-
def
|
1215
|
-
case
|
1216
|
-
when Symbol
|
1217
|
-
|
1218
|
-
when String
|
1219
|
-
|
1305
|
+
def include?(key)
|
1306
|
+
case key
|
1307
|
+
when Symbol, Module
|
1308
|
+
super(key) || super(key.to_s)
|
1309
|
+
when String
|
1310
|
+
super(key) || super(key.to_sym)
|
1220
1311
|
else
|
1221
|
-
|
1312
|
+
super(key)
|
1222
1313
|
end
|
1223
1314
|
end
|
1224
1315
|
|
1225
|
-
def
|
1226
|
-
|
1227
|
-
|
1316
|
+
def delete(key)
|
1317
|
+
case key
|
1318
|
+
when Symbol, Module
|
1319
|
+
super(key) || super(key.to_s)
|
1320
|
+
when String
|
1321
|
+
super(key) || super(key.to_sym)
|
1228
1322
|
else
|
1229
|
-
|
1323
|
+
super(key)
|
1230
1324
|
end
|
1231
1325
|
end
|
1232
|
-
|
1233
|
-
def self.setup(hash)
|
1234
|
-
return hash if IndiferentHash === hash
|
1235
|
-
hash.extend IndiferentHash unless IndiferentHash === hash
|
1236
|
-
hash
|
1237
|
-
end
|
1238
1326
|
end
|
1239
1327
|
|
1240
1328
|
module PDF2Text
|
data/lib/rbbt/util/open.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rbbt/util/cmd'
|
2
|
-
require 'rbbt/util/misc'
|
3
2
|
require 'rbbt/util/tmpfile'
|
3
|
+
require 'rbbt/util/misc'
|
4
4
|
|
5
5
|
require 'zlib'
|
6
6
|
|
@@ -19,6 +19,8 @@ module Open
|
|
19
19
|
File.exists?(Rbbt.etc.repository_dirs.find) ?
|
20
20
|
File.read(Rbbt.etc.repository_dirs.find).split("\n") :
|
21
21
|
[]
|
22
|
+
rescue
|
23
|
+
[]
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
@@ -393,11 +395,6 @@ module Open
|
|
393
395
|
end
|
394
396
|
when String === content
|
395
397
|
file_write(file, content, mode)
|
396
|
-
#File.open(file, mode) do |f|
|
397
|
-
# f.flock(File::LOCK_EX)
|
398
|
-
# f.write content
|
399
|
-
# f.flock(File::LOCK_UN)
|
400
|
-
#end
|
401
398
|
else
|
402
399
|
begin
|
403
400
|
File.open(file, mode) do |f|
|
@@ -415,14 +412,3 @@ module Open
|
|
415
412
|
end
|
416
413
|
end
|
417
414
|
end
|
418
|
-
|
419
|
-
if __FILE__ == $0
|
420
|
-
require 'benchmark'
|
421
|
-
require 'progress-monitor'
|
422
|
-
|
423
|
-
file = '/home/mvazquezg/rbbt/data/dbs/entrez/gene_info'
|
424
|
-
puts Benchmark.measure {
|
425
|
-
#Open.open(file).read.split(/\n/).each do |l| l end
|
426
|
-
Open.read(file) do |l| l end
|
427
|
-
}
|
428
|
-
end
|