mirror of
https://github.com/publiclab/image-sequencer.git
synced 2025-12-14 12:19:58 +01:00
refactor cli code (#1785)
* use template for commander instance in clitest * remove unnecessary log * use named export instead of default * refactor cli code to another file to make it testable * refactor cli.js into src/cli * refactor * refactor * refactor * refactor Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
This commit is contained in:
88
index.js
88
index.js
@@ -1,89 +1,5 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
require('./src/ImageSequencer');
|
var cli = require('./src/cli');
|
||||||
sequencer = ImageSequencer({ ui: true });
|
|
||||||
var fs = require('fs');
|
|
||||||
var program = require('commander');
|
|
||||||
var utils = require('./src/CliUtils');
|
|
||||||
|
|
||||||
var saveSequence = require('./src/cli/saveSequence.js');
|
cli(process.argv);
|
||||||
var installModule = require('./src/cli/installModule.js');
|
|
||||||
var sequencerSteps = require('./src/cli/sequencerSteps.js');
|
|
||||||
|
|
||||||
function exit(message) {
|
|
||||||
console.error(message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
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('-c, --config [Object]', 'Options for the step')
|
|
||||||
.option('--save-sequence [string]', 'Name space separated with Stringified sequence')
|
|
||||||
.option('--install-module [string]', 'Module name space seaprated npm package name')
|
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
if (program.saveSequence) saveSequence(program, sequencer);
|
|
||||||
|
|
||||||
else if (program.installModule) installModule(program, sequencer);
|
|
||||||
|
|
||||||
else {
|
|
||||||
// Parse step into an array to allow for multiple steps.
|
|
||||||
if (!program.step) exit('No steps passed');
|
|
||||||
program.step = program.step.split(' ');
|
|
||||||
|
|
||||||
// User must input an image.
|
|
||||||
if (!program.image) exit('Can\'t read file.');
|
|
||||||
|
|
||||||
// User must input an image.
|
|
||||||
fs.access(program.image, function(err) {
|
|
||||||
if (err) exit('Can\'t read file.');
|
|
||||||
});
|
|
||||||
|
|
||||||
// User must input a step. If steps exist, check that every step is a valid step.
|
|
||||||
if (!program.step || !(utils.validateSteps(program.step, sequencer)))
|
|
||||||
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]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
notify: function(msg) {
|
|
||||||
console.log('\x1b[36m%s\x1b[0m', '🌟 ' + msg);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 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',
|
|
||||||
'Please wait \n output directory generated will be empty until the execution is complete'
|
|
||||||
);
|
|
||||||
|
|
||||||
//Generate the Output Directory
|
|
||||||
var outputFilename = program.output.split('/').slice(-1)[0];
|
|
||||||
if (outputFilename.includes('.')) {
|
|
||||||
// user did give an output filename we have to remove it from dir
|
|
||||||
program.output = program.output.split('/').slice(0, -1).join('/');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
outputFilename = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
sequencerSteps(program, sequencer, outputFilename);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
98
src/cli/index.js
Normal file
98
src/cli/index.js
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
require('../ImageSequencer');
|
||||||
|
sequencer = ImageSequencer({ ui: true });
|
||||||
|
var fs = require('fs');
|
||||||
|
var program = require('commander');
|
||||||
|
var utils = require('../CliUtils');
|
||||||
|
|
||||||
|
var saveSequence = require('./saveSequence.js');
|
||||||
|
var installModule = require('./installModule.js');
|
||||||
|
var sequencerSteps = require('./sequencerSteps.js');
|
||||||
|
|
||||||
|
function exit(message) {
|
||||||
|
console.error(message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function executeSteps(program) {
|
||||||
|
// 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]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
notify: function (msg) {
|
||||||
|
console.log('\x1b[36m%s\x1b[0m', '🌟 ' + msg);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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',
|
||||||
|
'Please wait \n output directory generated will be empty until the execution is complete'
|
||||||
|
);
|
||||||
|
|
||||||
|
//Generate the Output Directory
|
||||||
|
var outputFilename = program.output.split('/').slice(-1)[0];
|
||||||
|
if (outputFilename.includes('.')) {
|
||||||
|
// user did give an output filename we have to remove it from dir
|
||||||
|
program.output = program.output.split('/').slice(0, -1).join('/');
|
||||||
|
} else {
|
||||||
|
outputFilename = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
sequencerSteps(program, sequencer, outputFilename);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseSteps(program) {
|
||||||
|
// Parse step into an array to allow for multiple steps.
|
||||||
|
if (!program.step) exit('No steps passed');
|
||||||
|
program.step = program.step.split(' ');
|
||||||
|
|
||||||
|
// User must input an image.
|
||||||
|
if (!program.image) exit('Can\'t read file.');
|
||||||
|
|
||||||
|
// User must input an image.
|
||||||
|
fs.access(program.image, function (err) {
|
||||||
|
if (err) exit('Can\'t read file.');
|
||||||
|
});
|
||||||
|
|
||||||
|
// User must input a step. If steps exist, check that every step is a valid step.
|
||||||
|
if (!program.step || !utils.validateSteps(program.step, sequencer))
|
||||||
|
exit('Please ensure all steps are valid.');
|
||||||
|
|
||||||
|
// If there's no user defined output directory, select a default directory.
|
||||||
|
program.output = program.output || './output/';
|
||||||
|
|
||||||
|
executeSteps(program);
|
||||||
|
}
|
||||||
|
|
||||||
|
function cli(args) {
|
||||||
|
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('-c, --config [Object]', 'Options for the step')
|
||||||
|
.option(
|
||||||
|
'--save-sequence [string]',
|
||||||
|
'Name space separated with Stringified sequence'
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
'--install-module [string]',
|
||||||
|
'Module name space seaprated npm package name'
|
||||||
|
)
|
||||||
|
.parse(args);
|
||||||
|
|
||||||
|
if (program.saveSequence) saveSequence(program, sequencer);
|
||||||
|
else if (program.installModule) installModule(program, sequencer);
|
||||||
|
else parseSteps(program);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = cli;
|
||||||
@@ -1,36 +1,20 @@
|
|||||||
require('../../src/ImageSequencer');
|
|
||||||
sequencer = ImageSequencer({ ui: true });
|
|
||||||
const saveSequence = require('../../src/cli/saveSequence.js');
|
|
||||||
const test = require('tape');
|
const test = require('tape');
|
||||||
const { Command } = require('commander');
|
const cli = require('../../src/cli');
|
||||||
|
|
||||||
|
|
||||||
test('testing save sequence function', function (t) {
|
test('testing save sequence function', function (t) {
|
||||||
try {
|
try {
|
||||||
let program = new Command();
|
cli([
|
||||||
program
|
'node', 'test',
|
||||||
.option('--save-sequence [string]', 'Name space separated with Stringified sequence');
|
'--save-sequence',
|
||||||
|
'"invert-colormap invert(),colormap()"',
|
||||||
program.parse(['node', 'test', '--save-sequence', '"invert brightness"']);
|
]);
|
||||||
|
|
||||||
if (program.saveSequence)
|
|
||||||
saveSequence(program, sequencer);
|
|
||||||
t.true(1, 'creation success');
|
t.true(1, 'creation success');
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
t.true(!error, 'creation fail');
|
t.true(!error, 'creation fail');
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
let program = new Command();
|
cli(['node', 'test', '--save-sequence']);
|
||||||
program
|
|
||||||
.option('--save-sequence [string]', 'Name space separated with Stringified sequence');
|
|
||||||
|
|
||||||
program.parse(['node', 'test', '--save-sequence']);
|
|
||||||
|
|
||||||
if (program.saveSequence)
|
|
||||||
saveSequence(program, sequencer);
|
|
||||||
t.true(0, 'creation success');
|
t.true(0, 'creation success');
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
t.true(1, 'creation fail');
|
t.true(1, 'creation fail');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user