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@31: class Mapper (handler.RequestHandler) : terom@30: """ terom@31: Looks up the handler to use based on the URL terom@30: """ terom@30: terom@31: def handle_request (self, request) : terom@30: """ terom@31: Map the given request 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@31: # find handler to use terom@31: handler = None terom@31: 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@31: break terom@30: terom@31: if not handler : terom@31: # fail, not found terom@31: raise MappingError(request.get_page_name()) terom@30: terom@31: # passthrough terom@31: return handler.handle_request(request) terom@30: terom@30: # "friendly" names terom@30: map = SimpleMapping terom@30: mapre = RegexpMapping terom@30: