Source code for autowire.utils
"""
autowire.utils
==============
Common utilities.
"""
import contextlib
import functools
[docs]class RefCounter(object):
"""Preserve context until it has any references."""
def __init__(self, contextmanager):
super().__init__()
self.count = 0
self.contextmanager = contextmanager
self.value = None
[docs] def increase(self):
self.count += 1
if self.count == 1:
self.value = self.contextmanager.__enter__()
[docs] def decrease(self, exc_type, exc_value, tb):
if self.count == 1:
self.value = 0
self.contextmanager.__exit__(exc_type, exc_value, tb)
self.count -= 1
def __enter__(self):
self.increase()
return self.value
def __exit__(self, exc_type, exc_value, tb):
self.decrease(exc_type, exc_value, tb)
[docs]def as_contextmanager(fn):
"""
Convert to context manager. ::
@as_contextmanager
def foo(name):
return 'Hello, {}'.format(name)
is equivalent to ::
@contextlib.contextmanager
def foo(name):
yield 'Hello, {}'.format(name)
"""
@functools.wraps(fn)
@contextlib.contextmanager
def wrapper(*args, **kwargs):
yield fn(*args, **kwargs)
return wrapper