UNPKG

cucumber

Version:

The official JavaScript implementation of Cucumber.

237 lines (207 loc) 11.8 kB
function ArgumentParser(argv) { var Cucumber = require('../../cucumber'); var nopt = require('nopt'); var path = require('path'); var _ = require('underscore'); var options; var self = { parse: function parse() { var args = argv.slice(ArgumentParser.NUMBER_OF_LEADING_ARGS_TO_SLICE); var expandedArgs = self.getExpandedArgs(args); var options = self.argsToOptions(expandedArgs); self.storeOptions(options); }, argsToOptions: function argsToOptions(args) { var knownOptionDefinitions = self.getKnownOptionDefinitions(); var shortenedOptionDefinitions = self.getShortenedOptionDefinitions(); var options = nopt(knownOptionDefinitions, shortenedOptionDefinitions, args, 0); return options; }, getExpandedArgs: function getExpandedArgv(args) { var options = self.argsToOptions(args); var profiles = options[ArgumentParser.PROFILE_OPTION_NAME]; var profileDefinitions = ArgumentParser.ProfileDefinitionLoader.getDefinitions(); if (typeof(profiles) === 'undefined') { if (profileDefinitions['default']) { profiles = ['default']; } else { return args; } } var profilesArgs = profiles.map(function (profile){ if (!profileDefinitions[profile]){ throw new Error('Undefined profile: ' + profile); } return profileDefinitions[profile].split(/\s/); }); return _.flatten(profilesArgs).concat(args); }, getFeatureFilePaths: function getFeatureFilePaths() { var unexpandedFeaturePaths = self.getUnexpandedFeaturePaths(); var expandedFeaturePaths = ArgumentParser.FeaturePathExpander.expandPaths(unexpandedFeaturePaths); return expandedFeaturePaths; }, getFeatureDirectoryPaths: function getFeatureDirectoryPaths() { var featureDirectoryPaths = []; var featureFilePaths = self.getFeatureFilePaths(); featureFilePaths.forEach(function (featureFilePath) { var featureDirectoryPath = featureFilePath.replace(ArgumentParser.FEATURE_FILENAME_REGEXP, ''); featureDirectoryPaths.push(featureDirectoryPath); }); return featureDirectoryPaths; }, getUnexpandedFeaturePaths: function unexpandedFeaturePaths() { var suppliedPaths = this.getSuppliedPaths(); var paths = (suppliedPaths.length > 0 ? suppliedPaths : [ArgumentParser.DEFAULT_FEATURES_DIRECTORY]); return paths; }, getSuppliedPaths: function getSuppliedPaths() { var options = self.getOptions(); return options.argv.remain; }, getSupportCodeFilePaths: function getSupportCodeFilePaths() { var unexpandedSupportCodeFilePaths = self.getUnexpandedSupportCodeFilePaths(); var extensions = ['js'].concat(self.getCompilerExtensions()); var expandedSupportCodePaths = ArgumentParser.SupportCodePathExpander.expandPaths(unexpandedSupportCodeFilePaths, extensions); return expandedSupportCodePaths; }, getUnexpandedSupportCodeFilePaths: function getUnexpandedSupportCodeFilePaths() { var unexpandedFeatureDirectoryPaths = self.getFeatureDirectoryPaths(); var unexpandedSupportCodeFilePaths = self.getOptionOrDefault(ArgumentParser.REQUIRE_OPTION_NAME, unexpandedFeatureDirectoryPaths); return unexpandedSupportCodeFilePaths; }, getTagGroups: function getTagGroups() { var tagOptionValues = self.getOptionOrDefault(ArgumentParser.TAGS_OPTION_NAME, []); var tagGroups = Cucumber.TagGroupParser.getTagGroupsFromStrings(tagOptionValues); return tagGroups; }, getCompilerExtensions: function getCompilerExtensions() { var compilers = self.getOptionOrDefault(ArgumentParser.COMPILER_OPTION_NAME, []); var extensions = compilers.map(function(compiler) { return compiler.split(':')[0]; }); return extensions; }, getCompilerModules: function getCompilerModules() { var compilers = self.getOptionOrDefault(ArgumentParser.COMPILER_OPTION_NAME, []); var modules = compilers.map(function(compiler) { return compiler.split(':')[1]; }); return modules; }, getFormat: function getFormat() { var format = self.getOptionOrDefault(ArgumentParser.FORMAT_OPTION_NAME, ArgumentParser.DEFAULT_FORMAT_VALUE); return format; }, getKnownOptionDefinitions: function getKnownOptionDefinitions() { var definitions = {}; definitions[ArgumentParser.REQUIRE_OPTION_NAME] = [path, Array]; definitions[ArgumentParser.TAGS_OPTION_NAME] = [String, Array]; definitions[ArgumentParser.COMPILER_OPTION_NAME] = [String, Array]; definitions[ArgumentParser.PROFILE_OPTION_NAME] = [String, Array]; definitions[ArgumentParser.FORMAT_OPTION_NAME] = String; definitions[ArgumentParser.HELP_FLAG_NAME] = Boolean; definitions[ArgumentParser.VERSION_FLAG_NAME] = Boolean; definitions[ArgumentParser.COFFEE_SCRIPT_SNIPPETS_FLAG_NAME] = Boolean; definitions[ArgumentParser.SNIPPETS_FLAG_NAME] = Boolean; definitions[ArgumentParser.STRICT_FLAG_NAME] = Boolean; definitions[ArgumentParser.DRY_RUN_FLAG_NAME] = Boolean; definitions[ArgumentParser.BACKTRACE_FLAG_NAME] = Boolean; definitions[ArgumentParser.SOURCE_FLAG_NAME] = Boolean; return definitions; }, getShortenedOptionDefinitions: function getShortenedOptionDefinitions() { var definitions = {}; definitions[ArgumentParser.REQUIRE_OPTION_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + ArgumentParser.REQUIRE_OPTION_NAME]; definitions[ArgumentParser.FORMAT_OPTION_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + ArgumentParser.FORMAT_OPTION_NAME]; definitions[ArgumentParser.PROFILE_OPTION_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + ArgumentParser.PROFILE_OPTION_NAME]; definitions[ArgumentParser.HELP_FLAG_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + ArgumentParser.HELP_FLAG_NAME]; definitions[ArgumentParser.SNIPPETS_FLAG_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + 'no-' + ArgumentParser.SNIPPETS_FLAG_NAME]; definitions[ArgumentParser.STRICT_FLAG_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + ArgumentParser.STRICT_FLAG_NAME]; definitions[ArgumentParser.DRY_RUN_FLAG_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + ArgumentParser.DRY_RUN_FLAG_NAME]; definitions[ArgumentParser.BACKTRACE_FLAG_SHORT_NAME] = [ArgumentParser.LONG_OPTION_PREFIX + ArgumentParser.BACKTRACE_FLAG_NAME]; return definitions; }, isStrictRequested: function isStrictRequested() { return self.getOptionOrDefault(ArgumentParser.STRICT_FLAG_NAME, ArgumentParser.DEFAULT_STRICT_FLAG_VALUE); }, isHelpRequested: function isHelpRequested() { return self.getOptionOrDefault(ArgumentParser.HELP_FLAG_NAME, ArgumentParser.DEFAULT_HELP_FLAG_VALUE); }, isDryRunRequested: function isDryRunRequested() { return self.getOptionOrDefault(ArgumentParser.DRY_RUN_FLAG_NAME, ArgumentParser.DEFAULT_DRY_RUN_FLAG_VALUE); }, isVersionRequested: function isVersionRequested() { return self.getOptionOrDefault(ArgumentParser.VERSION_FLAG_NAME, ArgumentParser.DEFAULT_VERSION_FLAG_VALUE); }, shouldSnippetsBeInCoffeeScript: function shouldSnippetsBeInCoffeeScript() { return self.getOptionOrDefault(ArgumentParser.COFFEE_SCRIPT_SNIPPETS_FLAG_NAME, ArgumentParser.DEFAULT_COFFEE_SCRIPT_SNIPPETS_FLAG_VALUE); }, shouldSnippetsBeShown: function shouldSnippetsBeInCoffeeScript() { return self.getOptionOrDefault(ArgumentParser.SNIPPETS_FLAG_NAME, ArgumentParser.DEFAULT_SNIPPETS_FLAG_VALUE); }, shouldFilterStackTraces: function shouldFilterStackTraces() { return !self.getOptionOrDefault(ArgumentParser.BACKTRACE_FLAG_NAME, ArgumentParser.DEFAULT_BACKTRACE_FLAG_VALUE); }, shouldShowSource: function shouldShowSource () { var isSourceRequested = self.getOptionOrDefault(ArgumentParser.SOURCE_FLAG_NAME, ArgumentParser.DEFAULT_SOURCE_FLAG_VALUE); return isSourceRequested; }, storeOptions: function storeOptions(newOptions) { options = newOptions; }, getOptions: function getOptions() { return options; }, getOptionOrDefault: function getOptionOrDefault(optionName, defaultValue) { var options = self.getOptions(); var optionValue = options[optionName]; return (typeof(optionValue) !== 'undefined' ? optionValue : defaultValue); } }; return self; } ArgumentParser.NUMBER_OF_LEADING_ARGS_TO_SLICE = 2; ArgumentParser.DEFAULT_FEATURES_DIRECTORY = 'features'; ArgumentParser.FEATURE_FILENAME_REGEXP = /[\/\\][^\/\\]+\.feature(:\d+)*$/i; ArgumentParser.FEATURE_FILENAME_AND_LINENUM_REGEXP = /(.*)\:(\d*)$|.*/; //fullmatch, filewithoutlinenum, linenum ArgumentParser.LONG_OPTION_PREFIX = '--'; ArgumentParser.COMPILER_OPTION_NAME = 'compiler'; ArgumentParser.REQUIRE_OPTION_NAME = 'require'; ArgumentParser.REQUIRE_OPTION_SHORT_NAME = 'r'; ArgumentParser.FORMAT_OPTION_NAME = 'format'; ArgumentParser.FORMAT_OPTION_SHORT_NAME = 'f'; ArgumentParser.DEFAULT_FORMAT_VALUE = 'pretty'; ArgumentParser.PROFILE_OPTION_NAME = 'profile'; ArgumentParser.PROFILE_OPTION_FLAG_SHORT_NAME = 'p'; ArgumentParser.TAGS_OPTION_NAME = 'tags'; ArgumentParser.TAGS_OPTION_SHORT_NAME = 't'; ArgumentParser.HELP_FLAG_NAME = 'help'; ArgumentParser.HELP_FLAG_SHORT_NAME = 'h'; ArgumentParser.DRY_RUN_FLAG_NAME = 'dry-run'; ArgumentParser.DRY_RUN_FLAG_SHORT_NAME = 'd'; ArgumentParser.STRICT_FLAG_NAME = 'strict'; ArgumentParser.STRICT_FLAG_SHORT_NAME = 'S'; ArgumentParser.DEFAULT_HELP_FLAG_VALUE = false; ArgumentParser.DEFAULT_DRY_RUN_FLAG_VALUE = false; ArgumentParser.DEFAULT_STRICT_FLAG_VALUE = false; ArgumentParser.VERSION_FLAG_NAME = 'version'; ArgumentParser.DEFAULT_VERSION_FLAG_VALUE = false; ArgumentParser.COFFEE_SCRIPT_SNIPPETS_FLAG_NAME = 'coffee'; ArgumentParser.DEFAULT_COFFEE_SCRIPT_SNIPPETS_FLAG_VALUE = false; ArgumentParser.SOURCE_FLAG_NAME = 'source'; ArgumentParser.DEFAULT_SOURCE_FLAG_VALUE = true; ArgumentParser.SNIPPETS_FLAG_NAME = 'snippets'; ArgumentParser.SNIPPETS_FLAG_SHORT_NAME = 'i'; ArgumentParser.DEFAULT_SNIPPETS_FLAG_VALUE = true; ArgumentParser.BACKTRACE_FLAG_NAME = 'backtrace'; ArgumentParser.BACKTRACE_FLAG_SHORT_NAME = 'b'; ArgumentParser.DEFAULT_BACKTRACE_FLAG_VALUE = false; ArgumentParser.FeaturePathExpander = require('./argument_parser/feature_path_expander'); ArgumentParser.PathExpander = require('./argument_parser/path_expander'); ArgumentParser.ProfileDefinitionLoader = require('./argument_parser/profile_definition_loader'); ArgumentParser.SupportCodePathExpander = require('./argument_parser/support_code_path_expander'); module.exports = ArgumentParser;