rbbt-util 5.28.5 → 5.28.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/entity.rb +1 -1
  3. data/lib/rbbt/fix_width_table.rb +5 -4
  4. data/lib/rbbt/persist.rb +1 -0
  5. data/lib/rbbt/persist/tsv/adapter.rb +0 -1
  6. data/lib/rbbt/persist/tsv/fix_width_table.rb +5 -3
  7. data/lib/rbbt/tsv/accessor.rb +10 -2
  8. data/lib/rbbt/tsv/dumper.rb +14 -2
  9. data/lib/rbbt/tsv/parallel/traverse.rb +3 -0
  10. data/lib/rbbt/tsv/util.rb +5 -1
  11. data/lib/rbbt/util/cmd.rb +1 -0
  12. data/lib/rbbt/util/config.rb +2 -1
  13. data/lib/rbbt/util/misc/bgzf.rb +1 -1
  14. data/lib/rbbt/util/misc/inspect.rb +1 -1
  15. data/lib/rbbt/util/misc/system.rb +1 -1
  16. data/lib/rbbt/util/named_array.rb +1 -1
  17. data/lib/rbbt/util/open.rb +18 -17
  18. data/lib/rbbt/workflow.rb +1 -0
  19. data/lib/rbbt/workflow/accessor.rb +94 -93
  20. data/lib/rbbt/workflow/definition.rb +8 -4
  21. data/lib/rbbt/workflow/integration/ansible.rb +53 -0
  22. data/lib/rbbt/workflow/integration/ansible/workflow.rb +60 -0
  23. data/lib/rbbt/workflow/remote_workflow/driver/rest.rb +5 -1
  24. data/lib/rbbt/workflow/step.rb +22 -5
  25. data/lib/rbbt/workflow/step/accessor.rb +7 -5
  26. data/lib/rbbt/workflow/usage.rb +1 -1
  27. data/lib/rbbt/workflow/util/archive.rb +3 -0
  28. data/lib/rbbt/workflow/util/orchestrator.rb +228 -0
  29. data/lib/rbbt/workflow/util/trace.rb +182 -0
  30. data/share/rbbt_commands/ansible +55 -0
  31. data/share/rbbt_commands/purge_job +2 -5
  32. data/share/rbbt_commands/system/status +1 -1
  33. data/share/rbbt_commands/workflow/forget_deps +10 -3
  34. data/share/rbbt_commands/workflow/server +2 -0
  35. data/test/rbbt/association/test_index.rb +6 -6
  36. data/test/rbbt/knowledge_base/test_query.rb +3 -3
  37. data/test/rbbt/knowledge_base/test_registry.rb +1 -1
  38. data/test/rbbt/persist/tsv/test_cdb.rb +0 -7
  39. data/test/rbbt/persist/tsv/test_kyotocabinet.rb +2 -8
  40. data/test/rbbt/persist/tsv/test_leveldb.rb +0 -6
  41. data/test/rbbt/persist/tsv/test_lmdb.rb +0 -6
  42. data/test/rbbt/persist/tsv/test_tokyocabinet.rb +15 -14
  43. data/test/rbbt/test_entity.rb +0 -1
  44. data/test/rbbt/test_knowledge_base.rb +3 -4
  45. data/test/rbbt/test_persist.rb +10 -6
  46. data/test/rbbt/test_workflow.rb +17 -16
  47. data/test/rbbt/tsv/parallel/test_traverse.rb +14 -0
  48. data/test/rbbt/tsv/test_accessor.rb +11 -0
  49. data/test/rbbt/tsv/test_attach.rb +0 -2
  50. data/test/rbbt/tsv/test_index.rb +6 -7
  51. data/test/rbbt/tsv/test_manipulate.rb +22 -3
  52. data/test/rbbt/util/R/test_model.rb +2 -1
  53. data/test/rbbt/util/R/test_plot.rb +0 -2
  54. data/test/rbbt/util/concurrency/test_processes.rb +1 -1
  55. data/test/rbbt/util/misc/test_bgzf.rb +11 -7
  56. data/test/rbbt/util/misc/test_lock.rb +0 -1
  57. data/test/rbbt/util/misc/test_multipart_payload.rb +1 -1
  58. data/test/rbbt/util/misc/test_pipes.rb +0 -5
  59. data/test/rbbt/util/test_R.rb +1 -0
  60. data/test/rbbt/util/test_log.rb +4 -6
  61. data/test/rbbt/util/test_misc.rb +0 -2
  62. data/test/rbbt/util/test_open.rb +0 -1
  63. data/test/rbbt/util/test_python.rb +17 -1
  64. data/test/rbbt/workflow/test_remote_workflow.rb +1 -1
  65. data/test/rbbt/workflow/test_schedule.rb +0 -0
  66. data/test/rbbt/workflow/test_step.rb +8 -3
  67. data/test/rbbt/workflow/util/test_orchestrator.rb +273 -0
  68. metadata +11 -5
  69. data/lib/rbbt/workflow/schedule.rb +0 -238
  70. data/test/rbbt/workflow/remote/test_client.rb +0 -56
