l0bsterssg

node.js static responsive blog post generator
Log | Files | Refs | README

readme.markdown (10028B)


      1 optimist
      2 ========
      3 
      4 Optimist is a node.js library for option parsing for people who hate option
      5 parsing. More specifically, this module is for people who like all the --bells
      6 and -whistlz of program usage but think optstrings are a waste of time.
      7 
      8 With optimist, option parsing doesn't have to suck (as much).
      9 
     10 [![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)
     11 
     12 examples
     13 ========
     14 
     15 With Optimist, the options are just a hash! No optstrings attached.
     16 -------------------------------------------------------------------
     17 
     18 xup.js:
     19 
     20 ````javascript
     21 #!/usr/bin/env node
     22 var argv = require('optimist').argv;
     23 
     24 if (argv.rif - 5 * argv.xup > 7.138) {
     25     console.log('Buy more riffiwobbles');
     26 }
     27 else {
     28     console.log('Sell the xupptumblers');
     29 }
     30 ````
     31 
     32 ***
     33 
     34     $ ./xup.js --rif=55 --xup=9.52
     35     Buy more riffiwobbles
     36     
     37     $ ./xup.js --rif 12 --xup 8.1
     38     Sell the xupptumblers
     39 
     40 ![This one's optimistic.](http://substack.net/images/optimistic.png)
     41 
     42 But wait! There's more! You can do short options:
     43 -------------------------------------------------
     44  
     45 short.js:
     46 
     47 ````javascript
     48 #!/usr/bin/env node
     49 var argv = require('optimist').argv;
     50 console.log('(%d,%d)', argv.x, argv.y);
     51 ````
     52 
     53 ***
     54 
     55     $ ./short.js -x 10 -y 21
     56     (10,21)
     57 
     58 And booleans, both long and short (and grouped):
     59 ----------------------------------
     60 
     61 bool.js:
     62 
     63 ````javascript
     64 #!/usr/bin/env node
     65 var util = require('util');
     66 var argv = require('optimist').argv;
     67 
     68 if (argv.s) {
     69     util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
     70 }
     71 console.log(
     72     (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
     73 );
     74 ````
     75 
     76 ***
     77 
     78     $ ./bool.js -s
     79     The cat says: meow
     80     
     81     $ ./bool.js -sp
     82     The cat says: meow.
     83 
     84     $ ./bool.js -sp --fr
     85     Le chat dit: miaou.
     86 
     87 And non-hypenated options too! Just use `argv._`!
     88 -------------------------------------------------
     89  
     90 nonopt.js:
     91 
     92 ````javascript
     93 #!/usr/bin/env node
     94 var argv = require('optimist').argv;
     95 console.log('(%d,%d)', argv.x, argv.y);
     96 console.log(argv._);
     97 ````
     98 
     99 ***
    100 
    101     $ ./nonopt.js -x 6.82 -y 3.35 moo
    102     (6.82,3.35)
    103     [ 'moo' ]
    104     
    105     $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz
    106     (0.54,1.12)
    107     [ 'foo', 'bar', 'baz' ]
    108 
    109 Plus, Optimist comes with .usage() and .demand()!
    110 -------------------------------------------------
    111 
    112 divide.js:
    113 
    114 ````javascript
    115 #!/usr/bin/env node
    116 var argv = require('optimist')
    117     .usage('Usage: $0 -x [num] -y [num]')
    118     .demand(['x','y'])
    119     .argv;
    120 
    121 console.log(argv.x / argv.y);
    122 ````
    123 
    124 ***
    125  
    126     $ ./divide.js -x 55 -y 11
    127     5
    128     
    129     $ node ./divide.js -x 4.91 -z 2.51
    130     Usage: node ./divide.js -x [num] -y [num]
    131 
    132     Options:
    133       -x  [required]
    134       -y  [required]
    135 
    136     Missing required arguments: y
    137 
    138 EVEN MORE HOLY COW
    139 ------------------
    140 
    141 default_singles.js:
    142 
    143 ````javascript
    144 #!/usr/bin/env node
    145 var argv = require('optimist')
    146     .default('x', 10)
    147     .default('y', 10)
    148     .argv
    149 ;
    150 console.log(argv.x + argv.y);
    151 ````
    152 
    153 ***
    154 
    155     $ ./default_singles.js -x 5
    156     15
    157 
    158 default_hash.js:
    159 
    160 ````javascript
    161 #!/usr/bin/env node
    162 var argv = require('optimist')
    163     .default({ x : 10, y : 10 })
    164     .argv
    165 ;
    166 console.log(argv.x + argv.y);
    167 ````
    168 
    169 ***
    170 
    171     $ ./default_hash.js -y 7
    172     17
    173 
    174 And if you really want to get all descriptive about it...
    175 ---------------------------------------------------------
    176 
    177 boolean_single.js
    178 
    179 ````javascript
    180 #!/usr/bin/env node
    181 var argv = require('optimist')
    182     .boolean('v')
    183     .argv
    184 ;
    185 console.dir(argv);
    186 ````
    187 
    188 ***
    189 
    190     $ ./boolean_single.js -v foo bar baz
    191     true
    192     [ 'bar', 'baz', 'foo' ]
    193 
    194 boolean_double.js
    195 
    196 ````javascript
    197 #!/usr/bin/env node
    198 var argv = require('optimist')
    199     .boolean(['x','y','z'])
    200     .argv
    201 ;
    202 console.dir([ argv.x, argv.y, argv.z ]);
    203 console.dir(argv._);
    204 ````
    205 
    206 ***
    207 
    208     $ ./boolean_double.js -x -z one two three
    209     [ true, false, true ]
    210     [ 'one', 'two', 'three' ]
    211 
    212 Optimist is here to help...
    213 ---------------------------
    214 
    215 You can describe parameters for help messages and set aliases. Optimist figures
    216 out how to format a handy help string automatically.
    217 
    218 line_count.js
    219 
    220 ````javascript
    221 #!/usr/bin/env node
    222 var argv = require('optimist')
    223     .usage('Count the lines in a file.\nUsage: $0')
    224     .demand('f')
    225     .alias('f', 'file')
    226     .describe('f', 'Load a file')
    227     .argv
    228 ;
    229 
    230 var fs = require('fs');
    231 var s = fs.createReadStream(argv.file);
    232 
    233 var lines = 0;
    234 s.on('data', function (buf) {
    235     lines += buf.toString().match(/\n/g).length;
    236 });
    237 
    238 s.on('end', function () {
    239     console.log(lines);
    240 });
    241 ````
    242 
    243 ***
    244 
    245     $ node line_count.js
    246     Count the lines in a file.
    247     Usage: node ./line_count.js
    248 
    249     Options:
    250       -f, --file  Load a file  [required]
    251 
    252     Missing required arguments: f
    253 
    254     $ node line_count.js --file line_count.js 
    255     20
    256     
    257     $ node line_count.js -f line_count.js 
    258     20
    259 
    260 methods
    261 =======
    262 
    263 By itself,
    264 
    265 ````javascript
    266 require('optimist').argv
    267 `````
    268 
    269 will use `process.argv` array to construct the `argv` object.
    270 
    271 You can pass in the `process.argv` yourself:
    272 
    273 ````javascript
    274 require('optimist')([ '-x', '1', '-y', '2' ]).argv
    275 ````
    276 
    277 or use .parse() to do the same thing:
    278 
    279 ````javascript
    280 require('optimist').parse([ '-x', '1', '-y', '2' ])
    281 ````
    282 
    283 The rest of these methods below come in just before the terminating `.argv`.
    284 
    285 .alias(key, alias)
    286 ------------------
    287 
    288 Set key names as equivalent such that updates to a key will propagate to aliases
    289 and vice-versa.
    290 
    291 Optionally `.alias()` can take an object that maps keys to aliases.
    292 
    293 .default(key, value)
    294 --------------------
    295 
    296 Set `argv[key]` to `value` if no option was specified on `process.argv`.
    297 
    298 Optionally `.default()` can take an object that maps keys to default values.
    299 
    300 .demand(key)
    301 ------------
    302 
    303 If `key` is a string, show the usage information and exit if `key` wasn't
    304 specified in `process.argv`.
    305 
    306 If `key` is a number, demand at least as many non-option arguments, which show
    307 up in `argv._`.
    308 
    309 If `key` is an Array, demand each element.
    310 
    311 .describe(key, desc)
    312 --------------------
    313 
    314 Describe a `key` for the generated usage information.
    315 
    316 Optionally `.describe()` can take an object that maps keys to descriptions.
    317 
    318 .options(key, opt)
    319 ------------------
    320 
    321 Instead of chaining together `.alias().demand().default()`, you can specify
    322 keys in `opt` for each of the chainable methods.
    323 
    324 For example:
    325 
    326 ````javascript
    327 var argv = require('optimist')
    328     .options('f', {
    329         alias : 'file',
    330         default : '/etc/passwd',
    331     })
    332     .argv
    333 ;
    334 ````
    335 
    336 is the same as
    337 
    338 ````javascript
    339 var argv = require('optimist')
    340     .alias('f', 'file')
    341     .default('f', '/etc/passwd')
    342     .argv
    343 ;
    344 ````
    345 
    346 Optionally `.options()` can take an object that maps keys to `opt` parameters.
    347 
    348 .usage(message)
    349 ---------------
    350 
    351 Set a usage message to show which commands to use. Inside `message`, the string
    352 `$0` will get interpolated to the current script name or node command for the
    353 present script similar to how `$0` works in bash or perl.
    354 
    355 .check(fn)
    356 ----------
    357 
    358 Check that certain conditions are met in the provided arguments.
    359 
    360 If `fn` throws or returns `false`, show the thrown error, usage information, and
    361 exit.
    362 
    363 .boolean(key)
    364 -------------
    365 
    366 Interpret `key` as a boolean. If a non-flag option follows `key` in
    367 `process.argv`, that string won't get set as the value of `key`.
    368 
    369 If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be
    370 `false`.
    371 
    372 If `key` is an Array, interpret all the elements as booleans.
    373 
    374 .string(key)
    375 ------------
    376 
    377 Tell the parser logic not to interpret `key` as a number or boolean.
    378 This can be useful if you need to preserve leading zeros in an input.
    379 
    380 If `key` is an Array, interpret all the elements as strings.
    381 
    382 .wrap(columns)
    383 --------------
    384 
    385 Format usage output to wrap at `columns` many columns.
    386 
    387 .help()
    388 -------
    389 
    390 Return the generated usage string.
    391 
    392 .showHelp(fn=console.error)
    393 ---------------------------
    394 
    395 Print the usage data using `fn` for printing.
    396 
    397 .parse(args)
    398 ------------
    399 
    400 Parse `args` instead of `process.argv`. Returns the `argv` object.
    401 
    402 .argv
    403 -----
    404 
    405 Get the arguments as a plain old object.
    406 
    407 Arguments without a corresponding flag show up in the `argv._` array.
    408 
    409 The script name or node command is available at `argv.$0` similarly to how `$0`
    410 works in bash or perl.
    411 
    412 parsing tricks
    413 ==============
    414 
    415 stop parsing
    416 ------------
    417 
    418 Use `--` to stop parsing flags and stuff the remainder into `argv._`.
    419 
    420     $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4
    421     { _: [ '-c', '3', '-d', '4' ],
    422       '$0': 'node ./examples/reflect.js',
    423       a: 1,
    424       b: 2 }
    425 
    426 negate fields
    427 -------------
    428 
    429 If you want to explicity set a field to false instead of just leaving it
    430 undefined or to override a default you can do `--no-key`.
    431 
    432     $ node examples/reflect.js -a --no-b
    433     { _: [],
    434       '$0': 'node ./examples/reflect.js',
    435       a: true,
    436       b: false }
    437 
    438 numbers
    439 -------
    440 
    441 Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to
    442 one. This way you can just `net.createConnection(argv.port)` and you can add
    443 numbers out of `argv` with `+` without having that mean concatenation,
    444 which is super frustrating.
    445 
    446 duplicates
    447 ----------
    448 
    449 If you specify a flag multiple times it will get turned into an array containing
    450 all the values in order.
    451 
    452     $ node examples/reflect.js -x 5 -x 8 -x 0
    453     { _: [],
    454       '$0': 'node ./examples/reflect.js',
    455         x: [ 5, 8, 0 ] }
    456 
    457 dot notation
    458 ------------
    459 
    460 When you use dots (`.`s) in argument names, an implicit object path is assumed.
    461 This lets you organize arguments into nested objects.
    462 
    463      $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5
    464      { _: [],
    465        '$0': 'node ./examples/reflect.js',
    466          foo: { bar: { baz: 33 }, quux: 5 } }
    467 
    468 installation
    469 ============
    470 
    471 With [npm](http://github.com/isaacs/npm), just do:
    472     npm install optimist
    473  
    474 or clone this project on github:
    475 
    476     git clone http://github.com/substack/node-optimist.git
    477 
    478 To run the tests with [expresso](http://github.com/visionmedia/expresso),
    479 just do:
    480     
    481     expresso
    482 
    483 inspired By
    484 ===========
    485 
    486 This module is loosely inspired by Perl's
    487 [Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).