rbbt-util 5.20.26 → 5.21.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -94,7 +94,7 @@ class Step
94
94
 
95
95
  begin
96
96
  @mutex.synchronize do
97
- no_load = no_load ? :stream : false
97
+ no_load = :stream if no_load
98
98
  result = Persist.persist "Job", @task.result_type, :file => path, :check => checks, :no_load => no_load do
99
99
  if Step === Step.log_relay_step and not self == Step.log_relay_step
100
100
  relay_log(Step.log_relay_step) unless self.respond_to? :relay_step and self.relay_step
@@ -180,7 +180,6 @@ class Step
180
180
  rescue
181
181
  Log.exception $!
182
182
  ensure
183
- join
184
183
  Step.purge_stream_cache
185
184
  FileUtils.rm pid_file if File.exist?(pid_file)
186
185
  end
@@ -255,24 +254,41 @@ class Step
255
254
 
256
255
  clean if dirty? or (not running? and not done?)
257
256
 
258
- run(:stream) unless started?
257
+ no_load = :stream
258
+ run(false) unless started?
259
259
 
260
260
  join unless done?
261
261
 
262
262
  self
263
263
  end
264
264
 
265
- def fork(semaphore = nil)
265
+ def fork(no_load = false, semaphore = nil)
266
266
  raise "Can not fork: Step is waiting for proces #{@pid} to finish" if not @pid.nil? and not Process.pid == @pid and Misc.pid_exists?(@pid) and not done? and info[:forked]
267
+ sout, sin = Misc.pipe if no_load == :stream
267
268
  @pid = Process.fork do
269
+ sout.close if sout
268
270
  Misc.pre_fork
269
271
  begin
270
272
  RbbtSemaphore.wait_semaphore(semaphore) if semaphore
271
273
  FileUtils.mkdir_p File.dirname(path) unless File.exist? File.dirname(path)
272
274
  begin
273
275
  @forked = true
274
- res = run true
276
+ res = run no_load
275
277
  set_info :forked, true
278
+ if sin
279
+ io = TSV.get_stream res
280
+ if io.respond_to? :setup
281
+ io.setup(sin)
282
+ sin.pair = io
283
+ io.pair = sin
284
+ end
285
+ begin
286
+ Misc.consume_stream(io, false, sin)
287
+ rescue
288
+ Log.warn "Could not consume stream (#{io.closed? ? 'closed' : 'open'}) into pipe for forked job: #{self.path}"
289
+ Misc.consume_stream(io) unless io.closed?
290
+ end
291
+ end
276
292
  rescue Aborted, Interrupt
277
293
  Log.debug{"Forked process aborted: #{path}"}
278
294
  log :aborted, "Job aborted (#{Process.pid})"
@@ -309,6 +325,8 @@ class Step
309
325
  Kernel.exit! 0
310
326
  end
311
327
  end
328
+ sin.close if sin
329
+ @result = sout if sout
312
330
  Process.detach(@pid)
313
331
  self
314
332
  end
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
 
3
2
  require 'rbbt-util'
4
3
  require 'rbbt/util/simpleopt'
@@ -17,12 +16,16 @@ $ rbbt workflow server [options] <Workflow>
17
16
  -p--port* TCP port
18
17
  -s--server* Server type: thin, webrick, unicorn, etc
19
18
  -f--finder Start server with finder functionality
20
- -R--Rserve_session* Rserve session to use, otherwise start new one
19
+ -RS--Rserve_session* Rserve session to use, otherwise start new one
21
20
  -wd--workdir* Change the working directory of the workflow
22
21
  -W--workflows* List of additional workflows to load
23
22
  --views* Directory with view templates
24
23
  --stream Activate streaming of workflow tasks
25
- --export* Export workflow tasks
24
+ --export* Export workflow tasks (asynchronous)
25
+ --export_asynchronous* Export workflow tasks as asynchronous
26
+ --export_synchronous* Export workflow tasks as synchronous
27
+ --export_exec* Export workflow tasks as exec
28
+ --export_stream* Export workflow tasks as stream
26
29
  --options* Additional options for server (e.g. option1=value1;option2=value2)
27
30
  EOF
28
31
 
@@ -54,12 +57,22 @@ ENV["RServe-session"] = options[:RServe_session] || workflow
54
57
  server = options[:server] || 'puma'
