coa 0.3.7 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- package/.npmignore +4 -1
- package/.travis.yml +11 -0
- package/GNUmakefile +22 -3
- package/README.md +37 -8
- package/index.js +1 -0
- package/lib/arg.js +11 -1
- package/lib/cmd.js +71 -6
- package/lib/color.js +1 -1
- package/lib/completion.js +5 -5
- package/lib/index.js +10 -0
- package/lib/opt.js +11 -1
- package/lib/shell.js +1 -2
- package/package.json +12 -5
- package/src/arg.coffee +8 -0
- package/src/cmd.coffee +66 -4
- package/src/completion.coffee +6 -4
- package/src/index.coffee +5 -0
- package/src/opt.coffee +8 -0
- package/test/coa.js +496 -0
- package/test/common.js +1 -0
- package/test/mocha.opts +3 -0
- package/test/shell-test.js +43 -42
- package/tests/api-h.js +2 -2
- package/tests/h.js +1 -1
- package/lib/coa.js +0 -3
- package/src/coa.coffee +0 -1
- package/tests/a.js +0 -14
- package/tests/api-args.js +0 -34
- package/tests/api-cmd.js +0 -27
- package/tests/args.js +0 -21
- package/tests/cmd.js +0 -14
- package/tests/def.js +0 -25
- package/tests/l.js +0 -21
- package/tests/rarg.js +0 -13
- package/tests/req.js +0 -10
- package/tests/v.js +0 -23
- package/tests/val.js +0 -14
package/.npmignore
CHANGED
package/.travis.yml
ADDED
package/GNUmakefile
CHANGED
@@ -1,15 +1,34 @@
|
|
1
|
+
BIN = ./node_modules/.bin
|
2
|
+
|
1
3
|
.PHONY: all
|
2
4
|
all: lib
|
3
5
|
|
4
6
|
lib: $(foreach s,$(wildcard src/*.coffee),$(patsubst src/%.coffee,lib/%.js,$s))
|
5
7
|
|
8
|
+
lib-cov: clean-coverage lib
|
9
|
+
$(BIN)/istanbul instrument --output lib-cov --no-compact --variable global.__coverage__ lib
|
10
|
+
|
6
11
|
lib/%.js: src/%.coffee
|
7
|
-
|
12
|
+
$(BIN)/coffee -cb -o $(@D) $<
|
8
13
|
|
9
14
|
.PHONY: test
|
10
15
|
test: lib
|
11
|
-
|
16
|
+
$(BIN)/mocha
|
17
|
+
|
18
|
+
.PHONY: coverage
|
19
|
+
coverage: lib-cov
|
20
|
+
COVER=1 $(BIN)/mocha --reporter mocha-istanbul
|
21
|
+
@echo
|
22
|
+
@echo Open html-report/index.html file in your browser
|
12
23
|
|
13
24
|
.PHONY: watch
|
14
25
|
watch:
|
15
|
-
coffee --watch --bare --output lib src/*.coffee
|
26
|
+
$(BIN)/coffee --watch --bare --output lib src/*.coffee
|
27
|
+
|
28
|
+
.PHONY: clean
|
29
|
+
clean: clean-coverage
|
30
|
+
|
31
|
+
.PHONY: clean-coverage
|
32
|
+
clean-coverage:
|
33
|
+
-rm -rf lib-cov
|
34
|
+
-rm -rf html-report
|
package/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Command-Option-Argument
|
2
|
+
[![build status](https://secure.travis-ci.org/veged/coa.png)](http://travis-ci.org/veged/coa)
|
2
3
|
|
3
4
|
## What is it?
|
4
5
|
|
@@ -8,6 +9,7 @@ Once you write definition in terms of commands, options and arguments you automa
|
|
8
9
|
* Command line help text
|
9
10
|
* Program API for use COA-based programs as modules
|
10
11
|
* Shell completion
|
12
|
+
* Subcommand extendibility by external node modules
|
11
13
|
|
12
14
|
### Other features
|
13
15
|
|
@@ -18,6 +20,8 @@ Once you write definition in terms of commands, options and arguments you automa
|
|
18
20
|
|
19
21
|
### TODO
|
20
22
|
|
23
|
+
* --Subcommand extendibility--
|
24
|
+
* Shell completion helpers
|
21
25
|
* Localization
|
22
26
|
* Shell-mode
|
23
27
|
* Configs
|
@@ -43,14 +47,22 @@ require('coa').Cmd() // main (top level) command declaration
|
|
43
47
|
.version;
|
44
48
|
})
|
45
49
|
.end() // end option chain and return to main command
|
46
|
-
.cmd()
|
50
|
+
.cmd()
|
51
|
+
.name('subcommand')
|
52
|
+
.apply(require('./subcommand')) // load subcommand from module
|
53
|
+
.end()
|
47
54
|
.cmd() // inplace subcommand declaration
|
48
|
-
.name('othercommand')
|
55
|
+
.name('othercommand')
|
56
|
+
.title('Awesome other subcommand')
|
57
|
+
.helpful()
|
49
58
|
.opt()
|
50
|
-
.name('input')
|
51
|
-
.
|
59
|
+
.name('input')
|
60
|
+
.title('input file, required')
|
61
|
+
.short('i')
|
62
|
+
.long('input')
|
52
63
|
.val(function(v) { // validator function, also for translate simple values
|
53
|
-
return require('fs').createReadStream(v)
|
64
|
+
return require('fs').createReadStream(v);
|
65
|
+
})
|
54
66
|
.req() // make option required
|
55
67
|
.end() // end option chain and return to command
|
56
68
|
.end() // end subcommand chain and return to parent command
|
@@ -59,12 +71,14 @@ require('coa').Cmd() // main (top level) command declaration
|
|
59
71
|
|
60
72
|
````javascript
|
61
73
|
// subcommand.js
|
62
|
-
exports
|
74
|
+
module.exports = function() {
|
63
75
|
this
|
64
76
|
.title('Awesome subcommand').helpful()
|
65
77
|
.opt()
|
66
|
-
.name('output')
|
67
|
-
.
|
78
|
+
.name('output')
|
79
|
+
.title('output file')
|
80
|
+
.short('o')
|
81
|
+
.long('output')
|
68
82
|
.output() // use default preset for "output" option declaration
|
69
83
|
.end()
|
70
84
|
};
|
@@ -139,6 +153,16 @@ Adds shell completion to command, adds "completion" subcommand, that makes all t
|
|
139
153
|
Must be called only on root command.<br>
|
140
154
|
**@returns** *COA.Cmd* `this` instance (for chainability)
|
141
155
|
|
156
|
+
#### Cmd.extendable
|
157
|
+
Adds ability to extend command by external node modules.<br>
|
158
|
+
**@param** *String* `[pattern]` Pattern of modules names to search.
|
159
|
+
Should be simple string with `%s` placeholder like `coa-program-%s-subcommand`
|
160
|
+
or without it — it will be treated as module name prefix then. E.g. `coa-program-`.<br>
|
161
|
+
Node module should export function or `Cmd` object. Function will be passed
|
162
|
+
to `Cmd.apply()` method of created subcommand object using `Cmd.cmd()` method. And
|
163
|
+
`Cmd` object will be passed to `Cmd.cmd()` method.
|
164
|
+
**@returns** *COA.Cmd* `this` instance (for chainability)
|
165
|
+
|
142
166
|
#### Cmd.usage
|
143
167
|
Build full usage text for current command instance.<br>
|
144
168
|
**@returns** *String* `usage` text
|
@@ -226,6 +250,11 @@ Default value passed through validation function as ordinary value.<br>
|
|
226
250
|
**@param** *Object* `_def`<br>
|
227
251
|
**@returns** *COA.Opt* `this` instance (for chainability)
|
228
252
|
|
253
|
+
#### Opt.input
|
254
|
+
Make option value inputting stream.
|
255
|
+
It's add useful validation and shortcut for STDIN.
|
256
|
+
**@returns** *{COA.Opt}* `this` instance (for chainability)
|
257
|
+
|
229
258
|
#### Opt.output
|
230
259
|
Make option value outputing stream.<br>
|
231
260
|
It's add useful validation and shortcut for STDOUT.<br>
|
package/index.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
module.exports = require(process.env.COVER? './lib-cov' : './lib');
|
package/lib/arg.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Generated by CoffeeScript 1.
|
1
|
+
// Generated by CoffeeScript 1.6.3
|
2
2
|
var Arg, Cmd, Color, Opt;
|
3
3
|
|
4
4
|
Color = require('./color').Color;
|
@@ -160,6 +160,16 @@ exports.Arg = Arg = (function() {
|
|
160
160
|
|
161
161
|
Arg.prototype.end = Cmd.prototype.end;
|
162
162
|
|
163
|
+
/**
|
164
|
+
Apply function with arguments in context of arg instance.
|
165
|
+
@param {Function} fn
|
166
|
+
@param {Array} args
|
167
|
+
@returns {COA.Arg} this instance (for chainability)
|
168
|
+
*/
|
169
|
+
|
170
|
+
|
171
|
+
Arg.prototype.apply = Cmd.prototype.apply;
|
172
|
+
|
163
173
|
return Arg;
|
164
174
|
|
165
175
|
})();
|
package/lib/cmd.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Generated by CoffeeScript 1.
|
1
|
+
// Generated by CoffeeScript 1.6.3
|
2
2
|
var Cmd, Color, PATH, Q, UTIL,
|
3
3
|
__slice = [].slice;
|
4
4
|
|
@@ -35,6 +35,7 @@ exports.Cmd = Cmd = (function() {
|
|
35
35
|
this._opts = [];
|
36
36
|
this._optsByKey = {};
|
37
37
|
this._args = [];
|
38
|
+
this._ext = false;
|
38
39
|
}
|
39
40
|
|
40
41
|
Cmd.get = function(propertyName, func) {
|
@@ -70,10 +71,13 @@ exports.Cmd = Cmd = (function() {
|
|
70
71
|
});
|
71
72
|
|
72
73
|
Cmd.prototype._parent = function(cmd) {
|
74
|
+
this._cmd = cmd || this;
|
73
75
|
if (cmd) {
|
74
76
|
cmd._cmds.push(this);
|
77
|
+
if (this._name) {
|
78
|
+
this._cmd._cmdsByName[this._name] = this;
|
79
|
+
}
|
75
80
|
}
|
76
|
-
this._cmd = cmd || this;
|
77
81
|
return this;
|
78
82
|
};
|
79
83
|
|
@@ -221,6 +225,18 @@ exports.Cmd = Cmd = (function() {
|
|
221
225
|
return this.cmd().name('completion').apply(require('./completion')).end();
|
222
226
|
};
|
223
227
|
|
228
|
+
/**
|
229
|
+
Allow command to be extendable by external node.js modules.
|
230
|
+
@param {String} [pattern] Pattern of node.js module to find subcommands at.
|
231
|
+
@returns {COA.Cmd} this instance (for chainability)
|
232
|
+
*/
|
233
|
+
|
234
|
+
|
235
|
+
Cmd.prototype.extendable = function(pattern) {
|
236
|
+
this._ext = pattern || true;
|
237
|
+
return this;
|
238
|
+
};
|
239
|
+
|
224
240
|
Cmd.prototype._exit = function(msg, code) {
|
225
241
|
return process.once('exit', function() {
|
226
242
|
if (msg) {
|
@@ -304,7 +320,7 @@ exports.Cmd = Cmd = (function() {
|
|
304
320
|
};
|
305
321
|
|
306
322
|
Cmd.prototype._parseCmd = function(argv, unparsed) {
|
307
|
-
var cmd, i, optSeen;
|
323
|
+
var c, cmd, cmdDesc, e, i, optSeen, pkg;
|
308
324
|
if (unparsed == null) {
|
309
325
|
unparsed = [];
|
310
326
|
}
|
@@ -314,8 +330,46 @@ exports.Cmd = Cmd = (function() {
|
|
314
330
|
if (!i.indexOf('-')) {
|
315
331
|
optSeen = true;
|
316
332
|
}
|
317
|
-
if (!optSeen && /^\w[\w-_]*$/.test(i)
|
318
|
-
|
333
|
+
if (!optSeen && /^\w[\w-_]*$/.test(i)) {
|
334
|
+
cmd = this._cmdsByName[i];
|
335
|
+
if (!cmd && this._ext) {
|
336
|
+
if (typeof this._ext === 'string') {
|
337
|
+
if (~this._ext.indexOf('%s')) {
|
338
|
+
pkg = UTIL.format(this._ext, i);
|
339
|
+
} else {
|
340
|
+
pkg = this._ext + i;
|
341
|
+
}
|
342
|
+
} else if (this._ext === true) {
|
343
|
+
pkg = i;
|
344
|
+
c = this;
|
345
|
+
while (true) {
|
346
|
+
pkg = c._name + '-' + pkg;
|
347
|
+
if (c._cmd === c) {
|
348
|
+
break;
|
349
|
+
}
|
350
|
+
c = c._cmd;
|
351
|
+
}
|
352
|
+
}
|
353
|
+
try {
|
354
|
+
cmdDesc = require(pkg);
|
355
|
+
} catch (_error) {
|
356
|
+
e = _error;
|
357
|
+
}
|
358
|
+
if (cmdDesc) {
|
359
|
+
if (typeof cmdDesc === 'function') {
|
360
|
+
this.cmd().name(i).apply(cmdDesc).end();
|
361
|
+
} else if (typeof cmdDesc === 'object') {
|
362
|
+
this.cmd(cmdDesc);
|
363
|
+
cmdDesc.name(i);
|
364
|
+
} else {
|
365
|
+
throw new Error('Error: Unsupported command declaration type, ' + 'should be function or COA.Cmd() object');
|
366
|
+
}
|
367
|
+
cmd = this._cmdsByName[i];
|
368
|
+
}
|
369
|
+
}
|
370
|
+
if (cmd) {
|
371
|
+
return cmd._parseCmd(argv, unparsed);
|
372
|
+
}
|
319
373
|
}
|
320
374
|
unparsed.push(i);
|
321
375
|
}
|
@@ -456,10 +510,21 @@ exports.Cmd = Cmd = (function() {
|
|
456
510
|
}
|
457
511
|
};
|
458
512
|
};
|
459
|
-
Q.when(this
|
513
|
+
Q.when(this["do"](argv), cb(0), cb(1)).done();
|
460
514
|
return this;
|
461
515
|
};
|
462
516
|
|
517
|
+
/**
|
518
|
+
Convenient function to run command from tests.
|
519
|
+
@param {Array} argv
|
520
|
+
@returns {Q.Promise}
|
521
|
+
*/
|
522
|
+
|
523
|
+
|
524
|
+
Cmd.prototype["do"] = function(argv) {
|
525
|
+
return this._do(this._parseArr(argv || []));
|
526
|
+
};
|
527
|
+
|
463
528
|
/**
|
464
529
|
Invoke specified (or current) command using provided
|
465
530
|
options and arguments.
|
package/lib/color.js
CHANGED
package/lib/completion.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Generated by CoffeeScript 1.
|
1
|
+
// Generated by CoffeeScript 1.6.3
|
2
2
|
/**
|
3
3
|
Most of the code adopted from the npm package shell completion code.
|
4
4
|
See https://github.com/isaacs/npm/blob/master/lib/completion.js
|
@@ -21,7 +21,7 @@ module.exports = function() {
|
|
21
21
|
e.errno = require('constants').ENOTSUP;
|
22
22
|
return this.reject(e);
|
23
23
|
}
|
24
|
-
if (
|
24
|
+
if ((process.env.COMP_CWORD == null) || (process.env.COMP_LINE == null) || (process.env.COMP_POINT == null)) {
|
25
25
|
return dumpScript(this._cmd._name);
|
26
26
|
}
|
27
27
|
console.error('COMP_LINE: %s', process.env.COMP_LINE);
|
@@ -112,15 +112,15 @@ complete = function(cmd, opts) {
|
|
112
112
|
}
|
113
113
|
if (optWord && (opt = cmd._optsByKey[optWord])) {
|
114
114
|
if (!opt._flag && opt._comp) {
|
115
|
-
compls = Q.
|
115
|
+
compls = Q.all([compls, opt._comp(opts)]).spread(function(c, o) {
|
116
116
|
return c.concat(o.map(function(v) {
|
117
117
|
return (optPrefix || '') + v;
|
118
118
|
}));
|
119
|
-
})
|
119
|
+
});
|
120
120
|
}
|
121
121
|
}
|
122
122
|
if (cmd._comp) {
|
123
|
-
compls = Q.
|
123
|
+
compls = Q.all([compls, cmd._comp(opts)]).spread(function(c, o) {
|
124
124
|
return c.concat(o);
|
125
125
|
});
|
126
126
|
}
|
package/lib/index.js
ADDED
package/lib/opt.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Generated by CoffeeScript 1.
|
1
|
+
// Generated by CoffeeScript 1.6.3
|
2
2
|
var Cmd, Color, Opt, Q, fs;
|
3
3
|
|
4
4
|
fs = require('fs');
|
@@ -323,6 +323,16 @@ exports.Opt = Opt = (function() {
|
|
323
323
|
|
324
324
|
Opt.prototype.end = Cmd.prototype.end;
|
325
325
|
|
326
|
+
/**
|
327
|
+
Apply function with arguments in context of option instance.
|
328
|
+
@param {Function} fn
|
329
|
+
@param {Array} args
|
330
|
+
@returns {COA.Opt} this instance (for chainability)
|
331
|
+
*/
|
332
|
+
|
333
|
+
|
334
|
+
Opt.prototype.apply = Cmd.prototype.apply;
|
335
|
+
|
326
336
|
return Opt;
|
327
337
|
|
328
338
|
})();
|
package/lib/shell.js
CHANGED
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "coa",
|
3
3
|
"description": "Command-Option-Argument: Yet another parser for command line options.",
|
4
|
-
"version": "0.
|
4
|
+
"version": "0.4.1",
|
5
5
|
"homepage": "http://github.com/veged/coa",
|
6
6
|
"author": "Sergey Berezhnoy <veged@ya.ru> (http://github.com/veged)",
|
7
7
|
"maintainers": [
|
@@ -18,13 +18,20 @@
|
|
18
18
|
"directories": {
|
19
19
|
"lib": "./lib"
|
20
20
|
},
|
21
|
-
"main": "./lib/coa.js",
|
22
21
|
"dependencies": {
|
23
|
-
"q": "~0.
|
22
|
+
"q": "~0.9.6"
|
24
23
|
},
|
25
24
|
"devDependencies": {
|
26
|
-
"coffee-script": "~1.
|
27
|
-
"
|
25
|
+
"coffee-script": "~1.6.3",
|
26
|
+
"istanbul": "~0.1.40",
|
27
|
+
"mocha-as-promised": "*",
|
28
|
+
"mocha-istanbul": "*",
|
29
|
+
"mocha": "~1.12.0",
|
30
|
+
"chai": "~1.7.2"
|
31
|
+
},
|
32
|
+
"scripts": {
|
33
|
+
"test": "make test",
|
34
|
+
"coverage": "make coverage"
|
28
35
|
},
|
29
36
|
"engines": {
|
30
37
|
"node": ">= 0.6.0"
|
package/src/arg.coffee
CHANGED
@@ -120,3 +120,11 @@ exports.Arg = class Arg
|
|
120
120
|
@returns {COA.Cmd} parent command
|
121
121
|
###
|
122
122
|
end: Cmd::end
|
123
|
+
|
124
|
+
###*
|
125
|
+
Apply function with arguments in context of arg instance.
|
126
|
+
@param {Function} fn
|
127
|
+
@param {Array} args
|
128
|
+
@returns {COA.Arg} this instance (for chainability)
|
129
|
+
###
|
130
|
+
apply: Cmd::apply
|
package/src/cmd.coffee
CHANGED
@@ -32,6 +32,8 @@ exports.Cmd = class Cmd
|
|
32
32
|
|
33
33
|
@_args = []
|
34
34
|
|
35
|
+
@_ext = false
|
36
|
+
|
35
37
|
@get: (propertyName, func) ->
|
36
38
|
Object.defineProperty @::, propertyName,
|
37
39
|
configurable: true
|
@@ -52,8 +54,10 @@ exports.Cmd = class Cmd
|
|
52
54
|
@_api
|
53
55
|
|
54
56
|
_parent: (cmd) ->
|
55
|
-
if cmd then cmd._cmds.push @
|
56
57
|
@_cmd = cmd or this
|
58
|
+
if cmd
|
59
|
+
cmd._cmds.push @
|
60
|
+
if @_name then @_cmd._cmdsByName[@_name] = @
|
57
61
|
@
|
58
62
|
|
59
63
|
###*
|
@@ -163,6 +167,15 @@ exports.Cmd = class Cmd
|
|
163
167
|
.apply(require './completion')
|
164
168
|
.end()
|
165
169
|
|
170
|
+
###*
|
171
|
+
Allow command to be extendable by external node.js modules.
|
172
|
+
@param {String} [pattern] Pattern of node.js module to find subcommands at.
|
173
|
+
@returns {COA.Cmd} this instance (for chainability)
|
174
|
+
###
|
175
|
+
extendable: (pattern) ->
|
176
|
+
@_ext = pattern or true
|
177
|
+
@
|
178
|
+
|
166
179
|
_exit: (msg, code) ->
|
167
180
|
process.once 'exit', ->
|
168
181
|
if msg then UTIL.error msg
|
@@ -233,8 +246,49 @@ exports.Cmd = class Cmd
|
|
233
246
|
while i = argv.shift()
|
234
247
|
if not i.indexOf '-'
|
235
248
|
optSeen = true
|
236
|
-
if not optSeen and /^\w[\w-_]*$/.test(i)
|
237
|
-
|
249
|
+
if not optSeen and /^\w[\w-_]*$/.test(i)
|
250
|
+
cmd = @_cmdsByName[i]
|
251
|
+
|
252
|
+
if not cmd and @_ext
|
253
|
+
# construct package name to require
|
254
|
+
if typeof @_ext is 'string'
|
255
|
+
if ~@_ext.indexOf('%s')
|
256
|
+
# use formatted string
|
257
|
+
pkg = UTIL.format(@_ext, i)
|
258
|
+
else
|
259
|
+
# just append subcommand name to the prefix
|
260
|
+
pkg = @_ext + i
|
261
|
+
else if @_ext is true
|
262
|
+
# use default scheme: <command>-<subcommand>-<subcommand> and so on
|
263
|
+
pkg = i
|
264
|
+
c = @
|
265
|
+
loop
|
266
|
+
pkg = c._name + '-' + pkg
|
267
|
+
if c._cmd is c then break
|
268
|
+
c = c._cmd
|
269
|
+
|
270
|
+
try
|
271
|
+
cmdDesc = require(pkg)
|
272
|
+
catch e
|
273
|
+
|
274
|
+
if cmdDesc
|
275
|
+
if typeof cmdDesc == 'function'
|
276
|
+
# set create subcommand, set its name and apply imported function
|
277
|
+
@cmd()
|
278
|
+
.name(i)
|
279
|
+
.apply(cmdDesc)
|
280
|
+
.end()
|
281
|
+
else if typeof cmdDesc == 'object'
|
282
|
+
# register subcommand
|
283
|
+
@cmd(cmdDesc)
|
284
|
+
# set command name
|
285
|
+
cmdDesc.name(i)
|
286
|
+
else
|
287
|
+
throw new Error 'Error: Unsupported command declaration type, ' +
|
288
|
+
'should be function or COA.Cmd() object'
|
289
|
+
cmd = @_cmdsByName[i]
|
290
|
+
if cmd
|
291
|
+
return cmd._parseCmd argv, unparsed
|
238
292
|
|
239
293
|
unparsed.push i
|
240
294
|
|
@@ -342,9 +396,17 @@ exports.Cmd = class Cmd
|
|
342
396
|
@_exit res.stack ? res.toString(), res.exitCode ? code
|
343
397
|
else
|
344
398
|
@_exit()
|
345
|
-
Q.when(@
|
399
|
+
Q.when(@do(argv), cb(0), cb(1)).done()
|
346
400
|
@
|
347
401
|
|
402
|
+
###*
|
403
|
+
Convenient function to run command from tests.
|
404
|
+
@param {Array} argv
|
405
|
+
@returns {Q.Promise}
|
406
|
+
###
|
407
|
+
do: (argv) ->
|
408
|
+
@_do(@_parseArr argv || [])
|
409
|
+
|
348
410
|
###*
|
349
411
|
Invoke specified (or current) command using provided
|
350
412
|
options and arguments.
|
package/src/completion.coffee
CHANGED
@@ -137,15 +137,17 @@ complete = (cmd, opts) ->
|
|
137
137
|
# complete on opt values: completion
|
138
138
|
if optWord and opt = cmd._optsByKey[optWord]
|
139
139
|
if not opt._flag and opt._comp
|
140
|
-
compls = Q.
|
141
|
-
|
140
|
+
compls = Q.all([compls, opt._comp(opts)])
|
141
|
+
.spread (c, o) ->
|
142
|
+
c.concat o.map (v) -> (optPrefix or '') + v
|
142
143
|
|
143
144
|
# TODO: complete on args values (context aware, custom completion?)
|
144
145
|
|
145
146
|
# custom completion on cmds
|
146
147
|
if cmd._comp
|
147
|
-
compls = Q.
|
148
|
-
|
148
|
+
compls = Q.all([compls, cmd._comp(opts)])
|
149
|
+
.spread (c, o) ->
|
150
|
+
c.concat o
|
149
151
|
|
150
152
|
# TODO: context aware custom completion on cmds, opts and args
|
151
153
|
# (can depend on already entered values, especially options)
|
package/src/index.coffee
ADDED
package/src/opt.coffee
CHANGED
@@ -233,3 +233,11 @@ exports.Opt = class Opt
|
|
233
233
|
@returns {COA.Cmd} parent command
|
234
234
|
###
|
235
235
|
end: Cmd::end
|
236
|
+
|
237
|
+
###*
|
238
|
+
Apply function with arguments in context of option instance.
|
239
|
+
@param {Function} fn
|
240
|
+
@param {Array} args
|
241
|
+
@returns {COA.Opt} this instance (for chainability)
|
242
|
+
###
|
243
|
+
apply: Cmd::apply
|