danielutils 1.0.35__tar.gz → 1.0.37__tar.gz

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.
Files changed (270) hide show
  1. {danielutils-1.0.35/danielutils.egg-info → danielutils-1.0.37}/PKG-INFO +1 -1
  2. danielutils-1.0.37/danielutils/async_/__init__.py +5 -0
  3. danielutils-1.0.37/danielutils/async_/async_cmd.py +23 -0
  4. danielutils-1.0.37/danielutils/async_/async_layered_command.py +109 -0
  5. danielutils-1.0.35/danielutils/async_/async_retry_executor_base.py → danielutils-1.0.37/danielutils/async_/async_retry_executor.py +3 -3
  6. danielutils-1.0.35/danielutils/async_/async_worker_pool_base.py → danielutils-1.0.37/danielutils/async_/async_worker_pool.py +15 -14
  7. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/class_/class_reflection.py +4 -4
  8. {danielutils-1.0.35 → danielutils-1.0.37/danielutils.egg-info}/PKG-INFO +1 -1
  9. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils.egg-info/SOURCES.txt +4 -2
  10. {danielutils-1.0.35 → danielutils-1.0.37}/pyproject.toml +1 -1
  11. danielutils-1.0.35/danielutils/async_/__init__.py +0 -4
  12. {danielutils-1.0.35 → danielutils-1.0.37}/LICENSE +0 -0
  13. {danielutils-1.0.35 → danielutils-1.0.37}/MANIFEST.in +0 -0
  14. {danielutils-1.0.35 → danielutils-1.0.37}/README.md +0 -0
  15. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/__init__.py +0 -0
  16. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/__init__.py +0 -0
  17. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/database/__init__.py +0 -0
  18. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/database/cached_database.py +0 -0
  19. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/database/database.py +0 -0
  20. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/database/redis_database.py +0 -0
  21. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
  22. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
  23. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/multiprogramming/worker.py +0 -0
  24. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
  25. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/abstractions/repl.py +0 -0
  26. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/aliases.py +0 -0
  27. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/async_/time_strategy.py +0 -0
  28. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/async_/utils.py +0 -0
  29. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/__init__.py +0 -0
  30. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/counter.py +0 -0
  31. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/frange.py +0 -0
  32. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
  33. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
  34. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
  35. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
  36. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
  37. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
  38. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/colors.py +0 -0
  39. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/context_managers/__init__.py +0 -0
  40. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/context_managers/attr_context.py +0 -0
  41. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/context_managers/multi_context.py +0 -0
  42. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/context_managers/optional_context.py +0 -0
  43. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/context_managers/state_context.py +0 -0
  44. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/context_managers/temporary_file.py +0 -0
  45. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/convenience.py +0 -0
  46. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/conversions/__init__.py +0 -0
  47. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/conversions/main_conversions.py +0 -0
  48. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
  49. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
  50. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
  51. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/custom_types.py +0 -0
  52. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/__init__.py +0 -0
  53. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/algorithms.py +0 -0
  54. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/comparer.py +0 -0
  55. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/default_dict.py +0 -0
  56. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/functions.py +0 -0
  57. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/graph/__init__.py +0 -0
  58. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/graph/binary_node.py +0 -0
  59. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/graph/graph.py +0 -0
  60. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/graph/multinode.py +0 -0
  61. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/graph/node.py +0 -0
  62. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/heap/__init__.py +0 -0
  63. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/heap/heap.py +0 -0
  64. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/heap/max_heap.py +0 -0
  65. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/heap/min_heap.py +0 -0
  66. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/queue/__init__.py +0 -0
  67. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/queue/atomic_queue.py +0 -0
  68. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/queue/priority_queue.py +0 -0
  69. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/queue/queue.py +0 -0
  70. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/stack.py +0 -0
  71. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/trees/__init__.py +0 -0
  72. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
  73. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/data_structures/trees/binary_tree.py +0 -0
  74. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/date.py +0 -0
  75. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/date_time.py +0 -0
  76. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/__init__.py +0 -0
  77. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/atomic.py +0 -0
  78. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/attach.py +0 -0
  79. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/chain_decorators.py +0 -0
  80. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/decorate_conditionally.py +0 -0
  81. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/delay_call.py +0 -0
  82. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/deprecate.py +0 -0
  83. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/final.py +0 -0
  84. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/limit_recursion.py +0 -0
  85. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/memo.py +0 -0
  86. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/normalize_decorator.py +0 -0
  87. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/overload.py +0 -0
  88. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/partially_implemented.py +0 -0
  89. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/processify.py +0 -0
  90. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/property.py +0 -0
  91. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/singleton.py +0 -0
  92. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/threadify.py +0 -0
  93. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/timeout.py +0 -0
  94. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/total_ordering.py +0 -0
  95. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/decorators/validate.py +0 -0
  96. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/exceptions.py +0 -0
  97. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/file_specifications/__init__.py +0 -0
  98. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/__init__.py +0 -0
  99. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/areoneof.py +0 -0
  100. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/check_foreach.py +0 -0
  101. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/factorial.py +0 -0
  102. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/flatten.py +0 -0
  103. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/foreach.py +0 -0
  104. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/isoftype.py +0 -0
  105. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/isoneof.py +0 -0
  106. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/multiloop.py +0 -0
  107. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/parallel_for.py +0 -0
  108. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/partition.py +0 -0
  109. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/powerset.py +0 -0
  110. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/subseteq.py +0 -0
  111. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/functions/types_subseteq.py +0 -0
  112. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/generators/__init__.py +0 -0
  113. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/generators/conditional_generator.py +0 -0
  114. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/generators/generator_from_stream.py +0 -0
  115. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/generators/join_generators.py +0 -0
  116. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/internet.py +0 -0
  117. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/io_.py +0 -0
  118. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/java/__init__.py +0 -0
  119. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/java/interfaces/__init__.py +0 -0
  120. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/java/interfaces/comparable.py +0 -0
  121. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/java/java_interface.py +0 -0
  122. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/logging_/__init__.py +0 -0
  123. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/logging_/builtin_impls/__init__.py +0 -0
  124. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/logging_/builtin_impls/file_logger.py +0 -0
  125. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/logging_/builtin_impls/print_logger.py +0 -0
  126. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/logging_/log_level.py +0 -0
  127. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/logging_/logger.py +0 -0
  128. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/logging_/logger_strategy_impl_base.py +0 -0
  129. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/lombok/__init__.py +0 -0
  130. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/lombok/builder.py +0 -0
  131. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/math_/__init__.py +0 -0
  132. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/math_/constants.py +0 -0
  133. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/math_/functions.py +0 -0
  134. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/math_/math_print.py +0 -0
  135. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/math_/math_symbols.py +0 -0
  136. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/metaclasses/__init__.py +0 -0
  137. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/metaclasses/atomic_class_meta.py +0 -0
  138. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
  139. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/metaclasses/instance_cache_meta.py +0 -0
  140. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/metaclasses/interface.py +0 -0
  141. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/metaclasses/overload_meta.py +0 -0
  142. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/mock_/__init__.py +0 -0
  143. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/mock_/mock_database.py +0 -0
  144. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/mock_/mock_module.py +0 -0
  145. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/path.py +0 -0
  146. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/print_.py +0 -0
  147. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/progress_bar/__init__.py +0 -0
  148. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/progress_bar/ascii_progress_bar.py +0 -0
  149. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/progress_bar/progress_bar.py +0 -0
  150. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/progress_bar/progress_bar_pool.py +0 -0
  151. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/protocols/__init__.py +0 -0
  152. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/protocols/dictable.py +0 -0
  153. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/protocols/evaluable.py +0 -0
  154. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/protocols/serializable.py +0 -0
  155. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/py.typed +0 -0
  156. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/random_.py +0 -0
  157. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/__init__.py +0 -0
  158. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/argument_info.py +0 -0
  159. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/class_/__init__.py +0 -0
  160. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/class_info.py +0 -0
  161. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/decoration_info.py +0 -0
  162. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/file/__init__.py +0 -0
  163. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/file/file_reflection.py +0 -0
  164. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/function/__init__.py +0 -0
  165. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/function/function_reflections.py +0 -0
  166. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/function_info.py +0 -0
  167. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/__init__.py +0 -0
  168. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/callstack.py +0 -0
  169. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/get_traceback.py +0 -0
  170. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/interpreter.py +0 -0
  171. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/is_debugging.py +0 -0
  172. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/os_.py +0 -0
  173. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/packages.py +0 -0
  174. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/python_version.py +0 -0
  175. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/signals.py +0 -0
  176. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/interpreter/tracer.py +0 -0
  177. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/module/__init__.py +0 -0
  178. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/module/module_reflections.py +0 -0
  179. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/reflection/module/package_reflection.py +0 -0
  180. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/__init__.py +0 -0
  181. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategies/__init__.py +0 -0
  182. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategies/constant_backoff.py +0 -0
  183. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategies/exponential_backoff.py +0 -0
  184. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategies/functional_backoff.py +0 -0
  185. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategies/linear_backoff.py +0 -0
  186. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategies/multiplicative_backoff.py +0 -0
  187. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategies/no_backoff.py +0 -0
  188. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/backoff_strategy.py +0 -0
  189. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/retry_executor/retry_executor.py +0 -0
  190. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/snippets/__init__.py +0 -0
  191. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/snippets/try_get.py +0 -0
  192. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/__init__.py +0 -0
  193. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/independent.py +0 -0
  194. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/layered_command.py +0 -0
  195. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/windows/__init__.py +0 -0
  196. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/windows/utils/__init__.py +0 -0
  197. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/windows/utils/filetime.py +0 -0
  198. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/windows/win32_ctime.py +0 -0
  199. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/system/windows/windows.py +0 -0
  200. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/testing/__init__.py +0 -0
  201. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/testing/unittest_/__init__.py +0 -0
  202. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/testing/unittest_/always_teardown_testcase.py +0 -0
  203. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/testing/unittest_/auto_cwd_testcase.py +0 -0
  204. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/text.py +0 -0
  205. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/time.py +0 -0
  206. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/__init__.py +0 -0
  207. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/computability_and_complexity/__init__.py +0 -0
  208. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/computability_and_complexity/discreate_finite_automaton.py +0 -0
  209. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
  210. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/computability_and_complexity/languages/language.py +0 -0
  211. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/computability_and_complexity/languages/sat.py +0 -0
  212. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/computability_and_complexity/turing_machine.py +0 -0
  213. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/databases/__init__.py +0 -0
  214. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/databases/all.py +0 -0
  215. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/__init__.py +0 -0
  216. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/__init__.py +0 -0
  217. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/encoding.py +0 -0
  218. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/lossless/__init__.py +0 -0
  219. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
  220. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +0 -0
  221. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
  222. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/lossless/run_length.py +0 -0
  223. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/lossy/__init__.py +0 -0
  224. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +0 -0
  225. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
  226. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
  227. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
  228. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/tansformations/hough.py +0 -0
  229. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
  230. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/image_proccesing/tansformations/transformation.py +0 -0
  231. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/linear_algebra/__init__.py +0 -0
  232. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/linear_algebra/matrix.py +0 -0
  233. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/machine_learning/__init__.py +0 -0
  234. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/machine_learning/activation_functions/__init__.py +0 -0
  235. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/machine_learning/activation_functions/activation_function.py +0 -0
  236. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/machine_learning/activation_functions/relu.py +0 -0
  237. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/machine_learning/neuron.py +0 -0
  238. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/oop/__init__.py +0 -0
  239. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/oop/observer.py +0 -0
  240. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/oop/strategy.py +0 -0
  241. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/__init__.py +0 -0
  242. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
  243. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
  244. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
  245. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
  246. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
  247. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
  248. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
  249. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
  250. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
  251. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
  252. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
  253. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/distributions.py +0 -0
  254. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/expressions/__init__.py +0 -0
  255. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
  256. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/expressions/probability_expression.py +0 -0
  257. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/funcs/__init__.py +0 -0
  258. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/funcs/covariance.py +0 -0
  259. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/funcs/expected_value.py +0 -0
  260. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/funcs/probability_function.py +0 -0
  261. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/funcs/variance.py +0 -0
  262. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/operator.py +0 -0
  263. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/protocols.py +0 -0
  264. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/supp.py +0 -0
  265. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/university/probability/transformation.py +0 -0
  266. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils/versioned_imports.py +0 -0
  267. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils.egg-info/dependency_links.txt +0 -0
  268. {danielutils-1.0.35 → danielutils-1.0.37}/danielutils.egg-info/top_level.txt +0 -0
  269. {danielutils-1.0.35 → danielutils-1.0.37}/setup.cfg +0 -0
  270. {danielutils-1.0.35 → danielutils-1.0.37}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 1.0.35
