rbbt-rest 1.9.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f704f277ce12001953704f8e901241c79f1bc0d6425967ae231455671bfa7879
4
- data.tar.gz: 07d4ca572f44e36384bd7595f1c36738b6388c4f3da1fa03827a118b5eed3724
3
+ metadata.gz: ee4b57a3f56a52f3fee6a0a1b8827835d7b0c8d45376be1f666faf4501451560
4
+ data.tar.gz: f703d52fc992dc38937859074ee046d06ac6028b596536f8ec4ebddcf5445144
5
5
  SHA512:
6
- metadata.gz: ca607c13addb28475b071f500a50e9ccac7c13007e765fb044cba6e9f41735a45e0de2ad403984bbaaf36ba662397140f06d542090bb9936981890d4b5b988c5
7
- data.tar.gz: d2f72803da7071b5e0d2c743344dc120e7ad56c387ada1d002492ad5b0eeab138b5cd0d630b72af9e5fe8156268d36f65288193c494e2c2ced69c9e6829288b6
6
+ metadata.gz: cd74b954053885e3eb8fa97d3c160cc3d4c148dc18f4f013489d296dc07cad2ca93b577e8119fc82240ea7ad5e49ed60545460a7684ebe592cb1a1567a72d6eb
7
+ data.tar.gz: 1ed08a5a7b9ecd465acb27e4cedff76affdb581980449883c2540f3ff941ee4bfdcfdc0a3c621d66e6f283d9bcecedfe046478f0423f995fcac40d29d55e45fe
@@ -50,17 +50,22 @@ module RbbtRESTHelpers
50
50
  params[:cache_file]
51
51
  else
52
52
  if post_hash = params["__post_hash_id"]
53
- name = name.gsub("/",'>') << "_" << post_hash
53
+ name = name.gsub("/",'·') << "_" << post_hash
54
54
  elsif params
55
55
  param_hash = Misc.obj2digest(params)
56
- name = name.gsub("/",'>') << "_" << param_hash
56
+ name = name.gsub("/",'·') << "_" << param_hash
57
57
  end
58
58
  settings.cache_dir[name].find
59
59
  end
60
60
 
61
61
  task = Task.setup(:name => orig_name, :result_type => :string, &block)
62
62
 
63
- step = Step.new(path, task, nil, nil, self)
63
+ if defined?(Scout)
64
+ step = Step.new(path, nil, nil, self, &task)
65
+ step.exec_context = self
66
+ else
67
+ step = Step.new(path, task, nil, nil, self)
68
+ end
64
69
 
65
70
  halt 200, step.info.to_json if @format == :info
66
71
 
@@ -103,7 +108,9 @@ module RbbtRESTHelpers
103
108
  #step.instance_variable_set(:@url_path, URI(clean_url).path)
104
109
  step.instance_variable_set(:@url, clean_url)
105
110
  step.instance_variable_set(:@url_path, URI(clean_url).path)
106
- step.clean if step.error? || step.aborted?
111
+ if (step.error? && step.recoverable_error?) || step.aborted?
112
+ step.clean
113
+ end
107
114
 
108
115
  Thread.current["step_path"] = step.path
109
116
  # Issue
@@ -170,7 +177,7 @@ module RbbtRESTHelpers
170
177
  tsv = tsv_process(raw_tsv)
171
178
 
172
179
  list = tsv.values.flatten
173
- tsv.prepare_entity(list, tsv.fields.first, tsv.entity_options)
180
+ list = tsv.prepare_entity(list, tsv.fields.first, tsv.entity_options)
174
181
  type = list.annotation_types.last
175
182
  list_id = "List of #{type} in table #{ @fragment }"
176
183
  list_id << " (#{ @filter })" if @filter
@@ -306,6 +313,7 @@ data = NULL
306
313
  begin
307
314
 
308
315
  if step.done?
316
+ step.join
309
317
  case
310
318
  when @permalink
311
319
  redirect to(permalink(step.path))
@@ -10,7 +10,8 @@ module RbbtRESTHelpers
10
10
  def add_search_paths(path, resources)
11
11
  resources.reverse.each do |resource|
12
12
  name = Misc.snake_case(resource.to_s.gsub('/','_'))
13
- path.prepend_search_path(name, resource)
13
+ #path.prepend_search_path(name, resource)
14
+ path.prepend_path(name, resource)
14
15
  end
15
16
  end
16
17
 
@@ -38,11 +39,11 @@ module RbbtRESTHelpers
38
39
  #{{{ TEMPLATE
39
40
 
40
41
  def self.template_resources
41
- @template_resources ||= [Rbbt.share.views.find(:lib)]
42
+ @@template_resources ||= [Rbbt.share.views.find(:lib)]
42
43
  end
43
44
 
44
45
  def template_resources
45
- [Rbbt.www.views] + RbbtRESTHelpers.template_resources
46
+ [Rbbt.www.views] + RbbtRESTHelpers.template_resources
46
47
  end
47
48
 
48
49
  def locate_template(template)
@@ -4,6 +4,11 @@ require 'haml'
4
4
  module RbbtRESTHelpers
5
5
  class Retry < Exception; end
6
6
 
7
+ def persist(name, type = :marshal, options = {}, &block)
8
+ options[:dir] = settings.cache_dir.find
9
+ Persist.persist(name, type, options, &block)
10
+ end
11
+
7
12
  def check_step(step)
8
13
  if File.exist?(step.info_file) and Time.now - File.atime(step.info_file) > 60
9
14
  done = step.done?
@@ -57,7 +62,12 @@ module RbbtRESTHelpers
57
62
  end
58
63
 
59
64
  def process_common_parameters
65
+ process_request_and_params(request, params)
66
+ end
67
+
68
+ def process_request_and_params(request, params)
60
69
  @ajax = request.xhr?
70
+ @params = params
61
71
 
62
72
  @uri = request.env["REQUEST_URI"]
63
73
  @uri = remove_GET_param(@uri, ["_update", "_", "_layout"])
@@ -66,12 +76,12 @@ module RbbtRESTHelpers
66
76
 
67
77
  @uri = post_uri if @is_method_post
68
78
 
69
- @path = request.env["PATH_INFO"]
79
+ @path_info = request.env["PATH_INFO"]
70
80
  @query = request.env["QUERY_STRING"]
71
- @fullpath = (@query && ! @query.empty?) ? @path + "?" + @query : @path
81
+ @fullpath = (@query && ! @query.empty?) ? @path_info + "?" + @query : @path_info
72
82
  @fullpath = remove_GET_param(@fullpath, ["_update", "_", "_layout"])
73
83
 
74
- @ajax_url = @uri
84
+ @ajax_url = @fullpath
75
85
 
76
86
  @layout = consume_parameter(:_layout)
77
87
 
@@ -143,7 +153,7 @@ module RbbtRESTHelpers
143
153
  end
144
154
 
145
155
  def consume_parameter(parameter, params = nil)
146
- params = self.params if params.nil?
156
+ params = @params ||= self.params if params.nil?
147
157
 
148
158
  val = params.delete(parameter.to_sym)
149
159
  val = params.delete(parameter.to_s) if val.nil?
@@ -274,10 +284,14 @@ module RbbtRESTHelpers
274
284
  param.each do |p|
275
285
  url = remove_GET_param(url, p)
276
286
  end
277
- url
278
287
  else
