From c7fbaf3552b61cb272188a9cfc7590c0f14934a8 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 14 Feb 2013 11:17:40 -0500 Subject: better Genshi syntax lint checker --- src/lib/Bcfg2/Server/Lint/Genshi.py | 73 ++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 17 deletions(-) (limited to 'src/lib/Bcfg2/Server/Lint/Genshi.py') diff --git a/src/lib/Bcfg2/Server/Lint/Genshi.py b/src/lib/Bcfg2/Server/Lint/Genshi.py index 18b4ae28a..b8c823eb9 100755 --- a/src/lib/Bcfg2/Server/Lint/Genshi.py +++ b/src/lib/Bcfg2/Server/Lint/Genshi.py @@ -1,8 +1,11 @@ """ Check Genshi templates for syntax errors """ import sys -import genshi.template import Bcfg2.Server.Lint +from genshi.template import TemplateLoader, NewTextTemplate, MarkupTemplate, \ + TemplateSyntaxError +from Bcfg2.Server.Plugins.Bundler import BundleTemplateFile +from Bcfg2.Server.Plugins.Cfg.CfgGenshiGenerator import CfgGenshiGenerator class Genshi(Bcfg2.Server.Lint.ServerPlugin): @@ -10,30 +13,66 @@ class Genshi(Bcfg2.Server.Lint.ServerPlugin): def Run(self): """ run plugin """ - loader = genshi.template.TemplateLoader() - for plugin in ['Cfg', 'TGenshi']: - if plugin in self.core.plugins: - self.check_files(self.core.plugins[plugin].entries, - loader=loader) + if 'Cfg' in self.core.plugins: + self.check_cfg() + if 'TGenshi' in self.core.plugins: + self.check_tgenshi() + if 'Bundler' in self.core.plugins: + self.check_bundler() @classmethod def Errors(cls): return {"genshi-syntax-error": "error"} - def check_files(self, entries, loader=None): - """ Check genshi templates in a list of entries for syntax - errors """ - if loader is None: - loader = genshi.template.TemplateLoader() + def check_cfg(self): + """ Check genshi templates in Cfg for syntax errors """ + for entryset in self.core.plugins['Cfg'].entries.values(): + for entry in entryset.entries.values(): + if "hosts" in entry.name: + print "checking %s" % entry.name + print " handles: %s" % self.HandlesFile(entry.name) + print " is genshi: %s" % isinstance(entry, CfgGenshiGenerator) + if isinstance(entry, CfgGenshiGenerator): + print " has template: %s" % bool(entry.template) + if (self.HandlesFile(entry.name) and + isinstance(entry, CfgGenshiGenerator) and + not entry.template): + try: + entry.loader.load(entry.name, + cls=NewTextTemplate) + if "hosts" in entry.name: + print " loaded successfully" + except TemplateSyntaxError: + if "hosts" in entry.name: + print " failed loading" + err = sys.exc_info()[1] + self.LintError("genshi-syntax-error", + "Genshi syntax error: %s" % err) - for eset in entries.values(): + def check_tgenshi(self): + """ Check templates in TGenshi for syntax errors """ + loader = TemplateLoader() + + for eset in self.core.plugins['TGenshi'].entries.values(): for fname, sdata in list(eset.entries.items()): - if (self.HandlesFile(fname) and - (fname.endswith(".genshi") or fname.endswith(".newtxt"))): + if self.HandlesFile(fname): try: - loader.load(sdata.name, - cls=genshi.template.NewTextTemplate) - except genshi.template.TemplateSyntaxError: + loader.load(sdata.name, cls=NewTextTemplate) + except TemplateSyntaxError: err = sys.exc_info()[1] self.LintError("genshi-syntax-error", "Genshi syntax error: %s" % err) + + def check_bundler(self): + """ Check templates in Bundler for syntax errors """ + loader = TemplateLoader() + + for entry in self.core.plugins['Bundler'].entries.values(): + if (self.HandlesFile(entry.name) and + isinstance(entry, BundleTemplateFile)): + try: + loader.load(entry.name, cls=MarkupTemplate) + except TemplateSyntaxError: + err = sys.exc_info()[1] + self.LintError("genshi-syntax-error", + "Genshi syntax error: %s" % err) -- cgit v1.2.3-1-g7c22