[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