123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- var path = require('path'),
- fs = require('fs');
- exports = module.exports = Command;
- var subCommands = {
- init: {
- description: 'initialize jasmine',
- action: initJasmine
- },
- examples: {
- description: 'install examples',
- action: installExamples
- },
- help: {
- description: 'show help',
- action: help,
- alias: '-h'
- },
- version: {
- description: 'show jasmine and jasmine-core versions',
- action: version,
- alias: '-v'
- }
- };
- function Command(projectBaseDir, examplesDir, print) {
- this.projectBaseDir = projectBaseDir;
- this.specDir = path.join(projectBaseDir, 'spec');
- var command = this;
- this.run = function(jasmine, commands) {
- setEnvironmentVariables(commands);
- var commandToRun;
- Object.keys(subCommands).forEach(function(cmd) {
- var commandObject = subCommands[cmd];
- if (commands.indexOf(cmd) >= 0) {
- commandToRun = commandObject;
- } else if(commandObject.alias && commands.indexOf(commandObject.alias) >= 0) {
- commandToRun = commandObject;
- }
- });
- if (commandToRun) {
- commandToRun.action({jasmine: jasmine, projectBaseDir: command.projectBaseDir, specDir: command.specDir, examplesDir: examplesDir, print: print});
- } else {
- var env = parseOptions(commands);
- if (env.unknownOptions.length > 0) {
- print('Unknown options: ' + env.unknownOptions.join(', '));
- print('');
- help({print: print});
- } else {
- runJasmine(jasmine, env);
- }
- }
- };
- }
- function isFileArg(arg) {
- return arg.indexOf('--') !== 0 && !isEnvironmentVariable(arg);
- }
- function parseOptions(argv) {
- var files = [],
- helpers = [],
- unknownOptions = [],
- color = process.stdout.isTTY || false,
- configPath,
- filter,
- stopOnFailure,
- random,
- seed;
- argv.forEach(function(arg) {
- if (arg === '--no-color') {
- color = false;
- } else if (arg.match("^--filter=")) {
- filter = arg.match("^--filter=(.*)")[1];
- } else if (arg.match("^--helper=")) {
- helpers.push(arg.match("^--helper=(.*)")[1]);
- } else if (arg.match("^--stop-on-failure=")) {
- stopOnFailure = arg.match("^--stop-on-failure=(.*)")[1] === 'true';
- } else if (arg.match("^--random=")) {
- random = arg.match("^--random=(.*)")[1] === 'true';
- } else if (arg.match("^--seed=")) {
- seed = arg.match("^--seed=(.*)")[1];
- } else if (arg.match("^--config=")) {
- configPath = arg.match("^--config=(.*)")[1];
- } else if (isFileArg(arg)) {
- files.push(arg);
- } else if (!isEnvironmentVariable(arg)) {
- unknownOptions.push(arg);
- }
- });
- return {
- color: color,
- configPath: configPath,
- filter: filter,
- stopOnFailure: stopOnFailure,
- helpers: helpers,
- files: files,
- random: random,
- seed: seed,
- unknownOptions: unknownOptions
- };
- }
- function runJasmine(jasmine, env) {
- jasmine.loadConfigFile(env.configPath || process.env.JASMINE_CONFIG_PATH);
- if (env.stopOnFailure !== undefined) {
- jasmine.stopSpecOnExpectationFailure(env.stopOnFailure);
- }
- if (env.seed !== undefined) {
- jasmine.seed(env.seed);
- }
- if (env.random !== undefined) {
- jasmine.randomizeTests(env.random);
- }
- if (env.helpers !== undefined && env.helpers.length) {
- jasmine.addHelperFiles(env.helpers);
- }
- jasmine.showColors(env.color);
- jasmine.execute(env.files, env.filter);
- }
- function initJasmine(options) {
- var print = options.print;
- var specDir = options.specDir;
- makeDirStructure(path.join(specDir, 'support/'));
- if(!fs.existsSync(path.join(specDir, 'support/jasmine.json'))) {
- fs.writeFileSync(path.join(specDir, 'support/jasmine.json'), fs.readFileSync(path.join(__dirname, '../lib/examples/jasmine.json'), 'utf-8'));
- }
- else {
- print('spec/support/jasmine.json already exists in your project.');
- }
- }
- function installExamples(options) {
- var specDir = options.specDir;
- var projectBaseDir = options.projectBaseDir;
- var examplesDir = options.examplesDir;
- makeDirStructure(path.join(specDir, 'support'));
- makeDirStructure(path.join(specDir, 'jasmine_examples'));
- makeDirStructure(path.join(specDir, 'helpers', 'jasmine_examples'));
- makeDirStructure(path.join(projectBaseDir, 'lib', 'jasmine_examples'));
- copyFiles(
- path.join(examplesDir, 'spec', 'helpers', 'jasmine_examples'),
- path.join(specDir, 'helpers', 'jasmine_examples'),
- new RegExp(/[Hh]elper\.js/)
- );
- copyFiles(
- path.join(examplesDir, 'lib', 'jasmine_examples'),
- path.join(projectBaseDir, 'lib', 'jasmine_examples'),
- new RegExp(/\.js/)
- );
- copyFiles(
- path.join(examplesDir, 'spec', 'jasmine_examples'),
- path.join(specDir, 'jasmine_examples'),
- new RegExp(/[Ss]pec.js/)
- );
- }
- function help(options) {
- var print = options.print;
- print('Usage: jasmine [command] [options] [files]');
- print('');
- print('Commands:');
- Object.keys(subCommands).forEach(function(cmd) {
- var commandNameText = cmd;
- if(subCommands[cmd].alias) {
- commandNameText = commandNameText + ',' + subCommands[cmd].alias;
- }
- print('%s\t%s', lPad(commandNameText, 10), subCommands[cmd].description);
- });
- print('');
- print('If no command is given, jasmine specs will be run');
- print('');
- print('');
- print('Options:');
- print('%s\tturn off color in spec output', lPad('--no-color', 18));
- print('%s\tfilter specs to run only those that match the given string', lPad('--filter=', 18));
- print('%s\tload helper files that match the given string', lPad('--helper=', 18));
- print('%s\t[true|false] stop spec execution on expectation failure', lPad('--stop-on-failure=', 18));
- print('%s\tpath to your optional jasmine.json', lPad('--config=', 18));
- print('');
- print('The given arguments take precedence over options in your jasmine.json');
- print('The path to your optional jasmine.json can also be configured by setting the JASMINE_CONFIG_PATH environment variable');
- }
- function version(options) {
- var print = options.print;
- print('jasmine v' + require('../package.json').version);
- print('jasmine-core v' + options.jasmine.coreVersion());
- }
- function lPad(str, length) {
- if (str.length >= length) {
- return str;
- } else {
- return lPad(' ' + str, length);
- }
- }
- function copyFiles(srcDir, destDir, pattern) {
- var srcDirFiles = fs.readdirSync(srcDir);
- srcDirFiles.forEach(function(file) {
- if (file.search(pattern) !== -1) {
- fs.writeFileSync(path.join(destDir, file), fs.readFileSync(path.join(srcDir, file)));
- }
- });
- }
- function makeDirStructure(absolutePath) {
- var splitPath = absolutePath.split(path.sep);
- splitPath.forEach(function(dir, index) {
- if(index > 1) {
- var fullPath = path.join(splitPath.slice(0, index).join('/'), dir);
- if (!fs.existsSync(fullPath)) {
- fs.mkdirSync(fullPath);
- }
- }
- });
- }
- function isEnvironmentVariable(command) {
- var envRegExp = /(.*)=(.*)/;
- return command.match(envRegExp);
- }
- function setEnvironmentVariables(commands) {
- commands.forEach(function (command) {
- var regExpMatch = isEnvironmentVariable(command);
- if(regExpMatch) {
- var key = regExpMatch[1];
- var value = regExpMatch[2];
- process.env[key] = value;
- }
- });
- }
|