/hummingbot/core/event/event_logger.pyx

https://github.com/CoinAlpha/hummingbot · Cython · 57 lines · 43 code · 13 blank · 1 comment · 7 complexity · 7df04db947a65dcad06175e21c1319fb MD5 · raw file

  1. #!/usr/bin/env python
  2. import asyncio
  3. from async_timeout import timeout
  4. from typing import (
  5. List,
  6. Optional,
  7. )
  8. from hummingbot.core.event.event_listener cimport EventListener
  9. cdef class EventLogger(EventListener):
  10. def __init__(self, event_source: Optional[str] = None):
  11. super().__init__()
  12. self._event_source = event_source
  13. self._logged_events = []
  14. self._waiting = {}
  15. self._wait_returns = {}
  16. @property
  17. def event_log(self) -> List[any]:
  18. return self._logged_events.copy()
  19. @property
  20. def event_source(self) -> str:
  21. return self._event_source
  22. def clear(self):
  23. self._logged_events.clear()
  24. async def wait_for(self, event_type, timeout_seconds: float = 180):
  25. notifier = asyncio.Event()
  26. self._waiting[notifier] = event_type
  27. async with timeout(timeout_seconds):
  28. await notifier.wait()
  29. retval = self._wait_returns.get(notifier)
  30. if notifier in self._wait_returns:
  31. del self._wait_returns[notifier]
  32. return retval
  33. def __call__(self, event_object):
  34. self.c_call(event_object)
  35. cdef c_call(self, object event_object):
  36. self._logged_events.append(event_object)
  37. event_object_type = type(event_object)
  38. should_notify = []
  39. for notifier, waiting_event_type in self._waiting.items():
  40. if event_object_type is waiting_event_type:
  41. should_notify.append(notifier)
  42. self._wait_returns[notifier] = event_object
  43. for notifier in should_notify:
  44. notifier.set()