Source code for wheezy.routing.utils

""" ``utils`` module.
"""

import re


RE_STRIP_NAME = re.compile(r'(Handler|Controller|Page|View)$')
RE_CAMELCASE_TO_UNDERSCOPE_1 = re.compile('(.)([A-Z][a-z]+)')
RE_CAMELCASE_TO_UNDERSCOPE_2 = re.compile('([a-z0-9])([A-Z])')


def route_name(handler):
[docs] """ Return a name for the given handler. ``handler`` can be an object, class or callable. >>> class Login: pass >>> route_name(Login) 'login' >>> l = Login() >>> route_name(l) 'login' """ try: name = handler.__name__ except AttributeError: name = handler.__class__.__name__ return camelcase_to_underscore(strip_name(name)) def strip_name(s):
[docs] """ Strips the name per RE_STRIP_NAME regex. >>> strip_name('Login') 'Login' >>> strip_name('LoginHandler') 'Login' >>> strip_name('LoginController') 'Login' >>> strip_name('LoginPage') 'Login' >>> strip_name('LoginView') 'Login' >>> strip_name('LoginHandler2') 'LoginHandler2' """ return RE_STRIP_NAME.sub('', s) def camelcase_to_underscore(s):
[docs] """ Convert CamelCase to camel_case. >>> camelcase_to_underscore('MainPage') 'main_page' >>> camelcase_to_underscore('Login') 'login' """ s = RE_CAMELCASE_TO_UNDERSCOPE_1.sub(r'\1_\2', s) return RE_CAMELCASE_TO_UNDERSCOPE_2.sub(r'\1_\2', s).lower() def outer_split(expression, sep='()'):
[docs] """ Splits given ``expression`` by outer most separators. >>> outer_split('123') ['123'] >>> outer_split('123(45(67)89)123(45)67') ['123', '45(67)89', '123', '45', '67'] If expression is not balanced raises ``ValueError``. >>> outer_split('123(') # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: ... """ assert 2 == len(sep) start_sep, end_sep = sep start_count = end_count = 0 parts = [] part = '' for token in expression: if token == start_sep: if start_count == end_count: parts.append(part) part = '' start_count += 1 continue start_count += 1 elif token == end_sep: end_count += 1 if start_count == end_count: parts.append(part) part = '' continue part += token if start_count != end_count: raise ValueError('Expression is not balanced') parts.append(part) return parts