From af38ada00fe175053062316be8b857fa7019c1be Mon Sep 17 00:00:00 2001 From: Jonathan LaCour Date: Tue, 28 Sep 2010 20:04:09 -0400 Subject: [PATCH] More changes for tests. --- pecan/decorators.py | 1 + pecan/pecan.py | 27 +++++++---- pecan/templating.py | 112 ++++++++++++++++++++++++-------------------- setup.py | 4 +- 4 files changed, 84 insertions(+), 60 deletions(-) diff --git a/pecan/decorators.py b/pecan/decorators.py index ddbb2eb..699df8d 100644 --- a/pecan/decorators.py +++ b/pecan/decorators.py @@ -3,6 +3,7 @@ def expose(template=None, content_type='text/html'): def decorate(f): f.exposed = True if not hasattr(f, 'pecan'): f.pecan = {} + f.pecan['content_type'] = content_type f.pecan.setdefault('template', []).append(template) f.pecan.setdefault('content_types', {})[content_type] = template return f diff --git a/pecan/pecan.py b/pecan/pecan.py index e719f4e..8d4bf6f 100644 --- a/pecan/pecan.py +++ b/pecan/pecan.py @@ -23,11 +23,17 @@ def override_template(template): class Pecan(object): - def __init__(self, root, renderers=renderers, default_renderer='genshi', hooks=[]): + def __init__(self, root, + renderers = renderers, + default_renderer = 'genshi', + template_path = 'templates', + hooks = []): + self.root = root self.renderers = renderers self.default_renderer = default_renderer self.hooks = hooks + self.template_path = template_path self.translate = string.maketrans( string.punctuation, '_' * len(string.punctuation) @@ -98,10 +104,11 @@ class Pecan(object): # lookup the controller path = state.request.path - content_type = 'text/html' + content_type = None if '.' in path.split('/')[-1]: path, format = path.split('.') - content_type = self.get_content_type(format) + override_content_type = True + content_type = self.get_content_type(format) controller = self.route(self.root, path) # if we didn't find a controller, issue a 404 @@ -110,6 +117,10 @@ class Pecan(object): response.status = 404 return response(environ, start_response) + # determine content type + if content_type is None: + content_type = controller.pecan.get('content_type', 'text/html') + # handle "before" hooks for hook in self.hooks: hook.before(state) @@ -117,7 +128,7 @@ class Pecan(object): # get the result from the controller, properly handling wrap hooks try: result = controller(**dict(state.request.str_params)) - + # pull the template out based upon content type template = controller.pecan.get('content_types', {}).get(content_type) @@ -125,11 +136,11 @@ class Pecan(object): template = getattr(request, 'override_template', template) if template: - renderer = self.renderers[self.default_renderer] + renderer = self.renderers.get(self.default_renderer, self.template_path) if template == 'json': - renderer = self.renderers['json'] - elif len(self.renderers) > 1 and ':' in template: - renderer = self.renderers.get(template.split(':')[0], self.renderers.values()[0]) + renderer = self.renderers.get('json', self.template_path) + elif ':' in template: + renderer = self.renderers.get(template.split(':')[0], self.template_path) template = template.split(':')[1] result = renderer.render(template, result) content_type = renderer.content_type diff --git a/pecan/templating.py b/pecan/templating.py index 978485c..9f6a4c3 100644 --- a/pecan/templating.py +++ b/pecan/templating.py @@ -1,5 +1,26 @@ -renderers = {} +__all__ = ['renderers'] +_renderers = {} + +class RendererFactory(object): + def create(self, name, template_path): + if name == 'genshi': + return GenshiRenderer(template_path) + elif name == 'kajiki': + return KajikiRenderer(template_path) + elif name == 'mako': + return MakoRenderer(template_path) + elif name == 'json': + return JsonRenderer(template_path) + + def get(self, name, template_path): + key = name+template_path + if key not in _renderers: + _renderers[key] = self.create(name, template_path) + return _renderers[key] + +renderers = RendererFactory() + # # JSON rendering engine @@ -8,75 +29,64 @@ renderers = {} class JsonRenderer(object): content_type = 'application/json' + def __init__(self, path): + pass + def render(self, template_path, namespace): from jsonify import encode - return encode(namespace) - -renderers['json'] = JsonRenderer() + result = encode(namespace) + print '*' * 80 + print result + print type(result) + print '*' * 80 + return result # # Genshi rendering engine # -try: - from genshi.template import TemplateLoader +class GenshiRenderer(object): + content_type = 'text/html' + + def __init__(self, path): + from genshi.template import TemplateLoader + self.loader = TemplateLoader([path], auto_reload=True) - class GenshiRenderer(object): - content_type = 'text/html' - - def __init__(self): - self.loader = TemplateLoader(['templates'], auto_reload=True) - - def render(self, template_path, namespace): - tmpl = self.loader.load(template_path) - stream = tmpl.generate(**namespace) - return stream.render('html') -except ImportError: - pass -else: - renderers['genshi'] = GenshiRenderer() + def render(self, template_path, namespace): + tmpl = self.loader.load(template_path) + stream = tmpl.generate(**namespace) + return stream.render('html') # # Mako rendering engine # -try: - from mako.lookup import TemplateLookup - class MakoRenderer(object): - content_type = 'text/html' - - def __init__(self): - self.loader = TemplateLookup(directories=['templates']) - - def render(self, template_path, namespace): - tmpl = self.loader.get_template(template_path) - return tmpl.render(**namespace) -except ImportError: - pass -else: - renderers['mako'] = MakoRenderer() +class MakoRenderer(object): + content_type = 'text/html' + + def __init__(self, path): + from mako.lookup import TemplateLookup + self.loader = TemplateLookup(directories=[path]) + def render(self, template_path, namespace): + tmpl = self.loader.get_template(template_path) + return tmpl.render(**namespace) + # # Kajiki rendering engine -# +# -try: - from kajiki.loader import FileLoader +class KajikiRenderer(object): + content_type = 'text/html' - class KajikiRenderer(object): - content_type = 'text/html' + def __init__(self, path): + from kajiki.loader import FileLoader + self.loader = FileLoader(path, reload=True) - def __init__(self): - self.loader = FileLoader('templates', reload=True) - - def render(self, template_path, namespace): - Template = self.loader.import_(template_path) - stream = Template(namespace) - return stream.render() -except ImportError: - pass -else: - renderers['kajiki'] = KajikiRenderer() \ No newline at end of file + def render(self, template_path, namespace): + Template = self.loader.import_(template_path) + stream = Template(namespace) + return stream.render() \ No newline at end of file diff --git a/setup.py b/setup.py index b1fa858..3f738e3 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,9 @@ setup( "simplegeneric >= 0.7", "Genshi >= 0.6", "Kajiki >= 0.2.2", - "Mako >= 0.3" + "Mako >= 0.3", + "py >= 1.3.4", + "WebTest >= 1.2.2" ], entry_points = """ # -*- Entry points: -*-