rbbt-util 5.27.1 → 5.27.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/annotations/util.rb +1 -2
- data/lib/rbbt/entity.rb +8 -5
- data/lib/rbbt/knowledge_base/entity.rb +3 -2
- data/lib/rbbt/knowledge_base/query.rb +9 -0
- data/lib/rbbt/persist.rb +2 -3
- data/lib/rbbt/persist/tsv/adapter.rb +54 -12
- data/lib/rbbt/tsv/parallel/traverse.rb +1 -1
- data/lib/rbbt/tsv/util.rb +1 -0
- data/lib/rbbt/workflow/step/run.rb +1 -1
- data/lib/rbbt/workflow/usage.rb +25 -8
- data/share/install/software/lib/install_helpers +2 -0
- data/share/rbbt_commands/tsv/get +33 -7
- data/share/rbbt_commands/workflow/task +1 -1
- data/test/rbbt/knowledge_base/test_query.rb +1 -1
- data/test/rbbt/test_entity.rb +14 -5
- data/test/rbbt/test_knowledge_base.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 258aa01482866ef7b940790ad6f10d077a0cd721b972cbb939412c3691595acc
|
4
|
+
data.tar.gz: 9adb68a2c9ddfa77a3be419dd106e4083e11933dd6653b4d6e0bfa921edab187
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4df9dcbc8280023faa1e6c2e6a9393a9ae66e4513a95cdeae94256f5fc61f0e6691e114cd1d40a900041e1769988b2a69751f282fc95c0c134acb44cac3ed40c
|
7
|
+
data.tar.gz: b72bd064835be7c5dcfcf180ff87d6e22fced3f8833d9479f607ab64760594c7d7d25d84cd828b33f0a7d72208983b8c89e26d8924e91afc81ba5e5943ef462d
|
@@ -145,10 +145,9 @@ module Annotated
|
|
145
145
|
|
146
146
|
end
|
147
147
|
|
148
|
-
fields = fields.collect{|f| f.to_s}
|
148
|
+
fields = fields.collect{|f| f.to_s}.uniq
|
149
149
|
|
150
150
|
case
|
151
|
-
|
152
151
|
when (Annotated === annotations and not (AnnotatedArray === annotations and annotations.double_array))
|
153
152
|
tsv = TSV.setup({}, :key_field => "List", :fields => fields, :type => :list, :unnamed => true)
|
154
153
|
|
data/lib/rbbt/entity.rb
CHANGED
@@ -194,13 +194,16 @@ module Entity
|
|
194
194
|
multi_name = "_multiple_" << name
|
195
195
|
|
196
196
|
define_method multi_name do
|
197
|
-
if self.instance_variable_get("@
|
198
|
-
return self.instance_variable_get("@
|
197
|
+
if self.instance_variable_get("@multiple_result_" + name.to_s)
|
198
|
+
return self.instance_variable_get("@multiple_result_" + name.to_s)
|
199
199
|
end
|
200
|
-
raise MultipleEntity, "Entity #{name} runs with multiple entities
|
200
|
+
raise MultipleEntity, "Entity #{name} runs with multiple entities"
|
201
201
|
end
|
202
202
|
|
203
203
|
define_method name do |*args|
|
204
|
+
if self.instance_variable_get("@multiple_result_" + name.to_s)
|
205
|
+
return self.instance_variable_get("@multiple_result_" + name.to_s)
|
206
|
+
end
|
204
207
|
obj = if Array === self
|
205
208
|
self
|
206
209
|
elsif self.respond_to?(:container) && Array === self.container
|
@@ -222,11 +225,11 @@ module Entity
|
|
222
225
|
case res
|
223
226
|
when Array
|
224
227
|
missing.zip(res).each do |o,res|
|
225
|
-
o.instance_variable_set("@
|
228
|
+
o.instance_variable_set("@multiple_result_" + name.to_s, res)
|
226
229
|
end
|
227
230
|
when Hash
|
228
231
|
res.each do |o,res|
|
229
|
-
o.instance_variable_set("@
|
232
|
+
o.instance_variable_set("@multiple_result_" + name.to_s, res)
|
230
233
|
end
|
231
234
|
end
|
232
235
|
|
@@ -5,14 +5,15 @@ class KnowledgeBase
|
|
5
5
|
|
6
6
|
def select_entities(name, entities, options = {})
|
7
7
|
index = get_index(name, options)
|
8
|
+
|
8
9
|
source_field = index.source_field
|
9
10
|
target_field = index.target_field
|
10
11
|
|
11
12
|
source_type = Entity.formats[source_field]
|
12
13
|
target_type = Entity.formats[target_field]
|
13
14
|
|
14
|
-
source_entities = entities[:source] || entities[source_field] || entities[Entity.formats[source_field].to_s]
|
15
|
-
target_entities = entities[:target] || entities[target_field] || entities[Entity.formats[target_field].to_s]
|
15
|
+
source_entities = entities[:source] || entities[source_field] || entities[Entity.formats[source_field].to_s] || entities[:both]
|
16
|
+
target_entities = entities[:target] || entities[target_field] || entities[Entity.formats[target_field].to_s] || entities[:both]
|
16
17
|
|
17
18
|
[source_entities, target_entities]
|
18
19
|
end
|
@@ -10,6 +10,7 @@ class KnowledgeBase
|
|
10
10
|
|
11
11
|
def subset(name, entities, options = {}, &block)
|
12
12
|
entities, options = options, entities if entities.nil? and Hash === options
|
13
|
+
|
13
14
|
entities = case entities
|
14
15
|
when :all
|
15
16
|
{:target => :all, :source => :all}
|
@@ -23,7 +24,15 @@ class KnowledgeBase
|
|
23
24
|
raise "Entities are not a Hash or an AnnotatedArray: #{Misc.fingerprint entities}"
|
24
25
|
end
|
25
26
|
|
27
|
+
identify, identify_source, identify_target = entities.merge(options || {}).values_at :identify, :identify_source, :identify_target
|
28
|
+
|
26
29
|
source, target = select_entities(name, entities, options)
|
30
|
+
|
31
|
+
source = identify_source(name, source) if identify_source
|
32
|
+
target = identify_target(name, target) if identify_target
|
33
|
+
|
34
|
+
source = identify(name, source) if identify && !identify_source
|
35
|
+
target = identify(name, target) if identify && !identify_target
|
27
36
|
|
28
37
|
return [] if source.nil? or target.nil?
|
29
38
|
return [] if Array === target and target.empty?
|
data/lib/rbbt/persist.rb
CHANGED
@@ -407,7 +407,6 @@ module Persist
|
|
407
407
|
repo.read_and_close do
|
408
408
|
keys = repo.range subkey + 0.chr, true, subkey + 254.chr, true
|
409
409
|
end
|
410
|
-
repo.close
|
411
410
|
else
|
412
411
|
repo.read_and_close do
|
413
412
|
keys = repo.range subkey + 0.chr, true, subkey + 254.chr, true
|
@@ -461,13 +460,13 @@ module Persist
|
|
461
460
|
entities.each_with_index do |e,i|
|
462
461
|
next if e.nil?
|
463
462
|
tsv_values = e.tsv_values("literal", "annotation_types", "JSON")
|
464
|
-
repo[subkey +
|
463
|
+
repo[subkey + "ANNOTATED_DOUBLE_ARRAY:" << i.to_s] = tsv_values
|
465
464
|
end
|
466
465
|
else
|
467
466
|
entities.each_with_index do |e,i|
|
468
467
|
next if e.nil?
|
469
468
|
tsv_values = e.tsv_values("literal", "annotation_types", "JSON")
|
470
|
-
repo[subkey +
|
469
|
+
repo[subkey + i.to_s] = tsv_values
|
471
470
|
end
|
472
471
|
end
|
473
472
|
end
|
@@ -33,7 +33,29 @@ module Persist
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def read?
|
36
|
-
! write?
|
36
|
+
! (write? || closed?)
|
37
|
+
end
|
38
|
+
|
39
|
+
def write(*args)
|
40
|
+
begin
|
41
|
+
super(*args)
|
42
|
+
@writable = true
|
43
|
+
rescue NoMethodError
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def close(*args)
|
48
|
+
begin
|
49
|
+
super(*args)
|
50
|
+
rescue NoMethodError
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def read(*args)
|
55
|
+
begin
|
56
|
+
super(*args)
|
57
|
+
rescue NoMethodError
|
58
|
+
end
|
37
59
|
end
|
38
60
|
|
39
61
|
def collect
|
@@ -53,16 +75,27 @@ module Persist
|
|
53
75
|
end
|
54
76
|
|
55
77
|
def lock
|
78
|
+
#return yield if @locked
|
56
79
|
lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
|
57
80
|
Misc.lock(lock_filename) do
|
58
|
-
|
81
|
+
begin
|
82
|
+
@locked = true
|
83
|
+
yield
|
84
|
+
ensure
|
85
|
+
@locked = false
|
86
|
+
end
|
59
87
|
end
|
60
88
|
end
|
61
89
|
|
62
90
|
def write_and_read
|
63
|
-
|
64
|
-
|
65
|
-
|
91
|
+
if write?
|
92
|
+
begin
|
93
|
+
return yield
|
94
|
+
ensure
|
95
|
+
read
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
66
99
|
lock do
|
67
100
|
write true if closed? or not write?
|
68
101
|
begin
|
@@ -71,14 +104,17 @@ module Persist
|
|
71
104
|
read
|
72
105
|
end
|
73
106
|
end
|
74
|
-
#end
|
75
|
-
#end
|
76
107
|
end
|
77
108
|
|
78
109
|
def write_and_close
|
79
|
-
|
80
|
-
|
81
|
-
|
110
|
+
if write?
|
111
|
+
begin
|
112
|
+
return yield
|
113
|
+
ensure
|
114
|
+
close
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
82
118
|
lock do
|
83
119
|
write true if closed? || ! write?
|
84
120
|
res = begin
|
@@ -91,11 +127,17 @@ module Persist
|
|
91
127
|
end
|
92
128
|
res
|
93
129
|
end
|
94
|
-
#end
|
95
|
-
#end
|
96
130
|
end
|
97
131
|
|
98
132
|
def read_and_close
|
133
|
+
if read?
|
134
|
+
begin
|
135
|
+
return yield
|
136
|
+
ensure
|
137
|
+
close
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
99
141
|
lock do
|
100
142
|
read true if closed? || ! read?
|
101
143
|
begin
|
@@ -374,7 +374,7 @@ module TSV
|
|
374
374
|
when (defined? Step and Step)
|
375
375
|
|
376
376
|
obj.clean if obj.aborted? or obj.recoverable_error?
|
377
|
-
obj.run(true) unless obj.done?
|
377
|
+
obj.run(true) unless obj.done? || obj.started? || obj.result
|
378
378
|
|
379
379
|
stream = obj.get_stream
|
380
380
|
|
data/lib/rbbt/tsv/util.rb
CHANGED
@@ -108,7 +108,7 @@ class Step
|
|
108
108
|
@result = self._exec
|
109
109
|
@result = @result.stream if TSV::Dumper === @result
|
110
110
|
end
|
111
|
-
(no_load
|
111
|
+
(no_load || ENV["RBBT_NO_STREAM"]) ? @result : prepare_result(@result, @task.result_description)
|
112
112
|
end
|
113
113
|
|
114
114
|
def updatable?
|
data/lib/rbbt/workflow/usage.rb
CHANGED
@@ -71,7 +71,7 @@ module Workflow
|
|
71
71
|
@dep_tree ||= {}
|
72
72
|
@dep_tree[name] ||= begin
|
73
73
|
dep_tree = {}
|
74
|
-
self.task_dependencies[name].reverse.each do |dep|
|
74
|
+
self.task_dependencies[name.to_sym].reverse.each do |dep|
|
75
75
|
dep = dep.first if Array === dep && dep.length == 1
|
76
76
|
dep = dep.dependency if DependencyBlock === dep
|
77
77
|
|
@@ -88,23 +88,38 @@ module Workflow
|
|
88
88
|
key = [workflow, task]
|
89
89
|
|
90
90
|
dep_tree[key] = workflow.dep_tree(task)
|
91
|
-
end
|
91
|
+
end if self.task_dependencies[name.to_sym]
|
92
92
|
dep_tree
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
+
def _prov_tasks(tree)
|
97
|
+
tasks = []
|
98
|
+
heap = [tree]
|
99
|
+
while heap.any?
|
100
|
+
t = heap.pop
|
101
|
+
t.each do |k,v|
|
102
|
+
tasks << k
|
103
|
+
heap << v
|
104
|
+
end
|
105
|
+
end
|
106
|
+
tasks
|
107
|
+
end
|
108
|
+
|
96
109
|
def prov_string(tree)
|
97
110
|
description = ""
|
98
111
|
|
99
112
|
last = nil
|
100
113
|
seen = Set.new
|
101
|
-
tree.collect.to_a.flatten.select{|e| Symbol === e }.each do |task_name|
|
102
114
|
|
103
|
-
|
104
|
-
|
105
|
-
|
115
|
+
tasks = _prov_tasks(tree)
|
116
|
+
tasks.each do |workflow,task_name|
|
117
|
+
|
118
|
+
next if seen.include?([workflow,task_name])
|
106
119
|
|
107
|
-
|
120
|
+
child = last && last.include?([workflow, task_name])
|
121
|
+
first = last.nil?
|
122
|
+
last = _prov_tasks(workflow.dep_tree(task_name))
|
108
123
|
|
109
124
|
if child
|
110
125
|
description << "->" << task_name.to_s
|
@@ -113,6 +128,8 @@ module Workflow
|
|
113
128
|
else
|
114
129
|
description << ";" << task_name.to_s
|
115
130
|
end
|
131
|
+
|
132
|
+
seen << [workflow, task_name]
|
116
133
|
end
|
117
134
|
description
|
118
135
|
end
|
@@ -177,7 +194,7 @@ module Workflow
|
|
177
194
|
description = task.description || ""
|
178
195
|
description = description.split("\n\n").first
|
179
196
|
|
180
|
-
next if abridge
|
197
|
+
next if abridge && ! final.include?(name)
|
181
198
|
puts Misc.format_definition_list_item(name.to_s, description, Log.terminal_width, 20, :yellow)
|
182
199
|
|
183
200
|
prov_string = prov_string(dep_tree(name))
|
data/share/rbbt_commands/tsv/get
CHANGED
@@ -47,6 +47,28 @@ fields = options[:fields]
|
|
47
47
|
key_field = options[:key_field]
|
48
48
|
fields = fields.split(/[,|]/, -1) unless fields.nil?
|
49
49
|
|
50
|
+
if TSV === tsv
|
51
|
+
v = tsv[key]
|
52
|
+
fields ||= tsv.fields
|
53
|
+
puts Log.color(:blue, "Key: #{ key }")
|
54
|
+
if fields
|
55
|
+
if fields.length == 1
|
56
|
+
if options[:lines]
|
57
|
+
puts (Array === v ? v.flatten*"\n" : v.to_s )
|
58
|
+
else
|
59
|
+
puts (Array === v ? v.flatten*"\t" : v.to_s )
|
60
|
+
end
|
61
|
+
else
|
62
|
+
fields.zip(v).each do |field,v|
|
63
|
+
puts "#{Log.color :magenta, field+":"} #{v}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
else
|
67
|
+
puts "#{Log.color :magenta, "value:"} #{v}"
|
68
|
+
end
|
69
|
+
exit
|
70
|
+
end
|
71
|
+
|
50
72
|
parser = TSV::Parser.new tsv, :key_field => key_field, :fields => fields, :type => options[:type], :header_hash => options[:header_hash], :sep => options[:sep]
|
51
73
|
fields ||= parser.fields
|
52
74
|
|
@@ -54,15 +76,19 @@ TSV.traverse(parser) do |k,v|
|
|
54
76
|
next unless k.include? key
|
55
77
|
k = k.first if Array === k
|
56
78
|
puts Log.color(:blue, "Key: #{ k }")
|
57
|
-
if fields
|
58
|
-
if
|
59
|
-
|
79
|
+
if fields
|
80
|
+
if fields.length == 1
|
81
|
+
if options[:lines]
|
82
|
+
puts (Array === v ? v.flatten*"\n" : v.to_s )
|
83
|
+
else
|
84
|
+
puts (Array === v ? v.flatten*"\t" : v.to_s )
|
85
|
+
end
|
60
86
|
else
|
61
|
-
|
87
|
+
fields.zip(v).each do |field,v|
|
88
|
+
puts "#{Log.color :magenta, field+":"} #{v}"
|
89
|
+
end
|
62
90
|
end
|
63
91
|
else
|
64
|
-
|
65
|
-
puts "#{Log.color :magenta, field+":"} #{v}"
|
66
|
-
end
|
92
|
+
puts "#{Log.color :magenta, "value:"} #{Misc.fingerprint v}"
|
67
93
|
end
|
68
94
|
end
|
@@ -24,7 +24,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
|
|
24
24
|
|
25
25
|
EFFECT_TSV = TSV.open EFFECT, EFFECT_OPTIONS.dup
|
26
26
|
|
27
|
-
KNOWLEDGE_BASE = KnowledgeBase.new
|
27
|
+
KNOWLEDGE_BASE = KnowledgeBase.new Rbbt.tmp.test.kb_foo2, "Hsa"
|
28
28
|
KNOWLEDGE_BASE.format = {"Gene" => "Ensembl Gene ID"}
|
29
29
|
|
30
30
|
KNOWLEDGE_BASE.register :effects, EFFECT_TSV, EFFECT_OPTIONS.dup
|
data/test/rbbt/test_entity.rb
CHANGED
@@ -71,7 +71,9 @@ module ReversableString
|
|
71
71
|
}
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
74
75
|
persist :multiple_annotation_list, :annotations, :dir => TmpFile.tmp_file
|
76
|
+
#persist :multiple_annotation_list, :annotations, :dir => Rbbt.tmp.test.annots
|
75
77
|
end
|
76
78
|
|
77
79
|
class TestEntity < Test::Unit::TestCase
|
@@ -195,33 +197,40 @@ class TestEntity < Test::Unit::TestCase
|
|
195
197
|
string3 = 'AAABBBCCC_3'
|
196
198
|
string4 = 'AAABBBCCC_4'
|
197
199
|
|
200
|
+
|
201
|
+
$processed_multiple = []
|
202
|
+
Log.severity = 0
|
203
|
+
|
198
204
|
array = ReversableString.setup([string1, string2])
|
199
205
|
assert_equal [string1, string2].collect{|s| s.chars}, array.multiple_annotation_list
|
200
|
-
|
201
206
|
assert_equal string1.length, array[0].multiple_annotation_list.length
|
202
207
|
assert_equal $processed_multiple, [string1, string2]
|
203
208
|
|
204
209
|
array = ReversableString.setup([string2, string3])
|
205
|
-
assert_equal string2.
|
210
|
+
assert_equal [string2, string3].collect{|s| s.chars}, array.multiple_annotation_list
|
211
|
+
assert_equal string3, array.multiple_annotation_list.last * ""
|
206
212
|
assert_equal $processed_multiple, [string1, string2, string3]
|
207
213
|
|
214
|
+
$processed_multiple = []
|
208
215
|
array = ReversableString.setup([string2, string3])
|
216
|
+
assert_equal [string2, string3].collect{|s| s.chars}, array.multiple_annotation_list
|
209
217
|
assert_equal string2.length, array[0].multiple_annotation_list.length
|
210
|
-
assert_equal $processed_multiple, [
|
218
|
+
assert_equal $processed_multiple, []
|
211
219
|
|
212
220
|
$processed_multiple = []
|
213
221
|
array = ReversableString.setup([string2, string3, string4])
|
214
|
-
assert_equal string2.length, array[0].
|
222
|
+
assert_equal string2.length, array.multiple_annotation_list[0].length
|
215
223
|
assert_equal $processed_multiple, [string4]
|
216
224
|
|
217
225
|
string1 = 'aaabbbccc'
|
218
226
|
string2 = 'AAABBBCCC'
|
219
227
|
string3 = 'AAABBBCCC_3'
|
220
228
|
string4 = 'AAABBBCCC_4'
|
229
|
+
|
221
230
|
$processed_multiple = []
|
222
231
|
array = ReversableString.setup([string2, string3, string4])
|
223
232
|
assert_equal string2.length, array[0].multiple_annotation_list.length
|
224
|
-
assert_equal $processed_multiple, [
|
233
|
+
assert_equal $processed_multiple, []
|
225
234
|
|
226
235
|
end
|
227
236
|
|
@@ -92,9 +92,9 @@ class TestKnowledgeBase < Test::Unit::TestCase
|
|
92
92
|
assert downstream.length < downstream.follow(kb, :tfacts,false).flatten.length
|
93
93
|
|
94
94
|
Misc.benchmark(50) do
|
95
|
-
downstream.follow(kb, :tfacts,false)
|
96
|
-
downstream.backtrack(kb, :tfacts,false)
|
97
|
-
downstream.expand(kb, :tfacts,false)
|
95
|
+
downstream.follow(kb, :tfacts, false)
|
96
|
+
downstream.backtrack(kb, :tfacts, false)
|
97
|
+
downstream.expand(kb, :tfacts, false)
|
98
98
|
end
|
99
99
|
|
100
100
|
Misc.benchmark(50) do
|
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.27.
|
4
|
+
version: 5.27.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|