/usr/share/pyshared/Editeur/session.py is in eficas 6.4.0-1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 | # -*- coding: iso-8859-15 -*-
"""
Ce module centralise les informations issues de la ligne de commande.
La ligne de commande est parsee avec l'aide du module python optparse.
Les options possibles sont : -c, -j, -p, -d, -i, -f comme definies ci-dessous.
Un exemple typique d'utilisation est :
>>> ./appli.py -c V7.3 -d 1 -j aa -i 11 iii -p ppp -i 22 ii -j bb -f ff
qui demande a l'application d'ouvrir trois jeux de commandes.
Le premier (aa) a un include (11,iii) et est la suite du fichier poursuite ppp
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.
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
Cette reference correspond a un nom de section decrivant le jeu de commandes.
Le jeu de commandes maitre est donne par l'entree globale jdc dans la section jdc.
Exemple:
[jdc]
jdc=a
[a]
comm=aa
poursuite=pours
11=iii
[pours]
comm=ppp
22=ii
La session utilisera le catalogue V7.3 en mode debug.
"""
try:
import optparse
from optparse import OptionValueError
except:
from Tools import optparse
from Tools.optparse import OptionValueError
import os,traceback
import ConfigParser
import re
# 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).
#
#
#
# Les informations (dictionnaire) associées au fichier de commandes en cours de traitement
# sont stockées dans parser.values.current
# En general, il faut utiliser current et pas parser.values.studies car les informations
# sont stockées hiérarchiquement
#
def check_comm(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)
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):
if parser.values.comm is None:
raise OptionValueError("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)
#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):
try:
args=[int(parser.rargs[0]),parser.rargs[1]]
except:
raise OptionValueError("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)
if not os.path.isfile(args[1]):
raise OptionValueError("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):
"""
Fonction : analyse une section de fichier .ini pour en extraire
les informations sur les fichiers poursuite et includes
définis 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
"""
d_study={}
for o in config.options(jdc):
if o == "poursuite":
p=config.get(jdc,"poursuite")
if not config.has_option(p,"comm"):
raise OptionValueError("jdc %s manque fichier comm dans section %s" % (fich,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))
pours=check_jdc(config,p,parser,fich)
pours["comm"]=comm
d_study["pours"]=pours
continue
try:
unit=int(o)
# si le parametre est un entier, il s'agit d'un include
inc=config.get(jdc,o)
except:
continue
if not os.path.isfile(inc):
raise OptionValueError("jdc %s fichier include %s, %s n'existe pas" % (fich,unit,inc))
d_study[unit]=inc
return d_study
def check_fich(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
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)
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.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(jdc,"comm"):
raise OptionValueError("jdc %s manque fichier comm dans section %s" % (fich,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))
parser.values.comm.append(comm)
d_study=check_jdc(config,jdc,parser,fich)
d_study["comm"]=comm
parser.values.studies.append(d_study)
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
if d_pours.has_key("pours"):
# Description de la poursuite
print dec+" fichier poursuite:",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_pours(study,dec="++")
print
def create_parser():
# creation du parser des options de la ligne de commande
#import prefs
parser=optparse.OptionParser(usage="usage: %prog [options]",version="%prog 1.13")
parser.add_option("-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",
action="callback", callback=check_poursuite,
help="nom du fichier poursuite")
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("-f","--fich", type="string",dest="fich",
action="callback", callback=check_fich,
help="fichier decrivant une etude")
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")
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[1:])
if not hasattr(options,"studies"):
options.studies=[]
options.comm=[]
try:
del parser.values.current
except:
pass
for file in args:
if os.path.isfile(file):
options.comm.append(file)
options.studies.append({"comm":file})
elif len(args)==1 and re.search('.comm',file):
try :
f=open(file,'w')
f.close()
except :
parser.error("incorrect number of arguments")
options.comm.append(file)
options.studies.append({"comm":file})
else:
parser.error("incorrect number of arguments")
global d_env
d_env=options
#print_d_env()
return options
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 ::
[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)
"""
return get_dunit(d_study,appli)
def get_dunit(d_unit,appli):
d={}
if d_unit.has_key("pours"):
# 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
text=appli.get_source(v)
d[k]=v,text,d
return d
|