Files
nexe/node_modules/celeri/README.md
T
2011-11-26 17:00:12 -06:00

5.5 KiB
Executable File

C-e-L-er-I

Alt command line

Features:

  • History (up/down arrows)
  • Progress Bar
  • Loading/busy spinner
  • Password input
  • Confirmation
  • Prompt
  • Multi-line tables
  • Build flexible commands via beanpole
    • OR statement
    • Middleware
    • Parameters
  • Trees

To Do:

  • Help menu api
  • Title View
  • Custom colors for each view (input, loader, progress, table, etc.): exports.colors = {}
  • Error handling (display of command not found)
  • Add transports instead of depending on native stdin/stdout
    • Ability to use online

Usage:

.on(event, callback)

Listens for a key (enter, up, left, backspace, etc.), or command. See beanpole for documentation.

Hello World:


var celeri = require('celeri');

celeri.on('hello :name', function(data)
{
   console.log("Hello %s!", data.name); 
});

//open up character input!
celeri.open();

//parse the command line args
celeri.parse(process.argv);

In terminal:

node ./hello ↩
> hello world ↩
hello world!

passed as arguments:

node ./hello hello:world ↩
hello world!

"OR" statement:



celeri.on('hello :name OR hi :name', function(data)
{
	console.log('Hello ' + data.name +'!');
});

celeri.on('set address :zip OR set address :city :state :zip', function(data)
{
	console.log("City: %s, State: %s, Zip: %s ", data.city || 'None provided', data.state || 'None provided', data.zip);
});

Middleware "->" statement:


celeri.on('delay :seconds', function(data)
{
    console.log("delaying for %s seconds", data.seconds);

    setTimeout(function(self)
    {
        if(!self.next()) console.log("done!");
    }, Number(data.seconds) * 1000, this);
});


celeri.on('delay 1 -> say hello :name', function(data)
{
   console.log('hello %s!', data.name); 
});

here's what you get:

> delay 5 ↩
delaying for 5 seconds
done
> say hello craig ↩
delaying for 1 seconds
hello craig!

.progress(label, percent)


var i = 0;

var interval = setInterval(function()
{
	celeri.progress('Label: ', i++);
	
	if(i == 100) clearInterval(i);
}, 10);

.loading(label)


var spinner = celeri.loading('Processing: ');

setTimeout(function()
{
	spinner.done(true);//undefined = done, true = success, false = fail
}, 1000);

.prompt(label, callback)


celeri.prompt('Username: ', function(input)
{
	
});

.confirm(message, callback)


celeri.confirm("Do you want to continue?", function(yes)
{
	if(yes)
	{
		//continue
	}
});

.password(label[, mask], callback)

	
//mask = *
celeri.password('Password: ', '*', function(input)
{
	//password
});

//no mask
celeri.password('Password: ', function(input)
{
	//password
});

.auth(callback)


celeri.auth(function(user, pass)
{
	//auth here
});

.loadHelp(filePath)


celeri.on('help', function()
{
	celeri.loadHelp(__dirname +'/help.txt');
});

.drawTable(objects, ops)


var objects = [
    
    {
        name: 'Craig',
        age: 21,
        interests: 'Cooking, espresso, backpacking, coding'
    },
    
    
    {
        name: 'Tim',
        age: 21,
        interests: 'Design, Traveling, Photography'
        
    }

];

celeri.drawTable(objects, {
    columns: ['name','age','interests']
});


Gives you something like:

Alt command line

Here's a multi-line table:

Alt command line

.drawTree(tree)

Draws a tree

                        
//print out the contents of the celeri object
celeri.drawTree(celeri);    

Here's another example:

Alt command line

Let's kick it up a notch


var celeri = require('../lib');


var credentials;


 
celeri.on('login OR login :user :pass', function(data)
{
    
    //reference to the current request
    var self = this;
    

    //called after auth credentials have been entered in
    function onAuth(creds)
    {

        //credits wrong? DO NOT CONTINUE
        if(creds.user != 'user' || creds.pass != 'pass')
        {
            return console.log("Incorrect user / pass".red);
        }
        
        //otherwise, add the user to the CURRENT request so it can be passed
        //onto the next route listener
        self.user = creds.user;
        
        //cache the credentials so the user doesn't have to login each time
        credentials = creds;
        
        //not another listener? display a success response
        if(!self.next()) console.log("Logged in as %s", creds.user.green);
    }
    
    
    //user already logged in? pass!
    if(credentials)
    {
        onAuth(credentials);
    }
    
    //otherwise check if the user is passed in the route
    else
    if(data.user && data.pass)
    {
        onAuth(data);
    }
    
    //or prompt for authentication
    else
    {
        celeri.auth(function(user, pass)
        {
            onAuth({ user: user, pass: pass });
        });
    }
});



/**
 * This stuff's private. The user has to be authenticated *before* this command is executed
 */
 
celeri.on('login -> account', function()
{
    console.log('Here\'s your account info %s!', this.user.green);
});

celeri.open();



celeri.parse(process.argv);


Here's what you get:

Alt command line