rbbt-util 5.19.10 → 5.19.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2ef5af815d45af2cfaaa690e733714b5352fd2a
4
- data.tar.gz: ba78cb831ba748606f3b75b36fc9292cd98d6ddb
3
+ metadata.gz: d033f774277a3c6644e82ccb1d904d394dd68fe8
4
+ data.tar.gz: 654e1dabdcabf1bd94d5ad4bc48f1284ffc26007
5
5
  SHA512:
6
- metadata.gz: 2abbf6a68b9bb7721e924025d2f51e0174ecdee38cdb132fee51dbb0eb20449eae4e106b783e7b015e157d537e34482d7207a2d9b5871caf5c345d63f578ec28
7
- data.tar.gz: d6b7cd2954c7f4cc5f4796c7b677beb1c82e178e430dac066d3d4db9e99d56e9b1f1fecc4440e69ed1c08dc9e00e028aaeb07ffff4f28735d4a791b65fa9b935
6
+ metadata.gz: 9595ff8109bcdaac80a1e2f04eb4516814586de65605a4721ece5f9754d8dcdec31176db1933bf397c2c16d6b99bd66c3c4d638a1c722f45a07b55ea412d2ef5
7
+ data.tar.gz: 7c7d186eedf2bf54debecde2057523fb433c7c9c6fcd12fc46a15f14298c614cc497b569b7d40870f3ecda8081b01a1b2948b62e56f59370b921964df48812c5
@@ -0,0 +1,13 @@
1
+ #{{{ Require files
2
+ Rbbt.etc.knowledge_bases.read.split("\n").each do |workflow|
3
+ next if workflow.empty?
4
+ Log.debug("syndicating knowledgebase from workflow #{ workflow }")
5
+ begin
6
+ wf = Kernel.const_get workflow
7
+ begin require "rbbt/knowledge_base/#{ workflow }" rescue Exception end
8
+ KnowledgeBaseRESTHelpers.add_syndication Misc.snake_case(workflow), wf.knowledge_base
9
+ rescue Exception
10
+ Log.warn "Exception loading knowledgebase from #{ workflow }"
11
+ Log.exception $!
12
+ end
13
+ end if Rbbt.etc.knowledge_bases.exists?
@@ -16,9 +16,10 @@ module Association
16
16
  persist = persist_options[:persist]
17
17
 
18
18
  file = version_file(file, options[:namespace]) if options[:namespace] and String === file
19
- file = file.call if Proc === file
20
19
 
21
20
  data = Persist.persist_tsv(file, "Association Database", options, persist_options) do |data|
21
+ file = file.call if Proc === file
22
+
22
23
  options = options.dup
23
24
  tsv = Association.database(file, options.merge(:persist => persist, :unnamed => true))
24
25
  tsv = tsv.to_double unless tsv.type == :double
@@ -24,10 +24,10 @@ class KnowledgeBase
24
24
 
25
25
  def identify(db, source, target)
26
26
  source_entities = if is_wildcard? source
27
- assignments[source] || :all
28
- else
29
- kb.identify_source db, source
30
- end
27
+ assignments[source] || :all
28
+ else
29
+ kb.identify_source db, source
30
+ end
31
31
 
32
32
  target_entities = if is_wildcard? target
33
33
  assignments[target] || :all
@@ -42,8 +42,8 @@ class KnowledgeBase
42
42
  end
43
43
 
44
44
  def reassign(matches, source, target)
45
- assignments[source] = (matches.any? ? matches.source.uniq : []) if is_wildcard? source
46
- assignments[target] = (matches.any? ? matches.target.uniq : []) if is_wildcard? target
45
+ assignments[source] = (matches.any? ? matches.collect{|m|m.partition("~").first}.uniq : nil) if is_wildcard? source
46
+ assignments[target] = (matches.any? ? matches.collect{|m|m.partition("~").last}.uniq : nil) if is_wildcard? target
47
47
  end
48
48
 
49
49
  def clean_matches(rules, all_matches, assignments)
@@ -53,13 +53,13 @@ class KnowledgeBase
53
53
  source, db, target = rule.split /\s+/
54
54
 
55
55
  if is_wildcard? source
