Salome HOME
commentaire
[tools/eficas.git] / Editeur / session.py
index 8a804547b69236b3631e1f8244944360bdcbfed8..954f277dfb452c60d8a4697a6496a7be9cc8d4d0 100644 (file)
@@ -1,4 +1,22 @@
-# -*- coding: iso-8859-15 -*-
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2013   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
 """
 Ce module centralise les informations issues de la ligne de commande.
 
@@ -37,29 +55,43 @@ comm=ppp
 La session utilisera le catalogue V7.3 en mode debug.
 """
 
-import optparse
-from optparse import OptionValueError
-import traceback
-import ConfigParser, os
+from __future__ import absolute_import
+from __future__ import print_function
+try :
+  from builtins import str
+except :
+  pass
+try:
+   import optparse
+   from optparse import OptionValueError
+except:
+   from Tools import optparse
+   from Tools.optparse import OptionValueError
+
+import os,traceback
+import six.moves.configparser
+import re
+
+from Extensions.i18n import tr
 
 # Les valeurs decodees par optparse sont mises dans un objet dictionnaire-like.
 # On l'utilise comme environnement de session.
 d_env={}
 #
 # L'attribut "studies" de d_env est une liste dans laquelle on range les etudes de niveau global.
-# Une étude est stockée dans un dictionnaire.
-# La clé "comm" du dictionnaire donne le nom du fichier de commandes principal
-# La clé (optionnelle) "pours" du dictionnaire donne les informations pour une poursuite
-# La valeur associée à la clé est un dictionnaire qui contient les informations sur
-# le nom du fichier de commandes de la poursuite (clé "comm"), une éventuelle poursuite
-# (clé "pours") et les includes (clés entières associées à des noms de fichier).
+# Une etude est stockee dans un dictionnaire.
+# La cle "comm" du dictionnaire donne le nom du fichier de commandes principal
+# La cle (optionnelle) "pours" du dictionnaire donne les informations pour une poursuite
+# La valeur associee a la cle est un dictionnaire qui contient les informations sur
+# le nom du fichier de commandes de la poursuite (cle "comm"), une eventuelle poursuite
+# (cle "pours") et les includes (cles entieres associees a des noms de fichier).
 #
 #
 #
-# Les informations (dictionnaire) associées au fichier de commandes en cours de traitement 
-# sont stockées dans parser.values.current
+# Les informations (dictionnaire) associees au fichier de commandes en cours de traitement 
+# sont stockees dans parser.values.current
 # En general, il faut utiliser current et pas parser.values.studies car les informations
-# sont stockées hiérarchiquement
+# sont stockees hierarchiquement
 #
 
 def check_comm(option, opt_str, value, parser):
@@ -67,7 +99,7 @@ def check_comm(option, opt_str, value, parser):
        parser.values.studies=[]
        parser.values.comm=[]
     if not os.path.isfile(value):
-       raise OptionValueError("le fichier de commandes %s n'existe pas" % value)
+       raise OptionValueError(tr("le fichier de commandes %s n'existe pas", value))
     parser.values.comm.append(value)
     d_study={"comm":value}
     parser.values.current=d_study
@@ -75,9 +107,9 @@ def check_comm(option, opt_str, value, parser):
 
 def check_poursuite(option, opt_str, value, parser):
     if parser.values.comm is None:
-       raise OptionValueError("un fichier de commandes doit etre defini avant une poursuite %s" % value)
+       raise OptionValueError(tr("un fichier de commandes doit etre defini avant une poursuite %s", value))
     if not os.path.isfile(value):
-       raise OptionValueError("le fichier poursuite %s n'existe pas" % value)
+       raise OptionValueError(tr("le fichier poursuite %s n'existe pas", value))
     #current : fichier de commandes en cours de traitement (dictionnaire des infos)
     comm=parser.values.current
     d_study={"comm":value}
@@ -88,15 +120,15 @@ def check_include(option, opt_str, value, parser):
     try:
        args=[int(parser.rargs[0]),parser.rargs[1]]
     except:
-       raise OptionValueError("include mal defini %s" % parser.rargs[0:2])
+       raise OptionValueError(tr("include mal defini %s", parser.rargs[0:2]))
 
     del parser.rargs[0]
     del parser.rargs[0]
 
     if parser.values.comm is None:
-       raise OptionValueError("un fichier de commandes doit etre defini avant un include %s" % args)
+       raise OptionValueError(tr("un fichier de commandes doit etre defini avant un include %s", args))
     if not os.path.isfile(args[1]):
-       raise OptionValueError("le fichier include %s n'existe pas" % args[1])
+       raise OptionValueError(tr("le fichier include %s n'existe pas", args[1]))
 
     comm=parser.values.current
     comm[args[0]]=args[1]
