diff -r b06ff4c05d42 -r a86a25a9f75b lib/map.py --- /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 +