danielutils 1.0.38__tar.gz → 1.0.45__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 (287) hide show
  1. danielutils-1.0.45/PKG-INFO +385 -0
  2. danielutils-1.0.45/README.md +349 -0
  3. danielutils-1.0.45/danielutils/abstractions/__init__.py +4 -0
  4. danielutils-1.0.45/danielutils/abstractions/db/__init__.py +10 -0
  5. danielutils-1.0.45/danielutils/abstractions/db/database.py +152 -0
  6. danielutils-1.0.45/danielutils/abstractions/db/database_definitions.py +228 -0
  7. danielutils-1.0.45/danielutils/abstractions/db/database_exceptions.py +27 -0
  8. danielutils-1.0.45/danielutils/abstractions/db/database_factory.py +58 -0
  9. danielutils-1.0.45/danielutils/abstractions/db/database_models.py +222 -0
  10. danielutils-1.0.45/danielutils/abstractions/db/dependencies.py +7 -0
  11. danielutils-1.0.45/danielutils/abstractions/db/implementations/__init__.py +4 -0
  12. danielutils-1.0.45/danielutils/abstractions/db/implementations/in_memory_database.py +366 -0
  13. danielutils-1.0.45/danielutils/abstractions/db/implementations/persistent_in_memory_database.py +176 -0
  14. danielutils-1.0.45/danielutils/abstractions/db/implementations/redis_database.py +414 -0
  15. danielutils-1.0.45/danielutils/abstractions/db/implementations/sqlite_database.py +493 -0
  16. danielutils-1.0.45/danielutils/abstractions/db/initializer.py +260 -0
  17. danielutils-1.0.45/danielutils/async_/async_worker_pool.py +107 -0
  18. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/isoftype.py +14 -1
  19. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/java_interface.py +1 -1
  20. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/class_info.py +2 -2
  21. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/retry_executor.py +7 -1
  22. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/unittest_/auto_cwd_testcase.py +11 -3
  23. danielutils-1.0.45/danielutils.egg-info/PKG-INFO +385 -0
  24. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils.egg-info/SOURCES.txt +13 -0
  25. {danielutils-1.0.38 → danielutils-1.0.45}/pyproject.toml +1 -1
  26. danielutils-1.0.38/PKG-INFO +0 -74
  27. danielutils-1.0.38/README.md +0 -38
  28. danielutils-1.0.38/danielutils/abstractions/__init__.py +0 -3
  29. danielutils-1.0.38/danielutils/async_/async_worker_pool.py +0 -89
  30. danielutils-1.0.38/danielutils.egg-info/PKG-INFO +0 -74
  31. {danielutils-1.0.38 → danielutils-1.0.45}/LICENSE +0 -0
  32. {danielutils-1.0.38 → danielutils-1.0.45}/MANIFEST.in +0 -0
  33. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/__init__.py +0 -0
  34. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/__init__.py +0 -0
  35. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/cached_database.py +0 -0
  36. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/database.py +0 -0
  37. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/redis_database.py +0 -0
  38. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
  39. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
  40. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/worker.py +0 -0
  41. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
  42. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/repl.py +0 -0
  43. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/aliases.py +0 -0
  44. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/__init__.py +0 -0
  45. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/async_cmd.py +0 -0
  46. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/async_layered_command.py +0 -0
  47. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/async_retry_executor.py +0 -0
  48. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/time_strategy.py +0 -0
  49. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/utils.py +0 -0
  50. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/__init__.py +0 -0
  51. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/counter.py +0 -0
  52. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/frange.py +0 -0
  53. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
  54. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
  55. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
  56. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
  57. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
  58. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
  59. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/colors.py +0 -0
  60. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/__init__.py +0 -0
  61. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/attr_context.py +0 -0
  62. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/multi_context.py +0 -0
  63. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/optional_context.py +0 -0
  64. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/state_context.py +0 -0
  65. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/temporary_file.py +0 -0
  66. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/convenience.py +0 -0
  67. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/__init__.py +0 -0
  68. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/main_conversions.py +0 -0
  69. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
  70. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
  71. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
  72. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/custom_types.py +0 -0
  73. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/__init__.py +0 -0
  74. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/algorithms.py +0 -0
  75. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/comparer.py +0 -0
  76. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/default_dict.py +0 -0
  77. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/functions.py +0 -0
  78. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/__init__.py +0 -0
  79. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/binary_node.py +0 -0
  80. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/graph.py +0 -0
  81. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/multinode.py +0 -0
  82. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/node.py +0 -0
  83. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/__init__.py +0 -0
  84. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/heap.py +0 -0
  85. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/max_heap.py +0 -0
  86. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/min_heap.py +0 -0
  87. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/__init__.py +0 -0
  88. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/atomic_queue.py +0 -0
  89. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/priority_queue.py +0 -0
  90. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/queue.py +0 -0
  91. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/stack.py +0 -0
  92. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/trees/__init__.py +0 -0
  93. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
  94. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/trees/binary_tree.py +0 -0
  95. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/date.py +0 -0
  96. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/date_time.py +0 -0
  97. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/__init__.py +0 -0
  98. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/atomic.py +0 -0
  99. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/attach.py +0 -0
  100. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/chain_decorators.py +0 -0
  101. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/decorate_conditionally.py +0 -0
  102. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/delay_call.py +0 -0
  103. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/deprecate.py +0 -0
  104. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/final.py +0 -0
  105. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/limit_recursion.py +0 -0
  106. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/memo.py +0 -0
  107. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/normalize_decorator.py +0 -0
  108. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/overload.py +0 -0
  109. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/partially_implemented.py +0 -0
  110. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/processify.py +0 -0
  111. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/property.py +0 -0
  112. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/singleton.py +0 -0
  113. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/threadify.py +0 -0
  114. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/timeout.py +0 -0
  115. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/total_ordering.py +0 -0
  116. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/validate.py +0 -0
  117. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/exceptions.py +0 -0
  118. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/file_specifications/__init__.py +0 -0
  119. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/__init__.py +0 -0
  120. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/areoneof.py +0 -0
  121. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/check_foreach.py +0 -0
  122. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/factorial.py +0 -0
  123. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/flatten.py +0 -0
  124. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/foreach.py +0 -0
  125. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/isoneof.py +0 -0
  126. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/multiloop.py +0 -0
  127. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/parallel_for.py +0 -0
  128. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/partition.py +0 -0
  129. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/powerset.py +0 -0
  130. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/subseteq.py +0 -0
  131. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/types_subseteq.py +0 -0
  132. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/__init__.py +0 -0
  133. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/conditional_generator.py +0 -0
  134. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/generator_from_stream.py +0 -0
  135. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/join_generators.py +0 -0
  136. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/internet.py +0 -0
  137. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/io_.py +0 -0
  138. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/__init__.py +0 -0
  139. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/interfaces/__init__.py +0 -0
  140. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/interfaces/comparable.py +0 -0
  141. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/__init__.py +0 -0
  142. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/builtin_impls/__init__.py +0 -0
  143. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/builtin_impls/file_logger.py +0 -0
  144. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/builtin_impls/print_logger.py +0 -0
  145. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/log_level.py +0 -0
  146. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/logger.py +0 -0
  147. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/logger_strategy_impl_base.py +0 -0
  148. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/lombok/__init__.py +0 -0
  149. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/lombok/builder.py +0 -0
  150. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/__init__.py +0 -0
  151. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/constants.py +0 -0
  152. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/functions.py +0 -0
  153. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/math_print.py +0 -0
  154. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/math_symbols.py +0 -0
  155. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/__init__.py +0 -0
  156. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/atomic_class_meta.py +0 -0
  157. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
  158. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/instance_cache_meta.py +0 -0
  159. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/interface.py +0 -0
  160. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/overload_meta.py +0 -0
  161. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/mock_/__init__.py +0 -0
  162. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/mock_/mock_database.py +0 -0
  163. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/mock_/mock_module.py +0 -0
  164. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/path.py +0 -0
  165. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/print_.py +0 -0
  166. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/__init__.py +0 -0
  167. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/ascii_progress_bar.py +0 -0
  168. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/progress_bar.py +0 -0
  169. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/progress_bar_pool.py +0 -0
  170. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/__init__.py +0 -0
  171. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/dictable.py +0 -0
  172. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/evaluable.py +0 -0
  173. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/serializable.py +0 -0
  174. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/py.typed +0 -0
  175. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/random_.py +0 -0
  176. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/__init__.py +0 -0
  177. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/argument_info.py +0 -0
  178. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/class_/__init__.py +0 -0
  179. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/class_/class_reflection.py +0 -0
  180. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/decoration_info.py +0 -0
  181. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/file/__init__.py +0 -0
  182. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/file/file_reflection.py +0 -0
  183. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/function/__init__.py +0 -0
  184. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/function/function_reflections.py +0 -0
  185. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/function_info.py +0 -0
  186. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/__init__.py +0 -0
  187. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/callstack.py +0 -0
  188. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/get_traceback.py +0 -0
  189. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/interpreter.py +0 -0
  190. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/is_debugging.py +0 -0
  191. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/os_.py +0 -0
  192. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/packages.py +0 -0
  193. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/python_version.py +0 -0
  194. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/signals.py +0 -0
  195. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/tracer.py +0 -0
  196. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/module/__init__.py +0 -0
  197. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/module/module_reflections.py +0 -0
  198. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/module/package_reflection.py +0 -0
  199. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/__init__.py +0 -0
  200. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/__init__.py +0 -0
  201. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/constant_backoff.py +0 -0
  202. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/exponential_backoff.py +0 -0
  203. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/functional_backoff.py +0 -0
  204. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/linear_backoff.py +0 -0
  205. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/multiplicative_backoff.py +0 -0
  206. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/no_backoff.py +0 -0
  207. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategy.py +0 -0
  208. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/snippets/__init__.py +0 -0
  209. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/snippets/try_get.py +0 -0
  210. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/__init__.py +0 -0
  211. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/independent.py +0 -0
  212. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/layered_command.py +0 -0
  213. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/__init__.py +0 -0
  214. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/utils/__init__.py +0 -0
  215. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/utils/filetime.py +0 -0
  216. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/win32_ctime.py +0 -0
  217. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/windows.py +0 -0
  218. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/__init__.py +0 -0
  219. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/unittest_/__init__.py +0 -0
  220. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/unittest_/always_teardown_testcase.py +0 -0
  221. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/text.py +0 -0
  222. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/time.py +0 -0
  223. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/__init__.py +0 -0
  224. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/__init__.py +0 -0
  225. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/discreate_finite_automaton.py +0 -0
  226. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
  227. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/languages/language.py +0 -0
  228. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/languages/sat.py +0 -0
  229. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/turing_machine.py +0 -0
  230. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/databases/__init__.py +0 -0
  231. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/databases/all.py +0 -0
  232. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/__init__.py +0 -0
  233. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/__init__.py +0 -0
  234. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/encoding.py +0 -0
  235. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/__init__.py +0 -0
  236. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
  237. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +0 -0
  238. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
  239. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/run_length.py +0 -0
  240. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossy/__init__.py +0 -0
  241. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +0 -0
  242. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
  243. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
  244. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
  245. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/hough.py +0 -0
  246. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
  247. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/transformation.py +0 -0
  248. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/linear_algebra/__init__.py +0 -0
  249. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/linear_algebra/matrix.py +0 -0
  250. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/__init__.py +0 -0
  251. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/activation_functions/__init__.py +0 -0
  252. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/activation_functions/activation_function.py +0 -0
  253. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/activation_functions/relu.py +0 -0
  254. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/neuron.py +0 -0
  255. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/oop/__init__.py +0 -0
  256. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/oop/observer.py +0 -0
  257. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/oop/strategy.py +0 -0
  258. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/__init__.py +0 -0
  259. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
  260. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
  261. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
  262. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
  263. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
  264. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
  265. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
  266. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
  267. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
  268. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
  269. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
  270. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/distributions.py +0 -0
  271. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/expressions/__init__.py +0 -0
  272. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
  273. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/expressions/probability_expression.py +0 -0
  274. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/__init__.py +0 -0
  275. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/covariance.py +0 -0
  276. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/expected_value.py +0 -0
  277. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/probability_function.py +0 -0
  278. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/variance.py +0 -0
  279. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/operator.py +0 -0
  280. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/protocols.py +0 -0
  281. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/supp.py +0 -0
  282. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/transformation.py +0 -0
  283. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/versioned_imports.py +0 -0
  284. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils.egg-info/dependency_links.txt +0 -0
  285. {danielutils-1.0.38 → danielutils-1.0.45}/danielutils.egg-info/top_level.txt +0 -0
  286. {danielutils-1.0.38 → danielutils-1.0.45}/setup.cfg +0 -0
  287. {danielutils-1.0.38 → danielutils-1.0.45}/setup.py +0 -0