@@ -105,13 +137,13 @@ def check_include(option, opt_str, value, parser):
 def check_jdc(config,jdc,parser,fich):
     """
         Fonction : analyse une section de fichier .ini pour en extraire
-                   les informations sur les fichiers poursuite et includes
-                   définis dans cette section
+        les informations sur les fichiers poursuite et includes
+        definis dans cette section
 
         parser : objet analyseur de la ligne de commande
         fich : nom du fichier .ini en cours d'analyse
         config : objet de la classe ConfigParser permettant de parser le fichier fich
-        jdc : nom de la section du fichier fich à analyser
+        jdc : nom de la section du fichier fich a analyser
     """
     d_study={}
 
@@ -120,10 +152,14 @@ def check_jdc(config,jdc,parser,fich):
           p=config.get(jdc,"poursuite")
 
           if not config.has_option(p,"comm"):
-             raise OptionValueError("jdc %s manque fichier comm dans section %s" % (fich,p))
+             raise OptionValueError(tr(" jdc %(v_1)s manque \
+                                      fichier comm dans section %(v_2)s", \
+                                      {'v_1': fich, 'v_2': p}))
           comm=config.get(p,"comm")
           if not os.path.isfile(comm):
-             raise OptionValueError("jdc %s, le fichier de commandes %s n'existe pas" % (fich,comm))
+             raise OptionValueError(tr("jdc %(v_1)s, le fichier\
+                                      de commandes %(v_2)s n'existe pas", \
+                                      {'v_1': fich, 'v_2': comm}))
 
           pours=check_jdc(config,p,parser,fich)
           pours["comm"]=comm
@@ -134,10 +170,13 @@ def check_jdc(config,jdc,parser,fich):
           unit=int(o)
           # si le parametre est un entier, il s'agit d'un include
           inc=config.get(jdc,o)
-       except:
+       except EficasException:
           continue
        if not os.path.isfile(inc):
-          raise OptionValueError("jdc %s fichier include %s, %s n'existe pas" % (fich,unit,inc))
+          raise OptionValueError(tr(" jdc %(v_1)s \
+                                   fichier include %(v_2)s, %(v_3)s \
+                                   n'existe pas", \
+                                   {'v_1': fich, 'v_2': unit, 'v_3': inc}))
        d_study[unit]=inc
 
     return d_study
@@ -148,28 +187,30 @@ def check_fich(option, opt_str, fich, parser):
         
         option : option en cours de traitement
         opt_str : chaine de caracteres utilisee par l'utilisateur
