Source code for lollipop.type_registry

from lollipop.types import Type


__all__ = [
    'TypeRegistry',
]


class TypeRef(Type):
    def __init__(self, get_type):
        super(TypeRef, self).__init__()
        self._get_type = get_type
        self._inner_type = None

    @property
    def inner_type(self):
        if self._inner_type is None:
            self._inner_type = self._get_type()
        return self._inner_type

    def load(self, *args, **kwargs):
        return self.inner_type.load(*args, **kwargs)

    def dump(self, *args, **kwargs):
        return self.inner_type.dump(*args, **kwargs)

    def __hasattr__(self, name):
        return hasattr(self.inner_type, name)

    def __getattr__(self, name):
        return getattr(self.inner_type, name)


[docs]class TypeRegistry(object): """Storage for type instances with ability to get type instance proxy with delayed type resolution for implementing mutual cross-references. Example: :: TYPES = TypeRegistry() PersonType = TYPES.add('Person', lt.Object({ 'name': lt.String(), 'books': lt.List(lt.Object(TYPES['Book'], exclude='author')), }, constructor=Person)) BookType = TYPES.add('Book', lt.Object({ 'title': lt.String(), 'author': lt.Object(TYPES['Person'], exclude='books'), }, constructor=Book)) """ def __init__(self): super(TypeRegistry, self).__init__() self._types = {} def add(self, name, a_type): if name in self._types: raise ValueError('Type with name "%s" is already registered' % name) self._types[name] = a_type return a_type def _get(self, name): if name not in self._types: raise KeyError('Type with name "%s" is not registered' % name) return self._types[name] def get(self, name): return TypeRef(lambda: self._get(name)) def __getitem__(self, key): return self.get(key)