rbbt-util 5.16.3 → 5.17.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 944628eca69d1b9757794dd04d2e1fae618ec30f
4
- data.tar.gz: 6c1cb13e51f8efa8e5360b428bf0af8059cd74db
3
+ metadata.gz: 0077c74cde35411d5404cfef3280cbf2364d916c
4
+ data.tar.gz: 0c5c8378d8a78fe1341c17cad09d88652714899c
5
5
  SHA512:
6
- metadata.gz: baf4b9ae49ef200ae206de3aa6b4e2eed9093c653876dafd36f8f4fc06b71ffa89dbb6292a68c1075219193fed77ca539f841b8de3cf6ecd376c3e19c577eaa9
7
- data.tar.gz: 8df2ad85ef430be6d054d524cfa5fcab8c3e48be04ad6e47659491c62da16f8a855cf955fb430dfe1e9599b338242a7499c5843b4b4ae5b44e09a7727b4abbea
6
+ metadata.gz: 42f65b06e9cc69f73efc641c01693ebbeeb2d149888d78a06e3466c5dc09da467c4a36bc4cd6670839de121d1aae51c7d719f6ac6010b93b6ea43c63307d3456
7
+ data.tar.gz: e4888af1096ab853bf2b30eaa72f98ba3c7c6026914e974f7e4ca49596b389112552ef71f14df6d251ce959faabddcc9b76c613bbe05ff62682923ad68385f92
@@ -1,7 +1,7 @@
1
1
  require 'rbbt/entity'
2
2
 
3
3
  module AssociationItem
4
- extend Entity
4
+ extend Object::Entity
5
5
 
6
6
  annotation :knowledge_base
7
7
  annotation :database
@@ -15,11 +15,21 @@ module AssociationItem
15
15
  database ? [database, name] * ":" : name
16
16
  end
17
17
 
18
- property :invert => :single do
19
- s,_sep,t= self.partition "~"
20
- inverted = self.annotate([t,s] * _sep)
21
- inverted.reverse = ! reverse
22
- inverted
18
+ property :invert => :both do
19
+ if Array === self
20
+ inverted = self.collect do |item|
21
+ s,_sep,t= item.partition "~"
22
+ new = [t,s] * _sep
23
+ end
24
+ self.annotate inverted
25
+ inverted.reverse = ! reverse
26
+ inverted
27
+ else
28
+ s,_sep,t= self.partition "~"
29
+ inverted = self.annotate([t,s] * _sep)
30
+ inverted.reverse = ! reverse
31
+ inverted
32
+ end
23
33
  end
24
34
 
25
35
  property :namespace => :both do
@@ -81,7 +81,7 @@ class KnowledgeBase
81
81
  def target_index(name)
82
82
  Persist.memory("Target index #{name}: KB directory #{dir}") do
83
83
  identifier_files = identifier_files(name)
84
- identifier_files.concat Entity.identifier_files(source(name)) if defined? Entity
84
+ identifier_files.concat Entity.identifier_files(target(name)) if defined? Entity
85
85
  identifier_files.uniq!
86
86
  identifier_files.collect!{|f| f.annotate(f.gsub(/\bNAMESPACE\b/, namespace))} if namespace
87
87
  identifier_files.reject!{|f| f.match(/\bNAMESPACE\b/)}
@@ -100,7 +100,7 @@ class KnowledgeBase
100
100
  def identify_target(name, entity)
101
101
  return :all if entity == :all
102
102
  index = target_index(name)
103
- return nil if index.nil?
103
+ return entity if index.nil?
104
104
  Array === entity ? index.values_at(*entity) : index[entity]
105
105
  end
106
106
 
@@ -78,5 +78,6 @@ class KnowledgeBase
78
78
  setup(name, hash[:parents], true) if hash[:parents]
79
79
  hash
80
80
  end
81
+
81
82
  end
82
83
 
