action.js (4659B)
1 /** 2 * class Action 3 * 4 * Base class for all actions 5 * Do not call in your code, use this class only for inherits your own action 6 * 7 * Information about how to convert command line strings to Javascript objects. 8 * Action objects are used by an ArgumentParser to represent the information 9 * needed to parse a single argument from one or more strings from the command 10 * line. The keyword arguments to the Action constructor are also all attributes 11 * of Action instances. 12 * 13 * ##### Allowed keywords: 14 * 15 * - `store` 16 * - `storeConstant` 17 * - `storeTrue` 18 * - `storeFalse` 19 * - `append` 20 * - `appendConstant` 21 * - `count` 22 * - `help` 23 * - `version` 24 * 25 * Information about action options see [[Action.new]] 26 * 27 * See also [original guide](http://docs.python.org/dev/library/argparse.html#action) 28 * 29 **/ 30 31 'use strict'; 32 33 34 // Constants 35 var c = require('./const'); 36 37 38 /** 39 * new Action(options) 40 * 41 * Base class for all actions. Used only for inherits 42 * 43 * 44 * ##### Options: 45 * 46 * - `optionStrings` A list of command-line option strings for the action. 47 * - `dest` Attribute to hold the created object(s) 48 * - `nargs` The number of command-line arguments that should be consumed. 49 * By default, one argument will be consumed and a single value will be 50 * produced. 51 * - `constant` Default value for an action with no value. 52 * - `defaultValue` The value to be produced if the option is not specified. 53 * - `type` Cast to 'string'|'int'|'float'|'complex'|function (string). If 54 * None, 'string'. 55 * - `choices` The choices available. 56 * - `required` True if the action must always be specified at the command 57 * line. 58 * - `help` The help describing the argument. 59 * - `metavar` The name to be used for the option's argument with the help 60 * string. If None, the 'dest' value will be used as the name. 61 * 62 * ##### nargs supported values: 63 * 64 * - `N` (an integer) consumes N arguments (and produces a list) 65 * - `?` consumes zero or one arguments 66 * - `*` consumes zero or more arguments (and produces a list) 67 * - `+` consumes one or more arguments (and produces a list) 68 * 69 * Note: that the difference between the default and nargs=1 is that with the 70 * default, a single value will be produced, while with nargs=1, a list 71 * containing a single value will be produced. 72 **/ 73 var Action = module.exports = function Action(options) { 74 options = options || {}; 75 this.optionStrings = options.optionStrings || []; 76 this.dest = options.dest; 77 this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null; 78 this.constant = typeof options.constant !== 'undefined' ? options.constant : null; 79 this.defaultValue = options.defaultValue; 80 this.type = typeof options.type !== 'undefined' ? options.type : null; 81 this.choices = typeof options.choices !== 'undefined' ? options.choices : null; 82 this.required = typeof options.required !== 'undefined' ? options.required : false; 83 this.help = typeof options.help !== 'undefined' ? options.help : null; 84 this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null; 85 86 if (!(this.optionStrings instanceof Array)) { 87 throw new Error('optionStrings should be an array'); 88 } 89 if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') { 90 throw new Error('required should be a boolean'); 91 } 92 }; 93 94 /** 95 * Action#getName -> String 96 * 97 * Tells action name 98 **/ 99 Action.prototype.getName = function () { 100 if (this.optionStrings.length > 0) { 101 return this.optionStrings.join('/'); 102 } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) { 103 return this.metavar; 104 } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) { 105 return this.dest; 106 } 107 return null; 108 }; 109 110 /** 111 * Action#isOptional -> Boolean 112 * 113 * Return true if optional 114 **/ 115 Action.prototype.isOptional = function () { 116 return !this.isPositional(); 117 }; 118 119 /** 120 * Action#isPositional -> Boolean 121 * 122 * Return true if positional 123 **/ 124 Action.prototype.isPositional = function () { 125 return (this.optionStrings.length === 0); 126 }; 127 128 /** 129 * Action#call(parser, namespace, values, optionString) -> Void 130 * - parser (ArgumentParser): current parser 131 * - namespace (Namespace): namespace for output data 132 * - values (Array): parsed values 133 * - optionString (Array): input option string(not parsed) 134 * 135 * Call the action. Should be implemented in inherited classes 136 * 137 * ##### Example 138 * 139 * ActionCount.prototype.call = function (parser, namespace, values, optionString) { 140 * namespace.set(this.dest, (namespace[this.dest] || 0) + 1); 141 * }; 142 * 143 **/ 144 Action.prototype.call = function () { 145 throw new Error('.call() not defined');// Not Implemented error 146 };