ez-a-sync 0.32.29__cp310-cp310-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ez-a-sync might be problematic. Click here for more details.

Files changed (177) hide show
  1. a_sync/ENVIRONMENT_VARIABLES.py +42 -0
  2. a_sync/__init__.pxd +2 -0
  3. a_sync/__init__.py +145 -0
  4. a_sync/_smart.c +22803 -0
  5. a_sync/_smart.cp310-win32.pyd +0 -0
  6. a_sync/_smart.pxd +2 -0
  7. a_sync/_smart.pyi +202 -0
  8. a_sync/_smart.pyx +674 -0
  9. a_sync/_typing.py +258 -0
  10. a_sync/a_sync/__init__.py +60 -0
  11. a_sync/a_sync/_descriptor.c +20528 -0
  12. a_sync/a_sync/_descriptor.cp310-win32.pyd +0 -0
  13. a_sync/a_sync/_descriptor.pyi +33 -0
  14. a_sync/a_sync/_descriptor.pyx +422 -0
  15. a_sync/a_sync/_flags.c +6074 -0
  16. a_sync/a_sync/_flags.cp310-win32.pyd +0 -0
  17. a_sync/a_sync/_flags.pxd +3 -0
  18. a_sync/a_sync/_flags.pyx +92 -0
  19. a_sync/a_sync/_helpers.c +14521 -0
  20. a_sync/a_sync/_helpers.cp310-win32.pyd +0 -0
  21. a_sync/a_sync/_helpers.pxd +3 -0
  22. a_sync/a_sync/_helpers.pyi +10 -0
  23. a_sync/a_sync/_helpers.pyx +167 -0
  24. a_sync/a_sync/_kwargs.c +12194 -0
  25. a_sync/a_sync/_kwargs.cp310-win32.pyd +0 -0
  26. a_sync/a_sync/_kwargs.pxd +2 -0
  27. a_sync/a_sync/_kwargs.pyx +64 -0
  28. a_sync/a_sync/_meta.py +210 -0
  29. a_sync/a_sync/abstract.c +12411 -0
  30. a_sync/a_sync/abstract.cp310-win32.pyd +0 -0
  31. a_sync/a_sync/abstract.pyi +141 -0
  32. a_sync/a_sync/abstract.pyx +221 -0
  33. a_sync/a_sync/base.c +14932 -0
  34. a_sync/a_sync/base.cp310-win32.pyd +0 -0
  35. a_sync/a_sync/base.pyi +60 -0
  36. a_sync/a_sync/base.pyx +271 -0
  37. a_sync/a_sync/config.py +168 -0
  38. a_sync/a_sync/decorator.py +651 -0
  39. a_sync/a_sync/flags.c +5272 -0
  40. a_sync/a_sync/flags.cp310-win32.pyd +0 -0
  41. a_sync/a_sync/flags.pxd +72 -0
  42. a_sync/a_sync/flags.pyi +74 -0
  43. a_sync/a_sync/flags.pyx +72 -0
  44. a_sync/a_sync/function.c +37846 -0
  45. a_sync/a_sync/function.cp310-win32.pyd +0 -0
  46. a_sync/a_sync/function.pxd +28 -0
  47. a_sync/a_sync/function.pyi +571 -0
  48. a_sync/a_sync/function.pyx +1381 -0
  49. a_sync/a_sync/method.c +29774 -0
  50. a_sync/a_sync/method.cp310-win32.pyd +0 -0
  51. a_sync/a_sync/method.pxd +9 -0
  52. a_sync/a_sync/method.pyi +525 -0
  53. a_sync/a_sync/method.pyx +1023 -0
  54. a_sync/a_sync/modifiers/__init__.pxd +1 -0
  55. a_sync/a_sync/modifiers/__init__.py +101 -0
  56. a_sync/a_sync/modifiers/cache/__init__.py +160 -0
  57. a_sync/a_sync/modifiers/cache/memory.py +165 -0
  58. a_sync/a_sync/modifiers/limiter.py +132 -0
  59. a_sync/a_sync/modifiers/manager.c +16149 -0
  60. a_sync/a_sync/modifiers/manager.cp310-win32.pyd +0 -0
  61. a_sync/a_sync/modifiers/manager.pxd +5 -0
  62. a_sync/a_sync/modifiers/manager.pyi +219 -0
  63. a_sync/a_sync/modifiers/manager.pyx +299 -0
  64. a_sync/a_sync/modifiers/semaphores.py +173 -0
  65. a_sync/a_sync/property.c +27260 -0
  66. a_sync/a_sync/property.cp310-win32.pyd +0 -0
  67. a_sync/a_sync/property.pyi +376 -0
  68. a_sync/a_sync/property.pyx +819 -0
  69. a_sync/a_sync/singleton.py +63 -0
  70. a_sync/aliases.py +3 -0
  71. a_sync/async_property/__init__.pxd +1 -0
  72. a_sync/async_property/__init__.py +1 -0
  73. a_sync/async_property/cached.c +20386 -0
  74. a_sync/async_property/cached.cp310-win32.pyd +0 -0
  75. a_sync/async_property/cached.pxd +10 -0
  76. a_sync/async_property/cached.pyi +45 -0
  77. a_sync/async_property/cached.pyx +178 -0
  78. a_sync/async_property/proxy.c +34654 -0
  79. a_sync/async_property/proxy.cp310-win32.pyd +0 -0
  80. a_sync/async_property/proxy.pxd +2 -0
  81. a_sync/async_property/proxy.pyi +124 -0
  82. a_sync/async_property/proxy.pyx +474 -0
  83. a_sync/asyncio/__init__.pxd +6 -0
  84. a_sync/asyncio/__init__.py +164 -0
  85. a_sync/asyncio/as_completed.c +18841 -0
  86. a_sync/asyncio/as_completed.cp310-win32.pyd +0 -0
  87. a_sync/asyncio/as_completed.pxd +8 -0
  88. a_sync/asyncio/as_completed.pyi +109 -0
  89. a_sync/asyncio/as_completed.pyx +269 -0
  90. a_sync/asyncio/create_task.c +15902 -0
  91. a_sync/asyncio/create_task.cp310-win32.pyd +0 -0
  92. a_sync/asyncio/create_task.pxd +2 -0
  93. a_sync/asyncio/create_task.pyi +51 -0
  94. a_sync/asyncio/create_task.pyx +271 -0
  95. a_sync/asyncio/gather.c +16679 -0
  96. a_sync/asyncio/gather.cp310-win32.pyd +0 -0
  97. a_sync/asyncio/gather.pyi +107 -0
  98. a_sync/asyncio/gather.pyx +218 -0
  99. a_sync/asyncio/igather.c +12676 -0
  100. a_sync/asyncio/igather.cp310-win32.pyd +0 -0
  101. a_sync/asyncio/igather.pxd +1 -0
  102. a_sync/asyncio/igather.pyi +7 -0
  103. a_sync/asyncio/igather.pyx +182 -0
  104. a_sync/asyncio/sleep.c +9593 -0
  105. a_sync/asyncio/sleep.cp310-win32.pyd +0 -0
  106. a_sync/asyncio/sleep.pyi +14 -0
  107. a_sync/asyncio/sleep.pyx +49 -0
  108. a_sync/debugging.c +15362 -0
  109. a_sync/debugging.cp310-win32.pyd +0 -0
  110. a_sync/debugging.pyi +76 -0
  111. a_sync/debugging.pyx +107 -0
  112. a_sync/exceptions.c +13312 -0
  113. a_sync/exceptions.cp310-win32.pyd +0 -0
  114. a_sync/exceptions.pyi +376 -0
  115. a_sync/exceptions.pyx +446 -0
  116. a_sync/executor.py +619 -0
  117. a_sync/functools.c +12738 -0
  118. a_sync/functools.cp310-win32.pyd +0 -0
  119. a_sync/functools.pxd +7 -0
  120. a_sync/functools.pyi +33 -0
  121. a_sync/functools.pyx +139 -0
  122. a_sync/future.py +1497 -0
  123. a_sync/iter.c +37271 -0
  124. a_sync/iter.cp310-win32.pyd +0 -0
  125. a_sync/iter.pxd +11 -0
  126. a_sync/iter.pyi +370 -0
  127. a_sync/iter.pyx +981 -0
  128. a_sync/primitives/__init__.pxd +1 -0
  129. a_sync/primitives/__init__.py +53 -0
  130. a_sync/primitives/_debug.c +15757 -0
  131. a_sync/primitives/_debug.cp310-win32.pyd +0 -0
  132. a_sync/primitives/_debug.pxd +12 -0
  133. a_sync/primitives/_debug.pyi +52 -0
  134. a_sync/primitives/_debug.pyx +223 -0
  135. a_sync/primitives/_loggable.c +11529 -0
  136. a_sync/primitives/_loggable.cp310-win32.pyd +0 -0
  137. a_sync/primitives/_loggable.pxd +4 -0
  138. a_sync/primitives/_loggable.pyi +66 -0
  139. a_sync/primitives/_loggable.pyx +102 -0
  140. a_sync/primitives/locks/__init__.pxd +8 -0
  141. a_sync/primitives/locks/__init__.py +17 -0
  142. a_sync/primitives/locks/counter.c +17679 -0
  143. a_sync/primitives/locks/counter.cp310-win32.pyd +0 -0
  144. a_sync/primitives/locks/counter.pxd +12 -0
  145. a_sync/primitives/locks/counter.pyi +151 -0
  146. a_sync/primitives/locks/counter.pyx +260 -0
  147. a_sync/primitives/locks/event.c +17063 -0
  148. a_sync/primitives/locks/event.cp310-win32.pyd +0 -0
  149. a_sync/primitives/locks/event.pxd +22 -0
  150. a_sync/primitives/locks/event.pyi +43 -0
  151. a_sync/primitives/locks/event.pyx +185 -0
  152. a_sync/primitives/locks/prio_semaphore.c +25590 -0
  153. a_sync/primitives/locks/prio_semaphore.cp310-win32.pyd +0 -0
  154. a_sync/primitives/locks/prio_semaphore.pxd +25 -0
  155. a_sync/primitives/locks/prio_semaphore.pyi +217 -0
  156. a_sync/primitives/locks/prio_semaphore.pyx +597 -0
  157. a_sync/primitives/locks/semaphore.c +26509 -0
  158. a_sync/primitives/locks/semaphore.cp310-win32.pyd +0 -0
  159. a_sync/primitives/locks/semaphore.pxd +21 -0
  160. a_sync/primitives/locks/semaphore.pyi +197 -0
  161. a_sync/primitives/locks/semaphore.pyx +454 -0
  162. a_sync/primitives/queue.py +1022 -0
  163. a_sync/py.typed +0 -0
  164. a_sync/sphinx/__init__.py +3 -0
  165. a_sync/sphinx/ext.py +289 -0
  166. a_sync/task.py +932 -0
  167. a_sync/utils/__init__.py +105 -0
  168. a_sync/utils/iterators.py +297 -0
  169. a_sync/utils/repr.c +15799 -0
  170. a_sync/utils/repr.cp310-win32.pyd +0 -0
  171. a_sync/utils/repr.pyi +2 -0
  172. a_sync/utils/repr.pyx +73 -0
  173. ez_a_sync-0.32.29.dist-info/METADATA +367 -0
  174. ez_a_sync-0.32.29.dist-info/RECORD +177 -0
  175. ez_a_sync-0.32.29.dist-info/WHEEL +5 -0
  176. ez_a_sync-0.32.29.dist-info/licenses/LICENSE.txt +17 -0
  177. ez_a_sync-0.32.29.dist-info/top_level.txt +1 -0
