From fd45d3caf344ab4c7133f94cda1b014ad52de02a Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Sat, 17 Feb 2018 04:33:39 +0530 Subject: [PATCH] resolves #132 fix options object (#171) * resolves #132 fix options object * Add Documentation for --details parameter * fix spacing issue * update naming of options parameter Signed-off-by: tech4GT --- README.md | 11 +++- index.js | 146 ++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 101 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 1d58b88d..1034709d 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ Image Sequencer also provides a CLI for applying operations to local files. The -s | --step [step-name] | Name of the step to be added. (required) -b | --basic | Basic mode only outputs the final image -o | --output [PATH] | Directory where output will be stored. (optional) - -op | --opions {object} | Options for the step. (optional) + -d | --details {object} | Options for the step. (optional) The basic format for using the CLI is as follows: @@ -116,6 +116,15 @@ The CLI also can take multiple steps at once, like so: But for this, double quotes must wrap the space-separated steps. +Options for the steps can be passed in one line as json in the details option like +``` +$ ./index.js -i [PATH] -s "brightness" -d '{"brightness":50}' + +``` +Or the values can be given through terminal prompt like + +screen shot 2018-02-14 at 5 18 50 pm + ## Classic Usage ### Initializing the Sequencer diff --git a/index.js b/index.js index 722a7ba0..9a82e17e 100755 --- a/index.js +++ b/index.js @@ -12,13 +12,13 @@ function exit(message) { } program - .version('0.1.0') - .option('-i, --image [PATH/URL]', 'Input image URL') - .option('-s, --step [step-name]', 'Name of the step to be added.') - .option('-o, --output [PATH]', 'Directory where output will be stored.') - .option('-b, --basic','Basic mode outputs only final image') - .option('-op, --opions {object}', 'Options for the step') - .parse(process.argv); +.version('0.1.0') +.option('-i, --image [PATH/URL]', 'Input image URL') +.option('-s, --step [step-name]', 'Name of the step to be added.') +.option('-o, --output [PATH]', 'Directory where output will be stored.') +.option('-b, --basic','Basic mode outputs only final image') +.option('-c, --config [Object]', 'Options for the step') +.parse(process.argv); // Parse step into an array to allow for multiple steps. if(!program.step) exit("No steps passed") @@ -34,79 +34,97 @@ require('fs').access(program.image, function(err){ // User must input a step. If steps exist, check that every step is a valid step. if(!program.step || !validateSteps(program.step)) - exit("Please ensure all steps are valid."); +exit("Please ensure all steps are valid."); // If there's no user defined output directory, select a default directory. program.output = program.output || "./output/"; // Set sequencer to log module outputs, if any. sequencer.setUI({ - + onComplete: function(step) { - + // Get information of outputs. step.info = sequencer.modulesInfo(step.name); - + for (var output in step.info.outputs) { console.log("["+program.step+"]: "+output+" = "+step[output]); } - + } - + }); // Finally, if everything is alright, load the image, add the steps and run the sequencer. sequencer.loadImages(program.image,function(){ - console.warn('\x1b[33m%s\x1b[0m', "The execution will be async\nYou may not see the output for a few seconds or minutes") - - //Generate the Output Directory - require('./src/CliUtils').makedir(program.output,()=>{ - console.log("Files will be exported to \""+program.output+"\""); - - if(program.basic) console.log("Basic mode is enabled, outputting only final image") - - // Iterate through the steps and retrieve their inputs. - program.step.forEach(function(step){ - var options = Object.assign({}, sequencer.modulesInfo(step).inputs); - - // If inputs exists, print to console. - if (Object.keys(options).length) { - console.log("[" + step + "]: Inputs"); - } - - // If inputs exists, print them out with descriptions. - Object.keys(options).forEach(function(input) { + console.warn('\x1b[33m%s\x1b[0m', "The execution will be async\nYou may not see the output for a few seconds or minutes") + + //Generate the Output Directory + require('./src/CliUtils').makedir(program.output,()=>{ + console.log("Files will be exported to \""+program.output+"\""); + + if(program.basic) console.log("Basic mode is enabled, outputting only final image") + + // Iterate through the steps and retrieve their inputs. + program.step.forEach(function(step){ + var options = Object.assign({}, sequencer.modulesInfo(step).inputs); + + // If inputs exists, print to console. + if (Object.keys(options).length) { + console.log("[" + step + "]: Inputs"); + } + + // If inputs exists, print them out with descriptions. + Object.keys(options).forEach(function(input) { // The array below creates a variable number of spaces. This is done with (length + 1). // The extra 4 that makes it (length + 5) is to account for the []: characters console.log(new Array(step.length + 5).join(' ') + input + ": " + options[input].desc); + }); + + if(program.config){ + try{ + program.config = JSON.parse(program.config); + console.log(`The parsed options object: `, program.config); + } + catch(e){ + console.error('\x1b[31m%s\x1b[0m',`Options(Config) is not a not valid JSON Fallback activate`); + program.config = false; + console.log(e); + } + } + if(program.config && validateConfig(program.config,options)){ + console.log("Now using Options object"); + Object.keys(options).forEach(function (input) { + options[input] = program.config[input]; + }) + } + else{ + // If inputs exist, iterate through them and prompt for values. + Object.keys(options).forEach(function(input) { + var value = readlineSync.question("[" + step + "]: Enter a value for " + input + " (" + options[input].type + ", default: " + options[input].default + "): "); + options[input] = value; + }); + } + // Add the step and its inputs to the sequencer. + sequencer.addSteps(step, options); }); - - // If inputs exist, iterate through them and prompt for values. - Object.keys(options).forEach(function(input) { - var value = readlineSync.question("[" + step + "]: Enter a value for " + input + " (" + options[input].type + ", default: " + options[input].default + "): "); - options[input] = value; + + // Run the sequencer. + sequencer.run(function(){ + + // Export all images or final image as binary files. + sequencer.exportBin(program.output,program.basic); + + }); - - // Add the step and its inputs to the sequencer. - sequencer.addSteps(step, options); + }); - - // Run the sequencer. - sequencer.run(function(){ - - // Export all images or final image as binary files. - sequencer.exportBin(program.output,program.basic); - - - }); - - }); - + }); // Takes an array of steps and checks if they are valid steps for the sequencer. - function validateSteps(steps) { - +function validateSteps(steps) { + // Assume all are valid in the beginning. var valid = true; steps.forEach(function(step) { @@ -115,7 +133,25 @@ sequencer.loadImages(program.image,function(){ valid = false; } }); - + // Return valid. (If all of the steps are valid properties, valid will have remained true). return valid; +} + +//Takes config and options object and checks if all the keys exist in config +function validateConfig(config_,options_){ + options_ = Object.keys(options_); + if ( + (function(){ + for(var input in options_){ + if(!config_[options_[input]]){ + console.error('\x1b[31m%s\x1b[0m',`Options Object does not have the required details "${options_[input]}" not specified. Fallback case activated`); + return false; + } + } + })() + == false) + return false; + else + return true; } \ No newline at end of file