diff --git a/ExerciceChecker/.idea/jetbrainsConfiguration b/ExerciceChecker/.idea/jetbrainsConfiguration index fec06e6aeeff2083bfe82b38182f6a02c73d023f..57997f6ff4ad2d2e23e03f86d997f64463cc898d 160000 --- a/ExerciceChecker/.idea/jetbrainsConfiguration +++ b/ExerciceChecker/.idea/jetbrainsConfiguration @@ -1 +1 @@ -Subproject commit fec06e6aeeff2083bfe82b38182f6a02c73d023f +Subproject commit 57997f6ff4ad2d2e23e03f86d997f64463cc898d diff --git a/ExerciceChecker/package-lock.json b/ExerciceChecker/package-lock.json index d27a3443c703494fa7d31249914e4ed23421a1b3..4fecbd1dbdc00a8e1d429463c764e462a16c5da6 100644 --- a/ExerciceChecker/package-lock.json +++ b/ExerciceChecker/package-lock.json @@ -31,6 +31,7 @@ "@types/node": "^18.17.1", "@types/tar-stream": "^2.2.2", "pkg": "^5.8.1", + "tiny-typed-emitter": "^2.1.0", "ts-node": "^10.9.1", "typescript": "^5.1.6" } @@ -2230,6 +2231,12 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", + "dev": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", diff --git a/ExerciceChecker/package.json b/ExerciceChecker/package.json index 1b15b659501c90fede5408afdb8a567154f57759..eba11f3d5f39cc55ce6552b44077701aab30d4bb 100644 --- a/ExerciceChecker/package.json +++ b/ExerciceChecker/package.json @@ -1,6 +1,6 @@ { "name" : "dojo_exercice_checker", - "version" : "1.0.0", + "version" : "1.0.1", "main" : "dist/app.js", "bin" : { "dirmanager": "./dist/app.js" @@ -37,13 +37,14 @@ "winston" : "^3.10.0" }, "devDependencies": { - "@types/dockerode" : "^3.3.19", - "@types/fs-extra" : "^11.0.1", - "@types/js-yaml" : "^4.0.5", - "@types/node" : "^18.17.1", - "@types/tar-stream": "^2.2.2", - "pkg" : "^5.8.1", - "ts-node" : "^10.9.1", - "typescript" : "^5.1.6" + "@types/dockerode" : "^3.3.19", + "@types/fs-extra" : "^11.0.1", + "@types/js-yaml" : "^4.0.5", + "@types/node" : "^18.17.1", + "@types/tar-stream" : "^2.2.2", + "pkg" : "^5.8.1", + "tiny-typed-emitter": "^2.1.0", + "ts-node" : "^10.9.1", + "typescript" : "^5.1.6" } } diff --git a/ExerciceChecker/src/app.ts b/ExerciceChecker/src/app.ts index afc0cb62d547d4edeef34c18e72cace834e7b359..c40fc2ea6c6faa5437456377c6821b548154dcda 100644 --- a/ExerciceChecker/src/app.ts +++ b/ExerciceChecker/src/app.ts @@ -4,20 +4,23 @@ const path = require('node:path'); require('dotenv').config({ path: path.join(__dirname, '../.env') }); require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file -import Styles from './types/Styles'; -import Icon from './types/Icon'; -import boxen from 'boxen'; -import RecursiveFilesStats from './shared/helpers/recursiveFilesStats/RecursiveFilesStats'; -import Toolbox from './shared/helpers/Toolbox'; -import ExerciceHelper from './shared/helpers/ExerciceHelper'; -import ExerciceCheckerError from './types/ExerciceCheckerError'; -import { exec, spawn } from 'child_process'; -import util from 'util'; -import fs from 'fs-extra'; -import HttpManager from './managers/HttpManager'; -import DojoBackendManager from './managers/DojoBackendManager'; -import Config from './config/Config'; -import ArchiveHelper from './shared/helpers/ArchiveHelper'; +import ClientsSharedConfig from './sharedByClients/config/ClientsSharedConfig'; +import Styles from './types/Style'; +import Icon from './sharedByClients/types/Icon'; +import RecursiveFilesStats from './shared/helpers/recursiveFilesStats/RecursiveFilesStats'; +import Toolbox from './shared/helpers/Toolbox'; +import ExerciceCheckerError from './shared/types/Dojo/ExerciceCheckerError'; +import { exec } from 'child_process'; +import util from 'util'; +import fs from 'fs-extra'; +import HttpManager from './managers/HttpManager'; +import DojoBackendManager from './managers/DojoBackendManager'; +import Config from './config/Config'; +import ArchiveHelper from './shared/helpers/ArchiveHelper'; +import ExerciceDockerCompose from './sharedByClients/helpers/Dojo/ExerciceDockerCompose'; +import ExerciceResultsValidation from './sharedByClients/helpers/Dojo/ExerciceResultsValidation'; +import ExerciceEnonce from './sharedByClients/models/ExerciceEnonce'; +import ClientsSharedExerciceHelper from './sharedByClients/helpers/Dojo/ClientsSharedExerciceHelper'; (async () => { @@ -27,150 +30,136 @@ import ArchiveHelper from './shared/helpers/ArchiveHelper'; console.log(Styles.APP_NAME(Config.appName)); + let exerciceEnonce: ExerciceEnonce | undefined; + let exerciceDockerCompose: ExerciceDockerCompose; + let exerciceResultsValidation: ExerciceResultsValidation; + /* - //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 1 & 2: + //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 1: - Read the dojo enonce file from the enonce repository - Download immutables files (maybe throw or show an error if the files have been modified ?) */ - console.log(Styles.INFO(`${ Icon.INFO }️ Checking the exercice's enonce and his immutable files`)); - const exerciceEnonce = await DojoBackendManager.getExerciceEnonce(); - if ( !exerciceEnonce ) { - console.error(Styles.ERROR(`${ Icon.ERROR } Error while getting the exercice's enonce`)); - process.exit(ExerciceCheckerError.EXERCICE_ENONCE_GET_ERROR); + { + console.log(Styles.INFO(`${ Icon.INFO }️ Checking the exercice's enonce and his immutable files`)); + exerciceEnonce = await DojoBackendManager.getExerciceEnonce(); + if ( !exerciceEnonce ) { + console.error(Styles.ERROR(`${ Icon.ERROR } Error while getting the exercice's enonce`)); + process.exit(ExerciceCheckerError.EXERCICE_ENONCE_GET_ERROR); + } + + exerciceEnonce.immutable.forEach(immutableFile => { + const filePath = path.join(Config.folders.project, immutableFile.file_path); + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, immutableFile.content, { encoding: 'base64' }); + }); } - exerciceEnonce.immutable.forEach(immutableFile => { - const filePath = path.join(Config.folders.project, immutableFile.file_path); - fs.mkdirSync(path.dirname(filePath), { recursive: true }); - fs.writeFileSync(filePath, immutableFile.content, { encoding: 'base64' }); - }); - /* - //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 3 & 4 & 5: + //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 2: - Get override of docker-compose file (for override the volume by a bind mount to the results folder shared between dind and the host) - Run docker-compose file - Get logs from linked services */ - console.log(Styles.INFO(`${ Icon.INFO } Run docker compose file`)); - const dockerComposeOverride = fs.readFileSync(path.join(__dirname, '../assets/docker-compose-override.yml'), 'utf8').replace('{{VOLUME_NAME}}', exerciceEnonce.enonceFile.result.volume).replace('{{MOUNT_PATH}}', Config.folders.resultsExercice); - fs.writeFileSync(`${ Config.folders.project }/docker-compose-override.yml`, dockerComposeOverride); - - const changeDirectoryCommand = `cd "${ Config.folders.project }"`; - const dockerComposeCommand = `docker compose --project-name ${ Config.dockerCompose.projectName } --progress plain --file docker-compose.yml --file docker-compose-override.yml`; - - const containerExitStatus = await new Promise<[ number, string ]>((resolve) => { - let logs = '####################################################### Docker Compose & Main Container Logs #######################################################\n'; - - const dockerCompose = spawn(`${ dockerComposeCommand } run --build ${ exerciceEnonce.enonceFile.result.container }`, { - cwd : Config.folders.project, - shell: true, - env : { - 'DOCKER_BUILDKIT' : '1', - 'BUILDKIT_PROGRESS': 'plain', ...process.env - } - }); + { + const composeOverridePath: string = path.join(Config.folders.project, 'docker-compose-override.yml'); - dockerCompose.stdout.on('data', (data) => { - logs += data.toString(); - console.log(data.toString()); - }); + const composeOverride = fs.readFileSync(path.join(__dirname, '../assets/docker-compose-override.yml'), 'utf8').replace('{{VOLUME_NAME}}', exerciceEnonce.enonceFile.result.volume).replace('{{MOUNT_PATH}}', Config.folders.resultsExercice); + fs.writeFileSync(composeOverridePath, composeOverride); - dockerCompose.stderr.on('data', (data) => { - logs += data.toString(); - console.error(data.toString()); - }); + exerciceDockerCompose = new ExerciceDockerCompose(ClientsSharedConfig.dockerCompose.projectName, exerciceEnonce.enonceFile, Config.folders.project, [ composeOverridePath ]); - dockerCompose.on('exit', (code) => { - logs += '####################################################### Other Services Logs #######################################################\n'; - resolve([ code ?? ExerciceCheckerError.DOCKER_COMPOSE_UP_ERROR, logs ]); - }); - }); - const containerExitCode = containerExitStatus[0]; - if ( containerExitCode === ExerciceCheckerError.DOCKER_COMPOSE_UP_ERROR ) { - console.error(Styles.ERROR(`${ Icon.ERROR } Error while running the docker compose file`)); - process.exit(containerExitCode); - } - fs.writeFileSync(`${ Config.folders.resultsDojo }/dockerComposeLogs.txt`, containerExitStatus[1]); - - console.log(Styles.INFO(`${ Icon.INFO } Acquire logs of linked services`)); - try { - await execAsync(`${ changeDirectoryCommand };${ dockerComposeCommand } logs --timestamps >> ${ Config.folders.resultsDojo }/dockerComposeLogs.txt`); - } catch ( error ) { - console.error(Styles.ERROR(`${ Icon.ERROR } Error while getting the linked services logs`)); - process.exit(ExerciceCheckerError.DOCKER_COMPOSE_LOGS_ERROR); - } + try { + await new Promise<void>((resolve, reject) => { + exerciceDockerCompose.events.on('step', (name: string, message: string) => { + console.log(Styles.INFO(`${ Icon.INFO } ${ message }`)); + }); + exerciceDockerCompose.events.on('endStep', (stepName: string, message: string, error: boolean) => { + if ( error ) { + console.error(Styles.ERROR(`${ Icon.ERROR } ${ message }`)); + } + }); - //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 6: Check content requirements and content size - console.log(Styles.INFO(`${ Icon.INFO } Validating results folder size`)); - const resultsFolderSize = await Toolbox.fs.getTotalSize(Config.folders.resultsExercice); - if ( resultsFolderSize > Config.resultsFolderMaxSizeInBytes ) { - console.error(Styles.ERROR(`${ Icon.ERROR } Results folder size is too big (bigger than ${ Config.resultsFolderMaxSizeInBytes / 1000000 })`)); - process.exit(ExerciceCheckerError.EXERCICE_RESULTS_FOLDER_TOO_BIG); - } + exerciceDockerCompose.events.on('finished', (success: boolean, exitCode: number) => { + success ? resolve() : reject(); + }); - console.log(Styles.INFO(`${ Icon.INFO } Checking results file`)); - const resultsFileOriginPath = path.join(Config.folders.resultsExercice, Config.filenames.results); - const resultsFilePath = path.join(Config.folders.resultsDojo, Config.filenames.results); + exerciceDockerCompose.run(); + }); + } catch ( error ) { } - if ( !fs.existsSync(resultsFileOriginPath) ) { - console.error(Styles.ERROR(`${ Icon.ERROR } Results file not found.`)); - process.exit(ExerciceCheckerError.EXERCICE_RESULTS_FILE_NOT_FOUND); + fs.rmSync(composeOverridePath); + fs.writeFileSync(path.join(Config.folders.resultsDojo, 'dockerComposeLogs.txt'), exerciceDockerCompose.allLogs); + + if ( !exerciceDockerCompose.success ) { + console.error(Styles.ERROR(`${ Icon.ERROR } Execution logs are available in artifacts`)); + process.exit(exerciceDockerCompose.exitCode); + } } - fs.moveSync(resultsFileOriginPath, resultsFilePath, { overwrite: true }); - const validationResults = ExerciceHelper.validateResultFile(resultsFilePath); + //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 3: Check content requirements and content size + { + exerciceResultsValidation = new ExerciceResultsValidation(Config.folders.resultsDojo, Config.folders.resultsExercice); - if ( !validationResults.isValid ) { - console.error(Styles.ERROR(`${ Icon.ERROR } Results file is not valid. Here are the errors :`)); - console.error(Styles.ERROR(JSON.stringify(validationResults.errors))); - process.exit(ExerciceCheckerError.EXERCICE_RESULTS_FILE_SCHEMA_NOT_VALID); - } + try { + await new Promise<void>((resolve) => { + exerciceResultsValidation.events.on('step', (name: string, message: string) => { + console.log(Styles.INFO(`${ Icon.INFO } ${ message }`)); + }); + exerciceResultsValidation.events.on('endStep', (stepName: string, message: string, error: boolean) => { + if ( error ) { + console.error(Styles.ERROR(`${ Icon.ERROR } ${ message }`)); + } + }); - //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 7: Upload and show the results - try { - console.log(Styles.INFO(`${ Icon.INFO } Uploading results to the dojo server`)); - const commit: any = {}; - Toolbox.getKeysWithPrefix(process.env, 'CI_COMMIT_').forEach(key => { - commit[Toolbox.snakeToCamel(key.replace('CI_COMMIT_', ''))] = process.env[key]; - }); + exerciceResultsValidation.events.on('finished', (success: boolean, exitCode: number) => { + if ( !success ) { + process.exit(exitCode); + } - const files = await RecursiveFilesStats.explore(Config.folders.resultsVolume, { - replacePathByRelativeOne: true, - liteStats : true - }); + resolve(); + }); - await DojoBackendManager.sendResults(containerExitCode, commit, validationResults.results!, files, await ArchiveHelper.getBase64(Config.folders.resultsVolume)); - } catch ( error ) { - console.error(Styles.ERROR(`${ Icon.ERROR } Error while uploading the results`)); - console.error(JSON.stringify(error)); - process.exit(ExerciceCheckerError.UPLOAD); + exerciceResultsValidation.run(); + }); + } catch ( error ) { } } - //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 8: Exit with container exit code - const finalLogGlobalResult = `${ Styles.INFO('Global result') } : ${ validationResults.results!.success ? Styles.SUCCESS(`${ Icon.SUCCESS } Success`) : Styles.FAILURE(`${ Icon.FAILURE } Failure`) }`; - - const finalLogExecutionExitCode = `${ Styles.INFO('Execution exit code') } : ${ (containerExitCode == 0 ? Styles.SUCCESS : Styles.ERROR)(containerExitCode) }`; - - const finalLogResultNumbers = validationResults.results!.successfulTests || validationResults.results!.failedTests ? `\n\n${ Styles.SUCCESS('Tests passed') } : ${ validationResults.results!.successfulTests ?? '--' }\n${ Styles.ERROR('Tests failed') } : ${ validationResults.results!.failedTests ?? '--' }` : ''; + //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 4: Upload results + { + try { + console.log(Styles.INFO(`${ Icon.INFO } Uploading results to the dojo server`)); + const commit: any = {}; + Toolbox.getKeysWithPrefix(process.env, 'CI_COMMIT_').forEach(key => { + commit[Toolbox.snakeToCamel(key.replace('CI_COMMIT_', ''))] = process.env[key]; + }); + + const files = await RecursiveFilesStats.explore(Config.folders.resultsVolume, { + replacePathByRelativeOne: true, + liteStats : true + }); + + await DojoBackendManager.sendResults(exerciceDockerCompose.exitCode, commit, exerciceResultsValidation.exerciceResults!, files, await ArchiveHelper.getBase64(Config.folders.resultsVolume)); + } catch ( error ) { + console.error(Styles.ERROR(`${ Icon.ERROR } Error while uploading the results`)); + console.error(JSON.stringify(error)); + process.exit(ExerciceCheckerError.UPLOAD); + } + } - const finalLogSuccessResultDetails = (validationResults.results!.successfulTestsList ?? []).map(testName => `- ${ Icon.SUCCESS } ${ testName }`).join('\n'); - const finalLogFailedResultDetails = (validationResults.results!.failedTestsList ?? []).map(testName => `- ${ Icon.FAILURE } ${ testName }`).join('\n'); - const finalLogResultDetails = validationResults.results!.successfulTestsList || validationResults.results!.failedTestsList ? `\n\n${ Styles.INFO('Tests') } :${ finalLogSuccessResultDetails != '' ? '\n' + finalLogSuccessResultDetails : '' }${ finalLogFailedResultDetails != '' ? '\n' + finalLogFailedResultDetails : '' }` : ''; - console.log(boxen(`${ finalLogGlobalResult }\n\n${ finalLogExecutionExitCode }${ finalLogResultNumbers }${ finalLogResultDetails }`, { - title : 'Results', - titleAlignment: 'center', - borderColor : 'yellow', - borderStyle : 'bold', - margin : 1, - padding : 1, - textAlignment : 'left' - })); + /* + //////////////////////////////////////////////////////////////////////////////////////////////////////////// Step 5: + - Display results + - Exit with container exit code + */ + { + ClientsSharedExerciceHelper.displayExecutionResults(exerciceResultsValidation.exerciceResults!, exerciceDockerCompose.exitCode, Styles, `\n\n${ Icon.INFO }️ More detailed logs and resources may be available in artifacts`); - process.exit(containerExitCode); + process.exit(exerciceDockerCompose.exitCode); + } })(); \ No newline at end of file diff --git a/ExerciceChecker/src/config/Config.ts b/ExerciceChecker/src/config/Config.ts index 6782c1447cc3451953505896560565b424fda141..5d7d609c432d1574fb879903c9b735e21b07074e 100644 --- a/ExerciceChecker/src/config/Config.ts +++ b/ExerciceChecker/src/config/Config.ts @@ -5,49 +5,29 @@ import path from 'path'; class Config { public readonly appName: string; - public readonly resultsFolderMaxSizeInBytes: number; - public readonly folders: { project: string; resultsVolume: string; resultsDojo: string; resultsExercice: string; }; - public readonly filenames: { - results: string; - }; - public readonly exercice: { id: string; secret: string; }; - public readonly dockerCompose: { - projectName: string - }; - constructor() { this.appName = process.env.APP_NAME || ''; - this.resultsFolderMaxSizeInBytes = Number(process.env.RESULTS_FOLDER_MAX_SIZE_IN_BYTES || 0); - this.folders = { - project : process.env.FILES_FOLDER?.convertWithEnvVars() ?? './', - resultsVolume : process.env.RESULTS_VOLUME?.convertWithEnvVars() ?? '', - resultsDojo : path.join(process.env.RESULTS_VOLUME?.convertWithEnvVars() ?? '', 'Dojo/'), - resultsExercice: path.join(process.env.RESULTS_VOLUME?.convertWithEnvVars() ?? '', 'Exercice/') + project : process.env.PROJECT_FOLDER?.convertWithEnvVars() ?? './', + resultsVolume : process.env.EXERCICE_RESULTS_VOLUME?.convertWithEnvVars() ?? '', + resultsDojo : path.join(process.env.EXERCICE_RESULTS_VOLUME?.convertWithEnvVars() ?? '', 'Dojo/'), + resultsExercice: path.join(process.env.EXERCICE_RESULTS_VOLUME?.convertWithEnvVars() ?? '', 'Exercice/') }; this.resetResultsVolume(); - this.filenames = { - results: process.env.RESULTS_FILENAME || '' - }; - this.exercice = { id : process.env.DOJO_EXERCICE_ID || '', secret: process.env.DOJO_SECRET || '' }; - - this.dockerCompose = { - projectName: process.env.DOCKER_COMPOSE_PROJECT_NAME || '' - }; } private resetResultsVolume(): void { diff --git a/ExerciceChecker/src/managers/DojoBackendManager.ts b/ExerciceChecker/src/managers/DojoBackendManager.ts index c1cb4c6df7f4f4d26023acd14ef1a7fe22245142..27df41e9a2f3d47ea2a262ba3c96b67ce9fba2d1 100644 --- a/ExerciceChecker/src/managers/DojoBackendManager.ts +++ b/ExerciceChecker/src/managers/DojoBackendManager.ts @@ -1,20 +1,20 @@ import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig'; -import ApiRoutes from '../sharedByClients/types/ApiRoutes'; import axios from 'axios'; import DojoResponse from '../shared/types/Dojo/DojoResponse'; import ExerciceEnonce from '../sharedByClients/models/ExerciceEnonce'; import Config from '../config/Config'; import ExerciceResultsFile from '../shared/types/Dojo/ExerciceResultsFile'; +import ApiRoute from '../sharedByClients/types/Dojo/ApiRoute'; class DojoBackendManager { - public getApiUrl(route: ApiRoutes): string { + public getApiUrl(route: ApiRoute): string { return `${ ClientsSharedConfig.apiURL }${ route }`; } public async getExerciceEnonce(): Promise<ExerciceEnonce | undefined> { try { - return (await axios.get<DojoResponse<ExerciceEnonce>>(this.getApiUrl(ApiRoutes.EXERCICE_ENONCE).replace('{{id}}', Config.exercice.id))).data.data; + return (await axios.get<DojoResponse<ExerciceEnonce>>(this.getApiUrl(ApiRoute.EXERCICE_ENONCE).replace('{{id}}', Config.exercice.id))).data.data; } catch ( error ) { return undefined; } @@ -22,7 +22,7 @@ class DojoBackendManager { public async sendResults(exitCode: number, commit: any, results: ExerciceResultsFile, files: any, archiveBase64: string): Promise<void> { try { - await axios.post(this.getApiUrl(ApiRoutes.EXERCICE_RESULTS).replace('{{id}}', Config.exercice.id), { + await axios.post(this.getApiUrl(ApiRoute.EXERCICE_RESULTS).replace('{{id}}', Config.exercice.id), { exitCode : exitCode, commit : JSON.stringify(commit), results : JSON.stringify(results), diff --git a/ExerciceChecker/src/shared b/ExerciceChecker/src/shared index eab5c0a5a32079fcb439a1ad79453611c8605536..f33e4e0c7b34f9060e8995550920d25cd3e73c40 160000 --- a/ExerciceChecker/src/shared +++ b/ExerciceChecker/src/shared @@ -1 +1 @@ -Subproject commit eab5c0a5a32079fcb439a1ad79453611c8605536 +Subproject commit f33e4e0c7b34f9060e8995550920d25cd3e73c40 diff --git a/ExerciceChecker/src/sharedByClients b/ExerciceChecker/src/sharedByClients index c0f105590a4332ce4d6eff046324e537e769f756..8872f91f280e60287c4dba46de58f3f412e0a462 160000 --- a/ExerciceChecker/src/sharedByClients +++ b/ExerciceChecker/src/sharedByClients @@ -1 +1 @@ -Subproject commit c0f105590a4332ce4d6eff046324e537e769f756 +Subproject commit 8872f91f280e60287c4dba46de58f3f412e0a462 diff --git a/ExerciceChecker/src/types/ExerciceCheckerError.ts b/ExerciceChecker/src/types/ExerciceCheckerError.ts deleted file mode 100644 index 2bb09d5c99b395c073ee2f7c61727de1ea910ea3..0000000000000000000000000000000000000000 --- a/ExerciceChecker/src/types/ExerciceCheckerError.ts +++ /dev/null @@ -1,12 +0,0 @@ -enum ExerciceCheckerError { - EXERCICE_ENONCE_GET_ERROR = 200, - DOCKER_COMPOSE_UP_ERROR = 201, - DOCKER_COMPOSE_LOGS_ERROR = 202, - EXERCICE_RESULTS_FOLDER_TOO_BIG = 203, - EXERCICE_RESULTS_FILE_NOT_FOUND = 204, - EXERCICE_RESULTS_FILE_SCHEMA_NOT_VALID = 205, - UPLOAD = 206 -} - - -export default ExerciceCheckerError; \ No newline at end of file diff --git a/ExerciceChecker/src/types/Icon.ts b/ExerciceChecker/src/types/Icon.ts deleted file mode 100644 index 9d5a0ec79d20073891288ac585615e8ead980132..0000000000000000000000000000000000000000 --- a/ExerciceChecker/src/types/Icon.ts +++ /dev/null @@ -1,9 +0,0 @@ -enum Icon { - INFO = 'ℹ️', - ERROR = '⛔️', - SUCCESS = '✅', - FAILURE = '❌' -} - - -export default Icon; \ No newline at end of file diff --git a/ExerciceChecker/src/types/Styles.ts b/ExerciceChecker/src/types/Style.ts similarity index 85% rename from ExerciceChecker/src/types/Styles.ts rename to ExerciceChecker/src/types/Style.ts index 64f6bdd5ea6ce4b1481560d600582021de114744..3b9d9f986980bd4d132da2f91bb92522825920c7 100644 --- a/ExerciceChecker/src/types/Styles.ts +++ b/ExerciceChecker/src/types/Style.ts @@ -1,7 +1,7 @@ import chalk from 'chalk'; -class Styles { +class Style { public readonly APP_NAME = chalk.bgBlue.black.bold; public readonly INFO = chalk.blue; public readonly ERROR = chalk.red; @@ -10,4 +10,4 @@ class Styles { } -export default new Styles(); \ No newline at end of file +export default new Style(); \ No newline at end of file