More changes for tests.

This commit is contained in:
Jonathan LaCour
2010-09-28 20:04:09 -04:00
parent 3766337a8e
commit af38ada00f
4 changed files with 84 additions and 60 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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: -*-