Salome HOME
Merge V9 dans Master
[tools/eficas.git] / Editeur / session.py
index e503352cb811889051df42b0a72cfa27ba01b8b1..ebbf40a90af40519782c008a60fb6631cbecadb9 100644 (file)
@@ -1,4 +1,22 @@
-# -*- coding: iso-8859-15 -*-
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2017   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.
 
@@ -16,7 +34,7 @@ qui a lui meme un include (22,ii).
 Le deuxieme bb est un jeu de commandes simple.
 
 Le troisieme est decrit dans le fichier ff de type .ini
-qui est parse par le module ConfigParser.
+qui est parse par le module Configparser.
 Chaque section du fichier decrit un jeu de commandes.
 Un include est specifie par: numero logique=nom du fichier
 Une poursuite est specifiee par: poursuite=reference a un jeu de commande 
@@ -37,6 +55,12 @@ comm=ppp
 La session utilisera le catalogue V7.3 en mode debug.
 """
 
+from __future__ import absolute_import
+from __future__ import print_function
+try :
+  from builtins import str
+except :
+  pass
 try:
    import optparse
    from optparse import OptionValueError
@@ -45,79 +69,81 @@ except:
    from Tools.optparse import OptionValueError
 
 import os,traceback
-import ConfigParser
-import prefs
+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):
+def checkComm(option, opt_str, value, parser):
     if not hasattr(parser.values,"studies"):
        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
     parser.values.studies.append(d_study)
 
-def check_poursuite(option, opt_str, value, parser):
+def checkPoursuite(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}
     comm["pours"]=d_study
     parser.values.current=d_study
 
-def check_include(option, opt_str, value, parser):
+def checkInclude(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]
 
 
-def check_jdc(config,jdc,parser,fich):
+def checkJdc(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
+        config : objet de la classe Configparser permettant de parser le fichier fich
+        jdc : nom de la section du fichier fich a analyser
     """
     d_study={}
 
@@ -126,12 +152,16 @@ 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=checkJdc(config,p,parser,fich)
           pours["comm"]=comm
           d_study["pours"]=pours
           continue
@@ -140,100 +170,115 @@ 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
 
-def check_fich(option, opt_str, fich, parser):
+def checkFich(option, opt_str, fich, parser):
     """
         Fonction : parse le fichier fich (format .ini)
         
         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)
+    d_study=checkJdc(config,jdc,parser,fich)
     d_study["comm"]=comm
     parser.values.studies.append(d_study)
 
-def print_pours(d_pours,dec=''):
+def printPours(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_pours(d_pours["pours"],dec=dec+"++")
+       print((tr("%(v_1)s fichier poursuite: %(v_2)s", {'v_1': dec, 'v_2': d_pours["pours"]["comm"]})))
+       printPours(d_pours["pours"],dec=dec+"++")
 
-def print_d_env():
-    #print d_env
+def printDEnv():
     if d_env.studies is None:return
     for study in d_env.studies:
-       print "nom etude:",study["comm"]
-       print_pours(study,dec="++")
-       print
+       print((tr("nom etude : %s", study["comm"])))
+       printPours(study,dec="++")
 
-def create_parser():
+def createparser():
     # 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(u"-j","--jdc",dest="comm",type='string',
+                    action="callback",callback=checkComm,
+                    help=tr("nom du fichier de commandes"))
+
+    parser.add_option(u"-p","--poursuite", type="string",dest="pours",
+                  action="callback", callback=checkPoursuite,
+                  help=tr("nom du fichier poursuite"))
 
-    parser.add_option("-j","--jdc",dest="comm",type='string',
-                    action="callback",callback=check_comm,
-                    help="nom du fichier de commandes")
+    parser.add_option(u"-i","--include", 
+                  action="callback", callback=checkInclude,
+                  nargs=2, help=tr("numero d'unite suivi du nom du fichier include"))
 
-    parser.add_option("-p","--poursuite", type="string",dest="pours",
-                  action="callback", callback=check_poursuite,
-                  help="nom du fichier poursuite")
+    parser.add_option(u"-f","--fich", type="string",dest="fich",
+                  action="callback", callback=checkFich,
+                  help=tr("fichier decrivant une etude"))
 
-    parser.add_option("-i","--include", 
-                  action="callback", callback=check_include,
-                  nargs=2, help="numero d'unite suivi du nom du fichier include")
+    parser.add_option(u"-c","--cata", action="store", type="string",dest="cata",
+                  help=tr("version de catalogue a utiliser"))
 
-    parser.add_option("-f","--fich", type="string",dest="fich",
-                  action="callback", callback=check_fich,
-                  help="fichier decrivant une etude")
+    parser.add_option(u"-v","--version_cata", action="store", type="string",dest="version_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("-k","--kode", action="store", type="string",dest="code",
-                  help="nom du code a utiliser",default=prefs.code)
+    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()
+    parser=createparser()
     (options,args)=parser.parse_args(args[1:])
     if not hasattr(options,"studies"):
        options.studies=[]
@@ -242,44 +287,56 @@ def parse(args):
        del parser.values.current
     except:
        pass
-
     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) or re.search('.cas',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
-    #print_d_env()
+    #printDEnv()
     return options
 
-def get_unit(d_study,appli):
+def getUnit(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)
+       appli : objet application EFICAS (permet d'acceder aux services comme getSource)
     """
-    return get_dunit(d_study,appli)
+    return getDunit(d_study,appli)
 
-def get_dunit(d_unit,appli):
+def getDunit(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)
+       g=getDunit(d_unit["pours"],appli)
+       text=appli.getSource(comm)
        d[None]=comm,text,g
 
-    for k,v in d_unit.items():
-       if k in ("pours","comm"): continue
-       text=appli.get_source(v)
+    for k,v in list(d_unit.items()):
+       if k in (u"pours","comm"): continue
+       text=appli.getSource(v)
        d[k]=v,text,d
 
     return d