diff options
| author | Chris McDonough <chrism@plope.com> | 2010-10-25 10:29:31 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2010-10-25 10:29:31 -0400 |
| commit | 64372401084889a440c9d990a0febc221e3e4b5c (patch) | |
| tree | c8939a341505d19f19fa6918d264b4e1d95326f8 /repoze/bfg/urldispatch.py | |
| parent | c8e78c2037806f3e5dab57de635bf80865b7061d (diff) | |
| download | pyramid-64372401084889a440c9d990a0febc221e3e4b5c.tar.gz pyramid-64372401084889a440c9d990a0febc221e3e4b5c.tar.bz2 pyramid-64372401084889a440c9d990a0febc221e3e4b5c.zip | |
first pass at converting bfg to pyramid namespace
Diffstat (limited to 'repoze/bfg/urldispatch.py')
| -rw-r--r-- | repoze/bfg/urldispatch.py | 148 |
1 files changed, 0 insertions, 148 deletions
diff --git a/repoze/bfg/urldispatch.py b/repoze/bfg/urldispatch.py deleted file mode 100644 index 8aca2c421..000000000 --- a/repoze/bfg/urldispatch.py +++ /dev/null @@ -1,148 +0,0 @@ -import re -from urllib import unquote -from zope.interface import implements - -from repoze.bfg.interfaces import IRoutesMapper -from repoze.bfg.interfaces import IRoute - -from repoze.bfg.compat import all -from repoze.bfg.encode import url_quote -from repoze.bfg.exceptions import URLDecodeError -from repoze.bfg.traversal import traversal_path -from repoze.bfg.traversal import quote_path_segment - - -_marker = object() - -class Route(object): - implements(IRoute) - def __init__(self, name, pattern, factory=None, predicates=(), - pregenerator=None): - self.pattern = pattern - self.path = pattern # indefinite b/w compat, not in interface - self.match, self.generate = _compile_route(pattern) - self.name = name - self.factory = factory - self.predicates = predicates - self.pregenerator = pregenerator - -class RoutesMapper(object): - implements(IRoutesMapper) - def __init__(self): - self.routelist = [] - self.routes = {} - - def has_routes(self): - return bool(self.routelist) - - def get_routes(self): - return self.routelist - - def get_route(self, name): - return self.routes.get(name) - - def connect(self, name, pattern, factory=None, predicates=(), - pregenerator=None): - if name in self.routes: - oldroute = self.routes[name] - self.routelist.remove(oldroute) - route = Route(name, pattern, factory, predicates, pregenerator) - self.routelist.append(route) - self.routes[name] = route - return route - - def generate(self, name, kw): - return self.routes[name].generate(kw) - - def __call__(self, request): - environ = request.environ - try: - # empty if mounted under a path in mod_wsgi, for example - path = environ['PATH_INFO'] or '/' - except KeyError: - path = '/' - - for route in self.routelist: - match = route.match(path) - if match is not None: - preds = route.predicates - info = {'match':match, 'route':route} - if preds and not all((p(info, request) for p in preds)): - continue - return info - - return {'route':None, 'match':None} - -# stolen from bobo and modified -route_re = re.compile(r'(/:[a-zA-Z]\w*)') -def _compile_route(route): - if not route.startswith('/'): - route = '/' + route - star = None - if '*' in route: - route, star = route.rsplit('*', 1) - pat = route_re.split(route) - pat.reverse() - rpat = [] - gen = [] - prefix = pat.pop() - if prefix: - rpat.append(re.escape(prefix)) - gen.append(prefix) - while pat: - name = pat.pop() - name = name[2:] - gen.append('/%%(%s)s' % name) - name = '/(?P<%s>[^/]+)' % name - rpat.append(name) - s = pat.pop() - if s: - rpat.append(re.escape(s)) - gen.append(s) - - if star: - rpat.append('(?P<%s>.*?)' % star) - gen.append('%%(%s)s' % star) - - pattern = ''.join(rpat) + '$' - - match = re.compile(pattern).match - def matcher(path): - m = match(path) - if m is None: - return m - d = {} - for k,v in m.groupdict().iteritems(): - if k is not None: - if k == star: - d[k] = traversal_path(v) - else: - encoded = unquote(v) - try: - d[k] = encoded.decode('utf-8') - except UnicodeDecodeError, e: - raise URLDecodeError( - e.encoding, e.object, e.start, e.end, e.reason - ) - - - return d - - - gen = ''.join(gen) - def generator(dict): - newdict = {} - for k, v in dict.items(): - if isinstance(v, unicode): - v = v.encode('utf-8') - if k == star and hasattr(v, '__iter__'): - v = '/'.join([quote_path_segment(x) for x in v]) - elif k != star: - try: - v = url_quote(v) - except TypeError: - pass - newdict[k] = v - return gen % newdict - - return matcher, generator |
