rbbt-rest 1.1.5 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +8 -8
  2. data/lib/rbbt/rest/common/cache.rb +33 -14
  3. data/lib/rbbt/rest/common/locate.rb +8 -6
  4. data/lib/rbbt/rest/common/misc.rb +4 -0
  5. data/lib/rbbt/rest/common/render.rb +14 -4
  6. data/lib/rbbt/rest/common/resources.rb +1 -1
  7. data/lib/rbbt/rest/common/table.rb +37 -7
  8. data/lib/rbbt/rest/entity.rb +5 -3
  9. data/lib/rbbt/rest/entity/favourites.rb +4 -1
  10. data/lib/rbbt/rest/entity/helpers.rb +12 -0
  11. data/lib/rbbt/rest/entity/rest.rb +6 -2
  12. data/lib/rbbt/rest/helpers.rb +7 -0
  13. data/lib/rbbt/rest/knowledge_base.rb +338 -0
  14. data/lib/rbbt/rest/knowledge_base/helpers.rb +57 -0
  15. data/lib/rbbt/rest/main.rb +16 -3
  16. data/share/views/compass/_rbbt.sass +11 -0
  17. data/share/views/compass/actions.sass +48 -24
  18. data/share/views/compass/app.sass +72 -50
  19. data/share/views/compass/colors.sass +3 -229
  20. data/share/views/compass/entity_card.sass +44 -108
  21. data/share/views/compass/favourites.sass +17 -72
  22. data/share/views/compass/finder.sass +30 -0
  23. data/share/views/compass/foundation.sass +79 -0
  24. data/share/views/compass/functions.sass +27 -0
  25. data/share/views/compass/help.sass +3 -0
  26. data/share/views/compass/layout.sass +132 -0
  27. data/share/views/compass/rbbt/form.sass +84 -0
  28. data/share/views/compass/rbbt/fragment.sass +7 -0
  29. data/share/views/compass/rbbt/menu.sass +189 -0
  30. data/share/views/compass/rbbt/reveal.sass +46 -0
  31. data/share/views/compass/rbbt/table.sass +169 -0
  32. data/share/views/compass/skeleton.sass +2 -0
  33. data/share/views/compass/skeleton/_dependencies.sass +151 -0
  34. data/share/views/compass/skeleton/_functions.sass +4 -0
  35. data/share/views/compass/skeleton/_mixins.sass +25 -0
  36. data/share/views/compass/skeleton/_vars.sass +72 -0
  37. data/share/views/compass/skeleton/base.sass +333 -0
  38. data/share/views/compass/skeleton/layout.sass +51 -0
  39. data/share/views/compass/skeleton/skeleton.sass +105 -0
  40. data/share/views/compass/solarized.sass +56 -0
  41. data/share/views/compass/style.sass +2 -116
  42. data/share/views/compass/theme.sass +57 -44
  43. data/share/views/compass/top_menu.sass +121 -0
  44. data/share/views/compass/user.sass +7 -0
  45. data/share/views/compass/variables.sass +7 -0
  46. data/share/views/compass/workflow.sass +6 -14
  47. data/share/views/entity_partials/action_controller.haml +7 -4
  48. data/share/views/entity_partials/entity_card.haml +10 -5
  49. data/share/views/entity_partials/entity_list.haml +4 -7
  50. data/share/views/entity_partials/entity_list_card.haml +10 -3
  51. data/share/views/entity_partials/entity_map_card.haml +2 -2
  52. data/share/views/entity_partials/list_container.haml +31 -26
  53. data/share/views/error.haml +5 -7
  54. data/share/views/help.haml +75 -31
  55. data/share/views/help/entity.haml +191 -193
  56. data/share/views/help/workflow.haml +59 -63
  57. data/share/views/job_result.haml +23 -26
  58. data/share/views/layout.haml +41 -61
  59. data/share/views/layout/top_menu.haml +19 -0
  60. data/share/views/layout/top_menu/favourites.haml +45 -0
  61. data/share/views/layout/top_menu/finder.haml +4 -0
  62. data/share/views/layout/top_menu/user.haml +15 -0
  63. data/share/views/public/js/_ajax_replace.js +17 -5
  64. data/share/views/public/js/_ellipsis.js +7 -9
  65. data/share/views/public/js/app.js +50 -2
  66. data/share/views/public/js/foundation/foundation.abide.js +194 -0
  67. data/share/views/public/js/foundation/foundation.alerts.js +52 -0
  68. data/share/views/public/js/foundation/foundation.clearing.js +516 -0
  69. data/share/views/public/js/foundation/foundation.cookie.js +74 -0
  70. data/share/views/public/js/foundation/foundation.dropdown.js +177 -0
  71. data/share/views/public/js/foundation/foundation.forms.js +533 -0
  72. data/share/views/public/js/foundation/foundation.interchange.js +280 -0
  73. data/share/views/public/js/foundation/foundation.joyride.js +850 -0
  74. data/share/views/public/js/foundation/foundation.js +440 -0
  75. data/share/views/public/js/foundation/foundation.magellan.js +135 -0
  76. data/share/views/public/js/foundation/foundation.orbit.js +412 -0
  77. data/share/views/public/js/foundation/foundation.placeholder.js +179 -0
  78. data/share/views/public/js/foundation/foundation.reveal.js +330 -0
  79. data/share/views/public/js/foundation/foundation.section.js +400 -0
  80. data/share/views/public/js/foundation/foundation.tooltips.js +208 -0
  81. data/share/views/public/js/foundation/foundation.topbar.js +300 -0
  82. data/share/views/public/js/foundation/index.js +18 -0
  83. data/share/views/public/js/helpers.js +33 -2
  84. data/share/views/public/js/jquery-ui.js +313 -0
  85. data/share/views/public/js/rbbt/actions.js +264 -0
  86. data/share/views/public/js/{_dom_update.js → rbbt/dom_update.js} +0 -0
  87. data/share/views/public/js/rbbt/favourites.js +425 -0
  88. data/share/views/public/js/rbbt/fragment.js +13 -0
  89. data/share/views/public/js/rbbt/hide.js +60 -0
  90. data/share/views/public/js/rbbt/list.js +117 -0
  91. data/share/views/public/js/{maps.js → rbbt/map.js} +3 -2
  92. data/share/views/public/js/rbbt/menu.js +22 -0
  93. data/share/views/public/js/rbbt/modal.js +96 -0
  94. data/share/views/public/js/{entities.js → rbbt/page_type.js} +12 -9
  95. data/share/views/public/js/rbbt/reveal.js +19 -0
  96. data/share/views/public/js/rbbt/table.js +283 -0
  97. data/share/views/public/js/{workflow.js → rbbt/workflow.js} +0 -0
  98. data/share/views/tasks.haml +14 -15
  99. data/share/views/wait.haml +11 -12
  100. metadata +62 -33
  101. data/share/views/compass/_foundation_setup.sass +0 -74
  102. data/share/views/compass/dom.sass +0 -32
  103. data/share/views/compass/footer.sass +0 -4
  104. data/share/views/compass/form.sass +0 -41
  105. data/share/views/compass/fragment.sass +0 -8
  106. data/share/views/compass/list_container.sass +0 -34
  107. data/share/views/compass/lists.sass +0 -33
  108. data/share/views/compass/offcanvas.sass +0 -66
  109. data/share/views/compass/responsive_table.sass +0 -80
  110. data/share/views/compass/reveal.sass +0 -31
  111. data/share/views/compass/style_mixins.sass +0 -42
  112. data/share/views/compass/table.sass +0 -63
  113. data/share/views/compass/tabs.sass +0 -81
  114. data/share/views/compass/topbar.sass +0 -25
  115. data/share/views/compass/web-fonts.sass +0 -77
  116. data/share/views/layout/favourites.haml +0 -46
  117. data/share/views/layout/header.haml +0 -44
  118. data/share/views/public/js/_fix_tablesorter_science.js +0 -38
  119. data/share/views/public/js/_foundation.js +0 -42
  120. data/share/views/public/js/actions.js +0 -108
  121. data/share/views/public/js/base.js +0 -121
  122. data/share/views/public/js/favourites.js +0 -441
  123. data/share/views/public/js/lists.js +0 -117
  124. data/share/views/public/js/offcanvas.js +0 -35
  125. data/share/views/public/js/reveal.js +0 -48
  126. data/share/views/public/js/tables.js +0 -314
  127. data/share/views/public/js/tabs.js +0 -7
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YmU4OTJhZGMwZTZkYzY0MTcxZjVlNjNlM2QyYjc2YTMyOWIyYjc0MA==
4
+ ZDEwYTAxNGNmZTM1OTk0MTIwM2JiZWRlOGM4NjVlNTE1M2M3MTE0MA==
5
5
  data.tar.gz: !binary |-