55
58
 
56
59
  exports = options[:export].split(/\s*,/) if options[:export]
60
+ stream_exports = options[:export_stream].split(/\s*,/) if options[:export_stream]
61
+ async_exports = options[:export_asynchronous].split(/\s*,/) if options[:export_asynchronous]
62
+ sync_exports = options[:export_synchronous].split(/\s*,/) if options[:export_synchronous]
63
+ exec_exports = options[:export_exec].split(/\s*,/) if options[:export_exec]
57
64
 
58
65
  TmpFile.with_file do |app_dir|
59
66
  Misc.in_dir(app_dir) do
60
67
  app_dir = Path.setup(app_dir.dup)
61
68
  Open.write(app_dir.etc.target_workflow.find, workflow)
69
+
62
70
  Open.write(app_dir.etc.target_workflow_exports.find, exports * "\n") if exports
71
+ Open.write(app_dir.etc.target_workflow_stream_exports.find, stream_exports * "\n") if stream_exports
72
+ Open.write(app_dir.etc.target_workflow_async_exports.find, async_exports * "\n") if async_exports
73
+ Open.write(app_dir.etc.target_workflow_sync_exports.find, sync_exports * "\n") if sync_exports
74
+ Open.write(app_dir.etc.target_workflow_exec_exports.find, exec_exports * "\n") if exec_exports
75
+
63
76
  Open.write(app_dir.etc.workflows.find, workflows.split(/,\s/)*"\n") if workflows
64
77
 
65
78
  require 'rack'
@@ -192,6 +192,7 @@ the job dependencies recursively.
192
192
  --provenance Report the jobs provenance
193
193
  -W--workflows* Load a list of workflows
194
194
  -R--requires* Require a list of files
195
+ -rwt--remote_workflow_tasks* Load a yaml file describing remote workflow tasks
195
196
  EOF
196
197
 
197
198
  workflow = ARGV.shift
@@ -237,6 +238,13 @@ if options[:requires]
237
238
  require req
238
239
  end
239
240
  end
241
+
242
+ if options[:remote_workflow_tasks]
243
+ yaml_text = Open.read(options[:remote_workflow_tasks])
244
+ remote_workflow_tasks = YAML.load(yaml_text)
245
+ Workflow.process_remote_tasks(remote_workflow_tasks)
246
+ end
247
+
240
248
  # Set task
241
249
  namespace = nil, nil
242
250
 
@@ -354,6 +362,7 @@ begin
354
362
 
355
363
  if options.delete(:printpath)
356
364
  job.join
365
+ raise job.messages.last if job.error?
357
366
  if Open.remote? job.path
358
367
  puts job.url + Log.color(:blue, "?_format=raw")
359
368
  else
@@ -30,13 +30,6 @@ require Rbbt.etc['app.d/init.rb'].find
30
30
  workflow = Rbbt.etc['target_workflow'].read
31
31
  wf = Workflow.require_workflow workflow, true
32
32
 
33
- if Rbbt.etc['target_workflow_exports'].exists?
34
- exports = Rbbt.etc['target_workflow_exports'].read.split("\n")
35
- exports.each do |task|
36
- wf.export task.to_sym
37
- end
38
- end
39
-
40
33
  $title = wf.to_s
41
34
  $app_name = app_name = wf.to_s + "REST"
42
35
  $app = app = eval "class #{app_name} < Sinatra::Base; self end"
@@ -80,6 +73,41 @@ load_file Rbbt.etc['app.d/post.rb'].find_all
80
73
  #{{{ PRELOAD
81
74
  load_file Rbbt.etc['app.d/preload.rb'].find_all
82
75
 
