Salome HOME
ec8a972dea95d3f7a2ede62fc21b4a7c99582cf3
[tools/eficas.git] / Noyau / N_BLOC.py
1 #@ MODIF N_BLOC Noyau  DATE 16/05/2007   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
9 # (AT YOUR OPTION) ANY LATER VERSION.                                 
10 #
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
15 #
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
19 #                                                                       
20 #                                                                       
21 # ======================================================================
22
23
24 """ 
25     Ce module contient la classe de definition BLOC
26     qui permet de spécifier les caractéristiques des blocs de mots clés 
27 """
28
29 import types,string,sys
30 import traceback
31
32 import N_ENTITE
33 import N_MCBLOC
34 from N_Exception import AsException
35
36 class BLOC(N_ENTITE.ENTITE):
37    """
38     Classe pour definir un bloc de mots-cles
39
40     Cette classe a deux attributs de classe :
41
42       - class_instance qui indique la classe qui devra etre utilisée 
43         pour créer l'objet qui servira à controler la conformité d'un 
44         bloc de mots-clés avec sa définition
45       - label qui indique la nature de l'objet de définition (ici, BLOC)
46
47    """
48    class_instance = N_MCBLOC.MCBLOC
49    label = 'BLOC'
50
51    def __init__(self,fr="",ang="",docu="",regles=(),statut='f',condition=None,
52                      **args):
53      
54       """
55           Un bloc est caractérisé par les attributs suivants :
56
57             - fr   : chaine de caractere commentaire pour aide en ligne (en francais)
58             - ang : chaine de caractere commentaire pour aide en ligne (en anglais)
59             - regles : liste d'objets de type REGLE pour vérifier la cohérence des sous-objets
60             - statut : obligatoire ('o') ou facultatif ('f')
61             - condition : chaine de caractère evaluable par l'interpreteur Python
62             - entites : dictionnaire contenant les sous-objets de self (mots-clés). 
63               La clé du dictionnaire est le nom du mot-clé et la valeur l'objet de 
64               définition correspondant. Cet attribut est initialisé avec l'argument 
65               args de la méthode __init__
66
67       """
68       # Initialisation des attributs
69       self.fr=fr
70       self.ang=ang
71       self.docu=docu
72       if type(regles)== types.TupleType:
73           self.regles=regles
74       else:
75           self.regles=(regles,)
76       self.statut=statut
77       self.condition=condition
78       self.entites=args
79       self.affecter_parente()
80
81    def __call__(self,val,nom,parent=None):
82       """
83           Construit un objet MCBLOC a partir de sa definition (self)
84           de sa valeur (val), de son nom (nom) et de son parent dans l arboresence (parent)
85       """
86       return self.class_instance(nom=nom,definition=self,val=val,parent=parent)
87
88    def verif_cata(self):
89       """
90          Cette méthode vérifie si les attributs de définition sont valides.
91          Les éventuels messages d'erreur sont écrits dans l'objet compte-rendu (self.cr).
92       """
93       if type(self.fr) != types.StringType :
94         self.cr.fatal("L'attribut 'fr' doit etre une chaine de caractères : %s" %`self.fr`)
95       if type(self.docu) != types.StringType :
96         self.cr.fatal("L'attribut 'docu' doit etre une chaine de caractères : %s" %`self.docu`)
97       if type(self.regles) != types.TupleType :
98         self.cr.fatal("L'attribut 'regles' doit etre un tuple : %s" %`self.regles` )
99       if self.statut not in ['f','o'] :
100         self.cr.fatal("L'attribut 'statut' doit valoir 'o' ou 'f' : %s" %`self.statut` )
101       if self.condition != None :
102         if type(self.condition) != types.StringType :
103           self.cr.fatal("L'attribut 'condition' doit etre une chaine de caractères : %s" %`self.condition`)
104       else:
105         self.cr.fatal("La condition ne doit pas valoir None !")
106       self.verif_cata_regles()
107
108    def verif_presence(self,dict,globs):
109       """
110          Cette méthode vérifie si le dictionnaire passé en argument (dict)
111          est susceptible de contenir un bloc de mots-clés conforme à la 
112          définition qu'il porte.
113
114          Si la réponse est oui, la méthode retourne 1
115
116          Si la réponse est non, la méthode retourne 0
117  
118          Le dictionnaire dict a pour clés les noms des mots-clés et pour valeurs
119          les valeurs des mots-clés
120       """
121       # On recopie le dictionnaire pour protéger l'original 
122       dico=dict.copy()
123       if self.condition != None :
124         try:
125           test = eval(self.condition,globs,dico)
126           return test
127         except NameError:
128           # erreur 'normale' : un mot-clé n'est pas présent et on veut l'évaluer dans la condition
129           if CONTEXT.debug:
130              l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
131              print "WARNING : Erreur a l'evaluation de la condition "+string.join(l)
132           return 0
133         except SyntaxError:
134           # le texte de la condition n'est pas du Python correct --> faute de catalogue
135           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
136           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
137                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
138         except:
139           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
140           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
141                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
142       else :
143         return 0
144