Source code for autowire.context

"""
autowire.context.impl
=====================

Context's implementations

"""
from autowire.base import BaseContext, BaseResource, Implementation

from .provider import Provider, ImplementationConsumer
from .root import root_context


[docs]class Context(BaseContext, ImplementationConsumer): """ Context implementation. """ def __init__(self, parent: BaseContext=root_context): self.parent = parent self.implementations = {}
[docs] def get_implementation(self, resource: BaseResource): """Get resource implementation from this context.""" return self.implementations[resource.canonical_name]
[docs] def provided_by(self, resource: BaseResource): """Find context that provides resource.""" if resource.canonical_name in self.implementations: return self elif self.parent is not None: return self.parent.provided_by(resource)
[docs] def set_implementation(self, resource: BaseResource, implementation: Implementation): self.implementations[resource.canonical_name] = implementation
[docs] def provide(self, resource: BaseResource, implementation: Implementation=None): """ Provide an implementaion for resource in this context. :: context.provide(resource, implementation) Or as a decorator :: @context.provide(resource) @impl.autowired('dependency1', dependency1) @impl.autowired('dependency2', dependency2) @impl.contextmanager def create_resource(dependency1, dependency2): yield dependency1.make_resource(dependency2) """ if implementation is not None: return self.set_implementation(resource, implementation) return Provider(resource, self)
__all__ = ['Context', 'root_context']