-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathgenerer-exercice.js
151 lines (124 loc) · 5.55 KB
/
generer-exercice.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import path from 'path';
import fs from 'fs';
// Si le script est renommé ou change de dossier, on récupère les infos dynamiquement
const [ , cheminAbsoluDuScript, lettreNiveauDifficulte] = process.argv;
const cheminRelatifDuScript = cheminAbsoluDuScript.replace(process.cwd() + path.sep, "");
// On définit les niveaux de difficulté possibles
const niveauxDifficulte = {
f: {
nom: "facile",
nomRepertoire: "00-facile",
},
m: {
nom: "moyen",
nomRepertoire: "01-moyen",
},
d: {
nom: "difficile",
nomRepertoire: "02-difficile",
},
e: {
nom: "expert",
nomRepertoire: "03-expert",
},
}
// On vérifie qu'il y a bien un niveau de difficulté correct indiqué, sinon on affiche l'aide
const niveauDifficulteChoisi = niveauxDifficulte[lettreNiveauDifficulte];
if (process.argv.length !== 3 || niveauDifficulteChoisi === undefined) {
console.log(
`Merci d'indiquer le niveau de difficulté d'un exercice par une lettre :
f = facile, m = moyen, d = difficile, e = expert
Utilisation : node ${cheminRelatifDuScript} f|m|d|e
Exemple d'ajout d'un exercice de niveau moyen :
node ${cheminRelatifDuScript} m`);
process.exit(1);
}
console.log(`Ajout d'un exercice de niveau ${niveauDifficulteChoisi.nom}...`);
const dossierNiveauDifficulte = chercherDossierNiveauDifficulte(cheminAbsoluDuScript, niveauDifficulteChoisi);
if (dossierNiveauDifficulte === null) {
console.log(`Impossible de trouver le dossier ${niveauDifficulteChoisi.nomRepertoire}`);
process.exit(1);
}
const numeroExercice = calculerNumeroProchainExercice(dossierNiveauDifficulte);
const dossierPourNouvelExercice = creerDossierNouvelExercice(dossierNiveauDifficulte, numeroExercice);
console.log(`Répertoire du nouvel exercice créé : ${dossierPourNouvelExercice}`);
creerFichiersNouvelExercice(dossierPourNouvelExercice, numeroExercice);
console.log("Terminé :) !");
console.log("Il ne reste plus qu'à remplir ces fichiers... Merci !");
/*
On recherche le dossier du niveau de difficulté choisi pour y ajouter l'exercice.
Limitation : la recherche s'effectue à partir du dossier contenant ce script et en
remontant dans l'arborescence.
*/
function chercherDossierNiveauDifficulte(cheminAbsolu, niveauDifficulte) {
let repertoireCourant = path.dirname(cheminAbsolu);
do {
let nomTheoriqueDossierDifficulte = path.join(repertoireCourant, niveauDifficulte.nomRepertoire);
try {
const infoSurChemin = fs.statSync(nomTheoriqueDossierDifficulte);
// On teste qu'on est bien sur un dossier (car ça pourrait être un fichier du même nom !)
if (infoSurChemin.isDirectory()) {
// On a trouvé le bon dossier !
return nomTheoriqueDossierDifficulte;
}
} catch (e) {
// Le fichier n'existe pas, on remonte au dossier parent
repertoireCourant = path.dirname(repertoireCourant);
}
} while (repertoireCourant !== path.sep || repertoireCourant.length === 0);
// Si on arrive ici, c'est qu'on n'a pas trouvé le dossier !
return null;
}
function calculerNumeroProchainExercice(dossier) {
const listeFichiers = fs.readdirSync(dossier);
let listeDossiersExercices = listeFichiers.filter(nomFichier => {
if (nomFichier.startsWith('exercice-')) {
const infoSurFichier = fs.statSync(path.join(dossier, nomFichier));
// On teste qu'on est bien sur un dossier (car ça pourrait être un fichier du même nom !)
return infoSurFichier.isDirectory();
}
return false;
});
// S'il n'y a aucun dossier exercice-<nombre> c'est qu'on doit créer le tout premier
if (listeDossiersExercices.length === 0) {
return 0;
}
// On récupère les nombres de tous les dossiers
listeNumeros = listeDossiersExercices.reduce(function(acc, nomRepertoire) {
const dernierePartieDuNom = nomRepertoire.split('-').pop();
// On vérifie que c'est bien un nombre, car on pourrait avoir un dossier exercice-test par exemple !
const nombre = parseInt(dernierePartieDuNom);
if (!isNaN(nombre)) {
acc.push(nombre);
}
return acc;
}, []);
return Math.max(...listeNumeros) + 1;
}
function creerDossierNouvelExercice(dossierNiveauDifficulte, numeroExercice) {
const cheminAbsoluDossierNouvelExercice = path.join(dossierNiveauDifficulte, `exercice-${numeroExercice}`);
fs.mkdirSync(cheminAbsoluDossierNouvelExercice);
return cheminAbsoluDossierNouvelExercice;
}
function creerFichiersNouvelExercice(cheminAbsoluDossierNouvelExercice, numeroExercice) {
// On copie les modèles de fichier avec les bons noms et le bon contenu
const nomFichierEnonce = `enonce-exercice-${numeroExercice}.md`;
const nomFichierJavaScript = `exercice-${numeroExercice}.js`;
const nomFichierTest = `exercice-${numeroExercice}.test.js`;
const contenuEnonce = `# Exercice ${numeroExercice}
## Exemples
- `;
const contenuFichierJavaScript = `export function exercice${numeroExercice}() {
}`;
const contenuFichierTest = `import { exercice${numeroExercice} } from './exercice-${numeroExercice}.js';
test('', () => {
expect(exercice${numeroExercice}()).toBe();
});`;
// Création des fichiers d'exercices avec leur contenu
console.log(`Génération du fichier ${nomFichierEnonce}...`);
fs.writeFileSync(path.join(cheminAbsoluDossierNouvelExercice, nomFichierEnonce), contenuEnonce);
console.log(`Génération du fichier ${nomFichierJavaScript}...`);
fs.writeFileSync(path.join(cheminAbsoluDossierNouvelExercice, nomFichierJavaScript), contenuFichierJavaScript);
console.log(`Génération du fichier ${nomFichierTest}...`);
fs.writeFileSync(path.join(cheminAbsoluDossierNouvelExercice, nomFichierTest), contenuFichierTest);
}