76
+ if Rbbt.etc['target_workflow_exports'].exists?
77
+ exports = Rbbt.etc['target_workflow_exports'].read.split("\n")
78
+ exports.each do |task|
79
+ wf.export task.to_sym
80
+ end
81
+ end
82
+
83
+ if Rbbt.etc['target_workflow_stream_exports'].exists?
84
+ exports = Rbbt.etc['target_workflow_stream_exports'].read.split("\n")
85
+ exports.each do |task|
86
+ wf.export_stream task.to_sym
87
+ end
88
+ end
89
+
90
+ if Rbbt.etc['target_workflow_async_exports'].exists?
91
+ exports = Rbbt.etc['target_workflow_async_exports'].read.split("\n")
92
+ exports.each do |task|
93
+ wf.export_asynchronous task.to_sym
94
+ end
95
+ end
96
+
97
+ if Rbbt.etc['target_workflow_sync_exports'].exists?
98
+ exports = Rbbt.etc['target_workflow_sync_exports'].read.split("\n")
99
+ exports.each do |task|
100
+ wf.export_synchronous task.to_sym
101
+ end
102
+ end
103
+
104
+ if Rbbt.etc['target_workflow_exec_exports'].exists?
105
+ exports = Rbbt.etc['target_workflow_exec_exports'].read.split("\n")
106
+ exports.each do |task|
107
+ wf.export_exec task.to_sym
108
+ end
109
+ end
110
+
83
111
  #{{{ RUN
84
112
  require 'rack'
85
113
  use Rack::Deflater
@@ -74,6 +74,15 @@ Returns numer * 2 lines containing TEST
74
74
  dependencies.collect{|d| d.load } * ":"
75
75
  end
76
76
 
77
+ task :stream => :array do
78
+ Misc.open_pipe do |sin|
79
+ 5.times do |i|
80
+ sin.puts "line #{ i }"
81
+ sleep 1
82
+ end
83
+ end
84
+ end
85
+
77
86
 
78
87
 
79
88
  end
@@ -152,4 +161,19 @@ class TestWorkflow < Test::Unit::TestCase
152
161
  assert_equal "V:AA", job.run
153
162
  end
154
163
 
164
+ def __test_stream
165
+ io = TestWF.job(:stream).run(:stream)
166
+ Misc.consume_stream(TSV.get_stream(io), false, STDOUT)
167
+ nil
168
+ end
169
+
170
+ def __test_fork_stream
171
+ job = TestWF.job(:stream)
172
+ job.clean
173
+ io = job.fork(:stream)
174
+ Misc.consume_stream(TSV.get_stream(io), false, STDOUT)
175
+ nil
176
+ end
177
+
178
+
155
179
  end
@@ -197,6 +197,22 @@ row2 AAA
197
197
  assert_equal ["AA", "AAA"], tsv["row2"][0]
198
198
  end
199
199
 
200
+ def test_paste_stream_nohead
201
+ text1=<<-EOF
202
+ row1\tA
203
+ row2\tAA
204
+ EOF
205
+
206
+ text2=<<-EOF
207
+ row2\tAAA
208
+ EOF
209
+
210
+ s1 = StringIO.new text1
211
+ s2 = StringIO.new text2
212
+ tsv = TSV.open TSV.paste_streams([s1,s2], :type => :double, :sort => false, :same_fields => true)
213
+ assert_equal ["AA", "AAA"], tsv["row2"][0]
214
+ end
215
+
200
216
  def test_flat2double
201
217
  text1=<<-EOF
202
218
  #: :sep= #:type=:flat
@@ -37,7 +37,7 @@ class TestBgzf < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  def test_bgzip
40
- assert File.exists?(Bgzf.bgzip_cmd)
40
+ assert File.exist?(Bgzf.bgzip_cmd)
41
41
  assert 'bgzip', File.basename(Bgzf.bgzip_cmd)
42
42
  end
43
43
  end
@@ -58,7 +58,7 @@ Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium
58
58
  doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore
59
59
  veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim
60
60
  ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia
61
- consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
61
+ consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
62
62
 
63
63
  Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur,
64
64
  adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et
@@ -192,7 +192,7 @@ eum fugiat quo voluptas nulla pariatur?"
192
192
 
193
193
  stream1 = Misc.open_pipe(true) do |sin|
194
194
  t.times do |i|
195
- sleep sleep_time
195
+ sleep sleep_time
196
196
  sin.puts "LINE #{ i }"
197
197
  end
198
198
  end
@@ -228,7 +228,7 @@ eum fugiat quo voluptas nulla pariatur?"
228
228
 
229
229
  stream1 = Misc.open_pipe(true) do |sin|
230
230
  t.times do |i|
231
- sleep sleep_time
231
+ sleep sleep_time
232
232
  sin.puts "LINE #{ i }"
