Source code for wheezy.routing.utils
""" ``utils`` module.
"""
import re
RE_STRIP_NAME = re.compile(r'(Handler|Controller)$')
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'
"""
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('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 merge(d1, d2):
[docs] """ Update ``d1`` from ``d2`` only if a value in ``d2``
is evaluated to boolean True.
>>> d1 = dict(a=1,b=None,c=2)
>>> d2 = dict(a=None,b=2,c=1)
>>> merge(d1, d2)
{'a': 1, 'c': 1, 'b': 2}
"""
d1.update(((k, v) for k, v in d2.iteritems() if v))
return d1