6
- YjIwNDcyMzgzMWViOGY4NTI1ZTM5YjkzZTA5Y2Q1MzdlYjJmNzk4Nw==
6
+ NzYzOGQ3M2E3NmRkMzkzMDBlYjMxNjdiYjNhMzFjOGMwZWFkZGFhZg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NmZjNDljMWQxYTc3NTEwYjJkOTgyNWFhNjcyZjI3ODA2YTk4NzYzNTdiZDA1
10
- ZjY0MTE1YmQxZDdhMWI2MmRkMmJmNzMxMWQ0MTIyMThlOGY3ODc0Njg4NGY0
11
- NzgyYTU4MDcyOTkyYmM3OGE2YjM4MDQ3MTM2ZTkwM2YxYzJkNWE=
9
+ ZGZlZjJkMjdhZDIxOTVhZjBmOGRhOGFmMDY5Y2I5N2RhODFlM2RiYmE3YjI2
10
+ ODNhMjJjNTIwNmE2MzA2ZWZjMGFmNzQ2NzkwNmFhMTg4MTBhNTQxYTJiNDEx
11
+ NzEzNmJmMjRjNjljMDJkOGViOTQ4OWM3YWIwOWEyYmU3YzlkNzE=
12
12
  data.tar.gz: !binary |-
