danielutils 0.9.90__tar.gz → 0.9.91__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-0.9.90/danielutils.egg-info → danielutils-0.9.91}/PKG-INFO +1 -1
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/__init__.py +2 -1
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/aliases.py +6 -7
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/progress_bar/ascii_progress_bar.py +2 -3
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/progress_bar/progress_bar.py +6 -1
- danielutils-0.9.91/danielutils/retry_executor/__init__.py +3 -0
- danielutils-0.9.91/danielutils/retry_executor/backoff_strategies/__init__.py +3 -0
- danielutils-0.9.91/danielutils/retry_executor/backoff_strategies/constant_backoff.py +19 -0
- danielutils-0.9.91/danielutils/retry_executor/backoff_strategies/exponential_backoff.py +21 -0
- danielutils-0.9.91/danielutils/retry_executor/backoff_strategies/no_backoff.py +12 -0
- danielutils-0.9.91/danielutils/retry_executor/backoff_strategy.py +22 -0
- danielutils-0.9.91/danielutils/retry_executor/retry_executor.py +37 -0
- danielutils-0.9.91/danielutils/testing/__init__.py +1 -0
- danielutils-0.9.91/danielutils/testing/unittest_/__init__.py +2 -0
- danielutils-0.9.91/danielutils/testing/unittest_/always_teardown_testcase.py +37 -0
- danielutils-0.9.91/danielutils/testing/unittest_/auto_cwd_testcase.py +49 -0
- {danielutils-0.9.90 → danielutils-0.9.91/danielutils.egg-info}/PKG-INFO +1 -1
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils.egg-info/SOURCES.txt +11 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/pyproject.toml +1 -1
- {danielutils-0.9.90 → danielutils-0.9.91}/LICENSE +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/MANIFEST.in +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/README.md +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/database/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/database/cached_database.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/database/database.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/database/redis_database.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/worker.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/repl.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/counter.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/frange.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/colors.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/context_managers/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/context_managers/attr_context.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/context_managers/multi_context.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/context_managers/optional_context.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/context_managers/state_context.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/context_managers/temporary_file.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/convenience.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/conversions/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/conversions/main_conversions.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/custom_types.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/algorithms.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/comparer.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/default_dict.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/functions.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/graph/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/graph/binary_node.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/graph/graph.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/graph/multinode.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/graph/node.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/heap/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/heap/heap.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/heap/max_heap.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/heap/min_heap.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/queue/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/queue/atomic_queue.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/queue/priority_queue.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/queue/queue.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/stack.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/trees/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/trees/binary_tree.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/date.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/date_time.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/atomic.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/attach.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/chain_decorators.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/decorate_conditionally.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/delay_call.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/deprecate.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/final.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/limit_recursion.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/memo.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/overload.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/partially_implemented.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/processify.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/property.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/singleton.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/threadify.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/timeout.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/total_ordering.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/decorators/validate.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/exceptions.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/file_specifications/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/areoneof.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/check_foreach.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/factorial.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/flatten.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/foreach.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/isoftype.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/isoneof.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/multiloop.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/parallel_for.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/partition.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/powerset.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/subseteq.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/functions/types_subseteq.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/generators/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/generators/conditional_generator.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/generators/generator_from_stream.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/generators/join_generators.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/internet.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/io_.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/math_/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/math_/constants.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/math_/functions.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/math_/math_print.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/math_/math_symbols.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/metaclasses/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/metaclasses/atomic_class_meta.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/metaclasses/instance_cache_meta.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/metaclasses/interface.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/metaclasses/overload_meta.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/mock_/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/mock_/mock_database.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/mock_/mock_module.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/path.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/print_.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/progress_bar/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/progress_bar/progress_bar_pool.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/protocols/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/protocols/dictable.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/protocols/evaluable.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/protocols/serializable.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/py.typed +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/class_/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/class_/class_reflection.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/file/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/file/file_reflection.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/function/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/function/function_reflections.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/callstack.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/get_traceback.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/os_.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/packages.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/python_version.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/signals.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/interpreter/tracer.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/module/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/module/module_reflections.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/reflection/module/package_reflection.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/snippets/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/snippets/try_get.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/independent.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/layered_command.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/windows/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/windows/utils/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/windows/utils/filetime.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/windows/win32_ctime.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/system/windows/windows.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/text.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/time.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/computability_and_complexity/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/computability_and_complexity/discreate_finite_automaton.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/computability_and_complexity/languages/language.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/computability_and_complexity/languages/sat.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/computability_and_complexity/turing_machine.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/databases/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/databases/all.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/encoding.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/lossless/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/lossless/run_length.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/lossy/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/tansformations/hough.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/image_proccesing/tansformations/transformation.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/linear_algebra/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/linear_algebra/matrix.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/machine_learning/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/machine_learning/activation_functions/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/machine_learning/activation_functions/activation_function.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/machine_learning/activation_functions/relu.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/machine_learning/neuron.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/oop/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/oop/observer.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/oop/strategy.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/distributions.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/expressions/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/expressions/probability_expression.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/funcs/__init__.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/funcs/covariance.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/funcs/expected_value.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/funcs/probability_function.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/funcs/variance.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/operator.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/protocols.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/supp.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/university/probability/transformation.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils/versioned_imports.py +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils.egg-info/dependency_links.txt +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/danielutils.egg-info/top_level.txt +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/setup.cfg +0 -0
- {danielutils-0.9.90 → danielutils-0.9.91}/setup.py +0 -0
|
@@ -150,16 +150,15 @@ T = TypeVar("T")
|
|
|
150
150
|
|
|
151
151
|
Supplier = Callable[[], T]
|
|
152
152
|
Runnable = Supplier[None]
|
|
153
|
-
|
|
153
|
+
Consumer = Callable[[T], None]
|
|
154
154
|
UnaryFunction = Callable[[U], T]
|
|
155
|
-
UnaryOperator =
|
|
156
|
-
Predicate =
|
|
157
|
-
Consumer = UnaryFunction[T, None]
|
|
155
|
+
UnaryOperator = Callable[[T], T]
|
|
156
|
+
Predicate = Callable[[T], bool]
|
|
158
157
|
|
|
159
158
|
BinaryFunction = Callable[[A, B], T]
|
|
160
|
-
BinaryOperator =
|
|
161
|
-
Comparator =
|
|
162
|
-
BinaryConsumer =
|
|
159
|
+
BinaryOperator = Callable[[T, T], T]
|
|
160
|
+
Comparator = Callable[[A, B], int]
|
|
161
|
+
BinaryConsumer = Callable[[T, T], None]
|
|
163
162
|
|
|
164
163
|
__all__ = [
|
|
165
164
|
"UnaryFunction",
|
|
@@ -26,12 +26,11 @@ class AsciiProgressBar(ProgressBar):
|
|
|
26
26
|
total_ = len(iterator)
|
|
27
27
|
if total is not None:
|
|
28
28
|
total_ = total
|
|
29
|
-
ProgressBar.__init__(self, total_, position)
|
|
29
|
+
ProgressBar.__init__(self, total_, position, desc=desc)
|
|
30
30
|
self.iterator: Iterator = iterator
|
|
31
31
|
self.pool: ProgressBarPool = pool
|
|
32
32
|
self.num_bars: int = num_bars
|
|
33
33
|
self.leave: bool = leave
|
|
34
|
-
self.desc: str = desc
|
|
35
34
|
self.initial_value: float = 0
|
|
36
35
|
self.current_value: float = 0
|
|
37
36
|
self.ncols: int = ncols
|
|
@@ -95,7 +94,7 @@ class AsciiProgressBar(ProgressBar):
|
|
|
95
94
|
bprint(to_print)
|
|
96
95
|
self.prev_print = to_print
|
|
97
96
|
|
|
98
|
-
def update(self, amount: float = 1, refresh: bool = False):
|
|
97
|
+
def update(self, amount: float = 1, refresh: bool = False): # type:ignore
|
|
99
98
|
self.prev_value = self.current_value
|
|
100
99
|
self.current_value = min(
|
|
101
100
|
self.current_value + amount, self.total) # type:ignore
|
|
@@ -20,7 +20,9 @@ class ProgressBar(ABC):
|
|
|
20
20
|
DEFAULT_BAR_FORMAT = "{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}"
|
|
21
21
|
|
|
22
22
|
@abstractmethod
|
|
23
|
-
def __init__(self, total, position: int, unit="it", bar_format: str = DEFAULT_BAR_FORMAT,
|
|
23
|
+
def __init__(self, total, position: int, unit="it", bar_format: str = DEFAULT_BAR_FORMAT, *, desc: str,
|
|
24
|
+
**kwargs) -> None:
|
|
25
|
+
self.desc: str = desc
|
|
24
26
|
self.total = total
|
|
25
27
|
self.position = position
|
|
26
28
|
self.unit = unit
|
|
@@ -51,6 +53,9 @@ class ProgressBar(ABC):
|
|
|
51
53
|
"""A function to reset the progress-bar's progress
|
|
52
54
|
"""
|
|
53
55
|
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def __iter__(self): ...
|
|
58
|
+
|
|
54
59
|
|
|
55
60
|
try:
|
|
56
61
|
from tqdm import tqdm
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from ..backoff_strategy import BackOffStrategy
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ConstantBackOffStrategy(BackOffStrategy):
|
|
5
|
+
"""
|
|
6
|
+
will always back off exactly the same amount of time
|
|
7
|
+
|
|
8
|
+
:param delay: The amount of milliseconds to sleep
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(self, delay: int) -> None:
|
|
12
|
+
if not delay >= 0:
|
|
13
|
+
raise ValueError("delay must be positive")
|
|
14
|
+
super().__init__(lambda: delay)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ConstantBackOffStrategy"
|
|
19
|
+
]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from ..backoff_strategy import BackOffStrategy
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ExponentialBackOffStrategy(BackOffStrategy):
|
|
5
|
+
def __init__(self, initial: int, multiplier: float) -> None:
|
|
6
|
+
if not initial >= 0:
|
|
7
|
+
raise ValueError("initial must be positive")
|
|
8
|
+
if not multiplier >= 0:
|
|
9
|
+
raise ValueError("multiplier must be positive")
|
|
10
|
+
prev: float = 1.0
|
|
11
|
+
|
|
12
|
+
def inner() -> int:
|
|
13
|
+
nonlocal prev
|
|
14
|
+
return initial ** (prev := prev * multiplier)
|
|
15
|
+
|
|
16
|
+
super().__init__(inner)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"ExponentialBackOffStrategy"
|
|
21
|
+
]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from danielutils import Supplier
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class BackOffStrategy:
|
|
5
|
+
"""
|
|
6
|
+
A class to create a common abstraction for backoff strategies
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, supp: Supplier[int]) -> None:
|
|
10
|
+
self._supp = supp
|
|
11
|
+
|
|
12
|
+
def get_backoff(self) -> int:
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
:return: amount of milliseconds to sleep
|
|
16
|
+
"""
|
|
17
|
+
return self._supp()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"BackOffStrategy"
|
|
22
|
+
]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import Generic, TypeVar, Optional
|
|
3
|
+
|
|
4
|
+
from danielutils import Supplier, Consumer
|
|
5
|
+
from .backoff_strategies import ConstantBackOffStrategy
|
|
6
|
+
|
|
7
|
+
from .backoff_strategy import BackOffStrategy
|
|
8
|
+
|
|
9
|
+
T = TypeVar("T")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RetryExecutor(Generic[T]):
|
|
13
|
+
def __init__(self, backoff_strategy: BackOffStrategy = ConstantBackOffStrategy(200)) -> None:
|
|
14
|
+
self._backoff_strategy = backoff_strategy
|
|
15
|
+
|
|
16
|
+
def execute(self, supp: Supplier[T], max_retries: int = 5,
|
|
17
|
+
exception_callback: Optional[Consumer[Exception]] = None) -> Optional[T]:
|
|
18
|
+
|
|
19
|
+
for i in range(max_retries):
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
return supp()
|
|
23
|
+
except Exception as e:
|
|
24
|
+
if exception_callback:
|
|
25
|
+
exception_callback(e)
|
|
26
|
+
|
|
27
|
+
if i != max_retries - 1:
|
|
28
|
+
self._sleep()
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
def _sleep(self) -> None:
|
|
32
|
+
time.sleep(self._backoff_strategy.get_backoff())
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"RetryExecutor",
|
|
37
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .unittest_ import *
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import unittest
|
|
3
|
+
from typing import Optional, Callable
|
|
4
|
+
from unittest import TestResult
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AlwaysTeardownTestCase(unittest.TestCase):
|
|
8
|
+
"""
|
|
9
|
+
SafeTestCase makes sure that tearDown / cleanup methods are always run when
|
|
10
|
+
They should be.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def run(self, result=None) -> Optional[TestResult]:
|
|
14
|
+
test_method = getattr(self, self._testMethodName)
|
|
15
|
+
wrapped_test = self._cleanup_wrapper(test_method, KeyboardInterrupt)
|
|
16
|
+
setattr(self, self._testMethodName, wrapped_test)
|
|
17
|
+
|
|
18
|
+
self.setUp = self._cleanup_wrapper(self.setUp, BaseException)
|
|
19
|
+
|
|
20
|
+
return super().run(result)
|
|
21
|
+
|
|
22
|
+
def _cleanup_wrapper(self, method: Callable, exception) -> Callable:
|
|
23
|
+
@functools.wraps(method)
|
|
24
|
+
def wrapper(*args, **kwargs):
|
|
25
|
+
try:
|
|
26
|
+
return method(*args, **kwargs)
|
|
27
|
+
except exception:
|
|
28
|
+
self.tearDown()
|
|
29
|
+
self.doCleanups()
|
|
30
|
+
raise
|
|
31
|
+
|
|
32
|
+
return wrapper
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"AlwaysTeardownTestCase"
|
|
37
|
+
]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import os
|
|
3
|
+
import unittest
|
|
4
|
+
from typing import Optional, Callable
|
|
5
|
+
|
|
6
|
+
from danielutils import create_directory, get_current_working_directory, set_current_working_directory, delete_directory
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def improved_setup(func: Callable) -> Callable:
|
|
10
|
+
@functools.wraps(func)
|
|
11
|
+
def wrapper(self):
|
|
12
|
+
self.test_folder = f"./{self.__class__.__name__}_test_folder"
|
|
13
|
+
create_directory(self.test_folder)
|
|
14
|
+
self.prev_cwd = get_current_working_directory()
|
|
15
|
+
set_current_working_directory(os.path.join(self.prev_cwd, self.test_folder))
|
|
16
|
+
if func is not None:
|
|
17
|
+
func(self)
|
|
18
|
+
|
|
19
|
+
return wrapper
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def improved_teardown(func: Callable) -> Callable:
|
|
23
|
+
@functools.wraps(func)
|
|
24
|
+
def wrapper(self):
|
|
25
|
+
if func is not None:
|
|
26
|
+
func(self)
|
|
27
|
+
set_current_working_directory(self.prev_cwd)
|
|
28
|
+
delete_directory(self.test_folder)
|
|
29
|
+
|
|
30
|
+
return wrapper
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class AutoCWDTestCase(unittest.TestCase):
|
|
34
|
+
@staticmethod
|
|
35
|
+
def _dummy():
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def __init_subclass__(cls, **kwargs):
|
|
40
|
+
dct = dict(cls.__dict__)
|
|
41
|
+
impl_setUp = dct.get("setUp", cls._dummy)
|
|
42
|
+
impl_tearDown = dct.get("tearDown", cls._dummy)
|
|
43
|
+
setattr(cls, "setUp", improved_setup(impl_setUp))
|
|
44
|
+
setattr(cls, "tearDown", improved_teardown(impl_tearDown))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
__all__ = [
|
|
48
|
+
'AutoCWDTestCase'
|
|
49
|
+
]
|
|
@@ -153,6 +153,13 @@ danielutils/reflection/interpreter/tracer.py
|
|
|
153
153
|
danielutils/reflection/module/__init__.py
|
|
154
154
|
danielutils/reflection/module/module_reflections.py
|
|
155
155
|
danielutils/reflection/module/package_reflection.py
|
|
156
|
+
danielutils/retry_executor/__init__.py
|
|
157
|
+
danielutils/retry_executor/backoff_strategy.py
|
|
158
|
+
danielutils/retry_executor/retry_executor.py
|
|
159
|
+
danielutils/retry_executor/backoff_strategies/__init__.py
|
|
160
|
+
danielutils/retry_executor/backoff_strategies/constant_backoff.py
|
|
161
|
+
danielutils/retry_executor/backoff_strategies/exponential_backoff.py
|
|
162
|
+
danielutils/retry_executor/backoff_strategies/no_backoff.py
|
|
156
163
|
danielutils/snippets/__init__.py
|
|
157
164
|
danielutils/snippets/try_get.py
|
|
158
165
|
danielutils/system/__init__.py
|
|
@@ -163,6 +170,10 @@ danielutils/system/windows/win32_ctime.py
|
|
|
163
170
|
danielutils/system/windows/windows.py
|
|
164
171
|
danielutils/system/windows/utils/__init__.py
|
|
165
172
|
danielutils/system/windows/utils/filetime.py
|
|
173
|
+
danielutils/testing/__init__.py
|
|
174
|
+
danielutils/testing/unittest_/__init__.py
|
|
175
|
+
danielutils/testing/unittest_/always_teardown_testcase.py
|
|
176
|
+
danielutils/testing/unittest_/auto_cwd_testcase.py
|
|
166
177
|
danielutils/university/__init__.py
|
|
167
178
|
danielutils/university/computability_and_complexity/__init__.py
|
|
168
179
|
danielutils/university/computability_and_complexity/discreate_finite_automaton.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/database/cached_database.py
RENAMED
|
File without changes
|
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/database/redis_database.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/__init__.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/multi_id.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/worker.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/abstractions/multiprogramming/worker_pool.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/__init__.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/factory.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/tdict.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/tlist.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/tset.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/better_builtins/typed_builtins/ttuple.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/conversions/specialized_conversions/to_hex.py
RENAMED
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/conversions/specialized_conversions/to_int.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/queue/priority_queue.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-0.9.90 → danielutils-0.9.91}/danielutils/data_structures/trees/binary_syntax_tree.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|