Salome HOME
Modif V6_4_°
[tools/eficas.git] / Noyau / N_BLOC.py
1 #@ MODIF N_BLOC Noyau  DATE 30/08/2011   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 - 2011  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 from N_types import force_list
37
38 class BLOC(N_ENTITE.ENTITE):
39    """
40     Classe pour definir un bloc de mots-cles
41
42     Cette classe a deux attributs de classe :
43
44       - class_instance qui indique la classe qui devra etre utilisée
45         pour créer l'objet qui servira à controler la conformité d'un
46         bloc de mots-clés avec sa définition
47       - label qui indique la nature de l'objet de définition (ici, BLOC)
48
49    """
50    class_instance = N_MCBLOC.MCBLOC
51    label = 'BLOC'
52
53    def __init__(self,fr="",ang="",docu="",regles=(),statut='f',condition=None,
54                      **args):
55
56       """
57           Un bloc est caractérisé par les attributs suivants :
58
59             - fr   : chaine de caractere commentaire pour aide en ligne (en francais)
60             - ang : chaine de caractere commentaire pour aide en ligne (en anglais)
61             - regles : liste d'objets de type REGLE pour vérifier la cohérence des sous-objets
62             - statut : obligatoire ('o') ou facultatif ('f')
63             - condition : chaine de caractère evaluable par l'interpreteur Python
64             - entites : dictionnaire contenant les sous-objets de self (mots-clés).
65               La clé du dictionnaire est le nom du mot-clé et la valeur l'objet de
66               définition correspondant. Cet attribut est initialisé avec l'argument
67               args de la méthode __init__
68
69       """
70       # Initialisation des attributs
71       self.fr=fr
72       self.ang=ang
73       self.docu=docu
74       if type(regles)== types.TupleType:
75           self.regles=regles
76       else:
77           self.regles=(regles,)
78       self.statut=statut
79       self.condition=condition
80       self.entites=args
81       self.affecter_parente()
82
83    def __call__(self,val,nom,parent=None):
84       """
85           Construit un objet MCBLOC a partir de sa definition (self)
86           de sa valeur (val), de son nom (nom) et de son parent dans l arboresence (parent)
87       """
88       return self.class_instance(nom=nom,definition=self,val=val,parent=parent)
89
90    def verif_cata(self):
91       """
92          Cette méthode vérifie si les attributs de définition sont valides.
93          Les éventuels messages d'erreur sont écrits dans l'objet compte-rendu (self.cr).
94       """
95       if type(self.fr) != types.StringType :
96         self.cr.fatal("L'attribut 'fr' doit etre une chaine de caractères : %s" %`self.fr`)
97       if type(self.docu) != types.StringType :
98         self.cr.fatal("L'attribut 'docu' doit etre une chaine de caractères : %s" %`self.docu`)
99       if type(self.regles) != types.TupleType :
100         self.cr.fatal("L'attribut 'regles' doit etre un tuple : %s" %`self.regles` )
101       if self.statut not in ['f','o'] :
102         self.cr.fatal("L'attribut 'statut' doit valoir 'o' ou 'f' : %s" %`self.statut` )
103       if self.condition != None :
104         if type(self.condition) != types.StringType :
105           self.cr.fatal("L'attribut 'condition' doit etre une chaine de caractères : %s" %`self.condition`)
106       else:
107         self.cr.fatal("La condition ne doit pas valoir None !")
108       self.verif_cata_regles()
109
110    def verif_presence(self,dict,globs):
111       """
112          Cette méthode vérifie si le dictionnaire passé en argument (dict)
113          est susceptible de contenir un bloc de mots-clés conforme à la
114          définition qu'il porte.
115
116          Si la réponse est oui, la méthode retourne 1
117
118          Si la réponse est non, la méthode retourne 0
119
120          Le dictionnaire dict a pour clés les noms des mots-clés et pour valeurs
121          les valeurs des mots-clés
122       """
123       # On recopie le dictionnaire pour protéger l'original
124       dico = bloc_utils()
125       dico.update(dict)
126       if self.condition != None :
127         try:
128           test = eval(self.condition,globs,dico)
129           return test
130         except NameError:
131           # erreur 'normale' : un mot-cle n'est pas present et on veut l'evaluer dans la condition
132           if CONTEXT.debug:
133              l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
134              print "WARNING : Erreur a l'evaluation de la condition "+string.join(l)
135           return 0
136         except SyntaxError:
137           # le texte de la condition n'est pas du Python correct --> faute de catalogue
138           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
139           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
140                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
141         except:
142           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
143           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
144                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
145       else :
146         return 0
147
148
149 def bloc_utils():
150     """Définit un ensemble de fonctions utilisables pour écrire les
151     conditions de BLOC."""
152     def au_moins_un(mcsimp, valeurs):
153         """Valide si la (ou une) valeur de 'mcsimp' est au moins une fois dans
154         la ou les 'valeurs'. Similaire à la règle AU_MOINS_UN, 'mcsimp' peut
155         contenir plusieurs valeurs."""
156         test = set(force_list(mcsimp))
157         valeurs = set(force_list(valeurs))
158         return not test.isdisjoint(valeurs)
159
160     def aucun(mcsimp, valeurs):
161         """Valide si aucune des valeurs de 'mcsimp' n'est dans 'valeurs'."""
162         return not au_moins_un(mcsimp, valeurs)
163
164     return locals()
165