Source code for precept._services
import functools
import stringcase
from .events import EventDispatcher
def _dispatch_wrap(func, event, running):
@functools.wraps(func)
async def dispatcher(self, *args, **kwargs):
self.running = running
payload = await func(self, *args, **kwargs)
await self.events.dispatch(event, instance=self)
return payload
return dispatcher
class ServiceMeta(type):
def __new__(mcs, name, bases, attributes):
_new = dict(**attributes)
_name = attributes.get('name') or stringcase.snakecase(name)
_new['name'] = _name
for _method, _running in (
('setup', False), ('start', True), ('stop', False)
):
_func = attributes.get(_method)
if _func:
_new[_method] = _dispatch_wrap(
_func, f'{_name}_{_method}', _running
)
return type.__new__(mcs, name, bases, _new)
[docs]class Service(metaclass=ServiceMeta):
"""
Service's runs alongside the main application.
Communicate via events.
:Events:
- ``{name}_setup`` when added to services.
- ``{name}_start`` after calling start.
- ``{name}_stop`` after calling stop.
"""
name: str = None
[docs] def __init__(self, events: EventDispatcher = None):
self.events = events or EventDispatcher()
self.running: bool = False
self.ready: bool = False
[docs] async def setup(self, application): # pragma: no cover
"""
Called when added to services.
Use this to set events and other post initialization that may need
the application instance.
:param application: Precept application
:type application: precept.Precept
:return:
"""
raise NotImplementedError
[docs] async def start(self): # pragma: no cover
"""
Start the service.
:return:
"""
raise NotImplementedError
[docs] async def stop(self): # pragma: no cover
"""
Stop the service.
:return:
"""
raise NotImplementedError