rbbt-util 5.4.1 → 5.5.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 +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
|