quorum 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- quorum (0.4.0)
4
+ quorum (0.5.0)
5
5
  bio-blastxmlparser (~> 1.1.0)
6
6
  jquery-rails
7
7
  net-ssh (~> 2.3.0)
@@ -46,7 +46,7 @@ GEM
46
46
  nokogiri (>= 1.5.0)
47
47
  bio-logger (1.0.1)
48
48
  log4r (>= 1.1.9)
49
- builder (3.0.0)
49
+ builder (3.0.3)
50
50
  capybara (1.1.2)
51
51
  mime-types (>= 1.16)
52
52
  nokogiri (>= 1.3.3)
@@ -61,18 +61,18 @@ GEM
61
61
  erubis (2.7.0)
62
62
  ffi (1.1.5)
63
63
  hike (1.2.1)
64
- i18n (0.6.0)
65
- jasmine (1.2.0)
64
+ i18n (0.6.1)
65
+ jasmine (1.2.1)
66
66
  jasmine-core (>= 1.2.0)
67
67
  rack (~> 1.0)
68
68
  rspec (>= 1.3.1)
69
69
  selenium-webdriver (>= 0.1.3)
70
70
  jasmine-core (1.2.0)
71
71
  journey (1.0.4)
72
- jquery-rails (2.0.2)
73
- railties (>= 3.2.0, < 5.0)
72
+ jquery-rails (2.1.2)
73
+ railties (>= 3.1.0, < 5.0)
74
74
  thor (~> 0.14)
75
- json (1.7.4)
75
+ json (1.7.5)
76
76
  libwebsocket (0.1.5)
77
77
  addressable
78
78
  log4r (1.1.10)
@@ -134,9 +134,9 @@ GEM
134
134
  rspec-expectations (~> 2.11.0)
135
135
  rspec-mocks (~> 2.11.0)
136
136
  rspec-core (2.11.1)
137
- rspec-expectations (2.11.2)
137
+ rspec-expectations (2.11.3)
138
138
  diff-lcs (~> 1.1.3)
139
- rspec-mocks (2.11.1)
139
+ rspec-mocks (2.11.2)
140
140
  rspec-rails (2.11.0)
141
141
  actionpack (>= 3.0)
142
142
  activesupport (>= 3.0)
@@ -148,7 +148,7 @@ GEM
148
148
  libwebsocket (~> 0.1.3)
149
149
  multi_json (~> 1.0)
150
150
  rubyzip
151
- sinatra (1.3.2)
151
+ sinatra (1.3.3)
152
152
  rack (~> 1.3, >= 1.3.6)
153
153
  rack-protection (~> 1.2)
154
154
  tilt (~> 1.3, >= 1.3.3)
@@ -156,7 +156,7 @@ GEM
156
156
  hike (~> 1.2)
157
157
  rack (~> 1.0)
158
158
  tilt (~> 1.1, != 1.3.0)
159
- thor (0.15.4)
159
+ thor (0.16.0)
160
160
  tilt (1.3.3)
161
161
  treetop (1.4.10)
162
162
  polyglot
data/HISTORY.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.5.0 (2012-09-14)
2
+
3
+ * Fixed partial data load bug. https://github.com/ncgr/quorum/issues/2
4
+ Requires running quorum:install and quorum:views generators.
5
+ See the Upgrading? section in the README for more information.
6
+ * Added better support for jQuery ajax errors in quorum.js.
7
+ * Added better support for URLs in quorum.js.
8
+
1
9
  ## 0.4.0 (2012-08-10)
2
10
 
3
11
  * Added Hsp gaps to Blast Job Reports.
data/README.rdoc CHANGED
@@ -399,7 +399,7 @@ https://github.com/ncgr/quorum/issues
399
399
  === Contributors
400
400
 
