rbbt-util 3.2.1 → 4.0.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.
Files changed (85) hide show
  1. data/README.rdoc +65 -0
  2. data/bin/run_workflow.rb +142 -69
  3. data/lib/rbbt-util.rb +3 -3
  4. data/lib/rbbt.rb +12 -3
  5. data/lib/rbbt/annotations.rb +215 -0
  6. data/lib/rbbt/{util/fix_width_table.rb → fix_width_table.rb} +17 -13
  7. data/lib/rbbt/persist.rb +164 -0
  8. data/lib/rbbt/persist/tsv.rb +135 -0
  9. data/lib/rbbt/resource.rb +100 -0
  10. data/lib/rbbt/resource/path.rb +180 -0
  11. data/lib/rbbt/resource/rake.rb +48 -0
  12. data/lib/rbbt/resource/util.rb +111 -0
  13. data/lib/rbbt/resource/with_key.rb +28 -0
  14. data/lib/rbbt/tsv.rb +134 -0
  15. data/lib/rbbt/tsv/accessor.rb +345 -0
  16. data/lib/rbbt/tsv/attach.rb +183 -0
  17. data/lib/rbbt/tsv/attach/util.rb +277 -0
  18. data/lib/rbbt/{util/tsv/filters.rb → tsv/filter.rb} +76 -37
  19. data/lib/rbbt/tsv/index.rb +453 -0
  20. data/lib/rbbt/tsv/manipulate.rb +361 -0
  21. data/lib/rbbt/tsv/parser.rb +231 -0
  22. data/lib/rbbt/tsv/serializers.rb +79 -0
  23. data/lib/rbbt/tsv/util.rb +67 -0
  24. data/lib/rbbt/util/R.rb +3 -3
  25. data/lib/rbbt/util/chain_methods.rb +64 -0
  26. data/lib/rbbt/util/cmd.rb +17 -13
  27. data/lib/rbbt/util/excel2tsv.rb +4 -3
  28. data/lib/rbbt/util/log.rb +1 -0
  29. data/lib/rbbt/util/misc.rb +296 -285
  30. data/lib/rbbt/util/open.rb +9 -2
  31. data/lib/rbbt/util/persistence.rb +1 -1
  32. data/lib/rbbt/util/task/job.rb +3 -1
  33. data/lib/rbbt/workflow.rb +193 -0
  34. data/lib/rbbt/workflow/accessor.rb +249 -0
  35. data/lib/rbbt/workflow/annotate.rb +60 -0
  36. data/lib/rbbt/workflow/soap.rb +100 -0
  37. data/lib/rbbt/workflow/step.rb +102 -0
  38. data/lib/rbbt/workflow/task.rb +76 -0
  39. data/test/rbbt/resource/test_path.rb +12 -0
  40. data/test/rbbt/test_annotations.rb +106 -0
  41. data/test/rbbt/{util/test_fix_width_table.rb → test_fix_width_table.rb} +8 -9
  42. data/test/rbbt/test_resource.rb +66 -0
  43. data/test/rbbt/test_tsv.rb +332 -0
  44. data/test/rbbt/test_workflow.rb +102 -0
  45. data/test/rbbt/tsv/test_accessor.rb +163 -0
  46. data/test/rbbt/{util/tsv → tsv}/test_attach.rb +86 -43
  47. data/test/rbbt/{util/tsv/test_filters.rb → tsv/test_filter.rb} +31 -13
  48. data/test/rbbt/tsv/test_index.rb +284 -0
  49. data/test/rbbt/{util/tsv → tsv}/test_manipulate.rb +35 -105
  50. data/test/rbbt/util/test_R.rb +1 -1
  51. data/test/rbbt/util/test_chain_methods.rb +22 -0
  52. data/test/rbbt/util/test_filecache.rb +0 -1
  53. data/test/rbbt/util/test_misc.rb +97 -79
  54. data/test/rbbt/util/test_open.rb +1 -0
  55. data/test/rbbt/util/test_tmpfile.rb +1 -1
  56. data/test/rbbt/workflow/test_soap.rb +103 -0
  57. data/test/rbbt/workflow/test_step.rb +142 -0
  58. data/test/rbbt/workflow/test_task.rb +84 -0
  59. data/test/test_helper.rb +7 -7
  60. metadata +80 -54
  61. data/lib/rbbt/util/rake.rb +0 -176
  62. data/lib/rbbt/util/resource.rb +0 -355
  63. data/lib/rbbt/util/task.rb +0 -183
  64. data/lib/rbbt/util/tc_hash.rb +0 -324
  65. data/lib/rbbt/util/tsv.rb +0 -236
  66. data/lib/rbbt/util/tsv/accessor.rb +0 -312
  67. data/lib/rbbt/util/tsv/attach.rb +0 -416
  68. data/lib/rbbt/util/tsv/index.rb +0 -419
  69. data/lib/rbbt/util/tsv/manipulate.rb +0 -300
  70. data/lib/rbbt/util/tsv/misc.rb +0 -41
  71. data/lib/rbbt/util/tsv/parse.rb +0 -324
  72. data/lib/rbbt/util/tsv/resource.rb +0 -88
  73. data/lib/rbbt/util/workflow.rb +0 -135
  74. data/lib/rbbt/util/workflow/soap.rb +0 -116
  75. data/test/rbbt/util/test_persistence.rb +0 -201
  76. data/test/rbbt/util/test_rake.rb +0 -54
  77. data/test/rbbt/util/test_resource.rb +0 -77
  78. data/test/rbbt/util/test_task.rb +0 -133
  79. data/test/rbbt/util/test_tc_hash.rb +0 -144
  80. data/test/rbbt/util/test_tsv.rb +0 -221
  81. data/test/rbbt/util/test_workflow.rb +0 -135
  82. data/test/rbbt/util/tsv/test_accessor.rb +0 -150
  83. data/test/rbbt/util/tsv/test_index.rb +0 -241
  84. data/test/rbbt/util/tsv/test_parse.rb +0 -87
  85. data/test/rbbt/util/tsv/test_resource.rb +0 -9
