diff --git a/NodeApp/src/commander/assignment/AssignmentCommand.ts b/NodeApp/src/commander/assignment/AssignmentCommand.ts index 3363dd74e35f6e720b53805f95321568e2325aec..d78a64aa54d0920f49377a029e7de78806b338d1 100644 --- a/NodeApp/src/commander/assignment/AssignmentCommand.ts +++ b/NodeApp/src/commander/assignment/AssignmentCommand.ts @@ -2,6 +2,7 @@ import CommanderCommand from '../CommanderCommand'; import AssignmentCreateCommand from './subcommands/AssignmentCreateCommand'; import AssignmentPublishCommand from './subcommands/AssignmentPublishCommand'; import AssignmentUnpublishCommand from './subcommands/AssignmentUnpublishCommand'; +import AssignmentCheckCommand from './subcommands/AssignmentCheckCommand'; class AssignmentCommand extends CommanderCommand { @@ -14,6 +15,7 @@ class AssignmentCommand extends CommanderCommand { protected defineSubCommands() { AssignmentCreateCommand.registerOnCommand(this.command); + AssignmentCheckCommand.registerOnCommand(this.command); AssignmentPublishCommand.registerOnCommand(this.command); AssignmentUnpublishCommand.registerOnCommand(this.command); } diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts new file mode 100644 index 0000000000000000000000000000000000000000..d46efaa66632054313f3bf246b419c280841287e --- /dev/null +++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts @@ -0,0 +1,96 @@ +import CommanderCommand from '../../CommanderCommand'; +import Config from '../../../config/Config'; +import ora from 'ora'; +import util from 'util'; +import { exec } from 'child_process'; +import chalk from 'chalk'; +import AssignmentValidator from '../../../sharedByClients/helpers/Dojo/AssignmentValidator'; +import ClientsSharedAssignmentHelper from '../../../sharedByClients/helpers/Dojo/ClientsSharedAssignmentHelper'; + + +const execAsync = util.promisify(exec); + + +class AssignmentCheckCommand extends CommanderCommand { + protected commandName: string = 'check'; + + protected defineCommand() { + this.command + .description('locally run a check of an assignment') + .option('-p, --path <value>', 'assignment path', Config.folders.defaultLocalExercise) + .option('-v, --verbose', 'verbose mode (display docker compose logs in live)') + .action(this.commandAction.bind(this)); + } + + protected async commandAction(options: { path: string, verbose: boolean }): Promise<void> { + const localExercisePath: string = options.path ?? Config.folders.defaultLocalExercise; + + const assignmentValidator = new AssignmentValidator(localExercisePath); + + try { + await new Promise<void>((resolve, reject) => { + let spinner: ora.Ora; + + if ( options.verbose ) { + assignmentValidator.events.on('logs', (log: string, _error: boolean, displayable: boolean) => { + if ( displayable ) { + console.log(log); + } + }); + } + + assignmentValidator.events.on('step', (name: string, message: string) => { + console.log(chalk.cyan(message)); + }); + + assignmentValidator.events.on('subStep', (name: string, message: string) => { + spinner = ora({ + text : message, + indent: 4 + }).start(); + + if ( options.verbose && name == 'COMPOSE_RUN' ) { + spinner.info(); + } + }); + + assignmentValidator.events.on('endSubStep', (stepName: string, message: string, error: boolean) => { + if ( error ) { + if ( options.verbose && stepName == 'COMPOSE_RUN' ) { + ora({ + text : message, + indent: 4 + }).start().fail(); + } else { + spinner.fail(message); + } + } else { + if ( options.verbose && stepName == 'COMPOSE_RUN' ) { + ora({ + text : message, + indent: 4 + }).start().succeed(); + } else { + spinner.succeed(message); + } + } + }); + + assignmentValidator.events.on('finished', (success: boolean, exitCode: number) => { + success ? resolve() : reject(); + }); + + assignmentValidator.run(true); + }); + } catch ( error ) { } + + ClientsSharedAssignmentHelper.displayExecutionResults(assignmentValidator, `The assignment is ready to be pushed.`, { + INFO : chalk.bold, + SUCCESS: chalk.green, + FAILURE: chalk.red + }); + } +} + + +export default new AssignmentCheckCommand(); \ No newline at end of file