maintenance.execlocal
Exécute localement les scripts préliminaires à la publication et à la contextualisation des sources d'un dépôt.
Modifié le 30/03/23 @author: remy
Traitements à effectuer sur les fichiers d'un dépôt :
- créer-modifier les sources avant compilation
- compiler
- établir des listes de fichiers images à publier
- établir des listes de données utiles lors de la contextualisation
Le module execlocal
Les traitements sont effectués lors de l'instanciation d'un objet Execlocal. Cette instanciation importe un module spécifique au dépôt.
Actuellement, les sous-modules spécifiques sont
exl_mathCours, exl_mathExos et
exl_mathPbs.
Les commandes de compilation sont codées dans le fichier init (manifeste) du dépôt. Elles sont lancées par la méthode compil() de la classe Execlocal.
Les données à publier sont extraites par apublierImg().
Les autres traitements sont définis dans la fonction exec() du sous-module spécifique.
Principales propriétés d'un objet Execlocal :
.log: journal de l'exécution locale.publiables: liste des fichiers publiables.specific_results: dictionnaire présentant des données spécifiques au dépôt.
1# -*- coding: utf-8 -*- 2""" 3Exécute localement les scripts préliminaires à la publication et à la contextualisation des sources d'un dépôt. 4 5Modifié le 30/03/23 @author: remy 6 7Traitements à effectuer sur les fichiers d'un dépôt : 8 9- créer-modifier les sources avant compilation 10- compiler 11- établir des listes de fichiers images à publier 12- établir des listes de données utiles lors de la contextualisation 13 14Le module `execlocal` 15- Importe le sous-module [`scantex`](scantex.html) d'examen des fichiers LateX. 16- Définit la classe `Execlocal`. 17 18Les traitements sont effectués lors de l'instanciation d'un objet `Execlocal`. Cette instanciation importe un module spécifique au dépôt. 19Actuellement, les sous-modules spécifiques sont 20[`exl_mathCours`](exl_mathCours.html), [`exl_mathExos`](exl_mathExos.html) et 21[`exl_mathPbs`](exl_mathPbs.html). 22 23Les commandes de compilation sont codées dans le fichier `init` (manifeste) du dépôt. Elles sont lancées par la méthode `compil()` de la classe `Execlocal`. 24Les données à publier sont extraites par `apublierImg()`. 25Les autres traitements sont définis dans la fonction `exec()` du sous-module spécifique. 26 27Principales propriétés d'un objet `Execlocal` : 28 29- `.log`: journal de l'exécution locale 30- `.publiables`: liste des fichiers publiables 31- `.specific_results`: dictionnaire présentant des données spécifiques au dépôt. 32 33 34""" 35import importlib 36import subprocess 37import glob 38import os.path 39 40import scantex 41 42 43class Execlocal: 44 """Classe d'exécution locale.""" 45 46 def __init__(self, data): 47 """ 48 Instancie un objet `Execlocal`. 49 50 - récupère les paramètres du dépôt 51 - initialise la propriété journal (`.log`) 52 - importe le module spécifique au dépôt 53 - exécute les traitements spécifiques 54 - renseigne `.specific_results` 55 - exécute les commandes de compilation 56 - renseigne `.publiables` 57 58 59 #### Parametres 60 61 data : 62 63 - TYPE dictionnaire 64 - DESCRIPTION codage du *manifeste* du dépôt 65 66 La structure de ce dictionnaire est précisée dans le fichier 67 d'initialisation spécifique [`init_mathExos`](init_mathExos.html) 68 [`init_mathPbs`](init_mathPbs.html) 69 70 #### Renvoie 71 72 None. 73 74 75 """ 76 lineprefix = "\n \t \t" 77 self.log = lineprefix + "Initialisation de la classe Execlocal." 78 """ 79 Journal d'instanciation d'un objet `Execlocal`. 80 81 TYPE chaine de caractères. 82 """ 83 84 self.commandes = data['commandes'] 85 self.rel_path = data['relative_path'] 86 self.publish_data = data['publish_data'] 87 self.context_data = data['context_data'] 88 89 # change de répertoire 90 maintenance_path = os.getcwd() 91 os.chdir(self.rel_path) 92 93 # importation du module spécifique 94 module = data['modulespec'] 95 if module: 96 try: 97 specific = importlib.import_module(module) 98 self.log += lineprefix 99 self.log += "Importation du module spécifique " + module 100 # maintenance spécifique 101 truc = specific.exec(data) 102 self.log += truc['log'] 103 self.specific_results = truc['specific_results'] 104 except ImportError as error: 105 self.log += lineprefix + "Module " + error.name + " pas trouvé" 106 107 # liste des commandes de compilation à exécuter 108 self.cmds_list = self.aexecuter() 109 110 # compilations 111 # print('\n') 112 # for obj in self.cmds_list: 113 # print(obj, '\n') 114 self.compil() 115 116 # renseigne la propriété .publiables 117 self.publiables = self.apublierImg() 118 # fichiers publiables dict path: date 119 120 # retour au répertoire de base 121 os.chdir(maintenance_path) 122 123 def aexecuter(self): 124 """ 125 Renvoie une liste d'objets codant des commandes de compilation. 126 127 Associe à chaque type de commande la liste des fichiers sur lesquels 128 elle doit s'appliquer. 129 130 Structure de l'objet codant un type de commande: 131 132 obj = {'ext': type['ext'], 133 'imgdir': type['imgdir'], 134 'imgext': type['imgext'], 135 'command': type['command'], 136 'fics': []} 137 138 139 """ 140 self.log += ("\n \t \t Formation de la liste " 141 + "des commandes de compilation") 142 aexec = [] 143 for type in self.commandes: 144 obj = {'ext': type['ext'], 145 'imgdir': type['imgdir'], 146 'imgext': type['imgext'], 147 'command': type['command'], 148 'fics': []} 149 imgext = type['imgext'] 150 imgdir = type['imgdir'] 151 fics = [] 152 # print(obj['command'], type['patterns']) 153 for paty in type['patterns']: 154 paty = self.rel_path + paty 155 # print(paty, os.getcwd()) 156 fics.extend(glob.glob(paty)) 157 # print(fics,"\n") 158 159 for src in fics: 160 srcext = os.path.splitext(src)[1] 161 didi = os.path.dirname(src) 162 img = os.path.join(didi, imgdir, os.path.basename(src)) 163 img = img.replace(srcext, imgext) 164 # if ("A_" in src): 165 # print(src, img) 166 if scantex.acompiler(src, img): 167 obj['fics'].append(src) 168 aexec.append(obj) 169 return aexec 170 171 def apublierImg(self): 172 """ 173 Renvoie un dictionnaire de fichiers publiables. 174 175 - clé = chemin d'un fichier à publier 176 - valeur = timestamp du fichier 177 """ 178 self.log += "\n \t \t Récup timesstamps" 179 self.log += " locaux des fichiers à publier \n" 180 docs_n = [] 181 times = {} 182 for paty in self.publish_data['patterns']: 183 docs_n += glob.glob(paty) 184 for nom_doc in docs_n: 185 times[self.rel_path + nom_doc] = os.path.getmtime(nom_doc) 186 return times 187 188 def compil(self): 189 """ 190 Exécute les commandes de compilation. 191 192 Elles sont codées dans `self.cmds_list`. 193 Un compte rendu est placé dans le journal `self.log`. 194 """ 195 self.log += '\n \t \t Exécution des compilations \n' 196 log = '' 197 for obj in self.cmds_list: 198 log += '\t \t \t' 199 log += (str(len(obj['fics'])) + ' commandes ' 200 + str(obj['command']) + ' fichiers : \n') 201 for src in obj['fics']: 202 log += '\t \t \t \t' + src 203 command = obj['command'] + [src] 204 try: 205 # print(command) 206 subprocess.run(command) 207 log += ' OK \n' 208 except subprocess.SubprocessError: 209 log += ' ERREUR dans exécution de la commande \n' 210 self.log += log
44class Execlocal: 45 """Classe d'exécution locale.""" 46 47 def __init__(self, data): 48 """ 49 Instancie un objet `Execlocal`. 50 51 - récupère les paramètres du dépôt 52 - initialise la propriété journal (`.log`) 53 - importe le module spécifique au dépôt 54 - exécute les traitements spécifiques 55 - renseigne `.specific_results` 56 - exécute les commandes de compilation 57 - renseigne `.publiables` 58 59 60 #### Parametres 61 62 data : 63 64 - TYPE dictionnaire 65 - DESCRIPTION codage du *manifeste* du dépôt 66 67 La structure de ce dictionnaire est précisée dans le fichier 68 d'initialisation spécifique [`init_mathExos`](init_mathExos.html) 69 [`init_mathPbs`](init_mathPbs.html) 70 71 #### Renvoie 72 73 None. 74 75 76 """ 77 lineprefix = "\n \t \t" 78 self.log = lineprefix + "Initialisation de la classe Execlocal." 79 """ 80 Journal d'instanciation d'un objet `Execlocal`. 81 82 TYPE chaine de caractères. 83 """ 84 85 self.commandes = data['commandes'] 86 self.rel_path = data['relative_path'] 87 self.publish_data = data['publish_data'] 88 self.context_data = data['context_data'] 89 90 # change de répertoire 91 maintenance_path = os.getcwd() 92 os.chdir(self.rel_path) 93 94 # importation du module spécifique 95 module = data['modulespec'] 96 if module: 97 try: 98 specific = importlib.import_module(module) 99 self.log += lineprefix 100 self.log += "Importation du module spécifique " + module 101 # maintenance spécifique 102 truc = specific.exec(data) 103 self.log += truc['log'] 104 self.specific_results = truc['specific_results'] 105 except ImportError as error: 106 self.log += lineprefix + "Module " + error.name + " pas trouvé" 107 108 # liste des commandes de compilation à exécuter 109 self.cmds_list = self.aexecuter() 110 111 # compilations 112 # print('\n') 113 # for obj in self.cmds_list: 114 # print(obj, '\n') 115 self.compil() 116 117 # renseigne la propriété .publiables 118 self.publiables = self.apublierImg() 119 # fichiers publiables dict path: date 120 121 # retour au répertoire de base 122 os.chdir(maintenance_path) 123 124 def aexecuter(self): 125 """ 126 Renvoie une liste d'objets codant des commandes de compilation. 127 128 Associe à chaque type de commande la liste des fichiers sur lesquels 129 elle doit s'appliquer. 130 131 Structure de l'objet codant un type de commande: 132 133 obj = {'ext': type['ext'], 134 'imgdir': type['imgdir'], 135 'imgext': type['imgext'], 136 'command': type['command'], 137 'fics': []} 138 139 140 """ 141 self.log += ("\n \t \t Formation de la liste " 142 + "des commandes de compilation") 143 aexec = [] 144 for type in self.commandes: 145 obj = {'ext': type['ext'], 146 'imgdir': type['imgdir'], 147 'imgext': type['imgext'], 148 'command': type['command'], 149 'fics': []} 150 imgext = type['imgext'] 151 imgdir = type['imgdir'] 152 fics = [] 153 # print(obj['command'], type['patterns']) 154 for paty in type['patterns']: 155 paty = self.rel_path + paty 156 # print(paty, os.getcwd()) 157 fics.extend(glob.glob(paty)) 158 # print(fics,"\n") 159 160 for src in fics: 161 srcext = os.path.splitext(src)[1] 162 didi = os.path.dirname(src) 163 img = os.path.join(didi, imgdir, os.path.basename(src)) 164 img = img.replace(srcext, imgext) 165 # if ("A_" in src): 166 # print(src, img) 167 if scantex.acompiler(src, img): 168 obj['fics'].append(src) 169 aexec.append(obj) 170 return aexec 171 172 def apublierImg(self): 173 """ 174 Renvoie un dictionnaire de fichiers publiables. 175 176 - clé = chemin d'un fichier à publier 177 - valeur = timestamp du fichier 178 """ 179 self.log += "\n \t \t Récup timesstamps" 180 self.log += " locaux des fichiers à publier \n" 181 docs_n = [] 182 times = {} 183 for paty in self.publish_data['patterns']: 184 docs_n += glob.glob(paty) 185 for nom_doc in docs_n: 186 times[self.rel_path + nom_doc] = os.path.getmtime(nom_doc) 187 return times 188 189 def compil(self): 190 """ 191 Exécute les commandes de compilation. 192 193 Elles sont codées dans `self.cmds_list`. 194 Un compte rendu est placé dans le journal `self.log`. 195 """ 196 self.log += '\n \t \t Exécution des compilations \n' 197 log = '' 198 for obj in self.cmds_list: 199 log += '\t \t \t' 200 log += (str(len(obj['fics'])) + ' commandes ' 201 + str(obj['command']) + ' fichiers : \n') 202 for src in obj['fics']: 203 log += '\t \t \t \t' + src 204 command = obj['command'] + [src] 205 try: 206 # print(command) 207 subprocess.run(command) 208 log += ' OK \n' 209 except subprocess.SubprocessError: 210 log += ' ERREUR dans exécution de la commande \n' 211 self.log += log
Classe d'exécution locale.
47 def __init__(self, data): 48 """ 49 Instancie un objet `Execlocal`. 50 51 - récupère les paramètres du dépôt 52 - initialise la propriété journal (`.log`) 53 - importe le module spécifique au dépôt 54 - exécute les traitements spécifiques 55 - renseigne `.specific_results` 56 - exécute les commandes de compilation 57 - renseigne `.publiables` 58 59 60 #### Parametres 61 62 data : 63 64 - TYPE dictionnaire 65 - DESCRIPTION codage du *manifeste* du dépôt 66 67 La structure de ce dictionnaire est précisée dans le fichier 68 d'initialisation spécifique [`init_mathExos`](init_mathExos.html) 69 [`init_mathPbs`](init_mathPbs.html) 70 71 #### Renvoie 72 73 None. 74 75 76 """ 77 lineprefix = "\n \t \t" 78 self.log = lineprefix + "Initialisation de la classe Execlocal." 79 """ 80 Journal d'instanciation d'un objet `Execlocal`. 81 82 TYPE chaine de caractères. 83 """ 84 85 self.commandes = data['commandes'] 86 self.rel_path = data['relative_path'] 87 self.publish_data = data['publish_data'] 88 self.context_data = data['context_data'] 89 90 # change de répertoire 91 maintenance_path = os.getcwd() 92 os.chdir(self.rel_path) 93 94 # importation du module spécifique 95 module = data['modulespec'] 96 if module: 97 try: 98 specific = importlib.import_module(module) 99 self.log += lineprefix 100 self.log += "Importation du module spécifique " + module 101 # maintenance spécifique 102 truc = specific.exec(data) 103 self.log += truc['log'] 104 self.specific_results = truc['specific_results'] 105 except ImportError as error: 106 self.log += lineprefix + "Module " + error.name + " pas trouvé" 107 108 # liste des commandes de compilation à exécuter 109 self.cmds_list = self.aexecuter() 110 111 # compilations 112 # print('\n') 113 # for obj in self.cmds_list: 114 # print(obj, '\n') 115 self.compil() 116 117 # renseigne la propriété .publiables 118 self.publiables = self.apublierImg() 119 # fichiers publiables dict path: date 120 121 # retour au répertoire de base 122 os.chdir(maintenance_path)
Instancie un objet Execlocal.
- récupère les paramètres du dépôt
- initialise la propriété journal (
.log) - importe le module spécifique au dépôt
- exécute les traitements spécifiques
- renseigne
.specific_results
- renseigne
- exécute les commandes de compilation
- renseigne
.publiables
- renseigne
Parametres
data :
- TYPE dictionnaire
- DESCRIPTION codage du manifeste du dépôt
La structure de ce dictionnaire est précisée dans le fichier
d'initialisation spécifique init_mathExos
init_mathPbs
Renvoie
None.
124 def aexecuter(self): 125 """ 126 Renvoie une liste d'objets codant des commandes de compilation. 127 128 Associe à chaque type de commande la liste des fichiers sur lesquels 129 elle doit s'appliquer. 130 131 Structure de l'objet codant un type de commande: 132 133 obj = {'ext': type['ext'], 134 'imgdir': type['imgdir'], 135 'imgext': type['imgext'], 136 'command': type['command'], 137 'fics': []} 138 139 140 """ 141 self.log += ("\n \t \t Formation de la liste " 142 + "des commandes de compilation") 143 aexec = [] 144 for type in self.commandes: 145 obj = {'ext': type['ext'], 146 'imgdir': type['imgdir'], 147 'imgext': type['imgext'], 148 'command': type['command'], 149 'fics': []} 150 imgext = type['imgext'] 151 imgdir = type['imgdir'] 152 fics = [] 153 # print(obj['command'], type['patterns']) 154 for paty in type['patterns']: 155 paty = self.rel_path + paty 156 # print(paty, os.getcwd()) 157 fics.extend(glob.glob(paty)) 158 # print(fics,"\n") 159 160 for src in fics: 161 srcext = os.path.splitext(src)[1] 162 didi = os.path.dirname(src) 163 img = os.path.join(didi, imgdir, os.path.basename(src)) 164 img = img.replace(srcext, imgext) 165 # if ("A_" in src): 166 # print(src, img) 167 if scantex.acompiler(src, img): 168 obj['fics'].append(src) 169 aexec.append(obj) 170 return aexec
Renvoie une liste d'objets codant des commandes de compilation.
Associe à chaque type de commande la liste des fichiers sur lesquels elle doit s'appliquer.
Structure de l'objet codant un type de commande:
obj = {'ext': type['ext'],
'imgdir': type['imgdir'],
'imgext': type['imgext'],
'command': type['command'],
'fics': []}
172 def apublierImg(self): 173 """ 174 Renvoie un dictionnaire de fichiers publiables. 175 176 - clé = chemin d'un fichier à publier 177 - valeur = timestamp du fichier 178 """ 179 self.log += "\n \t \t Récup timesstamps" 180 self.log += " locaux des fichiers à publier \n" 181 docs_n = [] 182 times = {} 183 for paty in self.publish_data['patterns']: 184 docs_n += glob.glob(paty) 185 for nom_doc in docs_n: 186 times[self.rel_path + nom_doc] = os.path.getmtime(nom_doc) 187 return times
Renvoie un dictionnaire de fichiers publiables.
- clé = chemin d'un fichier à publier
- valeur = timestamp du fichier
189 def compil(self): 190 """ 191 Exécute les commandes de compilation. 192 193 Elles sont codées dans `self.cmds_list`. 194 Un compte rendu est placé dans le journal `self.log`. 195 """ 196 self.log += '\n \t \t Exécution des compilations \n' 197 log = '' 198 for obj in self.cmds_list: 199 log += '\t \t \t' 200 log += (str(len(obj['fics'])) + ' commandes ' 201 + str(obj['command']) + ' fichiers : \n') 202 for src in obj['fics']: 203 log += '\t \t \t \t' + src 204 command = obj['command'] + [src] 205 try: 206 # print(command) 207 subprocess.run(command) 208 log += ' OK \n' 209 except subprocess.SubprocessError: 210 log += ' ERREUR dans exécution de la commande \n' 211 self.log += log
Exécute les commandes de compilation.
Elles sont codées dans self.cmds_list.
Un compte rendu est placé dans le journal self.log.