Skip to content

Commit

Permalink
Renderer loading/registry now in aspen.renderers
Browse files Browse the repository at this point in the history
  • Loading branch information
pjz committed Jul 30, 2015
1 parent 210b0ef commit db2c58b
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 38 deletions.
16 changes: 2 additions & 14 deletions aspen/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,15 @@
from .http.response import Response
from . import json_ as json
from .logging import log, log_dammit
from .renderers import BUILTIN_RENDERERS, RENDERERS

# Shut up, PyFlakes. I know I'm addicted to you.
Response, json, is_callable, log, log_dammit
Response, json, is_callable, log, log_dammit, BUILTIN_RENDERERS, RENDERERS

dist = pkg_resources.get_distribution('aspen')
__version__ = dist.version
WINDOWS = sys.platform[:3] == 'win'

BUILTIN_RENDERERS = [ 'stdlib_format'
, 'stdlib_percent'
, 'stdlib_template'
, 'json_dump'
, 'jsonp_dump'
]

RENDERERS = BUILTIN_RENDERERS[:]

for entrypoint in pkg_resources.iter_entry_points(group='aspen.renderers'):
RENDERERS.append(entrypoint.name)

RENDERERS.sort()


def serve(website, host='0.0.0.0', port='8080'):
Expand Down
25 changes: 3 additions & 22 deletions aspen/configuration/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import mimetypes
import os
import sys
import pkg_resources
from collections import defaultdict

import aspen
Expand All @@ -23,7 +22,7 @@
from ..utils import ascii_dammit
from ..typecasting import defaults as default_typecasters
import aspen.body_parsers

from ..renderers import factories

default_indices = lambda: ['index.html', 'index.json', 'index',
'index.html.spt', 'index.json.spt', 'index.spt']
Expand Down Expand Up @@ -222,23 +221,7 @@ def safe_getcwd(errorstr):
}

# load renderers
self.renderer_factories = {}
for name in aspen.BUILTIN_RENDERERS:
# Pre-populate renderers so we can report on ImportErrors early
try:
capture = {}
python_syntax = 'from aspen.renderers.%s import Factory'
exec python_syntax % name in capture
make_renderer = capture['Factory'](self)
except ImportError, err:
make_renderer = err
err.info = sys.exc_info()
self.renderer_factories[name] = make_renderer

for entrypoint in pkg_resources.iter_entry_points(group='aspen.renderers'):
render_module = entrypoint.load()
self.renderer_factories[entrypoint.name] = render_module.Factory(self)
aspen.log_dammit("Found plugin for renderer '%s'" % entrypoint.name)
self.renderer_factories = factories(self)

self.default_renderers_by_media_type = defaultdict(lambda: self.renderer_default)
self.default_renderers_by_media_type[self.media_type_json] = 'json_dump'
Expand All @@ -259,12 +242,10 @@ def show_renderers(self):
aspen.log_dammit("Renderers (*ed are unavailable, CAPS is default):")
width = max(map(len, self.renderer_factories))
for name, factory in self.renderer_factories.items():
star = " "
star, error = " ", ""
if isinstance(factory, ImportError):
star = "*"
error = "ImportError: " + factory.args[0]
else:
error = ""
if name == self.renderer_default:
name = name.upper()
name = name.ljust(width + 2)
Expand Down
41 changes: 41 additions & 0 deletions aspen/renderers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,47 @@ class CheeseFactory(Factory):
from __future__ import print_function
from __future__ import unicode_literals

import sys
import pkg_resources

# Built-in renderers
BUILTIN_RENDERERS = [ 'stdlib_format'
, 'stdlib_percent'
, 'stdlib_template'
, 'json_dump'
, 'jsonp_dump'
]

RENDERERS = BUILTIN_RENDERERS[:]

for entrypoint in pkg_resources.iter_entry_points(group='aspen.renderers'):
RENDERERS.append(entrypoint.name)

RENDERERS.sort()

def factories(*args, **kwargs):
"""return a dict of render factory names to the factories themselves"""
renderer_factories = {}
# import the built-in renderers
for name in BUILTIN_RENDERERS:
# Pre-populate renderers so we can report on ImportErrors early
try:
capture = {}
python_syntax = 'from aspen.renderers.%s import Factory'
exec python_syntax % name in capture
make_renderer = capture['Factory'](*args, **kwargs)
except ImportError, err:
make_renderer = err
err.info = sys.exc_info()
renderer_factories[name] = make_renderer

# import renderers provided by other packages
for entrypoint in pkg_resources.iter_entry_points(group='aspen.renderers'):
render_module = entrypoint.load()
renderer_factories[entrypoint.name] = render_module.Factory(*args, **kwargs)
log_dammit("Found plugin for renderer '%s'" % entrypoint.name)
return renderer_factories


# abstract bases
# ==============
Expand Down
4 changes: 2 additions & 2 deletions aspen/resources/simplate.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,15 +218,15 @@ def _parse_specline(self, specline):
def _get_renderer_factory(self, media_type, renderer):
"""Given two bytestrings, return a renderer factory or None.
"""
factories = self.website.renderer_factories
if renderer_re.match(renderer) is None:
possible =', '.join(sorted(self.website.renderer_factories.keys()))
possible =', '.join(sorted(factories.keys()))
msg = ("Malformed renderer %s. It must match %s. Possible "
"renderers (might need third-party libs): %s.")
raise SyntaxError(msg % (renderer, renderer_re.pattern, possible))

renderer = renderer.decode('US-ASCII')

factories = self.website.renderer_factories
make_renderer = factories.get(renderer, None)
if isinstance(make_renderer, ImportError):
raise make_renderer
Expand Down

0 comments on commit db2c58b

Please sign in to comment.