• This repository has been archived on 26/Sep/2023
  • Stars
    star
    470
  • Rank 93,399 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 14 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Option parser for node with generated usage and commands

deprecation notice

Nomnom is deprecated. Check out https://github.com/tj/commander.js, which should have most, if not all of the capability that nomnom had. Thank you!

nomnom

nomnom is an option parser for node. It noms your args and gives them back to you in a hash.

var opts = require("nomnom")
   .option('debug', {
      abbr: 'd',
      flag: true,
      help: 'Print debugging info'
   })
   .option('config', {
      abbr: 'c',
      default: 'config.json',
      help: 'JSON file with tests to run'
   })
   .option('version', {
      flag: true,
      help: 'print version and exit',
      callback: function() {
         return "version 1.2.4";
      }
   })
   .parse();

if (opts.debug)
   // do stuff

You don't have to specify anything if you don't want to:

var opts = require("nomnom").parse();

var url = opts[0];     // get the first positional arg
var file = opts.file   // see if --file was specified
var verbose = opts.v   // see if -v was specified
var extras = opts._    // get an array of the unmatched, positional args

Install

for node.js and npm:

npm install nomnom

More Details

Nomnom supports args like -d, --debug, --no-debug, --file=test.txt, --file test.txt, -f test.txt, -xvf, and positionals. Positionals are arguments that don't fit the -a or --atomic format and aren't attached to an option.

Values are JSON parsed, so --debug=true --count=3 --file=log.txt would give you:

{
   "debug": true,
   "count": 3,
   "file": "log.txt"
}

Commands

Nomnom supports command-based interfaces (e.g. with git: git add -p and git rebase -i where add and rebase are the commands):

var parser = require("nomnom");

parser.command('browser')
   .callback(function(opts) {
      runBrowser(opts.url);
   })
   .help("run browser tests");

parser.command('sanity')
   .option('outfile', {
      abbr: 'o',
      help: "file to write results to"
   })
   .option('config', {
      abbr: 'c',
      default: 'config.json',
      help: "json manifest of tests to run"
   })
   .callback(function(opts) {
      runSanity(opts.filename);
   })
   .help("run the sanity tests")

parser.parse();

Each command generates its own usage message when -h or --help is specified with the command.

Usage

Nomnom prints out a usage message if --help or -h is an argument. Usage for these options in test.js:

var opts = require("nomnom")
   .script("runtests")
   .options({
      path: {
         position: 0,
         help: "Test file to run",
         list: true
      },
      config: {
         abbr: 'c',
         metavar: 'FILE',
         help: "Config file with tests to run"
      },
      debug: {
         abbr: 'd',
         flag: true,
         help: "Print debugging info"
      }
   }).parse();

...would look like this:

usage: runtests <path>... [options]

path     Test file to run

options:
   -c FILE, --config FILE   Config file with tests to run
   -d, --debug              Print debugging info

Options

You can either add a specification for an option with nomnom.option('name', spec) or pass the specifications to nomnom.options() as a hash keyed on option name. Each option specification can have the following fields:

abbr and full

abbr is the single character string to match to this option, full is the full-length string (defaults to the name of the option).

This option matches -d and --debug on the command line:

nomnom.option('debug', {
   abbr: 'd'
})

This option matches -n 3, --num-lines 12 on the command line:

nomnom.option('numLines', {
   abbr: 'n',
   full: 'num-lines'
})

flag

If this is set to true, the option acts as a flag and doesn't swallow the next value on the command line. Default is false, so normally if you had a command line --config test.js, config would get a value of test.js in the options hash. Whereas if you specify:

nomnom.option('config', {
   flag: true
})

config would get a value of true in the options hash, and test.js would be a free positional arg.

metavar

metavar is used in the usage printout e.g. "PATH" in "-f PATH, --file PATH".

string

A shorthand for abbr, full, and metavar. For example, to attach an option to -c and --config use a string: "-c FILE, --config=FILE"

help

A string description of the option for the usage printout.

default

The value to give the option if it's not specified in the arguments.

type

If you don't want the option JSON-parsed, specify type "string".

callback

A callback that will be executed as soon as the option is encountered. If the callback returns a string it will print the string and exit:

nomnom.option('count', {
   callback: function(count) {
      if (count != parseInt(count)) {
         return "count must be an integer";
      }
   }
})

position

The position of the option if it's a positional argument. If the option should be matched to the first positional arg use position 0, etc.

list

Specifies that the option is a list. Appending can be achieved by specifying the arg more than once on the command line:

node test.js --file=test1.js --file=test2.js

If the option has a position and list is true, all positional args including and after position will be appended to the array.

required

If this is set to true and the option isn't in the args, a message will be printed and the program will exit.

choices

A list of the possible values for the option (e.g. ['run', 'test', 'open']). If the parsed value isn't in the list a message will be printed and the program will exit.