13
- ZjVlOGQxMTBkZGY3N2IxYTgwODU3MDc5NmE4OGIyYzMyY2I1NDdhNDc5ODZk
14
- NzFlM2FlMDhjMzhlNDU0Y2QzZjJmZjUxOGQyMGM2NmNhN2U2ZWIzMzNmN2Uz
15
- MGE0MDZlNDRlMWVjY2U2NTE2ZjRkM2Y3NGE5MGI4OTY2ZTI3OTk=
13
+ OWNhNTk4MjJjZGMxOWE4MmE0MmExMzYyZGFjY2QwMWIyOGQzYzZiOWJkNDU1
14
+ MjkwNDIxNjFhMGQzNTgxYTM2MWNiMDdmZTllMWI0MDJjMTljMjY0ZWQ4ZTlk
15
+ ZTQ2ZmM0NzIwODQ3NDg1ZThjZDhlZjEwYmU0YTZjNDJiNjE0ZjQ=
@@ -19,6 +19,8 @@ module RbbtRESTHelpers
19
19
 
20
20
  send_file = consume_parameter(:_send_file, params)
21
21
 
22
+ # Setup Step
23
+
22
24
  check = [params[:_template_file]].compact
23
25
  check += consume_parameter(:_cache_check, params) || []
24
26
  check.flatten!
@@ -29,11 +31,14 @@ module RbbtRESTHelpers
29
31
  task = Task.setup(:name => "Sinatra cache", :result_type => :string, &block)
30
32
 
31
33
  step = Step.new(path, task, nil, nil, self)
34
+ last_modified File.mtime(step.path.find) if step.done?
32
35
 
33
36
  halt 200, step.info.to_json if @format == :info
34
37
 
35
38
  self.instance_variable_set("@step", step)
36
39
 
40
+ # Return fragment
41
+
37
42
  if @fragment
38
43
  fragment_file = step.file(@fragment)
39
44
  if File.exists?(fragment_file)
@@ -73,6 +78,7 @@ module RbbtRESTHelpers
73
78
  tsv.excel(excel_file, :name => @excel_use_name,:sort_by => @excel_sort_by, :sort_by_cast => @excel_sort_by_cast)
