rbbt-rest 1.8.62 → 1.8.63
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/rest/web_tool.rb +3 -1
- data/lib/rbbt/rest/workflow.rb +5 -1
- data/lib/rbbt/rest/workflow/jobs.rb +3 -2
- data/lib/rbbt/rest/workflow/render.rb +4 -1
- data/share/views/job_info.haml +17 -8
- data/share/views/partials/dependencies.haml +39 -0
- data/share/views/public/js/helpers/helpers.js +3 -3
- data/share/views/public/js/rbbt.plots/rbbt.plots.aes.js +25 -0
- data/share/views/tools/Rpng.haml +12 -0
- data/share/views/tools/nvd3/chart.haml +2 -1
- data/share/views/tools/nvd3/scatter.haml +19 -4
- data/share/views/wait.haml +23 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 575bc1891fa7c9dcc1334107cd7523c6583254be
|
4
|
+
data.tar.gz: 6b6c79f02c11e216ce8d5ee6ec0242b25ac21529
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bae019d9ac143210c65952a3d3ca74d7c64d9326a19618c530cd7599743dd6b50a7f125ed736e8c85c2383eba09a742a98fe4f8e7f5ca16fa6bfbc33d58176c5
|
7
|
+
data.tar.gz: 3e5b7aecef6c228e73525868c3cbc7b0284b9ea159f598b831d0bc80217f8b0c513346135785c41cd7112d09d16d3746e1003ec91eebaa08d7dc81fa3f22e2d9
|
data/lib/rbbt/rest/web_tool.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
|
2
2
|
module Sinatra
|
3
3
|
module RbbtToolHelper
|
4
|
-
def tool(toolname, options = {})
|
4
|
+
def tool(toolname, options = {}, &block)
|
5
5
|
options[:id] ||= toolname.to_s + "_#{rand(10000)}"
|
6
6
|
|
7
|
+
options[:block] = block if block_given?
|
8
|
+
|
7
9
|
template_file = locate_template("tools/#{toolname}")
|
8
10
|
Log.debug "Loading tool #{toolname} from: #{template_file}"
|
9
11
|
content = Tilt::HamlTemplate.new(template_file, :filename => template_file).render(self, options)
|
data/lib/rbbt/rest/workflow.rb
CHANGED
@@ -37,6 +37,10 @@ module Sinatra
|
|
37
37
|
add_workflow_resource(workflow, add_resource == :priority) if add_resource
|
38
38
|
workflow.documentation
|
39
39
|
|
40
|
+
if ENV["RBBT_WORKFLOW_EXPORT_ALL"] == "true"
|
41
|
+
workflow.export *workflow.tasks.keys
|
42
|
+
end
|
43
|
+
|
40
44
|
|
41
45
|
self.instance_eval workflow.libdir.lib['sinatra.rb'].read, workflow.libdir.lib['sinatra.rb'].find if workflow.respond_to?(:libdir) and File.exists? workflow.libdir.lib['sinatra.rb']
|
42
46
|
|
@@ -201,7 +205,7 @@ module Sinatra
|
|
201
205
|
|
202
206
|
case format
|
203
207
|
when :html
|
204
|
-
workflow_render('job_info', workflow, task, :info => job.info)
|
208
|
+
workflow_render('job_info', workflow, task, :job => job, :info => job.info)
|
205
209
|
when :json
|
206
210
|
content_type "application/json"
|
207
211
|
info_json = {}
|
@@ -65,7 +65,7 @@ module WorkflowRESTHelpers
|
|
65
65
|
|
66
66
|
task_inputs = {}
|
67
67
|
inputs.each do |input|
|
68
|
-
stream = input_options.include?(input)
|
68
|
+
stream = input_options.include?(input) && input_options[input][:stream]
|
69
69
|
value = prepare_input(params, input, input_types[input], stream)
|
70
70
|
task_inputs[input] = value
|
71
71
|
end
|
@@ -112,7 +112,8 @@ module WorkflowRESTHelpers
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def show_result(job, workflow, task, params = nil)
|
115
|
-
return show_result_html nil, workflow, task, job.name, job if @fragment
|
115
|
+
#return show_result_html nil, workflow, task, job.name, job if @fragment
|
116
|
+
return show_result_html nil, workflow, task, job.name, job, params if @fragment
|
116
117
|
|
117
118
|
case format.to_sym
|
118
119
|
when :html
|
@@ -28,7 +28,10 @@ module WorkflowRESTHelpers
|
|
28
28
|
server_key = $app_name
|
29
29
|
html_dir = job.file('.html')
|
30
30
|
FileUtils.mkdir_p html_dir.find unless File.exists? html_dir.find
|
31
|
-
|
31
|
+
other_params = params.dup
|
32
|
+
other_params.delete_if{|k,v| k[0] == "_"}
|
33
|
+
other_params.delete :result
|
34
|
+
cache_file = html_dir[server_key + "_" << Misc.obj2digest(other_params)]
|
32
35
|
cache_type = false if params[:cache] == FalseClass
|
33
36
|
render(template_file, locals, layout_file, [task,workflow,job.name] * "-", :cache_type => cache_type, :cache_file => cache_file)
|
34
37
|
else
|
data/share/views/job_info.haml
CHANGED
@@ -4,18 +4,27 @@
|
|
4
4
|
|
5
5
|
- if info[:dependencies] and info[:dependencies].any?
|
6
6
|
%h3 Dependencies
|
7
|
-
|
7
|
+
= partial_render('partials/dependencies', :job => job)
|
8
|
+
-#%ul
|
8
9
|
|
9
10
|
- task_exports = workflow.synchronous_exports + workflow.asynchronous_exports
|
10
11
|
- task_exports = task_exports.collect{|t| t.to_s}
|
11
|
-
|
12
|
-
-
|
13
|
-
|
14
|
-
-
|
15
|
-
|
12
|
+
-# info[:dependencies].each do |task,name,path|
|
13
|
+
- dep = Step.new path
|
14
|
+
- d_workflow = dep.workflow || "Unknown Workflow"
|
15
|
+
- wf = workflow if d_workflow.nil? || d_workflow.to_s == workflow.to_s
|
16
|
+
- if wf.nil? and d_workflow
|
17
|
+
- wf ||= begin
|
18
|
+
- Kernel.const_get d_workflow
|
19
|
+
- rescue
|
20
|
+
|
16
21
|
%li
|
17
|
-
(#{
|
18
|
-
- if
|
22
|
+
(#{d_workflow}##{task})
|
23
|
+
- if Open.remote? path
|
24
|
+
- url = path.split("?").first
|
25
|
+
%a(href=url) #{ name }
|
26
|
+
- elsif wf and wf.task_exports.include? task
|
27
|
+
- url = "/" + [d_workflow.to_s, task.to_s, name.to_s] * "/"
|
19
28
|
%a(href=url) #{ name }
|
20
29
|
- else
|
21
30
|
= name
|
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
%ul.dependencies
|
3
|
+
- job.dependencies.each do |dep|
|
4
|
+
- dep_workflow = dep.workflow
|
5
|
+
- dep_workflow ||= dep.task.workflow if dep.task
|
6
|
+
- dep_workflow ||= File.basename(File.dirname(File.dirname(dep.path)))
|
7
|
+
- str = [dep_workflow, dep.task_name, dep.name].compact * " - "
|
8
|
+
- if dep.file(':progress').exists?
|
9
|
+
- status = dep.status + " - " + dep.file(:progress).yaml[:last_percent] + "%"
|
10
|
+
- else
|
11
|
+
- status = dep.status
|
12
|
+
- name = dep.name
|
13
|
+
%li
|
14
|
+
%span.workflow= dep_workflow
|
15
|
+
%span.task= dep.task_name
|
16
|
+
%span.name
|
17
|
+
- if String === dep_workflow
|
18
|
+
- wf ||= begin
|
19
|
+
- Kernel.const_get dep_workflow
|
20
|
+
- rescue
|
21
|
+
- elsif Module === dep_workflow
|
22
|
+
- wf = dep_workflow
|
23
|
+
|
24
|
+
- if Open.remote? dep.path
|
25
|
+
- url = path.split("?").first
|
26
|
+
%a(href=url) #{ name }
|
27
|
+
|
28
|
+
- elsif wf and wf.task_exports.include? dep.task_name.to_sym
|
29
|
+
- url = "/" + [dep_workflow.to_s, dep.task_name.to_s, dep.name.to_s] * "/"
|
30
|
+
%a(href=url) #{ name }
|
31
|
+
|
32
|
+
- else
|
33
|
+
= name
|
34
|
+
|
35
|
+
|
36
|
+
%span.status(class="#{dep.status}") [#{status}]
|
37
|
+
|
38
|
+
- if dep.dependencies.any?
|
39
|
+
= partial_render('partials/dependencies', :job => dep)
|
@@ -266,12 +266,12 @@ function get_sign_gradient(values, color1, color0, color2){
|
|
266
266
|
forArray(values, function(value){
|
267
267
|
if (typeof value == 'string') value = parseFloat(value)
|
268
268
|
if (typeof value == 'number'){
|
269
|
-
if (value
|
269
|
+
if (value >= 0){
|
270
270
|
var a = value/max
|
271
|
-
colors.push(color0.blend(
|
271
|
+
colors.push(color0.blend(color2, a).toString())
|
272
272
|
}else{
|
273
273
|
var a = value/min
|
274
|
-
colors.push(color0.blend(
|
274
|
+
colors.push(color0.blend(color1, a).toString())
|
275
275
|
}
|
276
276
|
}else{
|
277
277
|
colors.push(undefined)
|
@@ -15,6 +15,7 @@ rbbt.plots.aes.map_aesthetic = function(aes, mapper, map_obj){
|
|
15
15
|
aes = map_obj[aes]
|
16
16
|
}
|
17
17
|
}
|
18
|
+
aes.push(0)
|
18
19
|
return get_gradient(aes, '#EABD5D', '#40324F')
|
19
20
|
case 'sign-gradient':
|
20
21
|
if (map_obj){
|
@@ -72,6 +73,29 @@ rbbt.plots.aes.get_properties = function(list, rules, type, namespace){
|
|
72
73
|
|
73
74
|
if (rule.entity_type && rule.entity_type != type && rule.entity_type != list.format) return
|
74
75
|
|
76
|
+
if (rule.map){
|
77
|
+
var deferred = m.deferred()
|
78
|
+
var entry = rule.map
|
79
|
+
var obj = rule.mapper_obj
|
80
|
+
if (undefined === name) name = entry
|
81
|
+
|
82
|
+
var keys = info[entry]
|
83
|
+
if (undefined === value && entry == 'type') keys = type
|
84
|
+
if (undefined === value && entry == 'code') keys = list.codes
|
85
|
+
|
86
|
+
var value = keys.map(function(k){ return obj[k]})
|
87
|
+
deferred.resolve(value)
|
88
|
+
promise = deferred.promise
|
89
|
+
if (extract){
|
90
|
+
promise = promise.then(function(res){
|
91
|
+
if (typeof res == 'object')
|
92
|
+
return res.map(function(elem){ return extract.call(null, elem)})
|
93
|
+
else
|
94
|
+
return extract.call(null, res)
|
95
|
+
})
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
75
99
|
if (rule.info){
|
76
100
|
var property = rule.property
|
77
101
|
var deferred = m.deferred()
|
@@ -262,6 +286,7 @@ rbbt.plots.aes.set_aes = function(list, aes_rules, type){
|
|
262
286
|
if (undefined === property && name == 'code') property = list.codes.slice()
|
263
287
|
if (undefined === property) return
|
264
288
|
|
289
|
+
console.log([property, mapper, mapper_obj])
|
265
290
|
var aes_values = rbbt.plots.aes.map_aesthetic(property, mapper, mapper_obj)
|
266
291
|
|
267
292
|
if (undefined === list.aes[aes]){
|
@@ -0,0 +1,12 @@
|
|
1
|
+
- filename = 'R-png_' << rand(10000).to_s unless defined? filename and filename
|
2
|
+
- text = filename unless defined? text and text
|
3
|
+
|
4
|
+
- width = 500 unless defined? width and width
|
5
|
+
- height = 500 unless defined? height and height
|
6
|
+
- plot = block.call unless (defined? plot and plot) or not defined? block
|
7
|
+
|
8
|
+
- filename += '.png' unless filename =~ /\.png$/i
|
9
|
+
= resource filename, text, :image do |filename|
|
10
|
+
- CSBC.ic50.tsv.transpose.R "png.file = '#{filename}';\n" + plot
|
11
|
+
|
12
|
+
|
@@ -2,14 +2,29 @@
|
|
2
2
|
- id ||= title || ("scatter-" << (1000 * rand).to_i.to_s)
|
3
3
|
- title ||= "Scatter Plot"
|
4
4
|
|
5
|
-
-
|
6
|
-
-
|
7
|
-
-
|
5
|
+
- if data.fields.length == 1
|
6
|
+
- y ||= data.fields.first
|
7
|
+
- x_values = Hash[*data.keys.zip((0..data.length-1).to_a).flatten]
|
8
|
+
- size_values = Hash[*data.keys.zip([1] * data.length).flatten]
|
9
|
+
|
10
|
+
- if data.fields.length == 2
|
11
|
+
- x ||= data.fields.first
|
12
|
+
- y ||= data.fields.last
|
13
|
+
- size_values = Hash[*data.keys.zip([1] * data.length).flatten]
|
14
|
+
|
15
|
+
- if data.fields.length == 3
|
16
|
+
- x ||= data.fields.first
|
17
|
+
- y ||= data.fields[1]
|
18
|
+
- size ||= data.fields.last
|
19
|
+
- size_values = Hash[*data.keys.zip([1] * data.length).flatten]
|
8
20
|
|
9
21
|
- data_values = []
|
10
22
|
- data.through do |key,values|
|
11
23
|
- label = key.respond_to?(:name)? key.name || key : key
|
12
|
-
-
|
24
|
+
- y_value = (defined?(y) and y) ? values[y] : y_values[y].to_f
|
25
|
+
- x_value = (defined?(x) and x) ? values[x] : x_values[key].to_f
|
26
|
+
- size_value = (defined?(size) and size) ? values[size] : size_values[key].to_f
|
27
|
+
- data_values << {:label => label, :x => x_value, :y => y_value, :size => size_value}
|
13
28
|
|
14
29
|
- plot_data = [{:key => "Group", :values => data_values}]
|
15
30
|
|
data/share/views/wait.haml
CHANGED
@@ -3,9 +3,23 @@
|
|
3
3
|
:sass
|
4
4
|
span.progress_time
|
5
5
|
color: grey
|
6
|
-
.
|
7
|
-
|
8
|
-
|
6
|
+
.dependencies
|
7
|
+
.wait.ui.segment
|
8
|
+
overflow: auto
|
9
|
+
text-overflow: ellipsis
|
10
|
+
.status
|
11
|
+
color: grey
|
12
|
+
.status.done
|
13
|
+
color: green
|
14
|
+
.status.error
|
15
|
+
color: red
|
16
|
+
.status.dependencies
|
17
|
+
color: orange
|
18
|
+
.workflow
|
19
|
+
font-weight: bold
|
20
|
+
.task
|
21
|
+
font-style: italic
|
22
|
+
|
9
23
|
.wait.ui.segment.info.message
|
10
24
|
%h3.ui.header Waiting on #{format_name File.basename(job.name)}
|
11
25
|
|
@@ -58,4 +72,9 @@
|
|
58
72
|
- next if line.nil? or line.strip.empty?
|
59
73
|
%li= line
|
60
74
|
|
61
|
-
|
75
|
+
- if job.dependencies.any?
|
76
|
+
|
77
|
+
.ui.segment
|
78
|
+
%h3.ui.header Dependencies
|
79
|
+
.content
|
80
|
+
= partial_render('partials/dependencies', :job => job)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.8.
|
4
|
+
version: 1.8.63
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -255,6 +255,7 @@ files:
|
|
255
255
|
- share/views/main.haml
|
256
256
|
- share/views/monitor/jobs.haml
|
257
257
|
- share/views/monitor/locks.haml
|
258
|
+
- share/views/partials/dependencies.haml
|
258
259
|
- share/views/partials/form.haml
|
259
260
|
- share/views/partials/table.haml
|
260
261
|
- share/views/partials/table/column.haml
|
@@ -1825,6 +1826,7 @@ files:
|
|
1825
1826
|
- share/views/public/plugins/underscore/js/underscore.js
|
1826
1827
|
- share/views/public/robots.txt
|
1827
1828
|
- share/views/tasks.haml
|
1829
|
+
- share/views/tools/Rpng.haml
|
1828
1830
|
- share/views/tools/nvd3.haml
|
1829
1831
|
- share/views/tools/nvd3/chart.haml
|
1830
1832
|
- share/views/tools/nvd3/histogram.haml
|