Source code for wheezy.routing.curly

""" ``curly`` module.
"""

import re

from wheezy.routing.regex import RegexRoute
from wheezy.routing.utils import outer_split


RE_SPLIT = re.compile('(?P<n>\{[\w:]+.*?\})')


def try_build_curly_route(pattern, finishing=True, kwargs=None, name=None):
[docs] """ Convert pattern expression into regex with named groups and create regex route. """ if isinstance(pattern, RegexRoute): return pattern if RE_SPLIT.search(pattern): return RegexRoute(convert(pattern), finishing, kwargs, name) return None patterns = {
# one or more digits 'i': r'\d+', 'int': r'\d+', 'number': r'\d+', 'digits': r'\d+', # one or more word characters 'w': r'\w+', 'word': r'\w+', # everything until ``/`` 's': r'[^/]+', 'segment': r'[^/]+', 'part': r'[^/]+', # any '*': r'.+', 'a': r'.+', 'any': r'.+', 'rest': r'.+' } default_pattern = 's' def convert(s):
[docs] """ Convert curly expression into regex with named groups. """ parts = outer_split(s, sep='[]') parts[1::2] = ['(%s)?' % p for p in map(convert, parts[1::2])] parts[::2] = map(convert_single, parts[::2]) return ''.join(parts) def convert_single(s):
[docs] """ Convert curly expression into regex with named groups. """ parts = RE_SPLIT.split(s) return ''.join(map(replace, parts)) def replace(val):
[docs] """ Replace ``{group_name:pattern_name}`` by regex with named groups. """ if val.startswith('{') and val.endswith('}'): group_name, pattern_name = parse(val[1:-1]) pattern = patterns.get(pattern_name, pattern_name) return '(?P<%s>%s)' % (group_name, pattern) return val def parse(s):
[docs] """ Parse ``s`` according to ``group_name:pattern_name``. There is just ``group_name``, return default ``pattern_name``. """ if ':' in s: return tuple(s.split(':', 1)) return s, default_pattern