74
79
  send_file excel_file, :type => 'application/vnd.ms-excel', :filename => 'table.xls'
75
80
  else
81
+ cache_control :public, :max_age => 360000 if production?
76
82
  send_file fragment_file
77
83
  end
78
84
  else
@@ -85,8 +91,9 @@ module RbbtRESTHelpers
85
91
  end
86
92
  end
87
93
 
94
+ # Clean/update job
88
95
 
89
- if old_cache(path, check) or update == :reload
96
+ if old_cache(step.path, check) or update == :reload
90
97
  begin
91
98
  pid = step.info[:pid]
92
99
  step.abort if pid and Misc.pid_exists? pid
@@ -97,6 +104,8 @@ module RbbtRESTHelpers
97
104
  step.clean
98
105
  end
99
106
 
107
+ # Issue
108
+
100
109
  step.fork unless step.started?
101
110
 
102
111
  step.join if cache_type == :synchronous or cache_type == :sync
@@ -108,31 +117,41 @@ module RbbtRESTHelpers
108
117
  redirect to(url)
109
118
  end
110
119
 
120
+ # Monitor
121
+
111
122
  begin
112
- case step.status
113
- when :error, :aborted
114
- error_for step, !@ajax
115
- when :done
123
+
124
+ if step.done?
116
125
  case
117
126
  when @permalink
118
127
  redirect to(permalink(step.path))
119
128
  when send_file
120
129
  send_file step.path
121
130
  else
131
+ cache_control :public, :max_age => 360000 if production?
122
132
  step.load
123
133
  end
124
134
  else
125
- if File.exists?(step.info_file) and Time.now - File.atime(step.info_file) > 60
126
- Log.debug("Checking on #{step.info_file}")
127
- running = step.running?
128
- if FalseClass === running
129
- Log.debug("Aborting zombie #{step.info_file}")
130
- step.abort unless step.done?
131
- raise RbbtRESTHelpers::Retry
135
+
136
+ case step.status
137
+ when :error, :aborted
138
+ error_for step, !@ajax
139
+
140
+ else
141
+ # check for problems
142
+ if File.exists?(step.info_file) and Time.now - File.atime(step.info_file) > 60
143
+ Log.debug("Checking on #{step.info_file}")
144
+ running = step.running?
145
+ if FalseClass === running
146
+ Log.debug("Aborting zombie #{step.info_file}")
147
+ step.abort unless step.done?
148
+ raise RbbtRESTHelpers::Retry
149
+ end
150
+ FileUtils.touch(step.info_file)
132
151
  end
133
- FileUtils.touch(step.info_file)
152
+
153
+ wait_on step, false
134
154
  end
135
- wait_on step, false
136
155
  end
137
156
  rescue RbbtRESTHelpers::Retry
138
157
  retry
@@ -1,6 +1,8 @@
1
1
  module RbbtRESTHelpers
2
2
  attr_accessor :template_resources, :sass_resources, :javascript_resources, :plugin_resources
3
3
 
4
+ class TemplateMissing < StandardError; end
5
+
4
6
  #{{{ TEMPLATE
5
7
 
6
8
  def self.template_resources
@@ -21,7 +23,7 @@ module RbbtRESTHelpers
21
23
  return path if path.exists?
22
24
  end
23
25
 
24
- raise "Template #{ template } not found"
26
+ raise TemplateMissing, "Template #{ template } not found"
25
27
  end
26
28
 
27
29
  #{{{ SASS
@@ -35,7 +37,7 @@ module RbbtRESTHelpers
35
37
  end
36
38
 
37
39
  def sass_resources
38
- [Rbbt.www.views.find(:lib)] + RbbtRESTHelpers.sass_resources
40
+ RbbtRESTHelpers.sass_resources
39
41
  end
40
42
 
41
43
  def locate_sass_from_resource(resource, template)
@@ -48,17 +50,17 @@ module RbbtRESTHelpers
48
50
  return path if path.exists?
49
51
  end
50
52
 
51
- raise "Sass template #{ template } not found"
53
+ raise TemplateMissing, "Sass template #{ template } not found"
52
54
  end