56
- assigned = assignments[source]
57
- matches = matches.select{|m| assigned.include? m.source }
56
+ assigned = assignments[source] || []
57
+ matches = matches.select{|m| assigned.include? m.partition("~").first }
58
58
  end
59
59
 
60
60
  if is_wildcard? target
61
- assigned = assignments[target]
62
- matches = matches.select{|m| assigned.include? m.target }
61
+ assigned = assignments[target] || []
62
+ matches = matches.select{|m| assigned.include? m.partition("~").last }
63
63
  end
64
64
 
65
65
  paths[rule] = matches
@@ -127,9 +127,29 @@ class KnowledgeBase
127
127
  return [] unless path_hash
128
128
  _ep(path_hash).collect do |path|
129
129
  path.zip(clean_matches.values_at(*rules)).collect do |item, matches|
130
- matches.first.annotate item.dup
130
+ matches.select{|m| m == item}.first
131
+ end
132
+ end
133
+ end
134
+
135
+ def traverse_db(db, source, target, conditions)
136
+ source_entities, target_entities = identify db, source, target
137
+
138
+ options = {:source => source_entities, :target => target_entities}
139
+ matches = kb.subset(db, options)
140
+
141
+ if conditions
142
+ Misc.tokenize(conditions).each do |condition|
143
+ if condition.index "="
144
+ key, value = conditions.split("=")
145
+ matches = matches.select{|m| Misc.match_value(m.info[key.strip], value)}
146
+ else
147
+ matches = matches.select{|m| m.info[condition.strip].to_s =~ /\btrue\b/}
148
+ end
131
149
  end
132
150
  end
151
+
152
+ matches
133
153
  end
134
154
 
135
155
 
@@ -139,32 +159,92 @@ class KnowledgeBase
139
159
  rules.each do |rule|
140
160
  rule = rule.strip
141
161
  next if rule.empty?
142
- source, db, target, conditions = rule.match(/([^\s]+)\s+([^\s]+)\s+([^\s]+)(?:\s+-\s+([^\s]+))?/).captures
143
162
 
144
- source_entities, target_entities = identify db, source, target
163
+ if m = rule.match(/([^\s]+)\s+([^\s]+)\s+([^\s]+)(?:\s+-\s+([^\s]+))?/)
164
+
165
+ source, db, target, conditions = m.captures
166
+ if db.include? '?'
167
+ all_dbs = kb.registry.keys
168
+ _name, _sep, _kb = db.partition("@")
169
+ case
170
+ when _kb[0] == '?'
171
+ dbs = all_dbs.select{|_db| _db.partition("@").first == _name}
172
+ when _name[0] == '?'
173
+ dbs = all_dbs.select{|_db| _db.include?("@") ? db.partition("@").last == _kb : true}
174
+ end
175
+ else
176
+ dbs = [db]
177
+ end
145
178
 
146
- matches = kb.subset(db, :source => source_entities, :target => target_entities)
179
+ rule_matches = []
180
+ dbs.each do |_db|
181
+ matches = traverse_db(_db, source, target, conditions)
182
+
183
+ next if matches.nil? or matches.empty?
184
+
185
+ if db.include? '?'
186
+ _name, _sep, _kb = db.partition("@")
187
+ case
188
+ when _kb[0] == '?'
189
+ assignments[_kb] ||= []
190
+ assignments[_kb] << _db.partition("@").reject{|p| p.empty?}.last
191
+ when _name[0] == '?'
192
+ assignments[_name] ||= []
193
+ assignments[_name] << _db.partition("@").first
194
+ end
195
+ end
147
196
 
