rbbt-util 5.16.3 → 5.17.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 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