53
55
 
54
56
  #{{{ JAVASCRIPT
55
57
 
56
58
  def self.javascript_resources
57
- @javascript_resources ||= [Rbbt.share.views.js.find(:lib), Rbbt.share.views.public.find(:lib)]
59
+ @javascript_resources ||= [Rbbt.share.views.public.find(:lib), Rbbt.share.views.public.js.find(:lib)]
58
60
  end
59
61
 
60
62
  def javascript_resources
61
- [Rbbt.www.views.js.find(:lib), Rbbt.www.views.public.find(:lib)] + RbbtRESTHelpers.javascript_resources
63
+ RbbtRESTHelpers.javascript_resources
62
64
  end
63
65
 
64
66
 
@@ -74,6 +76,6 @@ module RbbtRESTHelpers
74
76
  return path if path.exists?
75
77
  end
76
78
 
77
- raise "Script #{ script } not found"
79
+ raise TemplateMissing, "Script #{ script } not found"
78
80
  end
79
81
  end
@@ -13,6 +13,10 @@ module RbbtRESTHelpers
13
13
  end
14
14
  end
15
15
 
16
+ def development?
17
+ ENV["RACK_ENV"] == "develoment"
18
+ end
19
+
16
20
  def production?
17
21
  ENV["RACK_ENV"] == "production"
18
22
  end
@@ -17,10 +17,16 @@ module RbbtRESTHelpers
17
17
  end
18
18
 
19
19
  def wait_on(job, layout = nil)
20
+ ddd "wait"
20
21
  3.times do
21
22
  sleep 1
22
- raise RbbtRESTHelpers::Retry if job.done? or job.error?
23
23
  end
24
+ ddd job.status
25
+ ddd job.done?
26
+ ddd job.error?
27
+ raise RbbtRESTHelpers::Retry if job.done? or job.error?
28
+
29
+ ddd "Render"
24
30
 
25
31
  layout = @layout if layout.nil?
26
32
 
@@ -32,6 +38,8 @@ module RbbtRESTHelpers
32
38
  end
33
39
 
34
40
  def render(template_file, locals = {}, layout_file = nil, cache = nil, cache_options = {})
41
+ raise TemplateMissing, "Template #{ template_file } not found" unless template_file.exists?
42
+ raise TemplateMissing, "Template #{ layout_file } not found" unless layout_file.nil? or layout_file.exists?
35
43
  if layout_file
36
44
  Haml::Engine.new(Open.read(layout_file), :filename => layout_file, :ugly => production?).render(self, locals) do
37
45
  cache(cache, locals.merge(:_template_file => template_file, :user => user).merge(cache_options)) do
@@ -63,13 +71,14 @@ module RbbtRESTHelpers
63
71
  render(template_file, locals, nil, cache, cache_options)
64
72
  end
65
73
 
66
- def fragment(link = nil,&block)
74
+ def fragment(link = nil, &block)
75
+ fragment_code, link = [link.to_s, nil] if link and not link.to_s[0] == '<'
67
76
  if block_given?
68
77
  if defined? @step and cache_type == :asynchronous or cache_type == :async
69
- fragment_code = (rand * 100000).to_i.to_s
78
+ fragment_code ||= (rand * 100000).to_i.to_s
70
79
  fragment_file = @step.file(fragment_code)
71
80
 
