rbbt-rest 1.7.17 → 1.7.18

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
  SHA1:
3
- metadata.gz: 891ff04e00684eafdcbd23d0953988badb7b25b0
4
- data.tar.gz: a1ddd85173b784998afb856a21de86a11425663b
3
+ metadata.gz: 4cb820762ab31ca47b731784cc93f6826d057a79
4
+ data.tar.gz: e01a21750686b96449e811c9f42d2f01aaa8b00b
5
5
  SHA512:
6
- metadata.gz: 3ddca2a8ab4fb70d32a0c6ae5a8430e58a9457b113c4e160888ebefecb9a399ef5ff8cdbd68f6907af42af75bd1636c3d3174d84b7422ed751ed21a0114993a7
7
- data.tar.gz: 97fde0bd9ba78bcd376e7be62f69ed85c86820ad5d6087a3fd26906a6f03468ef58a5a4e40d5c994722345a5c7ab8ee7850263755d4cda8888443456f5bdf332
6
+ metadata.gz: 43c411823107dd3b10a869354bcaee32c0e227cf4165e641c3936a19a0825f2f4b5c3c2a8b8c74369731511ff1d540ff259e8eda6666dd5512985e032f698f62
7
+ data.tar.gz: 88ecd5856f8550634fc58a134bb522025fe2e26a596350bdbec4eb373a533dad804f4ff004449ef08c9e8397f88da55ca60777aa6a244bd330cb1b8dd11b6c49
@@ -166,6 +166,7 @@ module RbbtRESTHelpers
166
166
  begin
167
167
  check_step step
168
168
  rescue Aborted
169
+ step.clean
169
170
  raise RbbtRESTHelpers::Retry
170
171
  end
171
172
 
@@ -460,8 +460,29 @@ module Sinatra
460
460
 
461
461
  entity = setup_entity(entity_type, entity, @clean_params)
462
462
 
463
- content_type "application/json"
464
- halt 200, entity.send(property,*args).to_json
463
+ begin
464
+ res = entity.send(property,*args)
465
+ rescue
466
+ if entity.respond_to?(:format) and entity.base_type.respond_to?(:default_format) and entity.format != entity.base_type.default_format
467
+ entity = entity.to(:default)
468
+ Log.warn "Error computing property #{property} for #{entity}. Automatically changing entity format to default"
469
+ retry
470
+ else
471
+ raise $!
472
+ end
473
+ end
474
+
475
+ case res
476
+ when String
477
+ content_type "application/json"
478
+ halt 200, '"' + res + '"'
479
+ when Fixnum
480
+ content_type :text
481
+ halt 200, res.to_s
482
+ else
483
+ content_type "application/json"
484
+ halt 200, res.to_json
485
+ end
465
486
  end
466
487
 
467
488
  get '/entity_list_property/:property/:entity_type/:list_id' do
@@ -498,6 +519,52 @@ module Sinatra
498
519
  halt 200, list.send(property, *args).to_json
499
520
  end
500
521
 
522
+ post '/entity_list_property/:property/:entity_type' do
523
+ entity_type = consume_parameter :entity_type
524
+ property = consume_parameter :property
525
+ list = consume_parameter :list
526
+ info = consume_parameter :info
527
+ args = consume_parameter :args
528
+
529
+ info = (info.nil? or info.empty?) ? {} : JSON.parse(info)
530
+ entity_type = Entity::REST.restore_element(entity_type)
531
+ list = Misc.prepare_entity(list.split(/[,|]/), entity_type, info)
532
+ list.extend AnnotatedArray
533
+
534
+ args = (args.nil? or args.empty?) ? nil : begin JSON.parse(args) rescue args end
535
+ case args
536
+ when Hash
537
+ args = [args]
538
+ when String
539
+ args = args.split(/[,\|]/)
540
+ end
541
+
542
+ begin
543
+ res = list.send(property,*args)
544
+ rescue
545
+ if list.respond_to?(:format) and list.base_type.respond_to?(:default_format) and list.format != list.base_type.default_format
546
+ list = list.to(:default)
547
+ Log.warn "Error computing property #{property} for list. Automatically changing list format to default"
548
+ retry
549
+ else
550
+ raise $!
551
+ end
552
+ end
553
+
554
+ case res
555
+ when String
556
+ content_type "application/json"
557
+ halt 200, '"' + res + '"'
558
+ when Fixnum
559
+ content_type :text
560
+ halt 200, res.to_s
561
+ else
562
+ content_type "application/json"
563
+ halt 200, res.to_json
564
+ end
565
+ end
566
+
567
+
501
568
 
