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