72
- pid = @step.child {
81
+ pid = @step.child{
73
82
  begin
74
83
  res = capture_haml &block
75
84
  Open.write(fragment_file, res)
@@ -82,6 +91,7 @@ module RbbtRESTHelpers
82
91
 
83
92
  url = request.fullpath
84
93
  url = remove_GET_param(url, "_update")
94
+ url = remove_GET_param(url, "_")
85
95
  fragment_url = add_GET_param(url, "_fragment", fragment_code)
86
96
  if link.nil?
87
97
  html_tag('a', "", :href => fragment_url, :class => 'fragment')
@@ -42,7 +42,7 @@ module RbbtRESTHelpers
42
42
  begin
43
43
  path = locate_javascript(file)
44
44
  rescue
45
- path = locate_javascript(File.basename(file))
45
+ path = locate_javascript(file.split("/")[2..-1] * "/")
46
46
  end
47
47
 
48
48
  Open.read(path)
@@ -134,13 +134,21 @@ module RbbtRESTHelpers
134
134
  if filter and filter.to_s != "false"
135
135
  filter.split(";;").each do |f|
136
136
  key, value = f.split("~")
137
+ if value =~ /^!\s*(.*)/
138
+ value = $1
139
+ invert = true
140
+ else
141
+ invert = false
142
+ end
137
143
  case
138
144
  when value =~ /^([<>]=?)(.*)/
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))
145
+ tsv = tsv.select(key, invert){|k| k = k.first if Array === k; k.to_f.send($1, $2.to_f)}
146
+ when value =~ /^\/(.+)\/.{0,2}\s*$/
147
+ tsv = tsv.select({key => Regexp.new($1)}, invert)
148
+ when (value =~ /^\d+$/ and tsv.type == :double or tsv.type == :flat)
149
+ tsv = tsv.select({key => value.to_i}, invert)
142
150
  else
143
- tsv = tsv.select(key => value)
151
+ tsv = tsv.select({key => value}, invert)
144
152
  end
145
153
  end
146
154
  end
@@ -188,6 +196,17 @@ module RbbtRESTHelpers
188
196
  def self.save_tsv(tsv, path)
189
197
  Open.write(path, tsv.to_s)
190
198
  table_options = {:tsv_entity_options => tsv.entity_options}
199
+ if tsv.entity_templates and tsv.entity_templates.any?
200
+ table_options[:headers] ||= {}
201
+ tsv.entity_templates.each do |field,template|
202
+ next if table_options[:headers].include? field
203
+ info = template.info
204
+ info.delete :format
205
+ info.delete :annotation_types
206
+ info.delete :annotated_array
207
+ table_options[:headers][field] = [template.annotation_types.last.to_s, info]
208
+ end
209
+ end
191
210
  Open.write(path + '.table_options', table_options.to_yaml )
192
211
  end
193
212
 
@@ -197,7 +216,7 @@ module RbbtRESTHelpers
197
216
  table_options = File.exists?(file + '.table_options') ? YAML.load_file(file + '.table_options') : {}
198
217
  tsv.entity_options = table_options[:tsv_entity_options]
199
218
  headers = table_options[:headers]
200
- headers.each{|field,p| tsv.entity_templates[field] = Misc.prepare_entity("TEMPLATE", p.first, p.last) } unless headers.nil?
219
+ headers.each{|field,p| tsv.entity_templates[field] = Misc.prepare_entity("TEMPLATE", p.first, (tsv.entity_options || {}).merge(p.last)) } unless headers.nil?
201
220
 
202
221
  [tsv, table_options]
203
222
  end
@@ -237,6 +256,15 @@ module RbbtRESTHelpers
237
256
  @table_headers = {}
238
257
  end
239
258
 
259
+ if tsv.entity_templates and tsv.entity_templates.any?
260
+ options[:headers] ||= {}
261
+ tsv.entity_templates.each do |field,template|
262
+ next if options[:headers].include? field
263
+ next if template.nil?
264
+ options[:headers][field] = [template.annotation_types.last.to_s, template.info]
265
+ end
266
+ end
267
+
240
268
  if @table_filters and @table_filters.any?
241
269
  options[:filters] = @table_filters
242
270
  @table_filters = {}
@@ -247,10 +275,12 @@ module RbbtRESTHelpers
247
275
 
248
276
  total_size = tsv.size
249
277
  if options[:page].nil? and total_size > PAGE_SIZE * 1.2
250
- @page = "1"
278
+ @page = "1"
279
+ else
280
+ @page = options[:page]
251
281
  end
252
282
 
253
- tsv2html(table_file)
283
+ tsv2html(table_file, options)
254
284
  end
255
285
 
256
286
 
@@ -22,6 +22,7 @@ require 'rbbt/rest/entity/entity_map_card'
22
22
  require 'rbbt/rest/entity/action_card'
23
23
  require 'rbbt/rest/entity/list_container'
