grunt-contrib-jasmine/tasks/lib/jasmine.js
2013-06-15 10:36:54 -07:00

121 lines
3.5 KiB
JavaScript

'use strict';
exports.init = function(grunt, phantomjs) {
// node api
var fs = require('fs'),
path = require('path');
// npm
var rimraf = require('rimraf');
var baseDir = '.',
tempDir = '.grunt/grunt-contrib-jasmine';
var exports = {};
exports.writeTempFile = function(dest, contents) {
var file = path.join(tempDir,dest);
grunt.file.write(file, contents);
};
exports.copyTempFile = function(src, dest) {
var file = path.join(tempDir,dest);
grunt.file.copy(src, file);
};
exports.cleanTemp = function() {
rimraf.sync(tempDir);
};
exports.buildSpecrunner = function (src, options){
exports.copyTempFile(__dirname + '/../jasmine/reporters/PhantomReporter.js', 'reporter.js');
exports.copyTempFile(__dirname + '/../../vendor/jasmine-' + options.version + '/jasmine.css', 'jasmine.css');
exports.copyTempFile(__dirname + '/../../vendor/jasmine-' + options.version + '/jasmine.js', 'jasmine.js');
exports.copyTempFile(__dirname + '/../../vendor/jasmine-' + options.version + '/jasmine-html.js', 'jasmine-html.js');
exports.copyTempFile(__dirname + '/../jasmine/jasmine-helper.js', 'jasmine-helper.js');
exports.copyTempFile(__dirname + '/../helpers/phantom-polyfill.js', 'phantom-polyfill.js');
var reporters = [
tempDir + '/reporter.js'
];
var jasmineCss = [
tempDir + '/jasmine.css'
];
var source = '',
outfile = options.outfile,
specrunner = path.join(baseDir,outfile),
outdir = path.dirname(outfile);
jasmineCss = jasmineCss.concat(options.styles);
var polyfills = [
tempDir + '/phantom-polyfill.js'
];
var jasmineCore = [
tempDir + '/jasmine.js',
tempDir + '/jasmine-html.js'
];
var jasmineHelper = tempDir + '/jasmine-helper.js';
var context = {
temp : tempDir,
css : exports.getRelativeFileList(outdir, jasmineCss),
scripts : {
polyfills : exports.getRelativeFileList(outdir, polyfills),
jasmine : exports.getRelativeFileList(outdir, jasmineCore),
helpers : exports.getRelativeFileList(outdir, options.helpers),
specs : exports.getRelativeFileList(outdir, options.specs),
src : exports.getRelativeFileList(outdir, src),
vendor : exports.getRelativeFileList(outdir, options.vendor),
reporters : exports.getRelativeFileList(outdir, reporters),
start : exports.getRelativeFileList(outdir, jasmineHelper)
},
options : options.templateOptions || {}
};
if (options.template.process) {
var task = {
writeTempFile : exports.writeTempFile,
copyTempFile : exports.copyTempFile,
phantomjs : phantomjs
};
source = options.template.process(grunt, task, context);
grunt.file.write(specrunner, source);
} else {
grunt.file.copy(options.template, specrunner, {
process : function(src) {
source = grunt.util._.template(src, context);
return source;
}
});
}
return source;
};
exports.getRelativeFileList = function (/* args... */) {
var list = Array.prototype.slice.call(arguments),
outdir = list.shift();
var base = path.resolve(baseDir);
var files = [];
list.forEach(function(listItem){
if (listItem) files = files.concat(grunt.file.expand({nonull: true},listItem));
});
files = grunt.util._(files).map(function(file){
return (/^https?:/).test(file) ? file : path.relative(outdir, file).replace(/\\/g, '/');
});
return files;
};
return exports;
};