From: Christian Caremoli <> Date: Fri, 30 Nov 2007 13:25:21 +0000 (+0000) Subject: CCAR: mise a niveau Aster 9.1.22 X-Git-Tag: V1_13~7 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=4b822c9b8b828b6eebf1c2ced9965eea127c6625;p=tools%2Feficas.git CCAR: mise a niveau Aster 9.1.22 --- diff --git a/Noyau/N_CONVERT.py b/Noyau/N_CONVERT.py new file mode 100644 index 00000000..4d1af5ad --- /dev/null +++ b/Noyau/N_CONVERT.py @@ -0,0 +1,78 @@ +#@ MODIF N_CONVERT Noyau DATE 19/11/2007 AUTEUR COURTOIS M.COURTOIS +# -*- coding: iso-8859-1 -*- +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2007 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== + +""" + Module de conversion des valeurs saisies par l'utilisateur après vérification. +""" + +# ----------------------------------------------------------------------------- +class ConversionError(Exception): + pass + +# ----------------------------------------------------------------------------- +def is_int(real): + """Est-ce que 'real' a une valeur entière ? + """ + return abs(int(real) - real) < 1.e-12 + +# ----------------------------------------------------------------------------- +class TypeConversion: + """Conversion de type + """ + def __init__(self, name, typ=None): + self.name = name + self.typ = typ + + def convert(self, obj): + """Filtre liste + """ + in_type = type(obj) + is_simple = in_type not in (list, tuple) + if is_simple: + obj = (obj,) + + result = [] + for o in obj: + result.append(self.defaut(o)) + + if is_simple: + return result[0] + else: + return in_type(result) + + def defaut(self, obj): + """Conversion de obj si c'est possible. + """ + for type_permis in self.typ: + # attention si plusieurs types sont permis, l'ordre de self.typ peut influer sur le résultat. + if type_permis == 'R': + if type(obj) in (int, float, long): + return float(obj) + elif type_permis == 'I': + if type(obj) in (int, float, long): + if is_int(obj): + return int(obj) + else: + raise ConversionError("%s (%s) ne peut pas être considéré comme entier" % (repr(obj), type(obj))) + + # autres types : pas de conversion, la validation arrêtera si obj est incorrect. + return obj + + diff --git a/Noyau/N_GEOM.py b/Noyau/N_GEOM.py index 44d5a4f9..8a1fddaa 100644 --- a/Noyau/N_GEOM.py +++ b/Noyau/N_GEOM.py @@ -1,4 +1,4 @@ -#@ MODIF N_GEOM Noyau DATE 16/05/2006 AUTEUR DURAND C.DURAND +#@ MODIF N_GEOM Noyau DATE 19/11/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== @@ -57,7 +57,7 @@ class GEOM(ASSD): def __convert__(cls,valeur): if isinstance(valeur, (str,unicode)): - return valeur + return valeur raise ValueError, 'On attend un chaine de caractères' __convert__=classmethod(__convert__) diff --git a/Noyau/N_JDC.py b/Noyau/N_JDC.py index af1a3c07..28720a19 100644 --- a/Noyau/N_JDC.py +++ b/Noyau/N_JDC.py @@ -1,4 +1,4 @@ -#@ MODIF N_JDC Noyau DATE 30/05/2007 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_JDC Noyau DATE 28/11/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== @@ -98,6 +98,7 @@ NONE = None # Dictionnaire pour stocker tous les concepts du JDC (acces rapide par le nom) self.sds_dict={} self.etapes=[] + self.index_etapes = {} self.mc_globaux={} self.current_context={} self.condition_context={} @@ -112,13 +113,23 @@ NONE = None compte-rendu self.cr """ try: - if self.appli != None : - self.appli.affiche_infos('Compilation du fichier de commandes en cours ...') - self.proc_compile=compile(self.procedure,self.nom,'exec') - except SyntaxError,e: - if CONTEXT.debug : traceback.print_exc() - l=traceback.format_exception_only(SyntaxError,e) - self.cr.exception("Compilation impossible : "+string.join(l)) + if self.appli != None : + self.appli.affiche_infos('Compilation du fichier de commandes en cours ...') + self.proc_compile=compile(self.procedure,self.nom,'exec') + except SyntaxError, e: + if CONTEXT.debug : traceback.print_exc() + l=traceback.format_exception_only(SyntaxError,e) + self.cr.exception("Compilation impossible : "+string.join(l)) + except SystemError, e: + erreurs_connues = """ +Causes possibles : + - offset too large : liste trop longue derrière un mot-clé. + Solution : liste = (valeurs, ..., ) + MOT_CLE = *liste, +""" + l=traceback.format_exception_only(SystemError,e) + l.append(erreurs_connues) + self.cr.exception("Compilation impossible : " + ''.join(l)) return def exec_compile(self): @@ -241,6 +252,7 @@ NONE = None et retourne un numéro d'enregistrement """ self.etapes.append(etape) + self.index_etapes[etape] = len(self.etapes) - 1 return self.g_register(etape) def o_register(self,sd): @@ -418,7 +430,7 @@ NONE = None # Si on insère des commandes (par ex, dans EFICAS), il faut préalablement # remettre ce pointeur à 0 if etape: - index_etape=self.etapes.index(etape) + index_etape = self.index_etapes[etape] else: index_etape=len(self.etapes) if index_etape >= self.index_etape_courante: @@ -429,7 +441,8 @@ NONE = None liste_etapes=self.etapes[self.index_etape_courante:index_etape] else: d=self.current_context={} - if self.context_ini:d.update(self.context_ini) + if self.context_ini: + d.update(self.context_ini) liste_etapes=self.etapes for e in liste_etapes: @@ -459,5 +472,6 @@ NONE = None et remet à jour la parenté de l'étape et des concepts """ self.etapes.append(etape) + self.index_etapes[etape] = len(self.etapes) - 1 etape.reparent(self) etape.reset_jdc(self) diff --git a/Noyau/N_MACRO_ETAPE.py b/Noyau/N_MACRO_ETAPE.py index 28940f2c..c2a53700 100644 --- a/Noyau/N_MACRO_ETAPE.py +++ b/Noyau/N_MACRO_ETAPE.py @@ -1,4 +1,4 @@ -#@ MODIF N_MACRO_ETAPE Noyau DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_MACRO_ETAPE Noyau DATE 28/11/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== @@ -76,6 +76,7 @@ class MACRO_ETAPE(N_ETAPE.ETAPE): self.current_context={} self.index_etape_courante=0 self.etapes=[] + self.index_etapes={} self.sds=[] # Dans le cas d'une macro écrite en Python, l'attribut Outputs est un # dictionnaire qui contient les concepts produits de sortie @@ -268,7 +269,7 @@ Causes possibles : # Si on insère des commandes (par ex, dans EFICAS), il faut # préalablement remettre ce pointeur à 0 if etape: - index_etape=self.etapes.index(etape) + index_etape = self.index_etapes[etape] else: index_etape=len(self.etapes) @@ -426,6 +427,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" %(t,co et demande d enregistrement global aupres du JDC """ self.etapes.append(etape) + self.index_etapes[etape] = len(self.etapes) - 1 idetape=self.jdc.g_register(etape) return idetape @@ -651,6 +653,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" %(t,co passée en argument (etape) """ self.etapes=[] + self.index_etapes={} for etp in etape.etapes: new_etp=etp.copy() new_etp.copy_reuse(etp) @@ -665,6 +668,8 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" %(t,co self.NommerSdprod(new_sd,etp.sd.nom) new_etp.copy_intern(etp) self.etapes.append(new_etp) + self.index_etapes[new_etp] = len(self.etapes) - 1 + def reset_jdc(self,new_jdc): """ diff --git a/Noyau/N_MCSIMP.py b/Noyau/N_MCSIMP.py index d85eda44..8d2e939a 100644 --- a/Noyau/N_MCSIMP.py +++ b/Noyau/N_MCSIMP.py @@ -1,4 +1,4 @@ -#@ MODIF N_MCSIMP Noyau DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_MCSIMP Noyau DATE 19/11/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== @@ -32,6 +32,7 @@ from copy import copy from Noyau.N_ASSD import ASSD,assd from Noyau.N_CO import CO import N_OBJECT +from N_CONVERT import TypeConversion class MCSIMP(N_OBJECT.OBJECT): """ @@ -58,6 +59,7 @@ class MCSIMP(N_OBJECT.OBJECT): self.nom=nom self.val = val self.parent = parent + self.convProto = TypeConversion('type', typ=self.definition.type) self.valeur = self.GETVAL(self.val) if parent : self.jdc = self.parent.jdc @@ -68,16 +70,16 @@ class MCSIMP(N_OBJECT.OBJECT): self.jdc = None self.niveau = None self.etape = None - + def GETVAL(self,val): """ Retourne la valeur effective du mot-clé en fonction de la valeur donnée. Defaut si val == None """ if (val is None and hasattr(self.definition,'defaut')) : - return self.definition.defaut - else: - return val + val = self.definition.defaut + val = self.convProto.convert(val) + return val def get_valeur(self): """ diff --git a/Noyau/ascheckers.py b/Noyau/ascheckers.py index cfd3f131..0f191246 100644 --- a/Noyau/ascheckers.py +++ b/Noyau/ascheckers.py @@ -1,4 +1,4 @@ -#@ MODIF ascheckers Noyau DATE 23/05/2007 AUTEUR PELLET J.PELLET +#@ MODIF ascheckers Noyau DATE 28/11/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== @@ -39,12 +39,18 @@ class Parmi(object): return "".join( l ) class CheckLog(object): - """Un validateur qui enregistre toutes - les erreurs trouvées""" + """Un validateur qui enregistre toutes les erreurs trouvées. + checkedXXX répond True si la "marq" courante est inférieure ou égale + à la celle de la dernière vérification. + Si on incrémentait "marq" à chaque étape, on revérifie à chaque fois. + """ def __init__(self): - self.msg = [] - self.names = {} - self.optional = False + self.msg = [] + self.names = {} + self.optional = False + self._marq = 1 + self._lastmarq = self._marq + self._debug = False def log(self, level, obj, msg ): if obj : @@ -58,8 +64,40 @@ class CheckLog(object): def warn(self, obj, msg ): self.log( 1, obj, msg ) - def visit(self, obj ): - self.names[obj.nomj()] = 1 + def visitOJB(self, obj): + key = obj.nomj() + self.names[key] = self._marq + + def visitAsBase(self, obj): + key = (obj.nomj(), obj.__class__.__name__) + self.names[key] = self._marq + + def force(self, force=False): + if not force: + self._marq = 1 + else: + self._lastmarq += 1 + self._marq = self._lastmarq + + def checkedOJB(self, obj): + key = obj.nomj() + res = self.names.get(key, 0) >= self._marq + self.help_dbg([key,], res) + return res + + def checkedAsBase(self, obj): + key = (obj.nomj(), obj.__class__.__name__) + res = self.names.get(key, 0) >= self._marq + self.help_dbg(key, res) + return res + + def help_dbg(self, key, res): + if self._debug: + if res: + s = 'ignore' + else: + s = 'check ' + print '#DBG %6d %s : %s' % (self._marq, s, ', '.join(key)) def __str__(self): d = { 0: "E", 1:"W" } diff --git a/Noyau/asojb.py b/Noyau/asojb.py index f0a09601..d3eba329 100644 --- a/Noyau/asojb.py +++ b/Noyau/asojb.py @@ -1,4 +1,4 @@ -#@ MODIF asojb Noyau DATE 16/10/2007 AUTEUR REZETTE C.REZETTE +#@ MODIF asojb Noyau DATE 28/11/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== @@ -56,6 +56,11 @@ class AsBase(Type): if checker is None: checker = CheckLog() + # vérif déjà faite ? (en tenant compte du type) + if checker.checkedAsBase(self): + return checker + checker.visitAsBase( self ) + # vérifie les enfants : optional = checker.optional checker.optional = checker.optional or self.optional @@ -112,7 +117,7 @@ class AsBase(Type): def short_repr(self): return "<%s(%x,%r)>" % (self.__class__.__name__, id(self), self.nomj() ) - def __repr__(self): + def long_repr(self): if not hasattr(self, "par_lot") or self.par_lot(): # hors Aster ou en par_lot='oui' return self.short_repr() @@ -121,6 +126,10 @@ class AsBase(Type): IMPR_CO(CONCEPT=_F(NOM=self.nom), UNITE=6) return '' + def __repr__(self): + # par défaut, on fait court ! + return self.short_repr() + # ----------------------------------------------------------------------------- class JeveuxAttr(object): @@ -239,9 +248,9 @@ class OJB(AsBase): if checker is None: checker = CheckLog() # l'objet a déjà été vérifié, on ne fait rien - if checker.names.has_key(self.nomj()): - return checker - checker.visit( self ) + if checker.checkedOJB(self): + return checker + checker.visitOJB( self ) if self.exists: self.foreachattr( lambda k,v,obj,c: v.check(k, obj, c), self, checker )