Binary file
a_sync/debugging.pyi ADDED
@@ -0,0 +1,76 @@
1
+ from logging import Logger
2
+ from typing import (
3
+ Any,
4
+ AsyncGenerator,
5
+ AsyncIterator,
6
+ Awaitable,
7
+ Callable,
8
+ Coroutine,
9
+ Literal,
10
+ NoReturn,
11
+ TypeVar,
12
+ overload,
13
+ )
14
+
15
+ from typing_extensions import Concatenate, ParamSpec
16
+
17
+ from a_sync.a_sync.base import ASyncGenericBase
18
+ from a_sync.a_sync.method import ASyncBoundMethod
19
+ from a_sync.iter import ASyncGeneratorFunction
20
+
21
+ __P = ParamSpec("__P")
22
+ __T = TypeVar("__T")
23
+ __TYield = TypeVar("__TYield")
24
+ __TReturn = TypeVar("__TReturn")
25
+ __TBase = TypeVar("__TBase", bound=ASyncGenericBase)
26
+
27
+ _FIVE_MINUTES: Literal[300] = 300
28
+
29
+ @overload
30
+ def stuck_coro_debugger(
31
+ fn: Callable[Concatenate[__TBase, __P], AsyncGenerator[__TYield, Any]],
32
+ logger: Logger = logger,
33
+ interval: int = _FIVE_MINUTES,
34
+ ) -> ASyncGeneratorFunction[__P, __TYield]: ...
35
+ @overload
36
+ def stuck_coro_debugger(
37
+ fn: Callable[Concatenate[__TBase, __P], AsyncIterator[__TYield]],
38
+ logger: Logger = logger,
39
+ interval: int = _FIVE_MINUTES,
40
+ ) -> ASyncGeneratorFunction[__P, __TYield]: ...
41
+ @overload
42
+ def stuck_coro_debugger(
43
+ fn: Callable[Concatenate[__TBase, __P], Coroutine[Any, Any, __T]],
44
+ logger: Logger = logger,
45
+ interval: int = _FIVE_MINUTES,
46
+ ) -> ASyncBoundMethod[__TBase, __P, __T]: ...
47
+ @overload
48
+ def stuck_coro_debugger(
49
+ fn: Callable[Concatenate[__TBase, __P], __T],
50
+ logger: Logger = logger,
51
+ interval: int = _FIVE_MINUTES,
52
+ ) -> ASyncBoundMethod[__TBase, __P, __T]: ...
53
+ @overload
54
+ def stuck_coro_debugger(
55
+ fn: Callable[__P, AsyncGenerator[__TYield, __TReturn]],
56
+ logger: Logger = logger,
57
+ interval: int = _FIVE_MINUTES,
58
+ ) -> Callable[__P, AsyncGenerator[__TYield, __TReturn]]: ...
59
+ @overload
60
+ def stuck_coro_debugger(
61
+ fn: Callable[__P, AsyncIterator[__TYield]],
62
+ logger: Logger = logger,
63
+ interval: int = _FIVE_MINUTES,
64
+ ) -> Callable[__P, AsyncIterator[__TYield]]: ...
65
+ @overload
66
+ def stuck_coro_debugger(
67
+ fn: Callable[__P, Coroutine[Any, Any, __T]],
68
+ logger: Logger = logger,
69
+ interval: int = _FIVE_MINUTES,
70
+ ) -> Callable[__P, Coroutine[Any, Any, __T]]: ...
71
+ def stuck_coro_debugger(fn, logger=logger, interval=_FIVE_MINUTES): ...
72
+ async def _stuck_debug_task(
73
+ logger: Logger, interval: int, fn: Callable[__P, __T], *args: __P.args, **kwargs: __P.kwargs
74
+ ) -> NoReturn: ...
75
+
76
+ __all__ = ["stuck_coro_debugger"]
a_sync/debugging.pyx ADDED
@@ -0,0 +1,107 @@
1
+ # cython: profile=False
2
+ # cython: linetrace=False
3
+ import asyncio
4
+ import inspect
5
+ import functools
6
+ import time
7
+ from logging import DEBUG, Logger, getLogger
8
+ from typing import AsyncIterator, Callable, NoReturn, TypeVar
9
+
10
+ from typing_extensions import Concatenate, ParamSpec
11
+
12
+ from a_sync.a_sync.base import ASyncGenericBase
13
+ from a_sync.iter cimport _ASyncGeneratorFunction
14
+
15
+
16
+ __P = ParamSpec("__P")
17
+ __T = TypeVar("__T")
18
+ __B = TypeVar("__B", bound=ASyncGenericBase)
19
+
20
+
21
+ cdef object _FIVE_MINUTES = 300
22
+
23
+ cdef object create_task = asyncio.create_task
24
+ cdef object sleep = asyncio.sleep
25
+
26
+ cdef object isasyncgenfunction = inspect.isasyncgenfunction
27
+
28
+ cdef object wraps = functools.wraps
29
+
30
+ cdef object gettime = time.time
31
+
32
+ cdef object logger = getLogger("a_sync.debugging")
33
+
34
+
35
+ def stuck_coro_debugger(fn, logger=logger, interval=_FIVE_MINUTES):
36
+ __logger_is_enabled_for = logger.isEnabledFor
37
+
38
+ if isasyncgenfunction(fn) or isinstance(fn, _ASyncGeneratorFunction):
39
+
40
+ @wraps(fn)
41
+ async def stuck_async_gen_wrap(*args: __P.args, **kwargs: __P.kwargs) -> AsyncIterator[__T]:
42
+ aiterator = fn(*args, **kwargs)
43
+
44
+ if not __logger_is_enabled_for(DEBUG):
45
+ async for thing in aiterator:
46
+ yield thing
47
+ return
48
+
49
+ task = create_task(
50
+ coro=_stuck_debug_task(logger, interval, fn, args, kwargs),
51
+ name="_stuck_debug_task",
52
+ )
53
+ try:
54
+ async for thing in aiterator:
55
+ yield thing
56
+ finally:
57
+ task.cancel()
58
+
59
+ return stuck_async_gen_wrap
60
+ else:
61
+
62
+ @wraps(fn)
63
+ async def stuck_coro_wrap(*args: __P.args, **kwargs: __P.kwargs) -> __T:
64
+ if not __logger_is_enabled_for(DEBUG):
65
+ return await fn(*args, **kwargs)
66
+
67
+ task = create_task(
68
+ coro=_stuck_debug_task(logger, interval, fn, args, kwargs),
69
+ name="_stuck_debug_task",
70
+ )
71
+ try:
72
+ retval = await fn(*args, **kwargs)
73
+ finally:
74
+ task.cancel()
75
+ return retval
76
+
77
+ return stuck_coro_wrap
78
+
79
+
80
+ async def _stuck_debug_task(
81
+ logger: Logger, interval: int, fn: Callable[__P, __T], *args: __P.args, **kwargs: __P.kwargs
82
+ ) -> NoReturn:
83
+ # sleep early so fast-running coros can exit early
84
+ await sleep(interval)
85
+
86
+ start = gettime() - interval
87
+ cdef str module = fn.__module__
88
+ cdef str name = fn.__name__
89
+ cdef tuple formatted_args = tuple(map(str, args))
90
+ cdef dict formatted_kwargs = dict(zip(kwargs.keys(), map(str, kwargs.values())))
91
+ log = logger._log
92
+ while True:
93
+ log(
94
+ DEBUG,
95
+ "%s.%s still executing after %sm with args %s kwargs %s",
96
+ (
97
+ module,
98
+ name,
99
+ round((gettime() - start) / 60, 2),
100
+ formatted_args,
101
+ formatted_kwargs,
102
+ ),
103
+ )
104
+ await sleep(interval)
105
+
106
+
107
+ __all__ = ["stuck_coro_debugger"]