401
401
  * John Crow (https://github.com/crowja)
402
- * Andrew Farmer
402
+ * Andrew Farmer (https://github.com/adf-ncgr)
403
403
 
404
404
  == License
405
405
 
@@ -13,13 +13,16 @@ QUORUM.algorithms = ["blastn", "blastx", "tblastn", "blastp"];
13
13
  // Poll search results asynchronously.
14
14
  //
15
15
  // Allow user to define callback / callback_obj. If callback is
16
- // undefined, render buildTemplate.
16
+ // undefined, render default view.
17
17
  //
18
- QUORUM.pollResults = function(id, callback, callback_obj, interval, algos) {
18
+ QUORUM.pollResults = function(callback, callback_obj, interval, algos) {
19
19
 
20
20
  var self = this,
21
- interval = interval || 5000,
22
- algos = algos || self.algorithms;
21
+ url = document.URL + '/get_quorum_search_results.json',
22
+ interval = interval || 5000,
23
+ algos = algos || self.algorithms,
24
+ error = false,
25
+ timeoutIds = {};
23
26
 
24
27
  // Render default view.
25
28
  function buildTemplate(data, a) {
@@ -33,24 +36,56 @@ QUORUM.pollResults = function(id, callback, callback_obj, interval, algos) {
33
36
  $('#' + a + '-results').html(temp);
34
37
  }
35
38
 
36
- _.each(algos, function(a) {
37
- $.getJSON(
38
- '/quorum/jobs/' + id + '/get_quorum_search_results.json?algo=' + a,
39
- function(data) {
40
- if (data.length === 0) {
41
- // Continue to check until results are returned.
42
- setTimeout(function() {
43
- self.pollResults(id, callback, callback_obj, interval, [a]);
44
- }, interval);
45
- } else {
46
- if (typeof callback === "function") {
47
- callback.call(callback_obj, id, data, a);
48
- } else {
49
- buildTemplate(data, a);
50
- }
51
- }
39
+ // Process returned data from ajax call. If data is present, render,
40
+ // otherwise call function via setTimeout().
41
+ function processData(data, a) {
42
+ if (data.length === 0) {
43
+ timeoutIds[a] = setTimeout(function() {
44
+ getData(a);
45
+ }, interval);
46
+ } else {
47
+ clearTimeout(timeoutIds[a]);
48
+ if (_.isFunction(callback)) {
49
+ callback.call(callback_obj, data, a);
50
+ } else {
51
+ buildTemplate(data, a);
52
52
  }
53
- );
53
+ }
54
+ }
55
+
56
+ // Render jqXHR error message.
57
+ function renderError(jqXHR) {
58
+ var msg = "<div class='ui-state-error ui-corner-all' " +
59
+ "style='padding: 0 .7em;'><p class='text'>" +
60
+ "<span class='ui-icon ui-icon-alert' style='float: left; " +
61
+ "margin-right: .3em;';></span>Something went wrong. " +
62
+ "Error: " + jqXHR.status + " " + jqXHR.statusText + "</p></div>";
63
+ if (error === false) {
64
+ $('#show').append(msg);
65
+ error = true;
66
+ }
67
+ }
68
+
69
+ // Get Quorum results.
70
+ function getData(a) {
71
+ $.ajax({
72
+ url: url,
73
+ type: 'get',
74
+ dataType: 'json',
75
+ data: { 'algo': a },
76
+ cache: false,
77
+ timeout: 10000,
78
+ success: function(data) {
79
+ processData(data, a);
80
+ },
81
+ error: function(jqXHR) {
82
+ renderError(jqXHR);
83
+ }
84
+ });
85
+ }
86
+
87
+ _.each(algos, function(a) {
88
+ getData(a);
54
89
  });
55
90
 
56
91
  };
@@ -60,9 +95,10 @@ QUORUM.pollResults = function(id, callback, callback_obj, interval, algos) {
60
95
  // to the same query. After the modal box is inserted into the DOM,
61
96
  // automatically scroll to the highlighted hit.
62
97
  //
63
- QUORUM.viewDetailedReport = function(id, focus_id, query, algo) {
98
+ QUORUM.viewDetailedReport = function(focus_id, query, algo) {
64
99
 
65
- var self = this;
100
+ var self = this,
101
+ url = document.URL + '/get_quorum_search_results.json';
66
102
 
67
103
  // Create the modal box.
68
104
  $('#detailed_report_dialog').html(
@@ -75,33 +111,50 @@ QUORUM.viewDetailedReport = function(id, focus_id, query, algo) {
75
111
  position: 'top'
76
112
  });
77
113
 
78
- $.getJSON(
79
- '/quorum/jobs/' + id + '/get_quorum_search_results.json?algo=' + algo +
80
- '&query=' + query,
81
- function(data) {
82
- var temp = _.template(
83
- $('#detailed_report_template').html(), {
84
- data: data,
85
- query: query,
86
- algo: algo
87
- }
88
- );
89
-
90
- // Insert the detailed report data.
91
- $('#detailed_report_dialog').empty().html(temp);
92
-
93
- // Add tipsy to sequence data on mouse enter.
94
- $('#detailed_report_dialog .sequence').mouseenter(function() {
95
- $(this).find('a[rel=quorum-tipsy]').tipsy({ gravity: 's' });
96
- });
97
-
98
- // Highlight the selected id.
99
- $('#' + focus_id).addClass("ui-state-highlight");
100
-
101
- // Automatically scroll to the selected id.
102
- self.autoScroll(focus_id, false);
114
+ function renderTemplate(data) {
115
+ var temp = _.template(
116
+ $('#detailed_report_template').html(), {
117
+ data: data,
118
+ query: query,
119
+ algo: algo
120
+ }
121
+ );
122
+
123
+ // Insert the detailed report data.
124
+ $('#detailed_report_dialog').empty().html(temp);
125
+ // Add tipsy to sequence data on mouse enter.
126
+ $('#detailed_report_dialog .sequence').mouseenter(function() {
127
+ $(this).find('a[rel=quorum-tipsy]').tipsy({ gravity: 's' });
128
+ });
129
+ // Highlight the selected id.
130
+ $('#' + focus_id).addClass("ui-state-highlight");
131
+ // Automatically scroll to the selected id.
132
+ self.autoScroll(focus_id, false);
133
+ }
134
+
135
+ function renderError(jqXHR) {
136
+ $('#detailed_report_dialog').empty().html(
137
+ "<div class='ui-state-error ui-corner-all' " +
138
+ "style='padding: 0 .7em;'><p class='text'>" +
139
+ "<span class='ui-icon ui-icon-alert' style='float: left; " +
140
+ "margin-right: .3em;';></span>Something went wrong. " +
141
+ "Error: " + jqXHR.status + " " + jqXHR.statusText + "</p></div>"
142
+ );
143
+ }
144
+
145
+ $.ajax({
146
+ url: url,
147
+ type: 'get',
148
+ dataType: 'json',
149
+ data: { 'algo': algo, 'query': query },
150
+ timeout: 10000,
151
+ success: function(data) {
152
+ renderTemplate(data);
153
+ },
154
+ error: function(jqXHR) {
155
+ renderError(jqXHR);
103
156
  }
104
- );
157
+ });
105
158
 
106
159
  };
107
160
 
@@ -273,51 +326,64 @@ QUORUM.displayHspLinks = function(focus, group, data) {
273
326
  //
274
327
  // Download Blast hit sequence.
275
328
  //
276
- QUORUM.downloadSequence = function(id, algo_id, algo, el) {
329
+ QUORUM.downloadSequence = function(algo_id, algo, el) {
277
330
 
278
- var self = this;
331
+ var self = this,
332
+ url = document.URL + '/get_quorum_blast_hit_sequence.json';
279
333
 
280
334
  $(el).html('Fetching sequence...');
281
335
 
282
- $.getJSON(
283
- "/quorum/jobs/" + id + "/get_quorum_blast_hit_sequence.json?algo_id=" +
284
- algo_id + "&algo=" + algo,
285
- function(data) {
286
- self.getSequenceFile(id, data[0].meta_id, el);
336
+ function renderError(jqXHR) {
337
+ $(el).addClass('ui-state-error').html(
338
+ "Error: " + jqXHR.status + " " + jqXHR.statusText
339
+ );
340
+ }
341
+
342
+ $.ajax({
343
+ url: url,
344
+ dataType: 'json',
345
+ data: { 'algo_id': algo_id, 'algo': algo },
346
+ timeout: 10000,
347
+ success: function(data) {
348
+ self.getSequenceFile(data[0].meta_id, el);
349
+ },
350
+ error: function(jqXHR) {
351
+ renderError(jqXHR);
287
352
  }
288
- );
353
+ });
289
354
 
290
355
  };
291
356
 
292
357
  //
293
358
  // Poll application for Blast hit sequence.
294
359
  //
295
- QUORUM.getSequenceFile = function(id, meta_id, el) {
360
+ QUORUM.getSequenceFile = function(meta_id, el) {
296
361
 
297
362
  var self = this,
298
- url;
299
-
300
- url = "/quorum/jobs/" + id +
301
- "/send_quorum_blast_hit_sequence?meta_id=" + meta_id;
302
- $.get(
303
- url,
304
- function(data) {
305
- if (data.length === 0) {
306
- setTimeout(function() { self.getSequenceFile(id, meta_id, el) }, 2500);
363
+ url = document.URL + '/send_quorum_blast_hit_sequence?meta_id=' + meta_id,
364
+ timeoutId = 0;
365
+
366
+ function downloadFile(data) {
367
+ if (data.length === 0) {
368
+ timeoutId = setTimeout(function() {
369
+ self.getSequenceFile(meta_id, el)
370
+ }, 2500);
371
+ } else {
372
+ clearTimeout(timeoutId);
373
+ if (data.indexOf("error") !== -1) {
374
+ // Print error message.
375
+ $(el).addClass('ui-state-error').html(data);
307
376
  } else {
308
- if (data.indexOf("error") !== -1) {
309
- // Print error message.
310
- $(el).addClass('ui-state-error').html(data);
311
- } else {
312
- // Force browser to download file via iframe.
313
- $(el).addClass('ui-state-highlight').html('Sequence Downloaded Successfully');
314
- $('.quorum_sequence_download').remove();
315
- $('body').append('<iframe class="quorum_sequence_download"></iframe>');
316
- $('.quorum_sequence_download').attr('src', url).hide();
317
- }
377
+ // Force browser to download file via iframe.
378
+ $(el).addClass('ui-state-highlight').html('Sequence Downloaded Successfully');
379
+ $('.quorum_sequence_download').remove();
380
+ $('body').append('<iframe class="quorum_sequence_download"></iframe>');
381
+ $('.quorum_sequence_download').attr('src', url).hide();
318
382
  }
319
383
  }
320
- );
384
+ }
385
+
386
+ $.get(url, function(data) { downloadFile(data); });
321
387
 
322
388
  };
323
389
 
@@ -41,6 +41,6 @@
41
41
  <div id="quorum">
42
42
  <hr class="big" />
43
43
  <p>
44
- Powered by <%= link_to "Quorum", "https://github.com/ncgr/quorum" %>
44
+ Powered by <%= link_to "Quorum v#{Quorum::VERSION}", "https://github.com/ncgr/quorum" %>
45
45
  </p>
46
46
  </div>
@@ -50,7 +50,7 @@
50
50
  <div id="quorum">
51
51
  <hr class="big" />
52
52
  <p>
53
- Powered by <%= link_to "Quorum", "https://github.com/ncgr/quorum" %>
53
+ Powered by <%= link_to "Quorum v#{Quorum::VERSION}", "https://github.com/ncgr/quorum" %>
54
54
  </p>
55
55
  </div>
56
56
 
@@ -63,24 +63,22 @@
63
63
  //
64
64
  // Asynchronously poll Quorum for search results.
65
65
  //
66
- // QUORUM.pollResults(id, callback, callback_obj, interval)
67
- // id: Job.id
66
+ // QUORUM.pollResults(callback, callback_obj, interval)
68
67
  // callback: Define your own callback function to override the default.
69
68
  // callback should expect the following params.
70
- // id: Job.id (Int),
71
69
  // data: JSON data (JSON),
72
70
  // algorithm: Supported algorithm (String).
73
71
  // callback_obj: Callback object.
74
72
  // interval: poll interval in milliseconds. 5000 default.
75
73
  //
76
74
  // Example:
77
- // QUORUM.pollResults(<%= @jobs.id %>, MYAPP.myCoolCallback, MYAPP, 5000);
75
+ // QUORUM.pollResults(MYAPP.myCoolCallback, MYAPP, 5000);
78
76
  //
79
77
  // Example callback:
80
- // MYAPP.myCoolCallback = function(id, data, algo) {
78
+ // MYAPP.myCoolCallback = function(data, algo) {
81
79
  // // awesome logic
82
80
  // };
83
81
  //
84
- QUORUM.pollResults(<%= @jobs.id %>);
82
+ QUORUM.pollResults();
85
83
  });
86
84
  </script>
@@ -41,7 +41,7 @@
41
41
  </table>
42
42
  <p class="small">
43
43
  <a id="download_sequence_{{= id }}"
44
- onclick="QUORUM.downloadSequence(<%= @jobs.id %>, {{= id }}, '{{= algo }}', this)">
44
+ onclick="QUORUM.downloadSequence({{= id }}, '{{= algo }}', this)">
45
45
  Download Sequence
46
46
  </a>
47
47
  </p>
@@ -52,7 +52,6 @@
52
52
  <td class="right">
53
53
  <a class="detailed_report"
54
54
  onclick="QUORUM.viewDetailedReport(
55
- <%= @jobs.id %>,
56
55
  {{= v.id }},
57
56
  '{{= v.query }}',
58
57
  '{{= algo }}')">
@@ -0,0 +1,15 @@
1
+ class ChangeHspGroupColumnType < ActiveRecord::Migration
2
+ def up
3
+ change_column :quorum_blastn_job_reports, :hsp_group, :text
4
+ change_column :quorum_blastx_job_reports, :hsp_group, :text
5
+ change_column :quorum_tblastn_job_reports, :hsp_group, :text
6
+ change_column :quorum_blastp_job_reports, :hsp_group, :text
7
+ end
8
+
9
+ def down
10
+ change_column :quorum_blastn_job_reports, :hsp_group, :string
11
+ change_column :quorum_blastx_job_reports, :hsp_group, :string
12
+ change_column :quorum_tblastn_job_reports, :hsp_group, :string
13
+ change_column :quorum_blastp_job_reports, :hsp_group, :string
14
+ end
15
+ end
@@ -437,8 +437,13 @@ module Quorum
437
437
  generate_blast_cmd
438
438
  @logger.log("NCBI Blast", @cmd)
439
439
  system(@cmd)
440
- parse_and_save_results
441
- add_hps_groups_to_reports
440
+
441
+ # Wrap these methods in a transaction to prevent premature return.
442
+ @job.method(@job_report_association).call.transaction do
443
+ parse_and_save_results
444
+ add_hps_groups_to_reports
445
+ end
446
+
442
447
  remove_tmp_files
443
448
  end
444
449
 
@@ -1,3 +1,3 @@
1
1
  module Quorum
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20120807211452) do
14
+ ActiveRecord::Schema.define(:version => 20120910180642) do
15
15
 
16
16
  create_table "quorum_blastn_job_reports", :force => true do |t|
17
17
  t.string "query"
@@ -21,7 +21,7 @@ ActiveRecord::Schema.define(:version => 20120807211452) do
21
21
  t.string "hit_accession"
22
22
  t.integer "hit_len"
23
23
  t.integer "hsp_num"
24
- t.string "hsp_group"
24
+ t.text "hsp_group"
25
25
  t.integer "bit_score"
26
26
  t.integer "score"
27
27
  t.string "evalue"
@@ -68,7 +68,7 @@ ActiveRecord::Schema.define(:version => 20120807211452) do
68
68
  t.string "hit_accession"
69
69
  t.integer "hit_len"
70
70
  t.integer "hsp_num"
71
- t.string "hsp_group"
71
+ t.text "hsp_group"
72
72
  t.integer "bit_score"
73
73
  t.integer "score"
74
74
  t.string "evalue"
@@ -115,7 +115,7 @@ ActiveRecord::Schema.define(:version => 20120807211452) do
115
115
  t.string "hit_accession"
116
116
  t.integer "hit_len"
117
117
  t.integer "hsp_num"
118
- t.string "hsp_group"
118
+ t.text "hsp_group"
119
119
  t.integer "bit_score"
120
120
  t.integer "score"
121
121
  t.string "evalue"
@@ -171,7 +171,7 @@ ActiveRecord::Schema.define(:version => 20120807211452) do
171
171
  t.string "hit_accession"
172
172
  t.integer "hit_len"
173
173
  t.integer "hsp_num"
174
- t.string "hsp_group"
174
+ t.text "hsp_group"
175
175
  t.integer "bit_score"
176
176
  t.integer "score"
177
177
  t.string "evalue"
@@ -437,8 +437,13 @@ module Quorum
437
437
  generate_blast_cmd
438
438
  @logger.log("NCBI Blast", @cmd)
439
439
  system(@cmd)
440
- parse_and_save_results
441
- add_hps_groups_to_reports
440
+
441
+ # Wrap these methods in a transaction to prevent premature return.
442
+ @job.method(@job_report_association).call.transaction do
443
+ parse_and_save_results
444
+ add_hps_groups_to_reports
445
+ end
446
+
442
447
  remove_tmp_files
443
448
  end
444
449
 
@@ -1,15 +1,17 @@
1
- <div id="tabs">
2
- <ul>
3
- <li><a href="#tabs-1">Tab 1</a></li>
4
- <li><a href="#tabs-2">Tab 2</a></li>
5
- <li><a href="#tabs-3">Tab 3</a></li>
6
- </ul>
7
- <div id="tabs-1">Tab 1</div>
8
- <div id="tabs-2">Tab 2</div>
9
- <div id="tabs-3">Tab 3</div>
10
- </div>
1
+ <div id="show">
2
+ <div id="tabs">
3
+ <ul>
4
+ <li><a href="#tabs-1">Tab 1</a></li>
5
+ <li><a href="#tabs-2">Tab 2</a></li>
6
+ <li><a href="#tabs-3">Tab 3</a></li>
7
+ </ul>
8
+ <div id="tabs-1">Tab 1</div>
9
+ <div id="tabs-2">Tab 2</div>
10
+ <div id="tabs-3">Tab 3</div>
11
+ </div>
11
12
 
12
- <div id="detailed_report_dialog" title="Quorum Report Details"></div>
13
- <script type="text/template" id="blast_template"></script>
14
- <script type="text/template" id="detailed_report_template"></script>
15
- <a id="download_sequence">Download Sequence</a>
13
+ <div id="detailed_report_dialog" title="Quorum Report Details"></div>
14
+ <script type="text/template" id="blast_template"></script>
15
+ <script type="text/template" id="detailed_report_template"></script>
16
+ <a id="download_sequence">Download Sequence</a>
17
+ </div>
@@ -23,21 +23,32 @@ describe("QUORUM", function() {
23
23
  // anonymous function buildTemplate().
24
24
  //
25
25
  it("fetches JSON and calls user defined callback function", function() {
26
- spyOn($, 'getJSON');
26
+ loadFixtures('quorum_tabs.html');
27
+
28
+ spyOn($, 'ajax');
27
29
  spyOn(window, 'setTimeout');
28
- var id = 1,
29
- callback = jasmine.createSpy(),
30
- data = 'foo';
30
+ var callback = jasmine.createSpy(),
31
+ data = 'foo',
32
+ error = {
33
+ status: 400,
34
+ statusText: 'bad news'
35
+ };
31
36
 
32
- QUORUM.pollResults(id, callback, null, 5000, ['a']);
37
+ QUORUM.pollResults(callback, null, 5000, ['a']);
33
38
 
34
39
  // setTimeout()
35
- $.getJSON.mostRecentCall.args[1]('');
40
+ $.ajax.mostRecentCall.args[0].success([]);
36
41
  expect(window.setTimeout).toHaveBeenCalled();
37
42
 
43
+ // Print jqXHR error message.
44
+ $.ajax.mostRecentCall.args[0].error(error);
45
+ expect($(".ui-state-error")).toHaveText(
46
+ 'Something went wrong. Error: 400 bad news'
47
+ );
48
+
38
49
  // callback()
39
- $.getJSON.mostRecentCall.args[1](data);
40
- expect(callback).toHaveBeenCalledWith(id, data, 'a');
50
+ $.ajax.mostRecentCall.args[0].success(data);
51
+ expect(callback).toHaveBeenCalledWith(data, 'a');
41
52
  });
42
53
 
43
54
  //
@@ -48,20 +59,29 @@ describe("QUORUM", function() {
48
59
  it("renders modal box containing detailed report", function() {
49
60
  loadFixtures('quorum_tabs.html');
50
61
 
51
- spyOn($, 'getJSON');
62
+ spyOn($, 'ajax');
52
63
  spyOn(QUORUM, 'autoScroll');
53
- var id = 1,
54
- focus_id = 1,
64
+ var focus_id = 1,
55
65
  query = 'foo',
56
66
  algo = 'a',
57
- data = 'bar';
67
+ data = 'bar',
68
+ error = {
69
+ status: 500,
70
+ statusText: 'bad news'
71
+ };
58
72
 
59
- QUORUM.viewDetailedReport(id, focus_id, query, algo);
73
+ QUORUM.viewDetailedReport(focus_id, query, algo);
60
74
 
61
75
  expect($("#detailed_report_dialog")).toBeVisible();
62
76
 
77
+ // Print jqXHR error message.
78
+ $.ajax.mostRecentCall.args[0].error(error);
79
+ expect($("#detailed_report_dialog")).toHaveText(
80
+ 'Something went wrong. Error: 500 bad news'
81
+ );
82
+
63
83
  // Fetch JSON to build the template and scroll to focus_id.
64
- $.getJSON.mostRecentCall.args[1](data);
84
+ $.ajax.mostRecentCall.args[0].success(data);
65
85
  expect(QUORUM.autoScroll).toHaveBeenCalledWith(focus_id, false);
66
86
 
67
87
  // Close the dialog box.
@@ -214,20 +234,27 @@ describe("QUORUM", function() {
214
234
  it("sends request to server to extract Blast hit sequence", function() {
215
235
  loadFixtures("quorum_tabs.html");
216
236
 
217
- spyOn($, 'getJSON');
237
+ spyOn($, 'ajax');
218
238
  spyOn(QUORUM, 'getSequenceFile');
219
- var id = 1,
220
- algo_id = 1,
239
+ var algo_id = 1,
221
240
  algo = 'a',
222
241
  el = $("#download_sequence"),
223
- data = [{meta_id:"foo"}];
242
+ data = [{meta_id:"foo"}],
243
+ error = {
244
+ status: 505,
245
+ statusText: 'wut?'
246
+ };
224
247
 
225
- QUORUM.downloadSequence(id, algo_id, algo, el);
248
+ QUORUM.downloadSequence(algo_id, algo, el);
226
249
 
227
250
  expect(el.html()).toEqual('Fetching sequence...');
228
251
 
229
- $.getJSON.mostRecentCall.args[1](data);
230
- expect(QUORUM.getSequenceFile).toHaveBeenCalledWith(id, data[0].meta_id, el);
252
+ // Print jqXHR error message.
253
+ $.ajax.mostRecentCall.args[0].error(error);
254
+ expect(el).toHaveText("Error: 505 wut?");
255
+
256
+ $.ajax.mostRecentCall.args[0].success(data);
257
+ expect(QUORUM.getSequenceFile).toHaveBeenCalledWith(data[0].meta_id, el);
231
258
  });
232
259
 
233
260
  //
@@ -241,19 +268,18 @@ describe("QUORUM", function() {
241
268
 
242
269
  spyOn($, 'get');
243
270
  spyOn(window, 'setTimeout');
244
- var id = 1,
245
- meta_id = 'foo',
271
+ var meta_id = 'foo',
246
272
  el = $("#download_sequence"),
247
273
  data = 'bar',
248
274
  error = 'error';
249
275
 
250
- QUORUM.getSequenceFile(id, meta_id, el);
276
+ QUORUM.getSequenceFile(meta_id, el);
251
277
 
252
278
  // setTimeout()
253
- $.get.mostRecentCall.args[1]('');
279
+ $.get.mostRecentCall.args[1]([]);
254
280
  expect(window.setTimeout).toHaveBeenCalled();
255
281
 
256
- // Print error message
282
+ // Print error message.
257
283
  $.get.mostRecentCall.args[1](error);
258
284
  expect(el.html()).toEqual(error);
259
285
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quorum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-10 00:00:00.000000000 Z
12
+ date: 2012-09-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -280,6 +280,7 @@ files:
280
280
  - db/migrate/20111031204941_create_tblastn_job_reports.rb
281
281
  - db/migrate/20120109232446_add_hit_display_id_to_blast_reports.rb
282
282
  - db/migrate/20120807202555_add_gaps_to_blast_reports.rb
283
+ - db/migrate/20120910175911_change_hsp_group_column_type.rb
283
284
  - lib/generators/quorum/images_generator.rb
284
285
  - lib/generators/quorum/install_generator.rb
285
286
  - lib/generators/quorum/styles_generator.rb
@@ -426,7 +427,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
426
427
  version: '0'
427
428
  segments:
428
429
  - 0
429
- hash: -3860118891920834630
430
+ hash: -220393998352510462
430
431
  required_rubygems_version: !ruby/object:Gem::Requirement
431
432
  none: false
432
433
  requirements:
@@ -435,7 +436,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
435
436
  version: '0'
436
437
  segments:
437
438
  - 0
438
- hash: -3860118891920834630
439
+ hash: -220393998352510462
439
440
  requirements: []
440
441
  rubyforge_project:
441
442
  rubygems_version: 1.8.24