danielutils 1.0.38__tar.gz → 1.0.39__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.38/danielutils.egg-info → danielutils-1.0.39}/PKG-INFO +1 -1
  2. danielutils-1.0.39/danielutils/async_/async_worker_pool.py +100 -0
  3. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/isoftype.py +14 -1
  4. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/java/java_interface.py +1 -1
  5. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/class_info.py +2 -2
  6. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/testing/unittest_/auto_cwd_testcase.py +11 -3
  7. {danielutils-1.0.38 → danielutils-1.0.39/danielutils.egg-info}/PKG-INFO +1 -1
  8. {danielutils-1.0.38 → danielutils-1.0.39}/pyproject.toml +1 -1
  9. danielutils-1.0.38/danielutils/async_/async_worker_pool.py +0 -89
  10. {danielutils-1.0.38 → danielutils-1.0.39}/LICENSE +0 -0
  11. {danielutils-1.0.38 → danielutils-1.0.39}/MANIFEST.in +0 -0
  12. {danielutils-1.0.38 → danielutils-1.0.39}/README.md +0 -0
  13. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/__init__.py +0 -0
  14. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/__init__.py +0 -0
  15. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/database/__init__.py +0 -0
  16. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/database/cached_database.py +0 -0
  17. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/database/database.py +0 -0
  18. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/database/redis_database.py +0 -0
  19. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
  20. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
  21. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/multiprogramming/worker.py +0 -0
  22. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
  23. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/abstractions/repl.py +0 -0
  24. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/aliases.py +0 -0
  25. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/async_/__init__.py +0 -0
  26. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/async_/async_cmd.py +0 -0
  27. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/async_/async_layered_command.py +0 -0
  28. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/async_/async_retry_executor.py +0 -0
  29. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/async_/time_strategy.py +0 -0
  30. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/async_/utils.py +0 -0
  31. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/__init__.py +0 -0
  32. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/counter.py +0 -0
  33. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/frange.py +0 -0
  34. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
  35. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
  36. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
  37. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
  38. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
  39. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
  40. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/colors.py +0 -0
  41. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/context_managers/__init__.py +0 -0
  42. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/context_managers/attr_context.py +0 -0
  43. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/context_managers/multi_context.py +0 -0
  44. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/context_managers/optional_context.py +0 -0
  45. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/context_managers/state_context.py +0 -0
  46. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/context_managers/temporary_file.py +0 -0
  47. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/convenience.py +0 -0
  48. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/conversions/__init__.py +0 -0
  49. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/conversions/main_conversions.py +0 -0
  50. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
  51. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
  52. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
  53. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/custom_types.py +0 -0
  54. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/__init__.py +0 -0
  55. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/algorithms.py +0 -0
  56. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/comparer.py +0 -0
  57. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/default_dict.py +0 -0
  58. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/functions.py +0 -0
  59. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/graph/__init__.py +0 -0
  60. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/graph/binary_node.py +0 -0
  61. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/graph/graph.py +0 -0
  62. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/graph/multinode.py +0 -0
  63. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/graph/node.py +0 -0
  64. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/heap/__init__.py +0 -0
  65. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/heap/heap.py +0 -0
  66. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/heap/max_heap.py +0 -0
  67. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/heap/min_heap.py +0 -0
  68. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/queue/__init__.py +0 -0
  69. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/queue/atomic_queue.py +0 -0
  70. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/queue/priority_queue.py +0 -0
  71. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/queue/queue.py +0 -0
  72. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/stack.py +0 -0
  73. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/trees/__init__.py +0 -0
  74. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
  75. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/data_structures/trees/binary_tree.py +0 -0
  76. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/date.py +0 -0
  77. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/date_time.py +0 -0
  78. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/__init__.py +0 -0
  79. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/atomic.py +0 -0
  80. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/attach.py +0 -0
  81. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/chain_decorators.py +0 -0
  82. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/decorate_conditionally.py +0 -0
  83. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/delay_call.py +0 -0
  84. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/deprecate.py +0 -0
  85. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/final.py +0 -0
  86. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/limit_recursion.py +0 -0
  87. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/memo.py +0 -0
  88. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/normalize_decorator.py +0 -0
  89. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/overload.py +0 -0
  90. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/partially_implemented.py +0 -0
  91. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/processify.py +0 -0
  92. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/property.py +0 -0
  93. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/singleton.py +0 -0
  94. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/threadify.py +0 -0
  95. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/timeout.py +0 -0
  96. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/total_ordering.py +0 -0
  97. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/decorators/validate.py +0 -0
  98. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/exceptions.py +0 -0
  99. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/file_specifications/__init__.py +0 -0
  100. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/__init__.py +0 -0
  101. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/areoneof.py +0 -0
  102. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/check_foreach.py +0 -0
  103. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/factorial.py +0 -0
  104. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/flatten.py +0 -0
  105. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/foreach.py +0 -0
  106. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/isoneof.py +0 -0
  107. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/multiloop.py +0 -0
  108. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/parallel_for.py +0 -0
  109. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/partition.py +0 -0
  110. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/powerset.py +0 -0
  111. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/subseteq.py +0 -0
  112. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/functions/types_subseteq.py +0 -0
  113. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/generators/__init__.py +0 -0
  114. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/generators/conditional_generator.py +0 -0
  115. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/generators/generator_from_stream.py +0 -0
  116. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/generators/join_generators.py +0 -0
  117. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/internet.py +0 -0
  118. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/io_.py +0 -0
  119. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/java/__init__.py +0 -0
  120. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/java/interfaces/__init__.py +0 -0
  121. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/java/interfaces/comparable.py +0 -0
  122. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/logging_/__init__.py +0 -0
  123. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/logging_/builtin_impls/__init__.py +0 -0
  124. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/logging_/builtin_impls/file_logger.py +0 -0
  125. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/logging_/builtin_impls/print_logger.py +0 -0
  126. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/logging_/log_level.py +0 -0
  127. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/logging_/logger.py +0 -0
  128. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/logging_/logger_strategy_impl_base.py +0 -0
  129. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/lombok/__init__.py +0 -0
  130. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/lombok/builder.py +0 -0
  131. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/math_/__init__.py +0 -0
  132. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/math_/constants.py +0 -0
  133. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/math_/functions.py +0 -0
  134. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/math_/math_print.py +0 -0
  135. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/math_/math_symbols.py +0 -0
  136. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/metaclasses/__init__.py +0 -0
  137. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/metaclasses/atomic_class_meta.py +0 -0
  138. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
  139. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/metaclasses/instance_cache_meta.py +0 -0
  140. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/metaclasses/interface.py +0 -0
  141. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/metaclasses/overload_meta.py +0 -0
  142. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/mock_/__init__.py +0 -0
  143. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/mock_/mock_database.py +0 -0
  144. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/mock_/mock_module.py +0 -0
  145. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/path.py +0 -0
  146. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/print_.py +0 -0
  147. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/progress_bar/__init__.py +0 -0
  148. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/progress_bar/ascii_progress_bar.py +0 -0
  149. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/progress_bar/progress_bar.py +0 -0
  150. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/progress_bar/progress_bar_pool.py +0 -0
  151. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/protocols/__init__.py +0 -0
  152. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/protocols/dictable.py +0 -0
  153. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/protocols/evaluable.py +0 -0
  154. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/protocols/serializable.py +0 -0
  155. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/py.typed +0 -0
  156. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/random_.py +0 -0
  157. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/__init__.py +0 -0
  158. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/argument_info.py +0 -0
  159. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/class_/__init__.py +0 -0
  160. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/class_/class_reflection.py +0 -0
  161. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/decoration_info.py +0 -0
  162. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/file/__init__.py +0 -0
  163. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/file/file_reflection.py +0 -0
  164. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/function/__init__.py +0 -0
  165. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/function/function_reflections.py +0 -0
  166. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/function_info.py +0 -0
  167. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/__init__.py +0 -0
  168. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/callstack.py +0 -0
  169. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/get_traceback.py +0 -0
  170. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/interpreter.py +0 -0
  171. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/is_debugging.py +0 -0
  172. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/os_.py +0 -0
  173. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/packages.py +0 -0
  174. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/python_version.py +0 -0
  175. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/signals.py +0 -0
  176. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/interpreter/tracer.py +0 -0
  177. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/module/__init__.py +0 -0
  178. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/module/module_reflections.py +0 -0
  179. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/reflection/module/package_reflection.py +0 -0
  180. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/__init__.py +0 -0
  181. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategies/__init__.py +0 -0
  182. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategies/constant_backoff.py +0 -0
  183. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategies/exponential_backoff.py +0 -0
  184. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategies/functional_backoff.py +0 -0
  185. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategies/linear_backoff.py +0 -0
  186. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategies/multiplicative_backoff.py +0 -0
  187. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategies/no_backoff.py +0 -0
  188. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/backoff_strategy.py +0 -0
  189. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/retry_executor/retry_executor.py +0 -0
  190. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/snippets/__init__.py +0 -0
  191. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/snippets/try_get.py +0 -0
  192. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/__init__.py +0 -0
  193. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/independent.py +0 -0
  194. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/layered_command.py +0 -0
  195. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/windows/__init__.py +0 -0
  196. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/windows/utils/__init__.py +0 -0
  197. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/windows/utils/filetime.py +0 -0
  198. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/windows/win32_ctime.py +0 -0
  199. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/system/windows/windows.py +0 -0
  200. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/testing/__init__.py +0 -0
  201. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/testing/unittest_/__init__.py +0 -0
  202. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/testing/unittest_/always_teardown_testcase.py +0 -0
  203. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/text.py +0 -0
  204. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/time.py +0 -0
  205. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/__init__.py +0 -0
  206. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/computability_and_complexity/__init__.py +0 -0
  207. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/computability_and_complexity/discreate_finite_automaton.py +0 -0
  208. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
  209. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/computability_and_complexity/languages/language.py +0 -0
  210. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/computability_and_complexity/languages/sat.py +0 -0
  211. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/computability_and_complexity/turing_machine.py +0 -0
  212. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/databases/__init__.py +0 -0
  213. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/databases/all.py +0 -0
  214. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/__init__.py +0 -0
  215. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/__init__.py +0 -0
  216. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/encoding.py +0 -0
  217. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/lossless/__init__.py +0 -0
  218. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
  219. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +0 -0
  220. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
  221. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/lossless/run_length.py +0 -0
  222. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/lossy/__init__.py +0 -0
  223. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +0 -0
  224. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
  225. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
  226. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
  227. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/tansformations/hough.py +0 -0
  228. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
  229. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/image_proccesing/tansformations/transformation.py +0 -0
  230. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/linear_algebra/__init__.py +0 -0
  231. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/linear_algebra/matrix.py +0 -0
  232. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/machine_learning/__init__.py +0 -0
  233. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/machine_learning/activation_functions/__init__.py +0 -0
  234. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/machine_learning/activation_functions/activation_function.py +0 -0
  235. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/machine_learning/activation_functions/relu.py +0 -0
  236. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/machine_learning/neuron.py +0 -0
  237. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/oop/__init__.py +0 -0
  238. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/oop/observer.py +0 -0
  239. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/oop/strategy.py +0 -0
  240. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/__init__.py +0 -0
  241. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
  242. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
  243. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
  244. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
  245. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
  246. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
  247. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
  248. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
  249. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
  250. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
  251. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
  252. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/distributions.py +0 -0
  253. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/expressions/__init__.py +0 -0
  254. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
  255. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/expressions/probability_expression.py +0 -0
  256. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/funcs/__init__.py +0 -0
  257. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/funcs/covariance.py +0 -0
  258. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/funcs/expected_value.py +0 -0
  259. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/funcs/probability_function.py +0 -0
  260. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/funcs/variance.py +0 -0
  261. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/operator.py +0 -0
  262. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/protocols.py +0 -0
  263. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/supp.py +0 -0
  264. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/university/probability/transformation.py +0 -0
  265. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils/versioned_imports.py +0 -0
  266. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils.egg-info/SOURCES.txt +0 -0
  267. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils.egg-info/dependency_links.txt +0 -0
  268. {danielutils-1.0.38 → danielutils-1.0.39}/danielutils.egg-info/top_level.txt +0 -0
  269. {danielutils-1.0.38 → danielutils-1.0.39}/setup.cfg +0 -0
  270. {danielutils-1.0.38 → danielutils-1.0.39}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 1.0.38