233
233
  end
234
234
  end
@@ -253,8 +253,8 @@ eum fugiat quo voluptas nulla pariatur?"
253
253
  lines1 << line.strip
254
254
  end
255
255
  end
256
-
257
- lines2 = []
256
+
257
+ lines2 = []
258
258
  th2 = Thread.new do
259
259
  while line = stream5.gets
260
260
  lines2 << line.strip
@@ -281,7 +281,7 @@ eum fugiat quo voluptas nulla pariatur?"
281
281
  assert_equal('j', Misc.string2hash("a=b#c=d#:h='j'")[:h])
282
282
  assert_equal(:j, Misc.string2hash("a=b#c=d#:h=:j")[:h])
283
283
  end
284
-
284
+
285
285
  def test_named_array
286
286
  a = NamedArray.setup([1,2,3,4], %w(a b c d))
287
287
  assert_equal(1, a['a'])
@@ -297,16 +297,16 @@ eum fugiat quo voluptas nulla pariatur?"
297
297
 
298
298
  hash = {:a => 1}
299
299
  assert_equal hash, Misc.string2hash(Misc.hash2string(hash))
300
-
300
+
301
301
  hash = {:a => true}
302
302
  assert_equal hash, Misc.string2hash(Misc.hash2string(hash))
303
303
 
304
304
  hash = {:a => :b}
305
305
  assert_equal hash, Misc.string2hash(Misc.hash2string(hash))
306
-
306
+
307
307
  hash = {:a => /test/}
308
308
  assert_equal({}, Misc.string2hash(Misc.hash2string(hash)))
309
-
309
+
310
310
  end
311
311
 
312
312
  def test_merge
@@ -331,8 +331,8 @@ eum fugiat quo voluptas nulla pariatur?"
331
331
  TmpFile.with_file do |tmpfile|
332
332
  pids = []
333
333
  4.times do |i|
334
- pids << Process.fork do
335
- status = Misc.lock(tmpfile) do
334
+ pids << Process.fork do
335
+ status = Misc.lock(tmpfile) do
336
336
  pid = Process.pid.to_s
337
337
  Open.write(tmpfile, pid)
338
338
  sleep rand * 1
@@ -419,7 +419,7 @@ eum fugiat quo voluptas nulla pariatur?"
419
419
  end
420
420
 
421
421
  def test_fingerprint
422
- assert_equal '{a=>1}', Misc.fingerprint({:a => 1})
422
+ assert_equal '{:a=>1}', Misc.fingerprint({:a => 1})
423
423
  end
424
424
 
425
425
  def test_tarize
@@ -530,4 +530,21 @@ eum fugiat quo voluptas nulla pariatur?"
530
530
  assert Misc.match_value("15", [14, 15, 25])
531
531
  assert ! Misc.match_value("15", [14, 25])
532
532
  end
533
+
534
+ def __test_bench_log
535
+ Log.severity = 1
536
+ Misc.benchmark(1000) do
537
+ Log.info { "Hola" }
538
+ end
539
+ Misc.benchmark(1000) do
540
+ Log.debug { "Hola" }
541
+ end
542
+ Misc.benchmark(1000) do
543
+ Log.debug "Hola"
544
+ end
545
+ p = Misc.pipe
546
+ Misc.benchmark(1000) do
547
+ Log.debug "Hola #{[p.first.inspect, p.last.inspect] * "=>"}"
548
+ end
549
+ end
533
550
  end
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.20.26
4
+ version: 5.21.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: 2016-07-21 00:00:00.000000000 Z
11
+ date: 2016-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -222,6 +222,7 @@ files:
222
222
  - lib/rbbt/rest/client.rb
223
223
  - lib/rbbt/rest/client/adaptor.rb
224
224
  - lib/rbbt/rest/client/get.rb
225
+ - lib/rbbt/rest/client/run.rb
225
226
  - lib/rbbt/rest/client/step.rb
226
227
  - lib/rbbt/tsv.rb
227
228
  - lib/rbbt/tsv/accessor.rb
@@ -481,82 +482,82 @@ signing_key:
481
482
  specification_version: 4
482
483
  summary: Utilities for the Ruby Bioinformatics Toolkit (rbbt)
483
484
  test_files:
