Skip to content

Commit

Permalink
Standardize help output (#853)
Browse files Browse the repository at this point in the history
* Removed newline before and after help output
* Updated English documentation and examples
* Unindented help output
* Fixed newline and indentation for missing command error
* Updated REAME examples in English and Chinese and fixed example indentation
* Removed newlines surrounding EACCESS error message
  • Loading branch information
jaredpetersen authored and roman-vanesyan committed Aug 31, 2018
1 parent af17996 commit 713db77
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 78 deletions.
50 changes: 23 additions & 27 deletions Readme.md
Expand Up @@ -45,7 +45,7 @@ console.log(' - %s cheese', program.cheese);

Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.

Note that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false.
Note that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false.

```js
#!/usr/bin/env node
Expand Down Expand Up @@ -153,7 +153,7 @@ program
.option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')
.option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
.parse(process.argv);

console.log(' size: %j', program.size);
console.log(' drink: %j', program.drink);
```
Expand Down Expand Up @@ -248,30 +248,28 @@ You can enable `--harmony` option in two ways:
The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:

```
$ ./examples/pizza --help
Usage: pizza [options]
$ ./examples/pizza --help
Usage: pizza [options]
An application for pizzas ordering
An application for pizzas ordering
Options:
-h, --help output usage information
-V, --version output the version number
-p, --peppers Add peppers
-P, --pineapple Add pineapple
-b, --bbq Add bbq sauce
-c, --cheese <type> Add the specified type of cheese [marble]
-C, --no-cheese You do not want any cheese
Options:
-h, --help output usage information
-V, --version output the version number
-p, --peppers Add peppers
-P, --pineapple Add pineapple
-b, --bbq Add bbq sauce
-c, --cheese <type> Add the specified type of cheese [marble]
-C, --no-cheese You do not want any cheese
```

## Custom help

You can display arbitrary `-h, --help` information
by listening for "--help". Commander will automatically
exit once you are done so that the remainder of your program
does not execute causing undesired behaviours, for example
does not execute causing undesired behaviors, for example
in the following executable "stuff" will not output when
`--help` is used.

Expand All @@ -294,11 +292,11 @@ program
// node's emit() is immediate

program.on('--help', function(){
console.log(' Examples:');
console.log('');
console.log(' $ custom-help --help');
console.log(' $ custom-help -h');
console.log('')
console.log('Examples:');
console.log('');
console.log(' $ custom-help --help');
console.log(' $ custom-help -h');
});

program.parse(process.argv);
Expand All @@ -309,7 +307,6 @@ console.log('stuff');
Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:

```
Usage: custom-help [options]
Options:
Expand All @@ -324,7 +321,6 @@ Examples:
$ custom-help --help
$ custom-help -h
```

## .outputHelp(cb)
Expand Down Expand Up @@ -402,11 +398,11 @@ program
.action(function(cmd, options){
console.log('exec "%s" using %s mode', cmd, options.exec_mode);
}).on('--help', function() {
console.log(' Examples:');
console.log();
console.log(' $ deploy exec sequential');
console.log(' $ deploy exec async');
console.log();
console.log('');
console.log('Examples:');
console.log('');
console.log(' $ deploy exec sequential');
console.log(' $ deploy exec async');
});

program
Expand Down
38 changes: 17 additions & 21 deletions Readme_zh-CN.md
Expand Up @@ -186,22 +186,20 @@ Commander 将会尝试在入口脚本(例如 `./examples/pm`)的目录中搜
帮助信息是 commander 基于你的程序自动生成的,下面是 `--help` 生成的帮助信息:

```
$ ./examples/pizza --help
$ ./examples/pizza --help
Usage: pizza [options]
Usage: pizza [options]
An application for pizzas ordering
An application for pizzas ordering
Options:
-h, --help output usage information
-V, --version output the version number
-p, --peppers Add peppers
-P, --pineapple Add pineapple
-b, --bbq Add bbq sauce
-c, --cheese <type> Add the specified type of cheese [marble]
-C, --no-cheese You do not want any cheese
Options:
-h, --help output usage information
-V, --version output the version number
-p, --peppers Add peppers
-P, --pineapple Add pineapple
-b, --bbq Add bbq sauce
-c, --cheese <type> Add the specified type of cheese [marble]
-C, --no-cheese You do not want any cheese
```

## 自定义帮助
Expand All @@ -227,11 +225,11 @@ program
// node's emit() is immediate

program.on('--help', function(){
console.log('');
console.log(' Examples:');
console.log('');
console.log(' $ custom-help --help');
console.log(' $ custom-help -h');
console.log('');
});

program.parse(process.argv);
Expand All @@ -242,7 +240,6 @@ console.log('stuff');
下列帮助信息是运行 `node script-name.js -h` or `node script-name.js --help` 时输出的:

```
Usage: custom-help [options]
Options:
Expand All @@ -257,7 +254,6 @@ Examples:
$ custom-help --help
$ custom-help -h
```

## .outputHelp(cb)
Expand Down Expand Up @@ -318,11 +314,11 @@ program
.action(function(cmd, options){
console.log('exec "%s" using %s mode', cmd, options.exec_mode);
}).on('--help', function() {
console.log(' Examples:');
console.log();
console.log(' $ deploy exec sequential');
console.log(' $ deploy exec async');
console.log();
console.log('');
console.log('Examples:');
console.log('');
console.log(' $ deploy exec sequential');
console.log(' $ deploy exec async');
});

program
Expand Down
6 changes: 3 additions & 3 deletions examples/custom-help
Expand Up @@ -16,11 +16,11 @@ program
// node's emit() is immediate

program.on('--help', function(){
console.log(' Examples:');
console.log('');
console.log(' $ custom-help --help');
console.log(' $ custom-help -h');
console.log('Examples:');
console.log('');
console.log(' $ custom-help --help');
console.log(' $ custom-help -h');
});

program.parse(process.argv);
Expand Down
22 changes: 10 additions & 12 deletions index.js
Expand Up @@ -580,9 +580,9 @@ Command.prototype.executeSubCommand = function(argv, args, unknown) {
proc.on('close', process.exit.bind(process));
proc.on('error', function(err) {
if (err.code === 'ENOENT') {
console.error('\n %s(1) does not exist, try --help\n', bin);
console.error('%s(1) does not exist, try --help', bin);
} else if (err.code === 'EACCES') {
console.error('\n %s(1) not executable. try chmod or run with root\n', bin);
console.error('%s(1) not executable. try chmod or run with root', bin);
}
process.exit(1);
});
Expand Down Expand Up @@ -1072,12 +1072,12 @@ Command.prototype.commandHelp = function() {
var width = this.padWidth();

return [
' Commands:',
'Commands:',
'',
commands.map(function(cmd) {
var desc = cmd[1] ? ' ' + cmd[1] : '';
return (desc ? pad(cmd[0], width) : cmd[0]) + desc;
}).join('\n').replace(/^/gm, ' '),
}).join('\n').replace(/^/gm, ' '),
''
].join('\n');
};
Expand All @@ -1093,17 +1093,17 @@ Command.prototype.helpInformation = function() {
var desc = [];
if (this._description) {
desc = [
' ' + this._description,
this._description,
''
];

var argsDescription = this._argsDescription;
if (argsDescription && this._args.length) {
var width = this.padWidth();
desc.push(' Arguments:');
desc.push('Arguments:');
desc.push('');
this._args.forEach(function(arg) {
desc.push(' ' + pad(arg.name, width) + ' ' + argsDescription[arg.name]);
desc.push(' ' + pad(arg.name, width) + ' ' + argsDescription[arg.name]);
});
desc.push('');
}
Expand All @@ -1114,8 +1114,7 @@ Command.prototype.helpInformation = function() {
cmdName = cmdName + '|' + this._alias;
}
var usage = [
'',
' Usage: ' + cmdName + ' ' + this.usage(),
'Usage: ' + cmdName + ' ' + this.usage(),
''
];

Expand All @@ -1124,17 +1123,16 @@ Command.prototype.helpInformation = function() {
if (commandHelp) cmds = [commandHelp];

var options = [
' Options:',
'Options:',
'',
'' + this.optionHelp().replace(/^/gm, ' '),
'' + this.optionHelp().replace(/^/gm, ' '),
''
];

return usage
.concat(desc)
.concat(options)
.concat(cmds)
.concat([''])
.join('\n');
};

Expand Down
4 changes: 2 additions & 2 deletions test/test.command.help.js
Expand Up @@ -5,8 +5,8 @@ var program = require('../')

program.command('bare');

program.commandHelp().should.equal(' Commands:\n\n bare\n');
program.commandHelp().should.equal('Commands:\n\n bare\n');

program.command('mycommand [options]');

program.commandHelp().should.equal(' Commands:\n\n bare\n mycommand [options]\n');
program.commandHelp().should.equal('Commands:\n\n bare\n mycommand [options]\n');
15 changes: 7 additions & 8 deletions test/test.command.helpInformation.js
Expand Up @@ -7,18 +7,17 @@ program.command('somecommand');
program.command('anothercommand [options]');

var expectedHelpInformation = [
'Usage: [options] [command]',
'',
' Usage: [options] [command]',
'Options:',
'',
' Options:',
' -h, --help output usage information',
'',
' -h, --help output usage information',
'Commands:',
'',
' Commands:',
'',
' somecommand',
' anothercommand [options]',
'\n'
' somecommand',
' anothercommand [options]',
''
].join('\n');

program.helpInformation().should.equal(expectedHelpInformation);
2 changes: 1 addition & 1 deletion test/test.command.name.js
Expand Up @@ -18,7 +18,7 @@ program.commands[1].name().should.equal('help');
var output = process.stdout.write.args[0];

output[0].should.containEql([
' mycommand [options] this is my command'
' mycommand [options] this is my command'
].join('\n'));

sinon.restore();
8 changes: 4 additions & 4 deletions test/test.command.nohelp.js
Expand Up @@ -47,10 +47,10 @@ process.stdout.write.args.length.should.equal(1);
var output = process.stdout.write.args[0];

var expect = [
' Commands:',
'Commands:',
'',
' mycommand [options] this is my command',
' anothercommand [options]',
' help [cmd] display help for [cmd]'
' mycommand [options] this is my command',
' anothercommand [options]',
' help [cmd] display help for [cmd]'
].join('\n');
output[0].indexOf(expect).should.not.be.equal(-1);

0 comments on commit 713db77

Please sign in to comment.