teaspoon 0.7.8 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -5
  3. data/app/assets/javascripts/teaspoon-angular.js +19 -27
  4. data/app/assets/javascripts/teaspoon-jasmine.js +19 -27
  5. data/app/assets/javascripts/teaspoon-mocha.js +19 -28
  6. data/app/assets/javascripts/teaspoon-qunit.js +41 -15
  7. data/app/assets/javascripts/teaspoon/base/reporters/html/failure_view.coffee +1 -1
  8. data/app/assets/javascripts/teaspoon/base/reporters/html/spec_view.coffee +1 -1
  9. data/app/assets/javascripts/teaspoon/base/reporters/html/suite_view.coffee +1 -1
  10. data/app/assets/javascripts/teaspoon/base/teaspoon.coffee +12 -7
  11. data/app/assets/javascripts/teaspoon/qunit/reporters/html.coffee +1 -1
  12. data/app/assets/stylesheets/teaspoon.css +1 -1
  13. data/app/helpers/teaspoon/spec_helper.rb +2 -1
  14. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +4 -0
  15. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +4 -0
  16. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +6 -2
  17. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +4 -0
  18. data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +4 -0
  19. data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +4 -0
  20. data/lib/teaspoon/configuration.rb +4 -3
  21. data/lib/teaspoon/coverage.rb +3 -2
  22. data/lib/teaspoon/drivers/phantomjs/runner.js +108 -0
  23. data/lib/teaspoon/drivers/phantomjs_driver.rb +25 -7
  24. data/lib/teaspoon/engine.rb +5 -0
  25. data/lib/teaspoon/environment.rb +2 -4
  26. data/lib/teaspoon/formatters/base_formatter.rb +9 -6
  27. data/lib/teaspoon/formatters/dot_formatter.rb +3 -2
  28. data/lib/teaspoon/formatters/pride_formatter.rb +48 -0
  29. data/lib/teaspoon/formatters/snowday_formatter.rb +20 -0
  30. data/lib/teaspoon/server.rb +9 -3
  31. data/lib/teaspoon/suite.rb +3 -3
  32. data/lib/teaspoon/version.rb +1 -1
  33. data/spec/dummy/config/initializers/teaspoon.rb +1 -1
  34. data/spec/javascripts/teaspoon/base/teaspoon_spec.coffee +4 -4
  35. data/spec/javascripts/teaspoon/other/erb_spec.js.coffee.erb +4 -0
  36. data/spec/javascripts/teaspoon/phantomjs/runner_spec.coffee +1 -1
  37. data/spec/teaspoon/configuration_spec.rb +2 -1
  38. data/spec/teaspoon/coverage_spec.rb +1 -1
  39. data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +28 -14
  40. data/spec/teaspoon/environment_spec.rb +2 -3
  41. data/spec/teaspoon/formatters/base_formatter_spec.rb +3 -2
  42. data/spec/teaspoon/formatters/pride_formatter_spec.rb +0 -0
  43. data/spec/teaspoon/suite_spec.rb +5 -0
  44. data/vendor/assets/javascripts/support/bind-poly.js +23 -0
  45. metadata +10 -17
  46. data/lib/teaspoon/drivers/phantomjs/runner.coffee +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0f8b06c0ee5371ab133340a4de55d246e8e21932
4
- data.tar.gz: e92763c49f0fb454911371a0e88024f681ee33f8
3
+ metadata.gz: 8cef218e8022c1570a522f1d4a1d7f7f8e2a367f
4
+ data.tar.gz: ca33470c138fad431468907cb7e8c0961cd6d739
5
5
  SHA512:
