Petites corrections.

- meileure gestion du %
- fermeture immediate du fichier de code

darcs-hash:20071219020759-af139-c62b40dca80e42978efd0dc2d27ed2338818b560.gz
This commit is contained in:
Jeremie Dimino 2007-12-19 03:07:59 +01:00
parent 4210b7c9ad
commit f284ed4326

View file

@ -22,6 +22,8 @@
'''Module utilisé par le plugin Python de bcfg2 pour générer un '''Module utilisé par le plugin Python de bcfg2 pour générer un
fichier de configuration à partir d'un script python''' fichier de configuration à partir d'un script python'''
__all__ = [ "Environment", "compileSource", "generate", "load" ]
import re, marshal, os import re, marshal, os
from cStringIO import StringIO from cStringIO import StringIO
@ -48,7 +50,7 @@ class Environment(dict):
# Dernière variable exportée à avoir été définie # Dernière variable exportée à avoir été définie
"last_definition": None, "last_definition": None,
# Écrit: variable keysep tostring(value) # Écrit: variable keysep tostring(value)
"export_definition": self.export_definition, "defvar": self.defvar,
# La convertion en chaîne de charactère # La convertion en chaîne de charactère
"tostring": self.tostring, "tostring": self.tostring,
# Définition des convertions # Définition des convertions
@ -68,11 +70,11 @@ class Environment(dict):
'''Lorsqu'on définie une variable, on "l'exporte" dans '''Lorsqu'on définie une variable, on "l'exporte" dans
le fichier produit''' le fichier produit'''
if variable in self["exports"]: if variable in self["exports"]:
self["export_definition"](variable, value) self["defvar"](variable, value)
dict.__setitem__(self, "last_definition", variable) dict.__setitem__(self, "last_definition", variable)
dict.__setitem__(self, variable, value) dict.__setitem__(self, variable, value)
def export_definition(self, variable, value): def defvar(self, variable, value):
'''Fonction par défaut pour gérée la définition des variables exportée. '''Fonction par défaut pour gérée la définition des variables exportée.
écrit 'variable = tostring(value)' dans le fichier produit''' écrit 'variable = tostring(value)' dans le fichier produit'''
self["out"]("%s%s%s\n" % (variable, self["keysep"], self["tostring"](value))) self["out"]("%s%s%s\n" % (variable, self["keysep"], self["tostring"](value)))
@ -99,6 +101,8 @@ class Environment(dict):
self["exports"].add(variable) self["exports"].add(variable)
__re_special_line = re.compile(r"^([ \t]*)(@|%)(.*)$", re.MULTILINE) __re_special_line = re.compile(r"^([ \t]*)(@|%)(.*)$", re.MULTILINE)
__re_affectation = re.compile(r"([a-zA-Z_][a-zA-Z_0-9]*)[ \t]*=")
__re_space_sep = re.compile(r"([^ \t]*)([ \t].*)")
def compileSource(source, filename=""): def compileSource(source, filename=""):
'''Compile un script''' '''Compile un script'''
@ -108,6 +112,7 @@ def compileSource(source, filename=""):
start = 0 start = 0
for m in __re_special_line.finditer(source): for m in __re_special_line.finditer(source):
newsource.write(source[start:m.start()]) newsource.write(source[start:m.start()])
start = m.end()
newsource.write(m.group(1)) newsource.write(m.group(1))
linetype = m.group(2) linetype = m.group(2)
if linetype == "@": if linetype == "@":
@ -121,23 +126,22 @@ def compileSource(source, filename=""):
newsource.write('\\n")') newsource.write('\\n")')
elif linetype == "%": elif linetype == "%":
line = m.group(3) line = m.group(3)
sp = line.split("=", 1) m = __re_affectation.match(line)
if len(sp) == 1: if m:
sp = line.split(" ", 1) varname = m.group(1)
newsource.write("export_definition('")
newsource.write(sp[0])
newsource.write("', tostring(")
newsource.write(sp[1])
newsource.write("))\n")
varname = sp[0].strip()
else:
newsource.write(line) newsource.write(line)
newsource.write("; export_definition('") newsource.write("; defvar('")
newsource.write(sp[0]) newsource.write(varname)
newsource.write("', tostring(") newsource.write("', tostring(")
newsource.write(sp[0]) newsource.write(varname)
newsource.write("))\n")
else:
m = __re_space_sep.match(line)
newsource.write("defvar('")
newsource.write(m.group(1))
newsource.write("', tostring(")
newsource.write(m.group(2))
newsource.write("))\n") newsource.write("))\n")
start = m.end()
newsource.write(source[start:]) newsource.write(source[start:])
return compile(newsource.getvalue(), filename, "exec") return compile(newsource.getvalue(), filename, "exec")
@ -163,5 +167,7 @@ def load(fname, cfname=None):
code = marshal.load(file(cfname)) code = marshal.load(file(cfname))
else: else:
code = compileSource(file(fname).read(), fname) code = compileSource(file(fname).read(), fname)
marshal.dump(code, open(cfname, "w")) cfile = open(cfname, "w")
marshal.dump(code, cfile)
cfile.close()
return code return code