yahoo/kobold

View on GitHub
lib/cli.js

Summary

Maintainability
B
6 hrs
Test Coverage
var path = require('path');
var fs = require('fs');

/**
 * Filters arguments given and sets them to parameters
 *
 * @method filterArguments
 * @param {string[]} args
 * @param {object} params
 * @param {string[]} [inject]
 * @return {string[]}
 * @private
 */
function filterArguments(args, params, inject) {

    var newArgs = ['node', '_mocha'].concat(inject || []),
        param, i, len,
        type;

    for (i = 2, len = args.length; i < len; i++) {

        if ((i < args.length - 1) && (args[i].length > 2) && (args[i].substr(0, 2) === '--')) {

            // Get parameter without '--'
            param = args[i].substr(2);

            // Is parameter used?
            if (params.hasOwnProperty(param)) {

                // Remember what the type was
                type = typeof params[param];

                // Overwrite value with next value in arguments
                if (type === 'boolean') {
                    params[param] = true;

                } else {
                    params[param] = args[i + 1];
                    i++;

                    // Convert back to boolean if needed
                    if (type === 'number') {
                        params[param] = parseFloat(params[param]);
                    }
                }

            } else {
                newArgs.push(args[i]);
            }
        } else {
            newArgs.push(args[i]);
        }
    }

    // Set test-path with last argument if none given
    if (!params['test-path']) {
        params['test-path'] = args.pop();
    }

    newArgs.push(path.join(__dirname, '..', 'resource', 'run.js'));

    return newArgs;
}

/**
 * Prepares the environment for kobold
 *
 * @method prepareEnvironment
 * @param {string[]} argv
 * @return {string[]}
 * @private
 */
function prepareEnvironment (argv) {

    var params, args;

    // Define default values
    params = {
        'approved-folder': 'approved',
        'build-folder': 'build',
        'highlight-folder': 'highlight',
        'config-folder': 'config',
        'fail-orphans': false,
        'fail-additions': false,
        'test-path': null,
        'config': null
    };

    // Filter arguments
    args = filterArguments(argv, params, [
        '--slow', '5000',
        '--no-timeouts'
    ]);

    if (!fs.existsSync(params['test-path'])) {
        throw new Error('Cannot find path to ' + params['test-path']);
    } else {
        params['test-path'] = path.resolve(params['test-path']);
    }

    // Load global config
    if (typeof params['config'] === 'string') {
        params['config'] = require(path.resolve(params['config']));
    } else {
        params['config'] = params['config'] || {};
    }

    // Set global variable for test-runner
    global.koboldOptions = {
        "verbose": false,

        "failForOrphans": params['fail-orphans'],
        "failOnAdditions": params['fail-additions'],

        "build": params['build'],

        "comparison": params['config'],

        "storage": {
            "type": 'File',

            "options": {
                "path": params['test-path'],
                "approvedFolderName": params['approved-folder'],
                "buildFolderName": params['build-folder'],
                "highlightFolderName": params['highlight-folder'],
                "configFolderName": params['config-folder']
            }
        }
    };

    return args;
}

module.exports = {
    filterArguments: filterArguments,
    prepareEnvironment: prepareEnvironment
};