@@ -0,0 +1,105 @@
1
+ require 'rbbt-util'
2
+ require 'rbbt/knowledge_base'
3
+
4
+ class KnowledgeBase
5
+
6
+ class Traverser
7
+ attr_accessor :rules, :assignments, :matches, :kb
8
+
9
+ def initialize(kb, rules = [])
10
+ @kb = kb
11
+ @rules = rules
12
+ @assignments = {}
13
+ @matches = {}
14
+ end
15
+
16
+ def wildcard(name)
17
+ return name unless is_wildcard?(name)
18
+ assignments[name] || name
19
+ end
20
+
21
+ def is_wildcard?(name)
22
+ name[0] == '?'
23
+ end
24
+
25
+ def identify(db, source, target)
26
+ source_entities = if is_wildcard? source
27
+ assignments[source] || :all
28
+ else
29
+ kb.identify_source db, source
30
+ end
31
+
32
+ target_entities = if is_wildcard? target
33
+ assignments[target] || :all
34
+ else
35
+ kb.identify_target db, target
36
+ end
37
+
38
+ source_entities = [source_entities] unless Array === source_entities or source_entities == :all
39
+ target_entities = [target_entities] unless Array === target_entities or target_entities == :all
40
+
41
+ [source_entities, target_entities]
42
+ end
43
+
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
47
+ end
48
+
49
+ def find_paths(rules, all_matches, assignments)
50
+ paths = {}
51
+
52
+ rules.zip(all_matches).each do |rule, matches|
53
+ source, db, target = rule.split /\s+/
54
+ if is_wildcard? source
55
+ assigned = assignments[source]
56
+ matches = matches.select{|m| assigned.include? m.source }
57
+ end
58
+
59
+ if is_wildcard? target
60
+ assigned = assignments[target]
61
+ matches = matches.select{|m| assigned.include? m.target }
62
+ end
63
+
64
+ paths[rule] = matches
65
+ end
66
+ paths
67
+ end
68
+
69
+ def traverse
70
+ all_matches = []
71
+ rules.each do |rule|
72
+ rule = rule.strip
73
+ next if rule.empty?
74
+ source, db, target, conditions = rule.match(/([^\s]+)\s+([^\s]+)\s+([^\s]+)(?:\s+-\s+([^\s]+))?/).captures
75
+
76
+ source_entities, target_entities = identify db, source, target
77
+
78
+ matches = kb.subset(db, :source => source_entities, :target => target_entities)
79
+ if conditions
80
+ conditions.split(/\s+/).each do |condition|
81
+ if condition.index "="
82
+ key, value = conditions.split("=")
83
+ matches = matches.select{|m| m.info[key.strip].to_s =~ /\b#{value.strip}\b/}
84
+ else
85
+ matches = matches.select{|m| m.info[condition.strip].to_s =~ /\btrue\b/}
86
+ end
87
+ end
88
+ end
89
+
90
+ reassign matches, source, target
91
+ all_matches << matches
92
+ end
93
+
94
+ paths = find_paths rules, all_matches, assignments
95
+
96
+ [assignments, paths]
97
+ end
98
+ end
99
+
100
+ def traverse(rules)
101
+ traverser = KnowledgeBase::Traverser.new self, rules
102
+ traverser.traverse
103
+ end
104
+
105
+ end
@@ -195,21 +195,28 @@ module TSV
195
195
  other_filename = other.respond_to?(:filename) ? other.filename : other.inspect
196
196
  Log.low("Attaching fields:#{Misc.fingerprint fields } from #{other_filename}.")
197
197
 
198
- case
199
- when key_field == other.key_field
200
- Log.debug "Attachment with same key: #{other.key_field}"
201
- attach_same_key other, fields
202
- when (not in_namespace and self.fields.include?(other.key_field))
203
- Log.debug "Found other key field: #{other.key_field}"
204
- attach_source_key other, other.key_field, :fields => fields, :one2one => one2one
205
- when (in_namespace and self.fields_in_namespace.include?(other.key_field))
206
- Log.debug "Found other key field in #{in_namespace}: #{other.key_field}"
207
- attach_source_key other, other.key_field, :fields => fields, :one2one => one2one
208
- else
209
- index = TSV.find_traversal(self, other, options)
210
- raise FieldNotFoundError, "Cannot traverse identifiers" if index.nil?
211
- Log.debug "Attachment with index: #{other.key_field}"
212
- attach_index other, index, fields
198
+ same_key = true
199
+ begin
200
+ case
201
+ when (key_field == other.key_field and same_key)
202
+ Log.debug "Attachment with same key: #{other.key_field}"
203
+ attach_same_key other, fields
204
+ when (not in_namespace and self.fields.include?(other.key_field))
205
+ Log.debug "Found other key field: #{other.key_field}"
206
+ attach_source_key other, other.key_field, :fields => fields, :one2one => one2one
207
+ when (in_namespace and self.fields_in_namespace.include?(other.key_field))
208
+ Log.debug "Found other key field in #{in_namespace}: #{other.key_field}"
209
+ attach_source_key other, other.key_field, :fields => fields, :one2one => one2one
210
+ else
211
+ index = TSV.find_traversal(self, other, options)
212
+ raise FieldNotFoundError, "Cannot traverse identifiers" if index.nil?
213
+ Log.debug "Attachment with index: #{other.key_field}"
214
+ attach_index other, index, fields
215
+ end
216
+ rescue Exception
217
+ Log.exception $!
218
+ same_key = false
219
+ retry
213
220
  end
214
221
  Log.debug("Attachment of fields:#{Misc.fingerprint fields } from #{other.filename.inspect} finished.")
215
222
 
@@ -535,6 +535,9 @@ module TSV
535
535
  bar = Misc.process_options options, :bar
536
536
  bar ||= Misc.process_options options, :progress
537
537
  options[:bar] = case bar
538
+ when Step
539
+ max = guess_max(obj)
540
+ Log::ProgressBar.new_bar(max, {:desc => bar.status, :file => bar.file(:progress)})
538
541
  when String
539
542
  max = guess_max(obj)
540
543
  Log::ProgressBar.new_bar(max, {:desc => bar})
@@ -547,6 +550,9 @@ module TSV
547
550
  when Hash
548
551
  max = Misc.process_options(bar, :max) || max
549
552
  Log::ProgressBar.new_bar(max, bar)
553
+ when Log::ProgressBar
554
+ bar.max ||= guess_max(obj)
555
+ bar
550
556
  else
551
557
  bar
552
558
  end
@@ -4,10 +4,10 @@ require 'rbbt/util/log/progress/report'
4
4
  module Log
5
5
  class ProgressBar
6
6
 
7
- attr_accessor :max, :ticks, :frequency, :depth, :desc
7
+ attr_accessor :max, :ticks, :frequency, :depth, :desc, :file
8
8
  def initialize(max = nil, options = {})
9
9
  options = Misc.add_defaults options, :depth => 0, :num_reports => 100, :desc => "Progress", :io => STDERR, :severity => Log.severity
10
- depth, num_reports, desc, io, severity = Misc.process_options options, :depth, :num_reports, :desc, :io, :severity
10
+ depth, num_reports, desc, io, severity, file = Misc.process_options options, :depth, :num_reports, :desc, :io, :severity, :file
11
11
 
12
12
  @max = max
13
13
  @ticks = 0
@@ -17,6 +17,7 @@ module Log
17
17
  @last_percent = nil
18
18
  @depth = depth
19
19
  @desc = desc
20
+ @file = file
20
21
  end
21
22
 
22
23
  def percent
@@ -90,6 +90,11 @@ module Log
90
90
  str
91
91
  end
92
92
 
93
+ def save
94
+ info = {:start => @start, :last_time => @last_time, :last_count => @last_count, :last_percent => @last_percent, :desc => @desc, :ticks => @ticks, :max => @max}
95
+ Open.write(@file, info.to_yaml)
96
+ end
97
+
93
98
  def report(io = STDERR)
94
99
  if Log::LAST != "progress"
95
100
  length = Log::ProgressBar.cleanup_bars
@@ -106,6 +111,7 @@ module Log
106
111
  @last_time = Time.now
107
112
  @last_count = ticks
108
113
  @last_percent = percent if max
114
+ save if @file
109
115
  end
110
116
 
111
117
  def done(io = STDERR)
@@ -121,6 +127,7 @@ module Log
121
127
  @last_time = @start
122
128
  done_msg << " (" << thr_msg << ")"
123
129
  print(io, up_lines(@depth) << done_msg << down_lines(@depth))
130
+ Open.rm @file if @file and Open.exists? @file
124
131
  end
125
132
  end
126
133
  end
@@ -211,8 +211,8 @@ class Step
211
211
  end
212
212
  end
213
213
 
214
- def self.log_progress(status, options, path, &block)
215
- options = Misc.add_defaults options, :severity => Log::INFO
214
+ def self.log_progress(status, options = {}, path = nil, &block)
215
+ options = Misc.add_defaults options, :severity => Log::INFO, :file => path
216
216
  max = Misc.process_options options, :max
217
217
  Log::ProgressBar.with_bar(max, options) do |bar|
218
218
  begin
@@ -225,6 +225,14 @@ class Step
225
225
  end
226
226
  end
227
227
 
228
+ def log_progress(status, options = {}, &block)
229
+ Step.log_progress(status, options, file(:progress), &block)
230
+ end
231
+
232
+ def progress_bar(msg, options = {})
233
+ Log::ProgressBar.new nil, {:desc => msg, :file => file(:progress)}.merge(options)
234
+ end
235
+
228
236
  def self.log(status, message, path, &block)
229
237
  if block
230
238
  if Hash === message
@@ -134,6 +134,9 @@ class Step
134
134
  dependency.dup_inputs
135
135
  end
136
136
 
137
+ return if @seen.empty?
138
+
139
+ log :dependencies, "#{Log.color :magenta, "Dependencies"} #{Log.color :yellow, task.name.to_s || ""}"
137
140
  @seen.each do |dependency|
138
141
  next if dependency == self
139
142
  next unless dependencies.include? dependency
@@ -1,66 +1,66 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rbbt'
4
- require 'rbbt/resource'
5
- require 'rbbt-util'
6
3
  require 'rbbt/util/simpleopt'
4
+ require 'rbbt/workflow'
7
5
 
8
- options = SOPT.get "-e--environment*:-p--port*:-s--server*:-h--host*:-f--finder"
9
- options[:Port] ||= options[:port]
6
+ require 'zurb-foundation'
7
+ require 'modular-scale'
10
8
 
11
- file = ARGV.shift
9
+ require 'rbbt/rest/main'
10
+ require 'rbbt/rest/entity'
11
+ require 'rbbt/rest/workflow'
12
+ require 'rbbt/rest/file_server'
13
+ require 'rbbt/rest/knowledge_base'
14
+ require 'rbbt/rest/helpers'
15
+ require 'rbbt/rest/web_tool'
12
16
 
13
- load Rbbt.etc['app.d/init.rb'].find
17
+ options = SOPT.get "-e--environment*:-p--port*:-s--server*:-b--bind*:-e--environment*:-R--RServe_session*:--finder:--views*:-w--workflows*"
18
+
19
+ template = ARGV.first
14
20
 
15
- $class_name = class_name = "SingleTemplate"
21
+ template = template.sub('.haml','')
16
22
 
17
- $app = app = eval "class #{class_name} < Sinatra::Base; self end"
23
+ ENV["RBBT_FINDER"] = "true" if options.include?(:finder)
24
+ ENV["RServe-session"] = options[:RServe_session]
18
25
 
19
- #$LOAD_PATH.unshift('lib')
26
+ raise rbbt_usage unless template
20
27
 
21
- #{{{ PRE
22
- Log.info{"Loading: " << Rbbt.etc['app.d/pre.rb'].find if Rbbt.etc['app.d/pre.rb'].exists?}
23
- load Rbbt.etc['app.d/pre.rb'].find if Rbbt.etc['app.d/pre.rb'].exists?
28
+ $title = File.basename(template)
24
29
 
25
- app.get '/' do
26
- file = file.sub(/\.haml/,'')
27
- template_render(file)
30
+ load Rbbt.etc['app.d/init.rb'].find
31
+
32
+ app = class SingleTemplate < Sinatra::Base; self end
33
+
34
+ if options[:workflows]
35
+ app.register Sinatra::RbbtRESTWorkflow
36
+ options[:workflows].split(/[\s,]+/).each do |name|
37
+ wf = Workflow.require_workflow name
38
+ app.add_workflow wf, :all
39
+ end
28
40
  end
29
41
 
30
- #{{{ BASE
31
- app.class_eval do
32
- Log.info{"Loading: " << Rbbt.etc['app.d/base.rb'].find}
33
- eval Rbbt.etc['app.d/base.rb'].read, nil, Rbbt.etc['app.d/base.rb'].find
42
+ app.register Sinatra::RbbtRESTKnowledgeBase
43
+
44
+ app.helpers Sinatra::RbbtMiscHelpers
45
+ app.helpers Sinatra::RbbtToolHelper
46
+
47
+ app.get '/' do
48
+ template_render(template, @clean_params)
34
49
  end
50
+ app.instance_eval Rbbt.etc['app.d/base.rb'].read
51
+ app.use Rack::Deflater
35
52
 
36
- #{{{ RESOURCES
37
- Log.info{"Loading: " << Rbbt.etc['app.d/resources.rb'].find}
38
53
  load Rbbt.etc['app.d/resources.rb'].find
39
54
 
40
- #{{{ ENTITIES
41
- Log.info{"Loading: " << Rbbt.etc['app.d/entities.rb'].find}
42
- load Rbbt.etc['app.d/entities.rb'].find
43
-
44
- #{{{ FINDER
45
55
  app.class_eval do
46
- Log.info{"Loading: " << Rbbt.etc['app.d/finder.rb'].find}
47
56
  eval Rbbt.etc['app.d/finder.rb'].read
48
57
  end
49
58
 
50
- #{{{ POST
51
- Log.info{"Loading: " << Rbbt.etc['app.d/post.rb'].find if Rbbt.etc['app.d/post.rb'].exists?}
52
- load Rbbt.etc['app.d/post.rb'].find if Rbbt.etc['app.d/post.rb'].exists?
53
-
54
- #{{{ RUN
55
- $title = class_name
56
- require 'rack'
57
-
58
- ENV["RBBT_FINDER"] = "true" if options.include?(:finder)
59
- ENV["RACK_ENV"] = options[:environment] if options.include?(:environment)
59
+ Sinatra::RbbtRESTMain.add_resource_path(Path.setup('/home/mvazquezg/'), true)
60
60
 
61
- RbbtRESTHelpers.template_resources.unshift Path.setup(File.expand_path(File.dirname(file)))
62
61
 
63
- app.port = options[:port] if options[:port]
64
- app.server = options[:server] if options[:server]
65
- app.environment = options[:environment] if options[:environment]
66
- app.run!
62
+ SingleTemplate.port = options[:port] || 4567
63
+ SingleTemplate.bind = options[:bind] || "0.0.0.0"
64
+ SingleTemplate.environment = options[:environment] || "development"
65
+ SingleTemplate.server = options[:server] if options[:server]
66
+ SingleTemplate.run!
@@ -12,8 +12,9 @@ require 'rbbt/rest/workflow'
12
12
  require 'rbbt/rest/file_server'
13
13
  require 'rbbt/rest/knowledge_base'
14
14
  require 'rbbt/rest/helpers'
15
+ require 'rbbt/rest/web_tool'
15
16
 
16
- options = SOPT.get "-e--environment*:-p--port*:-s--server*:-b--bind*:-e--environment*:-R--RServe_session*:--finder:--views*"
17
+ options = SOPT.get "-e--environment*:-p--port*:-s--server*:-b--bind*:-e--environment*:-R--RServe_session*:--finder:--views*:-w--workflows*"
17
18
 
18
19
  workflow = ARGV.first
19
20
 
@@ -32,6 +33,7 @@ app = class WorkflowRest < Sinatra::Base; self end
32
33
 
33
34
  app.register Sinatra::RbbtRESTWorkflow
34
35
  app.register Sinatra::RbbtRESTKnowledgeBase
36
+ app.helpers Sinatra::RbbtToolHelper
35
37
 
36
38
  app.get '/' do
37
39
  redirect to(File.join('/', wf.to_s))
@@ -46,6 +48,13 @@ app.class_eval do
46
48
  end
47
49
 
48
50
  WorkflowRest.add_workflow wf, :all
51
+ if options[:workflows]
52
+ options[:workflows].split(/[\s,]+/).each do |name|
53
+ _wf = Workflow.require_workflow name
54
+ WorkflowRest.add_workflow _wf, :all
55
+ end
56
+ end
57
+
49
58
 
50
59
  if options[:views] and not options[:views].empty?
51
60
  Sinatra::RbbtRESTMain.add_resource_path(Path.setup(options[:views]), true)
@@ -0,0 +1,19 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
+ require 'rbbt/knowledge_base/traverse'
3
+ require 'rbbt/workflow'
4
+
5
+ Workflow.require_workflow "Genomics"
6
+ class TestKnowledgeBaseTraverse < Test::Unit::TestCase
7
+ def kb
8
+ Genomics.knowledge_base
9
+ end
10
+
11
+ def test_traverse
12
+ rules = []
13
+ rules << "SF3B1 pina ?1 - Method=MI:0006"
14
+ rules << "TP53 pina ?1"
15
+ res = kb.traverse rules
16
+ assert res.first.include? "?1"
17
+ end
18
+ end
19
+
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.16.3
4
+ version: 5.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-12 00:00:00.000000000 Z
11
+ date: 2015-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -170,6 +170,7 @@ files:
170
170
  - lib/rbbt/knowledge_base/query.rb
171
171
  - lib/rbbt/knowledge_base/registry.rb
172
172
  - lib/rbbt/knowledge_base/syndicate.rb
173
+ - lib/rbbt/knowledge_base/traverse.rb
173
174
  - lib/rbbt/monitor.rb
174
175
  - lib/rbbt/packed_index.rb
175
176
  - lib/rbbt/persist.rb
@@ -346,6 +347,7 @@ files:
346
347
  - test/rbbt/knowledge_base/test_query.rb
347
348
  - test/rbbt/knowledge_base/test_registry.rb
348
349
  - test/rbbt/knowledge_base/test_syndicate.rb
350
+ - test/rbbt/knowledge_base/test_traverse.rb
349
351
  - test/rbbt/persist/test_tsv.rb
350
352
  - test/rbbt/persist/tsv/test_cdb.rb
351
353
  - test/rbbt/persist/tsv/test_kyotocabinet.rb
@@ -465,6 +467,7 @@ test_files:
465
467
  - test/rbbt/test_packed_index.rb
466
468
  - test/rbbt/entity/test_identifiers.rb
467
469
  - test/rbbt/test_association.rb
470
+ - test/rbbt/knowledge_base/test_traverse.rb
468
471
  - test/rbbt/knowledge_base/test_registry.rb
469
472
  - test/rbbt/knowledge_base/test_entity.rb
470
473
  - test/rbbt/knowledge_base/test_enrichment.rb