Source code for autowire.helpers

"""
autowire.helpers
================

Helpers.

"""
import contextlib

from .base import BaseContext, BaseResource, Implementation
from .utils import RefCounter


[docs]class SharedImplementation(Implementation): """ Share implementation in each contexts. See :func:`~autowire.decorators.shared` for more details. """ def __init__(self, impl: Implementation): super().__init__() self.impl = impl self.counters = {} @contextlib.contextmanager
[docs] def reify(self, resource: BaseResource, context: BaseContext): if context not in self.counters: context_manager = self.impl.reify(resource, context) self.counters[context] = RefCounter(context_manager) counter = self.counters[context] try: with counter as value: yield value finally: if counter.count == 0: del self.counters[context]
[docs]class GloballySharedImplementation(Implementation): """ Share implementation in providing context. See :func:`~autowire.decorators.shared` for more details. """ def __init__(self, impl: Implementation): super().__init__() self.impl = impl self.counter = None @contextlib.contextmanager
[docs] def reify(self, resource: BaseResource, context: BaseContext): if self.counter is None: provider = context.provided_by(resource) # Find me self.counter = RefCounter(self.impl.reify(resource, provider)) try: with self.counter as value: yield value finally: if self.counter.count == 0: self.counter = None