148
- if conditions
149
- conditions.split(/\s+/).each do |condition|
150
- if condition.index "="
151
- key, value = conditions.split("=")
152
- matches = matches.select{|m| m.info[key.strip].to_s =~ /\b#{value.strip}\b/}
153
- else
154
- matches = matches.select{|m| m.info[condition.strip].to_s =~ /\btrue\b/}
197
+ matches.each do |m|
198
+ rule_matches << m
155
199
  end
156
200
  end
157
- end
158
201
 
159
- reassign matches, source, target
202
+ reassign rule_matches, source, target
160
203
 
161
- all_matches << matches
204
+ all_matches << rule_matches
205
+ else
206
+ raise "Rule not understood: #{rule}"
207
+ end
162
208
  end
163
209
 
164
210
  paths = find_paths rules, all_matches, assignments
165
-
211
+
166
212
  [assignments, paths]
167
213
  end
214
+
215
+ #def traverse
216
+ # all_matches = []
217
+
218
+ # rules.each do |rule|
219
+ # rule = rule.strip
220
+ # next if rule.empty?
221
+ # source, db, target, conditions = rule.match(/([^\s]+)\s+([^\s]+)\s+([^\s]+)(?:\s+-\s+([^\s]+))?/).captures
222
+
223
+ # source_entities, target_entities = identify db, source, target
224
+
225
+ # matches = kb.subset(db, :source => source_entities, :target => target_entities)
226
+
227
+ # if conditions
228
+ # conditions.split(/\s+/).each do |condition|
229
+ # if condition.index "="
230
+ # key, value = conditions.split("=")
231
+ # matches = matches.select{|m| m.info[key.strip].to_s =~ /\b#{value.strip}\b/}
232
+ # else
233
+ # matches = matches.select{|m| m.info[condition.strip].to_s =~ /\btrue\b/}
234
+ # end
235
+ # end
236
+ # end
237
+
238
+ # reassign matches, source, target
239
+
240
+ # all_matches << matches
241
+ # end
242
+
243
+ # paths = find_paths rules, all_matches, assignments
244
+
245
+ # [assignments, paths]
246
+ #end
247
+
168
248
  end
169
249
 
170
250
  def traverse(rules)
@@ -20,9 +20,53 @@ require 'rbbt/util/misc/system'
20
20
  require 'rbbt/util/misc/objects'
21
21
  require 'rbbt/util/misc/manipulation'
22
22
 
23
+ require 'to_regexp'
24
+
23
25
  module MultipleResult; end
24
26
 
25
27
  module Misc
28
+ def self._convert_match_condition(condition)
29
+ return true if condition == 'true'
30
+ return false if condition == 'false'
31
+ return condition.to_regexp if condition[0] == "/"
32
+ return [:cmp, $1, $2.to_f] if condition =~ /^([<>]=?)(.*)/
33
+ return [:invert, _convert_match_condition(condition[1..-1].strip)] if condition[0] == "!"
34
+ #return {$1 => $2.to_f} if condition =~ /^([<>]=?)(.*)/
35
+ #return {false => _convert_match_condition(condition[1..-1].strip)} if condition[0] == "!"
36
+ return condition
37
+ end
38
+
39
+ def self.match_value(value, condition)
40
+ condition = _convert_match_condition(condition.strip) if String === condition
41
+
42
+ case condition
43
+ when Regexp
44
+ !! value.match(condition)
45
+ when NilClass, TrueClass
46
+ value === TrueClass or (String === value and value.downcase == 'true')
47
+ when FalseClass
48
+ value === FalseClass or (String === value and value.downcase == 'false')
49
+ when String
50
+ Fixnum === value ? value.to_f == condition.to_f : value == condition
51
+ when Fixnum
52
+ value.to_f == condition.to_f
53
+ when Array
54
+ case condition.first
55
+ when :cmp
56
+ value.to_f.send(condition[1], condition[2])
57
+ when :invert
58
+ ! match_value(value, condition[1] )
59
+ else
60
+ condition.inject(false){|acc,e| acc = acc ? true : match_value(value, e) }
61
+ end
62
+ else
63
+ raise "Condition not understood: #{Misc.fingerprint condition}"
64
+ end
65
+ end
66
+
67
+ def self.tokenize(str)
68
+ str.scan(/"[^"]*"|'[^']*'|[^"'\s]+/)
69
+ end
26
70
  end
27
71
 
28
72
  module PDF2Text
@@ -36,4 +80,5 @@ module PDF2Text
36
80
  CMD.cmd("pdftotext #{pdf_file} -", :pipe => false, :stderr => true)
37
81
  end
38
82
  end
83
+
39
84
  end
@@ -207,7 +207,7 @@ module Misc
207
207
  when FalseClass
208
208
  'false'
209
209
  when Hash
210
- "{"<< obj.collect{|k,v| obj2str(k) << '=>' << obj2str(v)}*"," << "}"
210
+ "{"<< obj.collect{|k,v| obj2str(k) + '=>' << obj2str(v)}*"," << "}"
211
211
  when Symbol
212
212
  obj.to_s
213
213
  when String
data/share/config.ru CHANGED
@@ -40,6 +40,9 @@ app_eval app, Rbbt.etc['app.d/base.rb'].find
40
40
  #{{{ RESOURCES
41
41
  load_file Rbbt.etc['app.d/resources.rb'].find
42
42
 
43
+ #{{{ KNOWLEDGEBASE
44
+ load_file Rbbt.etc['app.d/knowledge_bases.rb'].find
45
+
43
46
  #{{{ ENTITIES
44
47
  load_file Rbbt.etc['app.d/entities.rb'].find
45
48
 
@@ -8,24 +8,22 @@ class TestKnowledgeBaseTraverse < Test::Unit::TestCase
8
8
  Genomics.knowledge_base
9
9
  end
10
10
 
11
- def _test_traverse
11
+ def test_traverse
12
12
  rules = []
13
13
  rules << "?1 pina SF3B1 - Method=MI:0006"
14
14
  rules << "TP53 pina ?2"
15
15
  rules << "?2 pina ?1"
16
16
  res = kb.traverse rules
17
- iii res
18
17
  assert res.first.include? "?1"
19
18
  end
20
19
 
21
- def _test_path
20
+ def test_path
22
21
  rules = []
23
22
  rules << "?1 pina ARPC2"
24
23
  rules << "ARPC3 pina ?2"
25
24
  rules << "?2 pina ?1"
26
25
  res = kb.traverse rules
27
26
  assert res.first.include? "?1"
28
- iii res.last.first
29
27
  end
30
28
 
31
29
  def test_path2
@@ -35,7 +33,13 @@ class TestKnowledgeBaseTraverse < Test::Unit::TestCase
35
33
  rules << "?1 pina ?2"
36
34
  res = kb.traverse rules
37
35
  assert res.first.include? "?1"
38
- iii res.last.first.first.source
36
+ end
37
+
38
+ def test_wildcard_db
39
+ rules = []
40
+ rules << "?1 ?db SF3B1 - Method=MI:0006"
41
+ res = kb.traverse rules
42
+ assert res.first.include? "?1"
39
43
  end
40
44
  end
41
45
 
@@ -512,4 +512,18 @@ eum fugiat quo voluptas nulla pariatur?"
512
512
  max = 1000
513
513
  assert_equal Misc.sample_large_obj(str, max).length, max+29
514
514
  end
515
+
516
+ def test_match_value
517
+ assert Misc.match_value("10", "10")
518
+ assert Misc.match_value("Hi", /hi/i)
519
+ assert Misc.match_value("Hi", /Hi/)
520
+ assert Misc.match_value("Hi", "/Hi/")
521
+ assert Misc.match_value("Hi", "/hi/i")
522
+ assert Misc.match_value("15", "<=20")
523
+ assert Misc.match_value("15", ">14")
524
+ assert Misc.match_value("15", "! >15")
525
+ assert Misc.match_value("15", "! >15")
526
+ assert Misc.match_value("15", [14, 15, 25])
527
+ assert ! Misc.match_value("15", [14, 25])
528
+ end
515
529
  end
@@ -23,7 +23,8 @@ Task 2
23
23
 
24
24
  EOF
25
25
  def test_parse
26
- ddd Workflow.parse_workflow_doc(TEMPLATE)
26
+ i = Workflow.parse_workflow_doc(TEMPLATE)
27
+ assert_equal "Title of the template", i[:title]
27
28
  end
28
29
  end
29
30
 
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.19.10
4
+ version: 5.19.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-18 00:00:00.000000000 Z
11
+ date: 2016-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: to_regexp
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  description: Utilities for handling tsv files, caches, etc
126
140
  email: miguel.vazquez@cnio.es
127
141
  executables:
@@ -148,6 +162,7 @@ files:
148
162
  - etc/app.d/foundation.rb
149
163
  - etc/app.d/grid_system.rb
150
164
  - etc/app.d/init.rb
165
+ - etc/app.d/knowledge_bases.rb
151
166
  - etc/app.d/resources.rb
152
167
  - etc/app.d/workflows.rb
153
168
  - lib/rbbt-util.rb