transform

A function that takes the value of the option as entered and returns a new value that will be seen as the value of the option.

nomnom.option('date', {
   abbr: 'd',
   transform: function(timestamp) {
     return new Date(timestamp);
   }
})

hidden

Option won't be printed in the usage

Parser interface

require("nomnom") will give you the option parser. You can also make an instance of a parser with require("nomnom")(). You can chain any of these functions off of a parser:

option

Add an option specification with the given name:

nomnom.option('debug', {
   abbr: 'd',
   flag: true,
   help: "Print debugging info"
})

options

Add options as a hash keyed by option name, good for a cli with tons of options like this example:

nomnom.options({
   debug: {
      abbr: 'd',
      flag: true,
      help: "Print debugging info"
   },
   fruit: {
      help: "Fruit to buy"
   }
})

usage

The string that will override the default generated usage message.

help

A string that is appended to the usage.

script

Nomnom can't detect the alias used to run your script. You can use script to provide the correct name for the usage printout instead of e.g. node test.js.

printer

Overrides the usage printing function.

command

Takes a command name and gives you a command object on which you can chain command options.

nocommand

Gives a command object that will be used when no command is called.

nocolors

Disables coloring of the usage message.

parse

Parses node's process.argv and returns the parsed options hash. You can also provide argv:

var opts = nomnom.parse(["-xvf", "--atomic=true"])

nom

The same as parse().

Command interface

A command is specified with nomnom.command('name'). All these functions can be chained on a command:

option

Add an option specifically for this command.

options

Add options for this command as a hash of options keyed by name.

callback

A callback that will be called with the parsed options when the command is used.

help

A help string describing the function of this command.

usage

Override the default generated usage string for this command.

More Repositories

1

brain

Simple feed-forward neural network in JavaScript
JavaScript
8,006
star
2

kittydar

Face detection for cats in JavaScript - demo for TXJS 2012 talk
JavaScript
1,419
star
3

replace

Command line search and replace utility
JavaScript
748
star
4

classifier

Bayesian classifier with Redis backend
JavaScript
625
star
5

clustering

K-means and hierarchical clustering
JavaScript
498
star
6

hog-descriptor

[UNMAINTAINED] Histogram of Oriented Gradients (HOG) descriptor extractor
JavaScript
169
star
7

glossary

[UNMAINTAINED] Extract terms and keywords from a piece of text
JavaScript
168
star
8

fxconsole

[UNMAINTAINED] Remote JavaScript console for Firefox
JavaScript
127
star
9

firefox-client

[UNMAINTAINED] Node.js remote debugging client for Firefox
JavaScript
100
star
10

costco

UI for bulk editing CouchDB docs
JavaScript
56
star
11

js-select

[UNMAINTAINED] Traverse and modify objects using JSONSelect selectors
JavaScript
56
star
12

rainbow

Color tools for Firefox
JavaScript
39
star
13

txjs-slides

dzslides deck for my txjs talk
CSS
14
star
14

mac-sounds

Play default OS X sounds from node
JavaScript
9
star
15

bzhome

Bugzilla dashboard
JavaScript
8
star
16

passion-project-slides

Slides for my Passion Projects talk on Machine Learning and JS
JavaScript
7
star
17

tcm

Mozilla's new testcase manager
JavaScript
5
star
18

detect-indent

CSS
5
star
19

searchbugs

Search for Bugzilla bugs by component
JavaScript
4
star
20

test-pages

Testcase websites for devtools
JavaScript
3
star
21

devtools-guide

3
star
22

showsearch

Jetpack that shows search terms in Firefox's awesomebar
JavaScript
3
star
23

firefontfamily

A Firebug extension that highlights the rendered font-family
JavaScript
2
star
24

contextfont

Firefox addon to find fonts on websites
JavaScript
2
star
25

celestial-snips-app

Snips voice assistant that answers celestial questions
Python
2
star
26

mini-devtools

mini in-content devtools
JavaScript
2
star
27

artfulimage

The Artful Image fine printing
2
star
28

bztweaks

mirror of Bugzilla Tweaks Firefox addon (https://bitbucket.org/ehsan/bugzilla-tweaks)
JavaScript
2
star
29

fluent-talk

JavaScript
1
star
30

bugidhelper

Bugzilla bug id linkifier and tooltipifier extension
JavaScript
1
star
31

brooklynjs-slides

Write your own in-content devtools with web APIs
CSS
1
star
32

test-snips-calc

Test Snips Calc Action
Python
1
star
33

harth

harth's no.de code
1
star
34

wwcode

A small website for Women Who Code SF
JavaScript
1
star
35

celestial-jupyter

Jupyter Notebook
1
star
36

test.js

Whatever's in my ~/test.js
JavaScript
1
star