More changes for tests.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
def render(self, template_path, namespace):
|
||||
Template = self.loader.import_(template_path)
|
||||
stream = Template(namespace)
|
||||
return stream.render()
|
||||
Reference in New Issue
Block a user