6
- metadata.gz: 8dfff685fb1c85aecdfbb81921302a592f9fb0e2330b6b1f8e2895300cfd8c4ff31fe530c1b59c0d93139dcb44a031151049e0c6de7560b0495ef6ea7d4f6d03
7
- data.tar.gz: bae8e8493def887c1777cb54dc547dc6a9209732340e08a5d34487afefbf032a550f5fc922a285111d77783e65a89fbe9a9ef2e0081a079de40673be03041610
6
+ metadata.gz: e3d0cfcf706cf47bff2d7bb0b727159ba2e77dfa02dfaca7199ff68bae1583fd9d46ef331340c2cfc0fcefd9c3138892abdbf01990ff5db0e6cc45e266d5776a
7
+ data.tar.gz: ad850647cd5f11675c4bb3995326a4bb31eb40bc0b7e1f0b14d6438786f098272aee1858bafc65294a448bf6467d3b46763099123d21c9ea7eff55a218e55e12
data/README.md CHANGED
@@ -53,8 +53,11 @@ Updating requires that you rename your `teabag.rb` initializer to `teaspoon.rb`,
53
53
 
54
54
  Add it to your Gemfile. In most cases you'll want to restrict it to the `:development, :test` or `:asset` groups.
55
55
 
56
+ You should [install phantomjs](http://phantomjs.org/download.html). If phantomjs is found it will be used, otherwise you can use the gem as a fallback -- which might not be optimal.
57
+
56
58
  ```ruby
57
59
  group :development, :test do
60
+ gem "phantomjs", ">= 1.8.1.1" # this is optional if you install phantomjs manually (as of teaspoon 0.7.9)
58
61
  gem "teaspoon"
59
62
  end
60
63
  ```
@@ -71,9 +74,6 @@ You can tell the generator which framework you want to use, if you want coffeesc
71
74
  rails generate teaspoon:install --framework=mocha --coffee
72
75
  ```
73
76
 
74
- You can optionally [install phantomjs](http://phantomjs.org/download.html). If phantomjs is found it will be used, otherwise the gem will be used as a fallback -- which might not be optimal.
75
-
76
-
77
77
  ## Usage
78
78
 
79
79
  Teaspoon uses the Rails asset pipeline to serve files. This allows you to use `= require` in your test files, and allows you use things like HAML or RABL/JBuilder within your fixtures. You can run Teaspoon in three ways -- in the browser, via the rake task, and using the command line interface.
@@ -278,7 +278,7 @@ An example text report that's output to the console after the tests have complet
278
278
  File | % Stmts |% Branches | % Funcs | % Lines |
279
279
  --------------------+-----------+-----------+-----------+-----------+
280
280
  phantomjs/ | 93.75 | 75 | 94.12 | 93.65 |
281
- runner.coffee | 93.75 | 75 | 94.12 | 93.65 |
281
+ runner.js | 93.75 | 75 | 94.12 | 93.65 |
282
282
  --------------------+-----------+-----------+-----------+-----------+
283
283
  All files | 93.75 | 75 | 94.12 | 93.65 |
284
284
  --------------------+-----------+-----------+-----------+-----------+
@@ -598,7 +598,16 @@ You can require these files in your spec helper by using:
598
598
 
599
599
  ## CI Support
600
600
 
601
- Teaspoon works great on CI setups. If you're using TravisCI it just works, but if you're using something else all you should need is to ensure phantomjs is installed.
601
+ Teaspoon works great on CI setups. Add a line to execute Teaspoon (e.g. `bundle exec teaspoon`) in your CI config file. If you're using TravisCI or CircleCI it just works, but if you're using something else all you should need is to ensure phantomjs is installed.
602
+
603
+ You can add teaspoon to the default rake tasks by clearing out the defaults (this is sometimes not required), and then adding teaspoon in the chain where you want. So with rspec and cucumber, you get the rspec specs running first, then the javascript specs, and then cucumber (or whatever integration specs you have). This is what I do personally, and then I don't have to do any CI setup.
604
+
605
+ ```ruby
606
+ Rake::Task['default'].prerequisites.clear
607
+ Rake::Task['default'].clear
608
+
609
+ task default: [:spec, :teaspoon, :cucumber]
610
+ ```
602
611
 
603
612
  If you want to generate reports that CI can use you can install istanbul for coverage reports -- and output the report using the cobertura format, which Hudson can read.
604
613
 
@@ -26217,14 +26217,21 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26217
26217
  Teaspoon.messages = [];
26218
26218
 
26219
26219
  Teaspoon.execute = function() {
26220
- if (this.defer) {
26221
- this.defer = false;
26220
+ if (Teaspoon.defer) {
26221
+ Teaspoon.defer = false;
26222
26222
  return;
26223
26223
  }
26224
- this.started = true;
26224
+ if (Teaspoon.started) {
26225
+ Teaspoon.reload();
26226
+ }
26227
+ Teaspoon.started = true;
26225
26228
  return new Teaspoon.Runner();
26226
26229
  };
26227
26230
 
26231
+ Teaspoon.reload = function() {
26232
+ return window.location.reload();
26233
+ };
26234
+
26228
26235
  Teaspoon.onWindowLoad = function(method) {
26229
26236
  var originalOnload;
26230
26237
  originalOnload = window.onload;
@@ -26242,7 +26249,7 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26242
26249
  all = [];
26243
26250
  }
26244
26251
  deps = [];
26245
- if ((paths = this.location.search.match(/[\?&]file(\[\])?=[^&\?]*/gi)) === null) {
26252
+ if ((paths = Teaspoon.location.search.match(/[\?&]file(\[\])?=[^&\?]*/gi)) === null) {
26246
26253
  return all;
26247
26254
  }
26248
26255
  for (_i = 0, _len = paths.length; _i < _len; _i++) {
@@ -26264,7 +26271,7 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26264
26271
 
26265
26272
  Teaspoon.log = function() {
26266
26273
  var e;
26267
- this.messages.push(arguments[0]);
26274
+ Teaspoon.messages.push(arguments[0]);
26268
26275
  try {
26269
26276
  return console.log.apply(console, arguments);
26270
26277
  } catch (_error) {
@@ -26275,8 +26282,8 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26275
26282
 
26276
26283
  Teaspoon.getMessages = function() {
26277
26284
  var messages;
26278
- messages = this.messages;
26279
- this.messages = [];
26285
+ messages = Teaspoon.messages;
26286
+ Teaspoon.messages = [];
26280
26287
  return messages;
26281
26288
  };
26282
26289
 
@@ -26613,7 +26620,8 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26613
26620
 
26614
26621
  function HTML() {
26615
26622
  this.toggleConfig = __bind(this.toggleConfig, this);
26616
- this.reportRunnerResults = __bind(this.reportRunnerResults, this); this.start = new Teaspoon.Date().getTime();
26623
+ this.reportRunnerResults = __bind(this.reportRunnerResults, this);
26624
+ this.start = new Teaspoon.Date().getTime();
26617
26625
  this.config = {
26618
26626
  "use-catch": true,
26619
26627
  "build-full-report": false,
@@ -26638,7 +26646,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26638
26646
 
26639
26647
  HTML.prototype.build = function() {
26640
26648
  var _ref;
26641
-
26642
26649
  this.buildLayout();
26643
26650
  this.setText("env-info", this.envInfo());
26644
26651
  this.setText("version", Teaspoon.version);
@@ -26656,7 +26663,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26656
26663
 
26657
26664
  HTML.prototype.buildLayout = function() {
26658
26665
  var el;
26659
-
26660
26666
  el = this.createEl("div");
26661
26667
  el.id = "teaspoon-interface";
26662
26668
  el.innerHTML = Teaspoon.Reporters.HTML.template;
@@ -26665,7 +26671,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26665
26671
 
26666
26672
  HTML.prototype.buildSuiteSelect = function() {
26667
26673
  var options, suite, _i, _len, _ref;
26668
-
26669
26674
  if (Teaspoon.suites.all.length === 1) {
26670
26675
  return "";
26671
26676
  }
@@ -26742,7 +26747,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26742
26747
 
26743
26748
  HTML.prototype.updateStatus = function(spec) {
26744
26749
  var elapsed, result, _ref, _ref1;
26745
-
26746
26750
  spec = new Teaspoon.Spec(spec);
26747
26751
  result = spec.result();
26748
26752
  if (result.skipped || result.status === "pending") {
@@ -26771,7 +26775,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26771
26775
 
26772
26776
  HTML.prototype.showConfiguration = function() {
26773
26777
  var key, value, _ref, _results;
26774
-
26775
26778
  _ref = this.config;
26776
26779
  _results = [];
26777
26780
  for (key in _ref) {
@@ -26787,7 +26790,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26787
26790
 
26788
26791
  HTML.prototype.setFilters = function() {
26789
26792
  var link;
26790
-
26791
26793
  link = [Teaspoon.root, Teaspoon.suites.active].join('/');
26792
26794
  if (Teaspoon.params["file"]) {
26793
26795
  this.filters.push("by file: " + Teaspoon.params["file"] + " <a href='" + link + "'>remove</a>");
@@ -26799,7 +26801,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26799
26801
 
26800
26802
  HTML.prototype.readConfig = function() {
26801
26803
  var config;
26802
-
26803
26804
  if (config = this.cookie("teaspoon")) {
26804
26805
  return this.config = config;
26805
26806
  }
@@ -26807,7 +26808,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26807
26808
 
26808
26809
  HTML.prototype.toggleConfig = function(e) {
26809
26810
  var button, name;
26810
-
26811
26811
  button = e.target;
26812
26812
  if (button.tagName.toLowerCase() !== "button") {
26813
26813
  return;
@@ -26828,7 +26828,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26828
26828
 
26829
26829
  HTML.prototype.cookie = function(name, value) {
26830
26830
  var date, match;
26831
-
26832
26831
  if (value == null) {
26833
26832
  value = void 0;
26834
26833
  }
@@ -26982,20 +26981,18 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
26982
26981
 
26983
26982
  SpecView.prototype.build = function() {
26984
26983
  var classes;
26985
-
26986
26984
  classes = ["spec"];
26987
26985
  if (this.spec.pending) {
26988
26986
  classes.push("state-pending");
26989
26987
  }
26990
26988
  SpecView.__super__.build.call(this, classes.join(" "));
26991
- this.el.innerHTML = "<a href=\"" + this.spec.link + "\">" + this.spec.description + "</a>";
26989
+ this.el.innerHTML = "<a href=\"" + this.spec.link + "\">" + (this.htmlSafe(this.spec.description)) + "</a>";
26992
26990
  this.parentView = this.buildParent();
26993
26991
  return this.parentView.append(this.el);
26994
26992
  };
26995
26993
 
26996
26994
  SpecView.prototype.buildParent = function() {
26997
26995
  var parent, view;
26998
-
26999
26996
  parent = this.spec.parent;
27000
26997
  if (parent.viewId) {
27001
26998
  return this.views.suites[parent.viewId];
@@ -27007,7 +27004,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
27007
27004
 
27008
27005
  SpecView.prototype.buildErrors = function() {
27009
27006
  var div, error, html, _i, _len, _ref;
27010
-
27011
27007
  div = this.createEl("div");
27012
27008
  html = "";
27013
27009
  _ref = this.spec.errors();
@@ -27021,7 +27017,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
27021
27017
 
27022
27018
  SpecView.prototype.updateState = function(state, elapsed) {
27023
27019
  var classes, result, _base;
27024
-
27025
27020
  result = this.spec.result();
27026
27021
  classes = ["state-" + state];
27027
27022
  if (elapsed > Teaspoon.slow) {
@@ -27056,9 +27051,8 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
27056
27051
 
27057
27052
  FailureView.prototype.build = function() {
27058
27053
  var error, html, _i, _len, _ref;
27059
-
27060
27054
  FailureView.__super__.build.call(this, "spec");
27061
- html = "<h1 class=\"teaspoon-clearfix\"><a href=\"" + this.spec.link + "\">" + this.spec.fullDescription + "</a></h1>";
27055
+ html = "<h1 class=\"teaspoon-clearfix\"><a href=\"" + this.spec.link + "\">" + (this.htmlSafe(this.spec.fullDescription)) + "</a></h1>";
27062
27056
  _ref = this.spec.errors();
27063
27057
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
27064
27058
  error = _ref[_i];
@@ -27095,14 +27089,13 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
27095
27089
 
27096
27090
  SuiteView.prototype.build = function() {
27097
27091
  SuiteView.__super__.build.call(this, "suite");
27098
- this.el.innerHTML = "<h1><a href=\"" + this.suite.link + "\">" + this.suite.description + "</a></h1>";
27092
+ this.el.innerHTML = "<h1><a href=\"" + this.suite.link + "\">" + (this.htmlSafe(this.suite.description)) + "</a></h1>";
27099
27093
  this.parentView = this.buildParent();
27100
27094
  return this.parentView.append(this.el);
27101
27095
  };
27102
27096
 
27103
27097
  SuiteView.prototype.buildParent = function() {
27104
27098
  var parent, view;
27105
-
27106
27099
  parent = this.suite.parent;
27107
27100
  if (!parent) {
27108
27101
  return this.reporter;
@@ -27124,7 +27117,6 @@ angular.element(document).find('head').append('<style type="text/css">@charset "
27124
27117
 
27125
27118
  SuiteView.prototype.updateState = function(state) {
27126
27119
  var _base;
27127
-
27128
27120
  if (this.state === "failed") {
27129
27121
  return;
27130
27122
  }
@@ -2623,14 +2623,21 @@ jasmine.version_= {
2623
2623
  Teaspoon.messages = [];
2624
2624
 
2625
2625
  Teaspoon.execute = function() {
2626
- if (this.defer) {
2627
- this.defer = false;
2626
+ if (Teaspoon.defer) {
2627
+ Teaspoon.defer = false;
2628
2628
  return;
2629
2629
  }
2630
- this.started = true;
2630
+ if (Teaspoon.started) {
2631
+ Teaspoon.reload();
2632
+ }
2633
+ Teaspoon.started = true;
2631
2634
  return new Teaspoon.Runner();
2632
2635
  };
2633
2636
 
2637
+ Teaspoon.reload = function() {
2638
+ return window.location.reload();
2639
+ };
2640
+
2634
2641
  Teaspoon.onWindowLoad = function(method) {
2635
2642
  var originalOnload;
2636
2643
  originalOnload = window.onload;
@@ -2648,7 +2655,7 @@ jasmine.version_= {
2648
2655
  all = [];
2649
2656
  }
2650
2657
  deps = [];
2651
- if ((paths = this.location.search.match(/[\?&]file(\[\])?=[^&\?]*/gi)) === null) {
2658
+ if ((paths = Teaspoon.location.search.match(/[\?&]file(\[\])?=[^&\?]*/gi)) === null) {
2652
2659
  return all;
2653
2660
  }
2654
2661
  for (_i = 0, _len = paths.length; _i < _len; _i++) {
@@ -2670,7 +2677,7 @@ jasmine.version_= {
2670
2677
 
2671
2678
  Teaspoon.log = function() {
2672
2679
  var e;
2673
- this.messages.push(arguments[0]);
2680
+ Teaspoon.messages.push(arguments[0]);
2674
2681
  try {
2675
2682
  return console.log.apply(console, arguments);
2676
2683
  } catch (_error) {
@@ -2681,8 +2688,8 @@ jasmine.version_= {
2681
2688
 
2682
2689
  Teaspoon.getMessages = function() {
2683
2690
  var messages;
2684
- messages = this.messages;
2685
- this.messages = [];
2691
+ messages = Teaspoon.messages;
2692
+ Teaspoon.messages = [];
2686
2693
  return messages;
2687
2694
  };
2688
2695
 
@@ -3019,7 +3026,8 @@ jasmine.version_= {
3019
3026
 
3020
3027
  function HTML() {
3021
3028
  this.toggleConfig = __bind(this.toggleConfig, this);
3022
- this.reportRunnerResults = __bind(this.reportRunnerResults, this); this.start = new Teaspoon.Date().getTime();
3029
+ this.reportRunnerResults = __bind(this.reportRunnerResults, this);
3030
+ this.start = new Teaspoon.Date().getTime();
3023
3031
  this.config = {
3024
3032
  "use-catch": true,
3025
3033
  "build-full-report": false,
@@ -3044,7 +3052,6 @@ jasmine.version_= {
3044
3052
 
3045
3053
  HTML.prototype.build = function() {
3046
3054
  var _ref;
3047
-
3048
3055
  this.buildLayout();
3049
3056
  this.setText("env-info", this.envInfo());
3050
3057
  this.setText("version", Teaspoon.version);
@@ -3062,7 +3069,6 @@ jasmine.version_= {
3062
3069
 
3063
3070
  HTML.prototype.buildLayout = function() {
3064
3071
  var el;
3065
-
3066
3072
  el = this.createEl("div");
3067
3073
  el.id = "teaspoon-interface";
3068
3074
  el.innerHTML = Teaspoon.Reporters.HTML.template;
@@ -3071,7 +3077,6 @@ jasmine.version_= {
3071
3077
 
3072
3078
  HTML.prototype.buildSuiteSelect = function() {
3073
3079
  var options, suite, _i, _len, _ref;
3074
-
3075
3080
  if (Teaspoon.suites.all.length === 1) {
3076
3081
  return "";
3077
3082
  }
@@ -3148,7 +3153,6 @@ jasmine.version_= {
3148
3153
 
3149
3154
  HTML.prototype.updateStatus = function(spec) {
3150
3155
  var elapsed, result, _ref, _ref1;
3151
-
3152
3156
  spec = new Teaspoon.Spec(spec);
3153
3157
  result = spec.result();
3154
3158
  if (result.skipped || result.status === "pending") {
@@ -3177,7 +3181,6 @@ jasmine.version_= {
3177
3181
 
3178
3182
  HTML.prototype.showConfiguration = function() {
3179
3183
  var key, value, _ref, _results;
3180
-
3181
3184
  _ref = this.config;
3182
3185
  _results = [];
3183
3186
  for (key in _ref) {
@@ -3193,7 +3196,6 @@ jasmine.version_= {
3193
3196
 
3194
3197
  HTML.prototype.setFilters = function() {
3195
3198
  var link;
3196
-
3197
3199
  link = [Teaspoon.root, Teaspoon.suites.active].join('/');
3198
3200
  if (Teaspoon.params["file"]) {
3199
3201
  this.filters.push("by file: " + Teaspoon.params["file"] + " <a href='" + link + "'>remove</a>");
@@ -3205,7 +3207,6 @@ jasmine.version_= {
3205
3207
 
3206
3208
  HTML.prototype.readConfig = function() {
3207
3209
  var config;
3208
-
3209
3210
  if (config = this.cookie("teaspoon")) {
3210
3211
  return this.config = config;
3211
3212
  }
@@ -3213,7 +3214,6 @@ jasmine.version_= {
3213
3214
 
3214
3215
  HTML.prototype.toggleConfig = function(e) {
3215
3216
  var button, name;
3216
-
3217
3217
  button = e.target;
3218
3218
  if (button.tagName.toLowerCase() !== "button") {
3219
3219
  return;
@@ -3234,7 +3234,6 @@ jasmine.version_= {
3234
3234
 
3235
3235
  HTML.prototype.cookie = function(name, value) {
3236
3236
  var date, match;
3237
-
3238
3237
  if (value == null) {
3239
3238
  value = void 0;
3240
3239
  }
@@ -3388,20 +3387,18 @@ jasmine.version_= {
3388
3387
 
3389
3388
  SpecView.prototype.build = function() {
3390
3389
  var classes;
3391
-
3392
3390
  classes = ["spec"];
3393
3391
  if (this.spec.pending) {
3394
3392
  classes.push("state-pending");
3395
3393
  }
3396
3394
  SpecView.__super__.build.call(this, classes.join(" "));
3397
- this.el.innerHTML = "<a href=\"" + this.spec.link + "\">" + this.spec.description + "</a>";
3395
+ this.el.innerHTML = "<a href=\"" + this.spec.link + "\">" + (this.htmlSafe(this.spec.description)) + "</a>";
3398
3396
  this.parentView = this.buildParent();
3399
3397
  return this.parentView.append(this.el);
3400
3398
  };
3401
3399
 
3402
3400
  SpecView.prototype.buildParent = function() {
3403
3401
  var parent, view;
3404
-
3405
3402
  parent = this.spec.parent;
3406
3403
  if (parent.viewId) {
3407
3404
  return this.views.suites[parent.viewId];
@@ -3413,7 +3410,6 @@ jasmine.version_= {
3413
3410
 
3414
3411
  SpecView.prototype.buildErrors = function() {
3415
3412
  var div, error, html, _i, _len, _ref;
3416
-
3417
3413
  div = this.createEl("div");
3418
3414
  html = "";
3419
3415
  _ref = this.spec.errors();
@@ -3427,7 +3423,6 @@ jasmine.version_= {
3427
3423
 
3428
3424
  SpecView.prototype.updateState = function(state, elapsed) {
3429
3425
  var classes, result, _base;
3430
-
3431
3426
  result = this.spec.result();
3432
3427
  classes = ["state-" + state];
3433
3428
  if (elapsed > Teaspoon.slow) {
@@ -3462,9 +3457,8 @@ jasmine.version_= {
3462
3457
 
3463
3458
  FailureView.prototype.build = function() {
3464
3459
  var error, html, _i, _len, _ref;
3465
-
3466
3460
  FailureView.__super__.build.call(this, "spec");
3467
- html = "<h1 class=\"teaspoon-clearfix\"><a href=\"" + this.spec.link + "\">" + this.spec.fullDescription + "</a></h1>";
3461
+ html = "<h1 class=\"teaspoon-clearfix\"><a href=\"" + this.spec.link + "\">" + (this.htmlSafe(this.spec.fullDescription)) + "</a></h1>";
3468
3462
  _ref = this.spec.errors();
3469
3463
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
3470
3464
  error = _ref[_i];
@@ -3501,14 +3495,13 @@ jasmine.version_= {
3501
3495
 
3502
3496
  SuiteView.prototype.build = function() {
3503
3497
  SuiteView.__super__.build.call(this, "suite");
3504
- this.el.innerHTML = "<h1><a href=\"" + this.suite.link + "\">" + this.suite.description + "</a></h1>";
3498
+ this.el.innerHTML = "<h1><a href=\"" + this.suite.link + "\">" + (this.htmlSafe(this.suite.description)) + "</a></h1>";
3505
3499
  this.parentView = this.buildParent();
3506
3500
  return this.parentView.append(this.el);
3507
3501
  };
3508
3502
 
3509
3503
  SuiteView.prototype.buildParent = function() {
3510
3504
  var parent, view;
3511
-
3512
3505
  parent = this.suite.parent;
3513
3506
  if (!parent) {
3514
3507
  return this.reporter;
@@ -3530,7 +3523,6 @@ jasmine.version_= {
3530
3523
 
3531
3524
  SuiteView.prototype.updateState = function(state) {
3532
3525
  var _base;
3533
-
3534
3526
  if (this.state === "failed") {
3535
3527
  return;
3536
3528
  }