--- /dev/null
+#@ 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
+
+
-#@ 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
# ======================================================================
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__)
-#@ 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
# ======================================================================
# 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={}
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):
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):
# 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:
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:
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)
-#@ 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
# ======================================================================
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
# 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)
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
passée en argument (etape)
"""
self.etapes=[]
+ self.index_etapes={}
for etp in etape.etapes:
new_etp=etp.copy()
new_etp.copy_reuse(etp)
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):
"""
-#@ 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
# ======================================================================
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):
"""
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
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):
"""
-#@ 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
# ======================================================================
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 :
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" }
-#@ 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
# ======================================================================
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
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()
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):
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 )