3
+ Version: 1.0.39
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,100 @@
1
+ import asyncio
2
+ import json
3
+ from collections import defaultdict
4
+ from datetime import datetime
5
+ from typing import Callable, Literal, Optional, Coroutine, List, Iterable, Any, Mapping, Tuple
6
+ from tqdm import tqdm
7
+
8
+
9
+ class AsyncWorkerPool:
10
+ DEFAULT_ORDER_IF_KEY_EXISTS = (
11
+ "pool", "timestamp", "worker_id", "task_id", "task_name", "num_tasks", "tasks", "level", "message", "exception"
12
+ )
13
+
14
+ def __init__(self, pool_name: str, num_workers: int = 5, show_pbar: bool = False) -> None:
15
+ self._num_workers: int = num_workers
16
+ self._pool_name: str = pool_name
17
+ self._show_pbar: bool = show_pbar
18
+ self._pbar: Optional[tqdm] = None
19
+ self._queue: asyncio.Queue[
20
+ Optional[Tuple[Callable, Iterable[Any], Mapping[Any, Any], Optional[str]]]] = asyncio.Queue()
21
+ self._workers: List = []
22
+
23
+ async def worker(self, worker_id) -> None:
24
+ """Worker coroutine that continuously fetches and executes tasks from the queue."""
25
+ task_index = 0
26
+ tasks = defaultdict(list)
27
+ while True:
28
+ task = await self._queue.get()
29
+ if task is None: # Sentinel value to shut down the worker
30
+ break
31
+ func, args, kwargs, name = task
32
+ task_index += 1
33
+ self._info(f"Started", task_id=task_index, task_name=name, worker_id=worker_id)
34
+ try:
35
+ await func(*args, **kwargs)
36
+ tasks["success"].append(name)
37
+ self._info(f"Finished", task_id=task_index, worker_id=worker_id, task_name=name)
38
+ except Exception as e:
39
+ self._error(f"Failed", task_id=task_index, exception=e, worker_id=worker_id,
40
+ task_name=name)
41
+ tasks["failure"].append(name)
42
+
43
+ if self._pbar:
44
+ self._pbar.update(1)
45
+ self._queue.task_done()
46
+ self._info(f"Done", worker_id=worker_id, tasks=tasks, num_tasks=task_index)
47
+
48
+ async def start(self) -> None:
49
+ """Starts the worker pool."""
50
+ if self._show_pbar:
51
+ self._pbar = tqdm(total=self._queue.qsize(), desc="#Tasks")
52
+ self._workers = [asyncio.create_task(self.worker(i + 1)) for i in range(self._num_workers)]
53
+
54
+ async def submit(
55
+ self,
56
+ func: Callable[..., Coroutine[None, None, None]],
57
+ args: Optional[Iterable[Any]] = None,
58
+ kwargs: Optional[Mapping[Any, Any]] = None,
59
+ name: Optional[str] = None
60
+ ) -> None:
61
+ """Submit a new task to the queue."""
62
+ await self._queue.put((func, args or (), kwargs or {}, name))
63
+
64
+ async def join(self) -> None:
65
+ """Stops the worker pool by waiting for all tasks to complete and shutting down workers."""
66
+ await self._queue.join() # Wait until all tasks are processed
67
+ for _ in range(self._num_workers):
68
+ await self._queue.put(None) # Send sentinel values to stop workers
69
+ await asyncio.gather(*self._workers) # Wait for workers to finish
70
+
71
+ @classmethod
72
+ def log(
73
+ self,
74
+ level: Literal["INFO", "WARNING", "ERROR"],
75
+ message: str,
76
+ order: Optional[Iterable[str]] = DEFAULT_ORDER_IF_KEY_EXISTS,
77
+ **kwargs
78
+ ) -> None:
79
+ kwargs["level"] = level
80
+ kwargs["message"] = message
81
+ kwargs["timestamp"] = datetime.now().isoformat()
82
+ ordered_kwargs = kwargs
83
+ if order:
84
+ ordered_kwargs = {key: kwargs[key] for key in order if key in kwargs}
85
+ ordered_kwargs.update(kwargs)
86
+ print(json.dumps(ordered_kwargs, default=str))
87
+
88
+ def _info(self, message: str, **kwargs) -> None:
89
+ self.log("INFO", message, pool=self._pool_name, **kwargs)
90
+
91
+ def _warn(self, message: str, **kwargs) -> None:
92
+ self.log("WARNING", message, pool=self._pool_name, **kwargs)
93
+
94
+ def _error(self, message: str, **kwargs) -> None:
95
+ self.log("ERROR", message, pool=self._pool_name, **kwargs)
96
+
97
+
98
+ __all__ = [
99
+ "AsyncWorkerPool",
100
+ ]
@@ -352,6 +352,12 @@ def __handle_type(params: tuple) -> bool:
352
352
  return False