502
569
  #{{{{{{{{{{{{{{
503
570
  #{{{ FAVOURITES
@@ -39,6 +39,9 @@ module EntityRESTHelpers
39
39
  params = {} if params.nil?
40
40
  locals = {:entity => entity}.merge(params)
41
41
 
42
+ name = entity.respond_to?(:name)? entity.name : entity
43
+ @title = "#{name} [#{$title}]"
44
+
42
45
  layout_file = layout ? locate_template("layout") : nil
43
46
 
44
47
  render(template_file, locals, layout_file, "Entity: #{ entity }")
@@ -49,9 +52,12 @@ module EntityRESTHelpers
49
52
 
50
53
  locals = params.merge({:entity => entity})
51
54
 
55
+ name = entity.respond_to?(:name)? entity.name : entity
56
+ @title = "#{action} #{name} [#{$title}]"
57
+
52
58
  layout_file = layout ? locate_template("layout") : nil
53
59
 
54
- render(template_file, locals, layout_file, "Entity #{ action }: #{ entity }")
60
+ render(template_file, locals, layout_file, "Action #{ action }: #{ entity }")
55
61
  end
56
62
 
57
63
  def entity_list_render(list, id)
@@ -59,6 +65,9 @@ module EntityRESTHelpers
59
65
 
60
66
  locals = {:list => list, :list_id => id}
61
67
 
68
+ name = id
69
+ @title = "#{name} [#{$title}]"
70
+
62
71
  layout_file = layout ? locate_template("layout") : nil
63
72
 
64
73
  render(template_file, locals, layout_file, "Entity list: #{ id }")
@@ -69,9 +78,12 @@ module EntityRESTHelpers
69
78
 
70
79
  locals = params.merge({:list => list, :list_id => id})
71
80
 
81
+ name = id
82
+ @title = "#{action} #{name} [#{$title}]"
83
+
72
84
  layout_file = layout ? locate_template("layout") : nil
73
85
 
74
- render(template_file, locals, layout_file, "Entity list #{ action }: #{ id }")
86
+ render(template_file, locals, layout_file, "Action #{ action } for list: #{ id }")
75
87
  end
76
88
 
77
89
  def entity_map_render(map_id, type, column)
@@ -80,6 +92,9 @@ module EntityRESTHelpers
80
92
  map = Entity::Map.load_map(type, column, map_id, user)
81
93
  locals = {:map => map, :map_id => map_id}
82
94
 
95
+ name = map_id
96
+ @title = "#{name} [#{$title}]"
97
+
83
98
  layout_file = layout ? locate_template("layout") : nil
84
99
 
85
100
  render(template_file, locals, layout_file, "Entity map: #{ map_id }")
@@ -90,9 +105,12 @@ module EntityRESTHelpers
90
105
 
91
106
  locals = params.merge({:map => map, :map_id => id})
92
107
 
108
+ name = id
109
+ @title = "#{action} #{name} [#{$title}]"
110
+
93
111
  layout_file = layout ? locate_template("layout") : nil
94
112
 
95
- render(template_file, locals, layout_file, "Entity map #{ action }: #{ id }")
113
+ render(template_file, locals, layout_file, "Action #{ action } for map: #{ id }")
96
114
  end
97
115
 
98
116
 
@@ -69,12 +69,11 @@ module Sinatra
69
69
  before do
