teaspoon 0.7.8 → 0.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +14 -5
- data/app/assets/javascripts/teaspoon-angular.js +19 -27
- data/app/assets/javascripts/teaspoon-jasmine.js +19 -27
- data/app/assets/javascripts/teaspoon-mocha.js +19 -28
- data/app/assets/javascripts/teaspoon-qunit.js +41 -15
- data/app/assets/javascripts/teaspoon/base/reporters/html/failure_view.coffee +1 -1
- data/app/assets/javascripts/teaspoon/base/reporters/html/spec_view.coffee +1 -1
- data/app/assets/javascripts/teaspoon/base/reporters/html/suite_view.coffee +1 -1
- data/app/assets/javascripts/teaspoon/base/teaspoon.coffee +12 -7
- data/app/assets/javascripts/teaspoon/qunit/reporters/html.coffee +1 -1
- data/app/assets/stylesheets/teaspoon.css +1 -1
- data/app/helpers/teaspoon/spec_helper.rb +2 -1
- data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +4 -0
- data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +4 -0
- data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +6 -2
- data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +4 -0
- data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +4 -0
- data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +4 -0
- data/lib/teaspoon/configuration.rb +4 -3
- data/lib/teaspoon/coverage.rb +3 -2
- data/lib/teaspoon/drivers/phantomjs/runner.js +108 -0
- data/lib/teaspoon/drivers/phantomjs_driver.rb +25 -7
- data/lib/teaspoon/engine.rb +5 -0
- data/lib/teaspoon/environment.rb +2 -4
- data/lib/teaspoon/formatters/base_formatter.rb +9 -6
- data/lib/teaspoon/formatters/dot_formatter.rb +3 -2
- data/lib/teaspoon/formatters/pride_formatter.rb +48 -0
- data/lib/teaspoon/formatters/snowday_formatter.rb +20 -0
- data/lib/teaspoon/server.rb +9 -3
- data/lib/teaspoon/suite.rb +3 -3
- data/lib/teaspoon/version.rb +1 -1
- data/spec/dummy/config/initializers/teaspoon.rb +1 -1
- data/spec/javascripts/teaspoon/base/teaspoon_spec.coffee +4 -4
- data/spec/javascripts/teaspoon/other/erb_spec.js.coffee.erb +4 -0
- data/spec/javascripts/teaspoon/phantomjs/runner_spec.coffee +1 -1
- data/spec/teaspoon/configuration_spec.rb +2 -1
- data/spec/teaspoon/coverage_spec.rb +1 -1
- data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +28 -14
- data/spec/teaspoon/environment_spec.rb +2 -3
- data/spec/teaspoon/formatters/base_formatter_spec.rb +3 -2
- data/spec/teaspoon/formatters/pride_formatter_spec.rb +0 -0
- data/spec/teaspoon/suite_spec.rb +5 -0
- data/vendor/assets/javascripts/support/bind-poly.js +23 -0
- metadata +10 -17
- data/lib/teaspoon/drivers/phantomjs/runner.coffee +0 -68
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 8cef218e8022c1570a522f1d4a1d7f7f8e2a367f
         | 
| 4 | 
            +
              data.tar.gz: ca33470c138fad431468907cb7e8c0961cd6d739
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 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. | 
| 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 ( | 
| 26221 | 
            -
                     | 
| 26220 | 
            +
                  if (Teaspoon.defer) {
         | 
| 26221 | 
            +
                    Teaspoon.defer = false;
         | 
| 26222 26222 | 
             
                    return;
         | 
| 26223 26223 | 
             
                  }
         | 
| 26224 | 
            -
                   | 
| 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 =  | 
| 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 | 
            -
                   | 
| 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 =  | 
| 26279 | 
            -
                   | 
| 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); | 
| 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 ( | 
| 2627 | 
            -
                     | 
| 2626 | 
            +
                  if (Teaspoon.defer) {
         | 
| 2627 | 
            +
                    Teaspoon.defer = false;
         | 
| 2628 2628 | 
             
                    return;
         | 
| 2629 2629 | 
             
                  }
         | 
| 2630 | 
            -
                   | 
| 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 =  | 
| 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 | 
            -
                   | 
| 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 =  | 
| 2685 | 
            -
                   | 
| 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); | 
| 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 | 
             
                  }
         |