Module cachein.forward

Expand source code
from .member import Cached

class Forward(Cached):
    '''
    A caching delegate.  This brings a member or method into the containing
    instance lazily when accessed.
    
    >>> import cachein
    >>> class Greeter(object):
    ...     def __init__(self, recipient):
    ...         self.recipient = recipient
    ...
    ...     def greet(self):
    ...         return 'Hello, %s' % self.recipient
    
    >>> class Helper(object):
    ...     def __init__(self, greeter):
    ...         self.greeter = greeter
    ...
    ...     greet = recipient = Forward('greeter')

    >>> helper = Helper(Greeter('world'))
    >>> helper.greet()
    'Hello, world'
    >>> helper.recipient
    'world'
    
    >>> class RecipientHelper(object):
    ...     def __init__(self, recipient='world', greetercls=Greeter):
    ...         self.recipient = recipient
    ...         self.greetercls = greetercls
    ...
    ...     @cachein.Cached()
    ...     def greeter(self):
    ...         return self.greetercls(self.recipient)
    ...     greet = Forward(greeter)
    ...     who = Forward(greeter, 'recipient')

    >>> RecipientHelper().greet()
    'Hello, world'
    >>> RecipientHelper('everyone').greet()
    'Hello, everyone'
    >>> RecipientHelper('everyone').who
    'everyone'

    >>> @Forward.compose('greeter', 'greet', who='recipient')
    ... class ComposedHelper(object):
    ...     def __init__(self, greeter):
    ...         self.greeter = greeter
    
    >>> ComposedHelper(Greeter('world')).greet()
    'Hello, world'
    >>> ComposedHelper(Greeter('world')).who
    'world'
    
    >>> anyGreeter = Forward.composer('greet', who='recipient')
    >>> @anyGreeter.greeter('recipient', 'recipient', who=False)
    ... class AnyGreeterHelper(object):
    ...     def __init__(self, greeter):
    ...         self.greeter = greeter
    >>> AnyGreeterHelper(Greeter('world')).greet()
    'Hello, world'
    >>> AnyGreeterHelper(Greeter('world')).recipient
    'world'
    '''
    
    def __init__(self, source, attr=None, **_kw):
        super().__init__(source=source, attr=attr, **_kw)
        
    def init(self, source, attr, **_kw):
        super().init(**_kw)
        self.source = source
        self.attr = attr

    def getter(self):
        source = getattr(self.source, '__cachein_delegate_attr__', self.source)
            
        def delegate_getter(self, target, cls=None, name=self.name,
                            source=source, attr=self.attr or self.name):
            if target is None:
                return self     # (NO-COV-DT)
            else:
                obj = getattr(getattr(target, source), attr)
                target.__dict__[name] = obj
                return obj
        return delegate_getter

    @classmethod
    def compose(_cls, _source, *_args, **_kw):
        def decorator(cls):
            for arg in _args:
                if _kw.get(arg, True):
                    setattr(cls, arg, _cls(_source, arg, name=arg))
            for dest, attr in _kw.items():
                if attr:
                    setattr(cls, dest, _cls(_source, attr, name=dest))
            return cls                
        return decorator

    @classmethod
    def composer(_cls, *_args, **_kw):
        return _cls.Composer(_cls, _args, _kw)

    class Composer(object):
        def __init__(self, cls, args, kw):
            self.__cls = cls
            self.__args = args
            self.__kw = kw
            
        def __getattr__(self, name):
            return lambda *_a, **_kw: self.compose(name, *_a, **_kw)
            
        def compose(_self, _source, *_args, **_kw):
            args = _self.__args + _args
            kw = dict(_self.__kw, **_kw)
            return _self.__cls.compose(_source, *args, **kw)

Classes

class Forward (source, attr=None, **_kw)

A caching delegate. This brings a member or method into the containing instance lazily when accessed.

