Petites corrections.
- meileure gestion du % - fermeture immediate du fichier de code darcs-hash:20071219020759-af139-c62b40dca80e42978efd0dc2d27ed2338818b560.gz
This commit is contained in:
parent
4210b7c9ad
commit
f284ed4326
1 changed files with 24 additions and 18 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue