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.
- danielutils-1.0.45/PKG-INFO +385 -0
- danielutils-1.0.45/README.md +349 -0
- danielutils-1.0.45/danielutils/abstractions/__init__.py +4 -0
- danielutils-1.0.45/danielutils/abstractions/db/__init__.py +10 -0
- danielutils-1.0.45/danielutils/abstractions/db/database.py +152 -0
- danielutils-1.0.45/danielutils/abstractions/db/database_definitions.py +228 -0
- danielutils-1.0.45/danielutils/abstractions/db/database_exceptions.py +27 -0
- danielutils-1.0.45/danielutils/abstractions/db/database_factory.py +58 -0
- danielutils-1.0.45/danielutils/abstractions/db/database_models.py +222 -0
- danielutils-1.0.45/danielutils/abstractions/db/dependencies.py +7 -0
- danielutils-1.0.45/danielutils/abstractions/db/implementations/__init__.py +4 -0
- danielutils-1.0.45/danielutils/abstractions/db/implementations/in_memory_database.py +366 -0
- danielutils-1.0.45/danielutils/abstractions/db/implementations/persistent_in_memory_database.py +176 -0
- danielutils-1.0.45/danielutils/abstractions/db/implementations/redis_database.py +414 -0
- danielutils-1.0.45/danielutils/abstractions/db/implementations/sqlite_database.py +493 -0
- danielutils-1.0.45/danielutils/abstractions/db/initializer.py +260 -0
- danielutils-1.0.45/danielutils/async_/async_worker_pool.py +107 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/isoftype.py +14 -1
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/java_interface.py +1 -1
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/class_info.py +2 -2
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/retry_executor.py +7 -1
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/unittest_/auto_cwd_testcase.py +11 -3
- danielutils-1.0.45/danielutils.egg-info/PKG-INFO +385 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils.egg-info/SOURCES.txt +13 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/pyproject.toml +1 -1
- danielutils-1.0.38/PKG-INFO +0 -74
- danielutils-1.0.38/README.md +0 -38
- danielutils-1.0.38/danielutils/abstractions/__init__.py +0 -3
- danielutils-1.0.38/danielutils/async_/async_worker_pool.py +0 -89
- danielutils-1.0.38/danielutils.egg-info/PKG-INFO +0 -74
- {danielutils-1.0.38 → danielutils-1.0.45}/LICENSE +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/MANIFEST.in +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/cached_database.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/database.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/database/redis_database.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/worker.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/abstractions/repl.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/aliases.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/async_cmd.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/async_layered_command.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/async_retry_executor.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/time_strategy.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/async_/utils.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/counter.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/frange.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/colors.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/attr_context.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/multi_context.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/optional_context.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/state_context.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/context_managers/temporary_file.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/convenience.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/main_conversions.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/custom_types.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/algorithms.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/comparer.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/default_dict.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/functions.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/binary_node.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/graph.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/multinode.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/graph/node.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/heap.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/max_heap.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/heap/min_heap.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/atomic_queue.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/priority_queue.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/queue/queue.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/stack.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/trees/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/data_structures/trees/binary_tree.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/date.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/date_time.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/atomic.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/attach.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/chain_decorators.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/decorate_conditionally.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/delay_call.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/deprecate.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/final.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/limit_recursion.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/memo.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/normalize_decorator.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/overload.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/partially_implemented.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/processify.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/property.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/singleton.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/threadify.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/timeout.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/total_ordering.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/decorators/validate.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/exceptions.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/file_specifications/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/areoneof.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/check_foreach.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/factorial.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/flatten.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/foreach.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/isoneof.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/multiloop.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/parallel_for.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/partition.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/powerset.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/subseteq.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/functions/types_subseteq.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/conditional_generator.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/generator_from_stream.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/generators/join_generators.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/internet.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/io_.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/interfaces/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/java/interfaces/comparable.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/builtin_impls/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/builtin_impls/file_logger.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/builtin_impls/print_logger.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/log_level.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/logger.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/logging_/logger_strategy_impl_base.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/lombok/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/lombok/builder.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/constants.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/functions.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/math_print.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/math_/math_symbols.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/atomic_class_meta.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/instance_cache_meta.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/interface.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/metaclasses/overload_meta.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/mock_/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/mock_/mock_database.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/mock_/mock_module.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/path.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/print_.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/ascii_progress_bar.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/progress_bar.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/progress_bar/progress_bar_pool.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/dictable.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/evaluable.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/protocols/serializable.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/py.typed +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/random_.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/argument_info.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/class_/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/class_/class_reflection.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/decoration_info.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/file/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/file/file_reflection.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/function/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/function/function_reflections.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/function_info.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/callstack.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/get_traceback.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/interpreter.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/is_debugging.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/os_.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/packages.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/python_version.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/signals.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/interpreter/tracer.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/module/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/module/module_reflections.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/reflection/module/package_reflection.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/constant_backoff.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/exponential_backoff.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/functional_backoff.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/linear_backoff.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/multiplicative_backoff.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategies/no_backoff.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/retry_executor/backoff_strategy.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/snippets/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/snippets/try_get.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/independent.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/layered_command.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/utils/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/utils/filetime.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/win32_ctime.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/system/windows/windows.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/unittest_/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/testing/unittest_/always_teardown_testcase.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/text.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/time.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/discreate_finite_automaton.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/languages/language.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/languages/sat.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/computability_and_complexity/turing_machine.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/databases/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/databases/all.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/encoding.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossless/run_length.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossy/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/hough.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/image_proccesing/tansformations/transformation.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/linear_algebra/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/linear_algebra/matrix.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/activation_functions/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/activation_functions/activation_function.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/activation_functions/relu.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/machine_learning/neuron.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/oop/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/oop/observer.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/oop/strategy.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/distributions.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/expressions/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/expressions/probability_expression.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/__init__.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/covariance.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/expected_value.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/probability_function.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/funcs/variance.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/operator.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/protocols.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/supp.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/university/probability/transformation.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils/versioned_imports.py +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils.egg-info/dependency_links.txt +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/danielutils.egg-info/top_level.txt +0 -0
- {danielutils-1.0.38 → danielutils-1.0.45}/setup.cfg +0 -0
- {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
|
+
[](https://github.com/danielnachumdev/danielutils/actions/workflows/python-package.yml)
|
|
38
|
+
[](https://github.com/danielnachumdev/danielutils/actions/workflows/pylint.yml)
|
|
39
|
+
[](https://www.python.org/downloads/)
|
|
40
|
+
[](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml)
|
|
41
|
+
[](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**
|