From 77476d7dbf374d1d5c8b14294389d5c8f0e0a70e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me> Date: Tue, 12 Sep 2023 17:18:36 +0200 Subject: [PATCH] Rename enonce and exercice to assignment and exercise --- config/ClientsSharedConfig.ts | 6 ++-- ...lper.ts => ClientsSharedExerciseHelper.ts} | 18 +++++----- ...kerCompose.ts => ExerciseDockerCompose.ts} | 22 ++++++------ ...dation.ts => ExerciseResultsValidation.ts} | 36 +++++++++---------- models/{Enonce.ts => Assignment.ts} | 8 ++--- models/ExerciceEnonce.ts | 13 ------- models/{Exercice.ts => Exercise.ts} | 6 ++-- models/ExerciseAssignment.ts | 13 +++++++ types/Dojo/ApiRoute.ts | 14 ++++---- ...ningEvents.ts => ExerciseRunningEvents.ts} | 4 +-- 10 files changed, 70 insertions(+), 70 deletions(-) rename helpers/Dojo/{ClientsSharedExerciceHelper.ts => ClientsSharedExerciseHelper.ts} (63%) rename helpers/Dojo/{ExerciceDockerCompose.ts => ExerciseDockerCompose.ts} (88%) rename helpers/Dojo/{ExerciceResultsValidation.ts => ExerciseResultsValidation.ts} (67%) rename models/{Enonce.ts => Assignment.ts} (73%) delete mode 100644 models/ExerciceEnonce.ts rename models/{Exercice.ts => Exercise.ts} (78%) create mode 100644 models/ExerciseAssignment.ts rename types/Dojo/{ExerciceRunningEvents.ts => ExerciseRunningEvents.ts} (78%) diff --git a/config/ClientsSharedConfig.ts b/config/ClientsSharedConfig.ts index c1a0312..493ce30 100644 --- a/config/ClientsSharedConfig.ts +++ b/config/ClientsSharedConfig.ts @@ -10,7 +10,7 @@ class ClientsSharedConfig { projectName: string }; - public readonly exerciceResultsFolderMaxSizeInBytes: number; + public readonly exerciseResultsFolderMaxSizeInBytes: number; public readonly filenames: { results: string; @@ -32,10 +32,10 @@ class ClientsSharedConfig { projectName: process.env.DOCKER_COMPOSE_PROJECT_NAME || '' }; - this.exerciceResultsFolderMaxSizeInBytes = Number(process.env.EXERCICE_RESULTS_FOLDER_MAX_SIZE_IN_BYTES || 0); + this.exerciseResultsFolderMaxSizeInBytes = Number(process.env.EXERCISE_RESULTS_FOLDER_MAX_SIZE_IN_BYTES || 0); this.filenames = { - results: process.env.EXERCICE_RESULTS_FILENAME || '' + results: process.env.EXERCISE_RESULTS_FILENAME || '' }; } } diff --git a/helpers/Dojo/ClientsSharedExerciceHelper.ts b/helpers/Dojo/ClientsSharedExerciseHelper.ts similarity index 63% rename from helpers/Dojo/ClientsSharedExerciceHelper.ts rename to helpers/Dojo/ClientsSharedExerciseHelper.ts index 5437cc8..38eb435 100644 --- a/helpers/Dojo/ClientsSharedExerciceHelper.ts +++ b/helpers/Dojo/ClientsSharedExerciseHelper.ts @@ -1,20 +1,20 @@ -import ExerciceResultsFile from '../../../shared/types/Dojo/ExerciceResultsFile'; +import ExerciseResultsFile from '../../../shared/types/Dojo/ExerciseResultsFile'; import chalk from 'chalk'; import boxen from 'boxen'; import Icon from '../../types/Icon'; -class ClientsSharedExerciceHelper { - displayExecutionResults(exerciceResults: ExerciceResultsFile, containerExitCode: number, Style: { INFO: chalk.Chalk, SUCCESS: chalk.Chalk, FAILURE: chalk.Chalk }, additionalText: string = '') { - const finalLogGlobalResult = `${ Style.INFO('Global result') } : ${ exerciceResults.success ? Style.SUCCESS(`${ Icon.SUCCESS } Success`) : Style.FAILURE(`${ Icon.FAILURE } Failure`) }`; +class ClientsSharedExerciseHelper { + displayExecutionResults(exerciseResults: ExerciseResultsFile, containerExitCode: number, Style: { INFO: chalk.Chalk, SUCCESS: chalk.Chalk, FAILURE: chalk.Chalk }, additionalText: string = '') { + const finalLogGlobalResult = `${ Style.INFO('Global result') } : ${ exerciseResults.success ? Style.SUCCESS(`${ Icon.SUCCESS } Success`) : Style.FAILURE(`${ Icon.FAILURE } Failure`) }`; const finalLogExecutionExitCode = `${ Style.INFO('Execution exit code') } : ${ (containerExitCode == 0 ? Style.SUCCESS : Style.FAILURE)(containerExitCode) }`; - const finalLogResultNumbers = exerciceResults.successfulTests || exerciceResults.failedTests ? `\n\n${ Style.SUCCESS('Tests passed') } : ${ exerciceResults.successfulTests ?? '--' }\n${ Style.FAILURE('Tests failed') } : ${ exerciceResults.failedTests ?? '--' }` : ''; + const finalLogResultNumbers = exerciseResults.successfulTests || exerciseResults.failedTests ? `\n\n${ Style.SUCCESS('Tests passed') } : ${ exerciseResults.successfulTests ?? '--' }\n${ Style.FAILURE('Tests failed') } : ${ exerciseResults.failedTests ?? '--' }` : ''; - const finalLogSuccessResultDetails = (exerciceResults.successfulTestsList ?? []).map(testName => `- ${ Icon.SUCCESS } ${ testName }`).join('\n'); - const finalLogFailedResultDetails = (exerciceResults.failedTestsList ?? []).map(testName => `- ${ Icon.FAILURE } ${ testName }`).join('\n'); - const finalLogResultDetails = exerciceResults.successfulTestsList || exerciceResults.failedTestsList ? `\n\n${ Style.INFO('Tests') } :${ finalLogSuccessResultDetails != '' ? '\n' + finalLogSuccessResultDetails : '' }${ finalLogFailedResultDetails != '' ? '\n' + finalLogFailedResultDetails : '' }` : ''; + const finalLogSuccessResultDetails = (exerciseResults.successfulTestsList ?? []).map(testName => `- ${ Icon.SUCCESS } ${ testName }`).join('\n'); + const finalLogFailedResultDetails = (exerciseResults.failedTestsList ?? []).map(testName => `- ${ Icon.FAILURE } ${ testName }`).join('\n'); + const finalLogResultDetails = exerciseResults.successfulTestsList || exerciseResults.failedTestsList ? `\n\n${ Style.INFO('Tests') } :${ finalLogSuccessResultDetails != '' ? '\n' + finalLogSuccessResultDetails : '' }${ finalLogFailedResultDetails != '' ? '\n' + finalLogFailedResultDetails : '' }` : ''; console.log(boxen(`${ finalLogGlobalResult }\n\n${ finalLogExecutionExitCode }${ finalLogResultNumbers }${ finalLogResultDetails }${ additionalText }`, { title : 'Results', @@ -29,4 +29,4 @@ class ClientsSharedExerciceHelper { } -export default new ClientsSharedExerciceHelper(); \ No newline at end of file +export default new ClientsSharedExerciseHelper(); \ No newline at end of file diff --git a/helpers/Dojo/ExerciceDockerCompose.ts b/helpers/Dojo/ExerciseDockerCompose.ts similarity index 88% rename from helpers/Dojo/ExerciceDockerCompose.ts rename to helpers/Dojo/ExerciseDockerCompose.ts index 9794bbf..51ae311 100644 --- a/helpers/Dojo/ExerciceDockerCompose.ts +++ b/helpers/Dojo/ExerciseDockerCompose.ts @@ -1,12 +1,12 @@ -import EnonceFile from '../../../shared/types/Dojo/EnonceFile'; +import AssignmentFile from '../../../shared/types/Dojo/AssignmentFile'; import { TypedEmitter } from 'tiny-typed-emitter'; -import ExerciceRunningEvents from '../../types/Dojo/ExerciceRunningEvents'; +import ExerciseRunningEvents from '../../types/Dojo/ExerciseRunningEvents'; import { spawn } from 'child_process'; -import ExerciceCheckerError from '../../../shared/types/Dojo/ExerciceCheckerError'; +import ExerciseCheckerError from '../../../shared/types/Dojo/ExerciseCheckerError'; -class ExerciceDockerCompose { - readonly events: TypedEmitter<ExerciceRunningEvents> = new TypedEmitter<ExerciceRunningEvents>(); +class ExerciseDockerCompose { + readonly events: TypedEmitter<ExerciseRunningEvents> = new TypedEmitter<ExerciseRunningEvents>(); public displayableLogs: string = ''; public allLogs: string = ''; @@ -15,7 +15,7 @@ class ExerciceDockerCompose { public success: boolean = false; public exitCode: number = -1; - constructor(private projectName: string, private enonceFile: EnonceFile, private executionFolder: string, private composeFileOverride: Array<string> = []) { + constructor(private projectName: string, private assignmentFile: AssignmentFile, private executionFolder: string, private composeFileOverride: Array<string> = []) { this.events.on('logs', (log: string, _error: boolean, displayable: boolean) => { this.allLogs += log; this.displayableLogs += displayable ? log : ''; @@ -43,7 +43,7 @@ class ExerciceDockerCompose { this.events.emit('logs', '####################################################### Docker Compose & Main Container Logs #######################################################\n', false, false); - const dockerCompose = spawn(`${ dockerComposeCommand } run --build --rm ${ this.enonceFile.result.container }`, { + const dockerCompose = spawn(`${ dockerComposeCommand } run --build --rm ${ this.assignmentFile.result.container }`, { cwd : this.executionFolder, shell: true, env : { @@ -66,7 +66,7 @@ class ExerciceDockerCompose { }); } catch ( error ) { this.events.emit('endStep', 'COMPOSE_RUN', `Error while running the docker compose file`, true); - this.events.emit('finished', false, ExerciceCheckerError.DOCKER_COMPOSE_RUN_ERROR); + this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_RUN_ERROR); return; } this.events.emit('endStep', 'COMPOSE_RUN', `Docker Compose file run successfully`, false); @@ -100,7 +100,7 @@ class ExerciceDockerCompose { }); } catch ( error ) { this.events.emit('endStep', 'COMPOSE_LOGS', `Error while getting the linked services logs`, true); - this.events.emit('finished', false, ExerciceCheckerError.DOCKER_COMPOSE_LOGS_ERROR); + this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_LOGS_ERROR); return; } this.events.emit('endStep', 'COMPOSE_LOGS', `Linked services logs acquired`, false); @@ -135,7 +135,7 @@ class ExerciceDockerCompose { }); } catch ( error ) { this.events.emit('endStep', 'COMPOSE_DOWN', `Error stop and remove containers`, true); - this.events.emit('finished', false, ExerciceCheckerError.DOCKER_COMPOSE_DOWN_ERROR); + this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_DOWN_ERROR); return; } this.events.emit('endStep', 'COMPOSE_DOWN', `Containers stopped and removed`, false); @@ -148,4 +148,4 @@ class ExerciceDockerCompose { } -export default ExerciceDockerCompose; \ No newline at end of file +export default ExerciseDockerCompose; \ No newline at end of file diff --git a/helpers/Dojo/ExerciceResultsValidation.ts b/helpers/Dojo/ExerciseResultsValidation.ts similarity index 67% rename from helpers/Dojo/ExerciceResultsValidation.ts rename to helpers/Dojo/ExerciseResultsValidation.ts index 1c7ff71..9bf2691 100644 --- a/helpers/Dojo/ExerciceResultsValidation.ts +++ b/helpers/Dojo/ExerciseResultsValidation.ts @@ -1,20 +1,20 @@ import { TypedEmitter } from 'tiny-typed-emitter'; -import ExerciceRunningEvents from '../../types/Dojo/ExerciceRunningEvents'; -import ExerciceCheckerError from '../../../shared/types/Dojo/ExerciceCheckerError'; +import ExerciseRunningEvents from '../../types/Dojo/ExerciseRunningEvents'; +import ExerciseCheckerError from '../../../shared/types/Dojo/ExerciseCheckerError'; import path from 'node:path'; -import SharedExerciceHelper from '../../../shared/helpers/Dojo/SharedExerciceHelper'; +import SharedExerciseHelper from '../../../shared/helpers/Dojo/SharedExerciseHelper'; import ClientsSharedConfig from '../../config/ClientsSharedConfig'; import Toolbox from '../../../shared/helpers/Toolbox'; import * as fs from 'fs-extra'; -import ExerciceResultsFile from '../../../shared/types/Dojo/ExerciceResultsFile'; +import ExerciseResultsFile from '../../../shared/types/Dojo/ExerciseResultsFile'; -class ExerciceResultsValidation { - readonly events: TypedEmitter<ExerciceRunningEvents> = new TypedEmitter<ExerciceRunningEvents>(); +class ExerciseResultsValidation { + readonly events: TypedEmitter<ExerciseRunningEvents> = new TypedEmitter<ExerciseRunningEvents>(); - public exerciceResults: ExerciceResultsFile | undefined = undefined; + public exerciseResults: ExerciseResultsFile | undefined = undefined; - constructor(private folderResultsDojo: string, private folderResultsExercice: string) { } + constructor(private folderResultsDojo: string, private folderResultsExercise: string) { } run() { (async () => { @@ -24,12 +24,12 @@ class ExerciceResultsValidation { // Results file existence { this.events.emit('step', 'CHECK_RESULTS_FILE_EXIST', 'Checking if results file exists'); - const resultsFileOriginPath = path.join(this.folderResultsExercice, ClientsSharedConfig.filenames.results); + const resultsFileOriginPath = path.join(this.folderResultsExercise, ClientsSharedConfig.filenames.results); resultsFilePath = path.join(this.folderResultsDojo, ClientsSharedConfig.filenames.results); if ( !fs.existsSync(resultsFileOriginPath) ) { this.events.emit('endStep', 'CHECK_RESULTS_FILE_EXIST', `Results file not found`, true); - this.events.emit('finished', false, ExerciceCheckerError.EXERCICE_RESULTS_FILE_NOT_FOUND); + this.events.emit('finished', false, ExerciseCheckerError.EXERCISE_RESULTS_FILE_NOT_FOUND); return; } this.events.emit('endStep', 'CHECK_RESULTS_FILE_EXIST', 'Results file found', false); @@ -41,13 +41,13 @@ class ExerciceResultsValidation { // Results file schema validation { this.events.emit('step', 'VALIDATE_RESULTS_FILE', 'Validating results file schema'); - const validationResults = SharedExerciceHelper.validateResultFile(resultsFilePath); + const validationResults = SharedExerciseHelper.validateResultFile(resultsFilePath); if ( !validationResults.isValid ) { this.events.emit('endStep', 'VALIDATE_RESULTS_FILE', `Results file is not valid. Here are the errors :\n${ JSON.stringify(validationResults.errors) }`, true); - this.events.emit('finished', false, ExerciceCheckerError.EXERCICE_RESULTS_FILE_SCHEMA_NOT_VALID); + this.events.emit('finished', false, ExerciseCheckerError.EXERCISE_RESULTS_FILE_SCHEMA_NOT_VALID); return; } - this.exerciceResults = validationResults.results; + this.exerciseResults = validationResults.results; this.events.emit('endStep', 'VALIDATE_RESULTS_FILE', 'Results file is valid', false); } @@ -56,10 +56,10 @@ class ExerciceResultsValidation { // ATTENTION: This test is at the end because even if it fail the local execution will continue and we need the other test above to be done { this.events.emit('step', 'CHECK_SIZE', 'Validating results folder size'); - const resultsFolderSize = await Toolbox.fs.getTotalSize(this.folderResultsExercice); - if ( resultsFolderSize > ClientsSharedConfig.exerciceResultsFolderMaxSizeInBytes ) { - this.events.emit('endStep', 'CHECK_SIZE', `Results folder size is too big (bigger than ${ ClientsSharedConfig.exerciceResultsFolderMaxSizeInBytes / 1000000 } MB)`, true); - this.events.emit('finished', false, ExerciceCheckerError.EXERCICE_RESULTS_FOLDER_TOO_BIG); + const resultsFolderSize = await Toolbox.fs.getTotalSize(this.folderResultsExercise); + if ( resultsFolderSize > ClientsSharedConfig.exerciseResultsFolderMaxSizeInBytes ) { + this.events.emit('endStep', 'CHECK_SIZE', `Results folder size is too big (bigger than ${ ClientsSharedConfig.exerciseResultsFolderMaxSizeInBytes / 1000000 } MB)`, true); + this.events.emit('finished', false, ExerciseCheckerError.EXERCISE_RESULTS_FOLDER_TOO_BIG); return; } this.events.emit('endStep', 'CHECK_SIZE', 'Results folder size is in bounds', false); @@ -71,4 +71,4 @@ class ExerciceResultsValidation { } -export default ExerciceResultsValidation; \ No newline at end of file +export default ExerciseResultsValidation; \ No newline at end of file diff --git a/models/Enonce.ts b/models/Assignment.ts similarity index 73% rename from models/Enonce.ts rename to models/Assignment.ts index a8756c4..55edde6 100644 --- a/models/Enonce.ts +++ b/models/Assignment.ts @@ -1,9 +1,9 @@ import GitlabRepository from '../../shared/types/Gitlab/GitlabRepository'; import User from './User'; -import Exercice from './Exercice'; +import Exercise from './Exercise'; -interface Enonce { +interface Assignment { name: string; gitlabId: number; gitlabLink: string; @@ -13,8 +13,8 @@ interface Enonce { published: boolean; staff: Array<User>; - exercices: Array<Exercice>; + exercises: Array<Exercise>; } -export default Enonce; \ No newline at end of file +export default Assignment; \ No newline at end of file diff --git a/models/ExerciceEnonce.ts b/models/ExerciceEnonce.ts deleted file mode 100644 index aa68183..0000000 --- a/models/ExerciceEnonce.ts +++ /dev/null @@ -1,13 +0,0 @@ -import EnonceFile from '../../shared/types/Dojo/EnonceFile'; -import Enonce from './Enonce'; -import GitlabFile from '../../shared/types/Gitlab/GitlabFile'; - - -interface ExerciceEnonce { - enonce: Enonce; - enonceFile: EnonceFile; - immutable: Array<GitlabFile>; -} - - -export default ExerciceEnonce; \ No newline at end of file diff --git a/models/Exercice.ts b/models/Exercise.ts similarity index 78% rename from models/Exercice.ts rename to models/Exercise.ts index 7198b86..0e22c1a 100644 --- a/models/Exercice.ts +++ b/models/Exercise.ts @@ -1,9 +1,9 @@ import GitlabRepository from '../../shared/types/Gitlab/GitlabRepository'; -interface Exercice { +interface Exercise { id: string; - enonceName: string; + assignmentName: string; name: string; gitlabId: number; gitlabLink: string; @@ -13,4 +13,4 @@ interface Exercice { } -export default Exercice; \ No newline at end of file +export default Exercise; \ No newline at end of file diff --git a/models/ExerciseAssignment.ts b/models/ExerciseAssignment.ts new file mode 100644 index 0000000..727447f --- /dev/null +++ b/models/ExerciseAssignment.ts @@ -0,0 +1,13 @@ +import AssignmentFile from '../../shared/types/Dojo/AssignmentFile'; +import Assignment from './Assignment'; +import GitlabFile from '../../shared/types/Gitlab/GitlabFile'; + + +interface ExerciseAssignment { + assignment: Assignment; + assignmentFile: AssignmentFile; + immutable: Array<GitlabFile>; +} + + +export default ExerciseAssignment; \ No newline at end of file diff --git a/types/Dojo/ApiRoute.ts b/types/Dojo/ApiRoute.ts index 3d3e3dd..b7631ac 100644 --- a/types/Dojo/ApiRoute.ts +++ b/types/Dojo/ApiRoute.ts @@ -2,13 +2,13 @@ enum ApiRoute { LOGIN = '/login', TEST_SESSION = '/test_session', GITLAB_CHECK_TEMPLATE_ACCESS = '/gitlab/project/{{id}}/checkTemplateAccess', - ENONCE_GET = '/enonces/{{nameOrUrl}}', - ENONCE_CREATE = '/enonces', - ENONCE_PUBLISH = '/enonces/{{nameOrUrl}}/publish', - ENONCE_UNPUBLISH = '/enonces/{{nameOrUrl}}/unpublish', - EXERCICE_CREATE = '/enonces/{{nameOrUrl}}/exercices', - EXERCICE_ENONCE = '/exercices/{{id}}/enonce', - EXERCICE_RESULTS = '/exercices/{{id}}/results' + ASSIGNMENT_GET = '/assignments/{{nameOrUrl}}', + ASSIGNMENT_CREATE = '/assignments', + ASSIGNMENT_PUBLISH = '/assignments/{{nameOrUrl}}/publish', + ASSIGNMENT_UNPUBLISH = '/assignments/{{nameOrUrl}}/unpublish', + EXERCISE_CREATE = '/assignments/{{nameOrUrl}}/exercises', + EXERCISE_ASSIGNMENT = '/exercises/{{id}}/assignment', + EXERCISE_RESULTS = '/exercises/{{id}}/results' } diff --git a/types/Dojo/ExerciceRunningEvents.ts b/types/Dojo/ExerciseRunningEvents.ts similarity index 78% rename from types/Dojo/ExerciceRunningEvents.ts rename to types/Dojo/ExerciseRunningEvents.ts index c576f01..34ed6a1 100644 --- a/types/Dojo/ExerciceRunningEvents.ts +++ b/types/Dojo/ExerciseRunningEvents.ts @@ -1,4 +1,4 @@ -interface ExerciceRunningEvents { +interface ExerciseRunningEvents { step: (name: string, message: string) => void; endStep: (stepName: string, message: string, error: boolean) => void; logs: (log: string, error: boolean, displayable: boolean) => void; @@ -6,4 +6,4 @@ interface ExerciceRunningEvents { } -export default ExerciceRunningEvents; \ No newline at end of file +export default ExerciseRunningEvents; \ No newline at end of file -- GitLab