484
- - test/rbbt/test_workflow.rb
485
+ - test/test_helper.rb
485
486
  - test/rbbt/resource/test_path.rb
486
- - test/rbbt/util/test_cmd.rb
487
- - test/rbbt/util/simpleopt/test_setup.rb
488
- - test/rbbt/util/simpleopt/test_get.rb
489
- - test/rbbt/util/simpleopt/test_parse.rb
490
- - test/rbbt/util/test_chain_methods.rb
491
- - test/rbbt/util/test_simpleDSL.rb
487
+ - test/rbbt/association/test_item.rb
488
+ - test/rbbt/association/test_database.rb
489
+ - test/rbbt/association/test_open.rb
490
+ - test/rbbt/association/test_index.rb
491
+ - test/rbbt/association/test_util.rb
492
+ - test/rbbt/util/test_concurrency.rb
492
493
  - test/rbbt/util/test_log.rb
494
+ - test/rbbt/util/test_chain_methods.rb
495
+ - test/rbbt/util/test_simpleopt.rb
496
+ - test/rbbt/util/simpleopt/test_parse.rb
497
+ - test/rbbt/util/simpleopt/test_get.rb
498
+ - test/rbbt/util/simpleopt/test_setup.rb
499
+ - test/rbbt/util/test_cmd.rb
500
+ - test/rbbt/util/test_semaphore.rb
501
+ - test/rbbt/util/concurrency/test_threads.rb
502
+ - test/rbbt/util/concurrency/processes/test_socket.rb
503
+ - test/rbbt/util/concurrency/test_processes.rb
504
+ - test/rbbt/util/test_tmpfile.rb
493
505
  - test/rbbt/util/test_open.rb
506
+ - test/rbbt/util/test_filecache.rb
507
+ - test/rbbt/util/R/test_eval.rb
508
+ - test/rbbt/util/R/test_model.rb
509
+ - test/rbbt/util/test_simpleDSL.rb
510
+ - test/rbbt/util/log/test_progress.rb
511
+ - test/rbbt/util/test_colorize.rb
512
+ - test/rbbt/util/test_R.rb
494
513
  - test/rbbt/util/misc/test_lock.rb
495
- - test/rbbt/util/misc/test_multipart_payload.rb
496
- - test/rbbt/util/misc/test_bgzf.rb
497
514
  - test/rbbt/util/misc/test_pipes.rb
515
+ - test/rbbt/util/misc/test_bgzf.rb
498
516
  - test/rbbt/util/misc/test_omics.rb
499
- - test/rbbt/util/test_concurrency.rb
500
- - test/rbbt/util/test_R.rb
501
- - test/rbbt/util/log/test_progress.rb
502
- - test/rbbt/util/test_colorize.rb
503
- - test/rbbt/util/test_simpleopt.rb
517
+ - test/rbbt/util/misc/test_multipart_payload.rb
504
518
  - test/rbbt/util/test_excel2tsv.rb
505
- - test/rbbt/util/test_filecache.rb
506
- - test/rbbt/util/concurrency/test_processes.rb
507
- - test/rbbt/util/concurrency/test_threads.rb
508
- - test/rbbt/util/concurrency/processes/test_socket.rb
509
- - test/rbbt/util/test_semaphore.rb
510
519
  - test/rbbt/util/test_misc.rb
511
- - test/rbbt/util/test_tmpfile.rb
512
- - test/rbbt/util/R/test_model.rb
513
- - test/rbbt/util/R/test_eval.rb
514
- - test/rbbt/test_packed_index.rb
515
- - test/rbbt/entity/test_identifiers.rb
516
- - test/rbbt/test_association.rb
517
- - test/rbbt/knowledge_base/test_traverse.rb
518
- - test/rbbt/knowledge_base/test_registry.rb
519
- - test/rbbt/knowledge_base/test_entity.rb
520
- - test/rbbt/knowledge_base/test_enrichment.rb
521
- - test/rbbt/knowledge_base/test_syndicate.rb
522
- - test/rbbt/knowledge_base/test_query.rb
523
- - test/rbbt/test_resource.rb
524
520
  - test/rbbt/test_entity.rb
