Skip to content

Commit

Permalink
Add --coverage-report related options.
Browse files Browse the repository at this point in the history
- Defaults to summary, but can be set to any Istanbul report option,
  such as lcov, html, json, etc.
- `--coverage-dir` is where coverage reporter are written. Defaults to
  ./coverage.
  • Loading branch information
reid committed Feb 12, 2014
1 parent 0fbf9f4 commit b57fd2c
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 10 deletions.
1 change: 0 additions & 1 deletion .gitignore
Expand Up @@ -3,7 +3,6 @@
/doc/contribute/index.mustache
/doc/yeti/project.json
/api/
coverage.*
node_modules
.hosts.json
fabfile.pyc
Expand Down
26 changes: 17 additions & 9 deletions lib/cli/index.js
Expand Up @@ -18,7 +18,7 @@ var color = require("./color").codes;

var FeedbackLineReporter = require("./reporter/feedback-line");
var JUnitReporter = require("./reporter/junit");
var CoverageSummaryReporter = require("./reporter/coverage-summary");
var CoverageReporter = require("./reporter/coverage");

var EventEmitter2 = require("../event-emitter");
var EventYoshi = require("eventyoshi");
Expand Down Expand Up @@ -49,6 +49,8 @@ var parseArgv = exports.parseArgv = function (argv) {
"server": Boolean,
"version": Boolean,
"coverage": Boolean,
"coverage-report": String,
"coverage-dir": String,
"instrument": Boolean,
"loglevel": ["info", "debug"],
"query": String,
Expand Down Expand Up @@ -286,7 +288,11 @@ function createStderrCoverageReporter(cli, batch, options) {
stderr: cli.stderr
});

return createReporterForBatch(CoverageSummaryReporter, batch, console, options);
return CoverageReporter.create({
cli: console,
options: options,
batch: batch
});
}

/**
Expand Down Expand Up @@ -512,7 +518,8 @@ CLI.prototype.startServer = function startServer(options) {
};

CLI.prototype.route = function (argv) {
var parsedArgs = parseArgv(argv),
var defaults = {},
parsedArgs = parseArgv(argv),
config = new Configuration(),
usage = "usage: " + argv[1] +
" [--version | -v] [--junit] [--server | -s] [--port=<n>]" +
Expand All @@ -535,12 +542,13 @@ CLI.prototype.route = function (argv) {
delete parsedArgs.hub;
}

config.import({
// Defaults.
port: 9000,
host: "127.0.0.1",
basedir: process.cwd()
}).setFilename(".yeti.json").home().find().env("YETI_").import(parsedArgs);
defaults.port = 9000;
defaults.host = "127.0.0.1";
defaults.basedir = process.cwd();
defaults["coverage-report"] = "summary";
defaults["coverage-dir"] = "./coverage";

config.import(defaults).setFilename(".yeti.json").home().find().env("YETI_").import(parsedArgs);

if (parsedArgs.argv.remain.length) {
config.set("files", parsedArgs.argv.remain);
Expand Down
78 changes: 78 additions & 0 deletions lib/cli/reporter/coverage.js
@@ -0,0 +1,78 @@
"use strict";

/**
* @module reporter-coverage
*/

var util = require("util");
var istanbul;

var Reporter = require("./reporter");
var CoverageSummaryReporter = require("./coverage-summary");

/**
* @class CoverageReporter
* @constructor
* @extends Reporter
*/
function CoverageReporter(options) {
Reporter.call(this, options);

try {
istanbul = require("istanbul");
} catch (ex) {
throw new Error("Unable to report coverage unless Istanbul is installed");
}

this.collector = new istanbul.Collector();

this.istanbulReporter = istanbul.Report.create(
this.options.get("coverage-report"),
{
dir: this.options.get("coverage-dir")
}
);

this.complete = false;
}

CoverageReporter.create = function (config) {
var reporter = CoverageReporter;

if (config.options.get("coverage-report") === "summary") {
reporter = CoverageSummaryReporter;
}

return new reporter(config);
};

util.inherits(CoverageReporter, Reporter);

CoverageReporter.prototype.bindEvents = function () {
this.batch.on("agentResult", this.handleAgentResult.bind(this));
this.batch.once("complete", this.handleComplete.bind(this));
this.batch.once("end", this.handleEnd.bind(this));
};

CoverageReporter.prototype.handleAgentResult = function (agent, details) {
if (details.coverage) {
this.collector.add(details.coverage);
}
};

CoverageReporter.prototype.handleComplete = function () {
this.istanbulReporter.writeReport(this.collector, /* sync */ true);
this.cli.error(util.format(
"Wrote %s coverage report to %s",
this.options.get("coverage-report"),
this.options.get("coverage-dir")
));
this.complete = true;
};

CoverageReporter.prototype.handleEnd = function () {
if (!this.complete) { this.handleComplete(); }
this.emit("end");
};

module.exports = CoverageReporter;

0 comments on commit b57fd2c

Please sign in to comment.