diff --git a/.gitignore b/.gitignore index 204ade5..65b85ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ +test/ bin/ diff --git a/.npmignore b/.npmignore index 9781602..dfb9347 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,3 @@ src/ +test.json build.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f1f389 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# Pert + +Pert is a command line tool built to assist in the process of creating pert diagrams and calculating permitted delays. + +## Installation + +Make sure you have `node` and `npm` installed and working + +__From git__ + +1. clone this repo and run `build.sh` +2. run `bin/pert` + +__From npm__ + +1. `npm install -g pert` +2. run `pert` in your shell + +## Usage + + Usage: pert loads activity data from JSON and computes the possible activity delays + + Commands: + + example show an example of the JSON data format + calculate|c [options] calculate data on given JSON document + + Options: + + -h, --help output usage information + -V, --version output the version number + --verbose be verbose (for debugging) + +This is the help information for the `pert calculate` command: + + Usage: calculate|c [options] + + calculate data on given JSON document + + Options: + + -h, --help output usage information + -j, --json output json data + +## Data format + +This is a valid input document: + +```json +[ + {"id": 0, "duration": 3}, + {"id": 1, "duration": 1}, + {"id": 2, "duration": 2, "depends": [0]}, + {"id": 3, "duration": 5, "depends": [1]}, + {"id": 4, "duration": 5, "depends": [1]}, + {"id": 5, "duration": 2, "depends": [2,3,4]} +] +``` + +And this is the output of the `calculate` command on the previous document using the `--json` flag: + +```json +[{"id":0,"duration":3,"startDay":0,"endDay":3,"permittedDelay":0},{"id":1,"duration":1,"startDay":0,"endDay":1,"permittedDelay":0},{"id":2,"duration":2,"depends":[0],"startDay":3,"endDay":5,"permittedDelay":1},{"id":3,"duration":5,"depends":[1],"startDay":1,"endDay":6,"permittedDelay":0},{"id":4,"duration":5,"depends":[1],"startDay":1,"endDay":6,"permittedDelay":0},{"id":5,"duration":2,"depends":[2,3,4],"startDay":6,"endDay":8}] +``` + +## License + +MIT diff --git a/package.json b/package.json index 1f3c760..b87a59b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pert", - "version": "0.0.1", + "version": "0.1.0", "description": "pert diagram calculator", "main": "pert.coffee", "bin": { diff --git a/src/pert.coffee b/src/pert.coffee index 94c7588..4719945 100755 --- a/src/pert.coffee +++ b/src/pert.coffee @@ -1,9 +1,9 @@ #!/usr/bin/env coffee chalk = require 'chalk' +cli = require 'commander' +fs = require 'fs' -verbose = no - -log = (x...) -> if verbose then console.log chalk.bold("Log:"), x... +log = (x...) -> if cli.verbose then console.log chalk.bold("Log:"), x... err = (x...) -> console.log chalk.bold (chalk.red "Error:"), x... # Returns the highest number in an array of numbers @@ -28,16 +28,19 @@ calculateEndDay = (item,list) -> # Find out which day the activity starts calculateStartDay = (item,list) -> - if item.depends.length is 0 then return item.startDay = 0 - max = maxa item.depends.map((x) -> toActivity x,list).map((x) -> calculateEndDay x, list) - log "start day of",item.id,"is",max + if !item.depends? or item.depends.length is 0 then return item.startDay = 0 + item.startDay = maxa item.depends.map((x) -> toActivity x,list).map((x) -> calculateEndDay x, list) + log "start day of",item.id,"is",item.startDay # write max delay time to each depend item.depends.forEach (x) -> - log "writing permittedDelay to dependency", x, "of", item + log "checking permittedDelay to dependency", x, "of", item i = toActivity x, list - i.permittedDelay = max - calculateEndDay i, list + if !i.permittedDelay? + i.permittedDelay = item.startDay - calculateEndDay i, list + log "written permittedDelay to dependency", x, "of", item, "as", i.permittedDelay + else log "aborting permittedDelay: already calculated" log "permitted delay of",x,"is",i.permittedDelay - return item.startDay = max + return item.startDay # Find out which activity has the highest id highestID = (list) -> return maxa(list.map (x) -> x.id) @@ -47,4 +50,36 @@ calculate = (list) -> return list ex = [{id: 0, depends: [], duration: 2}, { id: 1, depends: [0], duration: 3},{id: 2, depends: [0,1], duration: 4}] -console.log calculate ex + +cli + .version '0.1' + .usage 'loads activity data from JSON and computes the possible activity delays' + .option '--verbose', 'be verbose (for debugging)' + +didSomething = no + +cli + .command 'example' + .description 'show an example of the JSON data format' + .action -> + didSomething = yes + console.log chalk.bold.green('Before:'), ex + console.log chalk.bold.green('After calculations:'), calculate ex + console.log chalk.green 'Tip:',chalk.bold 'optional fields can be freely included in the input data' + +cli + .command 'calculate ' + .description 'calculate data on given JSON document' + .alias 'c' + .option '-j, --json', 'output json data' + .action (file,options) -> + didSomething = yes + fs.readFile file, (error,content) -> + if error then err error + else + if options.json then console.log JSON.stringify (calculate JSON.parse(content)) + else console.log calculate JSON.parse(content) + +cli.parse process.argv + +if !didSomething then console.log chalk.green('Tip:'), 'see', chalk.bold(cli.name()+' --help')