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