279
- url.gsub(/&?#{param}=[^&]+/,'').sub(/\?$/, '')
288
+ url = url.gsub(/(\?|&)#{param}=[^&]+/,'\1')
280
289
  end
290
+
291
+ url = url.sub(/&$/, '')
292
+ url = url.sub(/\?$/,'')
293
+
294
+ url
281
295
  end
282
296
 
283
297
  def add_GET_param(url, param, value)
@@ -320,6 +334,22 @@ module RbbtRESTHelpers
320
334
  halt response, html
321
335
  end
322
336
 
337
+ def capture(*args, &block)
338
+
339
+ variables = block.binding.local_variables
340
+ buff_var = variables.select{|v| v.to_s =~ /^_module\d+$/}.sort_by{|v| v.to_s.scan(/\d+/).first.to_i}.last
341
+ buff_was = block.binding.local_variable_get(buff_var) if variables.include? buff_var
342
+ block.binding.local_variable_set(buff_var,'') if buff_var
343
+ begin
344
+ raw = block.call(*args)
345
+ captured = block.binding.local_variable_get(buff_var) if block.binding.local_variables.include?(buff_var)
346
+ captured = "" if captured.nil?
347
+ captured = raw if captured.empty?
348
+ captured
349
+ ensure
350
+ block.binding.local_variable_set(buff_var, buff_was) if buff_was
351
+ end
352
+ end
323
353
  end
324
354
 
325
355
  if $haml_6
@@ -6,9 +6,15 @@ Tilt::SYMBOL_ARRAY_SORTABLE = false
6
6
  module RbbtRESTHelpers
7
7
  def error_for(job, layout = nil)
8
8
  if ex = job.info[:exception]
9
- klass = ex[:class]
10
- msg = ex[:message]
11
- bkt = ex[:backtrace]
9
+ if Exception === ex
10
+ klass = ex.class
11
+ msg = ex.message
12
+ bkt = ex.backtrace
13
+ else
14
+ klass = ex[:class]
15
+ msg = ex[:message]
16
+ bkt = ex[:backtrace]
17
+ end
12
18
  elsif job.dirty?
13
19
  klass = "Exception"
14
20
  msg = "Job dirty"
@@ -232,7 +238,7 @@ module RbbtRESTHelpers
232
238
  filename = Misc.sanitize_filename(Misc.name2basename(filename))
233
239
 
234
240
  if @step
235
- url = add_GET_param(remove_GET_param(@uri, ["_update", "_"]), "_fragment", "html_resources/#{ filename }")
241
+ url = add_GET_param(remove_GET_param(@fullpath, ["_update", "_"]), "_fragment", "html_resources/#{ filename }")
236
242
  f = @step.file(:html_resources)[filename].find
237
243
  else
238
244
  url = "/files/#{ filename }"
@@ -249,7 +255,7 @@ module RbbtRESTHelpers
249
255
  when :image
250
256
  "<img src='#{url}' alt='#{text}' class='file_resource'/>"
251
257
  when :link
252
- "<a href='#{url}' class='file_resource'>#{ text }</a>"
258
+ "<a href='#{url}' class='file_resource' download='#{filename}'>#{ text }</a>"
253
259
  when :linked_image
254
260
  "<a href='#{url}' class='file_resource' target='_blank'><img src='#{url}' class='file_resource'/></a>"
255
261
  when :zoomable_image
@@ -270,7 +276,7 @@ module RbbtRESTHelpers
270
276
  filename = File.basename(TmpFile.tmp_file) if filename.nil?
271
277
 
272
278
  if @step
273
- url = add_GET_param(remove_GET_param(@uri, ["_update", "_"]), "_fragment", "json_resources/#{ filename }")
279
+ url = add_GET_param(remove_GET_param(@fullpath, ["_update", "_"]), "_fragment", "json_resources/#{ filename }")
274
280
  f = @step.file(:json_resources)[filename].find
275
281
  else
276
282
  url = "/files/#{ filename }"
@@ -77,6 +77,12 @@ module NumericValue
77
77
  extend Entity
78
78
 
79
79
  self.format =(<<-EOF
80
+ NumericValue
81
+ Numeric Value
82
+ Numeric
83
+ numeric_value
84
+ numeric value
85
+ numeric
80
86
  p-value
81
87
  p-value
82
88
  p.value
@@ -147,44 +153,19 @@ end
147
153
 
148
154
  module RbbtRESTHelpers
149
155
 
150
- def capture(*args, &block)
151
-
152
- variables = block.binding.local_variables
153
- #variables.each do |v|
154
- # iif [v, block.binding.local_variable_get(v)]
155
- #end
156
- buff_var = variables.select{|v| v.to_s =~ /^_module\d+$/}.sort_by{|v| v.to_s.scan(/\d+/).first.to_i}.last
157
- buff_was = block.binding.local_variable_get(buff_var) if variables.include? buff_var
158
- block.binding.local_variable_set(buff_var,'') if buff_var
159
- begin
160
- raw = block.call(*args)
161
- #variables = block.binding.local_variables
162
- #iii variables
163
- #variables.each do |v|
164
- # iif [v, block.binding.local_variable_get(v)]
165
- #end
166
- captured = block.binding.local_variable_get(buff_var) if block.binding.local_variables.include?(buff_var)
167
- captured = "" if captured.nil?
168
- captured = raw if captured.empty?
169
- captured
170
- ensure
171
- block.binding.local_variable_set(buff_var, buff_was) if buff_was
172
- end
173
- end
174
-
175
156
  def tsv_rows_full(tsv)
176
157
  case tsv.type
177
158
  when :single
178
159
  tsv.collect{|id, value| [id, value]}
179
160
  when :list
180
161
  key_field = tsv.key_field
181
- tsv.collect{|id, values| new_values = [id].concat(values); begin NamedArray.setup(new_values, values.fields, id, values.entity_options, values.entity_templates); new_values.fields = [key_field].concat values.fields end if values.respond_to? :fields; new_values }
162
+ tsv.collect{|id, values| new_values = [id].concat(values); begin NamedArray.setup(new_values, values.fields, id, values.entity_options); new_values.fields = [key_field].concat values.fields end if values.respond_to? :fields; new_values }
182
163
  when :flat
183
164
  key_field = tsv.key_field
184
165
  tsv.collect{|id, values| [id, values]}
185
166
  when :double
186
167
  key_field = tsv.key_field
187
- tsv.collect{|id, value_lists| new_value_lists = [id].concat(value_lists); begin NamedArray.setup(new_value_lists, value_lists.fields, id, value_lists.entity_options, value_lists.entity_templates); new_value_lists.fields = ([key_field].concat value_lists.fields) end if value_lists.respond_to? :fields; new_value_lists }
168
+ tsv.collect{|id, value_lists| new_value_lists = [id].concat(value_lists); begin NamedArray.setup(new_value_lists, value_lists.fields, id, value_lists.entity_options); new_value_lists.fields = ([key_field].concat value_lists.fields) end if value_lists.respond_to? :fields; new_value_lists }
188
169
  end
189
170
  end
190
171
 
@@ -195,6 +176,7 @@ module RbbtRESTHelpers
195
176
 
196
177
  field = "key" if field.nil? or field.empty?
197
178
  size = PAGE_SIZE if size.nil? or size.empty?
179
+ num = 1 if num.nil? || num.empty?
198
180
 
199
181
  [num, size, field]
200
182
  end
@@ -214,11 +196,7 @@ module RbbtRESTHelpers
214
196
 
215
197
  field = CGI.unescapeHTML(Entity::REST.restore_element(field))
216
198
 
217
- if object.entity_templates[field]
218
- entity = object.entity_templates[field].annotation_types.last
219
- else
220
- entity = Entity.formats[field]
221
- end
199
+ entity = Entity.formats[field]
222
200
 
223
201
  if num == 'all'
224
202
  num = 1
@@ -235,9 +213,9 @@ module RbbtRESTHelpers
235
213
 
236
214
  object.with_unnamed do
237
215
  if entity and entity.respond_to? :tsv_sort
238
- object.page(num, size, field, false, reverse, &entity.method(:tsv_sort))
216
+ object.page(num, size, field, false, reverse, &entity.method(:tsv_sort)).tap{|o| o.unnamed = false }
239
217
  else
240
- object.page(num, size, field, false, reverse)
218
+ object.page(num, size, field, false, reverse).tap{|o| o.unnamed = false }
241
219
  end
242
220
  end
243
221
  end
@@ -389,19 +367,7 @@ module RbbtRESTHelpers
389
367
 
390
368
  def self.save_tsv(tsv, path)
391
369
  Open.write(path, tsv.to_s)
392
- table_options = {:tsv_entity_options => tsv.entity_options, :tsv_entity_templates => tsv.entity_templates}
393
- if tsv.entity_templates and tsv.entity_templates.any?
394
- table_options[:headers] ||= {}
395
- tsv.entity_templates.each do |field,template|
396
- next if template.nil?
397
- next if table_options[:headers].include? field
398
- info = template.info
399
- info.delete :format
400
- info.delete :annotation_types
401
- info.delete :annotated_array
402
- table_options[:headers][field] = [template.annotation_types.last.to_s, info]
403
- end
404
- end
370
+ table_options = {:tsv_entity_options => tsv.entity_options}
405
371
  Open.write(path + '.table_options', table_options.to_yaml )
406
372
  end
407
373
 
@@ -442,7 +408,7 @@ module RbbtRESTHelpers
442
408
  if @step
443
409
  table_file = @step.file(table_code) if @step
444
410
 
445
- url = add_GET_param(@uri, "_fragment", File.basename(table_file))
411
+ url = add_GET_param(@fullpath, "_fragment", File.basename(table_file))
446
412
  url = remove_GET_param(url, "_update")
447
413
  url = remove_GET_param(url, "_layout")
448
414
  url = remove_GET_param(url, "_")
@@ -63,7 +63,7 @@ module EntityRESTHelpers
63
63
  locals = {}
64
64
  info = {:inputs => inputs, :input_descriptions => input_descriptions, :input_defaults => input_defaults, :input_options => input_options, :input_types => input_types, :values => values}
65
65
  locals[:id] = action_parameters_id
66
- locals[:action] = @ajax_url
66
+ locals[:action] = @fullpath
67
67
  locals[:klass] = 'action_parameter_form'
68
68
  locals[:info] = info
69
69
  #locals[:description] = description
@@ -223,11 +223,8 @@ module EntityRESTHelpers
223
223
 
224
224
  field = map.key_field
225
225
 
226
- if map.entity_templates[field]
227
- types = map.entity_templates[field].annotation_types
228
- else
229
- types = [Entity.formats[field]].compact
230
- end
226
+ types = [Entity.formats[field]].compact
227
+
231
228
  types += ["Default"]
232
229
 
233
230
  path = nil
@@ -248,11 +245,8 @@ module EntityRESTHelpers
248
245
 
249
246
  field = map.key_field
250
247
 
251
- if map.entity_templates[field]
252
- types = map.entity_templates[field].annotation_types
253
- else
254
- types = [Entity.formats[field]].compact
255
- end
248
+ types = [Entity.formats[field]].compact
249
+
256
250
  types += ["Default"]
257
251
 
258
252
  paths = types.inject([]) do |acc,type|
@@ -28,8 +28,7 @@ module EntityRESTHelpers
28
28
  entity_annotations[annotation] = value
29
29
  end
30
30
 
31
- entity.extend entity_class
32
- entity_class.setup_hash(entity, entity_annotations)
31
+ entity_class.setup(entity, entity_annotations)
33
32
  entity.format = format if format and entity.respond_to? :format
34
33
 
35
34
  entity
@@ -122,7 +122,6 @@ module Entity
122
122
  #{{{ LINKS
123
123
 
124
124
  def link(text = nil, options = {})
125
- #return self.tap{|a| a.extend AnnotatedArray}.collect{|e| e.link(text, options) } if Array === self
126
125
  return self.collect{|e| e.nil? ? nil : e.link(text, options) } if Array === self
127
126
  return self.split(";").collect{|e| self.annotate(e).link(text, options) } * ", " if self.include? ";"
128
127
  return nil if self.empty?
@@ -187,7 +186,7 @@ module Entity
187
186
 
188
187
  reuse = options.delete(:reuse)
189
188
  reuse = options.delete("reuse") if reuse.nil?
190
- reuse = true if reuse.nil?
189
+ reuse = false if reuse.nil?
191
190
 
192
191
  Entity::List.save_list(entity_type.to_s, id, self) unless reuse and File.exist?(Entity::List.list_file(entity_type.to_s, id))
193
192
 
@@ -201,8 +201,10 @@ module Sinatra
201
201
 
202
202
  annotations[:annotation_types] ||= [type]
203
203
 
204
+ annotations.delete_if{|k,v| v.empty? }
205
+
204
206
  mod = Kernel.const_get(type)
205
- list = mod.setup(entities.reject{|e| e.empty?}, annotations)
207
+ list = mod.setup(entities.reject{|e| e.empty? }, annotations)
206
208
 
207
209
  Entity::List.save_list(type, list_id, list, user)
208
210
 
@@ -18,6 +18,7 @@ require 'nakayoshi_fork'
18
18
 
19
19
  Rbbt.add_version(__FILE__)
20
20
 
21
+ Path.add_path :rbbt_rest, File.join(Path.caller_lib_dir(__FILE__), "{TOPLEVEL}/{SUBPATH}")
21
22
  module Sinatra
22
23
  module RbbtRESTMain
23
24
 
@@ -133,7 +134,7 @@ module Sinatra
133
134
  Log.info{ "Profile saved at #{ dir }: #{@uri}" }
134
135
  end
135
136
 
136
- response.header["URI"] = @uri
137
+ headers "URI" => @uri
137
138
  end
138
139
 
139
140
  add_sass_load_path Rbbt.views.compass.find
@@ -269,7 +269,7 @@ module WorkflowRESTHelpers
269
269
 
270
270
  begin
271
271
  # $rest_cache_semaphore is defined in rbbt-util etc/app.d/semaphores.rb
272
- job.fork($rest_cache_semaphore) unless job.started?
272
+ job.fork(true, $rest_cache_semaphore) unless job.started?
273
273
 
274
274
  if @format == :jobname
275
275
  job.soft_grace
@@ -311,7 +311,11 @@ module WorkflowRESTHelpers
311
311
  end
312
312
 
313
313
  def abort_job(workflow, job)
314
- job.abort
314
+ begin
315
+ job.abort
316
+ rescue Exception
317
+ Log.exception $!
318
+ end
315
319
  halt 200, "Aborted #{ job.path }"
316
320
  end
317
321
 
@@ -6,7 +6,7 @@ module WorkflowRESTHelpers
6
6
  end
7
7
 
8
8
  def workflow_resources
9
- [Rbbt.www.views.find(:lib)] + WorkflowRESTHelpers.workflow_resources
9
+ @workflow_resources ||= [Rbbt.www.views.find(:lib)] + WorkflowRESTHelpers.workflow_resources
10
10
  end
11
11
 
12
12
  def locate_workflow_template(template, workflow = nil, task = nil)
@@ -235,7 +235,7 @@ module Sinatra
235
235
  task_inputs = task_info[:inputs]
236
236
  TmpFile.with_file do |basedir|
237
237
  dir = File.join(basedir, 'inputs')
238
- Step.save_job_inputs(job, dir)
238
+ workflow.tasks[task].save_inputs(dir, job.recursive_inputs)
239
239
  filename = File.join(basedir, job.clean_name + '.input_bundle.tar.gz')
240
240
  content_type "application/tar+gzip"
241
241
  Misc.consume_stream(Misc.tarize(dir), false, filename)
@@ -317,6 +317,7 @@ module Sinatra
317
317
  # end
318
318
  #end
319
319
  mime = file_mimetype(path)
320
+ mime = 'html' if path.ends_with?('.html')
320
321
  content_type mime if mime
321
322
  send_file path
322
323
  end
@@ -25,7 +25,7 @@
25
25
  - controller.actions.each do |action, text, resource, params|
26
26
  -#.ui.item.button(class="#{last_resource and last_resource != resource ? "new_resource" : ""}" attr-resource="#{resource}")
27
27
  - case
28
- - when AnnotatedArray === entity
28
+ - when (AnnotatedArray === entity) && (Array === entity)
29
29
  - id = params.delete :id if Hash === params
30
30
  - id = controller.id if id.nil?
31
31
  = entity.list_action_link action, text, id, params.merge(:reuse => true, :class => 'ui item button')
@@ -96,7 +96,7 @@
96
96
  - if defined? block and block
97
97
  /-- description block --
98
98
  .description.ui.basic.segment<
99
- = capture &block
99
+ = capture(&block)
100
100
 
101
101
  - card.sections.each do |name,section_block|
102
102
  .ui.very.basic.segment(id="#{Misc.snake_case(name)}")
@@ -83,7 +83,7 @@
83
83
  .content
84
84
  .description
85
85
  = table :class => 'ui collapsing table', :table_id => map_id do
86
- - map
86
+ - next map
87
87
  - if card.action_controller
88
88
  .actions
89
89
  = action_controller_render(card.action_controller)
@@ -13,30 +13,31 @@
13
13
  - else
14
14
  - if ! job.updated?
15
15
  %pre.error_message.ui.basic.segment.content
16
- Job out of date. Dependencies: #{job.out_of_date.collect{|d| d.path} * ", "}
16
+ Job out of date. Dependencies: #{job.newer_dependencies.collect{|d| d.path} * ", "}
17
17
  - else
18
18
  %pre.error_message.ui.basic.segment.content
19
19
  Unknown Error (status: #{job.status})
20
20
 
21
21
 
22
22
 
23
- - if defined? job.info_file and Open.exists? job.info_file and @uri.include? job.name
24
- - clean_url = add_GET_param(remove_GET_param(@uri, "_layout"), "_update", "clean")
23
+ - if defined? job.info_file and Open.exists? job.info_file and @path_info.include? job.name
24
+ - clean_url = add_GET_param(remove_GET_param(@path_info, "_layout"), "_update", "clean")
25
25
  %a.ui.button.blue.clean(href=clean_url) Clean
26
26
  - else
27
- - clean_url = add_GET_param(remove_GET_param(@uri, "_layout"), "_update", "reload")
27
+ - clean_url = add_GET_param(remove_GET_param(@path_info, "_layout"), "_update", "reload")
28
28
  %a.ui.blue.button.reload(href=clean_url) Reload
29
29
 
30
- - info_url = @uri.sub(/\?.*/,'') + '/info'
31
- - if @uri.include? job.name
30
+ - info_url = @path_info.sub(/\?.*/,'') + '/info'
31
+ - if @path_info.include? job.name
32
32
  %a.ui.blue.button.reload(href=info_url) Info
33
33
 
34
- - if job.files.any? and @uri.include? job.name
35
- - files_url = @uri.sub(/\?.*/,'') + '/files'
34
+ - if job.files.any? and @path_info.include? job.name
35
+ - files_url = @path_info.sub(/\?.*/,'') + '/files'
36
36
  %a.ui.blue.button.reload(href=files_url) Files
37
37
 
38
38
 
39
39
  - backtrace = job.info[:backtrace]
40
+ - backtrace ||= job.info[:exception].backtrace if Exception === job.info[:exception]
40
41
  - if backtrace and backtrace.any?
41
42
 
42
43
  .error_backtrace.clean_list.ui.segment
@@ -49,7 +49,8 @@
49
49
  overflow: auto
50
50
  border: 1px solid #EEE
51
51
 
52
- - inputs.fields.each_with_index do |f, ix|
52
+ - input_fields = Hash === inputs ? inputs.keys : inputs.fields
53
+ - input_fields.each_with_index do |f, ix|
53
54
  - i = inputs[ix]
54
55
  - next unless task_inputs.include?(f)
55
56
  %dt= f
@@ -73,7 +74,7 @@
73
74
  - if exception
74
75
  - tab.active "Exception"
75
76
  - tab.add "Exception" do
76
- - backtrace = exception[:backtrace]
77
+ - backtrace = exception.respond_to?(:backtrace) ? exception.backtrace : exception[:backtrace]
77
78
  .error_backtrace.clean_list
78
79
  .ui.header Backtrace
79
80
  %pre.ui.content
@@ -1,4 +1,6 @@
1
1
  - if job.path =~ /\.svg$/i
2
2
  = result
3
3
  - else
4
- %pre.result_text= result
4
+ %pre.result_text
5
+ :escaped
6
+ #{result}
@@ -2,7 +2,7 @@
2
2
  .job_control
3
3
  = workflow_partial('job_result/job_control', workflow, task, locals)
4
4
 
5
- - type ||= job.info[:result_type]
5
+ - type ||= job.info[:result_type] || job.info[:type]
6
6
  - case type
7
7
  - when :tsv
8
8
  = workflow_partial('job_result/tsv', workflow, task, locals)
@@ -11,18 +11,32 @@
11
11
  %input(type="search" name="term" placeholder='Search')
12
12
 
13
13
  #aesthetics.item
14
+ - main_actions = glob_all_server_files("main/*.haml", RbbtRESTHelpers.template_resources)
15
+ - if main_actions.any?
16
+ - main_actions = main_actions.collect do |file|
17
+ - _, _, filename = file.partition("main/")
18
+ - filename.sub('.haml','')
19
+ .main.ui.simple.dropdown.item.right
20
+ %i.icon.dropdown
21
+ Main pages
22
+ .menu
23
+ - main_actions.each do |action|
24
+ %a.item(href='#{'/main/' + action}')
25
+ = action.to_s
26
+
27
+
14
28
  - if defined? Sinatra::RbbtRESTWorkflow and Sinatra::RbbtRESTWorkflow::WORKFLOWS
15
- - expoted_workflows = Sinatra::RbbtRESTWorkflow::WORKFLOWS.collect do |workflow|
29
+ - exported_workflows = Sinatra::RbbtRESTWorkflow::WORKFLOWS.collect do |workflow|
16
30
  - next if workflow.asynchronous_exports.empty? and workflow.synchronous_exports.empty? and workflow.exec_exports.empty?
17
31
  - workflow
18
32
 
19
- - expoted_workflows.compact!
20
- - if expoted_workflows.any?
33
+ - exported_workflows.compact!
34
+ - if exported_workflows.any?
21
35
  .workflow.ui.simple.dropdown.item.right
22
36
  %i.icon.dropdown
23
37
  Workflows
24
38
  .menu
25
- - expoted_workflows.each do |workflow|
39
+ - exported_workflows.each do |workflow|
26
40
  %a.item(href='#{'/' + workflow.to_s}')
27
41
  - if production?
28
42
  = workflow.to_s
@@ -1,88 +1,89 @@
1
1
 
2
2
  - cache = {} if not defined?(cache) or cache.nil?
3
3
 
4
- %ul.dependencies
5
- - job.dependencies.reverse.each do |dep|
6
- - dep_workflow = dep.workflow
7
- - dep_workflow = nil if dep_workflow == ""
8
- - dep_workflow ||= dep.task.workflow if dep.task
9
- - dep_workflow = nil if dep_workflow == ""
10
- - dep_workflow ||= File.basename(File.dirname(File.dirname(dep.path)))
11
- - dep_workflow = nil if dep_workflow == ""
12
- - str = [dep_workflow, dep.task_name, dep.name].compact * " - "
13
- - remote = true if Open.remote?(dep.path) || Open.ssh?(dep.path)
4
+ - if job.dependencies
5
+ %ul.dependencies
6
+ - job.dependencies.reverse.each do |dep|
7
+ - dep_workflow = dep.workflow
8
+ - dep_workflow = nil if dep_workflow == ""
9
+ - dep_workflow ||= dep.task.workflow if dep.task
10
+ - dep_workflow = nil if dep_workflow == ""
11
+ - dep_workflow ||= File.basename(File.dirname(File.dirname(dep.path)))
12
+ - dep_workflow = nil if dep_workflow == ""
13
+ - str = [dep_workflow, dep.task_name, dep.name].compact * " - "
14
+ - remote = true if Open.remote?(dep.path) || Open.ssh?(dep.path)
14
15
 
15
- - if remote
16
- - dep_status = "done" if dep.done?
17
- - else
18
- - dep_status = "done" if dep.path.exists?
16
+ - if remote
17
+ - dep_status = "done" if dep.done?
18
+ - else
19
+ - dep_status = "done" if Open.exists?(dep.path)
19
20
 
20
- - dep_status ||= dep.status
21
- - if ! remote && ! dep_status == 'done' && dep.file(:progress).exists?
22
- - pgr = dep.file(:progress).yaml
23
- - if pgr and pgr[:last_percent]
24
- - start = pgr[:start]
25
- - last_time = pgr[:last_time]
21
+ - dep_status ||= dep.status
22
+ - if ! remote && ! dep_status == 'done' && dep.file(:progress).exists?
23
+ - pgr = dep.file(:progress).yaml
24
+ - if pgr and pgr[:last_percent]
25
+ - start = pgr[:start]
26
+ - last_time = pgr[:last_time]
26
27
 
27
- - ellapsed = last_time - start
28
- - if pgr[:mean]
29
- - missing = pgr[:max].to_f - pgr[:ticks].to_f
30
- - eta = missing / pgr[:mean].to_f
31
- - else
32
- - ratio = pgr[:ticks].to_f/pgr[:max].to_f
33
- - eta = ellapsed * (1 - ratio)
34
- - eta = Misc.format_seconds(eta)
35
- - ellapsed = Misc.format_seconds(ellapsed)
36
- - pgr_str = " - " + pgr[:last_percent].to_s + "%" + " " + eta
28
+ - ellapsed = last_time - start
29
+ - if pgr[:mean]
30
+ - missing = pgr[:max].to_f - pgr[:ticks].to_f
31
+ - eta = missing / pgr[:mean].to_f
32
+ - else
33
+ - ratio = pgr[:ticks].to_f/pgr[:max].to_f
34
+ - eta = ellapsed * (1 - ratio)
35
+ - eta = Misc.format_seconds(eta)
36
+ - ellapsed = Misc.format_seconds(ellapsed)
37
+ - pgr_str = " - " + pgr[:last_percent].to_s + "%" + " " + eta
37
38
 
38
- :deferjs
39
- var percent = '#{pgr[:last_percent]}';
40
- var task = '#{dep.task_name}';
41
- var title = $('head title');
42
- var current = title.text();
43
- var newtext;
44
- var pos = current.indexOf('%');
45
- if (pos == -1){
46
- newtext = task + " - " + percent + "% " + current
47
- }else{
48
- newtext = task + " - " + percent + "% " + current.slice(pos+1)
49
- }
50
- title.text(newtext)
39
+ :deferjs
40
+ var percent = '#{pgr[:last_percent]}';
41
+ var task = '#{dep.task_name}';
42
+ var title = $('head title');
43
+ var current = title.text();
44
+ var newtext;
45
+ var pos = current.indexOf('%');
46
+ if (pos == -1){
47
+ newtext = task + " - " + percent + "% " + current
48
+ }else{
49
+ newtext = task + " - " + percent + "% " + current.slice(pos+1)
50
+ }
51
+ title.text(newtext)
51
52
 
53
+ - else
54
+ - pgr_str = " - " + pgr[:ticks].to_s
55
+ - status = dep_status.to_s + pgr_str
52
56
  - else
53
- - pgr_str = " - " + pgr[:ticks].to_s
54
- - status = dep_status.to_s + pgr_str
55
- - else
56
- - status = dep_status
57
- - name = dep.name
58
- %li
59
- %span.workflow= dep_workflow
60
- %span.task= dep.task_name
61
- %span.name
62
- - if String === dep_workflow
63
- - wf ||= begin
64
- - Kernel.const_get dep_workflow
65
- - rescue
66
- - elsif Module === dep_workflow
67
- - wf = dep_workflow
57
+ - status = dep_status
58
+ - name = dep.name
59
+ %li
60
+ %span.workflow= dep_workflow
61
+ %span.task= dep.task_name
62
+ %span.name
63
+ - if String === dep_workflow
64
+ - wf ||= begin
65
+ - Kernel.const_get dep_workflow
66
+ - rescue
67
+ - elsif Module === dep_workflow
68
+ - wf = dep_workflow
68
69
 
69
- - if remote
70
- - url = dep.path.split("?").first
71
- %a(href=url) #{ name }
70
+ - if remote
71
+ - url = dep.path.split("?").first
72
+ %a(href=url) #{ name }
72
73
 
73
- - elsif wf and Sinatra::RbbtRESTWorkflow::WORKFLOWS.include?(wf) and wf.task_exports.include? dep.task_name.to_sym
74
- - url = "/" + [dep_workflow.to_s, dep.task_name.to_s, dep.name.to_s] * "/"
75
- %a(href=url) #{ name }
74
+ - elsif wf and Sinatra::RbbtRESTWorkflow::WORKFLOWS.include?(wf) and wf.task_exports.include? dep.task_name.to_sym
75
+ - url = "/" + [dep_workflow.to_s, dep.task_name.to_s, dep.name.to_s] * "/"
76
+ %a(href=url) #{ name }
76
77
 
77
- - else
78
- = name
78
+ - else
79
+ = name
79
80
 
80
81
 
81
- %span.status(class="#{dep_status}") [#{status}]
82
+ %span.status(class="#{dep_status}") [#{status}]
82
83
 
83
- - if dep.dependencies && dep.dependencies.any?
84
- - if cache[dep.path]
85
- = reveal "(deps)", nil, :title => "Dependencies already shown above", "attr-reveal_title" => "#{[dep_workflow, dep.task_name, dep.name] * " &num; "}" do
86
- = cache[dep.path]
87
- - else
88
- = cache[dep.path] ||= partial_render('partials/dependencies', :job => dep, :cache => cache)
84
+ - if dep.dependencies && dep.dependencies.any?
85
+ - if cache[dep.path]
86
+ = reveal "(deps)", nil, :title => "Dependencies already shown above", "attr-reveal_title" => "#{[dep_workflow, dep.task_name, dep.name] * " &num; "}" do
87
+ = cache[dep.path]
88
+ - else
89
+ = cache[dep.path] ||= partial_render('partials/dependencies', :job => dep, :cache => cache)
@@ -60,7 +60,7 @@
60
60
  - if uses
61
61
  - uses.each do |workflow, tasks|
62
62
  - tasks.each do |task|
63
- - use_tags << [workflow, task] * "#"
63
+ - use_tags << [workflow.to_s, task.to_s] * "#"
64
64
  - input_id = id.nil? ? nil : id + "__" << input.to_s
65
65
  - hide = (options[input] != nil and options[input][:hide])
66
66
  %div(class="field #{types[input]} #{input} #{hide ? 'hide' : ''}" attr-use_tags='#{use_tags * " "}')
@@ -72,7 +72,8 @@
72
72
  - uses.each do |workflow, tasks|
73
73
  - tasks.each do |task|
74
74
  - description << " * " << [workflow.to_s, task] * "#" << "\n"
75
- !~ form_input(input, types[input], defaults[input], values[input] || locals[input], description, input_id, input_options)
75
+ - value = values[input].nil? ? locals[input] : values[input]
76
+ !~ form_input(input, types[input], defaults[input], value, description, input_id, input_options)
76
77
 
77
78
 
78
79
  - if bundle && inputs.any?
@@ -50,8 +50,13 @@
50
50
 
51
51
  %tr(id=row_id)
52
52
  - row.each_with_index do |value, i|
53
- - list_id = "#{ Misc.humanize(table_id) }: #{header[i]} for #{row.first}" if list_links and table_id and header and AnnotatedArray === value
54
53
  - field = header ? header[i] : nil
54
+ - if entity_headers && entity_headers[field]
55
+ - entity_field, entity_options = entity_headers[field]
56
+ - value = Entity.prepare_entity(value, entity_field, entity_options)
57
+ - else
58
+ - value = Entity.prepare_entity(value, field)
59
+ - list_id = "#{ Misc.humanize(table_id) }: #{header[i]} for #{row.first}" if list_links and table_id and header and AnnotatedArray === value
55
60
  - val = table_value(value, field, :list_id => list_id, :unnamed => unnamed, :entity_options => entity_options, :span => span)
56
61
  - case val.to_s
57
62
  - when 'TRUE', 'true', 'Yes', 'yes'
@@ -130,7 +130,7 @@ body.on('click', '.edit_list input[type=submit]', function(){
130
130
 
131
131
  if (undefined !== format){ entity_type = entity_type + ':' + clean_element(format) }
132
132
 
133
- var url = '/entity_list/' + clean_element(entity_type) + '/' + clean_element(new_list_id )
133
+ var url = '/entity_list/' + clean_element(entity_type) + '/' + clean_element(new_list_id)
134
134
 
135
135
  url = rbbt.url_add_script_name(url)
136
136
  get_ajax({url: url, type: 'POST', async: false, data: {annotations: JSON.stringify(annotations), entities: entities}}, function(){ window.location = url })
@@ -20,9 +20,7 @@
20
20
 
21
21
  - tasks.sort.each do |task|
22
22
  %li
23
- //%a(href="#{to(File.join("/", workflow.to_s, task.to_s))}")= task
24
23
  %a(href="#{File.join("/", workflow.to_s, task.to_s)}")= task
25
- - info = workflow.task_info(task)
26
- - if info[:description]
27
- %span= info[:description].split(/\n\s*\n/).first
24
+ - if workflow.tasks[task].description
25
+ %span= workflow.tasks[task].description.split(/\n\s*\n/).first
28
26
 
@@ -4,12 +4,16 @@
4
4
  - size = 3 unless defined? size and size
5
5
  - width = size unless defined? width and width
6
6
  - height = size unless defined? height and height
7
+ - svg = true unless defined? svg
7
8
  - plot = block.call unless (defined? plot and plot) or not defined? block
8
9
  - plot_options = {} unless defined? plot_options and plot_options
9
10
 
10
11
  - filename += '.png' unless filename =~ /\.png$/i
11
12
  - require 'rbbt/util/R'
12
13
 
13
- = resource filename, text, :image do |filename|
14
- - R::PNG.ggplot(filename, data, plot, width, height, plot_options)
14
+ - if svg
15
+ = R::SVG.ggplot(data, plot, width, height, plot_options)
16
+ - else
17
+ = resource filename, text, :image do |filename|
18
+ - R::PNG.ggplot(filename, data, plot, width, height, plot_options)
15
19
 
@@ -7,13 +7,17 @@
7
7
  overflow: auto
8
8
  text-overflow: ellipsis
9
9
 
10
+ - title = "#{job.status} #{File.basename(job.name)}"
11
+ :deferjs
12
+ $('head title').text("#{title}")
13
+
14
+
10
15
  - progress = false
11
16
  .wait.ui.segment.info.message
12
17
  %h3.ui.header Waiting on #{format_name File.basename(job.name)}
13
18
 
14
19
  %span.ui.basic.segment.content.status= job.status
15
20
 
16
-
17
21
  - if job.file(:progress).exists?
18
22
  .footer.ui.basic.segment
19
23
  - progress = job.file(:progress).yaml
@@ -65,22 +69,24 @@
65
69
  :deferjs
66
70
  $('.step.progress').progress({label: 'ratio',text:{ratio: '{value}'}})
67
71
 
72
+
68
73
  %hr
69
- - if defined? job.info_file and File.exist? job.info_file and @uri.include? job.name
70
- - abort_url = add_GET_param(remove_GET_param(@uri, "_layout"), "_update", "abort")
74
+
75
+ - if defined?(job.info_file) and File.exist?(job.info_file) and @fullpath.include?(job.name)
76
+ - abort_url = add_GET_param(remove_GET_param(@fullpath, "_layout"), "_update", "abort")
71
77
  %a.ui.button.red.abort(href=abort_url) Abort
72
78
  -#- clean_url = add_GET_param(remove_GET_param(@uri, "_layout"), "_update", "clean")
73
79
  -#%a.ui.button.blue.clean(href=clean_url) Clean
74
80
  - else
75
- - clean_url = add_GET_param(remove_GET_param(@uri, "_layout"), "_update", "reload")
81
+ - clean_url = add_GET_param(remove_GET_param(@fullpath, "_layout"), "_update", "reload")
76
82
  %a.ui.blue.button.reload(href=clean_url) Reload
77
83
 
78
- - if @uri.include? job.name
79
- - info_url = @uri.sub(/\?.*/,'') + '/info'
80
- %a.ui.blue.button.reload(href=info_url) Info
84
+ - if @fullpath.include?(job.name)
85
+ - info_url = @fullpath.sub(/\?.*/,'') + '/info'
86
+ %a.ui.blue.button.reload(href=@fullpath) Info
81
87
 
82
- - if job.files.any? and @uri.include? job.name
83
- - files_url = @uri.sub(/\?.*/,'') + '/files'
88
+ - if job.files.any? and @fullpath.include? job.name
89
+ - files_url = @fullpath.sub(/\?.*/,'') + '/files'
84
90
  %a.ui.blue.button.reload(href=files_url) Files
85
91
 
86
92
  - if ! progress
@@ -95,14 +101,15 @@
95
101
  }
96
102
 
97
103
 
98
- .ui.segment
99
- %h3.ui.header Log
100
- %ul.step_messages.clean_list
101
- - job.messages.reverse.each do |line|
102
- - next if line.nil? or line.strip.empty?
103
- %li= line
104
+ - if job.messages
105
+ .ui.segment
106
+ %h3.ui.header Log
107
+ %ul.step_messages.clean_list
108
+ - job.messages.reverse.each do |line|
109
+ - next if line.nil? or line.strip.empty?
110
+ %li= line
104
111
 
105
- - if job.dependencies.any?
112
+ - if job.dependencies && job.dependencies.any?
106
113
 
107
114
  .ui.segment
108
115
  %h3.ui.header Dependencies
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.9.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-14 00:00:00.000000000 Z
11
+ date: 2025-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: modular-scale
@@ -1853,7 +1853,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1853
1853
  - !ruby/object:Gem::Version
1854
1854
  version: '0'
1855
1855
  requirements: []
1856
- rubygems_version: 3.5.0.dev
1856
+ rubygems_version: 3.5.23
1857
1857
  signing_key:
1858
1858
  specification_version: 4
1859
1859
  summary: Rbbt Web and REST interfaces