[config] Implements a "requires()" service injection decorator for functions (api may change).
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
from bonobo.config.configurables import Configurable
|
from bonobo.config.configurables import Configurable
|
||||||
from bonobo.config.options import Option, Method
|
from bonobo.config.options import Method, Option
|
||||||
from bonobo.config.processors import ContextProcessor
|
from bonobo.config.processors import ContextProcessor
|
||||||
from bonobo.config.services import Container, Service, Exclusive
|
from bonobo.config.services import Container, Exclusive, Service, requires
|
||||||
|
|
||||||
# bonobo.config public programming interface
|
# bonobo.config public programming interface
|
||||||
__all__ = [
|
__all__ = [
|
||||||
@ -12,4 +12,5 @@ __all__ = [
|
|||||||
'Method',
|
'Method',
|
||||||
'Option',
|
'Option',
|
||||||
'Service',
|
'Service',
|
||||||
|
'requires',
|
||||||
]
|
]
|
||||||
|
|||||||
@ -56,7 +56,11 @@ class Service(Option):
|
|||||||
inst.__options_values__[self.name] = validate_service_name(value)
|
inst.__options_values__[self.name] = validate_service_name(value)
|
||||||
|
|
||||||
def resolve(self, inst, services):
|
def resolve(self, inst, services):
|
||||||
return services.get(getattr(inst, self.name))
|
try:
|
||||||
|
name = getattr(inst, self.name)
|
||||||
|
except AttributeError:
|
||||||
|
name = self.name
|
||||||
|
return services.get(name)
|
||||||
|
|
||||||
|
|
||||||
class Container(dict):
|
class Container(dict):
|
||||||
@ -126,3 +130,19 @@ class Exclusive(ContextDecorator):
|
|||||||
|
|
||||||
def __exit__(self, *exc):
|
def __exit__(self, *exc):
|
||||||
self.get_lock().release()
|
self.get_lock().release()
|
||||||
|
|
||||||
|
|
||||||
|
def requires(*service_names):
|
||||||
|
def decorate(mixed):
|
||||||
|
try:
|
||||||
|
options = mixed.__options__
|
||||||
|
except AttributeError:
|
||||||
|
mixed.__options__ = options = {}
|
||||||
|
|
||||||
|
for service_name in service_names:
|
||||||
|
service = Service(service_name)
|
||||||
|
service.name = service_name
|
||||||
|
options[service_name] = service
|
||||||
|
return mixed
|
||||||
|
|
||||||
|
return decorate
|
||||||
|
|||||||
Reference in New Issue
Block a user