-        fich : nom du fichier .ini donné par l'utilisateur
+        fich : nom du fichier .ini donne par l'utilisateur
         parser : objet parseur des options de la ligne de commande
     """
     if not os.path.isfile(fich):
-       raise OptionValueError("le fichier jdc %s n'existe pas" % fich)
+       raise OptionValueError(tr(" le fichier jdc %s n'existe pas", str(fich)))
     if parser.values.fich is None:
        parser.values.fich=[]
     parser.values.fich.append(fich)
     if not hasattr(parser.values,"studies"):
        parser.values.studies=[]
        parser.values.comm=[]
-    config = ConfigParser.ConfigParser()
+    config = six.moves.configparser.ConfigParser()
     config.read([fich])
-    if not config.has_option("jdc","jdc"):
-       raise OptionValueError("jdc %s manque option jdc dans section jdc")
-    jdc=config.get("jdc","jdc")
+    if not config.has_option(u"jdc","jdc"):
+       raise OptionValueError(tr(" jdc %s manque option jdc dans section jdc", str(fich)))
+    jdc=config.get(u"jdc","jdc")
 
     if not config.has_option(jdc,"comm"):
-       raise OptionValueError("jdc %s manque fichier comm dans section %s" % (fich,jdc))
+       raise OptionValueError(tr(" jdc %(v_1)s manque fichier comm \
+                                dans section %(v_2)s", {'v_1': fich, 'v_2': jdc}))
     comm=config.get(jdc,"comm")
     if not os.path.isfile(comm):
-       raise OptionValueError("jdc %s, le fichier de commandes %s n'existe pas" % (fich,comm))
+       raise OptionValueError(tr("jdc %(v_1)s, le fichier de commandes \
+                                %(v_2)s n'existe pas", {'v_1': fich, 'v_2': comm}))
     parser.values.comm.append(comm)
 
     d_study=check_jdc(config,jdc,parser,fich)
@@ -178,52 +219,63 @@ def check_fich(option, opt_str, fich, parser):
 
 def print_pours(d_pours,dec=''):
     # Les fichiers includes d'abord
-    for k,v in d_pours.items():
-       if k in ("pours","comm"):continue
-       print dec+" include",k," :",v
+    for k,v in list(d_pours.items()):
+       if k in (u"pours","comm"):continue
+       print(( tr("%(v_1)s include %(v_2)s : %(v_3)s", {'v_1': str(dec), 'v_2': str(k), 'v_3': str(v)})))
 
-    if d_pours.has_key("pours"):
+    if "pours" in d_pours:
        # Description de la poursuite
-       print dec+" fichier poursuite:",d_pours["pours"]["comm"]
+       print((tr("%(v_1)s fichier poursuite: %(v_2)s", {'v_1': dec, 'v_2': d_pours["pours"]["comm"]})))
        print_pours(d_pours["pours"],dec=dec+"++")
 
 def print_d_env():
-    #print d_env
     if d_env.studies is None:return
     for study in d_env.studies:
-       print "nom etude:",study["comm"]
+       print((tr("nom etude : %s", study["comm"])))
        print_pours(study,dec="++")
-       print
 
 def create_parser():
     # creation du parser des options de la ligne de commande
-    parser=optparse.OptionParser(usage="usage: %prog [options]",version="%prog 1.8")
+    #import prefs
+    parser=optparse.OptionParser(usage=tr("utilisation : %prog [options]"), version="%prog 1.13")
 
-    parser.add_option("-j","--jdc",dest="comm",type='string',
+    parser.add_option(u"-j","--jdc",dest="comm",type='string',
                     action="callback",callback=check_comm,
-                    help="nom du fichier de commandes")
-    parser.add_option("-p","--poursuite", type="string",dest="pours",
+                    help=tr("nom du fichier de commandes"))
+
+    parser.add_option(u"-p","--poursuite", type="string",dest="pours",
                   action="callback", callback=check_poursuite,
-                  help="nom du fichier poursuite")
-    parser.add_option("-i","--include", 
+                  help=tr("nom du fichier poursuite"))
+
+    parser.add_option(u"-i","--include", 
                   action="callback", callback=check_include,
-                  nargs=2, help="numero d'unite suivi du nom du fichier include")
+                  nargs=2, help=tr("numero d'unite suivi du nom du fichier include"))
 
-    parser.add_option("-f","--fich", type="string",dest="fich",
+    parser.add_option(u"-f","--fich", type="string",dest="fich",
                   action="callback", callback=check_fich,
-                  help="fichier decrivant une etude")
+                  help=tr("fichier decrivant une etude"))
+
+    parser.add_option(u"-c","--cata", action="store", type="string",dest="cata",
+                  help=tr("version de catalogue a utiliser"))
 
-    parser.add_option("-c","--cata", action="store", type="string",dest="cata",
-                  help="version de catalogue a utiliser")
+    parser.add_option(u"-k","--kode", action="store", type="string",dest="code",
+                  help=tr("nom du code a utiliser"))
+
+    parser.add_option(u"-d","--debug", action="store", type="int",dest="debug",
+                  help=tr("niveau de debug"))
+
+    parser.add_option(u"-s","--schema", action="store", type="string",dest="ssCode",
+                  help=tr("schema"))
+    # To handle locale information
+    parser.add_option("-l", "--locale", action="store", type="string", dest="locale",
+                  help=tr("localisation de l'application, pour la traduction"))
 
-    parser.add_option("-d","--debug", action="store", type="int",dest="debug",
-                  help="niveau de debug")
 
     return parser
 
 def parse(args):
     parser=create_parser()
-    (options,args)=parser.parse_args(args)
+    (options,args)=parser.parse_args(args[1:])
     if not hasattr(options,"studies"):
        options.studies=[]
        options.comm=[]
@@ -231,14 +283,23 @@ def parse(args):
        del parser.values.current
     except:
        pass
-
-    if len(args) > 1:
-      for file in args[1:]:
+    for file in args:
          if os.path.isfile(file):
             options.comm.append(file)
             options.studies.append({"comm":file})
+            #print options.studies
+         elif len(args)==1 and (re.search('.comm',file) or re.search('.map',file)):
+            try :
+                f=open(file,'w')
+                f.close()
+            except :
+                parser.error(tr("Nombre incorrect d'arguments"))
+            options.comm.append(file)
+            options.studies.append({"comm":file})
+         elif len(args) == 1 and options.locale:
+            print((tr("Localisation specifiee pour l'application.")))
          else:
-            parser.error("incorrect number of arguments")
+            parser.error(tr("Nombre incorrect d'arguments"))
 
     global d_env
     d_env=options
@@ -248,11 +309,13 @@ def parse(args):
 def get_unit(d_study,appli):
     """
        Fonction : construit et retourne un dictionnaire contenant les informations
-                  sur les fichiers poursuite et includes sous la forme adaptée
-                  pour EFICAS
+       sur les fichiers poursuite et includes sous la forme adaptee
+       pour EFICAS ::
+
                   [None : nom_fichier, texte_source, unites_associees,           # poursuite
                    numero_include : nom_fichier, texte_source, unites_associees, # include
                     ...] 
+
        d_study : dictionnaire de l'etude
        appli : objet application EFICAS (permet d'acceder aux services comme get_source)
     """
@@ -260,15 +323,15 @@ def get_unit(d_study,appli):
 
 def get_dunit(d_unit,appli):
     d={}
-    if d_unit.has_key("pours"):
+    if 'pours' in d_unit:
        # on a une poursuite
        comm=d_unit["pours"]["comm"]
        g=get_dunit(d_unit["pours"],appli)
        text=appli.get_source(comm)
        d[None]=comm,text,g
 
-    for k,v in d_unit.items():
-       if k in ("pours","comm"): continue
+    for k,v in list(d_unit.items()):
+       if k in (u"pours","comm"): continue
        text=appli.get_source(v)
        d[k]=v,text,d