spectacular
Version:
Advanced BDD framework for CoffeeScript and JavaScript
274 lines (249 loc) • 7.21 kB
JavaScript
// Generated by CoffeeScript 1.6.3
var CliMethods, Q, colorize, exists, existsSync, fs, getReporter, glob, globPath, globPaths, handleEmitter, jsdom, loadDOM, loadRequire, loadSpecs, loadSpectacular, m, path, requireFile, sourceMap, util, vm, walk;
m = require('module');
fs = require('fs');
glob = require('glob');
path = require('path');
vm = require('vm');
Q = require('q');
walk = require('walkdir');
util = require('util');
jsdom = require('jsdom');
sourceMap = require('source-map');
colorize = function(str, color, options) {
if ((str != null) && options.colors && str[color]) {
return str[color];
} else {
return str;
}
};
requireFile = function(file, context) {
var err;
try {
return require(file);
} catch (_error) {
err = _error;
return console.log(file, err);
}
};
exists = fs.exists || path.exists;
existsSync = fs.existsSync || path.existsSync;
loadSpectacular = function(options) {
return Q.fcall(function() {
var filename, src;
filename = path.resolve(__dirname, "spectacular.js");
src = fs.readFileSync(filename).toString();
if (options.verbose) {
console.log(" " + (colorize('load spectacular', 'grey', options)) + " " + filename);
}
vm.runInThisContext(src, filename);
spectacular.env = new spectacular.Environment(options);
return spectacular.env.globalize();
});
};
handleEmitter = function(emitter, defer) {
emitter.on('end', function() {
return defer.resolve();
});
emitter.on('error', function(err) {
return defer.reject(err);
});
return emitter.on('fail', function(err) {
return defer.reject(err);
});
};
loadRequire = function(path, options) {
var defer;
defer = Q.defer();
exists(path, function(exists) {
var emitter;
if (exists) {
emitter = walk(path);
emitter.on('file', function(path, stat) {
if (/(js|coffee)$/.test(path)) {
if (options.verbose) {
console.log(" " + (colorize('require', 'grey', options)) + " " + path);
}
return requireFile(path);
}
});
return handleEmitter(emitter, defer);
} else {
return defer.resolve();
}
});
return defer.promise;
};
globPath = function(path) {
var defer;
defer = Q.defer();
glob(path, function(err, res) {
if (err) {
return defer.reject(err);
}
return defer.resolve(res);
});
return defer.promise;
};
globPaths = function(globs) {
return function() {
var p,
_this = this;
return Q.all((function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = globs.length; _i < _len; _i++) {
p = globs[_i];
_results.push(globPath(p));
}
return _results;
})()).then(function(results) {
var paths;
paths = [];
results.forEach(function(a) {
return paths = paths.concat(a);
});
return paths;
});
};
};
loadSpecs = function(options) {
return function(paths) {
var p, _i, _len;
for (_i = 0, _len = paths.length; _i < _len; _i++) {
p = paths[_i];
if (options.verbose) {
console.log(" " + (colorize('load spec', 'grey', options)) + " " + p);
}
require(path.resolve('.', p));
}
return paths;
};
};
getReporter = function(options) {
var reporter;
reporter = spectacular.ConsoleReporter.getDefault(options);
reporter.on('message', function(event) {
return util.print(event.target);
});
reporter.on('report', function(event) {
return util.print(event.target);
});
return reporter;
};
loadDOM = function() {
var defer;
defer = Q.defer();
jsdom.env({
html: '<html><head></head><body></body></html>',
features: {
QuerySelector: true
},
done: function(err, window) {
if (err != null) {
return defer.reject(err);
}
return defer.resolve(window);
}
});
return defer.promise;
};
CliMethods = function(options) {
var fileCache;
fileCache = {};
options.valueOutput = function(value) {
return colorize("" + value, 'bold', spectacular.env.options);
};
options.isCoffeeScriptFile = function(file) {
return /\.coffee$/.test(file);
};
options.hasSourceMap = function(file) {
return this.isCoffeeScriptFile(file);
};
options.loadFile = function(file) {
return Q.fcall(function() {
var compile, compileOptions, fileContent, fileSource;
if (!existsSync(file)) {
throw new Error("File doesn't exist: '" + file + "'");
}
if (file in fileCache) {
return fileCache[file];
}
fileSource = fs.readFileSync(file).toString();
if (options.coffee && options.isCoffeeScriptFile(file)) {
compile = require('coffee-script').compile;
compileOptions = {
bare: true
};
compileOptions.sourceMap = options.sourceMap;
fileContent = compile(fileSource, compileOptions);
if (options.sourceMap) {
fileContent.source = fileSource;
}
}
return fileCache[file] = fileContent || fileSource;
});
};
return options.getOriginalSourceFor = function(file, line, column) {
var defer;
defer = Q.defer();
this.loadFile(file).then(function(compiled) {
var consumer, _ref;
consumer = new sourceMap.SourceMapConsumer(compiled.v3SourceMap);
_ref = consumer.originalPositionFor({
line: line,
column: column
}), line = _ref.line, column = _ref.column;
return defer.resolve({
content: compiled.source,
line: line,
column: column
});
}).fail(function(reason) {
return defer.reject(reason);
});
return defer.promise;
};
};
exports.run = function(options) {
var loadEndedAt, loadStartedAt;
loadStartedAt = null;
loadEndedAt = null;
if (options.verbose) {
console.log(colorize(' options', 'grey', options), options);
}
options.fixturesRoot = path.resolve(options.fixturesRoot);
return loadSpectacular(options).then(loadDOM).then(function(window) {
var p, reporter;
CliMethods(options);
spectacular.global.window = window;
spectacular.global.document = window.document;
reporter = getReporter(options);
spectacular.env.runner.on('message', reporter.onMessage);
spectacular.env.runner.on('result', reporter.onResult);
spectacular.env.runner.on('end', reporter.onEnd);
return Q.all((function() {
var _i, _len, _ref, _results;
_ref = options.requires;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
p = _ref[_i];
_results.push(loadRequire(p, options));
}
return _results;
})());
}).then(function() {
return loadStartedAt = new Date();
}).then(globPaths(options.globs)).then(loadSpecs(options)).then(function(paths) {
loadEndedAt = new Date();
options.paths = paths;
spectacular.env.runner.loadStartedAt = loadStartedAt;
spectacular.env.runner.loadEndedAt = loadEndedAt;
return spectacular.env.run();
}).then(function(status) {
spectacular.env.unglobalize();
return status;
}).fail(function(reason) {
return handleError(reason);
});
};