3
+ Version: 1.0.37
4
4
  Summary: A python utils library for things I find useful
5
5
  Author-email: danielnachumdev <danielnachumdev@gmail.com>
6
6
  License: MIT License
@@ -0,0 +1,5 @@
1
+ from .async_worker_pool import *
2
+ from .async_worker_pool import *
3
+ from .time_strategy import *
4
+ from .utils import *
5
+ from .async_cmd import *
@@ -0,0 +1,23 @@
1
+ import asyncio
2
+ from typing import Tuple, Optional
3
+
4
+
5
+ async def async_cmd(
6
+ cmd: str,
7
+ *,
8
+ capture_stdout: bool = False,
9
+ capture_stderr: bool = False
10
+ ) -> Tuple[int, Optional[bytes], Optional[bytes]]:
11
+ kwargs = {}
12
+ if capture_stdout:
13
+ kwargs['stdout'] = asyncio.subprocess.PIPE
14
+ if capture_stderr:
15
+ kwargs['stderr'] = asyncio.subprocess.PIPE
16
+ process = await asyncio.create_subprocess_shell(cmd, **kwargs) # type:ignore
17
+ stdout, stderr = await process.communicate()
18
+ return process.returncode, stdout, stderr
19
+
20
+
21
+ __all__ = [
22
+ 'async_cmd',
23
+ ]
@@ -0,0 +1,109 @@
1
+ import sys, os
2
+ from typing import Optional, Tuple, List
3
+
4
+ from .async_cmd import async_cmd
5
+ from danielutils.context_managers import TemporaryFile
6
+ import random
7
+
8
+
9
+ class AsyncLayeredCommand:
10
+ class_capture_stdout: bool = True
11
+ class_capture_stderr: bool = True
12
+ class_raise_on_fail: bool = False
13
+ class_verbose: bool = False
14
+ _class_prev_instance: Optional['AsyncLayeredCommand'] = None
15
+ _id: int = 0
16
+
17
+ @property
18
+ def prev(self):
19
+ return self._prev_instance
20
+
21
+ @prev.setter
22
+ def prev(self, value: Optional['AsyncLayeredCommand'] = None):
23
+ self._prev_instance = value
24
+
25
+ def __init__(
26
+ self,
27
+ command: Optional[str] = None,
28
+ *,
29
+ prev_instance: Optional['AsyncLayeredCommand'] = None,
30
+ instance_capture_stdout: Optional[bool] = None,
31
+ instance_capture_stderr: Optional[bool] = None,
32
+ instance_raise_on_fail: Optional[bool] = None,
33
+ instance_verbose: Optional[bool] = None
34
+ ):
35
+ self._command = command if command is not None else ""
36
+ self._instance_capture_stdout = instance_capture_stdout
37
+ self._instance_capture_stderr = instance_capture_stderr
38
+ self._instance_raise_on_fail = instance_raise_on_fail
39
+ self._instance_verbose = instance_verbose
40
+ self._prev_instance = prev_instance if prev_instance is not None else AsyncLayeredCommand._class_prev_instance
41
+ self._cur_class_prev_instance = AsyncLayeredCommand._class_prev_instance
42
+ AsyncLayeredCommand._class_prev_instance = self
43
+ self._has_entered: bool = False
44
+
45
+ def __enter__(self):
46
+ self._open()
47
+ return self
48
+
49
+ def __exit__(self, exc_type, exc_val, exc_tb):
50
+ if self.prev is self._cur_class_prev_instance:
51
+ AsyncLayeredCommand._class_prev_instance = self.prev
52
+
53
+ def _open(self) -> None:
54
+ self._has_entered = True
55
+
56
+ def _build_command(self, *commands: str) -> str:
57
+ res = ""
58
+ if self.prev is not None:
59
+ prev = self.prev._build_command()
60
+ res += f"{prev} & " if prev != "" else ""
61
+ if self._command != "":
62
+ return res + " & ".join([self._command, *commands])
63
+ return res + " & ".join(commands)
64
+
65
+ def _error(self, predicate: bool, command: str, code: int, command_verbose: Optional[bool]) -> None:
66
+ if predicate:
67
+ verbose = self._merge_values(command_verbose, self._instance_verbose, AsyncLayeredCommand.class_verbose)
68
+ if verbose:
69
+ raise RuntimeError(f"command '{command}' failed with exit code {code}")
70
+ sys.exit(1)
71
+
72
+ @staticmethod
73
+ def _merge_values(command: Optional[bool], instance: Optional[bool], class_: bool) -> bool:
74
+ return command if command is not None else (instance if instance is not None else class_)
75
+
76
+ async def execute(
77
+ self,
78
+ *commands: str,
79
+ command_capture_stdout: Optional[bool] = None,
80
+ command_capture_stderr: Optional[bool] = None,
81
+ command_raise_on_fail: Optional[bool] = None,
82
+ command_verbose: Optional[bool] = None
83
+ ) -> Tuple[int, List[str], List[str]]:
84
+ if not self._has_entered:
85
+ raise RuntimeError(
86
+ "LayeredCommand must be used with a context manager. Use as: `with LayeredCommand(...) as l1:`")
87
+ capture_stdout = self._merge_values(command_capture_stdout, self._instance_capture_stdout,
88
+ self.class_capture_stdout)
89
+ capture_stderr = self._merge_values(command_capture_stderr, self._instance_capture_stderr,
90
+ self.class_capture_stderr)
91
+ raise_on_fail = self._merge_values(command_raise_on_fail, self._instance_raise_on_fail,
92
+ self.class_raise_on_fail)
93
+
94
+ command = self._build_command(*commands)
95
+ if not capture_stdout and not capture_stderr:
96
+ code = (await async_cmd(command))[0]
97
+ self._error(raise_on_fail and code != 0, command, code, command_verbose)
98
+ return code, [], []
99
+
100
+ code, stdout, stderr = await async_cmd(command, capture_stdout=True, capture_stderr=True)
101
+ return code, stdout.decode().splitlines(), stderr.decode().splitlines()
102
+
103
+ async def __call__(self, *args, **kwargs) -> Tuple[int, List[str], List[str]]:
104
+ return await self.execute(*args, **kwargs)
105
+
106
+
107
+ __all__ = [
108
+ 'AsyncLayeredCommand'
109
+ ]
@@ -12,7 +12,7 @@ from ..versioned_imports import ParamSpec
12
12
  P = ParamSpec("P")
