Source code for thriftpool.utils.mixin
from __future__ import absolute_import
import inspect
from thriftworker.utils.decorators import cached_property
from thriftworker.utils.imports import symbol_by_name
from thriftpool.app._state import current_app
[docs]def rgetattr(obj, path):
"""Get nested attribute from object.
:param obj: object
:param path: path to attribute
"""
return reduce(getattr, [obj] + path.split('.'))
def _unpickle(name, args):
"""Given an attribute name and a list of args, gets
the attribute from the current app and calls it.
"""
return rgetattr(current_app, name)(*args)
[docs]class SubclassMixin(object):
[docs] def subclass_with_self(self, Class, name=None, attribute='app',
reverse=None, **kw):
"""Subclass an app-compatible class by setting its app attribute
to be this app instance.
App-compatible means that the class has a class attribute that
provides the default app it should use, e.g.
``class Foo: app = None``.
:param Class: The app-compatible class to subclass.
:keyword name: Custom name for the target class.
:keyword attribute: Name of the attribute holding the app,
default is 'app'.
"""
Class = symbol_by_name(Class)
reverse = reverse if reverse else Class.__name__
has_reduce_args = getattr(Class, '__reduce_args__', None) is not None
def __reduce__(self):
args = self.__reduce_args__() if has_reduce_args else []
return (_unpickle, (Class.__name__, args))
attrs = dict({attribute: self},
__module__=Class.__module__,
__doc__=Class.__doc__,
__reduce__=__reduce__,
**kw)
return type(name or Class.__name__, (Class,), attrs)
[docs]class LogsMixin(object):
"""Simple helper for logging."""
@cached_property
def _logger(self):
module = inspect.getmodule(self.__class__)
return getattr(module, 'logger')
def _exception(self, exc):
self._logger.exception(exc)
def _critical(self, msg, *args, **kwargs):
self._logger.critical(msg, *args, **kwargs)
def _error(self, msg, *args, **kwargs):
self._logger.error(msg, *args, **kwargs)
def _info(self, msg, *args, **kwargs):
self._logger.info(msg, *args, **kwargs)
def _debug(self, msg, *args, **kwargs):
self._logger.debug(msg, *args, **kwargs)