>>> import cachein
>>> class Greeter(object):
...     def __init__(self, recipient):
...         self.recipient = recipient
...
...     def greet(self):
...         return 'Hello, %s' % self.recipient
>>> class Helper(object):
...     def __init__(self, greeter):
...         self.greeter = greeter
...
...     greet = recipient = Forward('greeter')
>>> helper = Helper(Greeter('world'))
>>> helper.greet()
'Hello, world'
>>> helper.recipient
'world'
>>> class RecipientHelper(object):
...     def __init__(self, recipient='world', greetercls=Greeter):
...         self.recipient = recipient
...         self.greetercls = greetercls
...
...     @cachein.Cached()
...     def greeter(self):
...         return self.greetercls(self.recipient)
...     greet = Forward(greeter)
...     who = Forward(greeter, 'recipient')
>>> RecipientHelper().greet()
'Hello, world'
>>> RecipientHelper('everyone').greet()
'Hello, everyone'
>>> RecipientHelper('everyone').who
'everyone'
>>> @Forward.compose('greeter', 'greet', who='recipient')
... class ComposedHelper(object):
...     def __init__(self, greeter):
...         self.greeter = greeter
>>> ComposedHelper(Greeter('world')).greet()
'Hello, world'
>>> ComposedHelper(Greeter('world')).who
'world'
>>> anyGreeter = Forward.composer('greet', who='recipient')
>>> @anyGreeter.greeter('recipient', 'recipient', who=False)
... class AnyGreeterHelper(object):
...     def __init__(self, greeter):
...         self.greeter = greeter
>>> AnyGreeterHelper(Greeter('world')).greet()
'Hello, world'
>>> AnyGreeterHelper(Greeter('world')).recipient
'world'
Expand source code
class Forward(Cached):
    '''
    A caching delegate.  This brings a member or method into the containing
    instance lazily when accessed.
    
    >>> import cachein
    >>> class Greeter(object):
    ...     def __init__(self, recipient):
    ...         self.recipient = recipient
    ...
    ...     def greet(self):
    ...         return 'Hello, %s' % self.recipient
    
    >>> class Helper(object):
    ...     def __init__(self, greeter):
    ...         self.greeter = greeter
    ...
    ...     greet = recipient = Forward('greeter')

    >>> helper = Helper(Greeter('world'))
    >>> helper.greet()
    'Hello, world'
    >>> helper.recipient
    'world'
    
    >>> class RecipientHelper(object):
    ...     def __init__(self, recipient='world', greetercls=Greeter):
    ...         self.recipient = recipient
    ...         self.greetercls = greetercls
    ...
    ...     @cachein.Cached()
    ...     def greeter(self):
    ...         return self.greetercls(self.recipient)
    ...     greet = Forward(greeter)
    ...     who = Forward(greeter, 'recipient')

    >>> RecipientHelper().greet()
    'Hello, world'
    >>> RecipientHelper('everyone').greet()
    'Hello, everyone'
    >>> RecipientHelper('everyone').who
    'everyone'

    >>> @Forward.compose('greeter', 'greet', who='recipient')
    ... class ComposedHelper(object):
    ...     def __init__(self, greeter):
    ...         self.greeter = greeter
    
    >>> ComposedHelper(Greeter('world')).greet()
    'Hello, world'
    >>> ComposedHelper(Greeter('world')).who
    'world'
    
    >>> anyGreeter = Forward.composer('greet', who='recipient')
    >>> @anyGreeter.greeter('recipient', 'recipient', who=False)
    ... class AnyGreeterHelper(object):
    ...     def __init__(self, greeter):
    ...         self.greeter = greeter
    >>> AnyGreeterHelper(Greeter('world')).greet()
    'Hello, world'
    >>> AnyGreeterHelper(Greeter('world')).recipient
    'world'
    '''
    
    def __init__(self, source, attr=None, **_kw):
        super().__init__(source=source, attr=attr, **_kw)
        
    def init(self, source, attr, **_kw):
        super().init(**_kw)
        self.source = source
        self.attr = attr

    def getter(self):
        source = getattr(self.source, '__cachein_delegate_attr__', self.source)
            
        def delegate_getter(self, target, cls=None, name=self.name,
                            source=source, attr=self.attr or self.name):
            if target is None:
                return self     # (NO-COV-DT)
            else:
                obj = getattr(getattr(target, source), attr)
                target.__dict__[name] = obj
                return obj
        return delegate_getter

    @classmethod
    def compose(_cls, _source, *_args, **_kw):
        def decorator(cls):
            for arg in _args:
                if _kw.get(arg, True):
                    setattr(cls, arg, _cls(_source, arg, name=arg))
            for dest, attr in _kw.items():
                if attr:
                    setattr(cls, dest, _cls(_source, attr, name=dest))
            return cls                
        return decorator

    @classmethod
    def composer(_cls, *_args, **_kw):
        return _cls.Composer(_cls, _args, _kw)

    class Composer(object):
        def __init__(self, cls, args, kw):
            self.__cls = cls
            self.__args = args
            self.__kw = kw
            
        def __getattr__(self, name):
            return lambda *_a, **_kw: self.compose(name, *_a, **_kw)
            
        def compose(_self, _source, *_args, **_kw):
            args = _self.__args + _args
            kw = dict(_self.__kw, **_kw)
            return _self.__cls.compose(_source, *args, **kw)

Ancestors

Class variables

var Composer

Static methods

def compose(_source, *_args, **_kw)
Expand source code
@classmethod
def compose(_cls, _source, *_args, **_kw):
    def decorator(cls):
        for arg in _args:
            if _kw.get(arg, True):
                setattr(cls, arg, _cls(_source, arg, name=arg))
        for dest, attr in _kw.items():
            if attr:
                setattr(cls, dest, _cls(_source, attr, name=dest))
        return cls                
    return decorator
def composer(*_args, **_kw)
Expand source code
@classmethod
def composer(_cls, *_args, **_kw):
    return _cls.Composer(_cls, _args, _kw)

Methods

def getter(self)
Expand source code
def getter(self):
    source = getattr(self.source, '__cachein_delegate_attr__', self.source)
        
    def delegate_getter(self, target, cls=None, name=self.name,
                        source=source, attr=self.attr or self.name):
        if target is None:
            return self     # (NO-COV-DT)
        else:
            obj = getattr(getattr(target, source), attr)
            target.__dict__[name] = obj
            return obj
    return delegate_getter
def init(self, source, attr, **_kw)
Expand source code
def init(self, source, attr, **_kw):
    super().init(**_kw)
    self.source = source
    self.attr = attr