UNPKG

spectacular

Version:

Advanced BDD framework for CoffeeScript and JavaScript

274 lines (249 loc) 7.21 kB
// 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); }); };