rbbt-rest 1.1.4 → 1.1.5
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 +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
@@ -20,10 +20,15 @@ module EntityRESTHelpers
|
|
20
20
|
def default_action_controller(entity, list_id = nil)
|
21
21
|
action_controller = ActionController.new(entity, list_id)
|
22
22
|
|
23
|
-
|
23
|
+
case
|
24
|
+
when Array === entity
|
24
25
|
find_all_entity_list_action_templates(entity, true).each do |action|
|
25
26
|
action_controller.add action, Misc.humanize(action, :format => :sentence), :reuse => true
|
26
27
|
end
|
28
|
+
when TSV === entity
|
29
|
+
find_all_entity_map_action_templates(entity, true).each do |action|
|
30
|
+
action_controller.add action, Misc.humanize(action, :format => :sentence), :reuse => true
|
31
|
+
end
|
27
32
|
else
|
28
33
|
find_all_entity_action_templates(entity, true).each do |action|
|
29
34
|
action_controller.add action, Misc.humanize(action, :format => :sentence)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class EntityMapCard
|
2
|
+
|
3
|
+
attr_accessor :map, :map_id
|
4
|
+
attr_accessor :action_controller
|
5
|
+
|
6
|
+
def initialize(map, map_id)
|
7
|
+
@map, @map_id = map, map_id
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module EntityRESTHelpers
|
12
|
+
def entity_map_card_render(card)
|
13
|
+
partial_render('entity_partials/entity_map_card', :card => card)
|
14
|
+
end
|
15
|
+
end
|
@@ -71,7 +71,7 @@ module EntityRESTHelpers
|
|
71
71
|
if (file = dir[entity_type]).exists?
|
72
72
|
lists = Open.read(file).split("\n")
|
73
73
|
lists << list
|
74
|
-
Open.write(file, lists * "\n")
|
74
|
+
Open.write(file, lists.uniq * "\n")
|
75
75
|
else
|
76
76
|
lists = [list]
|
77
77
|
Open.write(file, lists * "\n")
|
@@ -94,4 +94,60 @@ module EntityRESTHelpers
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
+
#{{{ Entity Maps
|
98
|
+
|
99
|
+
def favourite_entity_maps
|
100
|
+
raise "You need to login to have favourites" unless authorized?
|
101
|
+
|
102
|
+
dir = Path.setup(File.join(settings.favourite_maps_dir, user))
|
103
|
+
favourites = {}
|
104
|
+
dir.find.glob('*').each do |type_dir|
|
105
|
+
type = File.basename(type_dir)
|
106
|
+
Path.setup(type_dir).glob('*').each do |file|
|
107
|
+
column = File.basename(file).gsub('--', '/')
|
108
|
+
maps = Open.read(file).split("\n")
|
109
|
+
favourites[type] ||= {}
|
110
|
+
favourites[type][column] = maps
|
111
|
+
end
|
112
|
+
end
|
113
|
+
favourites
|
114
|
+
end
|
115
|
+
|
116
|
+
def add_favourite_entity_map(entity_type, column, map)
|
117
|
+
raise "You need to login to have favourites" unless authorized?
|
118
|
+
|
119
|
+
column = column.gsub('/', '--')
|
120
|
+
dir = Path.setup(File.join(settings.favourite_maps_dir, user))
|
121
|
+
|
122
|
+
if (file = dir[entity_type][column]).exists?
|
123
|
+
maps = Open.read(file).split("\n")
|
124
|
+
maps << map
|
125
|
+
maps.uniq!
|
126
|
+
Open.write(file, maps.uniq * "\n")
|
127
|
+
else
|
128
|
+
maps = [map]
|
129
|
+
Open.write(file, maps * "\n")
|
130
|
+
end
|
131
|
+
ddd favourite_entity_maps
|
132
|
+
end
|
133
|
+
|
134
|
+
def remove_favourite_entity_map(entity_type, column, map)
|
135
|
+
raise "You need to login to have favourites" unless authorized?
|
136
|
+
|
137
|
+
column = column.gsub('/', '--')
|
138
|
+
|
139
|
+
dir = Path.setup(File.join(settings.favourite_maps_dir, user))
|
140
|
+
|
141
|
+
if (file = dir[entity_type][column]).exists?
|
142
|
+
maps = Open.read(file).split("\n")
|
143
|
+
maps -= [map]
|
144
|
+
if maps.any?
|
145
|
+
Open.write(file, maps * "\n")
|
146
|
+
else
|
147
|
+
FileUtils.rm file
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
|
97
153
|
end
|
@@ -2,7 +2,7 @@ require 'rbbt/ner/finder'
|
|
2
2
|
|
3
3
|
module EntityRESTHelpers
|
4
4
|
def finder_find(term)
|
5
|
-
return [] unless settings.respond_to? :finder and not settings.finder.nil?
|
5
|
+
return [] unless settings.respond_to? :finder and not settings.finder.nil? and not settings.finder.instances.empty?
|
6
6
|
results = settings.finder.find(term)
|
7
7
|
|
8
8
|
results.uniq.collect{|r|
|
@@ -52,7 +52,7 @@ module EntityRESTHelpers
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def page_type(path = nil)
|
55
|
-
path = request.path_info
|
55
|
+
path = request.path_info if path.nil?
|
56
56
|
|
57
57
|
case
|
58
58
|
when path.match(/^\/entity\//)
|
@@ -63,13 +63,17 @@ module EntityRESTHelpers
|
|
63
63
|
return "entity_list";
|
64
64
|
when path.match(/^\/entity_list_action\//)
|
65
65
|
return "entity_list_action";
|
66
|
+
when path.match(/^\/entity_map\//)
|
67
|
+
return "entity_map";
|
68
|
+
when path.match(/^\/entity_map_action\//)
|
69
|
+
return "entity_map_action";
|
66
70
|
else
|
67
71
|
return nil;
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
71
75
|
def page_entity(path = nil)
|
72
|
-
path = request.path_info
|
76
|
+
path = request.path_info if path.nil?
|
73
77
|
|
74
78
|
case page_type
|
75
79
|
when "entity"
|
@@ -82,7 +86,7 @@ module EntityRESTHelpers
|
|
82
86
|
end
|
83
87
|
|
84
88
|
def page_action(path = nil)
|
85
|
-
path = request.path_info
|
89
|
+
path = request.path_info if path.nil?
|
86
90
|
|
87
91
|
case page_type
|
88
92
|
when "entity_action", "entity_list_action"
|
@@ -92,9 +96,8 @@ module EntityRESTHelpers
|
|
92
96
|
end
|
93
97
|
end
|
94
98
|
|
95
|
-
|
96
99
|
def page_entity_list(path = nil)
|
97
|
-
path = request.path_info
|
100
|
+
path = request.path_info if path.nil?
|
98
101
|
|
99
102
|
case page_type
|
100
103
|
when "entity_list"
|
@@ -105,17 +108,47 @@ module EntityRESTHelpers
|
|
105
108
|
return nil
|
106
109
|
end
|
107
110
|
end
|
111
|
+
|
112
|
+
def page_entity_map(path = nil)
|
113
|
+
path = request.path_info if path.nil?
|
114
|
+
|
115
|
+
case page_type
|
116
|
+
when "entity_map"
|
117
|
+
return Entity::REST.restore_element(path.split("/")[4])
|
118
|
+
when "entity_map_action"
|
119
|
+
return Entity::REST.restore_element(path.split("/")[5])
|
120
|
+
else
|
121
|
+
return nil
|
122
|
+
end
|
123
|
+
end
|
108
124
|
|
109
125
|
def page_entity_type(path = nil)
|
110
|
-
path = request.path_info
|
126
|
+
path = request.path_info if path.nil?
|
111
127
|
|
112
128
|
case page_type
|
113
|
-
when "entity", "entity_list", "entity_action", "entity_list_action"
|
129
|
+
when "entity", "entity_list", "entity_action", "entity_list_action", "entity_map"
|
114
130
|
return Entity::REST.restore_element(path.split("/")[2])
|
115
131
|
else
|
116
132
|
return nil
|
117
133
|
end
|
118
134
|
end
|
135
|
+
|
136
|
+
def page_entity_base_type(path = nil)
|
137
|
+
page_entity_type.split(":").first
|
138
|
+
end
|
139
|
+
|
140
|
+
def page_entity_map_column(path = nil)
|
141
|
+
path = request.path_info if path.nil?
|
142
|
+
|
143
|
+
case page_type
|
144
|
+
when "entity_map"
|
145
|
+
return Entity::REST.restore_element(path.split("/")[3])
|
146
|
+
else
|
147
|
+
return nil
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
119
152
|
#
|
120
153
|
#
|
121
154
|
#function page_entity_base_type(){
|
@@ -2,9 +2,17 @@ require 'rbbt/entity'
|
|
2
2
|
require 'cgi'
|
3
3
|
|
4
4
|
module Entity
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_accessor :entity_list_cache
|
8
|
+
end
|
9
|
+
|
10
|
+
self.entity_list_cache = "var/entity_list"
|
11
|
+
|
5
12
|
module List
|
6
13
|
|
7
14
|
def self.list_file(entity_type, id, user = nil)
|
15
|
+
id = Entity::REST.clean_element(id)
|
8
16
|
id = Misc.sanitize_filename(id)
|
9
17
|
|
10
18
|
entity_type = entity_type.split(":").first
|
@@ -278,4 +278,118 @@ module EntityRESTHelpers
|
|
278
278
|
|
279
279
|
raise "Template not found for list #{ action } (#{list.annotation_types * ", "})"
|
280
280
|
end
|
281
|
+
|
282
|
+
#{{{ ENTITY MAP
|
283
|
+
|
284
|
+
def locate_entity_map_template_from_resource(resource, type)
|
285
|
+
if type == "Default"
|
286
|
+
path = resource.entity_map["Default.haml"]
|
287
|
+
if path.exists?
|
288
|
+
return path
|
289
|
+
else
|
290
|
+
return nil
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
path = resource.entity_map[type.to_s + ".haml"]
|
295
|
+
return path if path.exists?
|
296
|
+
|
297
|
+
nil
|
298
|
+
end
|
299
|
+
|
300
|
+
def locate_entity_map_template(type, column)
|
301
|
+
entity_resources.each do |resource|
|
302
|
+
path = locate_entity_map_template_from_resource(resource, type)
|
303
|
+
return path if path and path.exists?
|
304
|
+
end
|
305
|
+
|
306
|
+
entity_resources.each do |resource|
|
307
|
+
path = locate_entity_map_template_from_resource(resource, "Default")
|
308
|
+
return path if path and path.exists?
|
309
|
+
end
|
310
|
+
|
311
|
+
raise "Template not found for list (#{list.annotation_types * ", "})"
|
312
|
+
end
|
313
|
+
|
314
|
+
|
315
|
+
#{{{ ENTITY MAP ACTION
|
316
|
+
|
317
|
+
def find_all_entity_map_action_templates_from_resource(resource, map)
|
318
|
+
field = map.key_field
|
319
|
+
|
320
|
+
if map.entity_templates[field]
|
321
|
+
annotation_types = map.entity_templates[field].annotation_types
|
322
|
+
else
|
323
|
+
annotation_types = [Entity.formats[field]].compact
|
324
|
+
end
|
325
|
+
|
326
|
+
annotation_types += ["Default"]
|
327
|
+
|
328
|
+
annotation_types.collect do |annotation|
|
329
|
+
resource.entity_map[annotation].glob('*.haml')
|
330
|
+
end.compact.flatten
|
331
|
+
end
|
332
|
+
|
333
|
+
def find_all_entity_map_action_templates(map, check = false)
|
334
|
+
paths = []
|
335
|
+
|
336
|
+
entity_resources.each do |resource|
|
337
|
+
paths.concat find_all_entity_map_action_templates_from_resource(resource, map)
|
338
|
+
end
|
339
|
+
|
340
|
+
if check
|
341
|
+
paths = paths.reject do |path|
|
342
|
+
check_file = path.sub(/\.haml$/, '.check')
|
343
|
+
case
|
344
|
+
when (path.basename == "edit.haml" or path.basename == 'new.haml')
|
345
|
+
true
|
346
|
+
when File.exists?(check_file)
|
347
|
+
begin
|
348
|
+
Log.debug("Checking action template: #{path}")
|
349
|
+
code = File.read(check_file)
|
350
|
+
accept = eval code
|
351
|
+
not accept
|
352
|
+
rescue
|
353
|
+
Log.debug("Error Checking action template #{path}: #{$!.message}")
|
354
|
+
true
|
355
|
+
end
|
356
|
+
else
|
357
|
+
false
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
paths.collect{|file| file.basename.sub('.haml', '') }.uniq
|
363
|
+
end
|
364
|
+
|
365
|
+
|
366
|
+
def locate_entity_map_action_template_from_resource(resource, map, action)
|
367
|
+
field = map.key_field
|
368
|
+
|
369
|
+
if map.entity_templates[field]
|
370
|
+
annotation_types = map.entity_templates[field].annotation_types
|
371
|
+
else
|
372
|
+
annotation_types = [Entity.formats[field]].compact
|
373
|
+
end
|
374
|
+
|
375
|
+
annotation_types += ["Default"]
|
376
|
+
|
377
|
+
annotation_types.each do |annotation|
|
378
|
+
path = resource.entity_map[annotation][action.to_s + ".haml"]
|
379
|
+
return path if path.exists?
|
380
|
+
end
|
381
|
+
|
382
|
+
nil
|
383
|
+
end
|
384
|
+
|
385
|
+
def locate_entity_map_action_template(map, action)
|
386
|
+
|
387
|
+
entity_resources.each do |resource|
|
388
|
+
path = locate_entity_map_action_template_from_resource(resource, map, action)
|
389
|
+
return path if path and path.exists?
|
390
|
+
end
|
391
|
+
|
392
|
+
raise "Template not found for map #{ action } (#{map.key_field * ", "})"
|
393
|
+
end
|
394
|
+
|
281
395
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'rbbt/entity'
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
module Entity
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_accessor :entity_map_cache
|
8
|
+
end
|
9
|
+
|
10
|
+
self.entity_map_cache = "var/entity_map"
|
11
|
+
|
12
|
+
|
13
|
+
module Map
|
14
|
+
def self.map_file(entity_type, column, id, user = nil)
|
15
|
+
id = Misc.sanitize_filename(Entity::REST.clean_element(id))
|
16
|
+
column = Entity::REST.clean_element(column)
|
17
|
+
|
18
|
+
entity_type = entity_type.split(":").first
|
19
|
+
|
20
|
+
raise "Ilegal map id: #{ id }" unless Misc.path_relative_to Entity.entity_map_cache, File.join(Entity.entity_map_cache, id)
|
21
|
+
|
22
|
+
path = if user.nil?
|
23
|
+
Dir.glob(File.join(Entity.entity_map_cache, entity_type.to_s, column, Regexp.quote(id))).first || File.join(Entity.entity_map_cache, entity_type.to_s, column, id)
|
24
|
+
else
|
25
|
+
Dir.glob(File.join(Entity.entity_map_cache, user.to_s, entity_type.to_s, column, Regexp.quote(id))).first || File.join(Entity.entity_map_cache, user.to_s, entity_type.to_s, column, id)
|
26
|
+
end
|
27
|
+
|
28
|
+
path
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.map_files(user = nil)
|
32
|
+
path = user.nil? ?
|
33
|
+
File.join(Entity.entity_map_cache, '*', '*') :
|
34
|
+
File.join(Entity.entity_map_cache, user, '*', '*')
|
35
|
+
|
36
|
+
maps = {}
|
37
|
+
Dir.glob(path).each do |file|
|
38
|
+
next if File.directory? file
|
39
|
+
|
40
|
+
file = File.expand_path(file)
|
41
|
+
raise "Ilegal path: #{ file }. Not relative to #{File.expand_path(Entity.entity_map_cache)}" unless
|
42
|
+
Misc.path_relative_to(File.expand_path(Entity.entity_map_cache), file)
|
43
|
+
|
44
|
+
if user.nil?
|
45
|
+
entity_type, column, map = file.split("/")[-2..-1]
|
46
|
+
else
|
47
|
+
user, entity_type, column, map = file.split("/")[-3..-1]
|
48
|
+
end
|
49
|
+
|
50
|
+
maps[entity_type] ||= []
|
51
|
+
maps[entity_type][column] ||= []
|
52
|
+
maps[entity_type][column] << map
|
53
|
+
end
|
54
|
+
|
55
|
+
maps
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.load_map(entity_type, column, id, user = nil)
|
59
|
+
path = map_file(entity_type, column, id, user)
|
60
|
+
path = map_file(entity_type, column, id, :public) unless path != nil and File.exists? path
|
61
|
+
path = map_file(entity_type, column, id) unless path != nil and File.exists? path
|
62
|
+
|
63
|
+
begin
|
64
|
+
RbbtRESTHelpers.load_tsv(path).first
|
65
|
+
rescue
|
66
|
+
Log.error("Error loading map #{ path }: #{$!.message}")
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.save_map(entity_type, column, id, map, user = nil)
|
72
|
+
path = map_file(entity_type, column, id, user)
|
73
|
+
|
74
|
+
Misc.lock path do
|
75
|
+
begin
|
76
|
+
RbbtRESTHelpers.save_tsv(map, path)
|
77
|
+
rescue
|
78
|
+
FileUtils.rm path if path and File.exists? path
|
79
|
+
raise $!
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.delete_map(entity_type, column, id, user)
|
85
|
+
path = map_file(entity_type, column, id, user)
|
86
|
+
|
87
|
+
"This map does not belong to #{ user }: #{[entity_type, column, id] * ": "}" unless File.exists? path
|
88
|
+
|
89
|
+
Misc.lock path do
|
90
|
+
begin
|
91
|
+
FileUtils.rm path if File.exists? path
|
92
|
+
rescue
|
93
|
+
raise $!
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|