70
70
  method = request.request_method
71
71
  method_color = case method
72
-
73
- when "GET"
74
- :cyan
75
- when "POST"
76
- :yellow
77
- end
72
+ when "GET"
73
+ :cyan
74
+ when "POST"
75
+ :yellow
76
+ end
78
77
 
79
78
  Log.medium{ "#{Log.color method_color, method} #{Log.color(:blue, request.ip)}: " << request.path_info.gsub('/', Log.color(:blue, "/")) << ". Params: " << Log.color(:blue, Misc.fingerprint(params))}
80
79
  process_common_parameters
@@ -88,12 +87,13 @@ module Sinatra
88
87
 
89
88
  after do
90
89
  method = request.request_method
90
+
91
91
  method_color = case method
92
- when "GET"
93
- :cyan
94
- when "POST"
95
- :green
96
- end
92
+ when "GET"
93
+ :cyan
94
+ when "POST"
95
+ :green
96
+ end
97
97
 
98
98
  status = response.status.to_s
99
99
  case status.to_i
@@ -174,7 +174,7 @@ module Sinatra
174
174
  job = workflow.load_id(File.join(task, job))
175
175
 
176
176
  begin
177
- check_step job
177
+ check_step job unless job.done?
178
178
  rescue Aborted
179
179
  end
180
180
 
@@ -27,6 +27,7 @@ a.entity
27
27
  .action_parameters
28
28
  form > .field
29
29
  margin-bottom: 2em !important
30
+ margin: auto
30
31
  input[type=file]
31
32
  display:inline-block
32
33
  span.file_or_text_area
@@ -45,6 +45,8 @@ body
45
45
  overflow: auto
46
46
 
47
47
  @media #{$only-large}
48
+ #top_menu > .item.title
49
+ margin-left: 32px
48
50
  #top_menu > .favourite
49
51
  white-space: nowrap
50
52
 
@@ -145,9 +147,9 @@ body
145
147
 
146
148
  #content
147
149
  margin-top: 2em
148
- margin-left: 0.5em !important
149
- margin-right: 0.5em !important
150
- width: calc(100% - 2 * 0.5em)
150
+ margin-left: 16px !important
151
+ margin-right: 16px !important
152
+ width: calc(100% - 2 * 16px)
151
153
  padding: 0px
152
154
 
153
155
  .entity_card, .entity_list_card
@@ -54,8 +54,11 @@ table, table.responsive
54
54
  .table_column_selector
55
55
  span.field
56
56
  font-size: 1.2em
57
- width: 10em
57
+ width: 15em
58
58
  display: inline-block
59
+ overflow: hidden
60
+ text-overflow: ellipsis
61
+ margin-right: 2em
59
62
 
60
63
  .figure
61
64
  margin-bottom: 1em
@@ -207,3 +210,16 @@ td
207
210
  span.choice
208
211
  padding: 0.5em
209
212
  cursor: pointer
213
+
214
+ ul.tasks
215
+ li
216
+ a
217
+ margin-right: 1em
218
+ overflow: hidden
219
+ text-overflow: ellipsis
220
+
221
+ .modal
222
+ .error.message
223
+ ul.stacktrace
224
+ li > span
225
+ margin-left: 0.5em
@@ -11,7 +11,7 @@
11
11
  - if entity.respond_to? :genes
12
12
  - genes = entity.genes
13
13
  - list_container = ListContainer.new
14
- - list_container.add "Genes for #{[entity.base_type, name] * ": "}", genes
14
+ - list_container.add "#{name} #{entity.base_type} genes", genes
15
15
  - entity_card.list_container = list_container
16
16
 
17
17
  - entity_card.action_controller = default_action_controller entity
@@ -14,18 +14,18 @@
14
14
  :markdown
15
15
  #{task_info[:description]}
16
16
 