@@ -0,0 +1,385 @@
1
+ Metadata-Version: 2.1
2
+ Name: danielutils
3
+ Version: 1.0.45
4
+ Summary: A python utils library for things I find useful
5
+ Author-email: danielnachumdev <danielnachumdev@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2022 danielnachumdev
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+ Project-URL: Homepage, https://github.com/danielnachumdev/danielutils
28
+ Project-URL: Bug Tracker, https://github.com/danielnachumdev/danielutils/issues
29
+ Classifier: Development Status :: 3 - Alpha
30
+ Classifier: Intended Audience :: Developers
31
+ Classifier: Programming Language :: Python :: 3
32
+ Classifier: Operating System :: Microsoft :: Windows
33
+ Requires-Python: >=3.8.0
34
+ Description-Content-Type: text/markdown
35
+ License-File: LICENSE
36
+
37
+ [![Python package](https://github.com/danielnachumdev/danielutils/actions/workflows/python-package.yml/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/python-package.yml)
38
+ [![Pylint](https://github.com/danielnachumdev/danielutils/actions/workflows/pylint.yml/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/pylint.yml)
39
+ [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
40
+ [![gitleaks](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml)
41
+ [![CodeQL](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql)
42
+
43
+ # danielutils v1.0.39
44
+
45
+ A comprehensive Python utilities library designed to enhance your development workflow with powerful tools for type safety, async programming, database operations, and much more.
46
+
47
+ **Features:**
48
+ - 🎯 **Type Safety**: Advanced type checking, validation, and typed collections
49
+ - ⚡ **Async Support**: Comprehensive async utilities and worker pools
50
+ - 🗄️ **Database Abstractions**: Multi-backend database support (SQLite, Redis, In-Memory)
51
+ - 🔄 **Retry Logic**: Configurable retry executors with multiple backoff strategies
52
+ - 📊 **Data Structures**: Enhanced collections, graphs, heaps, and algorithms
53
+ - 🎨 **Developer Experience**: Progress bars, logging, reflection, and debugging tools
54
+ - 🧮 **Academic Tools**: Probability theory and statistical functions
55
+
56
+ **Tested Python versions**: `3.8.0+`, `3.9.0`, `3.10.13`, `3.11+`
57
+
58
+ > **Note**: This package is actively developed and subject to change. Use at your own risk!
59
+
60
+ ## 🚀 Quick Start
61
+
62
+ ```python
63
+ from danielutils import isoftype, validate, tlist
64
+ from danielutils.abstractions.db import DatabaseFactory
65
+ from danielutils.abstractions.db.database_definitions import TableSchema, TableColumn, ColumnType
66
+
67
+ # Type-safe list with runtime validation
68
+ numbers = tlist[int]([1, 2, 3, 4, 5])
69
+
70
+ # Function validation
71
+ @validate
72
+ def greet(name: str, age: int) -> str:
73
+ return f"Hello {name}, you are {age} years old"
74
+
75
+ # Database operations
76
+ db = DatabaseFactory.get_database("memory") # In-memory database
77
+ with db:
78
+ # Create a table
79
+ schema = TableSchema(
80
+ name="users",
81
+ columns=[
82
+ TableColumn(name="id", type=ColumnType.AUTOINCREMENT, primary_key=True),
83
+ TableColumn(name="name", type=ColumnType.TEXT, nullable=False),
84
+ TableColumn(name="age", type=ColumnType.INTEGER)
85
+ ]
86
+ )
87
+ db.create_table(schema)
88
+
89
+ # Insert data
90
+ user_id = db.insert("users", {"name": "Alice", "age": 30})
91
+
92
+ # Advanced type checking
93
+ if isoftype(numbers, list[int]):
94
+ print("Numbers is a list of integers!")
95
+ ```
96
+
97
+ ## 📚 Documentation
98
+
99
+ In the [`./READMES/`](./READMES/) folder you can find detailed documentation for key features:
100
+
101
+ ### Core Features
102
+
103
+ #### [`isoftype`](./READMES/isoftype.md)
104
+ **Advanced Type Checking System**
105
+ - Runtime type validation with support for complex types
106
+ - Parametrized generics and union types
107
+ - Protocol and interface checking
108
+ - Enhanced type safety for your applications
109
+
110
+ #### [`@overload`](./READMES/overload.md)
111
+ **Function Overloading Made Easy**
112
+ - Manage multiple function signatures
113
+ - Type-safe function overloading
114
+ - Simplified API design with clear type hints
115
+
116
+ #### [`@validate`](./READMES/validate.md)
117
+ **Runtime Type Validation**
118
+ - Protect your functions with automatic argument validation
119
+ - Catch type-related errors early
120
+ - Enhanced debugging and error messages
121
+
122
+ #### [`tlist`](./READMES/tlist.md)
123
+ **Type-Safe Collections**
124
+ - Runtime type validation for lists
125
+ - Enhanced list operations with type safety
126
+ - Seamless integration with existing code
127
+
128
+ #### [`Interface`](./READMES/Interface.md)
129
+ **Python Interface Implementation**
130
+ - Create interface-like behavior using metaclasses
131
+ - Abstract class patterns
132
+ - Enhanced object-oriented programming
133
+
134
+ ## 🛠️ Major Features
135
+
136
+ ### Database Abstractions (`@/db`)
137
+ ```python
138
+ from danielutils.abstractions.db import DatabaseFactory
139
+ from danielutils.abstractions.db.database_definitions import (
140
+ TableSchema, TableColumn, ColumnType, SelectQuery, WhereClause, Condition, Operator
141
+ )
142
+
143
+ # Get different database backends
144
+ sqlite_db = DatabaseFactory.get_database("sqlite", db_kwargs={"db_path": "test.db"})
145
+ memory_db = DatabaseFactory.get_database("memory")
146
+
147
+ # Create table schema
148
+ schema = TableSchema(
149
+ name="products",
150
+ columns=[
151
+ TableColumn(name="id", type=ColumnType.AUTOINCREMENT, primary_key=True),
152
+ TableColumn(name="name", type=ColumnType.TEXT, nullable=False),
153
+ TableColumn(name="price", type=ColumnType.FLOAT),
154
+ TableColumn(name="category", type=ColumnType.TEXT)
155
+ ]
156
+ )
157
+
158
+ # Use database with context manager
159
+ with memory_db:
160
+ memory_db.create_table(schema)
161
+
162
+ # Insert data
163
+ product_id = memory_db.insert("products", {
164
+ "name": "Laptop",
165
+ "price": 999.99,
166
+ "category": "Electronics"
167
+ })
168
+
169
+ # Query data
170
+ query = SelectQuery(
171
+ table="products",
172
+ where=WhereClause(
173
+ conditions=[
174
+ Condition(column="category", operator=Operator.EQ, value="Electronics")
175
+ ]
176
+ )
177
+ )
178
+ results = memory_db.get(query)
179
+ ```
180
+
181
+ ### Async Programming
182
+ ```python
183
+ import asyncio
184
+ from danielutils.async_ import AsyncWorkerPool, AsyncLayeredCommand
185
+
186
+ async def process_item(item: str) -> None:
187
+ """Async function to process items"""
188
+ await asyncio.sleep(0.1) # Simulate work
189
+ print(f"Processed: {item}")
190
+
191
+ async def main():
192
+ # Async worker pool
193
+ pool = AsyncWorkerPool("data_processor", num_workers=3, show_pbar=True)
194
+ await pool.start()
195
+
196
+ # Submit tasks
197
+ items = ["item1", "item2", "item3", "item4", "item5"]
198
+ for item in items:
199
+ await pool.submit(process_item, args=(item,), name=f"process_{item}")
200
+
201
+ # Wait for completion
202
+ await pool.join()
203
+
204
+ # Async command execution
205
+ async with AsyncLayeredCommand("echo") as cmd:
206
+ result = await cmd.execute("Hello from async command")
207
+ print(f"Command output: {result}")
208
+
209
+ # Run the async example
210
+ asyncio.run(main())
211
+ ```
212
+
213
+ ### Retry Executors
214
+ ```python
215
+ from danielutils.retry_executor import RetryExecutor
216
+ from danielutils.retry_executor.backoff_strategies import ExponentialBackOffStrategy
217
+
218
+ def unreliable_function() -> str:
219
+ """Function that might fail"""
220
+ import random
221
+ if random.random() < 0.7: # 70% chance of failure
222
+ raise ValueError("Random failure")
223
+ return "Success!"
224
+
225
+ # Create retry executor with exponential backoff
226
+ backoff = ExponentialBackOffStrategy(initial=1000) # 1 second initial delay
227
+ executor = RetryExecutor(backoff_strategy=backoff)
228
+
229
+ # Execute with retry logic
230
+ result = executor.execute(unreliable_function, max_retries=3)
231
+ if result:
232
+ print(f"Function succeeded: {result}")
233
+ else:
234
+ print("Function failed after all retries")
235
+ ```
236
+
237
+ ### Data Structures
238
+ ```python
239
+ from danielutils.data_structures import Graph, MinHeap, PriorityQueue
240
+ from danielutils.better_builtins import tlist, tdict
241
+ from typing import Any
242
+ from danielutils.data_structures.graph import MultiNode
243
+
244
+ # Type-safe collections
245
+ users = tlist[str](["alice", "bob", "charlie"])
246
+ config = tdict[str, Any]({"debug": True, "port": 8080})
247
+
248
+ # Advanced data structures
249
+ graph = Graph()
250
+ node_a = MultiNode("A")
251
+ node_b = MultiNode("B")
252
+ node_a.add_child(node_b)
253
+ graph.add_node(node_a)
254
+
255
+ # Priority queue with custom objects
256
+ class Task:
257
+ def __init__(self, name: str, priority: int):
258
+ self.name = name
259
+ self.priority = priority
260
+
261
+ def __lt__(self, other):
262
+ return self.priority < other.priority
263
+
264
+ queue = PriorityQueue[Task]()
265
+ queue.push(Task("high_priority", 1))
266
+ queue.push(Task("low_priority", 3))
267
+ queue.push(Task("medium_priority", 2))
268
+
269
+ # Min heap
270
+ heap = MinHeap[int]()
271
+ heap.push(5)
272
+ heap.push(2)
273
+ heap.push(8)
274
+ heap.push(1)
275
+
276
+ print(f"Min value: {heap.peek()}") # 1
277
+ ```
278
+
279
+ ### Progress Tracking
280
+ ```python
281
+ from danielutils.progress_bar import ProgressBarPool, AsciiProgressBar
282
+
283
+ # Single progress bar
284
+ with AsciiProgressBar(range(100), position=0, desc="Processing") as pbar:
285
+ for i in pbar:
286
+ # Do some work
287
+ import time
288
+ time.sleep(0.01)
289
+
290
+ # Multiple progress bars
291
+ with ProgressBarPool(AsciiProgressBar, num_of_bars=2) as pool:
292
+ # Configure individual bars
293
+ pool[0].update(50) # Update first bar
294
+ pool[1].update(25) # Update second bar
295
+
296
+ # Write messages
297
+ pool.write("Processing complete!")
298
+ ```
299
+
300
+ ### Reflection & Debugging
301
+ ```python
302
+ from danielutils.reflection import FunctionInfo, ClassInfo
303
+ from danielutils.reflection.interpreter import is_debugging
304
+
305
+ def example_function(name: str, age: int = 25) -> str:
306
+ """Example function for reflection"""
307
+ return f"Hello {name}, age {age}"
308
+
309
+ # Function introspection
310
+ info = FunctionInfo(example_function, type)
311
+ print(f"Function name: {info.name}")
312
+ print(f"Parameters: {info.arguments}")
313
+ print(f"Return type: {info.return_type}")
314
+
315
+ # Class introspection
316
+ class ExampleClass:
317
+ def __init__(self, value: int):
318
+ self.value = value
319
+
320
+ def get_value(self) -> int:
321
+ return self.value
322
+
323
+ class_info = ClassInfo(ExampleClass)
324
+ print(f"Class methods: {[f.name for f in class_info.instance_methods]}")
325
+
326
+ # Runtime debugging detection
327
+ if is_debugging():
328
+ print("Running in debug mode")
329
+ ```
330
+
331
+ ## 🎓 Academic & Research Tools
332
+
333
+ ### Probability Theory
334
+ ```python
335
+ from danielutils.university.probability import Distribution
336
+ from danielutils.university.probability.funcs import expected_value
337
+ from danielutils.university.probability.operator import Operator
338
+
339
+ # Create probability distributions
340
+ bernoulli = Distribution.Discrete.Ber(p=0.5) # Bernoulli with p=0.5
341
+ binomial = Distribution.Discrete.Bin(n=10, p=0.3) # Binomial with n=10, p=0.3
342
+
343
+ # Calculate probabilities
344
+ prob_1 = bernoulli.evaluate(1, Operator.EQ) # P(X=1)
345
+ prob_0 = bernoulli.evaluate(0, Operator.EQ) # P(X=0)
346
+
347
+ # Calculate expected values
348
+ expected_bernoulli = expected_value(bernoulli)
349
+ expected_binomial = expected_value(binomial)
350
+
351
+ print(f"Bernoulli P(X=1): {prob_1}")
352
+ print(f"Bernoulli E[X]: {expected_bernoulli}")
353
+ ```
354
+
355
+ ## 🔧 Installation
356
+
357
+ ```bash
358
+ pip install danielutils
359
+ ```
360
+
361
+ ## 📈 Project Status
362
+
363
+ This library has evolved significantly since its initial release in September 2022:
364
+
365
+ - **2022**: Basic utilities and foundational features (v0.5.x - v0.7.x)
366
+ - **2023**: Major development with typed builtins and code quality (v0.8.x - v0.9.x)
367
+ - **2024**: Mature library with async support and advanced features (v0.9.x - v1.0.x)
368
+ - **2025**: Production-ready with database abstractions and enterprise features (v1.0.x+)
369
+
370
+ ## 🤝 Contributing
371
+
372
+ Feel free to use, contribute, and improve this code! The project welcomes:
373
+
374
+ - Bug reports and feature requests
375
+ - Code contributions and improvements
376
+ - Documentation enhancements
377
+ - Test coverage improvements
378
+
379
+ ## 📄 License
380
+
381
+ This project is licensed under the terms specified in the [LICENSE](./LICENSE) file.
382
+
383
+ ---
384
+
385
+ **Built with ❤️ for the Python community**