quorum 0.4.0 → 0.5.0

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.
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