rbbt-rest 1.8.62 → 1.8.63
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.
- 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
|