maintenance.exl_mathExos
Module de scripts (à exécuter localement) spécifiques au dépôt d'exercices et complétant les commandes définies dans le manifeste.
Modifié le 15/03/23 @author: remy
Ce module est importé par l'instanciation de l'objet Execlocal
.
Les traitements sont exécutés par la fonction exec()
du module.
1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3""" 4Module de scripts (à exécuter localement) spécifiques au dépôt d'exercices et complétant les commandes définies dans le manifeste. 5 6Modifié le 15/03/23 @author: remy 7 8Ce module est importé par l'instanciation de l'objet `Execlocal`. 9Les traitements sont exécutés par la fonction `exec()` du module. 10 11""" 12import csv 13import glob 14import os.path 15import re 16import scantex 17 18 19dp_data = {} 20dp_data['relative_path'] = '../math-exos/' 21relpath = '../math-exos/' 22lineprefix = "\n \t \t" 23 24 25def exec(data): 26 """ 27 Exécute les traitements spécifiques et complète le journal. 28 29 - Forme les exos individuels et les feuilles d'exos LateX. 30 - Lit les thèmes depuis le fichier `_codes.csv` 31 - Pour chaque thème, forme le fichier LateX `A_` 32 - Pour chaque exercice, forme le fichier LateX `Aexo_` 33 - Extrait la liste des indexations 34 35 #### Paramètres 36 `data`: données d'exécution locale, valeur de `execloc` dans le dictionnaire `manifeste` défini par le module d'initialisation [`init_mathExos`](init_mathExos.html). 37 38 #### Renvoie 39 40 TYPE : dictionnaire 41 42 `log`: journal de l'exécution des scripts 43 `specific_results`: dictionnaire 44 `listeExos`: dictionnaire clé= code thème, valeur = liste exos 45 `themes`: dictionnaire clé= code thème, valeur = littéral du thème 46 47 """ 48 log = lineprefix + 'Scripts du module spécifique (fonction exec())' 49 specific_results = {} 50 51 # Feuilles par thèmes 52 theme = getThemes() 53 specific_results['themes'] = theme 54 55 log += '\n \t\t\t Création modification des feuilles LateX' 56 for code in theme: 57 if aecrirefeuilleA(code): 58 log += ecritFeuilleA(code, theme[code]) 59 60 # Exercices individuels "Aexo_" 61 log += '\n\n \t \t \t Création modification des "Aexo_" Latex individuels' 62 lili = listeExos() 63 for theme in lili: 64 for nomexo in lili[theme]: 65 if aecrireAexo(nomexo): 66 log += ecritAexo(nomexo) 67 specific_results['listeExos'] = lili 68 69 # renseigne la propriété .indexations 70 idx_path_pattern = data['context_data']['idx_path_pattern'] 71 indexations = scantex.get_liste_indexations(idx_path_pattern) 72 log += lineprefix + str(len(indexations)) + " indexations \n" 73 specific_results['indexations'] = indexations 74 75 return {'log': log , 'specific_results': specific_results } 76 77 78def ecritFeuilleA(code, dscrpt): 79 """ 80 Exécute les scripts Python spécifiques à ce dépôt. 81 82 ici 83 - création ou maj feuille d'exos Latex d'un thème 84 85 86 #### Parametres 87 88 code : TYPE str 89 DESCRIPTION code du thème dans le fichier `_code.csv`. 90 dscrpt : TYPE str 91 DESCRIPTION description du thème dans le fichier `_code.csv`. 92 93 #### Renvoie 94 95 log : TYPE str 96 DESCRIPTION journal de l'exécution. 97 98 """ 99 log = '\n \t \t \t' + code + ' : ' + dscrpt 100 exos_list = glob.glob(relpath + 'E' + code + '*.tex') 101 exos_list.sort() 102 dates = map(os.path.getmtime, exos_list) 103 date_inputs = max(dates) 104 105 # début fichier 106 Latex = '\\input{exopdf} \n' 107 Latex += '\\begin{document} \n' 108 109 # énoncés 110 Latex += '\\chead{ ' + dscrpt + ': énoncés.}\n' 111 Latex += '\\begin{enumerate}\n' 112 for exo in exos_list: 113 exo = os.path.basename(exo) 114 Latex += ' \\item \\input{' + exo + '} \n' 115 Latex += '\\end{enumerate} \n' 116 117 # corrigés 118 Latex += '\\clearpage \n' 119 Latex += '\\chead{' + dscrpt + ': corrigés.}\n' 120 Latex += '\\begin{enumerate}\n' 121 for exo in exos_list: 122 exoC = exo.replace('E' + code, 'C' + code) 123 if os.path.isfile(exoC): 124 date_inputs = max(date_inputs, os.path.getmtime(exoC)) 125 Latex += ' \\item \\input{' + os.path.basename(exoC) + '} \n' 126 else: 127 Latex += ' \\item ' + os.path.basename(exoC) + ' manque. \n' 128 Latex += '\\end{enumerate} \n' 129 130 # fin fichier 131 Latex += '\\end{document}' 132 133 # écrit le Latex dans un fichier A# 134 pathA = relpath + 'A_' + code + '.tex' 135 136 with open(pathA, 'w') as fifi: 137 fifi.write(Latex) 138 log += ' NOUVEAU OU MODIFIÉ ' + pathA 139 140 return log 141 142 143def aecrirefeuilleA(code): 144 """ 145 Renvoie VRAI ou FAUX. 146 147 VRAI si le fichier LateX "A" du thème doit être créé ou modifié 148 c'est à dire si 149 150 - le fichier "A" n'existe pas 151 ou 152 - la liste des fichiers "E" ou "C" n'est pas dans celle des input 153 154 #### Parametres 155 156 code : TYPE str 157 DESCRIPTION code du theme. 158 159 #### Renvoie 160 161 bool. 162 163 """ 164 pathA = relpath + 'A_' + code + '.tex' 165 166 bouboule = False 167 if not os.path.isfile(pathA): 168 bouboule = True 169 else: 170 inputs = set(scantex.get_liste_inputs(pathA)) 171 fifi = set(listeExos()[code]) | set(listeCorriges()[code]) 172 bouboule = not (fifi <= inputs) 173 return bouboule 174 175 176def aecrireAexo(nomexo): 177 """ 178 Renvoie VRAI si le fichier "Aexo" de l'exercice doit être créé 179 ou modifié. C'est à dire si : 180 181 - le fichier "Aexo_" n'existe pas' 182 ou 183 - le fichier "Aexo_" ne contient pas de corrigé alors qu'il existe 184 un fichier "C". 185 186 #### Parametres 187 188 nomexo : TYPE str 189 DESCRIPTION nom du fichier "E" d'un exercice. 190 191 #### Renvoie 192 193 TYPE bool 194 195 """ 196 exospath = dp_data['relative_path'] 197 nomexoC = nomexo.replace('E', 'C') 198 nomexoA = nomexo.replace('E', 'Aexo_') 199 pathC = exospath + nomexoC 200 pathA = exospath + nomexoA 201 bouboule = False 202 if not os.path.isfile(pathA): 203 bouboule = True 204 elif os.path.isfile(pathC): 205 with open(pathA) as fifi: 206 latex = fifi.read() 207 if "pas encore de corrigé" in latex: 208 bouboule = True 209 return bouboule 210 211 212def ecritAexo(nomexo): 213 """ 214 Forme le fichier latex "Aexo_" d'un exercice particulier' 215 et l'écrit dans le dépôt. 216 217 218 #### Parametres 219 220 nomexo : 221 TYPE str 222 DESCRIPTION nom du fichier de l'exercice (énoncé). 223 224 #### Renvoie 225 226 None ou le nom du fichier Aexo modifié. 227 228 """ 229 log = '' 230 exospath = dp_data['relative_path'] 231 nomexoE = nomexo 232 nomexoC = nomexo.replace('E', 'C') 233 nomexoA = nomexo.replace('E', 'Aexo_') 234 pathE = exospath + nomexoE 235 pathC = exospath + nomexoC 236 pathA = exospath + nomexoA 237 238 # début fichier 239 Latex = '\\input{exo4ht} \n' 240 Latex += '\\begin{document} \n' 241 Latex += 'Énoncé \n\n' 242 Latex += '\\input{' + os.path.basename(pathE) + '}\n\n' 243 Latex += 'Corrigé \n\n' 244 if os.path.isfile(pathC): 245 Latex += '\\input{' + os.path.basename(pathC) + '}\n' 246 else: 247 Latex += 'pas encore de corrigé\n' 248 Latex += '\\end{document}' 249 # print(Latex) 250 251 """ 252 On écrit toujours. 253 """ 254 with open(pathA, 'w') as fifi: 255 fifi.write(Latex) 256 log += '\n \t\t\t' + os.path.basename(pathA) 257 return log 258 # sinon ne renvoie rien 259 260 261def listeExosTheme(code): 262 """ 263 Renvoie la liste des exos du theme codé 264 265 #### Parametres 266 267 code: 268 TYPE str 269 DESCRIPTION le code d'un thème 270 271 #### Renvoie 272 273 liste de chemins de fichier Latex d'énoncé 274 """ 275 exos_list = glob.glob(relpath + 'E' + code + '*.tex') 276 exos_list.sort() 277 return exos_list 278 279 280def listeExosCorrTheme(code): 281 """ 282 Renvoie la liste des exos corrigés du theme codé 283 284 #### Parametres 285 286 code: 287 TYPE str 288 DESCRIPTION le code d'un thème 289 290 #### Renvoie 291 292 liste de chemins de fichiers Latex de corrigés 293 """ 294 exos_list = glob.glob(relpath + 'C' + code + '*.tex') 295 exos_list.sort() 296 return exos_list 297 298 299def getThemes(): 300 """ 301 Lit les thèmes depuis le fichier _codes.csv 302 303 #### Renvoie 304 305 dictThemes : TYPE dict 306 DESCRIPTION key=code, val=description. 307 308 """ 309 dictThemes = {} 310 with open('../math-exos/' + '_codes.csv', newline='') as csvfile: 311 riri = csv.reader(csvfile, delimiter=';') 312 for row in riri: 313 dictThemes[row[0]] = row[1] 314 dictThemes.pop('codetheme') 315 return dictThemes 316 317 318def listeExos(): 319 """ 320 321 #### Renvoie 322 323 dictionnaire 324 - clé = code d'un thème 325 - valeur = liste des noms des fichiers d'énoncé 326 327 """ 328 themes = getThemes() 329 exospath = relpath 330 files = os.listdir(exospath) 331 332 exercices = {} 333 334 for code in themes: 335 exercices[code] = [] 336 regexpr = "^E" + code + "[0-9]{2}.tex" 337 for file in files: 338 if re.match(regexpr, file): 339 exercices[code].append(file) 340 exercices[code].sort() 341 return exercices 342 343 344def listeCorriges(): 345 """ 346 347 #### Renvoie 348 349 dictionnaire 350 - clé = code d'un thème 351 - valeur = liste des noms des fichiers d'énoncé 352 353 """ 354 themes = getThemes() 355 exospath = relpath 356 files = os.listdir(exospath) 357 358 exercices = {} 359 360 for code in themes: 361 exercices[code] = [] 362 regexpr = "^C" + code + "[0-9]{2}.tex" 363 for file in files: 364 if re.match(regexpr, file): 365 exercices[code].append(file) 366 exercices[code].sort() 367 return exercices 368 369 370def listeExosNoncorr(): 371 """ 372 373 #### Renvoie 374 375 dictionnaire des exercices (énoncés) non corrigés 376 - clé = code d'un thème 377 - valeur = liste des noms des fichiers d'énoncé 378 379 380 """ 381 exospath = relpath 382 exercices = listeExos() 383 exercicesNC = {} 384 for code in exercices: 385 exercicesNC[code] = [] 386 for file in exercices[code]: 387 fileC = file.replace('E', 'C') 388 pathC = exospath + fileC 389 if not os.path.isfile(pathC): 390 exercicesNC[code].append(file) 391 return exercicesNC 392 393 394def ecritTousAexos(): 395 """ 396 Écrit tous les "Aexos_" dans le dépôt. Ne doit être utilisé qu'une fois 397 398 #### Renvoie 399 400 None. 401 402 """ 403 exercices = listeExos() 404 for code in exercices: 405 for nomexo in exercices[code]: 406 ecritAexo(nomexo) 407 408 409def listeAexosNoncorr(): 410 """ 411 Liste des enoncés dont le "Aexo_" ne contient pas de corrigé. 412 413 #### Renvoie 414 415 None. 416 417 """ 418 exospath = relpath 419 exercices = listeExos() 420 AexosNoncorr = {} 421 for code in exercices: 422 AexosNoncorr[code] = [] 423 for nomexo in exercices[code]: 424 nomexoA = nomexo.replace('E', 'Aexo_') 425 pathA = exospath + nomexoA 426 with open(pathA) as fifi: 427 latex = fifi.read() 428 if "pas encore de corrigé" in latex: 429 AexosNoncorr[code].append(nomexo) 430 AexosNoncorr[code].sort() 431 return AexosNoncorr 432 433 434def modifTousAexos(): 435 """ 436 Modifie tous les "Aexos" qui doivent l'être. 437 C'est à dire ceux qui contiennent "pas encore de corrigé" alors 438 qu'un corrigé existe. 439 440 #### Renvoie 441 442 None. 443 444 """ 445 lA = listeAexosNoncorr() 446 lE = listeExosNoncorr() 447 lili = [] 448 for code in lA: 449 amodif = set(lA[code]) - set(lE[code]) 450 for nomexo in amodif: 451 print(nomexo) 452 ecritAexo(nomexo) 453 lili.append(nomexo) 454 return lili
26def exec(data): 27 """ 28 Exécute les traitements spécifiques et complète le journal. 29 30 - Forme les exos individuels et les feuilles d'exos LateX. 31 - Lit les thèmes depuis le fichier `_codes.csv` 32 - Pour chaque thème, forme le fichier LateX `A_` 33 - Pour chaque exercice, forme le fichier LateX `Aexo_` 34 - Extrait la liste des indexations 35 36 #### Paramètres 37 `data`: données d'exécution locale, valeur de `execloc` dans le dictionnaire `manifeste` défini par le module d'initialisation [`init_mathExos`](init_mathExos.html). 38 39 #### Renvoie 40 41 TYPE : dictionnaire 42 43 `log`: journal de l'exécution des scripts 44 `specific_results`: dictionnaire 45 `listeExos`: dictionnaire clé= code thème, valeur = liste exos 46 `themes`: dictionnaire clé= code thème, valeur = littéral du thème 47 48 """ 49 log = lineprefix + 'Scripts du module spécifique (fonction exec())' 50 specific_results = {} 51 52 # Feuilles par thèmes 53 theme = getThemes() 54 specific_results['themes'] = theme 55 56 log += '\n \t\t\t Création modification des feuilles LateX' 57 for code in theme: 58 if aecrirefeuilleA(code): 59 log += ecritFeuilleA(code, theme[code]) 60 61 # Exercices individuels "Aexo_" 62 log += '\n\n \t \t \t Création modification des "Aexo_" Latex individuels' 63 lili = listeExos() 64 for theme in lili: 65 for nomexo in lili[theme]: 66 if aecrireAexo(nomexo): 67 log += ecritAexo(nomexo) 68 specific_results['listeExos'] = lili 69 70 # renseigne la propriété .indexations 71 idx_path_pattern = data['context_data']['idx_path_pattern'] 72 indexations = scantex.get_liste_indexations(idx_path_pattern) 73 log += lineprefix + str(len(indexations)) + " indexations \n" 74 specific_results['indexations'] = indexations 75 76 return {'log': log , 'specific_results': specific_results }
Exécute les traitements spécifiques et complète le journal.
- Forme les exos individuels et les feuilles d'exos LateX.
- Lit les thèmes depuis le fichier
_codes.csv
- Pour chaque thème, forme le fichier LateX
A_
- Pour chaque exercice, forme le fichier LateX
Aexo_
- Lit les thèmes depuis le fichier
- Extrait la liste des indexations
Paramètres
data
: données d'exécution locale, valeur de execloc
dans le dictionnaire manifeste
défini par le module d'initialisation init_mathExos
.
Renvoie
TYPE : dictionnaire
`log`: journal de l'exécution des scripts
`specific_results`: dictionnaire
`listeExos`: dictionnaire clé= code thème, valeur = liste exos
`themes`: dictionnaire clé= code thème, valeur = littéral du thème
79def ecritFeuilleA(code, dscrpt): 80 """ 81 Exécute les scripts Python spécifiques à ce dépôt. 82 83 ici 84 - création ou maj feuille d'exos Latex d'un thème 85 86 87 #### Parametres 88 89 code : TYPE str 90 DESCRIPTION code du thème dans le fichier `_code.csv`. 91 dscrpt : TYPE str 92 DESCRIPTION description du thème dans le fichier `_code.csv`. 93 94 #### Renvoie 95 96 log : TYPE str 97 DESCRIPTION journal de l'exécution. 98 99 """ 100 log = '\n \t \t \t' + code + ' : ' + dscrpt 101 exos_list = glob.glob(relpath + 'E' + code + '*.tex') 102 exos_list.sort() 103 dates = map(os.path.getmtime, exos_list) 104 date_inputs = max(dates) 105 106 # début fichier 107 Latex = '\\input{exopdf} \n' 108 Latex += '\\begin{document} \n' 109 110 # énoncés 111 Latex += '\\chead{ ' + dscrpt + ': énoncés.}\n' 112 Latex += '\\begin{enumerate}\n' 113 for exo in exos_list: 114 exo = os.path.basename(exo) 115 Latex += ' \\item \\input{' + exo + '} \n' 116 Latex += '\\end{enumerate} \n' 117 118 # corrigés 119 Latex += '\\clearpage \n' 120 Latex += '\\chead{' + dscrpt + ': corrigés.}\n' 121 Latex += '\\begin{enumerate}\n' 122 for exo in exos_list: 123 exoC = exo.replace('E' + code, 'C' + code) 124 if os.path.isfile(exoC): 125 date_inputs = max(date_inputs, os.path.getmtime(exoC)) 126 Latex += ' \\item \\input{' + os.path.basename(exoC) + '} \n' 127 else: 128 Latex += ' \\item ' + os.path.basename(exoC) + ' manque. \n' 129 Latex += '\\end{enumerate} \n' 130 131 # fin fichier 132 Latex += '\\end{document}' 133 134 # écrit le Latex dans un fichier A# 135 pathA = relpath + 'A_' + code + '.tex' 136 137 with open(pathA, 'w') as fifi: 138 fifi.write(Latex) 139 log += ' NOUVEAU OU MODIFIÉ ' + pathA 140 141 return log
Exécute les scripts Python spécifiques à ce dépôt.
ici - création ou maj feuille d'exos Latex d'un thème
Parametres
code : TYPE str
DESCRIPTION code du thème dans le fichier _code.csv
.
dscrpt : TYPE str
DESCRIPTION description du thème dans le fichier _code.csv
.
Renvoie
log : TYPE str DESCRIPTION journal de l'exécution.
144def aecrirefeuilleA(code): 145 """ 146 Renvoie VRAI ou FAUX. 147 148 VRAI si le fichier LateX "A" du thème doit être créé ou modifié 149 c'est à dire si 150 151 - le fichier "A" n'existe pas 152 ou 153 - la liste des fichiers "E" ou "C" n'est pas dans celle des input 154 155 #### Parametres 156 157 code : TYPE str 158 DESCRIPTION code du theme. 159 160 #### Renvoie 161 162 bool. 163 164 """ 165 pathA = relpath + 'A_' + code + '.tex' 166 167 bouboule = False 168 if not os.path.isfile(pathA): 169 bouboule = True 170 else: 171 inputs = set(scantex.get_liste_inputs(pathA)) 172 fifi = set(listeExos()[code]) | set(listeCorriges()[code]) 173 bouboule = not (fifi <= inputs) 174 return bouboule
Renvoie VRAI ou FAUX.
VRAI si le fichier LateX "A" du thème doit être créé ou modifié c'est à dire si
- le fichier "A" n'existe pas ou
- la liste des fichiers "E" ou "C" n'est pas dans celle des input
Parametres
code : TYPE str DESCRIPTION code du theme.
Renvoie
bool.
177def aecrireAexo(nomexo): 178 """ 179 Renvoie VRAI si le fichier "Aexo" de l'exercice doit être créé 180 ou modifié. C'est à dire si : 181 182 - le fichier "Aexo_" n'existe pas' 183 ou 184 - le fichier "Aexo_" ne contient pas de corrigé alors qu'il existe 185 un fichier "C". 186 187 #### Parametres 188 189 nomexo : TYPE str 190 DESCRIPTION nom du fichier "E" d'un exercice. 191 192 #### Renvoie 193 194 TYPE bool 195 196 """ 197 exospath = dp_data['relative_path'] 198 nomexoC = nomexo.replace('E', 'C') 199 nomexoA = nomexo.replace('E', 'Aexo_') 200 pathC = exospath + nomexoC 201 pathA = exospath + nomexoA 202 bouboule = False 203 if not os.path.isfile(pathA): 204 bouboule = True 205 elif os.path.isfile(pathC): 206 with open(pathA) as fifi: 207 latex = fifi.read() 208 if "pas encore de corrigé" in latex: 209 bouboule = True 210 return bouboule
Renvoie VRAI si le fichier "Aexo" de l'exercice doit être créé ou modifié. C'est à dire si :
- le fichier "Aexo_" n'existe pas' ou
- le fichier "Aexo_" ne contient pas de corrigé alors qu'il existe un fichier "C".
Parametres
nomexo : TYPE str DESCRIPTION nom du fichier "E" d'un exercice.
Renvoie
TYPE bool
213def ecritAexo(nomexo): 214 """ 215 Forme le fichier latex "Aexo_" d'un exercice particulier' 216 et l'écrit dans le dépôt. 217 218 219 #### Parametres 220 221 nomexo : 222 TYPE str 223 DESCRIPTION nom du fichier de l'exercice (énoncé). 224 225 #### Renvoie 226 227 None ou le nom du fichier Aexo modifié. 228 229 """ 230 log = '' 231 exospath = dp_data['relative_path'] 232 nomexoE = nomexo 233 nomexoC = nomexo.replace('E', 'C') 234 nomexoA = nomexo.replace('E', 'Aexo_') 235 pathE = exospath + nomexoE 236 pathC = exospath + nomexoC 237 pathA = exospath + nomexoA 238 239 # début fichier 240 Latex = '\\input{exo4ht} \n' 241 Latex += '\\begin{document} \n' 242 Latex += 'Énoncé \n\n' 243 Latex += '\\input{' + os.path.basename(pathE) + '}\n\n' 244 Latex += 'Corrigé \n\n' 245 if os.path.isfile(pathC): 246 Latex += '\\input{' + os.path.basename(pathC) + '}\n' 247 else: 248 Latex += 'pas encore de corrigé\n' 249 Latex += '\\end{document}' 250 # print(Latex) 251 252 """ 253 On écrit toujours. 254 """ 255 with open(pathA, 'w') as fifi: 256 fifi.write(Latex) 257 log += '\n \t\t\t' + os.path.basename(pathA) 258 return log 259 # sinon ne renvoie rien
Forme le fichier latex "Aexo_" d'un exercice particulier' et l'écrit dans le dépôt.
Parametres
nomexo : TYPE str DESCRIPTION nom du fichier de l'exercice (énoncé).
Renvoie
None ou le nom du fichier Aexo modifié.
262def listeExosTheme(code): 263 """ 264 Renvoie la liste des exos du theme codé 265 266 #### Parametres 267 268 code: 269 TYPE str 270 DESCRIPTION le code d'un thème 271 272 #### Renvoie 273 274 liste de chemins de fichier Latex d'énoncé 275 """ 276 exos_list = glob.glob(relpath + 'E' + code + '*.tex') 277 exos_list.sort() 278 return exos_list
Renvoie la liste des exos du theme codé
Parametres
code: TYPE str DESCRIPTION le code d'un thème
Renvoie
liste de chemins de fichier Latex d'énoncé
281def listeExosCorrTheme(code): 282 """ 283 Renvoie la liste des exos corrigés du theme codé 284 285 #### Parametres 286 287 code: 288 TYPE str 289 DESCRIPTION le code d'un thème 290 291 #### Renvoie 292 293 liste de chemins de fichiers Latex de corrigés 294 """ 295 exos_list = glob.glob(relpath + 'C' + code + '*.tex') 296 exos_list.sort() 297 return exos_list
Renvoie la liste des exos corrigés du theme codé
Parametres
code: TYPE str DESCRIPTION le code d'un thème
Renvoie
liste de chemins de fichiers Latex de corrigés
300def getThemes(): 301 """ 302 Lit les thèmes depuis le fichier _codes.csv 303 304 #### Renvoie 305 306 dictThemes : TYPE dict 307 DESCRIPTION key=code, val=description. 308 309 """ 310 dictThemes = {} 311 with open('../math-exos/' + '_codes.csv', newline='') as csvfile: 312 riri = csv.reader(csvfile, delimiter=';') 313 for row in riri: 314 dictThemes[row[0]] = row[1] 315 dictThemes.pop('codetheme') 316 return dictThemes
Lit les thèmes depuis le fichier _codes.csv
Renvoie
dictThemes : TYPE dict DESCRIPTION key=code, val=description.
319def listeExos(): 320 """ 321 322 #### Renvoie 323 324 dictionnaire 325 - clé = code d'un thème 326 - valeur = liste des noms des fichiers d'énoncé 327 328 """ 329 themes = getThemes() 330 exospath = relpath 331 files = os.listdir(exospath) 332 333 exercices = {} 334 335 for code in themes: 336 exercices[code] = [] 337 regexpr = "^E" + code + "[0-9]{2}.tex" 338 for file in files: 339 if re.match(regexpr, file): 340 exercices[code].append(file) 341 exercices[code].sort() 342 return exercices
Renvoie
dictionnaire - clé = code d'un thème - valeur = liste des noms des fichiers d'énoncé
345def listeCorriges(): 346 """ 347 348 #### Renvoie 349 350 dictionnaire 351 - clé = code d'un thème 352 - valeur = liste des noms des fichiers d'énoncé 353 354 """ 355 themes = getThemes() 356 exospath = relpath 357 files = os.listdir(exospath) 358 359 exercices = {} 360 361 for code in themes: 362 exercices[code] = [] 363 regexpr = "^C" + code + "[0-9]{2}.tex" 364 for file in files: 365 if re.match(regexpr, file): 366 exercices[code].append(file) 367 exercices[code].sort() 368 return exercices
Renvoie
dictionnaire - clé = code d'un thème - valeur = liste des noms des fichiers d'énoncé
371def listeExosNoncorr(): 372 """ 373 374 #### Renvoie 375 376 dictionnaire des exercices (énoncés) non corrigés 377 - clé = code d'un thème 378 - valeur = liste des noms des fichiers d'énoncé 379 380 381 """ 382 exospath = relpath 383 exercices = listeExos() 384 exercicesNC = {} 385 for code in exercices: 386 exercicesNC[code] = [] 387 for file in exercices[code]: 388 fileC = file.replace('E', 'C') 389 pathC = exospath + fileC 390 if not os.path.isfile(pathC): 391 exercicesNC[code].append(file) 392 return exercicesNC
Renvoie
dictionnaire des exercices (énoncés) non corrigés - clé = code d'un thème - valeur = liste des noms des fichiers d'énoncé
395def ecritTousAexos(): 396 """ 397 Écrit tous les "Aexos_" dans le dépôt. Ne doit être utilisé qu'une fois 398 399 #### Renvoie 400 401 None. 402 403 """ 404 exercices = listeExos() 405 for code in exercices: 406 for nomexo in exercices[code]: 407 ecritAexo(nomexo)
Écrit tous les "Aexos_" dans le dépôt. Ne doit être utilisé qu'une fois
Renvoie
None.
410def listeAexosNoncorr(): 411 """ 412 Liste des enoncés dont le "Aexo_" ne contient pas de corrigé. 413 414 #### Renvoie 415 416 None. 417 418 """ 419 exospath = relpath 420 exercices = listeExos() 421 AexosNoncorr = {} 422 for code in exercices: 423 AexosNoncorr[code] = [] 424 for nomexo in exercices[code]: 425 nomexoA = nomexo.replace('E', 'Aexo_') 426 pathA = exospath + nomexoA 427 with open(pathA) as fifi: 428 latex = fifi.read() 429 if "pas encore de corrigé" in latex: 430 AexosNoncorr[code].append(nomexo) 431 AexosNoncorr[code].sort() 432 return AexosNoncorr
Liste des enoncés dont le "Aexo_" ne contient pas de corrigé.
Renvoie
None.
435def modifTousAexos(): 436 """ 437 Modifie tous les "Aexos" qui doivent l'être. 438 C'est à dire ceux qui contiennent "pas encore de corrigé" alors 439 qu'un corrigé existe. 440 441 #### Renvoie 442 443 None. 444 445 """ 446 lA = listeAexosNoncorr() 447 lE = listeExosNoncorr() 448 lili = [] 449 for code in lA: 450 amodif = set(lA[code]) - set(lE[code]) 451 for nomexo in amodif: 452 print(nomexo) 453 ecritAexo(nomexo) 454 lili.append(nomexo) 455 return lili
Modifie tous les "Aexos" qui doivent l'être. C'est à dire ceux qui contiennent "pas encore de corrigé" alors qu'un corrigé existe.
Renvoie
None.