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