From e8fbd544670d331998398a37873395d3e19828c1 Mon Sep 17 00:00:00 2001 From: Pascale Noyret Date: Thu, 3 Jun 2010 09:37:46 +0000 Subject: [PATCH] Mise en coherence avec la 10.1.27 (attention diffenrece dans N_VALIDATORS) --- Noyau/N_ASSD.py | 13 +++++- Noyau/N_CONVERT.py | 28 +++++------ Noyau/N_GEOM.py | 8 ++-- Noyau/N_MACRO_ETAPE.py | 7 ++- Noyau/N_VALIDATOR.py | 102 ++++++++++++++++++++--------------------- Noyau/N_types.py | 61 ++++++++++++++++++++++++ Noyau/N_utils.py | 21 +++++---- 7 files changed, 160 insertions(+), 80 deletions(-) create mode 100644 Noyau/N_types.py diff --git a/Noyau/N_ASSD.py b/Noyau/N_ASSD.py index 0e7f5d2c..6a6ccf94 100644 --- a/Noyau/N_ASSD.py +++ b/Noyau/N_ASSD.py @@ -1,4 +1,4 @@ -#@ MODIF N_ASSD Noyau DATE 16/11/2009 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_ASSD Noyau DATE 14/12/2009 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # RESPONSABLE COURTOIS M.COURTOIS # CONFIGURATION MANAGEMENT OF EDF VERSION @@ -133,6 +133,17 @@ class ASSD(object): return is_accessible + def par_lot(self): + """Conserver uniquement pour la compatibilite avec le catalogue v9 dans eficas. + """ + #XXX eficas + if not hasattr(self, 'jdc') or self.jdc == None: + val = None + else: + val = self.jdc.par_lot + return val == 'OUI' + + class assd(ASSD): def __convert__(cls,valeur): return valeur diff --git a/Noyau/N_CONVERT.py b/Noyau/N_CONVERT.py index 511c3fe4..6c9b17bb 100644 --- a/Noyau/N_CONVERT.py +++ b/Noyau/N_CONVERT.py @@ -1,4 +1,4 @@ -#@ MODIF N_CONVERT Noyau DATE 07/09/2009 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_CONVERT Noyau DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # RESPONSABLE COURTOIS M.COURTOIS # CONFIGURATION MANAGEMENT OF EDF VERSION @@ -23,13 +23,15 @@ Module de conversion des valeurs saisies par l'utilisateur après vérification. """ -# ----------------------------------------------------------------------------- -def is_int(real): +from N_types import is_int, is_float, is_enum + + +def has_int_value(real): """Est-ce que 'real' a une valeur entière ? """ return abs(int(real) - real) < 1.e-12 -# ----------------------------------------------------------------------------- + class Conversion: """Conversion de type. """ @@ -40,15 +42,15 @@ class Conversion: def convert(self, obj): """Filtre liste """ - in_type = type(obj) - if in_type not in (list, tuple): + in_as_enum = is_enum(obj) + if not in_as_enum: obj = (obj,) result = [] for o in obj: result.append(self.function(o)) - if in_type not in (list, tuple): + if not in_as_enum: return result[0] else: # ne marche pas avec MACR_RECAL qui attend une liste et non un tuple @@ -57,14 +59,14 @@ class Conversion: def function(self, o): raise NotImplementedError, 'cette classe doit être dérivée' -# ----------------------------------------------------------------------------- + class TypeConversion(Conversion): """Conversion de type """ def __init__(self, typ): Conversion.__init__(self, 'type', typ) -# ----------------------------------------------------------------------------- + class IntConversion(TypeConversion): """Conversion en entier """ @@ -72,11 +74,11 @@ class IntConversion(TypeConversion): TypeConversion.__init__(self, 'I') def function(self, o): - if type(o) is float and is_int(o): + if is_float(o) and has_int_value(o): o = int(o) return o -# ----------------------------------------------------------------------------- + class FloatConversion(TypeConversion): """Conversion de type """ @@ -84,11 +86,11 @@ class FloatConversion(TypeConversion): TypeConversion.__init__(self, 'R') def function(self, o): - if type(o) in (int, float, long): + if is_float(o): o = float(o) return o -# ----------------------------------------------------------------------------- + _convertI = IntConversion() _convertR = FloatConversion() diff --git a/Noyau/N_GEOM.py b/Noyau/N_GEOM.py index fea1c4cf..7125faed 100644 --- a/Noyau/N_GEOM.py +++ b/Noyau/N_GEOM.py @@ -1,4 +1,4 @@ -#@ MODIF N_GEOM Noyau DATE 07/09/2009 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_GEOM Noyau DATE 29/03/2010 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # RESPONSABLE COURTOIS M.COURTOIS # CONFIGURATION MANAGEMENT OF EDF VERSION @@ -57,9 +57,9 @@ class GEOM(ASSD): return self.nom def __convert__(cls,valeur): - if isinstance(valeur, (str,unicode)): - return valeur - raise ValueError, 'On attend un chaine de caractères' + if isinstance(valeur, (str,unicode)) and len(valeur.strip()) <= 8: + return valeur.strip() + raise ValueError, 'On attend un chaine de caractères (de longueur < 8).' __convert__=classmethod(__convert__) class geom(GEOM):pass diff --git a/Noyau/N_MACRO_ETAPE.py b/Noyau/N_MACRO_ETAPE.py index 3f075109..7b59d5c0 100644 --- a/Noyau/N_MACRO_ETAPE.py +++ b/Noyau/N_MACRO_ETAPE.py @@ -1,4 +1,4 @@ -#@ MODIF N_MACRO_ETAPE Noyau DATE 16/11/2009 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_MACRO_ETAPE Noyau DATE 23/03/2010 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # RESPONSABLE COURTOIS M.COURTOIS # CONFIGURATION MANAGEMENT OF EDF VERSION @@ -469,6 +469,11 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" %(t,co # La propriete du concept est transferee a l'etape avec le type attendu par l'étape etape.sd=sd sd.etape=etape + if self.reuse == sd and etape.reuse != sd \ + and getattr(sd, "executed", 0) == 1: # n'a pas été pas détruit + raise AsException("Le concept '%s' est réentrant dans la macro-commande %s. " \ + "Il devrait donc l'être dans %s (produit sous le nom '%s')." \ + % (sd.nom, self.nom, etape.nom, nomsd)) # On donne au concept le type produit par la sous commande. # Le principe est le suivant : apres avoir verifie que le type deduit par la sous commande # est bien coherent avec celui initialement affecte par la macro (voir ci dessus) diff --git a/Noyau/N_VALIDATOR.py b/Noyau/N_VALIDATOR.py index c7e65b94..ffd65710 100644 --- a/Noyau/N_VALIDATOR.py +++ b/Noyau/N_VALIDATOR.py @@ -1,5 +1,6 @@ -#@ MODIF N_VALIDATOR Noyau DATE 09/10/2007 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_VALIDATOR Noyau DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- +# RESPONSABLE COURTOIS M.COURTOIS # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== # COPYRIGHT (C) 1991 - 2003 EDF R&D WWW.CODE-ASTER.ORG @@ -23,9 +24,10 @@ implanter le concept de validateur dans Accas """ import types -import string import traceback from N_ASSD import ASSD +from N_types import is_int, is_float_or_int, is_complex, is_number, is_str, is_enum + class ValError(Exception):pass @@ -79,18 +81,18 @@ class PProtocol(Protocol): class ListProtocol(Protocol): """Verificateur de protocole liste : convertit un objet quelconque en liste pour validation ultérieure""" def default(self,obj): - if type(obj) == types.TupleType : + if type(obj) is tuple: if len(obj) > 0 and obj[0] in ('RI','MP'): #il s'agit d'un complexe ancienne mode. La cardinalite vaut 1 return (obj,) else: return obj - elif type(obj) == types.ListType : + elif type(obj) is list: return obj - elif obj == None : + elif obj == None: # pas de valeur affecte. La cardinalite vaut 0 return obj - elif type(obj) == types.StringType : + elif is_str(obj): #il s'agit d'une chaine. La cardinalite vaut 1 return (obj,) else: @@ -104,6 +106,7 @@ class ListProtocol(Protocol): listProto=ListProtocol("list") + class TypeProtocol(PProtocol): """Verificateur de type parmi une liste de types possibles""" #pas de registre par instance. Registre unique pour toutes les instances de TypeProtocol @@ -113,46 +116,38 @@ class TypeProtocol(PProtocol): self.typ=typ def default(self,obj,typ): + help = "" for type_permis in typ: if type_permis == 'R': - if type(obj) in (types.IntType,types.FloatType,types.LongType):return obj + if is_float_or_int(obj): return obj elif type_permis == 'I': - if type(obj) in (types.IntType,types.LongType):return obj + if is_int(obj): return obj elif type_permis == 'C': - if self.is_complexe(obj):return obj + if self.is_complexe(obj): return obj elif type_permis == 'TXM': - if type(obj)==types.StringType:return obj + if is_str(obj): return obj elif type_permis == 'shell': - if type(obj)==types.StringType:return obj + if is_str(obj): return obj elif type(type_permis) == types.ClassType or isinstance(type_permis,type): - if self.is_object_from(obj,type_permis):return obj - elif type_permis == 'Fichier' : - import os - if len(typ) > 2 and typ[2] == "Sauvegarde": - if os.path.isdir(os.path.dirname(obj)): - return obj - else: - raise ValError("%s n'est pas un répertoire valide" % - os.path.dirname(obj)) - else: - if os.path.isfile(obj):return obj - else : raise ValError("%s n'est pas un fichier valide" % repr(obj)) + try: + if self.is_object_from(obj,type_permis): return obj + except Exception, err: + help = str(err) elif type(type_permis) == types.InstanceType or isinstance(type_permis,object): try: - if type_permis.__convert__(obj) : return obj - except: - pass + if type_permis.__convert__(obj): return obj + except Exception, err: + help = str(err) else: print "Type non encore géré %s" %`type_permis` - - raise ValError("%s (de type %s) n'est pas d'un type autorisé: %s" % (repr(obj),type(obj),typ)) + raise ValError("%s (de type %s) n'est pas d'un type autorisé: %s %s" % (repr(obj),type(obj),typ, help)) def is_complexe(self,valeur): """ Retourne 1 si valeur est un complexe, 0 sinon """ - if type(valeur) in (types.ComplexType,types.IntType,types.FloatType,types.LongType): - # Pour permettre l'utilisation de complexes Python + if is_number(valeur): + # Pour permettre l'utilisation de complexes Python (accepte les entiers et réels) return 1 - elif type(valeur) != types.TupleType : + elif type(valeur) != tuple : # On n'autorise pas les listes pour les complexes return 0 elif len(valeur) != 3: @@ -160,7 +155,7 @@ class TypeProtocol(PProtocol): else: # Un complexe doit etre un tuple de longueur 3 avec 'RI' ou 'MP' comme premiere # valeur suivie de 2 reels. - if string.strip(valeur[0]) in ('RI','MP'): + if valeur[0].strip() in ('RI','MP'): try: v1=reelProto.adapt(valeur[1]),reelProto.adapt(valeur[2]) return 1 @@ -179,6 +174,8 @@ class TypeProtocol(PProtocol): try: v= convert(objet) return v is not None + except ValueError, err: + raise except: return 0 # On accepte les instances de la classe et des classes derivees @@ -214,7 +211,7 @@ class IntoProtocol(PProtocol): raise ValError("La valeur : %s ne fait pas partie des choix possibles %s" % (repr(obj),into) ) else: #on est dans le cas d'un ensemble continu de valeurs possibles (intervalle) - if type(obj) in (types.IntType,types.FloatType,types.LongType) : + if is_float_or_int(obj): if val_min == '**': val_min = obj -1 if val_max == '**': val_max = obj +1 if obj < val_min or obj > val_max : @@ -229,7 +226,7 @@ class MinStr: self.max=max def __convert__(self,valeur): - if type(valeur) == types.StringType and self.min <= len(valeur) <= self.max:return valeur + if is_str(valeur) and self.min <= len(valeur) <= self.max:return valeur raise ValError("%s n'est pas une chaine de longueur comprise entre %s et %s" % (valeur,self.min,self.max)) def __repr__(self): @@ -407,7 +404,7 @@ class ListVal(Valid): fait appel à la méthode convert_item sur chaque élément de la liste. """ - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): for val in valeur: self.convert_item(val) return valeur @@ -421,7 +418,7 @@ class ListVal(Valid): liste. Si valeur est un paramètre, on utilise sa valeur effective valeur.valeur. """ - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): for val in valeur: if not self.verif_item(val): return 0 @@ -436,7 +433,7 @@ class Compulsory(ListVal): """ registry={} def __init__(self,elem=()): - if type(elem) not in (types.ListType,types.TupleType): elem=(elem,) + if not is_enum(elem): elem=(elem,) Valid.__init__(self,elem=elem) self.elem=elem self.cata_info="" @@ -463,7 +460,7 @@ class Compulsory(ListVal): return 1 def verif(self,valeur): - if type(valeur) not in (types.ListType,types.TupleType): + if not is_enum(valeur): liste=list(valeur) else: liste=valeur @@ -504,7 +501,7 @@ class NoRepeat(ListVal): return 1 def verif(self,valeur): - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): liste=list(valeur) for val in liste: if liste.count(val)!=1 : return 0 @@ -558,7 +555,7 @@ class LongStr(ListVal): return 0 def default(self,valeur,low,high): - if type(valeur) != types.StringType : + if not is_str(valeur): raise ValError("%s n'est pas une string" % repr(valeur)) if valeur[0]=="'" and valeur[-1]=="'" : low=low+2 @@ -630,7 +627,7 @@ class OrVal(Valid): Elle verifie qu'au moins un des validateurs de la liste valide la valeur """ def __init__(self,validators=()): - if type(validators) not in (types.ListType,types.TupleType): + if not is_enum(validators): validators=(validators,) self.validators=[] for validator in validators: @@ -755,7 +752,7 @@ class AndVal(Valid): Elle verifie que tous les validateurs de la liste valident la valeur """ def __init__(self,validators=()): - if type(validators) not in (types.ListType,types.TupleType): + if not is_enum(validators): validators=(validators,) self.validators=[] for validator in validators: @@ -889,9 +886,9 @@ def do_liste(validators): for validator in validators: if type(validator) == types.FunctionType: valids.append(FunctionVal(validator)) - elif type(validator) == types.TupleType: + elif type(validator) is tuple: valids.append(OrVal(do_liste(validator))) - elif type(validator) == types.ListType: + elif type(validator) is list: valids.append(AndVal(do_liste(validator))) else: valids.append(validator) @@ -900,9 +897,9 @@ def do_liste(validators): def validatorFactory(validator): if type(validator) == types.FunctionType: return FunctionVal(validator) - elif type(validator) == types.TupleType: + elif type(validator) is tuple: return OrVal(do_liste(validator)) - elif type(validator) == types.ListType: + elif type(validator) is list: return AndVal(do_liste(validator)) else: return validator @@ -976,7 +973,7 @@ class CardVal(Valid): return [] def convert(self,valeur): - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): l=len(valeur) elif valeur is None: l=0 @@ -990,7 +987,7 @@ class CardVal(Valid): return 1 def verif(self,valeur): - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): if self.max != '**' and len(valeur) > self.max:return 0 if self.min != '**' and len(valeur) < self.min:return 0 return 1 @@ -1042,7 +1039,7 @@ class PairVal(ListVal): return valeur % 2 == 0 def verif(self,valeur): - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): for val in valeur: if val % 2 != 0:return 0 return 1 @@ -1057,7 +1054,8 @@ class EnumVal(ListVal): Susceptible de remplacer l attribut "into" dans les catalogues """ def __init__(self,into=()): - if type(into) not in (types.ListType,types.TupleType): into=(into,) + if not is_enum(into): + into=(into,) self.into=into self.cata_info="" @@ -1094,7 +1092,7 @@ def ImpairVal(valeur): Cette fonction est un validateur. Elle verifie que la valeur passee est bien un nombre impair. """ - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): for val in valeur: if val % 2 != 1:return 0 return 1 @@ -1119,7 +1117,7 @@ class F1Val(Valid): return "valeur %s pour la somme des cles A et B " % self.somme def verif(self,valeur): - if type(valeur) in (types.ListType,types.TupleType): + if is_enum(valeur): for val in valeur: if not val.has_key("A"):return 0 if not val.has_key("B"):return 0 diff --git a/Noyau/N_types.py b/Noyau/N_types.py new file mode 100644 index 00000000..be4e9726 --- /dev/null +++ b/Noyau/N_types.py @@ -0,0 +1,61 @@ +#@ MODIF N_types Noyau DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS +# -*- coding: iso-8859-1 -*- +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2010 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. +# ====================================================================== +# RESPONSABLE COURTOIS M.COURTOIS + +""" + Ce module contient des fonctions utilitaires pour tester les types +""" + +from N_ASSD import ASSD + + +# use isinstance() instead of type() because objects returned from numpy arrays +# inherit from python scalars but are numpy.float64 or numpy.int32... +def is_int(obj): + return isinstance(obj, int) or type(obj) is long + +def is_float(obj): + return isinstance(obj, float) + +def is_complex(obj): + return isinstance(obj, complex) + +def is_float_or_int(obj): + return is_float(obj) or is_int(obj) + +def is_number(obj): + return is_float_or_int(obj) or is_complex(obj) + +def is_str(obj): + return type(obj) in (str, unicode) + +def is_list(obj): + return type(obj) is list + +def is_tuple(obj): + return type(obj) is tuple + +def is_enum(obj): + return is_list(obj) or is_tuple(obj) + +def is_assd(obj): + return isinstance(obj, ASSD) + + diff --git a/Noyau/N_utils.py b/Noyau/N_utils.py index 8b34e714..50198669 100644 --- a/Noyau/N_utils.py +++ b/Noyau/N_utils.py @@ -1,4 +1,4 @@ -#@ MODIF N_utils Noyau DATE 07/09/2009 AUTEUR COURTOIS M.COURTOIS +#@ MODIF N_utils Noyau DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # RESPONSABLE COURTOIS M.COURTOIS # CONFIGURATION MANAGEMENT OF EDF VERSION @@ -31,7 +31,7 @@ import sys # Modules EFICAS from N_Exception import AsException -from N_ASSD import ASSD +from N_types import is_int, is_float, is_complex, is_str, is_enum, is_assd SEP='_' @@ -67,25 +67,28 @@ def callee_where(niveau=4): except: return 0,"inconnu",0,{} + def AsType(a): """ Retourne le type d'un concept (a) à partir des caractéristiques de l'objet Python """ - if type(a) in (tuple, list):return AsType(a[0]) - if isinstance(a, ASSD):return type(a) - if type(a) == float:return "R" - if type(a) == int:return "I" - if type(a) == str:return "TXM" - if a == None : return None - print 'a=',a,type(a) + if is_enum(a): return AsType(a[0]) + if is_assd(a): return type(a) + if is_float(a): return "R" + if is_int(a): return "I" + if is_str(a): return "TXM" + if a == None: return None + print 'a=', a, type(a) raise AsException("type inconnu") + def prbanner(s): print "*"*(len(s)+10) print "*"*5 + s + "*"*5 print "*"*(len(s)+10) + def repr_float(valeur): """ Cette fonction représente le réel valeur comme une chaine de caractères -- 2.39.2