353
353
 
354
354
 
355
+ def __handle_unpack(params: tuple) -> bool:
356
+ # TODO see test_tlist.py -> test_wrong_values -> with self.assertRaises(TypeError):
357
+ # tlist[Tuple[int]]([[1], [2], [3], ["4"]])
358
+ raise NotImplemented
359
+
360
+
355
361
  HANDLERS: Dict[type, Callable] = {
356
362
  list: __handle_list_set_iterable,
357
363
  tuple: __handle_tuple,
@@ -371,6 +377,13 @@ HANDLERS: Dict[type, Callable] = {
371
377
  Callable: __handle_callable,
372
378
  Protocol: __handle_protocol,
373
379
  }
380
+ try:
381
+ # This exists only from python version 3.11 onwards
382
+ from typing import Unpack
383
+
384
+ HANDLERS[Unpack] = __handle_unpack
385
+ except:
386
+ pass
374
387
 
375
388
 
376
389
  def isoftype(V: Any, T: Any, /, strict: bool = True) -> bool:
@@ -431,4 +444,4 @@ def isoftype(V: Any, T: Any, /, strict: bool = True) -> bool:
431
444
 
432
445
  __all__ = [
433
446
  "isoftype"
434
- ]
447
+ ]
@@ -26,7 +26,7 @@ class JavaInterface(ABC):
26
26
  print(set(info.inherited_methods))