24
24
  require 'rbbt/rest/entity/action_controller'
25
+ require 'rbbt/rest/knowledge_base'
25
26
 
26
27
  require 'rbbt/statistics/rank_product'
27
28
 
@@ -154,9 +155,10 @@ module Sinatra
154
155
 
155
156
  raise "List file not found: #{ list_id }"
156
157
  when :json
157
- list_info = {:entities => list, :info => list.info}
158
- halt 200, list_info.to_json
158
+ content_type "application/json"
159
+ halt 200, list_json(list)
159
160
  when :info
161
+ content_type "application/json"
160
162
  halt 200, list.info.to_json
161
163
  when :list
162
164
  content_type "text/plain"
@@ -475,7 +477,6 @@ module Sinatra
475
477
  content_type "application/json"
476
478
 
477
479
  favs = {}
478
-
479
480
  favourite_entities.each{|type, list|
480
481
  type_favs = {}
481
482
  list.each do |entity|
@@ -486,6 +487,7 @@ module Sinatra
486
487
  favs[type] = type_favs
487
488
  }
488
489
 
490
+ cache_control :public, :max_age => 360000 if production?
489
491
  favs.to_json
490
492
  end
491
493
 
@@ -6,12 +6,14 @@ module EntityRESTHelpers
6
6
  raise "You need to login to have favourites" unless authorized?
7
7
 
8
8
  dir = Path.setup(File.join(settings.favourites_dir, user))
9
+
9
10
  favourites = {}
10
11
  dir.glob('**').each do |file|
11
12
  type = File.basename(file)
12
13
  entities = Annotated.load_tsv(TSV.open(file))
13
14
  favourites[type] = entities
14
15
  end
16
+
15
17
  favourites
16
18
  end
17
19
 
@@ -85,6 +87,8 @@ module EntityRESTHelpers
85
87
 
86
88
  if (file = dir[entity_type]).exists?
87
89
  lists = Open.read(file).split("\n")
90
+ ddd lists
91
+ ddd list
88
92
  lists -= [list]
89
93
  if lists.any?
90
94
  Open.write(file, lists * "\n")
@@ -128,7 +132,6 @@ module EntityRESTHelpers
128
132
  maps = [map]
129
133
  Open.write(file, maps * "\n")
130
134
  end
131
- ddd favourite_entity_maps
132
135
  end
133
136
 
134
137
  def remove_favourite_entity_map(entity_type, column, map)
@@ -1,6 +1,18 @@
1
1
 
2
2
  module EntityRESTHelpers
3
3
 
4
+ def list_hash(list)
5
+ return {:entities => list} unless list.respond_to? :base_entity
6
+ info = list.info
7
+ info.delete :annotation_types
8
+ info.delete :annotated_array
9
+ {:entities => list, :info => list.info, :entity_type => list.base_entity}
10
+ end
11
+
12
+ def list_json(list)
13
+ list_hash(list).to_json
14
+ end
15
+
4
16
  def list(list, list_id = nil, text = nil)
5
17
  partial_render('entity_partials/entity_list', :list => list, :list_id => list_id, :text => text)
6
18
  end
@@ -37,7 +37,7 @@ module Entity
37
37
  klasses = []
38
38
  klasses << base_type.to_s if base_type
39
39
  klasses << format if self.respond_to? :format and format
40
- klasses.collect{|klass| klass.gsub(/\s/, '_') }
40
+ klasses.collect{|klass| klass.gsub(/[^\w]/, '_') }
41
41
  end
42
42
 
43
43
  def entity_type
@@ -131,7 +131,11 @@ module Entity
131
131
  attributes[:href] = Entity::REST.entity_url(self, entity_type.to_s, link_params)
132
132
  attributes["attr-entity_id"] = self.to_s
133
133
 
134
- text = self.respond_to?(:name)? self.name || self : self if text.nil?
134
+ begin
135
+ text = self.respond_to?(:name)? self.name || self : self if text.nil?
136
+ rescue
137
+ text = self
138
+ end
135
139
  attributes[:title] = text if attributes[:title].nil?
136
140
 
137
141
  Misc.html_tag('a', text, attributes)