From 686e0fe2fe7acaa45ff7eb978f08146a628fa3d5 Mon Sep 17 00:00:00 2001 From: Pascale Noyret Date: Tue, 29 May 2007 09:18:50 +0000 Subject: [PATCH] PN : Mise a jour aster V9.0.27 --- Noyau/N_VALIDATOR.py | 2 +- Noyau/__init__.py | 6 +- Noyau/ascheckers.py | 73 ++++++++ Noyau/asnom.py | 133 ++++++++++++++ Noyau/asojb.py | 303 ++++++++++++++++++++++++++++++++ Noyau/basetype.py | 156 ++++++++++++++++ Noyau/nommage.py | 2 +- Validation/V_ENSEMBLE.py | 2 +- Validation/V_ETAPE.py | 2 +- Validation/V_EXCLUS.py | 2 +- Validation/V_MACRO_ETAPE.py | 2 +- Validation/V_MCBLOC.py | 2 +- Validation/V_MCFACT.py | 2 +- Validation/V_MCLIST.py | 4 +- Validation/V_MCSIMP.py | 2 +- Validation/V_PRESENT_ABSENT.py | 4 +- Validation/V_PRESENT_PRESENT.py | 2 +- 17 files changed, 684 insertions(+), 15 deletions(-) create mode 100644 Noyau/ascheckers.py create mode 100644 Noyau/asnom.py create mode 100644 Noyau/asojb.py create mode 100644 Noyau/basetype.py diff --git a/Noyau/N_VALIDATOR.py b/Noyau/N_VALIDATOR.py index 7f767565..fbd8cc56 100644 --- a/Noyau/N_VALIDATOR.py +++ b/Noyau/N_VALIDATOR.py @@ -1,4 +1,4 @@ -#@ MODIF N_VALIDATOR Noyau DATE 13/02/2007 AUTEUR PELLET J.PELLET +#@ MODIF N_VALIDATOR Noyau DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== diff --git a/Noyau/__init__.py b/Noyau/__init__.py index 94d8971c..5a85d29d 100644 --- a/Noyau/__init__.py +++ b/Noyau/__init__.py @@ -1,4 +1,4 @@ -#@ MODIF __init__ Noyau DATE 27/09/2004 AUTEUR CIBHHLV L.VIVAN +#@ MODIF __init__ Noyau DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== @@ -41,3 +41,7 @@ __builtin__.CONTEXT=context # Classes de base from N_SIMP import SIMP from N_FACT import FACT + +# structures de données +import asojb +from asojb import AsBase diff --git a/Noyau/ascheckers.py b/Noyau/ascheckers.py new file mode 100644 index 00000000..cfd3f131 --- /dev/null +++ b/Noyau/ascheckers.py @@ -0,0 +1,73 @@ +#@ MODIF ascheckers Noyau DATE 23/05/2007 AUTEUR PELLET J.PELLET +# -*- 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. +# ====================================================================== + +class Parmi(object): + """Classe qui exprime une contrainte multiple pour un attribut""" + def __init__(self, *args): + self.values = list(args) + + def add_value(self, value ): + if value not in self.values: + self.values.append( value ) + + def __call__(self, obj, name, value, log ): + if value not in self.values: + log.err( obj, "l'attribut %s=%r n'est pas dans %r" % (name, value, self.values) ) + + def __repr__(self): + l = [ "Parmi(", ] + g = [ repr(v) for v in self.values ] + l.append( ", ".join(g) ) + l.append( ")" ) + return "".join( l ) + +class CheckLog(object): + """Un validateur qui enregistre toutes + les erreurs trouvées""" + def __init__(self): + self.msg = [] + self.names = {} + self.optional = False + + def log(self, level, obj, msg ): + if obj : + self.msg.append( (level, obj.nomj(), msg) ) + else : + self.msg.append( (level, 'None', msg) ) + + def err(self, obj, msg ): + self.log( 0, obj, msg ) + + def warn(self, obj, msg ): + self.log( 1, obj, msg ) + + def visit(self, obj ): + self.names[obj.nomj()] = 1 + + def __str__(self): + d = { 0: "E", 1:"W" } + return "\n".join( [ "%s:%s: %s" % (d[l],n,m) + for l,n,m in self.msg ]) + +class CheckFail(CheckLog): + """Un validateur qui lève une exception + dès la première erreur""" + def err(self, obj, msg ): + raise AssertionError("%s: %s" % (obj.nomj(), msg) ) diff --git a/Noyau/asnom.py b/Noyau/asnom.py new file mode 100644 index 00000000..9006e70f --- /dev/null +++ b/Noyau/asnom.py @@ -0,0 +1,133 @@ +#@ MODIF asnom Noyau DATE 16/05/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. +# ====================================================================== + +""" +Description des types de base aster + +version 2 - réécrite pour essayer de simplifier +le problème des instances/types et instances/instances + +le type de base ASBase permet de représenter une structure +de donnée. Une instance de ASBase comme attribut d'une classe +dérivée de ASBase représente une sous-structure nommée. + +une instance de ASBase 'libre' représente une instance de la +structure de donnée complète. + +c'est ce comportement qui est capturé dans la classe StructType +""" + +from basetype import Type + +class SDNom(Type): + """Objet représentant une sous-partie de nom + d'objet jeveux""" + nomj = None + debut = None + fin = None + just = None + justtype = None + + def __init__(self, nomj=None, debut=None, fin=None, just='l', **kwargs ): + """ + Configure un objet nom + nomj : la partie du nom fixée (par ex .TITR) ou '' si non précisée + debut, fin : la partie du K24 concernée + just : la justification a droite ou a gauche ('l' ou 'r') + kwargs : inutilisé, juste par simplicité + + Note: + On utilise cet objet comme attribut d'instance ou de classe. + En attribut de classe pour les noms de structure, cela permet + de définir la position du nom d'objet dans le nom jeveux, l'attribut + nom est alors la valeur du suffixe pour une sous-structure ou None pour + une structure principale. + """ + super( SDNom, self ).__init__( nomj=nomj, debut=debut, fin=fin, just=just, **kwargs ) + self.update( (nomj, debut, fin, just) ) + + def __call__(self): + if self._parent is None or self._parent._parent is None: + debut = self.debut or 0 + prefix = ' '*debut + else: + # normalement + # assert self._parent.nomj is self + nomparent = self._parent._parent.nomj + prefix = nomparent() + debut = self.debut or nomparent.fin or len(prefix) + fin = self.fin or 24 + nomj = self.nomj or '' + nomj = self.just( nomj, fin-debut ) + prefix = prefix.ljust(24) + res = prefix[:debut]+nomj+prefix[fin:] + return res[:24] + + def fcata(self): + return self.just(self.nomj,self.fin-self.debut).replace(' ','?') + + def __repr__(self): + return "" % (self.nomj,self.debut,self.fin) + + # On utilise pickle pour les copies, et pickle ne sait pas gérer la + # sauvegarde de str.ljust ou str.rjust (c'est une méthode non liée) + + def __getstate__(self): + return (self.nomj, self.debut, self.fin, self.justtype ) + + def __setstate__( self, (nomj,debut,fin,just) ): + self.nomj = nomj + self.debut = debut + self.fin = fin + if just=='l' or just is None: + self.just = str.ljust + elif just=='r': + self.just = str.rjust + else: + raise ValueError("Justification '%s' invalide" % just ) + self.justtype = just + + + def update( self, (nomj,debut,fin,just) ): + if nomj is not None: + self.nomj = nomj + if self.debut is None: + self.debut = debut + if self.fin is None: + self.fin = fin + if self.justtype is None and just is not None: + if just=='l': + self.just = str.ljust + elif just=='r': + self.just = str.rjust + else: + raise ValueError("Justification '%s' invalide" % just ) + self.justtype = just + + def reparent( self, parent, new_name ): + self._parent = parent + self._name = new_name + for nam in self._subtypes: + obj = getattr( self, nam ) + obj.reparent( self, nam ) + if self.nomj is None and self._parent._name is not None: + self.nomj = "." + self._parent._name + + diff --git a/Noyau/asojb.py b/Noyau/asojb.py new file mode 100644 index 00000000..2f0729cd --- /dev/null +++ b/Noyau/asojb.py @@ -0,0 +1,303 @@ +#@ MODIF asojb Noyau DATE 16/05/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. +# ====================================================================== + +""" + Description des OJB jeveux +""" +from basetype import Type, MetaType +from asnom import SDNom +from ascheckers import CheckLog +import traceback,sys + +# pour utilisation dans eficas +try: + import aster +except: + pass + +# ----------------------------------------------------------------------------- +class AsBase(Type): + nomj = SDNom() + optional = False + + def __init__(self, nomj=None, *args, **kwargs ): + super(AsBase,self).__init__( nomj, *args, **kwargs ) + assert self.nomj is not self.__class__.nomj + if isinstance( nomj, str ): + self.nomj.nomj = nomj + elif isinstance( nomj, SDNom ): + self.nomj.update( nomj.__getstate__() ) + + def set_name(self, nomj): + """Positionne le nomj de self + """ + assert isinstance( self.nomj.nomj, str ), "uniquement pour les concepts" + self.nomj.nomj = nomj + + def check(self, checker=None): + if checker is None: + checker = CheckLog() + + # vérifie les enfants : + optional = checker.optional + checker.optional = checker.optional or self.optional + for name in self._subtypes: + v = getattr(self, name) + if isinstance( v, (OJB,AsBase) ): + v.check(checker) + for name in dir(self): + if name.startswith( 'check_' ): + v = getattr(self, name) + if callable(v): + try : + v( checker ) + except : + from Utilitai.Utmess import U2MESS as UTMESS + UTMESS("E", 'SDVERI_45') + print 40*'-' + traceback.print_exc(file=sys.stdout) + + checker.optional = optional + return checker + + def members( self ): + pass + + def dump(self, indent=""): + import pydoc + l = [] + checkers = [] + nomj = self.nomj() + if self.optional: + f = "(f)" + else: + f = "(o)" + l.append( f+" "+nomj ) + #l.append( '-'*(len(nomj)+3) ) + for name in self._subtypes: + obj = getattr(self, name) + if isinstance(obj,(AsBase,OJB)): + l.append( obj.dump(indent) ) + for name in dir(self): + if name.startswith( 'check_' ): + obj = getattr(self, name) + if callable(obj) and name.startswith("check_"): + checkers.append( obj ) + + indent = " "*len(nomj) + for checker in checkers: + doc = pydoc.text.document( checker ) + for line in doc.splitlines(): + l.append( indent + line ) + return "\n".join( l ) + + def __repr__(self): + return "<%s(%x,%r)>" % (self.__class__.__name__, id(self), self.nomj() ) + + +# ----------------------------------------------------------------------------- +class JeveuxAttr(object): + """Un attribut jeveux""" + def __init__(self, name): + self.name = name + + def __get__(self, obj, klass): + raise NotImplementedError + + def check(self, attrname, obj, log ): + checker = getattr(obj, "_"+attrname, None ) + if checker is None: + return True + val = self.__get__( obj, obj.__class__ ) + if callable( checker ): + return checker( obj, attrname, val, log ) + else: + test = val == checker + if not test: + log.err( obj, "Attribut incorrect %s %r!=%r" % (self.name, val, checker ) ) + return test + +# ----------------------------------------------------------------------------- +class JeveuxExists(JeveuxAttr): + def __init__(self): + pass + + def __get__(self, obj, klass): + if obj is None: + return self + nomj = obj.nomj() + if len(nomj)!=24: + raise AssertionError(repr(nomj)) + return aster.jeveux_exists( nomj.ljust(24) ) + +# ----------------------------------------------------------------------------- +class JeveuxIntAttr(JeveuxAttr): + def __get__(self, obj, klass): + if obj is None: + return self + return aster.jeveux_getattr( obj.nomj(), self.name )[0] + +# ----------------------------------------------------------------------------- +class JeveuxStrAttr(JeveuxAttr): + def __get__(self, obj, klass): + if obj is None: + return self + return aster.jeveux_getattr( obj.nomj(), self.name )[1].strip() + +# ----------------------------------------------------------------------------- +class OJB(AsBase): + _clas = None + _genr = None + _type = None + _ltyp = None + _xous = None + _docu = None + _exists = True + + clas = JeveuxStrAttr("CLAS") + genr = JeveuxStrAttr("GENR") + type = JeveuxStrAttr("TYPE") + ltyp = JeveuxIntAttr("LTYP") + xous = JeveuxStrAttr("XOUS") + docu = JeveuxStrAttr("DOCU") + exists = JeveuxExists() + #optional = False + nomj = SDNom() + + def __init__(self, nomj=None, **attrs): + super(OJB,self).__init__( nomj, **attrs ) + self.foreachattr( self.setattribute, attrs ) + self.optional = attrs.get('optional', False) + + def setattribute( self, name, prop, attrs ): + _name = "_"+name + if name in attrs: + setattr( self, _name, attrs[name] ) + + def get(self): + nomj = self.nomj() + if aster.jeveux_exists( nomj ): + obj_simple = aster.jeveux_getattr( nomj, 'XOUS')[1].strip() == 'S' + if obj_simple : + return aster.getvectjev( nomj ) + else : + return aster.getcolljev( nomj ) + else: + return None + + def get_stripped(self): + """Fonction utilitaire, renvoie une liste de chaines 'strippées'""" + data = self.get() + if data is not None: + return [ x.strip() for x in self.get() ] + else: + return [] + + def foreachattr(self, callable, *args, **kwargs): + klass = self.__class__ + for k in dir(klass): + v = getattr( klass, k ) + if isinstance(v, JeveuxAttr): + callable( k, v, *args, **kwargs ) + + def check(self, checker=None): + if checker is None: + checker = CheckLog() + # l'objet a déjà été vérifié, on ne fait rien + if self.nomj() in checker.names.keys(): + return checker + checker.visit( self ) + if self.exists: + self.foreachattr( lambda k,v,obj,c: v.check(k, obj, c), + self, checker ) + else: + if not self.optional and not checker.optional : + checker.err( self, "n'existe pas (%r)" %self._parent ) + return checker + + def dump(self, indent=""): + if self.optional: + f = "(f)" + else: + f = "(o)" + return f +" "+ self.nomj() +" "+ str(self.exists) + +# ----------------------------------------------------------------------------- +def Facultatif( ojb ): + ojb.optional = True + return ojb + +# ----------------------------------------------------------------------------- +class OJBVect(OJB): + lonmax = JeveuxIntAttr("LONMAX") + lonuti = JeveuxIntAttr("LONUTI") + +# ----------------------------------------------------------------------------- +class OJBCollec(OJB): + stockage = JeveuxStrAttr("STOCKAGE") + nutioc = JeveuxIntAttr( "NUTIOC" ) + acces = JeveuxStrAttr( "ACCES" ) + modelong = JeveuxStrAttr( "MODELONG" ) + nmaxoc = JeveuxIntAttr( "NMAXOC" ) + +# ----------------------------------------------------------------------------- +class AsVI(OJBVect): + _type = "I" + +# ----------------------------------------------------------------------------- +class AsVR(OJBVect): + _type = "R" + +# ----------------------------------------------------------------------------- +class AsVC(OJBVect): + _type = "C" + +# ----------------------------------------------------------------------------- +class AsVL(OJBVect): + _type = "L" + +# ----------------------------------------------------------------------------- +class AsVK8(OJBVect): + _type = "K" + _ltyp = 8 + +# ----------------------------------------------------------------------------- +class AsVK16(OJBVect): + _type = "K" + _ltyp = 16 + +# ----------------------------------------------------------------------------- +class AsVK24(OJBVect): + _type = "K" + _ltyp = 24 + +# ----------------------------------------------------------------------------- +class AsVK32(OJBVect): + _type = "K" + _ltyp = 32 + +# ----------------------------------------------------------------------------- +class AsVK80(OJBVect): + _type = "K" + _ltyp = 80 + +# Pour compatibilite +AsColl = OJBCollec +AsObject = OJB diff --git a/Noyau/basetype.py b/Noyau/basetype.py new file mode 100644 index 00000000..a5479fd7 --- /dev/null +++ b/Noyau/basetype.py @@ -0,0 +1,156 @@ +#@ MODIF basetype Noyau DATE 16/05/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. +# ====================================================================== + +""" +Description des types de base aster +----------------------------------- + +version 2 - réécrite pour essayer de simplifier +le problème des instances/types et instances/instances. + +Le type de base `Type` permet de représenter une structure +de donnée. Une instance de `Type` comme attribut d'une classe +dérivée de `Type` représente une sous-structure nommée. + +Une instance de `Type` 'libre' représente une instance de la +structure de donnée complète. + +C'est ce comportement qui est capturé dans la classe BaseType + +La classe `Type` hérite de BaseType et y associe la métaclasse MetaType. + +""" +from copy import copy,deepcopy +import cPickle + +__docformat__ = "restructuredtext" + + + + +class MetaType(type): + """Métaclasse d'un type représentant une structure de données. + Les méthodes spéciales __new__ et __call__ sont réimplémentées + """ + def __new__( mcs, name, bases, classdict ): + """Création d'une nouvelle 'classe' dérivant de Type. + + Cette méthode permet de calculer certains attributs automatiquement: + + - L'attribut _subtypes qui contient la liste des sous-structures + de type 'Type' attributs (directs ou hérités) de cette classe. + + Pour chaque attribut de classe héritant de Type, on recrée une nouvelle + instance des attributs hérités pour pouvoir maintenir une structure de + parentée entre l'attribut de classe et sa nouvelle classe. + + L'effet obtenu est que tous les attributs de classe ou des classes parentes + de cette classe sont des attributs associés à la classe feuille. Ces attributs + ont eux-meme un attribut parent qui pointe sur la classe qui les contient. + """ + new_cls = type.__new__( mcs, name, bases, classdict ) + new_cls._subtypes = [] + for b in bases: + if hasattr(b,'_subtypes'): + new_cls._subtypes += b._subtypes + # affecte la classe comme parent des attributs de classe + # et donne l'occasion aux attributs de se renommer à partir + # du nom utilisé. + for k, v in classdict.items(): + if not isinstance( v, BaseType ): + continue + v.reparent( new_cls, k ) + new_cls._subtypes.append( k ) + return new_cls + + def dup_attr(cls, inst): + """Duplique les attributs de la classe `cls` pour qu'ils deviennent + des attributs de l'instance `inst`. + """ + # reinstantiate and reparent subtypes + for nam in cls._subtypes: + obj = getattr( cls, nam ) + # permet de dupliquer completement l'instance + cpy = cPickle.dumps(obj) + newobj = cPickle.loads( cpy ) + newobj.reparent( inst, None ) + setattr( inst, nam, newobj ) + + def __call__(cls, *args, **kwargs): + """Instanciation d'un Type structuré. + Lors de l'instanciation on effectue un travail similaire à la + création de classe: Les attributs sont re-parentés à l'instance + et réinstanciés pour obtenir une instanciation de toute la structure + et de ses sous-structures. + + Les attributs de classe deviennent des attributs d'instance. + """ + inst = cls.__new__(cls, *args, **kwargs) + # reinstantiate and reparent subtypes + cls.dup_attr( inst ) + type(inst).__init__(inst, *args, **kwargs) + return inst + + def mymethod(cls): + pass + + +class BaseType(object): + # Le parent de la structure pour les sous-structures + _parent = None + _name = None + + def __init__(self, *args, **kwargs): + self._initargs = args + self._initkwargs = kwargs + self._name = None + self._parent = None + + def reparent( self, parent, new_name ): + self._parent = parent + self._name = new_name + for nam in self._subtypes: + obj = getattr( self, nam ) + obj.reparent( self, nam ) + + def base( self ): + if self._parent is None: + return self + return self._parent.base() + + def change_type(self, new_type, nomj=None): + """Méthode appelée quand on change a posteriori le type + du concept (pour les 'CO'). + Si `nomj` est None, on prend `self.nom`. + """ + self.__class__ = new_type + nomj = nomj or self.nom + new_type.dup_attr(self) + + # Comment appeler AsBase.__init__ ? + # type(nomj)=str donc plus simple que dans AsBase.__init__... + assert isinstance(nomj, str), 'Valeur inattendue pour nomj : %s' % nomj + assert self.nomj is not self.__class__.nomj + self.nomj.nomj = nomj + + +class Type(BaseType): + __metaclass__ = MetaType + diff --git a/Noyau/nommage.py b/Noyau/nommage.py index a28170fe..e4e57231 100644 --- a/Noyau/nommage.py +++ b/Noyau/nommage.py @@ -1,4 +1,4 @@ -#@ MODIF nommage Noyau DATE 14/09/2004 AUTEUR MCOURTOI M.COURTOIS +#@ MODIF nommage Noyau DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== diff --git a/Validation/V_ENSEMBLE.py b/Validation/V_ENSEMBLE.py index 205c4c12..9170351a 100644 --- a/Validation/V_ENSEMBLE.py +++ b/Validation/V_ENSEMBLE.py @@ -25,7 +25,7 @@ class ENSEMBLE: """ La règle vérifie que si un mot-clé de self.mcs est present - parmi les elements de args tous les autres doivent etre presents. + parmi les elements de args tous les autres doivent etre presents. Ces arguments sont transmis à la règle pour validation sous la forme d'une liste de noms de mots-clés ou d'un dictionnaire dont diff --git a/Validation/V_ETAPE.py b/Validation/V_ETAPE.py index 4fc69be5..2ec6d44a 100644 --- a/Validation/V_ETAPE.py +++ b/Validation/V_ETAPE.py @@ -1,4 +1,4 @@ -#@ MODIF V_ETAPE Validation DATE 14/09/2004 AUTEUR MCOURTOI M.COURTOIS +#@ MODIF V_ETAPE Validation DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== diff --git a/Validation/V_EXCLUS.py b/Validation/V_EXCLUS.py index b0e5ce84..f477cff3 100644 --- a/Validation/V_EXCLUS.py +++ b/Validation/V_EXCLUS.py @@ -25,7 +25,7 @@ class EXCLUS: """ La règle vérifie qu'un seul mot-clé de self.mcs est present - parmi les elements de args. + parmi les elements de args. Ces arguments sont transmis à la règle pour validation sous la forme d'une liste de noms de mots-clés ou d'un dictionnaire dont diff --git a/Validation/V_MACRO_ETAPE.py b/Validation/V_MACRO_ETAPE.py index 9d20953e..59764c8f 100644 --- a/Validation/V_MACRO_ETAPE.py +++ b/Validation/V_MACRO_ETAPE.py @@ -1,4 +1,4 @@ -#@ MODIF V_MACRO_ETAPE Validation DATE 22/02/2005 AUTEUR DURAND C.DURAND +#@ MODIF V_MACRO_ETAPE Validation DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== diff --git a/Validation/V_MCBLOC.py b/Validation/V_MCBLOC.py index bf4bcd1a..6a3f7a44 100644 --- a/Validation/V_MCBLOC.py +++ b/Validation/V_MCBLOC.py @@ -39,7 +39,7 @@ class MCBLOC(V_MCCOMPO.MCCOMPO): """ Cette classe a un attribut de classe : - - txt_nat qui sert pour les comptes-rendus liés à cette classe + - txt_nat qui sert pour les comptes-rendus liés à cette classe """ txt_nat="Bloc :" diff --git a/Validation/V_MCFACT.py b/Validation/V_MCFACT.py index f66fd6bb..a9a18605 100644 --- a/Validation/V_MCFACT.py +++ b/Validation/V_MCFACT.py @@ -39,7 +39,7 @@ class MCFACT(V_MCCOMPO.MCCOMPO): """ Cette classe a un attribut de classe : - - txt_nat qui sert pour les comptes-rendus liés à cette classe + - txt_nat qui sert pour les comptes-rendus liés à cette classe """ txt_nat="Mot cle Facteur :" diff --git a/Validation/V_MCLIST.py b/Validation/V_MCLIST.py index 3145302f..0dc3fcdb 100644 --- a/Validation/V_MCLIST.py +++ b/Validation/V_MCLIST.py @@ -41,9 +41,9 @@ class MCList: """ Cette classe a deux attributs de classe : - - CR qui sert à construire l'objet compte-rendu + - CR qui sert à construire l'objet compte-rendu - - txt_nat qui sert pour les comptes-rendus liés à cette classe + - txt_nat qui sert pour les comptes-rendus liés à cette classe """ CR=N_CR.CR diff --git a/Validation/V_MCSIMP.py b/Validation/V_MCSIMP.py index e48ec0b2..28d0d661 100644 --- a/Validation/V_MCSIMP.py +++ b/Validation/V_MCSIMP.py @@ -1,4 +1,4 @@ -#@ MODIF V_MCSIMP Validation DATE 16/05/2006 AUTEUR DURAND C.DURAND +#@ MODIF V_MCSIMP Validation DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS # -*- coding: iso-8859-1 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== diff --git a/Validation/V_PRESENT_ABSENT.py b/Validation/V_PRESENT_ABSENT.py index 299ed2ad..eb6fbdfc 100644 --- a/Validation/V_PRESENT_ABSENT.py +++ b/Validation/V_PRESENT_ABSENT.py @@ -25,8 +25,8 @@ class PRESENT_ABSENT: """ La règle vérifie que si le premier mot-clé de self.mcs est present - parmi les elements de args les autres mots clés de self.mcs - doivent etre absents + parmi les elements de args les autres mots clés de self.mcs + doivent etre absents Ces arguments sont transmis à la règle pour validation sous la forme d'une liste de noms de mots-clés ou d'un dictionnaire dont diff --git a/Validation/V_PRESENT_PRESENT.py b/Validation/V_PRESENT_PRESENT.py index 62764f9b..4848c2ef 100644 --- a/Validation/V_PRESENT_PRESENT.py +++ b/Validation/V_PRESENT_PRESENT.py @@ -25,7 +25,7 @@ class PRESENT_PRESENT: """ La règle vérifie que si le premier mot-clé de self.mcs est present - parmi les elements de args les autres doivent l'etre aussi + parmi les elements de args les autres doivent l'etre aussi Ces arguments sont transmis à la règle pour validation sous la forme d'une liste de noms de mots-clés ou d'un dictionnaire dont -- 2.39.2