27
27
  actual_func_names = set(f.name for f in info.functions)
28
28
  for to_remove in {"__class_getitem__", "__init_subclass__"}:
29
- if getattr(cls, to_remove, None) is getattr(JavaInterface, to_remove, None):
29
+ if hasattr(cls, to_remove) and getattr(cls, to_remove, None) is getattr(JavaInterface, to_remove, None):
30
30
  actual_func_names.remove(to_remove)
31
31
  for interface in (base for base in cls.__mro__ if getattr(base, "__is_interface__", False)):
32
32
  expected_func_names = set(f.name for f in ClassInfo(interface).abstract_methods)
@@ -20,7 +20,7 @@ del T, _A
20
20
 
21
21
  class ClassInfo:
22
22
  CLASS_DEFINITION_REGEX: re.Pattern = re.compile(
23
- r"(?P<decorations>[\s\S]*)?^class (?P<name>\w[\w\d]*)(?:\((?P<bases>.*)\))?:(?P<body>[\s\S]+)", re.MULTILINE)
23
+ r"(?P<decorations>[\s\S]*)?(^)?class (?P<name>\w[\w\d]*)(?:\((?P<bases>.*)\))?:(?P<body>[\s\S]+)", re.MULTILINE)
24
24
 
25
25
  # r"(?P<decorations>[\s\S]*)?^class (?P<name>\w[\w\d]*)(?:\((?P<bases>.*)\))?:(?P<body>[\s\S]+)"
