Source code for mainline.provider

import functools

from mainline.exceptions import UnprovidableError
from mainline.scope import ScopeRegistry, NoneScope
_sentinel = object()


[docs]class IProvider(object): def __init__(self): pass def __call__(self, *args, **kwargs): return self.provide(*args, **kwargs)
[docs] def provide(self, *args, **kwargs): raise NotImplementedError
[docs] def has_instance(self): raise NotImplementedError
[docs] def set_instance(self, instance): raise NotImplementedError
@property def providable(self): raise NotImplementedError
[docs]class IFactoryProvider(IProvider): def __init__(self, factory=None): self.set_factory(factory)
[docs] def set_factory(self, factory): self.factory = factory
[docs] def has_factory(self): return bool(self.factory)
[docs] def provide(self, *args, **kwargs): if not self.providable: raise UnprovidableError(self) return self.factory(*args, **kwargs)
[docs] def has_instance(self): return False
@property def providable(self): return self.has_instance() or self.has_factory()
[docs]class Provider(IFactoryProvider): scopes = ScopeRegistry() def __init__(self, factory, scope=NoneScope, key=''): self.key = key self.scope = self.scopes.resolve(scope) super(Provider, self).__init__(factory) def __repr__(self): return '<%s factory=%s scope=%s>' % (self.__class__.__name__, self.factory, self.scope)
[docs] def provide(self, *args, **kwargs): if self.has_instance(): return self.scope[self.key] instance = super(Provider, self).provide(*args, **kwargs) self.set_instance(instance) return instance
[docs] def has_instance(self): return self.key in self.scope
[docs] def set_instance(self, instance): self.scope[self.key] = instance
[docs]def provider_factory(factory=_sentinel, scope=NoneScope): ''' Decorator to create a provider using the given factory, and scope. Can also be used in a non-decorator manner. :param scope: Scope key, factory, or instance :type scope: object or callable :return: decorator :rtype: decorator ''' if factory is _sentinel: return functools.partial(provider_factory, scope=scope) provider = Provider(factory, scope) return provider