home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import re
- import sys
- import urllib
- if sys.version < '2.4':
- from sets import ImmutableSet as frozenset
-
- from routes.util import _url_quote as url_quote, _str_encode
-
- class Route(object):
- reserved_keys = [
- 'requirements']
- done_chars = ('/', ',', ';', '.', '#')
-
- def __init__(self, name, routepath, **kargs):
- self.routepath = routepath
- self.sub_domains = False
- self.prior = None
- self.redirect = False
- self.name = name
- self._kargs = kargs
- self.minimization = kargs.pop('_minimize', False)
- self.encoding = kargs.pop('_encoding', 'utf-8')
- self.reqs = kargs.get('requirements', { })
- self.decode_errors = 'replace'
- self.static = kargs.pop('_static', False)
- self.filter = kargs.pop('_filter', None)
- self.absolute = kargs.pop('_absolute', False)
- self.member_name = kargs.pop('_member_name', None)
- self.collection_name = kargs.pop('_collection_name', None)
- self.parent_resource = kargs.pop('_parent_resource', None)
- self.conditions = kargs.pop('conditions', None)
- self.explicit = kargs.pop('_explicit', False)
- if self.static:
- self.external = '://' in self.routepath
- self.minimization = False
-
- if routepath.startswith('/') and self.minimization:
- self.routepath = routepath[1:]
-
- self._setup_route()
-
-
- def _setup_route(self):
- self.routelist = routelist = self._pathkeys(self.routepath)
- routekeys = [](_[1])
- self.dotkeys = [](_[2])
- self.req_regs = { }
- for key, val in self.reqs.iteritems():
- self.req_regs[key] = re.compile('^' + val + '$')
-
- (self.defaults, defaultkeys) = self._defaults(routekeys, self.reserved_keys, self._kargs.copy())
- self.maxkeys = defaultkeys | routekeys
- (self.minkeys, self.routebackwards) = self._minkeys(routelist[:])
- self.hardcoded = [](_[3])
- self._default_keys = frozenset(self.defaults.keys())
-
-
- def make_full_route(self):
- regpath = ''
- for part in self.routelist:
- if isinstance(part, dict):
- regpath += '%(' + part['name'] + ')s'
- continue
- regpath += part
-
- self.regpath = regpath
-
-
- def make_unicode(self, s):
- if isinstance(s, unicode):
- return s
- if isinstance(s, str):
- return s.decode(self.encoding)
- if callable(s):
- return s
- return unicode(s)
-
-
- def _pathkeys(self, routepath):
- collecting = False
- current = ''
- done_on = ''
- var_type = ''
- just_started = False
- routelist = []
- for char in routepath:
- if (char in (':', '*', '{') and not collecting or not (self.static) or char in ('{',)) and not collecting:
- just_started = True
- collecting = True
- var_type = char
- if char == '{':
- done_on = '}'
- just_started = False
-
- if len(current) > 0:
- routelist.append(current)
- current = ''
-
- len(current) > 0
- if collecting and just_started:
- just_started = False
- if char == '(':
- done_on = ')'
- else:
- current = char
- done_on = self.done_chars + ('-',)
- char == '('
- if collecting and char not in done_on:
- current += char
- continue
- if collecting:
- collecting = False
- if var_type == '{':
- if current[0] == '.':
- var_type = '.'
- current = current[1:]
- else:
- var_type = ':'
- opts = current.split(':')
- if len(opts) > 1:
- current = opts[0]
- self.reqs[current] = opts[1]
-
-
- routelist.append(dict(type = var_type, name = current))
- if char in self.done_chars:
- routelist.append(char)
-
- done_on = var_type = current = ''
- continue
- current += char
-
- if collecting:
- routelist.append(dict(type = var_type, name = current))
- elif current:
- routelist.append(current)
-
- return routelist
-
-
- def _minkeys(self, routelist):
- minkeys = []
- backcheck = routelist[:]
- if not self.minimization:
- for part in backcheck:
- if isinstance(part, dict):
- minkeys.append(part['name'])
- continue
-
- return (frozenset(minkeys), backcheck)
- gaps = False
- backcheck.reverse()
- for part in backcheck:
- if not isinstance(part, dict) and part not in self.done_chars:
- gaps = True
- continue
- elif not isinstance(part, dict):
- continue
-
- key = part['name']
- if self.defaults.has_key(key) and not gaps:
- continue
-
- minkeys.append(key)
- gaps = True
-
- return (frozenset(minkeys), backcheck)
-
-
- def _defaults(self, routekeys, reserved_keys, kargs):
- defaults = { }
- if 'controller' not in routekeys and 'controller' not in kargs and not (self.explicit):
- kargs['controller'] = 'content'
-
- if 'action' not in routekeys and 'action' not in kargs and not (self.explicit):
- kargs['action'] = 'index'
-
- defaultkeys = [](_[1])
- for key in defaultkeys:
- if kargs[key] is not None:
- defaults[key] = self.make_unicode(kargs[key])
- continue
- []
- defaults[key] = None
-
- if 'action' in routekeys and not defaults.has_key('action') and not (self.explicit):
- defaults['action'] = 'index'
-
- if 'id' in routekeys and not defaults.has_key('id') and not (self.explicit):
- defaults['id'] = None
-
- newdefaultkeys = [](_[2])
- return (defaults, newdefaultkeys)
-
-
- def makeregexp(self, clist, include_names = True):
- if self.minimization:
- reg = self.buildnextreg(self.routelist, clist, include_names)[0]
- if not reg:
- reg = '/'
-
- reg = reg + '/?' + '$'
- if not reg.startswith('/'):
- reg = '/' + reg
-
- else:
- reg = self.buildfullreg(clist, include_names)
- reg = '^' + reg
- if not include_names:
- return reg
- self.regexp = reg
- self.regmatch = re.compile(reg)
-
-
- def buildfullreg(self, clist, include_names = True):
- regparts = []
- for part in self.routelist:
- if isinstance(part, dict):
- var = part['name']
- if var == 'controller':
- partmatch = '|'.join(map(re.escape, clist))
- elif part['type'] == ':':
- if not self.reqs.get(var):
- pass
- partmatch = '[^/]+?'
- elif part['type'] == '.':
- if not self.reqs.get(var):
- pass
- partmatch = '[^/.]+?'
- elif not self.reqs.get(var):
- pass
- partmatch = '.+?'
- if include_names:
- regpart = '(?P<%s>%s)' % (var, partmatch)
- else:
- regpart = '(?:%s)' % partmatch
- if part['type'] == '.':
- regparts.append('(?:\\.%s)??' % regpart)
- else:
- regparts.append(regpart)
- part['type'] == '.'
- regparts.append(re.escape(part))
-
- regexp = ''.join(regparts) + '$'
- return regexp
-
-
- def buildnextreg(self, path, clist, include_names = True):
- if path:
- part = path[0]
- else:
- part = ''
- reg = ''
- rest = ''
- noreqs = True
- allblank = True
- if len(path[1:]) > 0:
- self.prior = part
- (rest, noreqs, allblank) = self.buildnextreg(path[1:], clist, include_names)
-
- if isinstance(part, dict) and part['type'] in (':', '.'):
- var = part['name']
- typ = part['type']
- partreg = ''
- if self.reqs.has_key(var):
- if include_names:
- partreg = '(?P<%s>%s)' % (var, self.reqs[var])
- else:
- partreg = '(?:%s)' % self.reqs[var]
- if typ == '.':
- partreg = '(?:\\.%s)??' % partreg
-
- elif var == 'controller':
- if include_names:
- partreg = '(?P<%s>%s)' % (var, '|'.join(map(re.escape, clist)))
- else:
- partreg = '(?:%s)' % '|'.join(map(re.escape, clist))
- elif self.prior in ('/', '#'):
- if include_names:
- partreg = '(?P<' + var + '>[^' + self.prior + ']+?)'
- else:
- partreg = '(?:[^' + self.prior + ']+?)'
- elif not rest:
- if typ == '.':
- exclude_chars = '/.'
- else:
- exclude_chars = '/'
- if include_names:
- partreg = '(?P<%s>[^%s]+?)' % (var, exclude_chars)
- else:
- partreg = '(?:[^%s]+?)' % exclude_chars
- if typ == '.':
- partreg = '(?:\\.%s)??' % partreg
-
- else:
- end = ''.join(self.done_chars)
- rem = rest
- if rem[0] == '\\' and len(rem) > 1:
- rem = rem[1]
- elif rem.startswith('(\\') and len(rem) > 2:
- rem = rem[2]
- else:
- rem = end
- rem = frozenset(rem) | frozenset([
- '/'])
- if include_names:
- partreg = '(?P<%s>[^%s]+?)' % (var, ''.join(rem))
- else:
- partreg = '(?:[^%s]+?)' % ''.join(rem)
- if self.reqs.has_key(var):
- noreqs = False
-
- if not self.defaults.has_key(var):
- allblank = False
- noreqs = False
-
- if noreqs:
- if self.reqs.has_key(var) and self.defaults.has_key(var):
- reg = '(' + partreg + rest + ')?'
- elif self.reqs.has_key(var):
- allblank = False
- reg = partreg + rest
- elif self.defaults.has_key(var) and self.prior in (',', ';', '.'):
- reg = partreg + rest
- elif self.defaults.has_key(var):
- reg = partreg + '?' + rest
- else:
- allblank = False
- reg = partreg + rest
- elif allblank and self.defaults.has_key(var):
- reg = '(' + partreg + rest + ')?'
- else:
- reg = partreg + rest
- elif isinstance(part, dict) and part['type'] == '*':
- var = part['name']
- if noreqs:
- if include_names:
- reg = '(?P<%s>.*)' % var + rest
- else:
- reg = '(?:.*)' + rest
- if not self.defaults.has_key(var):
- allblank = False
- noreqs = False
-
- elif allblank and self.defaults.has_key(var):
- if include_names:
- reg = '(?P<%s>.*)' % var + rest
- else:
- reg = '(?:.*)' + rest
- elif self.defaults.has_key(var):
- if include_names:
- reg = '(?P<%s>.*)' % var + rest
- else:
- reg = '(?:.*)' + rest
- elif include_names:
- reg = '(?P<%s>.*)' % var + rest
- else:
- reg = '(?:.*)' + rest
- allblank = False
- noreqs = False
- elif part and part[-1] in self.done_chars:
- if allblank:
- reg = re.escape(part[:-1]) + '(' + re.escape(part[-1]) + rest
- reg += ')?'
- else:
- allblank = False
- reg = re.escape(part) + rest
- else:
- noreqs = False
- allblank = False
- reg = re.escape(part) + rest
- return (reg, noreqs, allblank)
-
-
- def match(self, url, environ = None, sub_domains = False, sub_domains_ignore = None, domain_match = ''):
- if self.static:
- return False
- match = self.regmatch.match(url)
- if not match:
- return False
- sub_domain = None
- matchdict = match.groupdict()
- result = { }
- extras = self._default_keys - frozenset(matchdict.keys())
- for key, val in matchdict.iteritems():
- if key != 'path_info' and self.encoding:
-
- try:
- if val:
- pass
- val = val.decode(self.encoding, self.decode_errors)
- except UnicodeDecodeError:
- not sub_domain if self.conditions else sub_domain
- not sub_domain if self.conditions else sub_domain
- environ['REQUEST_METHOD'] not in self.conditions['method']
- return False
- None if sub_domains and environ and 'HTTP_HOST' in environ else self.static
-
-
- not sub_domain if self.conditions else sub_domain<EXCEPTION MATCH>UnicodeDecodeError
- if not val and key in self.defaults and self.defaults[key]:
- result[key] = self.defaults[key]
- continue
- not sub_domain if self.conditions else sub_domain
- result[key] = val
-
- for key in extras:
- result[key] = self.defaults[key]
-
- if self.conditions and 'function' in self.conditions and not self.conditions['function'](environ, result):
- return False
- return result
-
-
- def generate_non_minimized(self, kargs):
- for k in self.maxkeys - self.minkeys:
- if k not in kargs:
- return False
- if self.make_unicode(kargs[k]) != self.make_unicode(self.defaults[k]):
- return False
-
- for arg in self.minkeys:
- if arg not in kargs or kargs[arg] is None:
- if arg in self.dotkeys:
- kargs[arg] = ''
- else:
- return False
- arg in self.dotkeys
-
- for k in kargs:
- if k in self.maxkeys:
- if k in self.dotkeys:
- if kargs[k]:
- kargs[k] = url_quote('.' + kargs[k], self.encoding)
-
- else:
- kargs[k] = url_quote(kargs[k], self.encoding)
- k in self.dotkeys
-
- return self.regpath % kargs
-
-
- def generate_minimized(self, kargs):
- routelist = self.routebackwards
- urllist = []
- gaps = False
- for part in routelist:
- if isinstance(part, dict) and part['type'] in (':', '.'):
- arg = part['name']
- has_arg = kargs.has_key(arg)
- has_default = self.defaults.has_key(arg)
- if has_default and not has_arg and not gaps:
- continue
-
- if (has_default or has_arg) and self.make_unicode(kargs[arg]) == self.make_unicode(self.defaults[arg]) and not gaps:
- continue
-
- if has_arg and kargs[arg] is None and has_default and not gaps:
- continue
- elif has_arg:
- val = kargs[arg]
- elif has_default and self.defaults[arg] is not None:
- val = self.defaults[arg]
- elif part['type'] == '.':
- continue
- else:
- return False
- (self.defaults[arg] is not None).append(url_quote(val, self.encoding))
- if part['type'] == '.':
- urllist.append('.')
-
- if has_arg:
- del kargs[arg]
-
- gaps = True
- continue
- if isinstance(part, dict) and part['type'] == '*':
- arg = part['name']
- kar = kargs.get(arg)
- if kar is not None:
- urllist.append(url_quote(kar, self.encoding))
- gaps = True
-
- kar is not None
- if part and part[-1] in self.done_chars:
- if not gaps and part in self.done_chars:
- continue
- elif not gaps:
- urllist.append(part[:-1])
- gaps = True
- else:
- gaps = True
- urllist.append(part)
- part in self.done_chars
- gaps = True
- urllist.append(part)
-
- urllist.reverse()
- url = ''.join(urllist)
- return url
-
-
- def generate(self, _ignore_req_list = False, _append_slash = False, **kargs):
- if not _ignore_req_list:
- for key in self.reqs.keys():
- val = kargs.get(key)
- if val and not self.req_regs[key].match(self.make_unicode(val)):
- return False
-
-
- meth = kargs.get('method')
- if meth:
- if self.conditions and 'method' in self.conditions and meth.upper() not in self.conditions['method']:
- return False
- kargs.pop('method')
-
- if self.minimization:
- url = self.generate_minimized(kargs)
- else:
- url = self.generate_non_minimized(kargs)
- if url is False:
- return url
- if not url.startswith('/') and not (self.static):
- url = '/' + url
-
- extras = frozenset(kargs.keys()) - self.maxkeys
- if extras:
- if _append_slash and not url.endswith('/'):
- url += '/'
-
- fragments = []
- for key in kargs:
- if key not in extras:
- continue
-
- if key == 'action' or key == 'controller':
- continue
-
- val = kargs[key]
- if isinstance(val, (tuple, list)):
- for value in val:
- fragments.append((key, _str_encode(value, self.encoding)))
-
- fragments.append((key, _str_encode(val, self.encoding)))
-
- if fragments:
- url += '?'
- url += urllib.urlencode(fragments)
-
- elif _append_slash and not url.endswith('/'):
- url += '/'
-
- return url
-
-
-