26
26
 
@@ -42,7 +42,7 @@ class ClassInfo:
42
42
  m = ClassInfo.CLASS_DEFINITION_REGEX.match(self._src_code)
43
43
  if m is None:
44
44
  raise SyntaxError()
45
- decorators, name, bases, _ = m.groups()
45
+ decorators, name, bases, _ = m.groupdict().values()
46
46
  self._name = name
47
47
  self._bases = ArgumentInfo.from_str(bases)
48
48
  self._parse_body()
@@ -5,7 +5,8 @@ import unittest
5
5
  from inspect import iscoroutinefunction
6
6
  from typing import Callable, Type, Coroutine, Union, Any
7
7
 
8
- from ...io_ import create_directory, delete_directory
8
+ from ...random_ import RandomDataGenerator
9
+ from ...io_ import create_directory, delete_directory, directory_exists
9
10
  from ...path import get_current_working_directory, set_current_working_directory
10
11
 
11
12
 
@@ -18,10 +19,17 @@ def dispatch_function(func: Union[Callable, Coroutine], *args, **kwargs) -> Any:
18
19
  return func(*args, **kwargs)
19
20
 
20
21
 
22
+ def get_available_folder_name(prefix_path: str, random_suffix_length: int = 15) -> str:
23
+ res = f"{prefix_path}_{RandomDataGenerator.name(random_suffix_length)}"
24
+ while directory_exists(res):
25
+ res = f"{prefix_path}_{RandomDataGenerator.name(random_suffix_length)}"
26
+ return res
27
+
28
+
21
29
  def improved_setup(func: Callable) -> Callable:
