def tout_recharger(self): """Méthode appelée pour recharger TOUS les modules""" logger = type(self).man_logs.get_logger("sup") res = False Importeur.nb_hotboot += 1 objets_base.clear() try: for nom_package in os.listdir(getcwd() + "/" + REP_PRIMAIRES): if not nom_package.startswith("__"): py_compile.compile(getcwd() + "/" + \ REP_PRIMAIRES + "/" + nom_package + \ "/__init__.py", doraise=True) except py_compile.PyCompileError: logger.fatal( "Une erreur s'est produite lors de l'hotboot.") logger.fatal(traceback.format_exc()) else: self.tout_detruire() self.tout_decharger() self.tout_charger() self.tout_instancier() self.tout_configurer() self.tout_initialiser() res = True return res
def tout_charger(self): """Méthode appelée pour charger les modules primaires et secondaires. Par défaut, on importe tout mais on ne crée rien. """ # On commence par parcourir les modules primaires Importeur.logger.debug("Chargement des modules :") for nom_package in os.listdir(getcwd() + "/" + REP_PRIMAIRES): if not nom_package.startswith("__"): self.charger_module("primaire", nom_package) Importeur.logger.debug(" Le module {0} a été chargé".format( \ nom_package)) # On fait de même avec les modules secondaires for nom_package in os.listdir(getcwd() + "/" + REP_SECONDAIRES): if not nom_package.startswith("__"): self.charger_module("secondaire", nom_package) Importeur.logger.debug(" Le module {0} a été chargé".format( \ nom_package))
def tout_recharger(self): """Méthode appelée pour recharger TOUS les modules""" logger = type(self).man_logs.get_logger("sup") res = False Importeur.nb_hotboot += 1 objets_base.clear() try: for nom_package in os.listdir(getcwd() + "/" + REP_PRIMAIRES): if not nom_package.startswith("__"): py_compile.compile(getcwd() + "/" + \ REP_PRIMAIRES + "/" + nom_package + \ "/__init__.py", doraise=True) except py_compile.PyCompileError: logger.fatal("Une erreur s'est produite lors de l'hotboot.") logger.fatal(traceback.format_exc()) else: self.tout_detruire() self.tout_decharger() self.tout_charger() self.tout_instancier() self.tout_configurer() self.tout_initialiser() res = True return res
def get_config(nom): """Retourne, si peut être chargée, la configuration YAML de l'éditeur. On doit préciser en paramètre : nom -- le nom du répertoire dans laquel récupérer l'information Est retourné : None si le fichier ne peut être trouvée Une liste de dictionnaires permettant d'étendre la configuration Si une erreur se produit dans le parsage du fichier YAML ou si le fichier n'a pas la bonne structure, une exception est levée. """ chemin = getcwd() + os.sep.join(("primaires", "autoquetes", "types", nom, "editeur.yml")) if not os.path.exists(chemin): return None if not os.path.isfile(chemin): raise os.error(chemin + " n'est pas un fichier") if not os.access(chemin, os.R_OK): raise os.error(chemin + " ne peut être lu") with open(chemin, "r", encoding="Utf-8") as fichier: config = load(fichier) # Vérifie la syntaxe du fichier if not isinstance(config, list): raise ValueError("la syntaxe du fichier YAML {} n'est pas " \ "valide. Une liste de dictionnaires est attendue".format(chemin)) for elt in config: if not isinstance(elt, dict): raise ValueError("la syntaxe du fichier YAML {} n'est pas " \ "valide. Une liste de dictionnaires est " \ "attendue".format(chemin)) return config
def charger_types(self): """Charge les types d'autoquêtes définis dans le sous-package types.""" chemin = getcwd() + "/primaires/autoquetes/types" for nom in os.listdir(chemin): if not nom.startswith("_") and os.path.isdir(chemin + os.sep + nom): t_type = __import__("primaires.autoquetes.types." + nom) module = getattr(t_type.autoquetes.types, nom) if not hasattr(module, "AutoQuete"): raise ValueError("le fichier primaires/autoquetes/" \ "types/" + nom + "/__init__.py ne contient pas de classe AutoQuete") classe = module.AutoQuete for attr in ATTRIBUTS_AUTOQUETE: if not hasattr(classe, attr): raise ValueError("la classe d'autoquête " + nom + \ " n'a pas d'attribut ou méthode " + repr(attr)) if not hasattr(classe, "parent"): raise ValueError("le type d'autoquête " + nom + \ " n'a pas de parent défini") classe.nom_rep = nom self.types[classe.nom_type] = classe # On ordonne les classes pour qu'elle soit dans l'ordre de plus # petit besoin au début. On doit avoir donc en-tête la classe définissant # la base qui ne définit rien), puis celle de premier niveau, et ainsi de # suite noms = [] for nom, t_type in self.types.items(): if nom in noms: continue if t_type.parent is None: noms.insert(0, nom) else: if t_type.parent not in self.types: raise ValueError("le parent {} de {} ne peut être " \ "trouvé".format(t_type.parent, t_type.nom_type)) if t_type.parent in noms: indice = noms.index(t_type.parent) noms.insert(indice + 1, nom) else: noms.append(t_type.parent) noms.append(nom) classes = [self.types[n] for n in noms] # On réécrit les classes à présent for classe in classes: if classe.parent is not None: parent = self.types[classe.parent] nom_c = classe.nom_type nom_c = "".join([(m[0].upper() + m[1:]) for m in \ nom_c.split("_")]) n_classe = type(nom_c, (parent, ), dict( classe.__dict__)) self.types[classe.nom_type] = n_classe classe = n_classe # Chargement de la configuration des éditeurs du type config = ValidateurEditeur.get_config(classe.nom_rep) if config: ValidateurEditeur.valider_config(config) ValidateurEditeur.etendre_config(classe, config)
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. """Ce fichier permet d'ajouter le chemin des bibliothèques aux chemins des modules Python. Ce fichier n'a besoin d'être importé qu'une seule fois, dans le fichier principal. Vous pouvez ensuite importer directement les bibliothèques contenues dans le répertoire lib. Par exemple : >>> from yaml import load, dump """ import os import sys from corps.arborescence import getcwd sys.path.append(os.path.join(getcwd(), "../lib"))
def chemin(self): """Retourne le chemin du module""" rel = self.importeur.chemins_modules[self.type] + os.sep + self.nom return os.path.join(getcwd(), rel)