Salome HOME
Version initiale de EFICAS 1.2
[tools/eficas.git] / convert / convert_python.py
1 """
2     Ce module contient le plugin convertisseur de fichier
3     au format python pour EFICAS.
4
5     Un plugin convertisseur doit fournir deux attributs de classe :
6     extensions et formats et deux méthodes : readfile,convert.
7
8     L'attribut de classe extensions est une liste d'extensions
9     de fichiers préconisées pour ce type de format. Cette information
10     est seulement indicative.
11
12     L'attribut de classe formats est une liste de formats de sortie
13     supportés par le convertisseur. Les formats possibles sont :
14     eval, dict ou exec.
15     Le format eval est un texte source Python qui peut etre evalué. Le
16     résultat de l'évaluation est un objet Python quelconque.
17     Le format dict est un dictionnaire Python.
18     Le format exec est un texte source Python qui peut etre executé. 
19
20     La méthode readfile a pour fonction de lire un fichier dont le
21     nom est passé en argument de la fonction.
22        convertisseur.readfile(nom_fichier)
23
24     La méthode convert a pour fonction de convertir le fichier
25     préalablement lu dans un objet du format passé en argument.
26        objet=convertisseur.convert(outformat)
27
28     Ce convertisseur supporte le format de sortie exec
29
30 """
31 import sys,string,traceback
32
33 import parseur_python
34 from Noyau import N_CR
35
36 def entryPoint():
37    """
38        Retourne les informations nécessaires pour le chargeur de plugins
39        Ces informations sont retournées dans un dictionnaire
40    """
41    return {
42         # Le nom du plugin
43           'name' : 'python',
44         # La factory pour créer une instance du plugin
45           'factory' : PythonParser,
46           }
47
48
49 class PythonParser:
50    """
51        Ce convertisseur lit un fichier au format python avec la 
52        methode readfile : convertisseur.readfile(nom_fichier)
53        et retourne le texte au format outformat avec la 
54        methode convertisseur.convert(outformat)
55
56        Ses caractéristiques principales sont exposées dans 2 attributs 
57        de classe :
58
59        - extensions : qui donne une liste d'extensions de fichier préconisées
60
61        - formats : qui donne une liste de formats de sortie supportés
62    """
63    # Les extensions de fichier préconisées
64    extensions=('.py',)
65    # Les formats de sortie supportés (eval dict ou exec)
66    # Le format exec est du python executable (commande exec) converti avec PARSEUR_PYTHON
67    # Le format execnoparseur est du python executable (commande exec) non converti
68    formats=('exec','execnoparseur')
69
70    def __init__(self,cr=None):
71       # Si l'objet compte-rendu n'est pas fourni, on utilise le 
72       # compte-rendu standard
73       self.text=''
74       if cr :
75          self.cr=cr
76       else:
77          self.cr=N_CR.CR(debut='CR convertisseur format python',
78                          fin='fin CR format python')
79
80    def readfile(self,filename):
81       self.filename=filename
82       try:
83          self.text=open(filename).read()
84       except:
85          self.cr.fatal("Impossible ouvrir fichier %s" % filename)
86          return
87
88    def convert(self,outformat):
89       if outformat == 'exec':
90          try:
91             return parseur_python.PARSEUR_PYTHON(self.text).get_texte()
92          except:
93             # Erreur lors de la conversion
94             l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],
95                                          sys.exc_info()[2])
96             self.cr.exception("Impossible de convertir le fichier python \
97                                qui doit contenir des erreurs.\n \
98                                On retourne le fichier non converti \n \
99                                Prévenir la maintenance. \n" + string.join(l))
100             # On retourne néanmoins le source initial non converti (au cas où)
101             return self.text
102       elif outformat == 'execnoparseur':
103          return self.text
104       else:
105          raise "Format de sortie : %s, non supporté"
106          return None
107