danielutils 1.1.25__tar.gz → 1.1.26__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.1.25/danielutils.egg-info → danielutils-1.1.26}/PKG-INFO +1 -1
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/__init__.py +1 -1
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_definitions.py +2 -11
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_models.py +2 -11
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/cli.py +2 -2
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/__init__.py +2 -2
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/discovery.py +7 -7
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/execution.py +10 -10
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/parser.py +6 -6
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/runner.py +26 -26
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/models.py +6 -6
- {danielutils-1.1.25 → danielutils-1.1.26/danielutils.egg-info}/PKG-INFO +1 -1
- {danielutils-1.1.25 → danielutils-1.1.26}/pyproject.toml +1 -1
- {danielutils-1.1.25 → danielutils-1.1.26}/LICENSE +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/MANIFEST.in +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/README.md +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_exceptions.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_factory.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_initializer.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/dependencies.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/implementations/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/implementations/in_memory_database.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/implementations/persistent_in_memory_database.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/implementations/redis_database.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/implementations/sqlite_database.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/multiprogramming/worker.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/repl.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/aliases.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/async_cmd.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/async_command.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/async_layered_command.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/async_retry_executor.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/async_worker_pool.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/time_strategy.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/async_/utils.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/counter.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/frange.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/colors.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/context_managers/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/context_managers/attr_context.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/context_managers/multi_context.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/context_managers/optional_context.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/context_managers/state_context.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/context_managers/temporary_file.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/convenience.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/conversions/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/conversions/main_conversions.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/custom_types.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/algorithms.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/comparer.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/default_dict.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/functions.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/graph/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/graph/binary_node.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/graph/graph.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/graph/multinode.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/graph/node.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/heap/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/heap/heap.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/heap/max_heap.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/heap/min_heap.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/queue/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/queue/atomic_queue.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/queue/priority_queue.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/queue/queue.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/stack.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/trees/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/data_structures/trees/binary_tree.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/date.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/date_time.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/atomic.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/attach.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/chain_decorators.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/decorate_conditionally.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/delay_call.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/deprecate.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/final.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/limit_recursion.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/memo.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/normalize_decorator.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/overload.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/partially_implemented.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/processify.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/property.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/singleton.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/threadify.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/timeout.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/total_ordering.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/decorators/validate.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/exceptions.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/areoneof.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/check_foreach.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/factorial.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/flatten.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/foreach.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/isoftype.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/isoneof.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/multiloop.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/parallel_for.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/partition.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/powerset.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/subseteq.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/functions/types_subseteq.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/generators/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/generators/conditional_generator.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/generators/generator_from_stream.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/generators/join_generators.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/internet.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/io_.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/java/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/java/interfaces/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/java/interfaces/comparable.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/java/java_interface.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/_impl/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/_impl/builtin_impls/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/_impl/builtin_impls/file_logger.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/_impl/builtin_impls/print_logger.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/_impl/log_level.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/_impl/logger.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/_impl/logger_strategy_impl_base.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/logging_/utils.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/lombok/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/lombok/builder.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/math_/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/math_/constants.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/math_/functions.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/math_/math_print.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/math_/math_symbols.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/metaclasses/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/metaclasses/atomic_class_meta.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/metaclasses/instance_cache_meta.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/metaclasses/interface.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/metaclasses/overload_meta.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/mock_/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/mock_/mock_module.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/path.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/print_.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/progress_bar/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/progress_bar/ascii_progress_bar.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/progress_bar/progress_bar.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/progress_bar/progress_bar_pool.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/protocols/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/protocols/dictable.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/protocols/evaluable.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/protocols/serializable.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/py.typed +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/random_.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/declarations.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/file/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/file/file_reflection.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/function/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/function/function_reflections.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/argument_info.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/class_info.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/decorator_info.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/file_info.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/folder_info.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/function_info.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/info_classes/import_info.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/callstack.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/get_traceback.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/interpreter.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/is_debugging.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/os_.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/packages.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/python_version.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/signals.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/interpreter/tracer.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/module/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/module/lazy_module.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/module/module_reflections.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/reflection/module/package_reflection.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategies/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategies/constant_backoff.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategies/exponential_backoff.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategies/functional_backoff.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategies/linear_backoff.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategies/multiplicative_backoff.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategies/no_backoff.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/backoff_strategy.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/retry_executor/retry_executor.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/snippets/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/snippets/try_get.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/independent.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/layered_command.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/windows/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/windows/utils/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/windows/utils/filetime.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/windows/win32_ctime.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/system/windows/windows.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/testing/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/testing/unittest_/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/testing/unittest_/always_teardown_testcase.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/testing/unittest_/auto_cwd_testcase.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/text.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/time.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/computability_and_complexity/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/computability_and_complexity/discreate_finite_automaton.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/computability_and_complexity/languages/language.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/computability_and_complexity/languages/sat.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/computability_and_complexity/turing_machine.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/databases/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/databases/all.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/encoding.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/lossless/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/lossless/run_length.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/lossy/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/tansformations/hough.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/image_proccesing/tansformations/transformation.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/linear_algebra/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/linear_algebra/matrix.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/machine_learning/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/machine_learning/activation_functions/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/machine_learning/activation_functions/activation_function.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/machine_learning/activation_functions/relu.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/machine_learning/neuron.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/oop/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/oop/observer.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/oop/strategy.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/bernoulli_sum.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/distributions.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/expressions/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/expressions/probability_expression.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/funcs/__init__.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/funcs/covariance.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/funcs/expected_value.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/funcs/probability_function.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/funcs/variance.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/operator.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/protocols.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/supp.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/university/probability/transformation.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils/versioned_imports.py +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils.egg-info/SOURCES.txt +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils.egg-info/dependency_links.txt +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils.egg-info/requires.txt +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/danielutils.egg-info/top_level.txt +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/setup.cfg +0 -0
- {danielutils-1.1.25 → danielutils-1.1.26}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: danielutils
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.26
|
|
4
4
|
Summary: A comprehensive Python utilities library providing type-safe collections, async programming tools, database abstractions, retry executors, data structures, and developer productivity enhancements to streamline Python development workflows
|
|
5
5
|
Author-email: danielnachumdev <danielnachumdev@gmail.com>
|
|
6
6
|
License: MIT License
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_definitions.py
RENAMED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from typing import Dict, Any, List, Optional, Literal, Union, Type
|
|
3
3
|
from enum import Enum
|
|
4
|
-
from datetime import datetime, date, time
|
|
5
|
-
from uuid import UUID
|
|
6
4
|
|
|
7
5
|
try:
|
|
8
6
|
from pydantic import BaseModel, Field, ConfigDict
|
|
@@ -39,23 +37,16 @@ class ColumnType(str, Enum):
|
|
|
39
37
|
class BaseDBModel(BaseModel):
|
|
40
38
|
"""Base model with JSON serialization support"""
|
|
41
39
|
model_config = ConfigDict(
|
|
42
|
-
json_encoders={
|
|
43
|
-
datetime: lambda v: v.isoformat(),
|
|
44
|
-
date: lambda v: v.isoformat(),
|
|
45
|
-
time: lambda v: v.isoformat(),
|
|
46
|
-
UUID: lambda v: str(v),
|
|
47
|
-
Enum: lambda v: v.value
|
|
48
|
-
},
|
|
49
40
|
arbitrary_types_allowed=True
|
|
50
41
|
)
|
|
51
42
|
|
|
52
43
|
def to_dict(self) -> Dict[str, Any]:
|
|
53
44
|
"""Convert model to dictionary"""
|
|
54
|
-
return self.model_dump()
|
|
45
|
+
return self.model_dump(mode="json")
|
|
55
46
|
|
|
56
47
|
def to_json(self) -> str:
|
|
57
48
|
"""Convert model to JSON string"""
|
|
58
|
-
return
|
|
49
|
+
return self.model_dump_json()
|
|
59
50
|
|
|
60
51
|
@classmethod
|
|
61
52
|
def from_json(cls, json_str: str) -> 'BaseDBModel':
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
from typing import Dict, Any, List, Optional, Literal, Union
|
|
2
2
|
from enum import Enum
|
|
3
3
|
from pydantic import BaseModel, Field, ConfigDict
|
|
4
|
-
from datetime import datetime, date, time
|
|
5
|
-
from uuid import UUID
|
|
6
4
|
import json
|
|
7
5
|
|
|
8
6
|
|
|
@@ -33,23 +31,16 @@ class ColumnType(str, Enum):
|
|
|
33
31
|
class BaseDBModel(BaseModel):
|
|
34
32
|
"""Base model with JSON serialization support"""
|
|
35
33
|
model_config = ConfigDict(
|
|
36
|
-
json_encoders={
|
|
37
|
-
datetime: lambda v: v.isoformat(),
|
|
38
|
-
date: lambda v: v.isoformat(),
|
|
39
|
-
time: lambda v: v.isoformat(),
|
|
40
|
-
UUID: lambda v: str(v),
|
|
41
|
-
Enum: lambda v: v.value
|
|
42
|
-
},
|
|
43
34
|
arbitrary_types_allowed=True
|
|
44
35
|
)
|
|
45
36
|
|
|
46
37
|
def to_dict(self) -> Dict[str, Any]:
|
|
47
38
|
"""Convert model to dictionary"""
|
|
48
|
-
return self.model_dump()
|
|
39
|
+
return self.model_dump(mode="json")
|
|
49
40
|
|
|
50
41
|
def to_json(self) -> str:
|
|
51
42
|
"""Convert model to JSON string"""
|
|
52
|
-
return
|
|
43
|
+
return self.model_dump_json()
|
|
53
44
|
|
|
54
45
|
@classmethod
|
|
55
46
|
def from_json(cls, json_str: str) -> 'BaseDBModel':
|
|
@@ -5,7 +5,7 @@ Command-line interface for the test runner using Google Fire.
|
|
|
5
5
|
import logging
|
|
6
6
|
import fire
|
|
7
7
|
from typing import Optional, Literal
|
|
8
|
-
from .core import
|
|
8
|
+
from .core import UnittestRunner, VerboseLevel
|
|
9
9
|
|
|
10
10
|
logger = logging.getLogger(__name__)
|
|
11
11
|
|
|
@@ -34,7 +34,7 @@ def run_tests(python_path: Optional[str] = None,
|
|
|
34
34
|
logger.info("Starting test run with parameters: python_path=%s, results_file=%s, skip_threshold=%d, force=%s, target=%s, verbose=%s",
|
|
35
35
|
python_path, results_file, skip_threshold, force, target, verbose)
|
|
36
36
|
|
|
37
|
-
runner =
|
|
37
|
+
runner = UnittestRunner(
|
|
38
38
|
python_path=python_path,
|
|
39
39
|
results_file=results_file,
|
|
40
40
|
skip_threshold_hours=skip_threshold,
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/__init__.py
RENAMED
|
@@ -5,11 +5,11 @@ This package contains the core functionality split by responsibility:
|
|
|
5
5
|
- discovery: Test discovery and structure analysis
|
|
6
6
|
- execution: Test execution hierarchy
|
|
7
7
|
- parser: Output parsing and result processing
|
|
8
|
-
- runner: Main
|
|
8
|
+
- runner: Main UnittestRunner orchestration
|
|
9
9
|
- types: Type definitions and data structures
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
|
-
from .runner import
|
|
12
|
+
from .runner import UnittestRunner
|
|
13
13
|
|
|
14
14
|
# Define VerboseLevel here since it's a simple type alias
|
|
15
15
|
from typing import Literal
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/discovery.py
RENAMED
|
@@ -7,18 +7,18 @@ import os
|
|
|
7
7
|
import subprocess
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from typing import List, Dict, Optional, Tuple, Literal
|
|
10
|
-
from ..models import
|
|
10
|
+
from ..models import UnittestDiscovery
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
13
|
|
|
14
14
|
VerboseLevel = Literal["module", "file", "class", "function"]
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class
|
|
17
|
+
class UnittestDiscoveryService:
|
|
18
18
|
"""Handles discovery of test structure and target parsing."""
|
|
19
19
|
|
|
20
20
|
def __init__(self, python_path: str, verbose: VerboseLevel = "class"):
|
|
21
|
-
logger.debug("Initializing
|
|
21
|
+
logger.debug("Initializing UnittestDiscoveryService with python_path=%s, verbose=%s", python_path, verbose)
|
|
22
22
|
self._python_path = python_path
|
|
23
23
|
self._verbose = verbose
|
|
24
24
|
|
|
@@ -107,7 +107,7 @@ class TestDiscoveryService:
|
|
|
107
107
|
|
|
108
108
|
return sorted(test_modules)
|
|
109
109
|
|
|
110
|
-
def discover_test_structure(self, test_modules: List[str]) ->
|
|
110
|
+
def discover_test_structure(self, test_modules: List[str]) -> UnittestDiscovery:
|
|
111
111
|
"""Discover the complete test structure for progress tracking."""
|
|
112
112
|
logger.info("Discovering test structure for %d modules", len(test_modules))
|
|
113
113
|
if self._verbose in ["module", "file", "class", "function"]:
|
|
@@ -192,7 +192,7 @@ class TestDiscoveryService:
|
|
|
192
192
|
if self._verbose in ["module", "file", "class", "function"]:
|
|
193
193
|
print(f" ✅ Discovery complete: {len(modules)} modules, {total_classes} classes, {total_functions} functions")
|
|
194
194
|
|
|
195
|
-
discovery =
|
|
195
|
+
discovery = UnittestDiscovery(
|
|
196
196
|
modules=modules,
|
|
197
197
|
classes=classes,
|
|
198
198
|
functions=functions,
|
|
@@ -254,7 +254,7 @@ class TestDiscoveryService:
|
|
|
254
254
|
return module, class_name, function_name
|
|
255
255
|
|
|
256
256
|
def create_focused_discovery(self, target_module: str, target_class: Optional[str],
|
|
257
|
-
target_function: Optional[str], full_discovery:
|
|
257
|
+
target_function: Optional[str], full_discovery: UnittestDiscovery) -> UnittestDiscovery:
|
|
258
258
|
"""Create a focused test discovery based on target specification."""
|
|
259
259
|
logger.debug("Creating focused discovery for target: %s.%s.%s", target_module, target_class or '', target_function or '')
|
|
260
260
|
if self._verbose == "function":
|
|
@@ -312,7 +312,7 @@ class TestDiscoveryService:
|
|
|
312
312
|
logger.info("Created focused discovery: %d modules, %d classes, %d functions",
|
|
313
313
|
len(modules), total_classes, total_functions)
|
|
314
314
|
|
|
315
|
-
return
|
|
315
|
+
return UnittestDiscovery(
|
|
316
316
|
modules=modules,
|
|
317
317
|
classes=classes,
|
|
318
318
|
functions=functions,
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/execution.py
RENAMED
|
@@ -7,27 +7,27 @@ import logging
|
|
|
7
7
|
import time
|
|
8
8
|
import subprocess
|
|
9
9
|
from typing import List, Optional, Literal
|
|
10
|
-
from ..models import
|
|
11
|
-
from .parser import
|
|
10
|
+
from ..models import UnittestFunctionState, UnittestResult, ModuleState
|
|
11
|
+
from .parser import UnittestOutputParser
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
14
|
|
|
15
15
|
VerboseLevel = Literal["module", "file", "class", "function"]
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class
|
|
18
|
+
class UnittestExecutor:
|
|
19
19
|
"""Handles hierarchical test execution with _run_test_function as the core."""
|
|
20
20
|
|
|
21
21
|
def __init__(self, python_path: str, verbose: VerboseLevel = "class",
|
|
22
22
|
test_discovery: Optional[object] = None):
|
|
23
|
-
logger.debug("Initializing
|
|
23
|
+
logger.debug("Initializing UnittestExecutor with python_path=%s, verbose=%s", python_path, verbose)
|
|
24
24
|
self._python_path = python_path
|
|
25
25
|
self._verbose = verbose
|
|
26
26
|
self._test_discovery = test_discovery
|
|
27
|
-
self._parser =
|
|
27
|
+
self._parser = UnittestOutputParser(verbose)
|
|
28
28
|
|
|
29
29
|
def run_test_function(self, module_path: str, test_class: str, test_function: str,
|
|
30
|
-
function_index: int = 0, total_functions: int = 0) ->
|
|
30
|
+
function_index: int = 0, total_functions: int = 0) -> UnittestFunctionState:
|
|
31
31
|
"""Run a single test function and return its state. This is the core execution context."""
|
|
32
32
|
logger.debug("Running test function: %s.%s.%s", module_path, test_class, test_function)
|
|
33
33
|
indent = " " # 8 spaces for function level
|
|
@@ -66,7 +66,7 @@ class TestExecutor:
|
|
|
66
66
|
else:
|
|
67
67
|
# Create a failed state if parsing failed
|
|
68
68
|
logger.warning("Failed to parse test output for function: %s", test_function)
|
|
69
|
-
error_state =
|
|
69
|
+
error_state = UnittestFunctionState(
|
|
70
70
|
function_name=test_function,
|
|
71
71
|
status="error",
|
|
72
72
|
runtime=0.0,
|
|
@@ -82,7 +82,7 @@ class TestExecutor:
|
|
|
82
82
|
|
|
83
83
|
except Exception as e:
|
|
84
84
|
logger.error("Error running test function %s: %s", test_function, e)
|
|
85
|
-
error_state =
|
|
85
|
+
error_state = UnittestFunctionState(
|
|
86
86
|
function_name=test_function,
|
|
87
87
|
status="error",
|
|
88
88
|
runtime=0.0,
|
|
@@ -96,7 +96,7 @@ class TestExecutor:
|
|
|
96
96
|
print(f"{indent} ⚠ {test_function} (error) - {e}")
|
|
97
97
|
return error_state
|
|
98
98
|
|
|
99
|
-
def run_test_class(self, module_path: str, test_class: str, class_index: int = 0, total_classes: int = 0) -> List[
|
|
99
|
+
def run_test_class(self, module_path: str, test_class: str, class_index: int = 0, total_classes: int = 0) -> List[UnittestFunctionState]:
|
|
100
100
|
"""Run all test functions in a test class and return their states."""
|
|
101
101
|
logger.debug("Running test class: %s.%s", module_path, test_class)
|
|
102
102
|
indent = " " # 6 spaces for class level
|
|
@@ -162,7 +162,7 @@ class TestExecutor:
|
|
|
162
162
|
|
|
163
163
|
return test_functions
|
|
164
164
|
|
|
165
|
-
def run_test_file(self, module_path: str, file_index: int = 0, total_files: int = 0) -> List[
|
|
165
|
+
def run_test_file(self, module_path: str, file_index: int = 0, total_files: int = 0) -> List[UnittestFunctionState]:
|
|
166
166
|
"""Run all test classes in a test file and return all test function states."""
|
|
167
167
|
logger.debug("Running test file: %s", module_path)
|
|
168
168
|
indent = " " # 4 spaces for file level
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/parser.py
RENAMED
|
@@ -5,19 +5,19 @@ Output parsing and result processing functionality.
|
|
|
5
5
|
import logging
|
|
6
6
|
import time
|
|
7
7
|
from typing import List, Tuple
|
|
8
|
-
from ..models import
|
|
8
|
+
from ..models import UnittestFunctionState
|
|
9
9
|
|
|
10
10
|
logger = logging.getLogger(__name__)
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
class
|
|
13
|
+
class UnittestOutputParser:
|
|
14
14
|
"""Handles parsing of unittest output and creating test states."""
|
|
15
15
|
|
|
16
16
|
def __init__(self, verbose: str = "class"):
|
|
17
|
-
logger.debug("Initializing
|
|
17
|
+
logger.debug("Initializing UnittestOutputParser with verbose=%s", verbose)
|
|
18
18
|
self._verbose = verbose
|
|
19
19
|
|
|
20
|
-
def parse_test_output(self, output_lines: List[str], stderr_lines: List[str]) -> Tuple[List[
|
|
20
|
+
def parse_test_output(self, output_lines: List[str], stderr_lines: List[str]) -> Tuple[List[UnittestFunctionState], List[str], List[str]]:
|
|
21
21
|
"""Parse unittest output to extract individual test function results."""
|
|
22
22
|
logger.debug("Parsing test output: %d output lines, %d stderr lines", len(output_lines), len(stderr_lines))
|
|
23
23
|
test_functions = []
|
|
@@ -114,7 +114,7 @@ class TestOutputParser:
|
|
|
114
114
|
pass
|
|
115
115
|
|
|
116
116
|
# Create test function state
|
|
117
|
-
test_function =
|
|
117
|
+
test_function = UnittestFunctionState(
|
|
118
118
|
function_name=test_name,
|
|
119
119
|
status=status or "unknown",
|
|
120
120
|
runtime=runtime,
|
|
@@ -146,7 +146,7 @@ class TestOutputParser:
|
|
|
146
146
|
if match and int(match.group(1)) > 0:
|
|
147
147
|
# This is a summary line, but we can't extract individual results
|
|
148
148
|
# Just create a placeholder
|
|
149
|
-
test_function =
|
|
149
|
+
test_function = UnittestFunctionState(
|
|
150
150
|
function_name="unknown",
|
|
151
151
|
status="unknown",
|
|
152
152
|
runtime=0.0,
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/tools/unittest_test_runner/core/runner.py
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Main
|
|
2
|
+
Main UnittestRunner orchestration functionality.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
import logging
|
|
@@ -9,17 +9,17 @@ import time
|
|
|
9
9
|
import json
|
|
10
10
|
import subprocess
|
|
11
11
|
from typing import List, Optional, Literal, Tuple
|
|
12
|
-
from ..models import
|
|
13
|
-
from .discovery import
|
|
14
|
-
from .execution import
|
|
15
|
-
from .parser import
|
|
12
|
+
from ..models import UnittestFunctionState, ModuleState, UnittestResult, UnittestRunSummary, UnittestDiscovery
|
|
13
|
+
from .discovery import UnittestDiscoveryService
|
|
14
|
+
from .execution import UnittestExecutor
|
|
15
|
+
from .parser import UnittestOutputParser
|
|
16
16
|
|
|
17
17
|
logger = logging.getLogger(__name__)
|
|
18
18
|
|
|
19
19
|
VerboseLevel = Literal["module", "file", "class", "function"]
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
class
|
|
22
|
+
class UnittestRunner:
|
|
23
23
|
"""Smart test runner that executes tests module by module and collects detailed statistics."""
|
|
24
24
|
|
|
25
25
|
def __init__(self,
|
|
@@ -31,7 +31,7 @@ class TestRunner:
|
|
|
31
31
|
target: Optional[str] = None,
|
|
32
32
|
verbose: VerboseLevel = "class",
|
|
33
33
|
show_function_results: bool = False):
|
|
34
|
-
logger.info("Initializing
|
|
34
|
+
logger.info("Initializing UnittestRunner with python_path=%s, results_file=%s, skip_threshold_hours=%d, force_run=%s, target=%s, verbose=%s",
|
|
35
35
|
python_path, results_file, skip_threshold_hours, force_run, target, verbose)
|
|
36
36
|
|
|
37
37
|
self.python_path = python_path or sys.executable
|
|
@@ -61,12 +61,12 @@ class TestRunner:
|
|
|
61
61
|
|
|
62
62
|
# Initialize services
|
|
63
63
|
logger.debug("Initializing discovery service and parser")
|
|
64
|
-
self.discovery_service =
|
|
65
|
-
self.parser =
|
|
64
|
+
self.discovery_service = UnittestDiscoveryService(self.python_path, self.verbose)
|
|
65
|
+
self.parser = UnittestOutputParser(self.verbose)
|
|
66
66
|
|
|
67
67
|
# Initialize state
|
|
68
|
-
self.results: List[
|
|
69
|
-
self.previous_results: Optional[
|
|
68
|
+
self.results: List[UnittestResult] = []
|
|
69
|
+
self.previous_results: Optional[UnittestRunSummary] = None
|
|
70
70
|
logger.debug("Loading previous results from: %s", self.results_file)
|
|
71
71
|
self._load_previous_results()
|
|
72
72
|
|
|
@@ -90,7 +90,7 @@ class TestRunner:
|
|
|
90
90
|
self.test_modules = self.discovery_service.discover_test_modules()
|
|
91
91
|
|
|
92
92
|
logger.info("Discovered %d test modules", len(self.test_modules))
|
|
93
|
-
self.test_discovery: Optional[
|
|
93
|
+
self.test_discovery: Optional[UnittestDiscovery] = None
|
|
94
94
|
self._discover_test_structure()
|
|
95
95
|
|
|
96
96
|
# Apply target filtering if specified
|
|
@@ -109,7 +109,7 @@ class TestRunner:
|
|
|
109
109
|
|
|
110
110
|
# Initialize executor
|
|
111
111
|
logger.debug("Initializing test executor")
|
|
112
|
-
self.executor =
|
|
112
|
+
self.executor = UnittestExecutor(self.python_path, self.verbose, self.test_discovery)
|
|
113
113
|
|
|
114
114
|
def _discover_test_structure(self):
|
|
115
115
|
"""Discover the complete test structure for progress tracking."""
|
|
@@ -131,7 +131,7 @@ class TestRunner:
|
|
|
131
131
|
with open(self.results_file, 'r') as f:
|
|
132
132
|
data = json.load(f)
|
|
133
133
|
|
|
134
|
-
# Convert results list from dicts to
|
|
134
|
+
# Convert results list from dicts to UnittestResult objects
|
|
135
135
|
if 'results' in data and isinstance(data['results'], list):
|
|
136
136
|
results = []
|
|
137
137
|
logger.debug("Converting %d previous results from dicts to objects", len(data['results']))
|
|
@@ -139,15 +139,15 @@ class TestRunner:
|
|
|
139
139
|
# Convert nested dicts to proper objects
|
|
140
140
|
if 'module_state' in result_dict:
|
|
141
141
|
module_state_dict = result_dict['module_state']
|
|
142
|
-
# Convert test_functions dict to
|
|
142
|
+
# Convert test_functions dict to UnittestFunctionState objects
|
|
143
143
|
test_functions = {}
|
|
144
144
|
if 'test_functions' in module_state_dict:
|
|
145
145
|
for func_name, func_dict in module_state_dict['test_functions'].items():
|
|
146
|
-
test_functions[func_name] =
|
|
146
|
+
test_functions[func_name] = UnittestFunctionState(**func_dict)
|
|
147
147
|
|
|
148
148
|
# Create ModuleState objects
|
|
149
|
-
initial_state =
|
|
150
|
-
current_state =
|
|
149
|
+
initial_state = UnittestFunctionState(**module_state_dict['initial_state']) if module_state_dict.get('initial_state') else None
|
|
150
|
+
current_state = UnittestFunctionState(**module_state_dict['current_state']) if module_state_dict.get('current_state') else None
|
|
151
151
|
|
|
152
152
|
module_state = ModuleState(
|
|
153
153
|
initial_state=initial_state,
|
|
@@ -155,7 +155,7 @@ class TestRunner:
|
|
|
155
155
|
test_functions=test_functions
|
|
156
156
|
)
|
|
157
157
|
|
|
158
|
-
result =
|
|
158
|
+
result = UnittestResult(
|
|
159
159
|
module_path=result_dict['module_path'],
|
|
160
160
|
module_state=module_state,
|
|
161
161
|
errors=result_dict.get('errors', []),
|
|
@@ -165,7 +165,7 @@ class TestRunner:
|
|
|
165
165
|
|
|
166
166
|
data['results'] = results
|
|
167
167
|
|
|
168
|
-
self.previous_results =
|
|
168
|
+
self.previous_results = UnittestRunSummary(**data)
|
|
169
169
|
logger.info("Successfully loaded previous results: %d modules, %d tests",
|
|
170
170
|
self.previous_results.total_modules, self.previous_results.total_tests)
|
|
171
171
|
except Exception as e:
|
|
@@ -216,7 +216,7 @@ class TestRunner:
|
|
|
216
216
|
logger.debug("Module %s needs attention", module_path)
|
|
217
217
|
return False, "Module needs attention"
|
|
218
218
|
|
|
219
|
-
def _create_module_state(self, module_path: str, test_functions: List[
|
|
219
|
+
def _create_module_state(self, module_path: str, test_functions: List[UnittestFunctionState],
|
|
220
220
|
total_runtime: float) -> ModuleState:
|
|
221
221
|
"""Create a ModuleState from test function results."""
|
|
222
222
|
if not test_functions:
|
|
@@ -357,7 +357,7 @@ class TestRunner:
|
|
|
357
357
|
logger.info("All test execution completed")
|
|
358
358
|
self._print_final_summary()
|
|
359
359
|
|
|
360
|
-
def _run_test_module(self, module_path: str) ->
|
|
360
|
+
def _run_test_module(self, module_path: str) -> UnittestResult:
|
|
361
361
|
"""Run a single test module and collect detailed statistics."""
|
|
362
362
|
logger.debug("Running test module: %s", module_path)
|
|
363
363
|
if self.verbose in ["module", "file", "class", "function"]:
|
|
@@ -430,7 +430,7 @@ class TestRunner:
|
|
|
430
430
|
current_state.errors < initial_state.errors
|
|
431
431
|
)
|
|
432
432
|
|
|
433
|
-
return
|
|
433
|
+
return UnittestResult(
|
|
434
434
|
module_path=module_path,
|
|
435
435
|
initial_state=initial_state,
|
|
436
436
|
current_state=current_state,
|
|
@@ -447,7 +447,7 @@ class TestRunner:
|
|
|
447
447
|
|
|
448
448
|
# Create error state
|
|
449
449
|
current_state = self._create_module_state(module_path, [], time.time() - start_time)
|
|
450
|
-
return
|
|
450
|
+
return UnittestResult(
|
|
451
451
|
module_path=module_path,
|
|
452
452
|
initial_state=initial_state,
|
|
453
453
|
current_state=current_state,
|
|
@@ -463,7 +463,7 @@ class TestRunner:
|
|
|
463
463
|
|
|
464
464
|
# Create error state
|
|
465
465
|
current_state = self._create_module_state(module_path, [], time.time() - start_time)
|
|
466
|
-
return
|
|
466
|
+
return UnittestResult(
|
|
467
467
|
module_path=module_path,
|
|
468
468
|
initial_state=initial_state,
|
|
469
469
|
current_state=current_state,
|
|
@@ -534,7 +534,7 @@ class TestRunner:
|
|
|
534
534
|
total_execution_time = sum(r.current_state.total_runtime for r in self.results)
|
|
535
535
|
|
|
536
536
|
# Create summary
|
|
537
|
-
summary =
|
|
537
|
+
summary = UnittestRunSummary(
|
|
538
538
|
timestamp=time.strftime('%Y-%m-%d %H:%M:%S'),
|
|
539
539
|
python_executable=self.python_path,
|
|
540
540
|
total_modules=total_modules,
|
|
@@ -8,7 +8,7 @@ import time
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
@dataclass
|
|
11
|
-
class
|
|
11
|
+
class UnittestFunctionState:
|
|
12
12
|
"""State of an individual test function."""
|
|
13
13
|
function_name: str
|
|
14
14
|
status: str # "passed", "failed", "skipped", "error", "unknown"
|
|
@@ -25,7 +25,7 @@ class TestFunctionState:
|
|
|
25
25
|
class ModuleState:
|
|
26
26
|
"""State of a test module containing multiple test functions."""
|
|
27
27
|
module_path: str
|
|
28
|
-
test_functions: List[
|
|
28
|
+
test_functions: List[UnittestFunctionState]
|
|
29
29
|
total_tests: int
|
|
30
30
|
passed: int
|
|
31
31
|
failed: int
|
|
@@ -43,7 +43,7 @@ class ModuleState:
|
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
@dataclass
|
|
46
|
-
class
|
|
46
|
+
class UnittestResult:
|
|
47
47
|
"""Result of running a test module with initial and current states."""
|
|
48
48
|
module_path: str
|
|
49
49
|
initial_state: Optional[ModuleState]
|
|
@@ -54,7 +54,7 @@ class TestResult:
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
@dataclass
|
|
57
|
-
class
|
|
57
|
+
class UnittestRunSummary:
|
|
58
58
|
"""Summary of a complete test run across all modules."""
|
|
59
59
|
timestamp: str
|
|
60
60
|
python_executable: str
|
|
@@ -68,11 +68,11 @@ class TestRunSummary:
|
|
|
68
68
|
total_errors: int
|
|
69
69
|
success_rate: float
|
|
70
70
|
total_execution_time: float
|
|
71
|
-
results: List[
|
|
71
|
+
results: List[UnittestResult]
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
@dataclass
|
|
75
|
-
class
|
|
75
|
+
class UnittestDiscovery:
|
|
76
76
|
"""Represents discovered test structure for progress tracking."""
|
|
77
77
|
modules: List[str]
|
|
78
78
|
classes: Dict[str, List[str]] # module -> list of classes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: danielutils
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.26
|
|
4
4
|
Summary: A comprehensive Python utilities library providing type-safe collections, async programming tools, database abstractions, retry executors, data structures, and developer productivity enhancements to streamline Python development workflows
|
|
5
5
|
Author-email: danielnachumdev <danielnachumdev@gmail.com>
|
|
6
6
|
License: MIT License
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/database_initializer.py
RENAMED
|
File without changes
|
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/db/implementations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/multiprogramming/__init__.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/multiprogramming/multi_id.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/abstractions/multiprogramming/worker.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/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
|
|
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.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/__init__.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/factory.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/tdict.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/tlist.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/danielutils/better_builtins/typed_builtins/tset.py
RENAMED
|
File without changes
|
{danielutils-1.1.25 → danielutils-1.1.26}/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
|