--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/map.py Sat Feb 07 06:54:52 2009 +0200
@@ -0,0 +1,112 @@
+"""
+ Handles mapping URLs to request handlers
+"""
+
+import http
+import handler
+
+class MappingError (http.ResponseError) :
+ """
+ URL could not be mapped
+ """
+
+ def __init__ (self, url) :
+ super(MappingError, self).__init__("URL not found: %s" % (url, ), status='404 Not Found')
+
+class Mapper (object) :
+ """
+ Translates requests to handlers
+ """
+
+ def map_request (self, request) :
+ """
+ Map the given request, returning a Handler
+ """
+
+ abstract
+
+class Mapping (object) :
+ """
+ A mapping object for StaticMapping
+ """
+
+ def test (self, request) :
+ """
+ Either return a handler, or None
+ """
+
+ abstract
+
+class RegexpMapping (object) :
+ """
+ A mapping object that uses regular expressions
+ """
+
+ def __init__ (self, regexp, handler) :
+ pass
+
+ def test (self, request) :
+ xxx
+
+class SimpleMapping (object) :
+ """
+ A mapping object that uses simple expressions
+ """
+
+ def __init__ (self, expression, handler) :
+ pass
+
+ def test (self, request) :
+ xxx
+
+class StaticMapping (Mapper) :
+ """
+ Translates requests to handlers using a list of pre-determined Mapping's
+ """
+
+ def __init__ (self, mappings) :
+ # store
+ self.mappings = mappings
+
+ def map_request (self, request) :
+ """
+ Returns the appropriate handler
+ """
+
+ # just test each mapping in turn
+ for mapping in self.mappings :
+ handler = mapping.test(request)
+
+ if handler :
+ return handler
+
+ # fail, not found
+ raise MappingError(request.get_page_name())
+
+class FilesystemMapper (Mapper) :
+ """
+ Translates requests to handlers based on a filesystem directory containing various kinds of files
+ """
+
+ def __init__ (self, path) :
+ """
+ Create, path is where the pages are stored
+ """
+
+ # store
+ self.path = path
+
+ def map_request (self, request) :
+ """
+ Looks up the appropriate Page, and then returns a generic Handler
+ """
+
+ # XXX: harcoded
+ return handler.Handler(handler.handle_request)
+
+# "friendly" names
+fstree = FilesystemMapper
+
+map = SimpleMapping
+mapre = RegexpMapping
+