13
13
 
14
14
 
15
- class AsyncRetryExecutorBase:
15
+ class AsyncRetryExecutor:
16
16
  def __init__(
17
17
  self,
18
18
  timeout_strategy: Supplier[float] = LinearTimeStrategy(30, 5),
@@ -75,7 +75,7 @@ class AsyncRetryExecutorBase:
75
75
 
76
76
  @normalize_decorator
77
77
  def with_async_retry(func, *retry_executor_args, max_tries: int = 5, **retry_executor_kwargs):
78
- retry_executor = AsyncRetryExecutorBase(*retry_executor_args, **retry_executor_kwargs)
78
+ retry_executor = AsyncRetryExecutor(*retry_executor_args, **retry_executor_kwargs)
79
79
 
80
80
  @functools.wraps(func)
81
81
  async def wrapper(*args, **kwargs):
@@ -85,6 +85,6 @@ def with_async_retry(func, *retry_executor_args, max_tries: int = 5, **retry_exe
85
85
 
86
86
 
87
87
  __all__ = [
88
- "AsyncRetryExecutorBase",
88
+ "AsyncRetryExecutor",
89
89
  "with_async_retry"
90
90
  ]
@@ -2,33 +2,33 @@ import asyncio
2
2
  import json
3
3
  from typing import Callable, Literal, Optional, Coroutine
4
4
 
5
- from .async_retry_executor_base import AsyncRetryExecutorBase
6
5
 
7
-
8
- class AsyncWorkerPoolBase:
9
- def __init__(self, num_workers: int, retry_executor: Optional[AsyncRetryExecutorBase] = None) -> None:
6
+ class AsyncWorkerPool:
7
+ def __init__(self, pool_name: str, num_workers: int = 5) -> None:
10
8
  self.num_workers = num_workers
9
+ self.pool_name = pool_name
11
10
  self.queue = asyncio.Queue()
12
11
  self.workers = []
13
- self.retry_executor = retry_executor
14
12
 
15
13
  async def worker(self, worker_id) -> None:
16
14
  """Worker coroutine that continuously fetches and executes tasks from the queue."""
17
- count = 0
15
+ task_count = 0
18
16
  while True:
19
17
  task = await self.queue.get()
20
18
  if task is None: # Sentinel value to shut down the worker
21
19
  break
22
- count += 1
20
+ task_count += 1
23
21
  func, args, kwargs = task
24
- self.info(f"Worker {worker_id} started with task {count}")
25
- if self.retry_executor:
26
- await self.retry_executor.execute(func, args=args, kwargs=kwargs)
27
- else:
22
+ self.info(f"Worker {worker_id} started with task {task_count}")
23
+
24
+ try:
28
25
  await func(*args, **kwargs)
29
- self.info(f"Worker {worker_id} finished with task {count}")
26
+ except Exception as e:
27
+ self.error(f"Worker {worker_id} failed task {task_count}", exception=e)
28
+
29
+ self.info(f"Worker {worker_id} finished with task {task_count}")
30
30
  self.queue.task_done()
31
- self.info(f"Worker {worker_id} done.")
31
+ self.info(f"Worker {worker_id} done executed {task_count} tasks.")
32
32
 
33
33
  async def start(self) -> None:
34
34
  """Starts the worker pool."""
@@ -48,6 +48,7 @@ class AsyncWorkerPoolBase:
48
48
  def log(self, level: Literal["INFO", "WARNING", "ERROR"], message: str, **kwargs) -> None:
49
49
  kwargs["level"] = level
50
50
  kwargs["message"] = message
51
+ kwargs["pool"] = self.pool_name
51
52
  print(json.dumps(kwargs, default=str))
52
53
 
53
54
  def info(self, message: str, **kwargs) -> None:
@@ -61,5 +62,5 @@ class AsyncWorkerPoolBase:
61
62
 
62
63
 
63
64
  __all__ = [
64
- "AsyncWorkerPoolBase",
65
+ "AsyncWorkerPool",
65
66
  ]
@@ -115,7 +115,7 @@ class FunctionDeclaration:
115
115
  generics=self.generics,
116
116
  )
117
117
  dct.update(override_kwargs)
118
- return FunctionDeclaration(**dct)
118
+ return FunctionDeclaration(**dct) # type:ignore
119
119
 
120
120
  @property
121
121
  def has_generics(self) -> bool:
@@ -141,13 +141,13 @@ class FunctionDeclaration:
141
141
  parameters.append(arg)
142
142
  res = []
143
143
  for code, name, args, ret in func_pattern.findall(src):
144
- name: str = name.strip()
145
- args: Optional[str] = remove_whitespace(args) if args is not None else None
144
+ name: str = name.strip() # type:ignore
145
+ args: Optional[str] = remove_whitespace(args) if args is not None else None # type:ignore
146
146
  arguments = []
147
147
  if args is not None:
148
148
  for arg in split_args(args):
149
149
  arguments.append(Argument(*arg_pattern.match(remove_whitespace(arg)).groups()))
150
- ret: Optional[str] = ret.strip() if ret is not None and len(ret) != 0 else None
150
+ ret: Optional[str] = ret.strip() if ret is not None and len(ret) != 0 else None # type:ignore
151
151
  res.append(FunctionDeclaration(name, tuple(arguments), ret, decorators=None, generics=tuple(parameters)))
152
152
 
153
153
  return res
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 1.0.35
3
+ Version: 1.0.37
4
4
  Summary: A python utils library for things I find useful
5
5
  Author-email: danielnachumdev <danielnachumdev@gmail.com>
6
6
  License: MIT License
@@ -35,8 +35,10 @@ danielutils/abstractions/multiprogramming/multi_id.py
35
35
  danielutils/abstractions/multiprogramming/worker.py
36
36
  danielutils/abstractions/multiprogramming/worker_pool.py
37
37
  danielutils/async_/__init__.py
38
- danielutils/async_/async_retry_executor_base.py
39
- danielutils/async_/async_worker_pool_base.py
38
+ danielutils/async_/async_cmd.py
39
+ danielutils/async_/async_layered_command.py
40
+ danielutils/async_/async_retry_executor.py
41
+ danielutils/async_/async_worker_pool.py
40
42
  danielutils/async_/time_strategy.py
41
43
  danielutils/async_/utils.py
42
44
  danielutils/better_builtins/__init__.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "danielutils"
7
- version = "1.0.35"
7
+ version = "1.0.37"
8
8
  authors = [
9
9
  { name = "danielnachumdev", email = "danielnachumdev@gmail.com" },
10
10
  ]
@@ -1,4 +0,0 @@
1
- from .async_worker_pool_base import *
2
- from .async_worker_pool_base import *
3
- from .time_strategy import *
4
- from .utils import *
File without changes
File without changes
File without changes