pipe-dreams
v0.0.4
Published
Create pipeable commands String them together using standard unix methods such as
Downloads
2
Readme
#Pipe Dreams Create pipeable commands String them together using standard unix methods such as
##Pre-Requesites You must install node [and npm] before using.
##Installation ###npm Install using npm
#!/bin/bash
npm install -g pipe-dreams
###docker Install with docker (experimental)
#!/bin/bash
git clone [email protected]:johnhenry/pipe-dreams.git
cd pipe-dreams
docker build -t pipe-dreams .
alias pipe-dreams='docker run -it pipe-dreams ./bin/index.js'
##Usage
#!/bin/bash
pipe-dreams [command]
##Commands
###node Pipe Data through node modules
#!/bin/bash
pipe-dreams node [options]
####Push modules Data can be fead from a module into standard output.
#!/bin/bash
pipe-dreams node [path to module]
A push module takes an init object and exports an event dispatcher that dispatches a 'message' event.
#####Example The following example displays sends the current date to standard the output stream every 0.5 to 2.0 seconds
//file:///example/node/push/random-time.js
module.exports = () => {
let messageFunc;
const addEventListener = (event, func) => messageFunc = func;
const interrupt = () => {
if(messageFunc) messageFunc(new Date() + '\n');
setTimeout(interrupt, Math.random() * 2000 + 500);
};
interrupt();
return {addEventListener};
}
#file:///example/node/push/push-modules.sh
alias random-time='pipe-dreams node example/node/push/random-time.js'
#!/bin/bash
source example/node/push/push-modules.sh
#!/bin/bash
random-time
Sun Jun 05 2016 12:51:37 GMT-0700 (PDT)
Sun Jun 05 2016 12:51:39 GMT-0700 (PDT)
Sun Jun 05 2016 12:51:40 GMT-0700 (PDT)
Sun Jun 05 2016 12:51:43 GMT-0700 (PDT)
Sun Jun 05 2016 12:51:44 GMT-0700 (PDT)
Sun Jun 05 2016 12:51:46 GMT-0700 (PDT)
Sun Jun 05 2016 12:51:49 GMT-0700 (PDT)
####Pull modules Data can be transformed and sent to standard output.
#!/bin/bash
pipe-dreams node [path to transformation module]
A pull module takes an init object and exports function. This function may either a flat object or a promise to be unwrapped.
If this command is the first in a series of commands, it will read input typed into the command line.
#####Example The following example accepts user input and evaluates it
//file:///example/node/pull/js-eval.js
module.exports = (init) => (input) => JSON.stringify({input:input.stdin, output:eval(input.stdin)});
#file:///example/node/pull/pull-modules.sh
alias js-eval='pipe-dreams node example/node/pull/js-eval.js'
#!/bin/bash
source example/node/pull/pull-modules.sh
#!/bin/bash
js-eval
>1
{"input":"1", output:"1"}
>1+1
{"input":"1+1", output:"2"}
####Dual modules Modules can function as both push and pull modules.
#####Example The following combines a push and a pull module into one.
//file:///example/node/pushpull/pushpull.js
module.exports = (init) => {
return Object.assign(
require('../pull/js-eval')(init),
require('../push/random-time')(init));
};
#file:///example/node/pushpull/pushpull-modules.sh
alias push-pull='pipe-dreams node example/node/pushpull/pushpull.js'
#!/bin/bash
source example/node/pushpull/pushpull-modules.sh
#!/bin/bash
push-pull
>1
{"input":"1", output:"1"}
>1+1
{"input":"1+1", output:"2"}
####Pipe Commands Commands can be piped into one another
#####Example
The following example first sends the users's input to google, then extracts the title of the page from the response, and finally prompts the user for more input.
//file:///example/node/pull/query.js
const fetch = require('node-fetch');
module.exports = (init) => (query) => fetch(`${query.search}${query.stdin}`)
.then(response=>response.text())
.then(body=>JSON.stringify({body}));
//file:///example/node/pull/extract-title.js
const cheerio = require('cheerio');
module.exports = (init) => (response)=>{
try{
const $ = cheerio.load(JSON.parse(response.stdin).body);
const title = $('title').html();
return Promise.resolve(JSON.stringify({title}));
}catch(error){
return Promise.reject(error);
}
}
//file:///example/node/pull/prompt-next.js
module.exports = (init) => (input) => input.stdin + '\nnext?\n';
#file:///example/node/pipe-commands.sh
alias duckduckgo-query='pipe-dreams node example/node/pull/query.js --init.search="https://duckduckgo.com/?q="'
alias google-query='pipe-dreams node example/node/pull/query.js --init.search="https://www.google.com/search?q="'
alias extract-title='pipe-dreams node example/node/pull/extract-title.js -u title'
alias prompt-next='pipe-dreams node example/node/pull/prompt-next.js'
alias search='duckduckgo-query | extract-title | prompt-next'
#!/bin/bash
source example/node/pipe-commands.sh
#!/bin/bash
search
####Redirection You can take advantage of standard unix redirection to create a fully modular application,
#####Example
In addition to displaying expected output, the following command will write successful responses and errors to files "success.log" and "error.log" respectively.
#file:///example/node/redirection.sh
source example/node/pull/pull-modules.sh &&
alias calculator='js-eval \
1> >(>> success.log) 2> >(>> error.log) \
| cat'
source example/node/redirection.sh
#!/bin/bash
calculator