Skip to content

Commit

Permalink
Implement BashReporter
Browse files Browse the repository at this point in the history
  • Loading branch information
felixge committed Nov 14, 2011
1 parent 09e1938 commit 17bcea2
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 16 deletions.
16 changes: 10 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
var FileFilter = require('./lib/FileFilter');
var FileFinder = require('./lib/FileFinder');
var FileRunner = require('./lib/FileRunner');
var FileFilter = require('./lib/FileFilter');
var FileFinder = require('./lib/FileFinder');
var Runner = require('./lib/Runner');
var BashReporter = require('./lib/reporter/BashReporter');

module.exports = function(dir, include) {
var finder = new FileFinder(dir);
var finder = new FileFinder(dir);
var filter = new FileFilter({include: include});

finder.execute(function(err, files) {
if (err) throw err;

var filter = new FileFilter({include: include});
files = filter.filter(files);

console.error(files);
var runner = new Runner({files: files});
var reporter = new BashReporter({runner: runner});
runner.execute();
});
};
3 changes: 2 additions & 1 deletion lib/Runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ var util = require('util');
module.exports = Runner;
util.inherits(Runner, EventEmitter);
function Runner(options) {
this._files = options.files;
this._files = [].concat(options.files);
this._cwd = options.cwd || process.cwd();
}

Runner.prototype.execute = function() {
this.emit('start', [].concat(this._files));
this._nextFile();
};

Expand Down
95 changes: 95 additions & 0 deletions lib/reporter/BashReporter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
var str = require('../str');

module.exports = BashReporter;
function BashReporter(options) {
this._runner = options.runner;
this._currentFile = null;
this._lastLine = null;
this._start = null;
this._fail = 0;
this._pass = 0;
this._total = 0;
this._interval = null;

this._runner.on('start', this._handleStart.bind(this));
this._runner.on('fileStart', this._handleFileStart.bind(this));
this._runner.on('fileEnd', this._handleFileEnd.bind(this));
this._runner.on('end', this._handleEnd.bind(this));
}

BashReporter.prototype._handleStart = function(files) {
this._start = Date.now();
this._total = files.length;
this._interval = setInterval(this.updateProgress.bind(this), 1000);
};

BashReporter.prototype._handleFileStart = function(file) {
this._currentFile = file;
this.updateProgress();
};

BashReporter.prototype._handleFileEnd = function(file, err, output) {
if (err) {
this._fail++;

if (output.substr(0, 1) !== '\n') output = '\n' + output;
output = output.replace(/^/mg, ' ');

process.stdout.write('\n' + output + '\n');
} else {
this._pass++;
}

this.updateProgress();
};

BashReporter.prototype._handleEnd = function() {
process.stdout.write('\n');
clearInterval(this._interval);
};

BashReporter.prototype.updateProgress = function() {
var template = '\r[%s %s/%s/%s %s node %s]';

var line = str.sprintf(
template,
this.elapsedTime(),
this._fail,
this._pass,
this._total,
this.progress(),
this._currentFile
);

this.clearLine();
process.stdout.write(line);
this._lastLine = line;
};

BashReporter.prototype.clearLine = function() {
if (!this._lastLine) return;

var spaces = str.repeat(' ', this._lastLine.length);
process.stdout.write('\r' + spaces + '\r');
};

BashReporter.prototype.elapsedTime = function(showMs) {
var duration = new Date - this._start;

var seconds = Math.floor((duration) / 1000);
var minutes = Math.floor(seconds / 60);
var hours = Math.floor(minutes / 60);

seconds -= (minutes * 60) - (hours * 60 * 60);
minutes -= hours * 60;

if (minutes < 10) minutes = '0' + minutes;
if (seconds < 10) seconds = '0' + seconds;

return hours + ':' + minutes + ':' + seconds;
};

BashReporter.prototype.progress = function() {
var index = this._fail + this._pass;
return ((index) * 100 / this._total).toFixed(1) + '%';
};
30 changes: 30 additions & 0 deletions lib/str.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
var str = module.exports;
var util = require('util');

// custom / simplified flavor of sprintf
str.sprintf = function() {
var args = Array.prototype.slice.call(arguments);
var str = args.shift();

return str.replace(/%[so]/g, function(m, i, s) {
var arg = args.shift();
if (m == '%o') {
return util.inspect(arg);
}

if (!arg && arg !== 0) {
return '';
}

return arg.toString();
});
};

str.repeat = function(string, times) {
var repeated = '';
for (var i = 0; i < times; i++) {
repeated += string;
}

return repeated;
};
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"engines": {
"node": "*"
},
"dependencies": {},
"devDependencies": {
"utest": "0.0.1"
"utest": "0.0.1",
"sinon": "1.2.0",
}
}
27 changes: 20 additions & 7 deletions test/integration/Runner/test-runs-files.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ var runner = new Runner({files: files, cwd: fixture});

var events = [];
runner
.on('start', function(_files) {
events.push(['start', _files]);
})
.on('fileStart', function(relativePath) {
events.push(['fileStart', relativePath]);
})
Expand All @@ -20,13 +23,23 @@ runner
.execute();

process.on('exit', function() {
assert.deepEqual(events[0], ['fileStart', '2.js']);
assert.deepEqual(events[1].slice(0, 2), ['fileEnd', '2.js']);
assert.ok(events[1].slice(2, 3)[0] instanceof Error);
assert.equal(events[1].slice(3, 4)[0], 'I am stderr\nI am stdout\n');
var event = events.shift();
assert.deepEqual(event, ['start', files]);

event = events.shift();
assert.deepEqual(event, ['fileStart', '2.js']);

event = events.shift();
assert.deepEqual(event.slice(0, 2), ['fileEnd', '2.js']);
assert.ok(event.slice(2, 3)[0] instanceof Error);
assert.equal(event.slice(3, 4)[0], 'I am stderr\nI am stdout\n');

event = events.shift();
assert.deepEqual(event, ['fileStart', 'a/a2.js']);

assert.deepEqual(events[2], ['fileStart', 'a/a2.js']);
assert.deepEqual(events[3], ['fileEnd', 'a/a2.js', null, '']);
event = events.shift();
assert.deepEqual(event, ['fileEnd', 'a/a2.js', null, '']);

assert.deepEqual(events[4], ['end']);
event = events.shift();
assert.deepEqual(event, ['end']);
});

0 comments on commit 17bcea2

Please sign in to comment.