rbbt-util 5.1.0 → 5.2.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.
- data/LICENSE +1 -1
- data/README.rdoc +2 -2
- data/bin/rbbt +45 -0
- data/bin/rbbt_dangling_locks.rb +9 -0
- data/bin/rbbt_monitor.rb +12 -10
- data/bin/run_workflow.rb +80 -18
- data/lib/rbbt.rb +1 -1
- data/lib/rbbt/annotations.rb +1 -19
- data/lib/rbbt/annotations/annotated_array.rb +23 -0
- data/lib/rbbt/fix_width_table.rb +2 -2
- data/lib/rbbt/persist.rb +13 -5
- data/lib/rbbt/persist/tsv.rb +2 -0
- data/lib/rbbt/resource.rb +4 -4
- data/lib/rbbt/resource/path.rb +35 -10
- data/lib/rbbt/resource/util.rb +54 -47
- data/lib/rbbt/tsv.rb +17 -15
- data/lib/rbbt/tsv/accessor.rb +35 -37
- data/lib/rbbt/tsv/excel.rb +3 -1
- data/lib/rbbt/tsv/manipulate.rb +27 -4
- data/lib/rbbt/tsv/parser.rb +13 -7
- data/lib/rbbt/util/R.rb +11 -1
- data/lib/rbbt/util/misc.rb +182 -26
- data/lib/rbbt/util/named_array.rb +14 -7
- data/lib/rbbt/util/open.rb +2 -1
- data/lib/rbbt/util/tmpfile.rb +16 -1
- data/lib/rbbt/workflow.rb +63 -101
- data/lib/rbbt/workflow/accessor.rb +19 -9
- data/lib/rbbt/workflow/annotate.rb +33 -64
- data/lib/rbbt/workflow/definition.rb +71 -0
- data/lib/rbbt/workflow/soap.rb +15 -5
- data/lib/rbbt/workflow/step.rb +57 -8
- data/lib/rbbt/workflow/usage.rb +72 -0
- data/share/lib/R/util.R +12 -0
- data/share/rbbt_commands/conf/web_user/add +26 -0
- data/share/rbbt_commands/conf/web_user/list +9 -0
- data/share/rbbt_commands/conf/web_user/remove +18 -0
- data/share/rbbt_commands/workflow/remote/add +11 -0
- data/share/rbbt_commands/workflow/remote/list +9 -0
- data/share/rbbt_commands/workflow/remote/remove +9 -0
- data/share/rbbt_commands/workflow/task +181 -0
- data/test/rbbt/test_resource.rb +2 -1
- data/test/rbbt/test_workflow.rb +13 -0
- data/test/rbbt/tsv/test_manipulate.rb +18 -0
- data/test/rbbt/util/test_misc.rb +19 -39
- data/test/rbbt/util/test_tmpfile.rb +8 -0
- data/test/rbbt/workflow/test_soap.rb +2 -0
- metadata +31 -2
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -45,7 +45,6 @@
|
|
45
45
|
|
46
46
|
gem install specific_install hoe
|
47
47
|
gem specific_install -l https://github.com/bensomers/png.git
|
48
|
-
gem specific_install -l https://github.com/felipec/soap4r.git
|
49
48
|
gem specific_install -l https://github.com/mikisvaz/tokyocabinet_19_fix.git
|
50
49
|
|
51
50
|
3.pre2 - A couple of gems are better installed beforehand, since they require some configuration
|
@@ -82,7 +81,8 @@
|
|
82
81
|
git clone git@github.com:mikisvaz/rbbt-phgx.git
|
83
82
|
git clone git@github.com:mikisvaz/rbbt-entities.git
|
84
83
|
git clone git@github.com:mikisvaz/rbbt-dm.git
|
85
|
-
git clone git@github.com:mikisvaz/rbbt-
|
84
|
+
git clone git@github.com:mikisvaz/rbbt-rest.git
|
85
|
+
git clone git@github.com:mikisvaz/rbbt-studies.git
|
86
86
|
alias druby="env RBBT_LOG=0 ruby $(for d in $HOME/git/rbbt-*;do echo -n "-I$d/lib ";done)"
|
87
87
|
alias drake="env RBBT_LOG=0 rake $(for d in $HOME/git/rbbt-*;do echo -n "-I$d/lib ";done)"
|
88
88
|
|
data/bin/rbbt
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rbbt'
|
4
|
+
|
5
|
+
$rbbt_command_dir = Rbbt.share.rbbt_commands
|
6
|
+
|
7
|
+
def commands(prev)
|
8
|
+
rbbt_command_dir = $rbbt_command_dir
|
9
|
+
|
10
|
+
prev.each do |previous_command|
|
11
|
+
rbbt_command_dir = rbbt_command_dir[previous_command]
|
12
|
+
end
|
13
|
+
|
14
|
+
command_file_dirs = rbbt_command_dir.find_all
|
15
|
+
command_files = command_file_dirs.collect{|d| d.glob('*') }.flatten
|
16
|
+
command_files.collect{|p| File.basename(p) }.uniq.reject{|p| p =~ /\.desc$/}.sort
|
17
|
+
end
|
18
|
+
|
19
|
+
dir = $rbbt_command_dir
|
20
|
+
prev = []
|
21
|
+
|
22
|
+
while ARGV.any?
|
23
|
+
command = ARGV.shift
|
24
|
+
case
|
25
|
+
when File.directory?(dir[command].find)
|
26
|
+
prev << command
|
27
|
+
dir = dir[command]
|
28
|
+
when dir[command].exists?
|
29
|
+
load dir[command].find
|
30
|
+
exit 0
|
31
|
+
else
|
32
|
+
raise "Command not understood"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
puts "Command:"
|
37
|
+
puts
|
38
|
+
puts " #{File.basename($0)} #{prev * " "}"
|
39
|
+
puts
|
40
|
+
puts "Subcommands:"
|
41
|
+
puts
|
42
|
+
commands(prev).each do |command|
|
43
|
+
puts " " << command
|
44
|
+
end
|
45
|
+
|
data/bin/rbbt_monitor.rb
CHANGED
@@ -4,20 +4,19 @@ require 'rbbt-util'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'rbbt/util/simpleopt'
|
6
6
|
require 'rbbt/workflow/step'
|
7
|
+
require 'rbbt/util/misc'
|
7
8
|
|
8
|
-
options = SOPT.get("-l--list:-z--zombies:-e--errors:-c--clean:-n--name:-a--all:-w--wipe:-f--file
|
9
|
+
options = SOPT.get("-l--list:-z--zombies:-e--errors:-c--clean:-n--name:-a--all:-w--wipe:-f--file*:-q--quick")
|
10
|
+
|
11
|
+
|
12
|
+
YAML::ENGINE.yamler = 'syck' if defined? YAML::ENGINE and YAML::ENGINE.respond_to? :yamler
|
9
13
|
|
10
14
|
def info_files
|
11
15
|
Dir.glob('**/*.info')
|
12
16
|
end
|
13
17
|
|
14
18
|
def running?(info)
|
15
|
-
|
16
|
-
Process.kill 0, info[:pid]
|
17
|
-
true
|
18
|
-
rescue
|
19
|
-
false
|
20
|
-
end
|
19
|
+
Misc.pid_exists? info[:pid]
|
21
20
|
end
|
22
21
|
|
23
22
|
def print_job(file, info, severity_color = nil)
|
@@ -27,7 +26,8 @@ def print_job(file, info, severity_color = nil)
|
|
27
26
|
else
|
28
27
|
info ||= {:status => :missing_info_file}
|
29
28
|
str = [clean_file, info[:status].to_s] * " [ STATUS = " + " ]"
|
30
|
-
str += " (#{running?(info)? :running : :
|
29
|
+
str += " (#{running?(info)? :running : :dead} #{info[:pid]})" if info.include? :pid
|
30
|
+
str += " (children: #{info[:children_pids].collect{|pid| [pid, Misc.pid_exists?(pid) ? "R" : "D"] * ":"} * ", "})" if info.include? :children_pids
|
31
31
|
|
32
32
|
str = "#{severity_color}" << str << "\033[0m" if severity_color
|
33
33
|
puts str
|
@@ -40,11 +40,12 @@ def list_jobs(options)
|
|
40
40
|
|
41
41
|
info_files.each do |file|
|
42
42
|
clean_file = file.sub('.info','')
|
43
|
-
next if File.exists? clean_file
|
44
43
|
begin
|
44
|
+
next if File.exists? clean_file and $quick
|
45
45
|
info = YAML.load(Open.read(file))
|
46
|
+
next if File.exists? clean_file and not running? info
|
46
47
|
rescue Exception
|
47
|
-
|
48
|
+
puts "Error parsing info file: #{ file }"
|
48
49
|
info = nil
|
49
50
|
end
|
50
51
|
|
@@ -100,6 +101,7 @@ end
|
|
100
101
|
|
101
102
|
|
102
103
|
$name = options.delete :name
|
104
|
+
$quick = options.delete :quick
|
103
105
|
case
|
104
106
|
when (options[:clean] and not options[:list])
|
105
107
|
if options[:file]
|
data/bin/run_workflow.rb
CHANGED
@@ -25,7 +25,7 @@ end
|
|
25
25
|
def fix_options(workflow, task, job_options)
|
26
26
|
option_types = workflow.rec_input_types(task.name)
|
27
27
|
|
28
|
-
workflow.resolve_locals(job_options)
|
28
|
+
#workflow.resolve_locals(job_options)
|
29
29
|
|
30
30
|
job_options_cleaned = {}
|
31
31
|
|
@@ -80,35 +80,97 @@ def fix_options(workflow, task, job_options)
|
|
80
80
|
job_options_cleaned
|
81
81
|
end
|
82
82
|
|
83
|
-
options = SOPT.get "-t--task
|
83
|
+
options = SOPT.get "-t--task*:--profile:-l--log*:-h--help:-n--name*:-cl--clean:-rcl-recursive_clean:-pn--printname:-srv--server:-p--port*"
|
84
84
|
|
85
85
|
workflow = ARGV.first
|
86
86
|
|
87
87
|
if options[:server]
|
88
88
|
|
89
|
-
require 'rbbt/util/log'
|
90
|
-
require 'rbbt/workflow'
|
91
|
-
require 'rbbt/workflow/rest'
|
92
|
-
require 'sinatra'
|
93
|
-
require 'compass'
|
89
|
+
#require 'rbbt/util/log'
|
90
|
+
#require 'rbbt/workflow'
|
91
|
+
#require 'rbbt/workflow/rest'
|
92
|
+
#require 'sinatra'
|
93
|
+
#require 'compass'
|
94
94
|
|
95
|
-
|
96
|
-
|
95
|
+
#if workflow
|
96
|
+
# Workflow.require_workflow workflow
|
97
|
+
# WorkflowREST.add_workflows *Workflow.workflows
|
98
|
+
#end
|
99
|
+
|
100
|
+
#WorkflowREST.setup
|
101
|
+
|
102
|
+
#Sinatra::Application.port = options[:port] || 4567
|
103
|
+
#Sinatra::Application.run = true
|
104
|
+
|
105
|
+
#if workflow and File.exists? workflow
|
106
|
+
# Sinatra::Application.views = File.join(File.dirname(workflow), 'www/views')
|
107
|
+
#end
|
108
|
+
|
109
|
+
#sinatra_file = './lib/sinatra.rb'
|
110
|
+
#if File.exists? sinatra_file
|
111
|
+
# require sinatra_file
|
112
|
+
#end
|
113
|
+
require 'zurb-foundation'
|
114
|
+
require 'modular-scale'
|
115
|
+
|
116
|
+
require 'rbbt/rest/main'
|
117
|
+
require 'rbbt/rest/entity'
|
118
|
+
require 'rbbt/rest/workflow'
|
119
|
+
require 'rbbt/rest/file_server'
|
120
|
+
require 'rbbt/rest/helpers'
|
97
121
|
|
98
|
-
|
122
|
+
YAML::ENGINE.yamler = 'syck' if defined? YAML::ENGINE and YAML::ENGINE.respond_to? :yamler
|
99
123
|
|
100
|
-
|
101
|
-
|
124
|
+
Workflow.require_workflow workflow
|
125
|
+
|
126
|
+
class WorkflowRest < Sinatra::Base
|
127
|
+
get '/' do
|
128
|
+
redirect to(File.join('/', Workflow.workflows.last.to_s))
|
129
|
+
end
|
130
|
+
end
|
102
131
|
|
103
|
-
if
|
104
|
-
|
132
|
+
if options[:profile]
|
133
|
+
WorkflowRest.before File.join('/', Workflow.workflows.last.to_s, '*') do
|
134
|
+
@profile = true
|
135
|
+
end
|
105
136
|
end
|
106
137
|
|
107
|
-
|
108
|
-
|
109
|
-
|
138
|
+
class WorkflowRest < Sinatra::Base
|
139
|
+
|
140
|
+
#{{{ MODULES AND HELPERS
|
141
|
+
register Sinatra::RbbtRESTMain
|
142
|
+
register Sinatra::RbbtRESTWorkflow
|
143
|
+
register Sinatra::RbbtRESTEntity
|
144
|
+
helpers Sinatra::RbbtMiscHelpers
|
145
|
+
|
146
|
+
#{{{ DIRECTORIES
|
147
|
+
local_var = Rbbt.var.find(:lib)
|
148
|
+
set :cache_dir , local_var.sinatra.cache.find
|
149
|
+
set :file_dir , local_var.sinatra.files.find
|
150
|
+
set :favourites_dir , local_var.sinatra.favourites.find
|
151
|
+
set :favourite_lists_dir , local_var.sinatra.favourite_lists
|
152
|
+
|
153
|
+
#{{{ SESSIONS
|
154
|
+
use Rack::Session::Cookie, :key => 'rack.session',
|
155
|
+
:path => '/',
|
156
|
+
:expire_after => 2592000,
|
157
|
+
:secret => "Workflow #{Workflow.workflows.inspect} secret!!"
|
158
|
+
|
159
|
+
#{{{ FOUNDATION RESOURCES
|
160
|
+
add_sass_load_path "#{Gem.loaded_specs['compass'].full_gem_path}/frameworks/compass/stylesheets"
|
161
|
+
add_sass_load_path "#{Gem.loaded_specs['zurb-foundation'].full_gem_path}/scss/"
|
162
|
+
add_sass_load_path "#{Gem.loaded_specs['modular-scale'].full_gem_path}/stylesheets/"
|
163
|
+
RbbtRESTHelpers.javascript_resources << Path.setup("#{Gem.loaded_specs['zurb-foundation'].full_gem_path}/js/foundation")
|
164
|
+
RbbtRESTHelpers.javascript_resources << Path.setup("#{Gem.loaded_specs['zurb-foundation'].full_gem_path}/js/vendor")
|
165
|
+
|
166
|
+
$title = "Workflow Scout"
|
167
|
+
use Rack::Deflater
|
110
168
|
end
|
111
169
|
|
170
|
+
WorkflowRest.add_workflow Workflow.workflows.last, true
|
171
|
+
|
172
|
+
WorkflowRest.port = options[:port] || 4567
|
173
|
+
WorkflowRest.run!
|
112
174
|
else
|
113
175
|
|
114
176
|
# Set log, fork, clean, recursive_clean and help
|
@@ -147,7 +209,7 @@ else
|
|
147
209
|
namespace, task = options.delete(:task).split('.')
|
148
210
|
namespace = Misc.string2const(namespace)
|
149
211
|
else
|
150
|
-
task_name = options.delete(:task)
|
212
|
+
task_name = options.delete(:task).to_sym
|
151
213
|
task = workflow.tasks[task_name]
|
152
214
|
raise "Task not found: #{ task_name }" if task.nil?
|
153
215
|
end
|
data/lib/rbbt.rb
CHANGED
@@ -12,5 +12,5 @@ module Rbbt
|
|
12
12
|
FileCache.cachedir = var.cache.filecache.find :user
|
13
13
|
TmpFile.tmpdir = tmp.find :user
|
14
14
|
Open.cachedir = var.cache["open-remote"].find :user
|
15
|
-
Persist.cachedir
|
15
|
+
Persist.cachedir = var.cache.persistence.find :user
|
16
16
|
end
|
data/lib/rbbt/annotations.rb
CHANGED
@@ -209,7 +209,7 @@ module Annotation
|
|
209
209
|
|
210
210
|
hash.each do |key, value|
|
211
211
|
begin
|
212
|
-
next unless @annotations.include?
|
212
|
+
next unless @annotations.include?(key = key.to_sym)
|
213
213
|
rescue
|
214
214
|
next
|
215
215
|
end
|
@@ -280,21 +280,3 @@ module Annotation
|
|
280
280
|
mod.instance_variable_set(:@masked_annotations, self.masked_annotations.dup)
|
281
281
|
end
|
282
282
|
end
|
283
|
-
|
284
|
-
|
285
|
-
if __FILE__ == $0
|
286
|
-
|
287
|
-
module Gene
|
288
|
-
extend Annotation
|
289
|
-
annotation :format, :organism
|
290
|
-
end
|
291
|
-
|
292
|
-
a = %w(1 2 3 4 5 6 6)
|
293
|
-
Gene.setup a, "Ensembl Gene ID", "Hsa"
|
294
|
-
|
295
|
-
puts a.reject{|a| a.to_i < 6}.collect{|e| e.format}
|
296
|
-
|
297
|
-
puts
|
298
|
-
|
299
|
-
puts a.reject{|a| a.to_i < 6}.uniq.collect{|e| e.format}
|
300
|
-
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module AnnotatedArray
|
2
|
+
attr_accessor :list_id
|
3
|
+
|
2
4
|
def double_array
|
3
5
|
AnnotatedArray === self.send(:[], 0, true)
|
4
6
|
end
|
@@ -153,6 +155,27 @@ module AnnotatedArray
|
|
153
155
|
res
|
154
156
|
end
|
155
157
|
|
158
|
+
def select_by(method, *args, &block)
|
159
|
+
return [] if self.empty? and not self.respond_to? :annotate
|
160
|
+
|
161
|
+
values = self.send(method, *args)
|
162
|
+
values = values.clean_annotations if values.respond_to? :clean_annotations
|
163
|
+
|
164
|
+
new = []
|
165
|
+
if block_given?
|
166
|
+
self.clean_annotations.each_with_index do |e,i|
|
167
|
+
new << e if yield(values[i])
|
168
|
+
end
|
169
|
+
else
|
170
|
+
self.clean_annotations.each_with_index do |e,i|
|
171
|
+
new << e if values[i]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
self.annotate(new)
|
175
|
+
new.extend AnnotatedArray
|
176
|
+
|
177
|
+
new
|
178
|
+
end
|
156
179
|
|
157
180
|
%w(compact uniq flatten reverse sort_by).each do |method|
|
158
181
|
|
data/lib/rbbt/fix_width_table.rb
CHANGED
@@ -116,14 +116,14 @@ class FixWidthTable
|
|
116
116
|
#{{{ Adding data
|
117
117
|
|
118
118
|
def add_point(data)
|
119
|
-
data.sort_by{|value, pos| pos}.each do |value, pos|
|
119
|
+
data.sort_by{|value, pos| pos }.each do |value, pos|
|
120
120
|
add pos, value
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
124
|
def add_range(data)
|
125
125
|
latest = []
|
126
|
-
data.sort_by{|value, pos| pos[0]}.each do |value, pos|
|
126
|
+
data.sort_by{|value, pos| pos[0] }.each do |value, pos|
|
127
127
|
while latest.any? and latest[0] < pos[0]
|
128
128
|
latest.shift
|
129
129
|
end
|
data/lib/rbbt/persist.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rbbt'
|
1
2
|
require 'rbbt/util/misc'
|
2
3
|
require 'rbbt/util/open'
|
3
4
|
|
@@ -5,10 +6,10 @@ require 'rbbt/persist/tsv'
|
|
5
6
|
require 'set'
|
6
7
|
|
7
8
|
module Persist
|
8
|
-
CACHEDIR="/tmp/tsv_persistent_cache"
|
9
|
+
CACHEDIR = "/tmp/tsv_persistent_cache" unless defined? CACHEDIR
|
9
10
|
FileUtils.mkdir CACHEDIR unless File.exist? CACHEDIR
|
10
11
|
|
11
|
-
MEMORY = {}
|
12
|
+
MEMORY = {} unless defined? MEMORY
|
12
13
|
|
13
14
|
def self.cachedir=(cachedir)
|
14
15
|
CACHEDIR.replace cachedir
|
@@ -72,7 +73,7 @@ module Persist
|
|
72
73
|
File.join(persistence_dir, filename)
|
73
74
|
end
|
74
75
|
|
75
|
-
TRUE_STRINGS = Set.new ["true", "True", "TRUE", "t", "T", "1", "yes", "Yes", "YES", "y", "Y", "ON", "on"]
|
76
|
+
TRUE_STRINGS = Set.new ["true", "True", "TRUE", "t", "T", "1", "yes", "Yes", "YES", "y", "Y", "ON", "on"] unless defined? TRUE_STRINGS
|
76
77
|
def self.load_file(path, type)
|
77
78
|
case (type || "nil").to_sym
|
78
79
|
when :nil
|
@@ -231,6 +232,7 @@ module Persist
|
|
231
232
|
repo[subkey + entities.id << ":" << "SINGLE"] = tsv_values
|
232
233
|
when (not Array === entities or (AnnotatedArray === entities and AnnotatedArray === entities.first))
|
233
234
|
entities.each_with_index do |e,i|
|
235
|
+
next if e.nil?
|
234
236
|
tsv_values = e.tsv_values("literal", "annotation_types", "JSON")
|
235
237
|
repo[subkey + e.id << ":ANNOTATED_DOUBLE_ARRAY:" << i.to_s] = tsv_values
|
236
238
|
end
|
@@ -276,12 +278,18 @@ end
|
|
276
278
|
module LocalPersist
|
277
279
|
|
278
280
|
attr_accessor :local_persist_dir
|
281
|
+
|
282
|
+
def local_persist_dir
|
283
|
+
@local_persist_dir ||= Rbbt.var.cache.persistence.find(:lib) if defined? Rbbt
|
284
|
+
@local_persist_dir
|
285
|
+
end
|
286
|
+
|
279
287
|
def local_persist(name, type = nil, options= {}, &block)
|
280
|
-
Persist.persist(name, type, options.merge({:dir =>
|
288
|
+
Persist.persist(name, type, options.merge({:dir => local_persist_dir}), &block)
|
281
289
|
end
|
282
290
|
|
283
291
|
def local_persist_tsv(source, name, opt = {}, options= {}, &block)
|
284
|
-
Persist.persist_tsv(source, name, opt, options.merge({:dir =>
|
292
|
+
Persist.persist_tsv(source, name, opt, options.merge({:dir => local_persist_dir}), &block)
|
285
293
|
end
|
286
294
|
|
287
295
|
end
|
data/lib/rbbt/persist/tsv.rb
CHANGED
data/lib/rbbt/resource.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'rbbt/util/open'
|
1
|
+
require 'rbbt/util/open'
|
2
2
|
require 'rbbt/util/log'
|
3
3
|
require 'rbbt/util/chain_methods'
|
4
4
|
require 'rbbt/resource/path'
|
5
|
-
require 'rbbt/resource/rake'
|
6
|
-
|
5
|
+
#require 'rbbt/resource/rake'
|
6
|
+
|
7
7
|
module Resource
|
8
8
|
extend ChainMethods
|
9
9
|
self.chain_prefix = :resource
|
@@ -53,7 +53,7 @@ module Resource
|
|
53
53
|
if type == :install
|
54
54
|
Log.debug "Preparing software: #{path}"
|
55
55
|
path.produce
|
56
|
-
software_dir = path.resource.root.software
|
56
|
+
software_dir = path.resource.root.software
|
57
57
|
set_software_env(software_dir)
|
58
58
|
end
|
59
59
|
end
|