danielutils 1.0.31__tar.gz → 1.0.35__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.31/danielutils.egg-info → danielutils-1.0.35}/PKG-INFO +1 -1
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/__init__.py +2 -1
- danielutils-1.0.35/danielutils/async_/__init__.py +4 -0
- danielutils-1.0.35/danielutils/async_/async_retry_executor_base.py +90 -0
- danielutils-1.0.35/danielutils/async_/async_worker_pool_base.py +65 -0
- danielutils-1.0.35/danielutils/async_/time_strategy.py +61 -0
- danielutils-1.0.35/danielutils/async_/utils.py +32 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/__init__.py +2 -1
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/final.py +2 -0
- danielutils-1.0.35/danielutils/decorators/normalize_decorator.py +55 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/partition.py +1 -1
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/class_info.py +11 -2
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/function_info.py +6 -0
- {danielutils-1.0.31 → danielutils-1.0.35/danielutils.egg-info}/PKG-INFO +1 -1
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils.egg-info/SOURCES.txt +6 -2
- {danielutils-1.0.31 → danielutils-1.0.35}/pyproject.toml +1 -1
- {danielutils-1.0.31 → danielutils-1.0.35}/LICENSE +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/MANIFEST.in +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/README.md +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/database/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/database/cached_database.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/database/database.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/database/redis_database.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/worker.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/repl.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/aliases.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/counter.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/frange.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/colors.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/context_managers/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/context_managers/attr_context.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/context_managers/multi_context.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/context_managers/optional_context.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/context_managers/state_context.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/context_managers/temporary_file.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/convenience.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/conversions/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/conversions/main_conversions.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/custom_types.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/algorithms.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/comparer.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/default_dict.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/functions.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/graph/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/graph/binary_node.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/graph/graph.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/graph/multinode.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/graph/node.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/heap/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/heap/heap.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/heap/max_heap.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/heap/min_heap.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/queue/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/queue/atomic_queue.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/queue/priority_queue.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/queue/queue.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/stack.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/trees/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/trees/binary_tree.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/date.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/date_time.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/atomic.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/attach.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/chain_decorators.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/decorate_conditionally.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/delay_call.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/deprecate.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/limit_recursion.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/memo.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/overload.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/partially_implemented.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/processify.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/property.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/singleton.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/threadify.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/timeout.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/total_ordering.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/decorators/validate.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/exceptions.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/file_specifications/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/areoneof.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/check_foreach.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/factorial.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/flatten.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/foreach.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/isoftype.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/isoneof.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/multiloop.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/parallel_for.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/powerset.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/subseteq.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/functions/types_subseteq.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/generators/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/generators/conditional_generator.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/generators/generator_from_stream.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/generators/join_generators.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/internet.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/io_.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/java/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/java/interfaces/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/java/interfaces/comparable.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/java/java_interface.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/logging_/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/logging_/builtin_impls/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/logging_/builtin_impls/file_logger.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/logging_/builtin_impls/print_logger.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/logging_/log_level.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/logging_/logger.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/logging_/logger_strategy_impl_base.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/lombok/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/lombok/builder.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/math_/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/math_/constants.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/math_/functions.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/math_/math_print.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/math_/math_symbols.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/metaclasses/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/metaclasses/atomic_class_meta.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/metaclasses/instance_cache_meta.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/metaclasses/interface.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/metaclasses/overload_meta.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/mock_/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/mock_/mock_database.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/mock_/mock_module.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/path.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/print_.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/progress_bar/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/progress_bar/ascii_progress_bar.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/progress_bar/progress_bar.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/progress_bar/progress_bar_pool.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/protocols/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/protocols/dictable.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/protocols/evaluable.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/protocols/serializable.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/py.typed +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/random_.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/argument_info.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/class_/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/class_/class_reflection.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/decoration_info.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/file/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/file/file_reflection.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/function/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/function/function_reflections.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/callstack.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/get_traceback.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/interpreter.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/is_debugging.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/os_.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/packages.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/python_version.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/signals.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/interpreter/tracer.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/module/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/module/module_reflections.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/reflection/module/package_reflection.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategies/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategies/constant_backoff.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategies/exponential_backoff.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategies/functional_backoff.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategies/linear_backoff.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategies/multiplicative_backoff.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategies/no_backoff.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/backoff_strategy.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/retry_executor/retry_executor.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/snippets/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/snippets/try_get.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/independent.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/layered_command.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/windows/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/windows/utils/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/windows/utils/filetime.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/windows/win32_ctime.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/system/windows/windows.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/testing/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/testing/unittest_/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/testing/unittest_/always_teardown_testcase.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/testing/unittest_/auto_cwd_testcase.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/text.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/time.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/computability_and_complexity/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/computability_and_complexity/discreate_finite_automaton.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/computability_and_complexity/languages/language.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/computability_and_complexity/languages/sat.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/computability_and_complexity/turing_machine.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/databases/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/databases/all.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/encoding.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/lossless/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/lossless/run_length.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/lossy/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/tansformations/hough.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/image_proccesing/tansformations/transformation.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/linear_algebra/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/linear_algebra/matrix.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/machine_learning/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/machine_learning/activation_functions/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/machine_learning/activation_functions/activation_function.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/machine_learning/activation_functions/relu.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/machine_learning/neuron.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/oop/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/oop/observer.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/oop/strategy.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/distributions.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/expressions/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/expressions/probability_expression.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/funcs/__init__.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/funcs/covariance.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/funcs/expected_value.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/funcs/probability_function.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/funcs/variance.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/operator.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/protocols.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/supp.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/university/probability/transformation.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils/versioned_imports.py +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils.egg-info/dependency_links.txt +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/danielutils.egg-info/top_level.txt +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/setup.cfg +0 -0
- {danielutils-1.0.31 → danielutils-1.0.35}/setup.py +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import functools
|
|
3
|
+
import json
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Literal, Optional, Any, Mapping, Iterable, Callable, Coroutine
|
|
6
|
+
|
|
7
|
+
from ..custom_types import Supplier
|
|
8
|
+
from ..decorators import normalize_decorator
|
|
9
|
+
from .time_strategy import LinearTimeStrategy, ConstantTimeStrategy
|
|
10
|
+
from ..versioned_imports import ParamSpec
|
|
11
|
+
|
|
12
|
+
P = ParamSpec("P")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AsyncRetryExecutorBase:
|
|
16
|
+
def __init__(
|
|
17
|
+
self,
|
|
18
|
+
timeout_strategy: Supplier[float] = LinearTimeStrategy(30, 5),
|
|
19
|
+
delay_strategy: Supplier[float] = ConstantTimeStrategy(0)
|
|
20
|
+
) -> None:
|
|
21
|
+
self.timeout_strategy = timeout_strategy
|
|
22
|
+
self.delay_strategy = delay_strategy
|
|
23
|
+
|
|
24
|
+
def is_transient(self, e: Exception) -> bool:
|
|
25
|
+
"""
|
|
26
|
+
This function will return true if the exception that was raised at a specific attempt should be ignored and we should try again with respet to the amount of retries left
|
|
27
|
+
Args:
|
|
28
|
+
e: exception caught
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
boolean
|
|
32
|
+
"""
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
async def execute(
|
|
36
|
+
self,
|
|
37
|
+
func: Callable[P, Coroutine],
|
|
38
|
+
*,
|
|
39
|
+
args: Optional[Iterable] = None,
|
|
40
|
+
kwargs: Optional[Mapping] = None,
|
|
41
|
+
max_tries: int = 5
|
|
42
|
+
) -> Optional[Any]:
|
|
43
|
+
args = list(args) if args else []
|
|
44
|
+
kwargs = dict(kwargs) if kwargs else {}
|
|
45
|
+
for i in range(1, max_tries + 1):
|
|
46
|
+
timeout = self.timeout_strategy()
|
|
47
|
+
delay = self.delay_strategy()
|
|
48
|
+
try:
|
|
49
|
+
return await asyncio.wait_for(func(*args, **kwargs), timeout=timeout)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
if self.is_transient(e):
|
|
52
|
+
self.warn(f"Failed attempt {i}/{max_tries}", function=func, args=args, kwargs=kwargs, exception=e,
|
|
53
|
+
timestamp=datetime.now().isoformat())
|
|
54
|
+
if i < max_tries - 1 and delay > 0:
|
|
55
|
+
await asyncio.sleep(delay)
|
|
56
|
+
else:
|
|
57
|
+
raise e
|
|
58
|
+
self.error("Failed all attempts", function=func, args=args, kwargs=kwargs, timestamp=datetime.now().isoformat())
|
|
59
|
+
raise RuntimeError(f"Failed all attempts")
|
|
60
|
+
|
|
61
|
+
def log(self, level: Literal["INFO", "WARNING", "ERROR"], message: str, **kwargs) -> None:
|
|
62
|
+
kwargs["level"] = level
|
|
63
|
+
kwargs["message"] = message
|
|
64
|
+
print(json.dumps(kwargs, default=str))
|
|
65
|
+
|
|
66
|
+
def info(self, message: str, **kwargs) -> None:
|
|
67
|
+
self.log("INFO", message, **kwargs)
|
|
68
|
+
|
|
69
|
+
def warn(self, message: str, **kwargs) -> None:
|
|
70
|
+
self.log("WARNING", message, **kwargs)
|
|
71
|
+
|
|
72
|
+
def error(self, message: str, **kwargs) -> None:
|
|
73
|
+
self.log("ERROR", message, **kwargs)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@normalize_decorator
|
|
77
|
+
def with_async_retry(func, *retry_executor_args, max_tries: int = 5, **retry_executor_kwargs):
|
|
78
|
+
retry_executor = AsyncRetryExecutorBase(*retry_executor_args, **retry_executor_kwargs)
|
|
79
|
+
|
|
80
|
+
@functools.wraps(func)
|
|
81
|
+
async def wrapper(*args, **kwargs):
|
|
82
|
+
return await retry_executor.execute(func, args=args, kwargs=kwargs, max_tries=max_tries)
|
|
83
|
+
|
|
84
|
+
return wrapper
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
__all__ = [
|
|
88
|
+
"AsyncRetryExecutorBase",
|
|
89
|
+
"with_async_retry"
|
|
90
|
+
]
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import json
|
|
3
|
+
from typing import Callable, Literal, Optional, Coroutine
|
|
4
|
+
|
|
5
|
+
from .async_retry_executor_base import AsyncRetryExecutorBase
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AsyncWorkerPoolBase:
|
|
9
|
+
def __init__(self, num_workers: int, retry_executor: Optional[AsyncRetryExecutorBase] = None) -> None:
|
|
10
|
+
self.num_workers = num_workers
|
|
11
|
+
self.queue = asyncio.Queue()
|
|
12
|
+
self.workers = []
|
|
13
|
+
self.retry_executor = retry_executor
|
|
14
|
+
|
|
15
|
+
async def worker(self, worker_id) -> None:
|
|
16
|
+
"""Worker coroutine that continuously fetches and executes tasks from the queue."""
|
|
17
|
+
count = 0
|
|
18
|
+
while True:
|
|
19
|
+
task = await self.queue.get()
|
|
20
|
+
if task is None: # Sentinel value to shut down the worker
|
|
21
|
+
break
|
|
22
|
+
count += 1
|
|
23
|
+
func, args, kwargs = task
|
|
24
|
+
self.info(f"Worker {worker_id} started with task {count}")
|
|
25
|
+
if self.retry_executor:
|
|
26
|
+
await self.retry_executor.execute(func, args=args, kwargs=kwargs)
|
|
27
|
+
else:
|
|
28
|
+
await func(*args, **kwargs)
|
|
29
|
+
self.info(f"Worker {worker_id} finished with task {count}")
|
|
30
|
+
self.queue.task_done()
|
|
31
|
+
self.info(f"Worker {worker_id} done.")
|
|
32
|
+
|
|
33
|
+
async def start(self) -> None:
|
|
34
|
+
"""Starts the worker pool."""
|
|
35
|
+
self.workers = [asyncio.create_task(self.worker(i + 1)) for i in range(self.num_workers)]
|
|
36
|
+
|
|
37
|
+
async def submit(self, func: Callable[..., Coroutine[None, None, None]], *args, **kwargs) -> None:
|
|
38
|
+
"""Submit a new task to the queue."""
|
|
39
|
+
await self.queue.put((func, args, kwargs))
|
|
40
|
+
|
|
41
|
+
async def join(self) -> None:
|
|
42
|
+
"""Stops the worker pool by waiting for all tasks to complete and shutting down workers."""
|
|
43
|
+
await self.queue.join() # Wait until all tasks are processed
|
|
44
|
+
for _ in range(self.num_workers):
|
|
45
|
+
await self.queue.put(None) # Send sentinel values to stop workers
|
|
46
|
+
await asyncio.gather(*self.workers) # Wait for workers to finish
|
|
47
|
+
|
|
48
|
+
def log(self, level: Literal["INFO", "WARNING", "ERROR"], message: str, **kwargs) -> None:
|
|
49
|
+
kwargs["level"] = level
|
|
50
|
+
kwargs["message"] = message
|
|
51
|
+
print(json.dumps(kwargs, default=str))
|
|
52
|
+
|
|
53
|
+
def info(self, message: str, **kwargs) -> None:
|
|
54
|
+
self.log("INFO", message, **kwargs)
|
|
55
|
+
|
|
56
|
+
def warn(self, message: str, **kwargs) -> None:
|
|
57
|
+
self.log("WARNING", message, **kwargs)
|
|
58
|
+
|
|
59
|
+
def error(self, message: str, **kwargs) -> None:
|
|
60
|
+
self.log("ERROR", message, **kwargs)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
__all__ = [
|
|
64
|
+
"AsyncWorkerPoolBase",
|
|
65
|
+
]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TimeStrategy(ABC):
|
|
5
|
+
@abstractmethod
|
|
6
|
+
def next(self): ...
|
|
7
|
+
|
|
8
|
+
def __call__(self, *args, **kwargs):
|
|
9
|
+
return self.next()
|
|
10
|
+
|
|
11
|
+
@abstractmethod
|
|
12
|
+
def reset(self): ...
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ConstantTimeStrategy(TimeStrategy):
|
|
16
|
+
def __init__(self, timeout: float):
|
|
17
|
+
self.timeout = timeout
|
|
18
|
+
|
|
19
|
+
def next(self) -> float:
|
|
20
|
+
return self.timeout
|
|
21
|
+
|
|
22
|
+
def reset(self) -> None:
|
|
23
|
+
pass # No state to reset
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class LinearTimeStrategy(TimeStrategy):
|
|
27
|
+
def __init__(self, base_timeout: float, step: float):
|
|
28
|
+
self.base_timeout = base_timeout
|
|
29
|
+
self.step = step
|
|
30
|
+
self.current_timeout = base_timeout
|
|
31
|
+
|
|
32
|
+
def next(self) -> float:
|
|
33
|
+
timeout = self.current_timeout
|
|
34
|
+
self.current_timeout += self.step
|
|
35
|
+
return timeout
|
|
36
|
+
|
|
37
|
+
def reset(self) -> None:
|
|
38
|
+
self.current_timeout = self.base_timeout
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class MultiplicativeTimeStrategy(TimeStrategy):
|
|
42
|
+
def __init__(self, base_timeout: float, factor: float):
|
|
43
|
+
self.base_timeout = base_timeout
|
|
44
|
+
self.factor = factor
|
|
45
|
+
self.current_timeout = base_timeout
|
|
46
|
+
|
|
47
|
+
def next(self) -> float:
|
|
48
|
+
timeout = self.current_timeout
|
|
49
|
+
self.current_timeout *= self.factor
|
|
50
|
+
return timeout
|
|
51
|
+
|
|
52
|
+
def reset(self) -> None:
|
|
53
|
+
self.current_timeout = self.base_timeout
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
__all__ = [
|
|
57
|
+
"TimeStrategy",
|
|
58
|
+
"ConstantTimeStrategy",
|
|
59
|
+
"LinearTimeStrategy",
|
|
60
|
+
"MultiplicativeTimeStrategy"
|
|
61
|
+
]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from asyncio import Task
|
|
3
|
+
from typing import List, Coroutine, Any, Tuple, Optional, Set
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async def return_first(coros: List[Coroutine], timeout: Optional[int] = None) -> List[Tuple[int, Any]]:
|
|
7
|
+
tasks: List[Task] = [asyncio.create_task(coro) for coro in coros]
|
|
8
|
+
result: Tuple[Set[Task], Set[Task]] = await asyncio.wait(tasks, timeout=timeout,
|
|
9
|
+
return_when=asyncio.FIRST_COMPLETED)
|
|
10
|
+
done: Set[Task] = result[0]
|
|
11
|
+
# pending: Set[Task] = result[1]
|
|
12
|
+
|
|
13
|
+
res = []
|
|
14
|
+
for task in done:
|
|
15
|
+
res.append((tasks.index(task), task.result()))
|
|
16
|
+
|
|
17
|
+
return res
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def return_all(coros: List[Coroutine], timeout: Optional[int] = None) -> List[Any]:
|
|
21
|
+
tasks: List[Task] = [asyncio.create_task(coro) for coro in coros]
|
|
22
|
+
result: Tuple[Set[Task], Set[Task]] = await asyncio.wait(tasks, timeout=timeout,
|
|
23
|
+
return_when=asyncio.ALL_COMPLETED)
|
|
24
|
+
done: Set[Task] = result[0]
|
|
25
|
+
|
|
26
|
+
return [task.result() for task in done]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"return_first",
|
|
31
|
+
"return_all",
|
|
32
|
+
]
|
|
@@ -7,6 +7,7 @@ def final(cls: type) -> type:
|
|
|
7
7
|
Returns:
|
|
8
8
|
marked class
|
|
9
9
|
"""
|
|
10
|
+
|
|
10
11
|
def __init__subclass__(*args, **kwargs):
|
|
11
12
|
raise TypeError(f"'{cls.__qualname__}' is final. Can't create subclasses")
|
|
12
13
|
|
|
@@ -18,6 +19,7 @@ class Final:
|
|
|
18
19
|
"""
|
|
19
20
|
A parent class to make direct child a Final class. will add expected behaviour.
|
|
20
21
|
"""
|
|
22
|
+
|
|
21
23
|
def __new__(cls, *args, **kwargs):
|
|
22
24
|
if cls is Final:
|
|
23
25
|
raise TypeError("Can't instantiate 'Final'")
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
from typing import Callable, Any
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def normalize_decorator(decorator: Callable[..., Any]) -> Callable[..., Any]:
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
Args:
|
|
9
|
+
decorator: a function that is used as a decorator and you want to be used with "normalized" arguments
|
|
10
|
+
|
|
11
|
+
Returns:
|
|
12
|
+
object:
|
|
13
|
+
The normalized version of the decorator
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
|
|
17
|
+
Do
|
|
18
|
+
```python
|
|
19
|
+
@normalize_decorator
|
|
20
|
+
def validate(func, strict:bool = False):
|
|
21
|
+
@functools.wraps(func)
|
|
22
|
+
def wrapper(*args, **kwargs):
|
|
23
|
+
# do stuff
|
|
24
|
+
return func(*args, **kwargs)
|
|
25
|
+
return wrapper
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
instead of
|
|
29
|
+
```python
|
|
30
|
+
def validate(strict_or_func: Optional[Union[bool,Callable]] = None):
|
|
31
|
+
strict = False # default value
|
|
32
|
+
def deco(func):
|
|
33
|
+
@functools.wraps(func)
|
|
34
|
+
def wrapper(*args, **kwargs):
|
|
35
|
+
# do stuff
|
|
36
|
+
return func(*args, **kwargs)
|
|
37
|
+
return wrapper
|
|
38
|
+
if isinstance(strict_or_func, bool):
|
|
39
|
+
strict = strict_or_func
|
|
40
|
+
return deco
|
|
41
|
+
return deco(strict_or_func)
|
|
42
|
+
"""
|
|
43
|
+
@functools.wraps(decorator)
|
|
44
|
+
def wrapper(*args, **kwargs):
|
|
45
|
+
if args and callable(args[0]):
|
|
46
|
+
return decorator(args[0], *args[1:], **kwargs)
|
|
47
|
+
else:
|
|
48
|
+
return lambda func: decorator(func, *args, **kwargs)
|
|
49
|
+
|
|
50
|
+
return wrapper
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
__all__ = [
|
|
54
|
+
"normalize_decorator",
|
|
55
|
+
]
|
|
@@ -4,7 +4,7 @@ from typing import List, Generator, Tuple, Union
|
|
|
4
4
|
def partitions(n: int, k: int) -> Generator[List[int], None, None]:
|
|
5
5
|
from ..decorators import memo_generator
|
|
6
6
|
|
|
7
|
-
@memo_generator
|
|
7
|
+
@memo_generator
|
|
8
8
|
def helper(n: int, target_sum: int, current_sum: int, topLevel: int, arr: Union[List[int], Tuple[int]]) -> \
|
|
9
9
|
Generator[List[int], None, None]:
|
|
10
10
|
arr = list(arr)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
|
+
import json
|
|
2
3
|
import re
|
|
3
4
|
from typing import Optional, List, Iterable, Type, TypeVar, Generic, get_origin
|
|
4
5
|
from .function_info import FunctionInfo
|
|
@@ -67,7 +68,15 @@ class ClassInfo:
|
|
|
67
68
|
self._functions.append(FunctionInfo(obj, self._cls))
|
|
68
69
|
|
|
69
70
|
def __str__(self) -> str:
|
|
70
|
-
|
|
71
|
+
body = json.dumps({
|
|
72
|
+
"name": self.name,
|
|
73
|
+
"bases": self.bases,
|
|
74
|
+
"decorations": self.decorations,
|
|
75
|
+
"static_methods": self.static_methods,
|
|
76
|
+
"class_methods": self.class_methods,
|
|
77
|
+
"instance_methods": self.instance_methods
|
|
78
|
+
}, default=str, indent=4)[1:-1]
|
|
79
|
+
return f"{self.__class__.__name__}({body})"
|
|
71
80
|
|
|
72
81
|
def __repr__(self):
|
|
73
82
|
return f"{self.__class__.__name__}(name=\"{self.name}\")"
|
|
@@ -97,7 +106,7 @@ class ClassInfo:
|
|
|
97
106
|
return sorted(filter(lambda f: f.is_instance_method, self._functions), key=lambda f: f.name)
|
|
98
107
|
|
|
99
108
|
@property
|
|
100
|
-
def inherited_methods(self)->Iterable[FunctionInfo]:
|
|
109
|
+
def inherited_methods(self) -> Iterable[FunctionInfo]:
|
|
101
110
|
return sorted(filter(lambda f: f.is_inherited, self._functions), key=lambda f: f.name)
|
|
102
111
|
|
|
103
112
|
@property
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
|
+
import json
|
|
2
3
|
import re
|
|
3
4
|
from typing import Type, Optional, List, Callable
|
|
4
5
|
from .decoration_info import DecorationInfo
|
|
@@ -46,6 +47,11 @@ class FunctionInfo:
|
|
|
46
47
|
self._return_type = return_type
|
|
47
48
|
|
|
48
49
|
def __str__(self) -> str:
|
|
50
|
+
# body = json.dumps({
|
|
51
|
+
# "name": self.name,
|
|
52
|
+
# "decorators": self.decorators,
|
|
53
|
+
# "arguments": self.arguments
|
|
54
|
+
# }, default=str, indent=4)
|
|
49
55
|
return f"{self.__class__.__name__}(name=\"{self.name}\", decorators={self.decorators}, arguments={self.arguments})"
|
|
50
56
|
|
|
51
57
|
def __repr__(self) -> str:
|
|
@@ -3,8 +3,6 @@ MANIFEST.in
|
|
|
3
3
|
README.md
|
|
4
4
|
pyproject.toml
|
|
5
5
|
setup.py
|
|
6
|
-
./LICENSE
|
|
7
|
-
./README.md
|
|
8
6
|
danielutils/__init__.py
|
|
9
7
|
danielutils/aliases.py
|
|
10
8
|
danielutils/colors.py
|
|
@@ -36,6 +34,11 @@ danielutils/abstractions/multiprogramming/__init__.py
|
|
|
36
34
|
danielutils/abstractions/multiprogramming/multi_id.py
|
|
37
35
|
danielutils/abstractions/multiprogramming/worker.py
|
|
38
36
|
danielutils/abstractions/multiprogramming/worker_pool.py
|
|
37
|
+
danielutils/async_/__init__.py
|
|
38
|
+
danielutils/async_/async_retry_executor_base.py
|
|
39
|
+
danielutils/async_/async_worker_pool_base.py
|
|
40
|
+
danielutils/async_/time_strategy.py
|
|
41
|
+
danielutils/async_/utils.py
|
|
39
42
|
danielutils/better_builtins/__init__.py
|
|
40
43
|
danielutils/better_builtins/counter.py
|
|
41
44
|
danielutils/better_builtins/frange.py
|
|
@@ -88,6 +91,7 @@ danielutils/decorators/deprecate.py
|
|
|
88
91
|
danielutils/decorators/final.py
|
|
89
92
|
danielutils/decorators/limit_recursion.py
|
|
90
93
|
danielutils/decorators/memo.py
|
|
94
|
+
danielutils/decorators/normalize_decorator.py
|
|
91
95
|
danielutils/decorators/overload.py
|
|
92
96
|
danielutils/decorators/partially_implemented.py
|
|
93
97
|
danielutils/decorators/processify.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/database/cached_database.py
RENAMED
|
File without changes
|
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/database/redis_database.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/__init__.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/multi_id.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/worker.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/abstractions/multiprogramming/worker_pool.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/__init__.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/factory.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/tdict.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/tlist.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/danielutils/better_builtins/typed_builtins/tset.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/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-1.0.31 → danielutils-1.0.35}/danielutils/conversions/specialized_conversions/to_hex.py
RENAMED
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/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-1.0.31 → danielutils-1.0.35}/danielutils/data_structures/queue/priority_queue.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-1.0.31 → danielutils-1.0.35}/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
|