525
- - test/rbbt/test_knowledge_base.rb
526
- - test/rbbt/annotations/test_util.rb
527
- - test/rbbt/association/test_index.rb
528
- - test/rbbt/association/test_item.rb
529
- - test/rbbt/association/test_open.rb
530
- - test/rbbt/association/test_util.rb
531
- - test/rbbt/association/test_database.rb
532
- - test/rbbt/test_tsv.rb
533
521
  - test/rbbt/workflow/step/test_dependencies.rb
534
- - test/rbbt/workflow/test_task.rb
535
- - test/rbbt/workflow/test_step.rb
536
522
  - test/rbbt/workflow/test_doc.rb
537
- - test/rbbt/test_monitor.rb
538
- - test/rbbt/test_persist.rb
539
- - test/rbbt/test_annotations.rb
540
- - test/rbbt/persist/test_tsv.rb
541
- - test/rbbt/persist/tsv/test_lmdb.rb
542
- - test/rbbt/persist/tsv/test_kyotocabinet.rb
543
- - test/rbbt/persist/tsv/test_sharder.rb
544
- - test/rbbt/persist/tsv/test_cdb.rb
545
- - test/rbbt/persist/tsv/test_tokyocabinet.rb
546
- - test/rbbt/persist/tsv/test_leveldb.rb
547
- - test/rbbt/tsv/test_field_index.rb
523
+ - test/rbbt/workflow/test_step.rb
524
+ - test/rbbt/workflow/test_task.rb
525
+ - test/rbbt/test_association.rb
526
+ - test/rbbt/test_knowledge_base.rb
527
+ - test/rbbt/tsv/parallel/test_traverse.rb
528
+ - test/rbbt/tsv/parallel/test_through.rb
548
529
  - test/rbbt/tsv/test_parallel.rb
549
- - test/rbbt/tsv/test_index.rb
550
- - test/rbbt/tsv/test_matrix.rb
530
+ - test/rbbt/tsv/test_accessor.rb
551
531
  - test/rbbt/tsv/test_change_id.rb
552
- - test/rbbt/tsv/test_parser.rb
553
532
  - test/rbbt/tsv/test_stream.rb
554
- - test/rbbt/tsv/test_util.rb
555
- - test/rbbt/tsv/test_accessor.rb
556
533
  - test/rbbt/tsv/test_filter.rb
534
+ - test/rbbt/tsv/test_matrix.rb
557
535
  - test/rbbt/tsv/test_attach.rb
558
536
  - test/rbbt/tsv/test_manipulate.rb
559
- - test/rbbt/tsv/parallel/test_through.rb
560
- - test/rbbt/tsv/parallel/test_traverse.rb
537
+ - test/rbbt/tsv/test_field_index.rb
538
+ - test/rbbt/tsv/test_index.rb
539
+ - test/rbbt/tsv/test_util.rb
540
+ - test/rbbt/tsv/test_parser.rb
541
+ - test/rbbt/test_packed_index.rb
542
+ - test/rbbt/test_persist.rb
561
543
  - test/rbbt/test_fix_width_table.rb
562
- - test/test_helper.rb
544
+ - test/rbbt/knowledge_base/test_traverse.rb
545
+ - test/rbbt/knowledge_base/test_entity.rb
546
+ - test/rbbt/knowledge_base/test_query.rb
547
+ - test/rbbt/knowledge_base/test_enrichment.rb
548
+ - test/rbbt/knowledge_base/test_syndicate.rb
549
+ - test/rbbt/knowledge_base/test_registry.rb
550
+ - test/rbbt/entity/test_identifiers.rb
551
+ - test/rbbt/test_monitor.rb
552
+ - test/rbbt/test_workflow.rb
553
+ - test/rbbt/test_annotations.rb
554
+ - test/rbbt/annotations/test_util.rb
555
+ - test/rbbt/test_resource.rb
556
+ - test/rbbt/persist/tsv/test_tokyocabinet.rb
557
+ - test/rbbt/persist/tsv/test_kyotocabinet.rb
558
+ - test/rbbt/persist/tsv/test_lmdb.rb
559
+ - test/rbbt/persist/tsv/test_leveldb.rb
560
+ - test/rbbt/persist/tsv/test_cdb.rb
561
+ - test/rbbt/persist/tsv/test_sharder.rb
562
+ - test/rbbt/persist/test_tsv.rb
563
+ - test/rbbt/test_tsv.rb