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