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
def exec(data):
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_
  • 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
def ecritFeuilleA(code, dscrpt):
 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.

def aecrirefeuilleA(code):
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.

def aecrireAexo(nomexo):
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

def ecritAexo(nomexo):
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é.

def listeExosTheme(code):
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é

def listeExosCorrTheme(code):
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

def getThemes():
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.

def listeExos():
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é

def listeCorriges():
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é

def listeExosNoncorr():
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é

def ecritTousAexos():
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.

def listeAexosNoncorr():
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.

def modifTousAexos():
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.