17
- .form.action_parameters
17
+ .form.action_parameters.ui.segment
18
18
  = partial_render('partials/form', :id => id, :action => action, :method => 'post',
19
19
  :enctype => "multipart/form-data", :info => task_info, :klass => 'workflow_task')
20
20
 
21
21
  - if workflow.libdir.examples[task.to_s].exists?
22
22
  .examples
23
-
24
- Click below to load example data:
25
-
26
23
  :javascript
27
24
  example_inputs = [];
28
- %ul
25
+
26
+ Click to load example data:
27
+
28
+ %ul.ui.buttons
29
29
  - workflow.libdir.examples[task.to_s].glob('*').each do |example_dir|
30
30
  - name = File.basename(example_dir)
31
31
  - task_info = workflow.task_info task
@@ -33,7 +33,7 @@
33
33
  - inputs.each{ |k,v| v.replace Open.read(v) if String === v and File.exists? v }
34
34
  :javascript
35
35
  example_inputs["#{ name }"] = #{inputs.to_json}
36
- %li
36
+ %li.ui.button
37
37
  %a.load_example(href="#" task=task name=name)= name
38
38
 
39
39
  :javascript
@@ -4,7 +4,7 @@
4
4
 
5
5
  %link{:rel => "icon", :type => "image/gif", :href => "/favicon.gif"}/
6
6
 
7
- %title= $title
7
+ %title= @title || $title
8
8
 
9
9
  // Semantic-ui
10
10
 
@@ -62,10 +62,10 @@
62
62
  - %w(dom_update fragment actions table list map reveal).each do |file|
63
63
  - record_js "/js-find/rbbt/#{ file }"
64
64
 
65
- - %w(rbbt rbbt.basic rbbt.exception rbbt.job rbbt.page rbbt.entity rbbt.entity_list rbbt.entity_map rbbt.views rbbt.favourites rbbt.modal).each do |file|
65
+ - %w(rbbt rbbt.basic rbbt.exception rbbt.job rbbt.page rbbt.entity.basic rbbt.entity rbbt.entity_list rbbt.entity_map rbbt.views rbbt.favourites rbbt.modal).each do |file|
66
66
  - record_js "/js-find/#{ file }"
67
67
 
68
- - %w(rbbt.knowledge_base rbbt.aesthetics rbbt.plots).each do |file|
68
+ - %w(rbbt.knowledge_base rbbt.aesthetics rbbt.plots rbbt.aes_plots).each do |file|
69
69
  - record_js "/js-find/#{ file }"
70
70
 
71
71
  - record_js "/js-find/app"
@@ -1,5 +1,5 @@
1
1
  #top_menu.ui.fixed.menu
2
- .item
2
+ .item.title
3
3
  %a.header(href='/')= $title
4
4
 
5
5
 
@@ -27,7 +27,7 @@
27
27
  %div(class="field #{types[input]} #{input} #{hide ? 'hide' : ''}")
28
28
  - input_options = options[input]
29
29
  - input_options = input_options.dup unless input_options.nil?
30
- != form_input(input, types[input], defaults[input], values[input], descriptions[input], input_id, input_options)
30
+ !~ form_input(input, types[input], defaults[input], values[input], descriptions[input], input_id, input_options)
31
31
 
32
32
 
33
33
  .input.field.submit
