utils.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. """
  2. Not currently being used due to some grossness with the way that the v2 SDK methods were structured, but
  3. we can return to this once we remove v2 SDK methods.
  4. """
  5. import asyncio
  6. import functools
  7. import inspect
  8. from typing import Any, Callable
  9. def sync_wrapper(async_func: Callable) -> Callable:
  10. if inspect.isasyncgenfunction(async_func):
  11. @functools.wraps(async_func)
  12. def generator_wrapper(*args: Any, **kwargs: Any) -> Any:
  13. async_gen = async_func(*args, **kwargs)
  14. loop = asyncio.new_event_loop()
  15. asyncio.set_event_loop(loop)
  16. def sync_gen():
  17. try:
  18. while True:
  19. yield loop.run_until_complete(async_gen.__anext__())
  20. except StopAsyncIteration:
  21. pass
  22. finally:
  23. loop.close()
  24. return sync_gen()
  25. return generator_wrapper
  26. else:
  27. @functools.wraps(async_func)
  28. def wrapper(*args: Any, **kwargs: Any) -> Any:
  29. try:
  30. loop = asyncio.get_running_loop()
  31. except RuntimeError:
  32. loop = asyncio.new_event_loop()
  33. asyncio.set_event_loop(loop)
  34. return loop.run_until_complete(async_func(*args, **kwargs))
  35. else:
  36. import threading
  37. def run_in_new_loop(loop, coro):
  38. asyncio.set_event_loop(loop)
  39. return loop.run_until_complete(coro)
  40. new_loop = asyncio.new_event_loop()
  41. return loop.run_in_executor(
  42. None,
  43. run_in_new_loop,
  44. new_loop,
  45. async_func(*args, **kwargs),
  46. )
  47. return wrapper
  48. class SyncClientMetaclass(type):
  49. def __new__(cls, name, bases, dct):
  50. for attr_name, attr_value in dct.items():
  51. if asyncio.iscoroutinefunction(attr_value):
  52. dct[attr_name] = sync_wrapper(attr_value)
  53. for base in bases:
  54. for attr_name in dir(base):
  55. attr_value = getattr(base, attr_name)
  56. if asyncio.iscoroutinefunction(attr_value):
  57. dct[attr_name] = sync_wrapper(attr_value)
  58. return super().__new__(cls, name, bases, dct)