@@ -0,0 +1,182 @@
1
+ require 'rbbt/util/R'
2
+
3
+ module Workflow
4
+ def self.trace(seed_jobs, options = {})
5
+
6
+ jobs = []
7
+ seed_jobs.each{|j| jobs << j; jobs += j.rec_dependencies}
8
+
9
+ data = TSV.setup({}, "Job~Workflow,Task,Start,End#:type=:list")
10
+ min_start = nil
11
+ max_done = nil
12
+ jobs.each do |job|
13
+ next unless job.info[:done]
14
+ started = job.info[:started]
15
+ ddone = job.info[:done]
16
+
17
+ code = [job.workflow, job.task_name].compact.collect{|s| s.to_s} * "."
18
+ code = code + '.' + job.name
19
+
20
+ data[code] = [job.workflow.to_s, job.task_name, started, ddone]
21
+ if min_start.nil?
22
+ min_start = started
23
+ else
24
+ min_start = started if started < min_start
25
+ end
26
+
27
+ if max_done.nil?
28
+ max_done = ddone
29
+ else
30
+ max_done = ddone if ddone > max_done
31
+ end
32
+ end
33
+
34
+ data.add_field "Start.second" do |k,value|
35
+ value["Start"] - min_start
36
+ end
37
+
38
+ data.add_field "End.second" do |k,value|
39
+ value["End"] - min_start
40
+ end
41
+
42
+ if options[:fix_gap]
43
+ ranges = []
44
+ data.through do |k,values|
45
+ start, eend = values.values_at "Start.second", "End.second"
46
+
47
+ ranges << (start..eend)
48
+ end
49
+
50
+ gaps = {}
51
+ last = nil
52
+ Misc.collapse_ranges(ranges).each do |range|
53
+ start = range.begin
54
+ eend = range.end
55
+ if last
56
+ gaps[last] = start - last
57
+ end
58
+ last = eend
59
+ end
60
+
61
+ data.process "End.second" do |value,k,values|
62
+ gap = Misc.sum(gaps.select{|pos,size| pos < values["Start.second"]}.collect{|pos,size| size})
63
+ value - gap
64
+ end
65
+
66
+ data.process "Start.second" do |value,k,values|
67
+ gap = Misc.sum(gaps.select{|pos,size| pos < values["Start.second"]}.collect{|pos,size| size})
68
+ value - gap
69
+ end
70
+ end
71
+
72
+ tasks_info = {}
73
+
74
+ jobs.each do |dep|
75
+ next unless dep.info[:done]
76
+ task = [dep.workflow, dep.task_name].compact.collect{|s| s.to_s} * "#"
77
+ info = tasks_info[task] ||= {}
78
+
79
+ time = dep.info[:done] - dep.info[:started]
80
+ info[:time] ||= []
81
+ info[:time] << time
82
+
83
+ cpus = nil
84
+ spark = false
85
+ shard = false
86
+ dep.info[:config_keys].select do |kinfo|
87
+ key, value, tokens = kinfo
88
+ key = key.to_s
89
+ cpus = value if key.include? 'cpu'
90
+ spark = value if key == 'spark'
91
+ shard = value if key == 'shard'
92
+ end
93
+
94
+ info[:cpus] = cpus || 1
95
+ info[:spark] = spark
96
+ info[:shard] = shard
97
+ end
98
+
99
+ stats = TSV.setup({}, "Task~Calls,Avg. Time,Total Time,Cpus,Spark,Shard#:type=:list")
100
+
101
+ tasks_info.each do |task, info|
102
+ time_lists, cpus, spark, shard = info.values_at :time, :cpus, :spark, :shard
103
+ avg_time = Misc.mean(time_lists)
104
+ total_time = Misc.sum(time_lists)
105
+ calls = time_lists.length
106
+ stats[task] = [calls, avg_time, total_time, cpus, spark, shard]
107
+ end
108
+
109
+ raise "No jobs to process" if data.size == 0
110
+
111
+ start = data.column("Start.second").values.flatten.collect{|v| v.to_f}.min
112
+ eend = data.column("End.second").values.flatten.collect{|v| v.to_f}.max
113
+ total = eend - start
114
+ Log.info "Total time elapsed: #{total} seconds"
115
+
116
+ if options[:fix_gap]
117
+ total_gaps = Misc.sum(gaps.collect{|k,v| v})
118
+ Log.info "Total gaps: #{total_gaps} seconds"
119
+ end
120
+
121
+ plot, width, height = options.values_at :plot, :width, :height
122
+ if plot
123
+ data.R <<-EOF, [:svg]
124
+ rbbt.require('tidyverse')
125
+ rbbt.require('ggplot2')
126
+
127
+ names(data) <- make.names(names(data))
128
+ data$id = rownames(data)
129
+ data$content = data$Task
130
+ data$start = data$Start
131
+ data$end = data$End
132
+ data$Project = data$Workflow
133
+
134
+ tasks = data
135
+
136
+ #theme_gantt <- function(base_size=11, base_family="Source Sans Pro Light") {
137
+ theme_gantt <- function(base_size=11, base_family="Sans Serif") {
138
+ ret <- theme_bw(base_size, base_family) %+replace%
139
+ theme(panel.background = element_rect(fill="#ffffff", colour=NA),
140
+ axis.title.x=element_text(vjust=-0.2), axis.title.y=element_text(vjust=1.5),
141
+ title=element_text(vjust=1.2, family="Source Sans Pro Semibold"),
142
+ panel.border = element_blank(), axis.line=element_blank(),
143
+ panel.grid.minor=element_blank(),
144
+ panel.grid.major.y = element_blank(),
145
+ panel.grid.major.x = element_line(size=0.5, colour="grey80"),
146
+ axis.ticks=element_blank(),
147
+ legend.position="bottom",
148
+ axis.title=element_text(size=rel(1.2), family="Source Sans Pro Semibold"),
149
+ strip.text=element_text(size=rel(1.5), family="Source Sans Pro Semibold"),
150
+ strip.background=element_rect(fill="#ffffff", colour=NA),
151
+ panel.spacing.y=unit(1.5, "lines"),
152
+ legend.key = element_blank())
153
+
154
+ ret
155
+ }
156
+
157
+ tasks.long <- tasks %>%
158
+ gather(date.type, task.date, -c(Project, Task, id, Start.second, End.second)) %>%
159
+ arrange(date.type, task.date) %>%
160
+ mutate(id = factor(id, levels=rev(unique(id)), ordered=TRUE))
161
+
162
+ x.breaks <- seq(length(tasks$Task) + 0.5 - 3, 0, by=-3)
163
+
164
+ timeline <- ggplot(tasks.long, aes(y=id, yend=id, x=Start.second, xend=End.second, colour=Task)) +
165
+ geom_segment() +
166
+ geom_vline(xintercept=x.breaks, colour="grey80", linetype="dotted") +
167
+ guides(colour=guide_legend(title=NULL)) +
168
+ labs(x=NULL, y=NULL) +
169
+ theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1))
170
+
171
+ rbbt.png_plot('#{plot}', 'plot(timeline)', width=#{width}, height=#{height}, pointsize=6)
172
+ EOF
173
+ end
174
+
175
+ if options[:plot_data]
176
+ data
177
+ else
178
+ stats
179
+ end
180
+
181
+ end
182
+ end
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt-util'
4
+ require 'rbbt/util/simpleopt'
5
+
6
+ $0 = "rbbt #{$previous_commands*" "} #{ File.basename(__FILE__) }" if $previous_commands
7
+
8
+ options = SOPT.setup <<EOF
9
+
10
+ Run ansible
11
+
12
+ $ #{$0} [options] <rules.yml|->
13
+
14
+ Use - to read from STDIN
15
+
16
+ -h--help Print this help
17
+ -dr--dry_run Only print the playbook
18
+ -H--hosts* hosts to run it on
19
+ EOF
20
+ if options[:help]
21
+ if defined? rbbt_usage
22
+ rbbt_usage
23
+ else
24
+ puts SOPT.doc
25
+ end
26
+ exit 0
27
+ end
28
+
29
+ require 'rbbt/workflow/integration/ansible'
30
+
31
+ playbook, task = ARGV
32
+ playbook_file = Rbbt.share.ansible["test.yaml"].find if playbook.nil?
33
+
34
+ dry_run = options.delete :dry_run
35
+
36
+ if ! Misc.filename?(playbook_file)
37
+ playbook_file = Rbbt.share.ansible.glob(playbook + ".*").first
38
+ end
39
+
40
+ if ! Misc.filename?(playbook_file)
41
+ recipe = Rbbt.share.recipes.glob(playbook + ".*").first
42
+ playbook_file = Ansible.playbook recipe, task, options
43
+ end
44
+
45
+
46
+ if dry_run
47
+ if Hash === playbook_file
48
+ ppp playbook_file.to_yaml
49
+ else
50
+ ppp Log.color :magenta, playbook_file
51
+ ppp Open.read(playbook_file)
52
+ end
53
+ else
54
+ Ansible.play playbook_file
55
+ end
@@ -3,7 +3,6 @@
3
3
  require 'rbbt-util'
4
4
  require 'rbbt/util/simpleopt'
5
5
  require 'rbbt/workflow'
6
- require 'rbbt/workflow/remote/ssh/get'
7
6
 
8
7
  $0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
9
8
 
@@ -14,9 +13,7 @@ Remove a job and its dependencies
14
13
  $ rbbt purge [options] <job_path>
15
14
 
16
15
  -h--help Print this help
17
- -t--test Do a verbose dry run
18
- -r--relocate Include relocated dependencies
19
-
16
+ -r--recursive Remove recursively
20
17
  EOF
21
18
  if options[:help]
22
19
  if defined? rbbt_usage
@@ -31,4 +28,4 @@ path, search_path, _sep, *other = ARGV
31
28
 
32
29
  raise ParameterException, "No path given" if path.nil?
33
30
 
34
- Step.purge(path, options[:relocate])
31
+ Step.purge(path, options[:recursive])
@@ -201,7 +201,7 @@ workflows.sort.each do |workflow,tasks|
201
201
  Step::INFO_SERIALIZER.load(f)
202
202
  end
203
203
  rescue
204
- Log.exception $!
204
+ #Log.exception $!
205
205
  {:status => :noinfo}
206
206
  end
207
207
  IndiferentHash.setup(info)
@@ -13,6 +13,8 @@ Make a job forget all its dependencies and archive their meta-data
13
13
  $ #{$0} [options] <job_path>
14
14
 
15
15
  -h--help Print this help
16
+ -p--purge Purge dependencies
17
+ -r--recursive_purge Purge dependencies recursively
16
18
 
17
19
  EOF
18
20
  if options[:help]
@@ -29,8 +31,13 @@ path = ARGV[0]
29
31
  raise ParameterException, "No path given" if path.nil?
30
32
  step = Workflow.load_step path
31
33
 
32
-
33
- iif step.rec_dependencies
34
-
35
34
  step.archive_deps
35
+ step.copy_files_dir
36
+ dependencies = step.dependencies
36
37
  step.set_info :dependencies, []
38
+
39
+ if options[:purge]
40
+ dependencies.each do |dependency|
41
+ Step.purge(dependency.path, options[:recursive_purge])
42
+ end
43
+ end
@@ -25,6 +25,7 @@ $ rbbt workflow server [options] <Workflow>
25
25
  --stream Activate streaming of workflow tasks
26
26
  -fs--file_server Activate file serving for resources
27
27
  -mj--monitor_jobs Monitor jobs (UNSAFE)
28
+ -a--app_dir* Application execution directory
28
29
  --export_all Export all workflow tasks (use with caution!)
29
30
  --export* Export workflow tasks (asynchronous)
30
31
  --export_asynchronous* Export workflow tasks as asynchronous
@@ -74,6 +75,7 @@ sync_exports = options[:export_synchronous].split(/\s*,/) if options[:export_syn
74
75
  exec_exports = options[:export_exec].split(/\s*,/) if options[:export_exec]
75
76
 
76
77
  TmpFile.with_file do |app_dir|
78
+ app_dir = options[:app_dir] if options[:app_dir]
77
79
  Misc.in_dir(app_dir) do
78
80
  app_dir = Path.setup(app_dir.dup)
79
81
  Open.write(app_dir.etc.target_workflow.find, workflow)
@@ -73,21 +73,21 @@ TP53 NFKB1|GLI1 activation|activation true|true
73
73
 
74
74
  def test_index_flat
75
75
  require 'rbbt/sources/tfacts'
76
- file = TFacts.regulators
76
+ file = TFactS.regulators
77
77
  tsv = Association.index(file, :type => :flat, :source => "Transcription Factor Associated Gene Name=~Associated Gene Name", :merge => true)
78
78
  assert tsv.match("TP53").length > 10
79
79
  end
80
80
 
81
81
  def test_index_flat_to_matrix
82
82
  require 'rbbt/sources/tfacts'
83
- file = TFacts.regulators
83
+ file = TFactS.regulators
84
84
  tsv = Association.index(file, :type => :flat, :source => "Transcription Factor Associated Gene Name=~Associated Gene Name", :merge => true)
85
85
  assert(tsv.to_matrix(false))
86
86
  end
87
87
 
88
88
  def test_filter_no_block
89
89
  require 'rbbt/sources/tfacts'
90
- file = TFacts.regulators
90
+ file = TFactS.regulators
91
91
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
92
92
  tsv.unnamed = false
93
93
  matches = tsv.filter :directed?
@@ -96,7 +96,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
96
96
 
97
97
  def test_filter_no_block_value
98
98
  require 'rbbt/sources/tfacts'
99
- file = TFacts.regulators
99
+ file = TFactS.regulators
100
100
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
101
101
  tsv.unnamed = false
102
102
  matches = tsv.filter :Effect, "inhibition"
@@ -105,7 +105,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
105
105
 
106
106
  def test_filter_block_value_field
107
107
  require 'rbbt/sources/tfacts'
108
- file = TFacts.regulators
108
+ file = TFactS.regulators
109
109
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
110
110
  tsv.unnamed = false
111
111
  matches = tsv.filter :Effect do |value|
@@ -116,7 +116,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
116
116
 
117
117
  def test_filter_block_no_value_field
118
118
  require 'rbbt/sources/tfacts'
119
- file = TFacts.regulators
119
+ file = TFactS.regulators
120
120
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
121
121
  tsv.unnamed = false
122
122
  matches = tsv.filter do |key,values|
@@ -22,7 +22,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
22
22
  :namespace => "Hsa"
23
23
  }
24
24
 
25
- EFFECT_TSV = TSV.open EFFECT, EFFECT_OPTIONS.dup
25
+ EFFECT_TSV = TSV.open EFFECT, EFFECT_OPTIONS.dup
26
26
 
27
27
  KNOWLEDGE_BASE = KnowledgeBase.new Rbbt.tmp.test.kb_foo2, "Hsa"
28
28
  KNOWLEDGE_BASE.format = {"Gene" => "Ensembl Gene ID"}
@@ -34,11 +34,11 @@ TP53 NFKB1|GLI1 activation|activation true|true
34
34
  assert_equal 6, KNOWLEDGE_BASE.subset(:effects, :all).length
35
35
 
36
36
  assert_equal 4, KNOWLEDGE_BASE.subset(:effects, :all).target_entity.uniq.length
37
- assert_equal %w(Effect), KNOWLEDGE_BASE.subset(:effects, :all).info.first.keys
37
+ assert_equal %w(Effect), KNOWLEDGE_BASE.subset(:effects, :all).info.first.keys
38
38
  end
39
39
  end
40
40
 
41
- def test_subset_all_persist_format
41
+ def _test_subset_all_persist_format
42
42
  assert KNOWLEDGE_BASE.subset(:effects, :all).target_entity.reject{|e| e =~ /^ENS/}.empty?
43
43
  end
44
44
 
@@ -45,7 +45,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
45
45
 
46
46
  def test_index_flat
47
47
  require 'rbbt/sources/tfacts'
48
- file = TFacts.regulators
48
+ file = TFactS.regulators
49
49
  KNOWLEDGE_BASE.register :tfacts, file, :type => :flat, :source => "Transcription Factor Associated Gene Name=~Associated Gene Name", :merge => true
50
50
  assert KNOWLEDGE_BASE.subset(:tfacts, :source => ["TP53"], :target => :all).length > 10
51
51
  end
@@ -4,19 +4,12 @@ require 'rbbt/annotations'
4
4
  require 'rbbt/util/tmpfile'
5
5
  require 'test/unit'
6
6
 
7
- module TestAnnotation
8
- extend Annotation
9
-
10
- self.annotation :test_annotation
11
- end
12
-
13
7
  class TestPersistTSVCDB < Test::Unit::TestCase
14
8
 
15
9
  if Persist.respond_to? :open_cbd
16
10
  def test_organism
17
11
  require 'rbbt/sources/organism'
18
12
  TmpFile.with_file nil do |tmp_file|
19
- file = CMD.cmd("head -n 1000000", :in => Organism.identifiers("Hsa").open, :pipe => true)
20
13
  tsv = Organism.identifiers("Hsa").tsv(:key_field => "Associated Gene Name", :fields => ["Ensembl Gene ID"], :type => :single, :persist => true, :persist_engine => "CDB", :persist_dir => tmp_file)
21
14
  assert_equal "ENSG00000141510", tsv["TP53"]
22
15
  end
@@ -5,15 +5,9 @@ require 'rbbt/annotations'
5
5
  require 'rbbt/util/tmpfile'
6
6
  require 'test/unit'
7
7
 
8
- module TestAnnotation
9
- extend Annotation
10
-
11
- self.annotation :test_annotation
12
- end
13
-
14
8
  class TestPersistTSVKC < Test::Unit::TestCase
15
9
  if Persist.respond_to? :open_kyotocabinet
16
- def _test_organism_kch
10
+ def test_organism_kch
17
11
  require 'rbbt/sources/organism'
18
12
  TmpFile.with_file do |tmp_file|
19
13
  tsv = Organism.identifiers("Hsa").tsv :key_field => "Associated Gene Name", :fields => ["Ensembl Gene ID"], :type => :single, :persist => true, :persist_engine => "kch", :persist_dir => tmp_file
@@ -22,7 +16,7 @@ class TestPersistTSVKC < Test::Unit::TestCase
22
16
  end
23
17
 
24
18
 
25
- def _test_organism_kct
19
+ def test_organism_kct
26
20
  require 'rbbt/sources/organism'
27
21
  TmpFile.with_file do |tmp_file|
28
22
  tsv = Organism.identifiers("Hsa").tsv :key_field => "Associated Gene Name", :fields => ["Ensembl Gene ID"], :type => :single, :persist => true, :persist_engine => "kct", :persist_dir => tmp_file
@@ -4,12 +4,6 @@ require 'rbbt/annotations'
4
4
  require 'rbbt/util/tmpfile'
5
5
  require 'test/unit'
6
6
 
7
- module TestAnnotation
8
- extend Annotation
9
-
10
- self.annotation :test_annotation
11
- end
12
-
13
7
  class TestPersistTSVLevelDB < Test::Unit::TestCase
14
8
 
15
9
  if Persist.respond_to? :open_leveldb