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 +4 -4
- data/lib/rbbt/association/item.rb +16 -6
- data/lib/rbbt/knowledge_base/entity.rb +2 -2
- data/lib/rbbt/knowledge_base/query.rb +1 -0
- data/lib/rbbt/knowledge_base/traverse.rb +105 -0
- data/lib/rbbt/tsv/attach.rb +22 -15
- data/lib/rbbt/tsv/parallel/traverse.rb +6 -0
- data/lib/rbbt/util/log/progress.rb +3 -2
- data/lib/rbbt/util/log/progress/report.rb +7 -0
- data/lib/rbbt/workflow/accessor.rb +10 -2
- data/lib/rbbt/workflow/step/run.rb +3 -0
- data/share/rbbt_commands/app/template +43 -43
- data/share/rbbt_commands/workflow/server +10 -1
- data/test/rbbt/knowledge_base/test_traverse.rb +19 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0077c74cde35411d5404cfef3280cbf2364d916c
|
4
|
+
data.tar.gz: 0c5c8378d8a78fe1341c17cad09d88652714899c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 => :
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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(
|
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
|
103
|
+
return entity if index.nil?
|
104
104
|
Array === entity ? index.values_at(*entity) : index[entity]
|
105
105
|
end
|
106
106
|
|
@@ -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
|
data/lib/rbbt/tsv/attach.rb
CHANGED
@@ -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
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
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
|
-
|
9
|
-
|
6
|
+
require 'zurb-foundation'
|
7
|
+
require 'modular-scale'
|
10
8
|
|
11
|
-
|
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
|
-
|
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
|
-
|
21
|
+
template = template.sub('.haml','')
|
16
22
|
|
17
|
-
|
23
|
+
ENV["RBBT_FINDER"] = "true" if options.include?(:finder)
|
24
|
+
ENV["RServe-session"] = options[:RServe_session]
|
18
25
|
|
19
|
-
|
26
|
+
raise rbbt_usage unless template
|
20
27
|
|
21
|
-
|
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.
|
26
|
-
|
27
|
-
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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.
|
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-
|
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
|