rbbt-util 5.27.1 → 5.27.2
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/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
|