rbbt-rest 1.1.4 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/config.ru +3 -0
- data/lib/rbbt/rest/client.rb +9 -10
- data/lib/rbbt/rest/common/cache.rb +32 -7
- data/lib/rbbt/rest/common/forms.rb +33 -0
- data/lib/rbbt/rest/common/locate.rb +4 -0
- data/lib/rbbt/rest/common/misc.rb +24 -0
- data/lib/rbbt/rest/common/render.rb +26 -9
- data/lib/rbbt/rest/common/resources.rb +1 -1
- data/lib/rbbt/rest/common/table.rb +87 -26
- data/lib/rbbt/rest/common/users.rb +5 -1
- data/lib/rbbt/rest/entity.rb +300 -95
- data/lib/rbbt/rest/entity/action_controller.rb +6 -1
- data/lib/rbbt/rest/entity/entity_list_card.rb +1 -1
- data/lib/rbbt/rest/entity/entity_map_card.rb +15 -0
- data/lib/rbbt/rest/entity/favourites.rb +57 -1
- data/lib/rbbt/rest/entity/finder.rb +1 -1
- data/lib/rbbt/rest/entity/helpers.rb +40 -7
- data/lib/rbbt/rest/entity/list.rb +8 -0
- data/lib/rbbt/rest/entity/locate.rb +114 -0
- data/lib/rbbt/rest/entity/map.rb +99 -0
- data/lib/rbbt/rest/entity/render.rb +25 -0
- data/lib/rbbt/rest/entity/rest.rb +33 -4
- data/lib/rbbt/rest/main.rb +27 -4
- data/lib/rbbt/rest/workflow.rb +7 -1
- data/lib/rbbt/rest/workflow/jobs.rb +21 -1
- data/share/views/compass/app.sass +17 -9
- data/share/views/compass/entity_card.sass +16 -3
- data/share/views/compass/favourites.sass +44 -2
- data/share/views/compass/form.sass +11 -0
- data/share/views/compass/list_container.sass +1 -1
- data/share/views/compass/reveal.sass +31 -0
- data/share/views/compass/style.sass +29 -1
- data/share/views/compass/style_mixins.sass +18 -6
- data/share/views/compass/table.sass +19 -3
- data/share/views/compass/topbar.sass +8 -2
- data/share/views/entity_map/Default.haml +5 -0
- data/share/views/entity_partials/action_card.haml +2 -0
- data/share/views/entity_partials/action_controller.haml +8 -1
- data/share/views/entity_partials/entity_list_card.haml +8 -6
- data/share/views/entity_partials/entity_map_card.haml +63 -0
- data/share/views/entity_partials/list_container.haml +3 -2
- data/share/views/error.haml +14 -10
- data/share/views/help.haml +34 -0
- data/share/views/help/entity.haml +193 -0
- data/share/views/help/workflow.haml +77 -0
- data/share/views/job_result/tsv.haml +3 -2
- data/share/views/layout.haml +33 -3
- data/share/views/layout/favourites.haml +14 -4
- data/share/views/layout/header.haml +4 -0
- data/share/views/partials/form.haml +3 -1
- data/share/views/partials/table.haml +16 -52
- data/share/views/partials/table/column.haml +10 -0
- data/share/views/partials/table/files.haml +4 -0
- data/share/views/partials/table/filters.haml +11 -0
- data/share/views/partials/table/page.haml +37 -0
- data/share/views/public/favicon.gif +0 -0
- data/share/views/public/js/_ajax_replace.js +76 -4
- data/share/views/public/js/_fix_tablesorter_science.js +13 -0
- data/share/views/public/js/actions.js +8 -2
- data/share/views/public/js/base.js +12 -1
- data/share/views/public/js/entities.js +39 -7
- data/share/views/public/js/favourites.js +308 -77
- data/share/views/public/js/helpers.js +9 -5
- data/share/views/public/js/lists.js +12 -12
- data/share/views/public/js/maps.js +17 -0
- data/share/views/public/js/reveal.js +48 -0
- data/share/views/public/js/tables.js +110 -51
- data/share/views/public/js/workflow.js +4 -16
- data/share/views/public/plugins/underscore/js/underscore.js +1227 -0
- data/share/views/tasks.haml +12 -1
- data/share/views/wait.haml +7 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YmU4OTJhZGMwZTZkYzY0MTcxZjVlNjNlM2QyYjc2YTMyOWIyYjc0MA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YjIwNDcyMzgzMWViOGY4NTI1ZTM5YjkzZTA5Y2Q1MzdlYjJmNzk4Nw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NmZjNDljMWQxYTc3NTEwYjJkOTgyNWFhNjcyZjI3ODA2YTk4NzYzNTdiZDA1
|
10
|
+
ZjY0MTE1YmQxZDdhMWI2MmRkMmJmNzMxMWQ0MTIyMThlOGY3ODc0Njg4NGY0
|
11
|
+
NzgyYTU4MDcyOTkyYmM3OGE2YjM4MDQ3MTM2ZTkwM2YxYzJkNWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjVlOGQxMTBkZGY3N2IxYTgwODU3MDc5NmE4OGIyYzMyY2I1NDdhNDc5ODZk
|
14
|
+
NzFlM2FlMDhjMzhlNDU0Y2QzZjJmZjUxOGQyMGM2NmNhN2U2ZWIzMzNmN2Uz
|
15
|
+
MGE0MDZlNDRlMWVjY2U2NTE2ZjRkM2Y3NGE5MGI4OTY2ZTI3OTk=
|
data/config.ru
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'zurb-foundation'
|
2
2
|
require 'modular-scale'
|
3
3
|
|
4
|
+
require 'sinatra'
|
5
|
+
|
4
6
|
require 'rbbt'
|
5
7
|
require 'rbbt/rest/main'
|
6
8
|
require 'rbbt/rest/entity'
|
@@ -95,5 +97,6 @@ end
|
|
95
97
|
|
96
98
|
#{{{ RUN
|
97
99
|
$title = "RbbtRest"
|
100
|
+
|
98
101
|
use Rack::Deflater
|
99
102
|
run RbbtRest
|
data/lib/rbbt/rest/client.rb
CHANGED
@@ -36,7 +36,11 @@ class WorkflowRESTClient
|
|
36
36
|
def self.get_json(url, params = {})
|
37
37
|
Log.debug("RestClient get_json #{}: #{ url } - #{params.inspect}")
|
38
38
|
params = params.merge({ :_format => 'json' })
|
39
|
-
|
39
|
+
begin
|
40
|
+
res = RestClient.get(url, :params => params)
|
41
|
+
rescue => e
|
42
|
+
raise JSON.parse(e.response)["message"]
|
43
|
+
end
|
40
44
|
begin
|
41
45
|
JSON.parse(res)
|
42
46
|
rescue
|
@@ -175,6 +179,10 @@ class WorkflowRESTClient
|
|
175
179
|
name
|
176
180
|
end
|
177
181
|
|
182
|
+
def workflow_description
|
183
|
+
WorkflowRESTClient.get_raw(File.join(url, 'description'))
|
184
|
+
end
|
185
|
+
|
178
186
|
def task_info(task)
|
179
187
|
@task_info ||= {}
|
180
188
|
@task_info[task]
|
@@ -301,12 +309,3 @@ class WorkflowRESTClient
|
|
301
309
|
end
|
302
310
|
end
|
303
311
|
end
|
304
|
-
|
305
|
-
if __FILE__ == $0
|
306
|
-
client = WorkflowRESTClient.new("http://darthcaedus:9292/Sequence", "Sequence")
|
307
|
-
|
308
|
-
job = client.job(:genes_at_genomic_positions, "1", :organism => "Hsa", :positions => ["2:198266834:R"]).clean.fork
|
309
|
-
puts job.join.load.to_s
|
310
|
-
|
311
|
-
end
|
312
|
-
|
@@ -14,6 +14,7 @@ module RbbtRESTHelpers
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def cache(name, params = {}, &block)
|
17
|
+
@cache_type ||= params[:cache_type] if params[:cache_type]
|
17
18
|
return yield if name.nil? or cache_type.nil? or cache_type == :none
|
18
19
|
|
19
20
|
send_file = consume_parameter(:_send_file, params)
|
@@ -29,22 +30,43 @@ module RbbtRESTHelpers
|
|
29
30
|
|
30
31
|
step = Step.new(path, task, nil, nil, self)
|
31
32
|
|
33
|
+
halt 200, step.info.to_json if @format == :info
|
34
|
+
|
32
35
|
self.instance_variable_set("@step", step)
|
33
36
|
|
34
37
|
if @fragment
|
35
38
|
fragment_file = step.file(@fragment)
|
36
39
|
if File.exists?(fragment_file)
|
37
40
|
case @format.to_s
|
38
|
-
when "tsv"
|
39
|
-
content_type "text/tab-separated-values"
|
40
|
-
send_file fragment_file
|
41
41
|
when "table"
|
42
42
|
halt 200, tsv2html(fragment_file)
|
43
43
|
when "json"
|
44
|
-
halt 200, tsv_process(
|
44
|
+
halt 200, tsv_process(load_tsv(fragment_file).first).to_json
|
45
|
+
when "tsv"
|
46
|
+
content_type "text/tab-separated-values"
|
47
|
+
halt 200, tsv_process(load_tsv(fragment_file).first).to_s
|
48
|
+
when "entities"
|
49
|
+
tsv = tsv_process(load_tsv(fragment_file).first)
|
50
|
+
list = tsv.values.flatten
|
51
|
+
tsv.prepare_entity(list, tsv.fields.first, tsv.entity_options)
|
52
|
+
type = list.annotation_types.last
|
53
|
+
list_id = "List of #{type} in table #{ @fragment }"
|
54
|
+
list_id << " (#{ @filter })" if @filter
|
55
|
+
Entity::List.save_list(type.to_s, list_id, list, user)
|
56
|
+
header "Location", Entity::REST.entity_list_url(list_id, type)
|
57
|
+
redirect to(Entity::REST.entity_list_url(list_id, type))
|
58
|
+
when "map"
|
59
|
+
tsv = tsv_process(load_tsv(fragment_file).first)
|
60
|
+
type = tsv.keys.annotation_types.last
|
61
|
+
column = tsv.fields.first
|
62
|
+
map_id = "Map #{type}-#{column} in #{ @fragment }"
|
63
|
+
map_id << " (#{ @filter.gsub(';','|') })" if @filter
|
64
|
+
Entity::Map.save_map(type.to_s, column, map_id, tsv, user)
|
65
|
+
url = Entity::REST.entity_map_url(map_id, type, column)
|
66
|
+
redirect to(url)
|
45
67
|
when "excel"
|
46
68
|
require 'rbbt/tsv/excel'
|
47
|
-
tsv =
|
69
|
+
tsv = load_tsv(fragment_file).first
|
48
70
|
content_type "text/html"
|
49
71
|
data = nil
|
50
72
|
excel_file = TmpFile.tmp_file
|
@@ -89,9 +111,12 @@ module RbbtRESTHelpers
|
|
89
111
|
begin
|
90
112
|
case step.status
|
91
113
|
when :error, :aborted
|
92
|
-
error_for step,
|
114
|
+
error_for step, !@ajax
|
93
115
|
when :done
|
94
|
-
|
116
|
+
case
|
117
|
+
when @permalink
|
118
|
+
redirect to(permalink(step.path))
|
119
|
+
when send_file
|
95
120
|
send_file step.path
|
96
121
|
else
|
97
122
|
step.load
|
@@ -25,6 +25,39 @@ module RbbtRESTHelpers
|
|
25
25
|
html_options = consume_parameter(:html_options, extra) || {}
|
26
26
|
|
27
27
|
case type
|
28
|
+
when :multiple
|
29
|
+
choices = consume_parameter(:choices, extra)
|
30
|
+
default = default.collect{|o| o.to_s} if default
|
31
|
+
current = current.collect{|o| o.to_s} if current
|
32
|
+
input_label(id, name, description, Array === default ? default * ", " : nil, extra) +
|
33
|
+
choices.collect do |choice|
|
34
|
+
choice_name = name.to_s + "[#{ choice }]"
|
35
|
+
|
36
|
+
check_true = (current && current.include?(choice.to_s)) || (default && default.include?(choice.to_s))
|
37
|
+
|
38
|
+
check_true = false if check_true.nil?
|
39
|
+
check_false = ! check_true
|
40
|
+
|
41
|
+
choice_id = id + "[#{ Misc.snake_case(choice) }]"
|
42
|
+
if id
|
43
|
+
false_id = choice_id + '_false'
|
44
|
+
true_id = choice_id + '_true'
|
45
|
+
else
|
46
|
+
false_id = nil
|
47
|
+
true_id = nil
|
48
|
+
end
|
49
|
+
|
50
|
+
#choice_html = html_tag("input", nil, :type => :hidden, :name => choice_name + "_checkbox_false", :value => "false") +
|
51
|
+
# html_tag("input", nil, :type => :checkbox, :checked => check_true, :name => choice_name, :value => "true", :id => choice_id) +
|
52
|
+
# input_label(choice_id, choice, nil, nil, extra.merge({:class => :inline}))
|
53
|
+
|
54
|
+
choice_html = html_tag("input", nil, :type => :checkbox, :checked => check_true, :name => choice_name, :value => "true", :id => choice_id) +
|
55
|
+
input_label(choice_id, choice, choice, nil, extra.merge({:class => :inline}))
|
56
|
+
|
57
|
+
html_tag('span', choice_html, :class => 'choice')
|
58
|
+
end * "\n"
|
59
|
+
|
60
|
+
|
28
61
|
when :boolean
|
29
62
|
current = param2boolean(current) unless current.nil?
|
30
63
|
default = param2boolean(default) unless default.nil?
|
@@ -5,6 +5,14 @@ module RbbtRESTHelpers
|
|
5
5
|
|
6
6
|
PAGE_SIZE = 20
|
7
7
|
|
8
|
+
def log(status, message)
|
9
|
+
if @step
|
10
|
+
@step.log(status, message)
|
11
|
+
else
|
12
|
+
Log.debug("[#{ status }] #{ message }")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
8
16
|
def production?
|
9
17
|
ENV["RACK_ENV"] == "production"
|
10
18
|
end
|
@@ -41,6 +49,9 @@ module RbbtRESTHelpers
|
|
41
49
|
@debug_js = consume_parameter(:_debug_js)
|
42
50
|
@debug_js = false if @debug_js.nil? or @debug_js == "false"
|
43
51
|
|
52
|
+
@debug_css = consume_parameter(:_debug_css)
|
53
|
+
@debug_css = false if @debug_css.nil? or @debug_css == "false"
|
54
|
+
|
44
55
|
@_ = consume_parameter(:_)
|
45
56
|
|
46
57
|
@fragment = consume_parameter(:_fragment)
|
@@ -65,6 +76,8 @@ module RbbtRESTHelpers
|
|
65
76
|
end
|
66
77
|
end
|
67
78
|
|
79
|
+
@permalink = consume_parameter :_permalink
|
80
|
+
|
68
81
|
@clean_params = params.dup
|
69
82
|
end
|
70
83
|
|
@@ -91,6 +104,9 @@ module RbbtRESTHelpers
|
|
91
104
|
when :float
|
92
105
|
value.to_f
|
93
106
|
|
107
|
+
when :multiple
|
108
|
+
value.keys
|
109
|
+
|
94
110
|
when :boolean
|
95
111
|
param2boolean(value)
|
96
112
|
|
@@ -168,4 +184,12 @@ module RbbtRESTHelpers
|
|
168
184
|
} * "\n"
|
169
185
|
html_tag(:dl, entries, options)
|
170
186
|
end
|
187
|
+
|
188
|
+
def permalink(path)
|
189
|
+
id = Misc.digest(Time.now.to_s)
|
190
|
+
dest = File.join(settings.permalink_dir, id)
|
191
|
+
FileUtils.mkdir_p settings.permalink_dir unless File.exists? settings.permalink_dir
|
192
|
+
FileUtils.ln_s(path, dest)
|
193
|
+
"/permalink/#{ id }"
|
194
|
+
end
|
171
195
|
end
|
@@ -3,13 +3,17 @@ require 'rbbt/rest/common/cache'
|
|
3
3
|
|
4
4
|
module RbbtRESTHelpers
|
5
5
|
def error_for(job, layout = nil)
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
if @format == :json
|
7
|
+
halt 400, {"message" => job.messages[-2], "backtrace" => job.info[:backtrace]}.to_json
|
8
|
+
else
|
9
|
+
layout = @layout if layout.nil?
|
10
|
+
layout_file = (layout ? locate_template('layout') : nil)
|
11
|
+
template_file = locate_template('error')
|
9
12
|
|
10
|
-
|
13
|
+
result = render template_file, {:job => job}, layout_file
|
11
14
|
|
12
|
-
|
15
|
+
halt 400, result
|
16
|
+
end
|
13
17
|
end
|
14
18
|
|
15
19
|
def wait_on(job, layout = nil)
|
@@ -29,16 +33,16 @@ module RbbtRESTHelpers
|
|
29
33
|
|
30
34
|
def render(template_file, locals = {}, layout_file = nil, cache = nil, cache_options = {})
|
31
35
|
if layout_file
|
32
|
-
Haml::Engine.new(Open.read(layout_file), :filename => layout_file).render(self) do
|
36
|
+
Haml::Engine.new(Open.read(layout_file), :filename => layout_file, :ugly => production?).render(self, locals) do
|
33
37
|
cache(cache, locals.merge(:_template_file => template_file, :user => user).merge(cache_options)) do
|
34
38
|
Log.debug("Rendering #{template_file} with layout")
|
35
|
-
Haml::Engine.new(Open.read(template_file), :filename => template_file).render(self, locals)
|
39
|
+
Haml::Engine.new(Open.read(template_file), :filename => template_file, :ugly => production?).render(self, locals)
|
36
40
|
end
|
37
41
|
end
|
38
42
|
else
|
39
43
|
cache(cache, locals.merge(:_template_file => template_file, :user => user).merge(cache_options)) do
|
40
44
|
Log.debug("Rendering #{template_file} without layout")
|
41
|
-
Haml::Engine.new(Open.read(template_file), :filename => template_file).render(self, locals)
|
45
|
+
Haml::Engine.new(Open.read(template_file), :filename => template_file, :ugly => production?).render(self, locals)
|
42
46
|
end
|
43
47
|
end
|
44
48
|
end
|
@@ -80,7 +84,7 @@ module RbbtRESTHelpers
|
|
80
84
|
url = remove_GET_param(url, "_update")
|
81
85
|
fragment_url = add_GET_param(url, "_fragment", fragment_code)
|
82
86
|
if link.nil?
|
83
|
-
html_tag('a', "
|
87
|
+
html_tag('a', "", :href => fragment_url, :class => 'fragment')
|
84
88
|
else
|
85
89
|
if link =~ / href=/
|
86
90
|
link.sub(/ href=('|")/," href='#{fragment_url}'")
|
@@ -143,5 +147,18 @@ module RbbtRESTHelpers
|
|
143
147
|
raise "Type not understood: #{ type }"
|
144
148
|
end
|
145
149
|
end
|
150
|
+
|
151
|
+
def reveal(text, id = nil, &block)
|
152
|
+
id ||= "rbbt_reveal_" << (rand * 10000).to_i.to_s
|
153
|
+
|
154
|
+
content_html = capture_haml(&block)
|
155
|
+
|
156
|
+
str = html_tag('a', text.to_s, :href => "#", "data-reveal-id" => 'modal1', 'attr-reveal_id' => id, 'class' => 'rbbt_reveal_trigger') <<
|
157
|
+
"\n" <<
|
158
|
+
html_tag('div', "\n" << content_html << "\n", :id => id, 'class' => 'rbbt_reveal_content') <<
|
159
|
+
"\n"
|
160
|
+
|
161
|
+
str
|
162
|
+
end
|
146
163
|
end
|
147
164
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'sass'
|
2
|
-
#require 'yui/compressor'
|
3
2
|
require 'uglifier'
|
4
3
|
|
5
4
|
module RbbtRESTHelpers
|
@@ -22,6 +21,7 @@ module RbbtRESTHelpers
|
|
22
21
|
|
23
22
|
def link_css(file)
|
24
23
|
file += '.css' unless file =~ /.css$/
|
24
|
+
file << "?_update=reload" if @debug_css
|
25
25
|
html_tag('link', nil, :rel => 'stylesheet', :type => 'text/css', :href => file)
|
26
26
|
end
|
27
27
|
|
@@ -1,5 +1,24 @@
|
|
1
1
|
require 'rbbt/entity'
|
2
2
|
|
3
|
+
module Link
|
4
|
+
extend Entity
|
5
|
+
|
6
|
+
def self.tsv_sort(v)
|
7
|
+
value = v.last
|
8
|
+
value = value.first if Array === value
|
9
|
+
if value and value.match(/<a [^>]*>([^>]*)<\/a>/)
|
10
|
+
val = $1
|
11
|
+
if val =~ /^\s*\d/
|
12
|
+
val.to_f
|
13
|
+
else
|
14
|
+
val
|
15
|
+
end
|
16
|
+
else
|
17
|
+
""
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
3
22
|
module NumericValue
|
4
23
|
extend Entity
|
5
24
|
|
@@ -20,11 +39,17 @@ t.value
|
|
20
39
|
t.values
|
21
40
|
adjusted.p.value
|
22
41
|
adjusted.p.values
|
42
|
+
Rank
|
43
|
+
rank
|
23
44
|
EOF
|
24
45
|
).split("\n")
|
25
46
|
|
26
47
|
def <=>(other)
|
27
|
-
|
48
|
+
if Float === self
|
49
|
+
super(other.to_f)
|
50
|
+
else
|
51
|
+
self.to_f <=> other.to_f
|
52
|
+
end
|
28
53
|
end
|
29
54
|
|
30
55
|
def self.tsv_sort(v)
|
@@ -35,6 +60,10 @@ adjusted.p.values
|
|
35
60
|
value.to_f
|
36
61
|
end
|
37
62
|
end
|
63
|
+
|
64
|
+
def to_s
|
65
|
+
"%.5g" % self.to_f
|
66
|
+
end
|
38
67
|
end
|
39
68
|
|
40
69
|
module RbbtRESTHelpers
|
@@ -44,13 +73,13 @@ module RbbtRESTHelpers
|
|
44
73
|
tsv.collect{|id, value| [id, value]}
|
45
74
|
when :list
|
46
75
|
key_field = tsv.key_field
|
47
|
-
tsv.collect{|id, values|
|
76
|
+
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 }
|
48
77
|
when :flat
|
49
78
|
key_field = tsv.key_field
|
50
79
|
tsv.collect{|id, values| [id, values]}
|
51
80
|
when :double
|
52
81
|
key_field = tsv.key_field
|
53
|
-
tsv.collect{|id, value_lists|
|
82
|
+
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 }
|
54
83
|
end
|
55
84
|
end
|
56
85
|
|
@@ -78,7 +107,11 @@ module RbbtRESTHelpers
|
|
78
107
|
reverse = false
|
79
108
|
end
|
80
109
|
|
81
|
-
|
110
|
+
if object.entity_templates[field]
|
111
|
+
entity = object.entity_templates[field].annotation_types.last
|
112
|
+
else
|
113
|
+
entity = Entity.formats[field]
|
114
|
+
end
|
82
115
|
|
83
116
|
num = num.to_i
|
84
117
|
size = size.to_i
|
@@ -99,13 +132,13 @@ module RbbtRESTHelpers
|
|
99
132
|
column = @column if column.nil?
|
100
133
|
|
101
134
|
if filter and filter.to_s != "false"
|
102
|
-
filter.split("
|
135
|
+
filter.split(";;").each do |f|
|
103
136
|
key, value = f.split("~")
|
104
137
|
case
|
105
138
|
when value =~ /^([<>]=?)(.*)/
|
106
|
-
tsv = tsv.select(key){|k| k.send($1, $2)}
|
107
|
-
when value =~
|
108
|
-
tsv = tsv.select(key => Regexp.new(
|
139
|
+
tsv = tsv.select(key){|k| k = k.first if Array === k; k.to_f.send($1, $2.to_f)}
|
140
|
+
when value =~ /^\/(.+)\/.{0,2}$/
|
141
|
+
tsv = tsv.select(key => Regexp.new($1))
|
109
142
|
else
|
110
143
|
tsv = tsv.select(key => value)
|
111
144
|
end
|
@@ -119,26 +152,27 @@ module RbbtRESTHelpers
|
|
119
152
|
|
120
153
|
def tsv_rows(tsv, page = nil, filter = nil, column = nil)
|
121
154
|
tsv = tsv_process(tsv, filter, column)
|
155
|
+
length = tsv.size
|
122
156
|
page = @page if page.nil?
|
123
157
|
if page.nil? or page.to_s == "false"
|
124
|
-
tsv_rows_full(tsv)
|
158
|
+
[tsv_rows_full(tsv), length]
|
125
159
|
else
|
126
|
-
tsv_rows_full(paginate(tsv, page))
|
160
|
+
[tsv_rows_full(paginate(tsv, page)), length]
|
127
161
|
end
|
128
162
|
end
|
129
163
|
|
130
164
|
|
131
165
|
def table_value(value, type = nil, options = {})
|
132
166
|
options = {} if options.nil?
|
133
|
-
return value.list_link :length, options[:list_id] if Array === value and options[:list_id]
|
167
|
+
return value.list_link :length, options[:list_id] if Array === value and options[:list_id] and value.respond_to? :list_link
|
134
168
|
|
135
169
|
entity_options = options[:entity_options]
|
136
170
|
|
137
|
-
Misc.prepare_entity(value, type, entity_options) if Entity.formats.include? type
|
171
|
+
Misc.prepare_entity(value, type, entity_options) if Entity.formats.include? type and not options[:unnamed]
|
138
172
|
|
139
173
|
value = value.link if value.respond_to? :link
|
140
174
|
|
141
|
-
Array === value ? value * ", " : value
|
175
|
+
Array === value ? value.collect{|v| v.to_s} * ", " : value
|
142
176
|
end
|
143
177
|
|
144
178
|
def header(field, entity_type, entity_options = {})
|
@@ -151,12 +185,40 @@ module RbbtRESTHelpers
|
|
151
185
|
@table_filters[field] = type
|
152
186
|
end
|
153
187
|
|
188
|
+
def self.save_tsv(tsv, path)
|
189
|
+
Open.write(path, tsv.to_s)
|
190
|
+
table_options = {:tsv_entity_options => tsv.entity_options}
|
191
|
+
Open.write(path + '.table_options', table_options.to_yaml )
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.load_tsv(file)
|
195
|
+
tsv = TSV.open(Open.open(file))
|
196
|
+
|
197
|
+
table_options = File.exists?(file + '.table_options') ? YAML.load_file(file + '.table_options') : {}
|
198
|
+
tsv.entity_options = table_options[:tsv_entity_options]
|
199
|
+
headers = table_options[:headers]
|
200
|
+
headers.each{|field,p| tsv.entity_templates[field] = Misc.prepare_entity("TEMPLATE", p.first, p.last) } unless headers.nil?
|
201
|
+
|
202
|
+
[tsv, table_options]
|
203
|
+
end
|
204
|
+
|
205
|
+
def save_tsv(file)
|
206
|
+
RbbtRESTHelpers.save_tsv(file)
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
def load_tsv(file)
|
211
|
+
RbbtRESTHelpers.load_tsv(file)
|
212
|
+
end
|
213
|
+
|
154
214
|
def table(options = {})
|
155
215
|
options = {} if options.nil?
|
156
216
|
|
157
217
|
tsv = yield
|
158
218
|
|
159
|
-
table_code = (rand * 100000).to_i.to_s
|
219
|
+
table_code = options[:table_id] || (rand * 100000).to_i.to_s
|
220
|
+
table_code = Entity::REST.clean_element(table_code)
|
221
|
+
table_code.sub!(/[^\w]/,'_')
|
160
222
|
table_file = @step.file(table_code)
|
161
223
|
|
162
224
|
url = add_GET_param(@fullpath, "_fragment", File.basename(table_file))
|
@@ -191,20 +253,19 @@ module RbbtRESTHelpers
|
|
191
253
|
tsv2html(table_file)
|
192
254
|
end
|
193
255
|
|
194
|
-
def load_tsv(file)
|
195
|
-
tsv
|
196
|
-
end
|
197
|
-
|
198
|
-
def tsv2html(file)
|
199
|
-
tsv = TSV.open(Open.open(file))
|
200
256
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
257
|
+
def tsv2html(file, default_table_options = {})
|
258
|
+
if TSV === file
|
259
|
+
tsv, table_options = file, {}
|
260
|
+
table_options[:unnamed] = tsv.unnamed
|
261
|
+
else
|
262
|
+
tsv, table_options = load_tsv(file)
|
263
|
+
end
|
206
264
|
|
207
265
|
content_type "text/html"
|
208
|
-
|
266
|
+
rows, length = tsv_rows(tsv)
|
267
|
+
|
268
|
+
table_options = default_table_options.merge(table_options)
|
269
|
+
partial_render('partials/table', {:total_size => length, :rows => rows, :header => tsv.all_fields, :table_options => table_options})
|
209
270
|
end
|
210
271
|
end
|