Source code for eve_resource.event
# -*- coding: utf-8 -*-
from typing import Optional, Any, Callable, Dict
from eve import Eve
from .utils import callable_or_error, mongo_aliases, request_aliases
from .exceptions import NotCallable
AliasType = Dict[str, str]
EventFuncType = Callable[..., Any]
[docs]class Event(object):
"""Holds a function to register with an :class:`eve.Eve` instance as an
event hook.
This class acts as the function, when the :class:`eve.Eve` event hook is
fired, we check that the resource matches the :attr:`resource` for this
instance and if it does we call the :attr:`func` for this instance.
:param event: A string of the :class:`eve.Eve` event to register the
function for. This can also be a valid value in
:attr:`aliases`
:param resource: The :class:`eve.Eve` domain resource the function is for.
:param func: A callable that's called as the event hook.
:param aliases: A :class:`dict` with keys being strings of valid
convenience aliases a user can use to register an event, the
value for the key should be the valid :class:`eve.Eve` event.
.. seealso: `Eve Event Hooks
<http://python-eve.org/features.html#event-hooks>`_
"""
def __init__(self, event: str, resource: str,
func: Optional[EventFuncType]=None,
aliases: Optional[AliasType]=None) -> None:
self.aliases = aliases
self.event = self.parse_event(event)
self.resource = resource
self.func = callable_or_error(func) if func is not None else None
[docs] def parse_event(self, event: str) -> str:
"""Parses an event, returning a valid event that can be registered
with an ``Eve`` instance.
:param event: A string to check if it's valid. If no aliases are set
for a class, then this will just return the input event.
:raises ValueError: If :attr:`aliases` is not ``None`` and the event
is not a valid alias.
"""
if self.aliases is not None:
if event in self.aliases.keys():
return self.aliases[event]
elif event in self.aliases.values():
return event
else:
# make this a better error
raise ValueError(event)
return event
[docs] def set_func(self, func: EventFuncType) -> EventFuncType:
"""Set's the func for an instance, can be used as a decorator.
:param func: The func to set on the instance.
:raises NotCallable: If the func is not callable.
"""
self.func = callable_or_error(func)
return func
[docs] def register(self, app: Eve) -> None:
"""Register's an instance with an :class:`eve.Eve` instance.
:param app: The :class:`eve.Eve` instance to register the event with.
"""
if not isinstance(app, Eve):
raise TypeError(app)
attr = getattr(app, self.event, None)
if attr is not None:
attr += self
# else raise Error
def __call__(self, resource, *args, **kwargs) -> Any:
"""Call the :attr:`func` if the resource matches.
"""
if resource == self.resource:
try:
return callable_or_error(self.func)(*args, **kwargs)
except NotCallable:
pass
def __repr__(self) -> str:
return (
"{n}('{e}', '{r}', func={f}, aliases={a})".format(
n=self.__class__.__name__,
e=self.event,
r=self.resource,
f=self.func,
a=self.aliases
)
)
[docs]def mongo_event(event: str, resource: str, func: Optional[EventFuncType]=None
) -> Event:
"""A function to return an :class:`Event` with aliases set-up for mongo
events.
The following aliases can be used for mongo events::
+----------+--------------+
| Alias | Eve Event |
+==========+==============+
| insert | on_insert |
+----------+--------------+
| inserted | on_inserted |
+----------+--------------+
| fetch | on_fetch |
+----------+--------------+
| fetched | on_fetched |
+----------+--------------+
| replace | on_replace |
+----------+--------------+
| replaced | on_replaced |
+----------+--------------+
| update | on_update |
+----------+--------------+
| updated | on_updated |
+----------+--------------+
| delete | on_deleted |
+----------+--------------+
"""
return Event(event, resource, func, mongo_aliases())
[docs]def request_event(event: str, resource: str, func: Optional[EventFuncType]=None
) -> Event:
"""A function to return an :class:`Event` with aliases set-up for request
events.
The following aliases can be used for request events::
+--------------+-----------------+
| Alias | Eve Event |
+==============+=================+
| pre_GET | on_pre_GET |
+--------------+-----------------+
| post_GET | on_post_GET |
+--------------+-----------------+
| pre_PUT | on_pre_PUT |
+--------------+-----------------+
| post_PUT | on_post_PUT |
+--------------+-----------------+
| pre_PATCH | on_pre_PATCH |
+--------------+-----------------+
| post_PATCH | on_post_PATCH |
+--------------+-----------------+
| pre_POST | on_pre_POST |
+--------------+-----------------+
| post_POST | on_post_POST |
+--------------+-----------------+
| pre_DELETE | on_pre_DELETE |
+--------------+-----------------+
| post_DELETE | on_post_DELETE |
+--------------+-----------------+
"""
return Event(event, resource, func, request_aliases())