@@ -0,0 +1,381 @@
1
+ rbbt.plots.aes = {}
2
+
3
+ rbbt.plots.aes.get_properties = function(list, rules){
4
+ if (undefined === rules) rules == []
5
+ if (undefined === list.properties) list.properties = {}
6
+ var promises = []
7
+ forArray(rules, function(rule){
8
+ var name = rule.name
9
+ var extract = rule.extract
10
+
11
+ if (rule.entity_type && rule.entity_type != list.type) return
12
+
13
+ if (rule.info){
14
+ var property = rule.property
15
+ var deferred = m.deferred()
16
+ var entry = rule.info
17
+ if (undefined === name) name = entry
18
+
19
+ var value = list.info[entry]
20
+ if (undefined === value && entry == 'type') value = list.type
21
+ if (undefined === value && entry == 'code') value = list.codes
22
+
23
+ deferred.resolve(value)
24
+ promise = deferred.promise
25
+ }
26
+
27
+ if (rule.value){
28
+ var property = rule.property
29
+ var deferred = m.deferred()
30
+ deferred.resolve(rule.value)
31
+ promise = deferred.promise
32
+ }
33
+
34
+ if (rule.property){
35
+ var property = rule.property
36
+ var args = rule.args
37
+ if (undefined === name) name = property
38
+ promise = rbbt.entity_array.property(list.codes, list.type, list.info, property, args)
39
+ if (extract){ promise = promise.then(function(res){ return res.map(extract)}) }
40
+ }
41
+
42
+ if (rule.workflow){
43
+ var workflow = rule.workflow
44
+ var task = rule.task
45
+ var args = rule.args
46
+ if (undefined === name) name = task
47
+ promise = rbbt.job(workflow, task, args, true)
48
+ if (extract){ promise = promise.then(function(res){ return list.codes.map(function(code){return extract.call(null, res, code)}) } )}
49
+ }
50
+
51
+ if (rule.parents || rule.children){
52
+ var kb_type
53
+ var database
54
+ if (rule.parents){
55
+ kb_type = 'parent'
56
+ var database = rule.parents
57
+ if (undefined === name) name = database
58
+
59
+ promise = rbbt.entity_array.parents(list.codes, list.type, database)
60
+ }else{
61
+ kb_type = 'children'
62
+ var database = rule.children
63
+ if (undefined === name) name = database
64
+
65
+ promise = rbbt.entity_array.children(list.codes, list.type, database)
66
+ }
67
+
68
+ if (rule.field){
69
+ promise = m.sync([promise,rbbt.knowledge_base.database_info(database)]).then(function(res){
70
+ var data = res[0]
71
+ var db_info = res[1]
72
+ var fields = db_info.fields
73
+ var field_pos = fields.indexOf(rule.field)
74
+
75
+ if (field_pos < 0){
76
+ var msg = "Field not found: " + rule.field + ". Options: " + fields.join(", ")
77
+ throw new Error(msg)
78
+ }
79
+
80
+ var matches = {}
81
+ forHash(data, function(key, values){
82
+ var source = values[0]
83
+ var target = values[1]
84
+ if (matches[source] === undefined) matches[source] = {}
85
+ matches[source][target] = values[field_pos+2]
86
+ })
87
+ return matches
88
+ })
89
+ }else{
90
+ promise = promise.then(function(data){
91
+ var matches = {}
92
+ forHash(data, function(key, values){
93
+ var source = values[0]
94
+ var target = values[1]
95
+ if (matches[source] === undefined) matches[source] = {}
96
+ matches[source][target] = values.slice(2)
97
+ })
98
+ return matches
99
+ })
100
+ }
101
+
102
+ if (extract){
103
+ promise = promise.then(function(matches){
104
+ return list.codes.map(function(e){
105
+ return extract.call(null, matches, e)
106
+ })
107
+ })
108
+ }
109
+ else{
110
+ promise = promise.then(function(matches){
111
+ return list.codes.map(function(e){ return matches[e] })
112
+ })
113
+ }
114
+ }
115
+
116
+ promises.push(promise.then(function(res){list.properties[name] = res}))
117
+ })
118
+
119
+ return m.sync(promises)
120
+ }
121
+
122
+ rbbt.plots.aes.set_aes = function(list, aes_rules){
123
+ if (undefined === list.aes) list.aes = {}
124
+ forArray(aes_rules, function(rule){
125
+
126
+ if (rule.entity_type && rule.entity_type != list.type) return
127
+
128
+
129
+ var name = rule.name
130
+ var aes = rule.aes
131
+ var mapper = rule.mapper
132
+ var mapper_obj = rule.mapper_obj
133
+ var property = list.properties[name]
134
+
135
+ if (rule.value){
136
+ list.aes[aes] = rule.value
137
+ return
138
+ }
139
+
140
+ if (undefined === property && list.info[name]) property = list.info[name]
141
+ if (undefined === property && name == 'type') property = list.type
142
+ if (undefined === property && name == 'code') property = list.codes
143
+ if (undefined === property) return
144
+
145
+ list.aes[aes] = aes_module.map_aesthetic(property, mapper, mapper_obj)
146
+ })
147
+ }
148
+
149
+ rbbt.plots.aes.update_aes = function(graph_model){
150
+ var data_promises = []
151
+ forHash(graph_model.entities, function(type, list){
152
+ data_promises.push(
153
+
154
+ rbbt.plots.aes.get_properties(list, graph_model.rules).
155
+ then(function(){
156
+ rbbt.plots.aes.set_aes(list, graph_model.aes_rules)
157
+ })
158
+
159
+ )
160
+ })
161
+
162
+ forHash(graph_model.associations, function(db, list){
163
+ data_promises.push(
164
+
165
+ rbbt.plots.aes.get_properties(list, graph_model.edge_rules).
166
+ then(function(){
167
+ rbbt.plots.aes.set_aes(list, graph_model.edge_aes_rules)
168
+ })
169
+
170
+ )
171
+ })
172
+ return m.sync(data_promises)
173
+ }
174
+
175
+ //{{{ SUBSET
176
+ rbbt.plots.aes.subset = function(db,source,target){
177
+ var promise = rbbt.entity_array.subset(db,source,target)
178
+ var db_info = KB.database_info(db)
179
+ return m.sync([promise,db_info]).then(function(d){
180
+ var associations = d[0]
181
+ var info = d[1]
182
+ var fields = ['source', 'target'].concat(info.fields)
183
+
184
+ var edges = {}
185
+ edges.codes = []
186
+ edges.database = db
187
+ edges.source_type = info.source
188
+ edges.target_type = info.target
189
+ edges.source_info = info.source_entity_options
190
+ edges.target_info = info.target_entity_options
191
+ edges.info = {}
192
+ edges.info.database = db
193
+ edges.properties = {}
194
+ edges.aes = {}
195
+
196
+ for (i in fields)
197
+ edges.info[fields[i]] = []
198
+
199
+ forHash(associations, function(code, values){
200
+ edges.codes.push(code)
201
+ for(i in values){
202
+ var field = fields[i]
203
+ var value = values[i]
204
+ edges.info[field].push(value)
205
+ }
206
+ })
207
+
208
+ edges.aes['source'] = edges.info['source']
209
+ edges.aes['target'] = edges.info['target']
210
+ edges.aes['database'] = db
211
+
212
+ return edges
213
+ })
214
+ }
215
+
216
+ //{{{ CONSOLIDATION
217
+
218
+ rbbt.plots.aes.consolidate_list = function(list){
219
+ var nodes = []
220
+
221
+ var codes = list.codes
222
+ var info = list.info
223
+ var aes = list.aes
224
+ var properties = list.properties
225
+
226
+ for (i in codes){
227
+ var node = {}
228
+ node.code = codes[i]
229
+ forHash(aes, function(name, values){
230
+ var value
231
+ if (typeof values == 'object') value = values[i]
232
+ else value = values
233
+ node[name] = value
234
+ })
235
+ nodes.push(node)
236
+ }
237
+
238
+ return nodes
239
+ }
240
+
241
+ rbbt.plots.aes.consolidate_associations = function(list, database){
242
+ var edges = []
243
+ forHash(list,function(code, values){
244
+ var edge = {}
245
+ var source_code = values[0]
246
+ var target_code = values[1]
247
+
248
+ edge.source = source_code
249
+ edge.target = target_code
250
+ edge.database = database
251
+
252
+ edges.push(edge)
253
+ })
254
+
255
+ return edges
256
+ }
257
+
258
+ rbbt.plots.aes.consolidate_associations = function(list){
259
+ var nodes = []
260
+
261
+ var codes = list.codes
262
+ var info = list.info
263
+ var aes = list.aes
264
+ var properties = list.properties
265
+ var values = list.properties
266
+
267
+ for (i in codes){
268
+ var node = {}
269
+ node.code = codes[i]
270
+ forHash(aes, function(name, values){
271
+ var value
272
+ if (typeof values == 'object') value = values[i]
273
+ else value = values
274
+ node[name] = value
275
+ })
276
+ nodes.push(node)
277
+ }
278
+
279
+ return nodes
280
+ }
281
+
282
+ rbbt.plots.aes.consolidate = function(graph_model){
283
+ var model = {}
284
+
285
+ var nodes = []
286
+
287
+ forHash(graph_model.entities, function(type, list){
288
+ var list_nodes = rbbt.plots.aes.consolidate_list(list)
289
+ for (i in list_nodes) nodes.push(list_nodes[i])
290
+ })
291
+
292
+ var edges = []
293
+ forHash(graph_model.associations, function(database, list){
294
+ var list_edges = rbbt.plots.aes.consolidate_associations(list,database)
295
+ for (i in list_edges) edges.push(list_edges[i])
296
+ })
297
+
298
+ model.nodes = nodes
299
+ model.edges = edges
300
+
301
+ return model
302
+ }
303
+
304
+ //}}} CONSOLIDATION
305
+
306
+
307
+ rbbt.plots.aes.build_d3 = function(graph_model){
308
+
309
+ var model = rbbt.plots.aes.consolidate(graph_model)
310
+
311
+ var node_index = {}
312
+ for (i=0; i< model.nodes.length; i++) node_index[model.nodes[i].code] = i
313
+
314
+ for (i=0; i< model.edges.length; i++){
315
+ var edge = model.edges[i]
316
+ edge.source = node_index[edge.source]
317
+ edge.target = node_index[edge.target]
318
+ }
319
+
320
+ model.links = model.edges
321
+ model.edges = undefined
322
+ model.node_index = node_index
323
+
324
+ return model
325
+ }
326
+
327
+ rbbt.plots.aes.build_cytoscape = function(graph_model){
328
+ var model = rbbt.plots.aes.consolidate(graph_model)
329
+
330
+ var dataSchema = {nodes: [], edges:[]}
331
+
332
+ var node_vars = {}
333
+ for (i in model.nodes){
334
+ for (p in model.nodes[i]){
335
+ if (undefined !== model.nodes[i][p])
336
+ node_vars[p] = typeof model.nodes[i][p]
337
+ }
338
+ }
339
+ for (p in node_vars){
340
+ dataSchema.nodes.push({name: p, type: node_vars[p]})
341
+ }
342
+
343
+ node_vars = {}
344
+ for (i in model.edges){
345
+ for (p in model.edges[i]){
346
+ if (undefined !== model.edges[i][p])
347
+ node_vars[p] = typeof model.edges[i][p]
348
+ }
349
+ }
350
+ for (p in node_vars){
351
+ dataSchema.edges.push({name: p, type: node_vars[p]})
352
+ }
353
+
354
+ var cy_model = {}
355
+ cy_model.dataSchema = dataSchema
356
+ cy_model.data = model
357
+
358
+ return cy_model
359
+ }
360
+
361
+ rbbt.plots.aes.build_cytoscapejs = function(graph_model){
362
+ var model = rbbt.plots.aes.consolidate(graph_model)
363
+
364
+ var nodes = []
365
+ forArray(model.nodes, function(node){
366
+ nodes.push({data: node})
367
+ })
368
+
369
+ console.log(model.edges)
370
+ var edges = []
371
+ forArray(model.edges, function(edge){
372
+ edges.push({data: edge})
373
+ })
374
+
375
+ var cy_model = {}
376
+ cy_model.elements = {nodes: nodes, edges: edges}
377
+
378
+ console.log(cy_model)
379
+ return cy_model
380
+ }
381
+