22
30
  @functools.wraps(func)
23
31
  def wrapper(self):
24
- self.cwd = f"./{self.__class__.__name__}_test_folder"
32
+ self.cwd = get_available_folder_name(f"./{self.__class__.__name__}_test_folder")
25
33
  create_directory(self.cwd)
26
34
  self.prev_cwd = get_current_working_directory()
27
35
  set_current_working_directory(os.path.join(self.prev_cwd, self.cwd))
@@ -30,7 +38,7 @@ def improved_setup(func: Callable) -> Callable:
30
38
 
31
39
  @functools.wraps(func)
32
40
  async def async_wrapper(self):
33
- self.cwd = f"./{self.__class__.__name__}_test_folder"
41
+ self.cwd = get_available_folder_name(f"./{self.__class__.__name__}_test_folder")
34
42
  create_directory(self.cwd)
35
43
  self.prev_cwd = get_current_working_directory()
36
44
  set_current_working_directory(os.path.join(self.prev_cwd, self.cwd))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 1.0.38
3
+ Version: 1.0.39
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "danielutils"
7
- version = "1.0.38"
7
+ version = "1.0.39"
8
8
  authors = [
9
9
  { name = "danielnachumdev", email = "danielnachumdev@gmail.com" },
10
10
  ]
@@ -1,89 +0,0 @@
1
- import asyncio
2
- import json
3
- from datetime import datetime
4
- from typing import Callable, Literal, Optional, Coroutine, List, Iterable, Any, Mapping
5
-
6
-
7
- class AsyncWorkerPool:
8
- DEFAULT_ORDER_IF_KEY_EXISTS = (
9
- "pool", "timestamp", "worker", "task", "tasks", "level", "message", "exception"
10
- )
11
-
12
- def __init__(self, pool_name: str, num_workers: int = 5) -> None:
13
- self.num_workers = num_workers
14
- self.pool_name = pool_name
15
- self.queue = asyncio.Queue()
16
- self.workers = []
17
-
18
- async def worker(self, worker_id) -> None:
19
- """Worker coroutine that continuously fetches and executes tasks from the queue."""
20
- task_names = []
21
- task_index = 0
22
- while True:
23
- task = await self.queue.get()
24
- if task is None: # Sentinel value to shut down the worker
25
- break
26
- func, args, kwargs, name = task
27
- task_names.append(name)
28
- task_index = len(task_names)
29
- self.info(f"Started task {task_index}", task=name, worker_id=worker_id)
30
- try:
31
- await func(*args, **kwargs)
32
- except Exception as e:
33
- self.error(f"Failed task {task_index}", exception=e, worker_id=worker_id, task=name)
34
-
35
- self.info(f"Finished task {task_index}", worker_id=worker_id, task=name)
36
- self.queue.task_done()
37
- self.info(f"Done. Executed {task_index} tasks", worker_id=worker_id, tasks=task_names)
38
-
39
- async def start(self) -> None:
40
- """Starts the worker pool."""
41
- self.workers = [asyncio.create_task(self.worker(i + 1)) for i in range(self.num_workers)]
42
-
43
- async def submit(
44
- self,
45
- func: Callable[..., Coroutine[None, None, None]],
46
- args: Optional[Iterable[Any]] = None,
47
- kwargs: Optional[Mapping[Any, Any]] = None,
48
- name: Optional[str] = None
49
- ) -> None:
50
- """Submit a new task to the queue."""
51
- await self.queue.put((func, args or (), kwargs or {}, name))
52
-
53
- async def join(self) -> None:
54
- """Stops the worker pool by waiting for all tasks to complete and shutting down workers."""
55
- await self.queue.join() # Wait until all tasks are processed
56
- for _ in range(self.num_workers):
57
- await self.queue.put(None) # Send sentinel values to stop workers
58
- await asyncio.gather(*self.workers) # Wait for workers to finish
59
-
60
- @classmethod
61
- def log(
62
- self,
63
- level: Literal["INFO", "WARNING", "ERROR"],
64
- message: str,
65
- order: Optional[List[str]] = DEFAULT_ORDER_IF_KEY_EXISTS,
66
- **kwargs
67
- ) -> None:
68
- kwargs["level"] = level
69
- kwargs["message"] = message
70
- kwargs["timestamp"] = datetime.now().isoformat()
71
- ordered_kwargs = kwargs
72
- if order:
73
- ordered_kwargs = {key: kwargs[key] for key in order if key in kwargs}
74
- ordered_kwargs.update(kwargs)
75
- print(json.dumps(ordered_kwargs, default=str))
76
-
77
- def info(self, message: str, **kwargs) -> None:
78
- self.log("INFO", message, pool=self.pool_name, **kwargs)
79
-
80
- def warn(self, message: str, **kwargs) -> None:
81
- self.log("WARNING", message, pool=self.pool_name, **kwargs)
82
-
83
- def error(self, message: str, **kwargs) -> None:
84
- self.log("ERROR", message, pool=self.pool_name, **kwargs)
85
-
86
-
87
- __all__ = [
88
- "AsyncWorkerPool",
89
- ]
File without changes
File without changes
File without changes