[Repoze-dev] Repoze CVS: publisher.py
Tres Seaver
tseaver at agendaless.com
Wed Sep 12 18:23:37 UTC 2007
Update of /home/repoze/cvs/repoze.obob/repoze/obob
In directory laguna.palladion.com:/tmp/cvs-serv16362/repoze/obob
Modified Files:
publisher.py
Log Message:
- Add a default 'get_root' implementation
o Returns a callable mapping, holding keys passed to the publisher's ctor
as 'dispatchables'.
o If published directly, returns a dumb HTML page listing the keys as
links.
- Add a 'make_obob' which can be used in a paste configuration.
Index: publisher.py
===================================================================
RCS file: /home/repoze/cvs/repoze.obob/repoze/obob/publisher.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- publisher.py 12 Sep 2007 16:34:46 -0000 1.4
+++ publisher.py 12 Sep 2007 18:23:35 -0000 1.5
@@ -1,3 +1,12 @@
+PLUGPOINTS = ('request_factory',
+ 'get_root',
+ 'before_traverse',
+ 'traverse',
+ 'before_invoke',
+ 'invoke',
+ 'map_result',
+ )
+
class ObobPublisher:
def __init__(self,
@@ -8,15 +17,24 @@
before_invoke=None,
invoke=None,
map_result=None,
+ dispatchable=None,
+ extras=None,
):
- if get_root is None:
- raise ValueError("No 'get_root'!")
+ if dispatchable is None:
+ dispatchable = {}
- if not callable(get_root):
- raise ValueError("'get_root' not callable!")
+ if extras is None:
+ extras = {}
- self.get_root = get_root
+ self._default_root = _DefaultRoot(dispatchable)
+ self.extras = extras
+
+ if get_root is not None:
+ if not callable(get_root):
+ raise ValueError("'get_root' not callable!")
+
+ self.get_root = get_root
if request_factory is not None:
if not callable(request_factory):
@@ -71,17 +89,19 @@
request = self.request_factory(environ)
root = current = self.get_root(request)
- for name in request['PATH_INFO'].split('/'): # XXX, contract?
+ elements = request['PATH_INFO'].split('/') # XXX, contract?
+ for name in elements:
+ if name.strip() == '':
+ continue
self.before_traverse(current, name, request)
current = self.traverse(current, name)
published = request['PUBLISHED'] = current # XXX, contract?
- _bi(published, request)
self.before_invoke(published, request)
result = self.invoke(published, request)
- status, headers, body_iter = self._mapResult(request, result)
+ status, headers, body_iter = self.map_result(request, result)
start_response(status, headers)
@@ -92,6 +112,9 @@
def request_factory(self, environ):
return environ
+ def get_root(self, request):
+ return self._default_root
+
def before_traverse(self, current, name, request):
pass
@@ -102,7 +125,56 @@
pass
def invoke(self, published, request):
- return published(request)
+ return published()
def map_result(self, request, result):
- return 200, {}, [result]
+ if isinstance(result, basestring):
+ result = [result]
+ return '200 OK', {}, result
+
+class _DefaultRoot:
+
+ def __init__(self, dispatchable):
+ self._dispatchable = dispatchable
+
+ def keys(self):
+ return self._dispatchable.keys()
+
+ def __getitem__(self, key):
+ return self._dispatchable[key]
+
+ def __call__(self, *args, **kw):
+ lines = ['<html>',
+ '<body>',
+ '<ul>',
+ ]
+ keys = self._dispatchable.keys()
+ keys.sort()
+ for key in keys:
+ lines.append('<li><a href="%s">%s</a></li>' % (key, key))
+ lines.extend(['</ul>',
+ '</body>',
+ '</html>',
+ ])
+ return lines
+
+def _resolve(dotted_or_ep):
+ from pkg_resources import EntryPoint
+ return EntryPoint.parse('x=%s' % dotted_or_ep).load(False)
+
+def make_obob(global_config, **kw):
+ PREFIX = 'repoze.obob.'
+ dispatchable = {}
+ extras = {}
+ new_kw = {'dispatchable': dispatchable, 'extras': extras}
+ for k, v in kw.items():
+ if k.startswith(PREFIX):
+ trimmed = k[len(PREFIX):]
+ callable = _resolve(v)
+ if trimmed in PLUGPOINTS:
+ new_kw[trimmed] = callable
+ else:
+ dispatchable[trimmed] = callable
+ else:
+ extras[k] = v
+ return ObobPublisher(**new_kw)
_______________________________________________
Repoze-dev mailing list
Repoze-dev at lists.repoze.org
http://lists.repoze.org/mailman/listinfo/repoze-dev
More information about the Repoze-dev
mailing list