@@ -1,135 +0,0 @@
1
- require 'rbbt/util/resource'
2
- require 'rbbt/util/task'
3
- require 'rbbt/util/persistence'
4
- require 'rbbt/util/misc'
5
-
6
- module WorkFlow
7
-
8
- def self.require_workflow(wf_name, wf_dir = nil)
9
-
10
- if File.exists? wf_name
11
- require "./workflow.rb"
12
- return
13
- end
14
-
15
- wf_dir ||= case
16
- when File.exists?(File.join(File.dirname(Resource.caller_lib_dir), wf_name))
17
- File.join(File.dirname(Resource.caller_lib_dir), wf_name)
18
- when defined? Rbbt
19
- if Rbbt.pkg.etc.workflow_dir.exists?
20
- File.join(pkg.etc.workflow_dir.read.strip, wf_name)
21
- else
22
- Rbbt.workflows[wf_name]
23
- end
24
- else
25
- File.join(ENV["HOME"], '.workflows')
26
- end
27
-
28
- wf_dir = Resource::Path.path(wf_dir)
29
- $LOAD_PATH.unshift(File.join(File.dirname(wf_dir["workflow.rb"].find), 'lib'))
30
- require wf_dir["workflow.rb"].find
31
- end
32
-
33
- def self.extended(base)
34
- class << base
35
- attr_accessor :tasks, :jobdir, :dangling_options, :dangling_option_descriptions,
36
- :dangling_option_types, :dangling_option_defaults, :dangling_dependencies, :last_task
37
- end
38
-
39
- base.extend Resource
40
- base.lib_dir = Resource.caller_base_dir if base.class == Object
41
- base.tasks = {}
42
- base.tasks.extend IndiferentHash
43
- base.jobdir = (File.exists?(base.var.find(:lib)) ? base.var.find(:lib) : base.var.find)
44
- base.clear_dangling
45
- end
46
-
47
- def tasks=(tasks)
48
- tasks.extend IndiferentHash
49
- @tasks = tasks
50
- end
51
-
52
- def local_persist(*args, &block)
53
- argsv = *args
54
- options = argsv.pop
55
- if Hash === options
56
- options.merge!(:persistence_dir => cache.find(:lib))
57
- argsv.push options
58
- else
59
- argsv.push options
60
- argsv.push({:persistence_dir => cache.find(:lib)})
61
- end
62
- Persistence.persist(*argsv, &block)
63
- end
64
-
65
- def clear_dangling
66
- @dangling_options = []
67
- @dangling_option_descriptions = {}
68
- @dangling_option_types = {}
69
- @dangling_option_defaults = {}
70
- @dangling_dependencies = nil
71
- @dangling_description = nil
72
- end
73
-
74
- def task_option(*args)
75
- name, description, type, default = *args
76
- @dangling_options << name if name
77
- @dangling_option_descriptions[name] = description if description
78
- @dangling_option_types[name] = type if type
79
- @dangling_option_defaults[name] = default if default
80
- end
81
-
82
- def task_dependencies(*dependencies)
83
- dependencies = dependencies.flatten
84
- @dangling_dependencies = dependencies.collect{|dep| Symbol === dep ? tasks[dep] : dep }
85
- end
86
-
87
- def task_description(description)
88
- @dangling_description = description
89
- end
90
-
91
- def process_dangling
92
- res = [
93
- @dangling_options,
94
- Misc.merge2hash(@dangling_options, @dangling_option_descriptions.values_at(*@dangling_options)),
95
- Misc.merge2hash(@dangling_options, @dangling_option_types.values_at(*@dangling_options)),
96
- Misc.merge2hash(@dangling_options, @dangling_option_defaults.values_at(*@dangling_options)),
97
- (@dangling_dependencies || [@last_task]).compact,
98
- @dangling_description,
99
- ]
100
-
101
- clear_dangling
102
- res
103
- end
104
-
105
- def task(name, &block)
106
- if Hash === name
107
- persistence = name.values.first
108
- name = name.keys.first
109
- else
110
- persistence = :marshal
111
- end
112
-
113
- options, option_descriptions, option_types, option_defaults, dependencies, description = process_dangling
114
- option_descriptions.delete_if do |k,v| v.nil? end
115
- option_types.delete_if do |k,v| v.nil? end
116
- option_defaults.delete_if do |k,v| v.nil? end
117
- task = Task.new name, persistence, options, option_descriptions, option_types, option_defaults, self, dependencies, self, description, &block
118
- tasks[name] = task
119
- @last_task = task
120
- end
121
-
122
- def job(task, jobname = "Default", *args)
123
- raise "Task '#{ task }' unkown" if tasks[task].nil?
124
- tasks[task].job(jobname, *args)
125
- end
126
-
127
- def run(*args)
128
- job(*args).run
129
- end
130
-
131
- def load_job(taskname, job_id)
132
- tasks[taskname].load(job_id)
133
- end
134
-
135
- end
@@ -1,116 +0,0 @@
1
- require 'simplews'
2
- require 'rbbt/util/workflow'
3
- require 'base64'
4
-
5
- class WorkFlowWS < SimpleWS
6
-
7
- def self.klass=(klass)
8
- @klass = klass
9
- end
10
-
11
- def self.klass
12
- @klass || self
13
- end
14
-
15
- def task(name)
16
- self.class.klass.tasks[name]
17
- end
18
-
19
- def export(name)
20
- task = self.class.klass.tasks[name]
21
-
22
- options, optional_options = task.option_summary
23
-
24
- desc task.description
25
- options.each do |option|
26
- param_desc option[:name] => option[:description] if option[:description]
27
- end
28
- param_desc :return => "Job Identifier"
29
- option_names = [:name] + options.collect{|option| option[:name]}
30
- option_types = Hash[*option_names.zip([ :string] + options.collect{|option| option[:type] || :string}).flatten]
31
- serve name, option_names, option_types do |*args|
32
- task(name).job(*args).fork.id
33
- end
34
- end
35
-
36
- param_desc :task => "Task name"
37
- param_desc :id => "Job id"
38
- serve :abort, %w(task id), {:return => false, :task => :string, :id => :string} do |task, id|
39
- task(task).load(id).abort
40
- nil
41
- end
42
-
43
- param_desc :task => "Task name"
44
- param_desc :id => "Job id"
45
- param_desc :return => "Info hash in yaml"
46
- serve :info, %w(task id), {:task => :string, :id => :string} do |task, id|
47
- Open.read(task(task).load(id).info_file)
48
- end
49
-
50
- param_desc :task => "Task name"
51
- param_desc :id => "Job id"
52
- param_desc :return => "Step"
53
- serve :step, %w(task id), {:task => :string, :id => :string} do |task, id|
54
- task(task).load(id).step.to_s
55
- end
56
-
57
- param_desc :task => "Task name"
58
- param_desc :id => "Job id"
59
- param_desc :return => "True if job is done (error or not)"
60
- serve :done, %w(task id), {:return => :boolean, :task => :string, :id => :string} do |task, id|
61
- task(task).load(id).done?
62
- end
63
-
64
- param_desc :task => "Task name"
65
- param_desc :id => "Job id"
66
- param_desc :return => "True if job finished with error. Error message is the last of the messages (see 'messages' method)."
67
- serve :error, %w(task id), {:return => :boolean, :task => :string, :id => :string} do |task, id|
68
- task(task).load(id).error?
69
- end
70
-
71
- param_desc :task => "Task name"
72
- param_desc :id => "Job id"
73
- param_desc :return => "Messages"
74
- serve :messages, %w(task id), {:return => :array, :task => :string, :id => :string} do |task, id|
75
- task(task).load(id).messages
76
- end
77
-
78
- param_desc :task => "Task name"
79
- param_desc :id => "Job id"
80
- param_desc :return => "Job result in Base64"
81
- serve :load, %w(task id), {:return => :binary, :task => :string, :id => :string} do |task, id|
82
- Base64.encode64(task(task).load(id).read)
83
- end
84
-
85
- param_desc :task => "Task name"
86
- param_desc :id => "Job id"
87
- param_desc :return => "File names"
88
- serve :files, %w(task id), {:return => :array, :task => :string, :id => :string} do |task, id|
89
- task(task).load(id).files
90
- end
91
-
92
- param_desc :task => "Task name"
93
- param_desc :id => "Job id"
94
- param_desc :file => "File name"
95
- param_desc :return => "File contents in Base64"
96
- serve :file, %w(task id file), {:return => :array, :task => :string, :id => :string, :file => :string} do |task, id|
97
- Base64.encode64(task(task).load(id).files(file).read)
98
- end
99
- end
100
-
101
-
102
- if __FILE__ == $0
103
-
104
- require 'rbbt/sources/organism/sequence'
105
- class SequenceWF < WorkFlowWS
106
- self.klass = Organism
107
- end
108
-
109
- wf = SequenceWF.new
110
- wf.export :genomic_mutations_to_genes
111
- Open.write('/tmp/foo.wsdl', wf.wsdl)
112
- wf.start
113
- end
114
-
115
-
116
-
@@ -1,201 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
- require 'rbbt/util/persistence'
3
-
4
- class TestPersistence < Test::Unit::TestCase
5
-
6
- def test_string
7
- string = "test string"
8
- TmpFile.with_file do |f|
9
- Persistence.persist("token_file", :Test, :string, :persistence_file => f) do string end
10
- assert File.exists? f
11
- assert_equal string, Open.read(f)
12
-
13
- FileUtils.rm f
14
- end
15
- end
16
-
17
- def test_yaml
18
- object = [1,2,2]
19
- TmpFile.with_file do |f|
20
- Persistence.persist("token_file", :Test, :yaml, :persistence_file => f) do object end
21
- assert File.exists? f
22
- assert_equal object, YAML.load(File.open(f))
23
- assert_equal YAML.dump(object), Open.read(f)
24
-
25
- FileUtils.rm f
26
- end
27
- end
28
-
29
- def test_marshal
30
- object = [1,2,2]
31
- TmpFile.with_file do |f|
32
- Persistence.persist("token_file", :Test, :marshal, :persistence_file => f) do object end
33
- assert File.exists? f
34
- assert_equal object, Marshal.load(File.open(f))
35
- assert_equal Marshal.dump(object), Open.read(f)
36
-
37
- FileUtils.rm f
38
- end
39
- end
40
-
41
- def test_tsv
42
- object = {:a => 1, :b => 2}
43
- TmpFile.with_file do |f|
44
- Persistence.persist("token_file", :Test, :tsv_extra, :persistence_file => f) do
45
- [object, {:fields => ["Number"], :key_field => "Letter", :type => :single, :cast => :to_i, :filename => "foo"}]
46
- end
47
-
48
- assert File.exists? f
49
- new, extra = Persistence.persist("token_file", :Test, :tsv_extra, :persistence_file => f)
50
-
51
- assert_equal 1, new["a"]
52
- assert_equal "Letter", new.key_field
53
-
54
- FileUtils.rm f
55
- end
56
- end
57
-
58
- def test_tsv2
59
- content =<<-EOF
60
- #Id ValueA ValueB OtherID
61
- row1 a|aa|aaa b Id1|Id2
62
- row2 A B Id3
63
- EOF
64
-
65
- TmpFile.with_file(content) do |filename|
66
- tsv = TSV.new(filename, :sep => /\s+/, :key => "OtherID")
67
- tsv2 = Persistence.persist_tsv_string(tsv, 'Test', {}) do tsv end
68
- tsv2 = Persistence.persist_tsv_string(tsv, 'Test', {}) do tsv end
69
-
70
- (Object::TSV::EXTRA_ACCESSORS + [:fields, :key_field]).each do |key|
71
- assert_equal tsv.send(key), tsv2.send(key)
72
- end
73
- tsv.each do |key,values|
74
- assert_equal values, tsv2[key]
75
- end
76
- end
77
- end
78
-
79
- def test_tsv3
80
- content =<<-EOF
81
- #Id ValueA ValueB OtherID
82
- row1 a|aa|aaa b Id1|Id2
83
- row2 A B Id3
84
- EOF
85
-
86
- TmpFile.with_file(content) do |filename|
87
- tsv = TSV.new(filename, :sep => /\s+/, :key => "OtherID")
88
- tsv2 = Persistence.persist_tsv(tsv, 'Test', {}) do tsv end
89
- tsv2 = Persistence.persist_tsv(tsv, 'Test', {}) do tsv end
90
-
91
- (Object::TSV::EXTRA_ACCESSORS + [:fields, :key_field]).each do |key|
92
- assert_equal tsv.send(key), tsv2.send(key)
93
- end
94
- tsv.each do |key,values|
95
- assert_equal values, tsv2[key]
96
- end
97
- end
98
- end
99
-
100
- def test_tsv4
101
- content =<<-EOF
102
- #Id ValueA ValueB OtherID
103
- row1 a|aa|aaa b Id1|Id2
104
- row2 A B Id3
105
- EOF
106
-
107
- TmpFile.with_file(content) do |filename|
108
- tsv = Persistence.persist_tsv(filename, 'Test', {}) do TSV.new(filename, :sep => /\s+/, :key => "OtherID") end
109
- tsv2 = Persistence.persist_tsv(filename, 'Test', {}) do tsv end
110
-
111
- (Object::TSV::EXTRA_ACCESSORS + [:fields, :key_field]).each do |key|
112
- assert_equal tsv.send(key), tsv2.send(key)
113
- end
114
- tsv.each do |key,values|
115
- assert_equal values, tsv2[key]
116
- end
117
- end
118
- end
119
-
120
- def test_integer
121
- content =<<-EOF
122
- #Id ValueA
123
- row1 1
124
- row2 2
125
- EOF
126
-
127
- TmpFile.with_file(content) do |filename|
128
- tsv = TSV.new(filename, :single, :sep => /\s+/, :cast => :to_i, :persistence => true)
129
- assert_equal 1, tsv["row1"]
130
- end
131
- end
132
-
133
- def test_integer
134
- content =<<-EOF
135
- row1 1 2 3 4 5
136
- row2 2 4 6 8
137
- EOF
138
-
139
- TmpFile.with_file(content) do |filename|
140
- tsv = TSV.new(filename, :flat, :sep => /\s+/, :cast => :to_i, :persistence => true)
141
- assert_equal [1,2,3,4,5], tsv["row1"]
142
- end
143
- end
144
-
145
- def test_persist_dir
146
- string = Persistence.persist("Test", :Test, :string, :persistence_dir => Rbbt.tmp.test.persistence) do
147
- "Test"
148
- end
149
-
150
- assert Dir.glob(Rbbt.tmp.test.persistence.find + '*').length == 1
151
-
152
- assert_equal "Test", string
153
- end
154
-
155
- def test_non_blocking
156
- $a = TSV.new datafile_test('test.tsv'), :persistence => true, :persistence_dir => Rbbt.tmp.test.persistence
157
- $a.data.read
158
-
159
- pid = Process.fork do
160
- $b = TSV.new datafile_test('test.tsv'), :persistence => true, :persistence_dir => Rbbt.tmp.test.persistence
161
- $b.data.close
162
- end
163
-
164
- Process.wait pid
165
- end
166
-
167
- def test_persist_fwt
168
- content =<<-EOF
169
- #: :sep=/\\s+/
170
- #Id Start End
171
- row1 1 10
172
- row2 20 30
173
- EOF
174
-
175
- TmpFile.with_file(content) do |filename|
176
- fwt = Persistence.persist(filename, :Range, :fwt, :persistence_dir => Rbbt.tmp.test.persistence) do
177
- fwt = TSV.new(filename).range_index("Start", "End", :persistence => false)
178
- assert fwt[15].empty?
179
- assert fwt[25].include? "row2"
180
- fwt
181
- end
182
-
183
- assert fwt[5].include? "row1"
184
- assert fwt[(5..25)].include? "row1"
185
- assert fwt[(5..25)].include? "row2"
186
-
187
- fwt = Persistence.persist(filename, :Range, :fwt, :persistence_dir => Rbbt.tmp.test.persistence) do
188
- assert false
189
- end
190
-
191
- assert fwt[5].include? "row1"
192
- assert fwt[(5..25)].include? "row1"
193
- assert fwt[(5..25)].include? "row2"
194
-
195
- end
196
-
197
- end
198
-
199
-
200
- end
201
-