holado 0.13.22__py3-none-any.whl
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.
- holado/__init__.py +358 -0
- holado/common/__init__.py +25 -0
- holado/common/context/__init__.py +25 -0
- holado/common/context/context.py +248 -0
- holado/common/context/service_manager.py +262 -0
- holado/common/context/session_context.py +516 -0
- holado/common/handlers/__init__.py +19 -0
- holado/common/handlers/enums.py +41 -0
- holado/common/handlers/object.py +175 -0
- holado/common/handlers/undefined.py +55 -0
- holado/common/tools/__init__.py +19 -0
- holado/common/tools/gc_manager.py +155 -0
- holado/holado_config.py +45 -0
- holado-0.13.22.dist-info/METADATA +194 -0
- holado-0.13.22.dist-info/RECORD +698 -0
- holado-0.13.22.dist-info/WHEEL +4 -0
- holado-0.13.22.dist-info/licenses/LICENSE +21 -0
- holado_ais/__init__.py +33 -0
- holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
- holado_ais/ais/ais_manager.py +151 -0
- holado_ais/ais/ais_messages.py +356 -0
- holado_ais/ais/ais_payload.py +35 -0
- holado_ais/ais/enums.py +37 -0
- holado_ais/ais/patch_pyais.py +1174 -0
- holado_ais/tests/behave/steps/__init__.py +17 -0
- holado_ais/tests/behave/steps/ais/__init__.py +0 -0
- holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
- holado_ais/tests/behave/steps/ais/ais_messages_steps.py +237 -0
- holado_binary/__init__.py +17 -0
- holado_binary/ipc/binary.py +125 -0
- holado_binary/ipc/bit_series.py +307 -0
- holado_binary/tests/behave/steps/__init__.py +17 -0
- holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
- holado_binary/tests/behave/steps/ipc/bit_series_steps.py +132 -0
- holado_context/__init__.py +16 -0
- holado_context/tests/behave/steps/__init__.py +16 -0
- holado_context/tests/behave/steps/private/__init__.py +16 -0
- holado_context/tests/behave/steps/private/common/context_steps.py +68 -0
- holado_core/__init__.py +32 -0
- holado_core/common/__init__.py +0 -0
- holado_core/common/actors/actions.py +97 -0
- holado_core/common/actors/actor.py +226 -0
- holado_core/common/actors/element_actor.py +32 -0
- holado_core/common/actors/find_actor.py +106 -0
- holado_core/common/actors/tree_actor.py +32 -0
- holado_core/common/actors/verify_actions.py +69 -0
- holado_core/common/block/base.py +122 -0
- holado_core/common/block/block_manager.py +173 -0
- holado_core/common/block/block_method.py +46 -0
- holado_core/common/block/block_steps.py +37 -0
- holado_core/common/block/function.py +42 -0
- holado_core/common/block/scope_function.py +28 -0
- holado_core/common/block/scope_manager.py +238 -0
- holado_core/common/block/scope_steps.py +141 -0
- holado_core/common/criterias/and_criteria.py +61 -0
- holado_core/common/criterias/criteria.py +78 -0
- holado_core/common/criterias/or_criteria.py +64 -0
- holado_core/common/criterias/tools/criteria_context.py +20 -0
- holado_core/common/criterias/tools/criteria_parameters.py +18 -0
- holado_core/common/drivers/driver.py +153 -0
- holado_core/common/drivers/element_driver.py +30 -0
- holado_core/common/drivers/element_internal_api.py +239 -0
- holado_core/common/drivers/internal_api.py +40 -0
- holado_core/common/drivers/tree_driver.py +30 -0
- holado_core/common/drivers/tree_internal_api.py +176 -0
- holado_core/common/exceptions/__init__.py +0 -0
- holado_core/common/exceptions/element_exception.py +28 -0
- holado_core/common/exceptions/exceptions.py +24 -0
- holado_core/common/exceptions/functional_exception.py +21 -0
- holado_core/common/exceptions/holado_exception.py +25 -0
- holado_core/common/exceptions/technical_exception.py +27 -0
- holado_core/common/exceptions/timeout_exception.py +20 -0
- holado_core/common/exceptions/verify_exception.py +20 -0
- holado_core/common/finders/after_in_tree_finder.py +87 -0
- holado_core/common/finders/element_finder.py +60 -0
- holado_core/common/finders/else_finder.py +105 -0
- holado_core/common/finders/finder.py +478 -0
- holado_core/common/finders/or_finder.py +98 -0
- holado_core/common/finders/then_finder.py +157 -0
- holado_core/common/finders/tools/enums.py +30 -0
- holado_core/common/finders/tools/find_builder.py +118 -0
- holado_core/common/finders/tools/find_context.py +405 -0
- holado_core/common/finders/tools/find_info.py +27 -0
- holado_core/common/finders/tools/find_parameters.py +240 -0
- holado_core/common/finders/tools/find_updater.py +95 -0
- holado_core/common/finders/tools/finder_info.py +26 -0
- holado_core/common/finders/tree_finder.py +146 -0
- holado_core/common/handlers/__init__.py +0 -0
- holado_core/common/handlers/abstracts/base_redo.py +702 -0
- holado_core/common/handlers/abstracts/get_or_create.py +120 -0
- holado_core/common/handlers/element_holder.py +122 -0
- holado_core/common/handlers/enums.py +23 -0
- holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
- holado_core/common/handlers/features/resource_by_name.py +187 -0
- holado_core/common/handlers/features/resource_by_type.py +174 -0
- holado_core/common/handlers/redo.py +119 -0
- holado_core/common/handlers/wait.py +127 -0
- holado_core/common/inspectors/element_inspector.py +57 -0
- holado_core/common/inspectors/inspector.py +221 -0
- holado_core/common/inspectors/tools/inspect_builder.py +169 -0
- holado_core/common/inspectors/tools/inspect_context.py +69 -0
- holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
- holado_core/common/inspectors/tree_inspector.py +73 -0
- holado_core/common/resource/persisted_data_manager.py +113 -0
- holado_core/common/resource/persisted_method_to_call_manager.py +263 -0
- holado_core/common/resource/resource_manager.py +126 -0
- holado_core/common/resource/table_data_manager.py +110 -0
- holado_core/common/tables/__init__.py +1 -0
- holado_core/common/tables/comparators/__init__.py +0 -0
- holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
- holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
- holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/string_table_comparator.py +29 -0
- holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
- holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
- holado_core/common/tables/comparators/table_comparator.py +209 -0
- holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
- holado_core/common/tables/comparators/table_row_comparator.py +116 -0
- holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
- holado_core/common/tables/converters/__init__.py +0 -0
- holado_core/common/tables/converters/table_converter.py +233 -0
- holado_core/common/tables/enums.py +23 -0
- holado_core/common/tables/table.py +261 -0
- holado_core/common/tables/table_cell.py +126 -0
- holado_core/common/tables/table_manager.py +365 -0
- holado_core/common/tables/table_row.py +169 -0
- holado_core/common/tables/table_with_header.py +242 -0
- holado_core/common/tools/__init__.py +0 -0
- holado_core/common/tools/comparators/comparator.py +151 -0
- holado_core/common/tools/comparators/object_comparator.py +21 -0
- holado_core/common/tools/converters/converter.py +118 -0
- holado_core/common/tools/path_manager.py +238 -0
- holado_core/common/tools/string_tools.py +144 -0
- holado_core/common/tools/tools.py +197 -0
- holado_core/tests/behave/steps/__init__.py +20 -0
- holado_core/tests/behave/steps/common/__init__.py +0 -0
- holado_core/tests/behave/steps/common/common_steps.py +137 -0
- holado_core/tests/behave/steps/common/config_steps.py +42 -0
- holado_core/tests/behave/steps/common/resource_steps.py +62 -0
- holado_core/tests/behave/steps/common/tables_steps.py +560 -0
- holado_core/tools/__init__.py +0 -0
- holado_core/tools/abstracts/__init__.py +0 -0
- holado_core/tools/abstracts/blocking_command_service.py +64 -0
- holado_core/tools/abstracts/service.py +48 -0
- holado_crypto/__init__.py +31 -0
- holado_crypto/crypto/crypto.py +108 -0
- holado_crypto/crypto/key.py +92 -0
- holado_crypto/crypto/tcpbin.py +105 -0
- holado_crypto/crypto/transport/__init__.py +0 -0
- holado_crypto/crypto/transport/crc.py +40 -0
- holado_crypto/tests/behave/steps/__init__.py +18 -0
- holado_crypto/tests/behave/steps/crypto_steps.py +112 -0
- holado_crypto/tests/behave/steps/key_steps.py +82 -0
- holado_crypto/tests/behave/steps/tcpbin_steps.py +79 -0
- holado_data/__init__.py +31 -0
- holado_data/data/generator/base.py +93 -0
- holado_data/data/generator/generator_manager.py +27 -0
- holado_data/data/generator/python_generator.py +30 -0
- holado_data/tests/behave/steps/__init__.py +17 -0
- holado_data/tests/behave/steps/data/generator_steps.py +91 -0
- holado_data/tests/behave/steps/tools/utils_steps.py +59 -0
- holado_db/__init__.py +32 -0
- holado_db/tests/behave/steps/__init__.py +18 -0
- holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
- holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
- holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
- holado_db/tools/db/clients/base/db_audit.py +94 -0
- holado_db/tools/db/clients/base/db_client.py +344 -0
- holado_db/tools/db/clients/postgresql/postgresql_audit.py +75 -0
- holado_db/tools/db/clients/postgresql/postgresql_client.py +84 -0
- holado_db/tools/db/clients/sqlite/sqlite_audit.py +70 -0
- holado_db/tools/db/clients/sqlite/sqlite_client.py +60 -0
- holado_db/tools/db/db_manager.py +109 -0
- holado_db/tools/db/query/base/query_builder.py +138 -0
- holado_db/tools/db/query/pypika/pypika_query_builder.py +244 -0
- holado_db/tools/db/query/query_manager.py +77 -0
- holado_django/__init__.py +31 -0
- holado_django/server/HOWTO.txt +27 -0
- holado_django/server/django_projects/rest_api/db.sqlite3 +0 -0
- holado_django/server/django_projects/rest_api/manage.py +22 -0
- holado_django/server/django_projects/rest_api/rest_api/__init__.py +0 -0
- holado_django/server/django_projects/rest_api/rest_api/application/__init__.py +0 -0
- holado_django/server/django_projects/rest_api/rest_api/application/admin.py +3 -0
- holado_django/server/django_projects/rest_api/rest_api/application/apps.py +9 -0
- holado_django/server/django_projects/rest_api/rest_api/application/migrations/__init__.py +0 -0
- holado_django/server/django_projects/rest_api/rest_api/application/models.py +3 -0
- holado_django/server/django_projects/rest_api/rest_api/application/tests.py +3 -0
- holado_django/server/django_projects/rest_api/rest_api/application/views.py +6 -0
- holado_django/server/django_projects/rest_api/rest_api/asgi.py +16 -0
- holado_django/server/django_projects/rest_api/rest_api/settings.py +130 -0
- holado_django/server/django_projects/rest_api/rest_api/urls.py +35 -0
- holado_django/server/django_projects/rest_api/rest_api/wsgi.py +16 -0
- holado_django/server/django_server.py +110 -0
- holado_django/server/grpc_django_server.py +57 -0
- holado_django/server/patch_djangogrpcframework.py +46 -0
- holado_django/tests/behave/steps/__init__.py +16 -0
- holado_django/tests/behave/steps/django_server_steps.py +83 -0
- holado_docker/__init__.py +25 -0
- holado_docker/sdk/docker/container_logs.py +447 -0
- holado_docker/sdk/docker/docker_client.py +537 -0
- holado_docker/sdk/docker/docker_service.py +71 -0
- holado_docker/tests/behave/steps/__init__.py +16 -0
- holado_docker/tests/behave/steps/sdk/docker/container_logs_steps.py +47 -0
- holado_examples/projects/server_rest/server_rest_example/initialize_holado.py +72 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/db.sqlite3 +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/manage.py +22 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/__init__.py +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/__init__.py +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/admin.py +3 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/apps.py +7 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/migrations/__init__.py +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/models.py +3 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/serializers.py +15 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/tests.py +3 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/views.py +24 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/asgi.py +16 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/settings.py +130 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/urls.py +31 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/wsgi.py +16 -0
- holado_examples/projects/server_rest/server_rest_example/rest_server.py +37 -0
- holado_examples/scripts/script_custom_initialization.py +16 -0
- holado_examples/scripts/script_minimal_initialization.py +23 -0
- holado_examples/tests/behave/testing_solution/__main__.py +13 -0
- holado_examples/tests/behave/testing_solution/behave_environment.py +35 -0
- holado_examples/tests/behave/testing_solution/environment.py +36 -0
- holado_examples/tests/behave/testing_solution/features/Configuration/Actions/configure_system.feature +10 -0
- holado_examples/tests/behave/testing_solution/features/NonReg/example.feature +26 -0
- holado_examples/tests/behave/testing_solution/initialize_holado.py +62 -0
- holado_examples/tests/behave/testing_solution/logging.conf +102 -0
- holado_examples/tests/behave/testing_solution/requirements.txt +5 -0
- holado_examples/tests/behave/testing_solution/run_test.sh +7 -0
- holado_examples/tests/behave/testing_solution/run_test_nonreg.sh +6 -0
- holado_examples/tests/behave/testing_solution/src/common/tools/path_manager.py +40 -0
- holado_examples/tests/behave/testing_solution/src/config/config_manager.py +30 -0
- holado_examples/tests/behave/testing_solution/src/context/session_context.py +45 -0
- holado_examples/tests/behave/testing_solution/steps/config_steps.py +21 -0
- holado_examples/tests/behave/testing_solution/steps/public_steps.py +10 -0
- holado_grpc/TODO +8 -0
- holado_grpc/__init__.py +40 -0
- holado_grpc/api/rpc/TODO.txt +4 -0
- holado_grpc/api/rpc/grpc_client.py +210 -0
- holado_grpc/api/rpc/grpc_manager.py +81 -0
- holado_grpc/ipc/rpc/__init__.py +0 -0
- holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
- holado_grpc/ipc/rpc/grpc_services.py +165 -0
- holado_grpc/tests/behave/steps/__init__.py +16 -0
- holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
- holado_grpc/tests/behave/steps/private/__init__.py +16 -0
- holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
- holado_helper/__init__.py +35 -0
- holado_helper/debug/README.txt +32 -0
- holado_helper/debug/memory/memory_profiler.py +106 -0
- holado_helper/docker/init_user.sh +24 -0
- holado_helper/docker/logging.conf +44 -0
- holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
- holado_helper/docker/run_terminal_in_docker.sh +101 -0
- holado_helper/holado_module_template/__init__.py +38 -0
- holado_helper/holado_module_template/tests/behave/steps/__init__.py +16 -0
- holado_helper/holado_module_template/tests/behave/steps/private/__init__.py +16 -0
- holado_helper/initialize_holado.py +72 -0
- holado_helper/script/action.py +130 -0
- holado_helper/script/action_script.py +477 -0
- holado_helper/script/any_action_script.py +126 -0
- holado_helper/script/behave_action_script.py +99 -0
- holado_helper/script/csv_action_script.py +142 -0
- holado_helper/script/initialize_script.py +95 -0
- holado_helper/script/input_output_script.py +136 -0
- holado_helper/script/job.py +75 -0
- holado_helper/script/json_action_script.py +104 -0
- holado_helper/script/script.py +110 -0
- holado_json/__init__.py +16 -0
- holado_json/filesystem/json_file.py +94 -0
- holado_json/filesystem/stream_json_file.py +117 -0
- holado_json/ipc/json.py +146 -0
- holado_json/ipc/json_converter.py +69 -0
- holado_json/ipc/json_types.py +183 -0
- holado_json/tests/behave/steps/__init__.py +16 -0
- holado_json/tests/behave/steps/ipc/__init__.py +0 -0
- holado_json/tests/behave/steps/ipc/json_steps.py +131 -0
- holado_keycloak/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +73 -0
- holado_keycloak/tools/keycloak/__init__.py +0 -0
- holado_keycloak/tools/keycloak/keycloak_client.py +90 -0
- holado_logging/__init__.py +38 -0
- holado_logging/common/logging/holado_logger.py +71 -0
- holado_logging/common/logging/log_config.py +163 -0
- holado_logging/common/logging/log_manager.py +335 -0
- holado_multitask/__init__.py +33 -0
- holado_multitask/multiprocessing/context/process_context.py +35 -0
- holado_multitask/multiprocessing/function_process.py +102 -0
- holado_multitask/multiprocessing/periodic_function_process.py +137 -0
- holado_multitask/multiprocessing/process.py +213 -0
- holado_multitask/multiprocessing/processesmanager.py +137 -0
- holado_multitask/multitasking/multitask_manager.py +464 -0
- holado_multitask/multithreading/__init__.py +0 -0
- holado_multitask/multithreading/context/thread_context.py +86 -0
- holado_multitask/multithreading/functionthreaded.py +129 -0
- holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
- holado_multitask/multithreading/loopthread.py +110 -0
- holado_multitask/multithreading/periodicfunctionthreaded.py +135 -0
- holado_multitask/multithreading/reflection/inspect.py +47 -0
- holado_multitask/multithreading/reflection/sys.py +29 -0
- holado_multitask/multithreading/reflection/traceback.py +35 -0
- holado_multitask/multithreading/thread.py +203 -0
- holado_multitask/multithreading/threadsmanager.py +167 -0
- holado_multitask/multithreading/timer.py +51 -0
- holado_multitask/tests/behave/steps/__init__.py +17 -0
- holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
- holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
- holado_protobuf/__init__.py +61 -0
- holado_protobuf/ipc/protobuf/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
- holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
- holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
- holado_protobuf/ipc/protobuf/protobuf_messages.py +968 -0
- holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
- holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
- holado_protobuf/tests/behave/steps/__init__.py +16 -0
- holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
- holado_python/__init__.py +36 -0
- holado_python/common/enums.py +34 -0
- holado_python/common/iterables.py +38 -0
- holado_python/common/tools/comparators/boolean_comparator.py +37 -0
- holado_python/common/tools/comparators/bytes_comparator.py +48 -0
- holado_python/common/tools/comparators/datetime_comparator.py +74 -0
- holado_python/common/tools/comparators/float_comparator.py +97 -0
- holado_python/common/tools/comparators/integer_comparator.py +37 -0
- holado_python/common/tools/comparators/string_comparator.py +99 -0
- holado_python/common/tools/comparators/type_comparator.py +31 -0
- holado_python/common/tools/datetime.py +341 -0
- holado_python/standard_library/csv.py +207 -0
- holado_python/standard_library/hashlib.py +110 -0
- holado_python/standard_library/multiprocessing.py +62 -0
- holado_python/standard_library/queue.py +79 -0
- holado_python/standard_library/socket/blocking_socket.py +219 -0
- holado_python/standard_library/socket/echo_server.py +29 -0
- holado_python/standard_library/socket/message_socket.py +152 -0
- holado_python/standard_library/socket/non_blocking_socket.py +172 -0
- holado_python/standard_library/socket/socket.py +411 -0
- holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
- holado_python/standard_library/ssl/ssl.py +131 -0
- holado_python/standard_library/typing.py +192 -0
- holado_python/tests/behave/steps/__init__.py +27 -0
- holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
- holado_python/tests/behave/steps/convert_steps.py +59 -0
- holado_python/tests/behave/steps/iterable_steps.py +87 -0
- holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
- holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
- holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
- holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
- holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
- holado_python/tests/behave/steps/standard_library/socket_steps.py +384 -0
- holado_python/tests/behave/steps/standard_library/ssl_steps.py +71 -0
- holado_rabbitmq/__init__.py +28 -0
- holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +565 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +333 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +678 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +146 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
- holado_redis/__init__.py +17 -0
- holado_redis/tests/behave/steps/__init__.py +16 -0
- holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
- holado_redis/tools/redis/TODO.txt +7 -0
- holado_redis/tools/redis/redis_client.py +190 -0
- holado_redis/tools/redis/redis_manager.py +38 -0
- holado_report/__init__.py +36 -0
- holado_report/campaign/campaign_manager.py +348 -0
- holado_report/report/analyze/execution_historic_manager.py +96 -0
- holado_report/report/analyze/scenario_duration_manager.py +245 -0
- holado_report/report/builders/detailed_scenario_report_builder.py +172 -0
- holado_report/report/builders/execution_historic_report_builder.py +132 -0
- holado_report/report/builders/failure_report_builder.py +150 -0
- holado_report/report/builders/report_builder.py +64 -0
- holado_report/report/builders/short_scenario_report_builder.py +94 -0
- holado_report/report/builders/summary_by_category_report_builder.py +103 -0
- holado_report/report/builders/summary_report_builder.py +110 -0
- holado_report/report/builders/summary_scenario_by_category_report_builder.py +109 -0
- holado_report/report/builders/summary_scenario_report_builder.py +81 -0
- holado_report/report/execution_historic.py +144 -0
- holado_report/report/report_manager.py +424 -0
- holado_report/report/reports/base_report.py +163 -0
- holado_report/report/reports/feature_report.py +106 -0
- holado_report/report/reports/scenario_report.py +64 -0
- holado_rest/__init__.py +32 -0
- holado_rest/api/rest/TODO.txt +2 -0
- holado_rest/api/rest/rest_client.py +200 -0
- holado_rest/api/rest/rest_manager.py +72 -0
- holado_rest/tests/behave/steps/__init__.py +16 -0
- holado_rest/tests/behave/steps/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/api/rest_client_steps.py +181 -0
- holado_rest/tests/behave/steps/private/__init__.py +16 -0
- holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/private/api/rest_steps.py +75 -0
- holado_s3/__init__.py +17 -0
- holado_s3/tests/behave/steps/__init__.py +17 -0
- holado_s3/tests/behave/steps/private/__init__.py +16 -0
- holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
- holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
- holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
- holado_s3/tools/s3/__init__.py +0 -0
- holado_s3/tools/s3/boto3_s3_client.py +59 -0
- holado_s3/tools/s3/minio_client.py +75 -0
- holado_s3/tools/s3/moto_server.py +52 -0
- holado_scripting/__init__.py +54 -0
- holado_scripting/common/tools/dynamic_text_manager.py +73 -0
- holado_scripting/common/tools/evaluate_parameters.py +228 -0
- holado_scripting/common/tools/expression_evaluator.py +389 -0
- holado_scripting/common/tools/variable_manager.py +354 -0
- holado_scripting/tests/behave/steps/__init__.py +22 -0
- holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +159 -0
- holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
- holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
- holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
- holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
- holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
- holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
- holado_scripting/text/base/base_function.py +25 -0
- holado_scripting/text/base/base_verify_function.py +25 -0
- holado_scripting/text/base/text_inspecter.py +204 -0
- holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
- holado_scripting/text/interpreter/functions/function_apply_function.py +60 -0
- holado_scripting/text/interpreter/functions/function_cast.py +60 -0
- holado_scripting/text/interpreter/functions/function_convert.py +57 -0
- holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
- holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
- holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
- holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
- holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
- holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
- holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
- holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
- holado_scripting/text/interpreter/functions/function_to_string.py +50 -0
- holado_scripting/text/interpreter/text_interpreter.py +219 -0
- holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
- holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
- holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
- holado_scripting/text/verifier/text_verifier.py +103 -0
- holado_sftp/__init__.py +16 -0
- holado_sftp/tests/behave/steps/__init__.py +17 -0
- holado_sftp/tests/behave/steps/private/__init__.py +16 -0
- holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
- holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
- holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
- holado_sftp/tools/sftp/__init__.py +0 -0
- holado_sftp/tools/sftp/sftp_client.py +103 -0
- holado_sftp/tools/sftp/sftp_server.py +39 -0
- holado_swagger/__init__.py +31 -0
- holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
- holado_swagger/swagger_hub/mockserver/mockserver_manager.py +33 -0
- holado_swagger/tests/behave/steps/__init__.py +16 -0
- holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
- holado_system/system/command/command.py +247 -0
- holado_system/system/command/command_result.py +128 -0
- holado_system/system/command/curl_command.py +101 -0
- holado_system/system/command/exceptions.py +59 -0
- holado_system/system/filesystem/file.py +150 -0
- holado_system/system/global_system.py +187 -0
- holado_system/tests/behave/steps/__init__.py +18 -0
- holado_system/tests/behave/steps/system/commands_steps.py +92 -0
- holado_system/tests/behave/steps/system/file_steps.py +231 -0
- holado_system/tests/behave/steps/system/system_steps.py +84 -0
- holado_test/__init__.py +30 -0
- holado_test/behave/__init__.py +0 -0
- holado_test/behave/behave.py +400 -0
- holado_test/behave/behave_environment.py +169 -0
- holado_test/behave/behave_function.py +33 -0
- holado_test/behave/behave_manager.py +558 -0
- holado_test/behave/independant_runner.py +66 -0
- holado_test/behave/scenario/__init__.py +0 -0
- holado_test/behave/scenario/behave_step_tools.py +157 -0
- holado_test/common/context/feature_context.py +81 -0
- holado_test/common/context/scenario_context.py +169 -0
- holado_test/common/context/step_context.py +66 -0
- holado_test/common/exceptions/undefined_step_exception.py +21 -0
- holado_test/scenario/step_tools.py +547 -0
- holado_test/scenario/tester_tools.py +57 -0
- holado_test/test_config.py +26 -0
- holado_test/tests/behave/steps/__init__.py +18 -0
- holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
- holado_test/tests/behave/steps/scenario/scenario_steps.py +100 -0
- holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
- holado_test/tools/test_server/client/rest/test_server_client.py +150 -0
- holado_test/tools/test_server/server/Dockerfile +60 -0
- holado_test/tools/test_server/server/core/server_context.py +42 -0
- holado_test/tools/test_server/server/core/server_manager.py +41 -0
- holado_test/tools/test_server/server/requirements.txt +2 -0
- holado_test/tools/test_server/server/rest/README +2 -0
- holado_test/tools/test_server/server/rest/api/__init__.py +24 -0
- holado_test/tools/test_server/server/rest/api/campaign/__init__.py +32 -0
- holado_test/tools/test_server/server/rest/api/campaign/scenario.py +40 -0
- holado_test/tools/test_server/server/rest/initialize_holado.py +72 -0
- holado_test/tools/test_server/server/rest/logging.conf +51 -0
- holado_test/tools/test_server/server/rest/openapi.yaml +57 -0
- holado_test/tools/test_server/server/rest/run.py +41 -0
- holado_test/tools/test_server/server/run.sh +6 -0
- holado_test/tools/test_server/server/run_test_server_in_docker.sh +104 -0
- holado_tools/__init__.py +38 -0
- holado_tools/scripts/execute_persisted_post_processes/execute_persisted_post_processes.py +36 -0
- holado_tools/scripts/execute_persisted_post_processes/execute_persisted_post_processes.sh +6 -0
- holado_tools/scripts/execute_persisted_post_processes/initialize_holado.py +62 -0
- holado_tools/tests/behave/steps/__init__.py +16 -0
- holado_tools/tests/behave/steps/tools/host_controller/client_steps.py +97 -0
- holado_tools/tools/host_controller/client/rest/host_controller_client.py +275 -0
- holado_tools/tools/host_controller/server/Dockerfile +60 -0
- holado_tools/tools/host_controller/server/requirements.txt +2 -0
- holado_tools/tools/host_controller/server/rest/README +2 -0
- holado_tools/tools/host_controller/server/rest/api/__init__.py +24 -0
- holado_tools/tools/host_controller/server/rest/api/config.py +88 -0
- holado_tools/tools/host_controller/server/rest/api/docker/__init__.py +66 -0
- holado_tools/tools/host_controller/server/rest/api/docker/container.py +144 -0
- holado_tools/tools/host_controller/server/rest/api/docker/logs.py +66 -0
- holado_tools/tools/host_controller/server/rest/api/os.py +58 -0
- holado_tools/tools/host_controller/server/rest/initialize_holado.py +72 -0
- holado_tools/tools/host_controller/server/rest/openapi.yaml +561 -0
- holado_tools/tools/host_controller/server/rest/run.py +31 -0
- holado_tools/tools/host_controller/server/run_host_controller_in_docker.sh +107 -0
- holado_tools/tools/host_viewer/client/rest/host_viewer_client.py +190 -0
- holado_tools/tools/host_viewer/server/Dockerfile +60 -0
- holado_tools/tools/host_viewer/server/requirements.txt +2 -0
- holado_tools/tools/host_viewer/server/rest/README +2 -0
- holado_tools/tools/host_viewer/server/rest/api/__init__.py +24 -0
- holado_tools/tools/host_viewer/server/rest/api/docker/__init__.py +65 -0
- holado_tools/tools/host_viewer/server/rest/api/docker/container.py +87 -0
- holado_tools/tools/host_viewer/server/rest/api/os.py +58 -0
- holado_tools/tools/host_viewer/server/rest/initialize_holado.py +72 -0
- holado_tools/tools/host_viewer/server/rest/openapi.yaml +301 -0
- holado_tools/tools/host_viewer/server/rest/run.py +31 -0
- holado_tools/tools/host_viewer/server/run_host_viewer_in_docker.sh +107 -0
- holado_value/__init__.py +24 -0
- holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +196 -0
- holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
- holado_value/common/tables/converters/value_table_converter.py +267 -0
- holado_value/common/tables/value_table.py +29 -0
- holado_value/common/tables/value_table_cell.py +76 -0
- holado_value/common/tables/value_table_manager.py +48 -0
- holado_value/common/tables/value_table_row.py +43 -0
- holado_value/common/tables/value_table_with_header.py +28 -0
- holado_value/common/tools/unique_value_manager.py +109 -0
- holado_value/common/tools/value.py +191 -0
- holado_value/common/tools/value_types.py +41 -0
- holado_value/tests/behave/steps/__init__.py +16 -0
- holado_value/tests/behave/steps/private/__init__.py +16 -0
- holado_ws/__init__.py +16 -0
- holado_ws/api/ws/TODO.txt +2 -0
- holado_ws/tests/behave/steps/__init__.py +16 -0
- holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
- holado_xml/__init__.py +38 -0
- holado_xml/tests/behave/steps/__init__.py +16 -0
- holado_xml/tests/behave/steps/private/__init__.py +16 -0
- holado_xml/xml/stream_xml_file.py +181 -0
- holado_xml/xml/xml_file.py +97 -0
- holado_xml/xml/xml_manager.py +35 -0
- holado_yaml/__init__.py +31 -0
- holado_yaml/tests/behave/steps/__init__.py +16 -0
- holado_yaml/tests/behave/steps/yaml_steps.py +161 -0
- holado_yaml/yaml/enums.py +28 -0
- holado_yaml/yaml/pyyaml/pyyaml_client.py +72 -0
- holado_yaml/yaml/ruamel/ruamel_yaml_client.py +80 -0
- holado_yaml/yaml/yaml_client.py +203 -0
- holado_yaml/yaml/yaml_manager.py +94 -0
- test_holado/Dockerfile_test_holado +82 -0
- test_holado/__init__.py +4 -0
- test_holado/__main__.py +25 -0
- test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
- test_holado/environment.py +60 -0
- test_holado/features/Configuration/Actions/execute_persisted_post_processes.feature +13 -0
- test_holado/features/NonReg/api/REST.feature +26 -0
- test_holado/features/NonReg/api/gRPC.feature +116 -0
- test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
- test_holado/features/NonReg/common/system/commands.feature +43 -0
- test_holado/features/NonReg/common/system/system.feature +20 -0
- test_holado/features/NonReg/common/tables/table.feature +245 -0
- test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
- test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
- test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
- test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
- test_holado/features/NonReg/holado_ais/ais_message-nmea_raw_to_dict.feature +93 -0
- test_holado/features/NonReg/holado_ais/message_types/type-10.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-12.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-14.feature +36 -0
- test_holado/features/NonReg/holado_ais/message_types/type-15.feature +36 -0
- test_holado/features/NonReg/holado_ais/message_types/type-16.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-17.feature +46 -0
- test_holado/features/NonReg/holado_ais/message_types/type-18.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-19.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-1_2_3.feature +42 -0
- test_holado/features/NonReg/holado_ais/message_types/type-20.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-21.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-22.feature +84 -0
- test_holado/features/NonReg/holado_ais/message_types/type-23.feature +49 -0
- test_holado/features/NonReg/holado_ais/message_types/type-24.feature +72 -0
- test_holado/features/NonReg/holado_ais/message_types/type-25.feature +143 -0
- test_holado/features/NonReg/holado_ais/message_types/type-26.feature +144 -0
- test_holado/features/NonReg/holado_ais/message_types/type-27.feature +36 -0
- test_holado/features/NonReg/holado_ais/message_types/type-4_11.feature +39 -0
- test_holado/features/NonReg/holado_ais/message_types/type-5.feature +33 -0
- test_holado/features/NonReg/holado_ais/message_types/type-6.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-7_13.feature +43 -0
- test_holado/features/NonReg/holado_ais/message_types/type-8.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-9.feature +37 -0
- test_holado/features/NonReg/holado_binary/bit_series.error.feature +33 -0
- test_holado/features/NonReg/holado_binary/bit_series.feature +144 -0
- test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
- test_holado/features/NonReg/holado_python/convert.feature +20 -0
- test_holado/features/NonReg/holado_python/iterable.feature +61 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_reset.feature +191 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_with_tls_and_verify.feature +279 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_with_tls_without_verify.feature +299 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_without_tls.feature +163 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_with_mtls.feature +214 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_with_tls.feature +184 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_without_tls.feature +169 -0
- test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
- test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
- test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
- test_holado/features/NonReg/holado_yaml/yaml.feature +514 -0
- test_holado/features/NonReg/ipc/json.feature +20 -0
- test_holado/features/NonReg/scenario/scenario.feature +183 -0
- test_holado/features/NonReg/test_steps/behave.feature +275 -0
- test_holado/features/NonReg/test_steps/common.feature +100 -0
- test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
- test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
- test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
- test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
- test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
- test_holado/features/NonReg/tools/sFTP.feature +25 -0
- test_holado/features/Test/logger.feature +28 -0
- test_holado/features/Test/test_host_controller.feature +13 -0
- test_holado/features/Test/test_parameter.feature +15 -0
- test_holado/features/__init__.py +0 -0
- test_holado/initialize_holado.py +62 -0
- test_holado/logging.conf +53 -0
- test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
- test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
- test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
- test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
- test_holado/resources/scripts/list_tags.sh +2 -0
- test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
- test_holado/steps/__init__.py +0 -0
- test_holado/steps/private_steps.py +20 -0
- test_holado/steps/public_steps.py +23 -0
- test_holado/test_holado_session_context.py +43 -0
- test_holado/tools/connexion/api_rest/openapi.yaml +16 -0
- test_holado/tools/connexion/api_rest/run.py +19 -0
- test_holado/tools/django/README.txt +3 -0
- test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
- test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
- test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
- test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
- test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
- test_holado/tools/django/api_grpc/manage.py +29 -0
- test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
- test_holado/tools/django/api_grpc/patch_djangogrpcframework.py +42 -0
- test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
- test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
- test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
- test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
- test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
- test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
- test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
- test_holado/tools/django/api_rest/db.sqlite3 +0 -0
- test_holado/tools/django/api_rest/manage.py +22 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class LogConfig(object):
|
|
21
|
+
TLogger = None
|
|
22
|
+
TManager = None
|
|
23
|
+
config_file_path = None
|
|
24
|
+
default_level = logging.INFO
|
|
25
|
+
log_time_in_utc = True
|
|
26
|
+
log_on_console=False
|
|
27
|
+
log_in_file=True
|
|
28
|
+
__is_configured = False
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def configure(cls, use_holado_logger=True, config_file_path=None, log_level=None, log_time_in_utc=None, log_on_console=False, log_in_file=True):
|
|
32
|
+
if cls.__is_configured:
|
|
33
|
+
logging.warning(f"Logging was already configured, it is not possible to configure it twice. This new configuration is skipped.")
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
# Use holado loggers
|
|
37
|
+
if use_holado_logger:
|
|
38
|
+
cls.__set_holado_loggers()
|
|
39
|
+
|
|
40
|
+
# HolAdo needs at least to add logging level TRACE and PRINT
|
|
41
|
+
cls.add_logging_level_trace()
|
|
42
|
+
cls.add_logging_level_print()
|
|
43
|
+
|
|
44
|
+
cls.config_file_path = config_file_path
|
|
45
|
+
if config_file_path:
|
|
46
|
+
import configparser
|
|
47
|
+
config = configparser.ConfigParser()
|
|
48
|
+
config.read(config_file_path)
|
|
49
|
+
log_level = config.get("holado", "level", fallback=log_level)
|
|
50
|
+
log_time_in_utc = config.getboolean("holado", "log_time_in_utc", fallback=log_time_in_utc)
|
|
51
|
+
log_on_console = config.get("holado", "log_on_console", fallback=log_on_console)
|
|
52
|
+
log_in_file = config.get("holado", "log_in_file", fallback=log_in_file)
|
|
53
|
+
|
|
54
|
+
if log_level:
|
|
55
|
+
if isinstance(log_level, str):
|
|
56
|
+
log_level = logging._nameToLevel[log_level]
|
|
57
|
+
cls.default_level = log_level
|
|
58
|
+
if log_time_in_utc is not None:
|
|
59
|
+
cls.log_time_in_utc = log_time_in_utc
|
|
60
|
+
if log_on_console:
|
|
61
|
+
if isinstance(log_on_console, str):
|
|
62
|
+
log_on_console = True if log_on_console == "True" else False
|
|
63
|
+
cls.log_on_console = log_on_console
|
|
64
|
+
if log_in_file:
|
|
65
|
+
if isinstance(log_in_file, str):
|
|
66
|
+
log_in_file = True if log_in_file == "True" else False
|
|
67
|
+
cls.log_in_file = log_in_file
|
|
68
|
+
|
|
69
|
+
# Change log time format if needed
|
|
70
|
+
if cls.log_time_in_utc:
|
|
71
|
+
import time
|
|
72
|
+
logging.Formatter.converter = time.gmtime
|
|
73
|
+
|
|
74
|
+
cls.__is_configured = True
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def __set_holado_loggers(cls):
|
|
78
|
+
from holado_logging.common.logging.holado_logger import HALogger
|
|
79
|
+
|
|
80
|
+
# Configure loggers to use
|
|
81
|
+
HALogger.default_message_size_limit = 10000
|
|
82
|
+
cls.TLogger = HALogger
|
|
83
|
+
cls.TManager = logging.Manager
|
|
84
|
+
|
|
85
|
+
# Set loggers in logging
|
|
86
|
+
from holado_logging.common.logging.holado_logger import HARootLogger
|
|
87
|
+
logging.root = HARootLogger(cls.default_level)
|
|
88
|
+
logging.Logger.root = logging.root
|
|
89
|
+
logging.Logger.manager = cls.TManager(cls.TLogger.root)
|
|
90
|
+
|
|
91
|
+
logging.setLoggerClass(cls.TLogger)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def add_logging_level_print(cls):
|
|
96
|
+
if not cls.has_logging_level("PRINT"):
|
|
97
|
+
cls.add_logging_level("PRINT", 45, None)
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def add_logging_level_trace(cls):
|
|
101
|
+
if not cls.has_logging_level("TRACE"):
|
|
102
|
+
cls.add_logging_level("TRACE", 5, None)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@classmethod
|
|
106
|
+
def has_logging_level(cls, levelName):
|
|
107
|
+
return hasattr(logging, levelName)
|
|
108
|
+
|
|
109
|
+
@classmethod
|
|
110
|
+
def add_logging_level(cls, levelName, levelNum, methodName=None):
|
|
111
|
+
"""
|
|
112
|
+
This method was implemented and shared by the author of library haggis (https://haggis.readthedocs.io).
|
|
113
|
+
|
|
114
|
+
Comprehensively adds a new logging level to the `logging` module and the
|
|
115
|
+
currently configured logging class.
|
|
116
|
+
|
|
117
|
+
`levelName` becomes an attribute of the `logging` module with the value
|
|
118
|
+
`levelNum`. `methodName` becomes a convenience method for both `logging`
|
|
119
|
+
itself and the class returned by `logging.getLoggerClass()` (usually just
|
|
120
|
+
`logging.Logger`). If `methodName` is not specified, `levelName.lower()` is
|
|
121
|
+
used.
|
|
122
|
+
|
|
123
|
+
To avoid accidental clobberings of existing attributes, this method will
|
|
124
|
+
raise an `AttributeError` if the level name is already an attribute of the
|
|
125
|
+
`logging` module or if the method name is already present
|
|
126
|
+
|
|
127
|
+
Example
|
|
128
|
+
-------
|
|
129
|
+
>>> addLoggingLevel('TRACE', logging.DEBUG - 5)
|
|
130
|
+
>>> logging.getLogger(__name__).setLevel("TRACE")
|
|
131
|
+
>>> logging.getLogger(__name__).trace('that worked')
|
|
132
|
+
>>> logging.trace('so did this')
|
|
133
|
+
>>> logging.TRACE
|
|
134
|
+
5
|
|
135
|
+
|
|
136
|
+
"""
|
|
137
|
+
if not methodName:
|
|
138
|
+
methodName = levelName.lower()
|
|
139
|
+
|
|
140
|
+
if hasattr(logging, levelName):
|
|
141
|
+
raise AttributeError('{} already defined in logging module'.format(levelName))
|
|
142
|
+
if hasattr(logging, methodName):
|
|
143
|
+
raise AttributeError('{} already defined in logging module'.format(methodName))
|
|
144
|
+
if hasattr(logging.getLoggerClass(), methodName):
|
|
145
|
+
raise AttributeError('{} already defined in logger class'.format(methodName))
|
|
146
|
+
|
|
147
|
+
# This method was inspired by the answers to Stack Overflow post
|
|
148
|
+
# http://stackoverflow.com/q/2183233/2988730, especially
|
|
149
|
+
# http://stackoverflow.com/a/13638084/2988730
|
|
150
|
+
def logForLevel(self, message, *args, **kwargs):
|
|
151
|
+
if self.isEnabledFor(levelNum):
|
|
152
|
+
self._log(levelNum, message, args, **kwargs)
|
|
153
|
+
def logToRoot(message, *args, **kwargs):
|
|
154
|
+
logging.log(levelNum, message, *args, **kwargs)
|
|
155
|
+
|
|
156
|
+
logging.addLevelName(levelNum, levelName)
|
|
157
|
+
setattr(logging, levelName, levelNum)
|
|
158
|
+
setattr(logging.getLoggerClass(), methodName, logForLevel)
|
|
159
|
+
setattr(logging, methodName, logToRoot)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import threading
|
|
15
|
+
import logging
|
|
16
|
+
import sys
|
|
17
|
+
import os.path
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
import configparser
|
|
20
|
+
from holado_logging.common.logging.log_config import LogConfig
|
|
21
|
+
from holado_core.common.tools.tools import Tools
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
def filter_thread_native_id(record):
|
|
27
|
+
"""Inject thread_native_id to log records"""
|
|
28
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
29
|
+
record.thread_native_id = MultitaskManager.get_thread_id(native=True)
|
|
30
|
+
return record
|
|
31
|
+
|
|
32
|
+
class LogManager(object):
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
self.__loggers_levels = []
|
|
36
|
+
|
|
37
|
+
self.__config_file_path = None
|
|
38
|
+
|
|
39
|
+
self.on_console = False
|
|
40
|
+
self.__console_handler = None
|
|
41
|
+
|
|
42
|
+
# Manage file handlers
|
|
43
|
+
self.in_file = True
|
|
44
|
+
self.__files_lock = threading.Lock()
|
|
45
|
+
self.__file_names = []
|
|
46
|
+
self.__file_handlers = {}
|
|
47
|
+
self.__root_file_name = None
|
|
48
|
+
self.__root_file_handler = None
|
|
49
|
+
self.__root_file_handler_active = False
|
|
50
|
+
|
|
51
|
+
# Manage file paths LIFO by loggers
|
|
52
|
+
self.__files_by_logger = {}
|
|
53
|
+
|
|
54
|
+
# Initialize format according python version
|
|
55
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
56
|
+
if MultitaskManager.has_thread_native_id():
|
|
57
|
+
# Exists since python 3.8
|
|
58
|
+
# self.format = '{asctime:s} | {thread_native_id:-5d} | {levelname:5s} | {name:50s} | {message:s}'
|
|
59
|
+
self.format = '{asctime:s} | {process:-5d}-{thread_native_id:-5d} | {levelname:5s} | {name:50s} | {message:s}'
|
|
60
|
+
self.format_short = '{asctime:s} | {message:s}'
|
|
61
|
+
self.style = '{'
|
|
62
|
+
else:
|
|
63
|
+
if sys.version_info > (3, 2):
|
|
64
|
+
# self.format = '{asctime:s} | {thread:-5d} | {levelname:5s} | {module:35s} | {message:s}'
|
|
65
|
+
self.format = '{asctime:s} | {process:-5d}-{thread:-5d} | {levelname:5s} | {name:50s} | {message:s}'
|
|
66
|
+
self.format_short = '{asctime:s} | {message:s}'
|
|
67
|
+
self.style = '{'
|
|
68
|
+
else:
|
|
69
|
+
self.format = '%(asctime)s | %(process)-5d-%(thread)-5d | %(levelname)5s | %(module)35s | %(message)s'
|
|
70
|
+
self.format_short = '%(asctime)s | %(message)s'
|
|
71
|
+
self.style = '%'
|
|
72
|
+
|
|
73
|
+
def configure(self):
|
|
74
|
+
self.__config_file_path = LogConfig.config_file_path
|
|
75
|
+
|
|
76
|
+
if self.__config_file_path:
|
|
77
|
+
config = configparser.ConfigParser()
|
|
78
|
+
config.read(self.__config_file_path)
|
|
79
|
+
|
|
80
|
+
if config.has_section("loggers_levels"):
|
|
81
|
+
self.__loggers_levels = config.items(section="loggers_levels")
|
|
82
|
+
|
|
83
|
+
def initialize(self):
|
|
84
|
+
"""
|
|
85
|
+
Initialize log manager.
|
|
86
|
+
If log_on_console is True, logs are published on console until a new configuration by calling method set_config
|
|
87
|
+
"""
|
|
88
|
+
handlers = []
|
|
89
|
+
if LogConfig.log_on_console:
|
|
90
|
+
self.on_console = True
|
|
91
|
+
self.__console_handler = self.__new_console_handler()
|
|
92
|
+
handlers.append(self.__console_handler)
|
|
93
|
+
|
|
94
|
+
logging.basicConfig(format=self.format, style=self.style, level=LogConfig.default_level, handlers=handlers)
|
|
95
|
+
|
|
96
|
+
def has_log_file(self, file_name):
|
|
97
|
+
with self.__files_lock:
|
|
98
|
+
return file_name in self.__file_names or file_name == self.__root_file_name
|
|
99
|
+
|
|
100
|
+
def set_root_log_file(self, file_name):
|
|
101
|
+
with self.__files_lock:
|
|
102
|
+
if file_name is not None and len(file_name) > 0:
|
|
103
|
+
self.__root_file_name = file_name
|
|
104
|
+
|
|
105
|
+
def reset_log_files(self):
|
|
106
|
+
with self.__files_lock:
|
|
107
|
+
self.__file_names.clear()
|
|
108
|
+
|
|
109
|
+
def add_log_file(self, file_name):
|
|
110
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
111
|
+
|
|
112
|
+
if file_name is not None and len(file_name) > 0:
|
|
113
|
+
if file_name == self.__root_file_name:
|
|
114
|
+
raise TechnicalException(f"Log file '{file_name}' is already set as root log file")
|
|
115
|
+
with self.__files_lock:
|
|
116
|
+
if file_name in self.__file_names:
|
|
117
|
+
raise TechnicalException(f"Log file '{file_name}' is already set")
|
|
118
|
+
self.__file_names.append(file_name)
|
|
119
|
+
|
|
120
|
+
def remove_log_file(self, file_name):
|
|
121
|
+
with self.__files_lock:
|
|
122
|
+
if file_name is not None and len(file_name) > 0 and file_name in self.__file_names:
|
|
123
|
+
self.__file_names.remove(file_name)
|
|
124
|
+
|
|
125
|
+
def __new_console_handler(self):
|
|
126
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
127
|
+
|
|
128
|
+
res = logging.StreamHandler()
|
|
129
|
+
res.setFormatter(logging.Formatter(fmt=self.format, style=self.style))
|
|
130
|
+
if MultitaskManager.has_thread_native_id():
|
|
131
|
+
res.addFilter(filter_thread_native_id)
|
|
132
|
+
return res
|
|
133
|
+
|
|
134
|
+
def set_config(self):
|
|
135
|
+
# print(f"Set logging config: {LogConfig.default_level=} ; {self.on_console=} ; {self.in_file=} ; {self.__root_file_name=}")
|
|
136
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
137
|
+
logger.debug(f"Set logging config: {LogConfig.default_level=} ; {self.on_console=} ; {self.in_file=} ; {self.__root_file_name=}")
|
|
138
|
+
|
|
139
|
+
# if self.__config_file_path is not None:
|
|
140
|
+
# logging.config.fileConfig(self.__config_file_path, defaults=None, disable_existing_loggers=False)
|
|
141
|
+
|
|
142
|
+
logger_ = logging.getLogger()
|
|
143
|
+
|
|
144
|
+
# Update log destination to console
|
|
145
|
+
if self.on_console:
|
|
146
|
+
if self.__console_handler is not None:
|
|
147
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
148
|
+
logger.debug("Log destination already set to console.")
|
|
149
|
+
else:
|
|
150
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
151
|
+
logger.debug("Adding log destination to console.")
|
|
152
|
+
self.__console_handler = self.__new_console_handler()
|
|
153
|
+
logger_.addHandler(self.__console_handler)
|
|
154
|
+
else:
|
|
155
|
+
if self.__console_handler is not None:
|
|
156
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
157
|
+
logger.debug("Removing log destination to console.")
|
|
158
|
+
logger_.removeHandler(self.__console_handler)
|
|
159
|
+
self.__console_handler = None
|
|
160
|
+
|
|
161
|
+
# Update log destination to files
|
|
162
|
+
with self.__files_lock:
|
|
163
|
+
# Remove old log files
|
|
164
|
+
# Note: root file is not removed if it is configured
|
|
165
|
+
for file_name in list(self.__file_handlers.keys()):
|
|
166
|
+
if file_name not in self.__file_names:
|
|
167
|
+
self.remove_file_handler(file_name, do_remove_log_file=False)
|
|
168
|
+
|
|
169
|
+
# Add new log files
|
|
170
|
+
if self.__root_file_name and not self.__root_file_handler:
|
|
171
|
+
self.add_root_file_handler()
|
|
172
|
+
for file_name in self.__file_names:
|
|
173
|
+
if file_name not in list(self.__file_handlers.keys()):
|
|
174
|
+
self.add_file_handler(file_name)
|
|
175
|
+
|
|
176
|
+
# level
|
|
177
|
+
if logger_.getEffectiveLevel() != LogConfig.default_level:
|
|
178
|
+
logger_.setLevel(LogConfig.default_level)
|
|
179
|
+
|
|
180
|
+
# Loggers levels
|
|
181
|
+
for name, level in self.__loggers_levels:
|
|
182
|
+
if not name.startswith("#"):
|
|
183
|
+
logging.getLogger(name).setLevel(level)
|
|
184
|
+
|
|
185
|
+
# WARNING: For local debug only
|
|
186
|
+
# logging.getLogger("holado_logging.common.logging.log_manager").setLevel(logging.DEBUG)
|
|
187
|
+
|
|
188
|
+
def set_level(self, log_level, do_set_config=True):
|
|
189
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
190
|
+
|
|
191
|
+
if isinstance(log_level, str):
|
|
192
|
+
if hasattr(logging, log_level):
|
|
193
|
+
log_level = getattr(logging, log_level)
|
|
194
|
+
else:
|
|
195
|
+
raise TechnicalException(f"Unexpected log level string '{log_level}'")
|
|
196
|
+
|
|
197
|
+
LogConfig.default_level = log_level
|
|
198
|
+
if do_set_config:
|
|
199
|
+
self.set_config()
|
|
200
|
+
|
|
201
|
+
def add_root_file_handler(self):
|
|
202
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
203
|
+
|
|
204
|
+
logger_ = logging.getLogger()
|
|
205
|
+
|
|
206
|
+
if not self.__root_file_name:
|
|
207
|
+
raise TechnicalException("Root log file is not defined")
|
|
208
|
+
|
|
209
|
+
if self.__root_file_handler is None:
|
|
210
|
+
logger.info("Creating file handler to root file '{}'.".format(self.__root_file_name))
|
|
211
|
+
self.__root_file_handler = self.__new_file_handler(self.__root_file_name)
|
|
212
|
+
|
|
213
|
+
logger_.addHandler(self.__root_file_handler)
|
|
214
|
+
self.__root_file_handler_active = True
|
|
215
|
+
|
|
216
|
+
def remove_root_file_handler(self, do_reset=False):
|
|
217
|
+
logger_ = logging.getLogger()
|
|
218
|
+
if self.__root_file_handler:
|
|
219
|
+
logger.info(f"Removing log destination to root file '{self.__root_file_name}'.")
|
|
220
|
+
logger_.removeHandler(self.__root_file_handler)
|
|
221
|
+
self.__root_file_handler_active = False
|
|
222
|
+
if do_reset:
|
|
223
|
+
self.__root_file_handler = None
|
|
224
|
+
|
|
225
|
+
def add_file_handler(self, file_name, logger_=None):
|
|
226
|
+
if logger_ is None:
|
|
227
|
+
logger_ = logging.getLogger()
|
|
228
|
+
|
|
229
|
+
# In case this method is called outside "set_config" method, add file_name as a configured log_file
|
|
230
|
+
if not self.has_log_file(file_name):
|
|
231
|
+
self.add_log_file(file_name)
|
|
232
|
+
|
|
233
|
+
if file_name in self.__file_handlers:
|
|
234
|
+
logger.debug("Log destination already set to file '{}'.".format(file_name))
|
|
235
|
+
else:
|
|
236
|
+
logger.info("Adding log destination to file '{}'.".format(file_name))
|
|
237
|
+
file_handler = self.__new_file_handler(file_name)
|
|
238
|
+
self.__file_handlers[file_name] = file_handler
|
|
239
|
+
self.add_existing_file_handler_to_logger(file_name, logger_)
|
|
240
|
+
|
|
241
|
+
def __new_file_handler(self, file_path, use_format_short=False):
|
|
242
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
243
|
+
|
|
244
|
+
Path(os.path.dirname(file_path)).mkdir(parents=True, exist_ok=True)
|
|
245
|
+
|
|
246
|
+
res = logging.FileHandler(file_path, mode='w', encoding='utf8')
|
|
247
|
+
fmt = self.format_short if use_format_short else self.format
|
|
248
|
+
res.setFormatter(logging.Formatter(fmt=fmt, style=self.style))
|
|
249
|
+
if MultitaskManager.has_thread_native_id():
|
|
250
|
+
res.addFilter(filter_thread_native_id)
|
|
251
|
+
|
|
252
|
+
return res
|
|
253
|
+
|
|
254
|
+
def remove_file_handler(self, file_name, logger_=None, do_remove_log_file=True):
|
|
255
|
+
if logger_ is None:
|
|
256
|
+
logger_ = logging.getLogger()
|
|
257
|
+
|
|
258
|
+
logger.info("Removing log destination to file '{}'.".format(file_name))
|
|
259
|
+
self.remove_existing_file_handler_from_logger(file_name, logger_)
|
|
260
|
+
del self.__file_handlers[file_name]
|
|
261
|
+
|
|
262
|
+
if do_remove_log_file:
|
|
263
|
+
self.remove_log_file(file_name)
|
|
264
|
+
|
|
265
|
+
def add_existing_file_handler_to_logger(self, file_name, logger_):
|
|
266
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
267
|
+
|
|
268
|
+
if self.__root_file_name == file_name:
|
|
269
|
+
file_handler = self.__root_file_handler
|
|
270
|
+
else:
|
|
271
|
+
if file_name not in self.__file_handlers:
|
|
272
|
+
raise TechnicalException(f"Not set log destination to file '{file_name}'")
|
|
273
|
+
file_handler = self.__file_handlers[file_name]
|
|
274
|
+
logger_.addHandler(file_handler)
|
|
275
|
+
|
|
276
|
+
def remove_existing_file_handler_from_logger(self, file_name, logger_):
|
|
277
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
278
|
+
|
|
279
|
+
if self.__root_file_name == file_name:
|
|
280
|
+
file_handler = self.__root_file_handler
|
|
281
|
+
else:
|
|
282
|
+
if file_name not in self.__file_handlers:
|
|
283
|
+
raise TechnicalException(f"Not set log destination to file '{file_name}'")
|
|
284
|
+
file_handler = self.__file_handlers[file_name]
|
|
285
|
+
logger_.removeHandler(file_handler)
|
|
286
|
+
|
|
287
|
+
def __remove_existing_file_handlers(self, log_level_if_exists=None):
|
|
288
|
+
with self.__files_lock:
|
|
289
|
+
if len(self.__file_names) > 0:
|
|
290
|
+
if log_level_if_exists is not None:
|
|
291
|
+
logger_ = logging.getLogger()
|
|
292
|
+
logger_.log(log_level_if_exists, f"Removing existing file handlers: {self.__file_names}")
|
|
293
|
+
file_names = list(self.__file_names)
|
|
294
|
+
else:
|
|
295
|
+
file_names = []
|
|
296
|
+
|
|
297
|
+
# Note: removes are done outside lock to avoid a deadlock
|
|
298
|
+
for fn in file_names:
|
|
299
|
+
self.remove_file_handler(fn)
|
|
300
|
+
|
|
301
|
+
def enter_log_file(self, file_name, do_remove_root_file_handler=True, do_remove_other_file_handlers=True):
|
|
302
|
+
if do_remove_other_file_handlers:
|
|
303
|
+
self.__remove_existing_file_handlers(log_level_if_exists=logging.ERROR)
|
|
304
|
+
|
|
305
|
+
self.add_file_handler(file_name)
|
|
306
|
+
|
|
307
|
+
if do_remove_root_file_handler:
|
|
308
|
+
self.remove_root_file_handler(do_reset=False)
|
|
309
|
+
|
|
310
|
+
def leave_log_file(self, file_name, do_remove_log_file=True):
|
|
311
|
+
if not self.__root_file_handler_active:
|
|
312
|
+
self.add_root_file_handler()
|
|
313
|
+
self.remove_file_handler(file_name, do_remove_log_file=do_remove_log_file)
|
|
314
|
+
|
|
315
|
+
def enter_log_file_for_logger(self, logger_, file_path, use_format_short=False, switch_in=True):
|
|
316
|
+
logger_name = logger_.name
|
|
317
|
+
if logger_name not in self.__files_by_logger:
|
|
318
|
+
self.__files_by_logger[logger_name] = []
|
|
319
|
+
|
|
320
|
+
if switch_in and len(self.__files_by_logger[logger_name]) > 0:
|
|
321
|
+
logger_.removeHandler(self.__files_by_logger[logger_name][-1][1])
|
|
322
|
+
|
|
323
|
+
file_handler = self.__new_file_handler(file_path, use_format_short=use_format_short)
|
|
324
|
+
logger_.addHandler(file_handler)
|
|
325
|
+
self.__files_by_logger[logger_name].append( (file_path, file_handler) )
|
|
326
|
+
|
|
327
|
+
def leave_log_file_for_logger(self, logger_, switch_out=True):
|
|
328
|
+
logger_name = logger_.name
|
|
329
|
+
_, file_handler = self.__files_by_logger[logger_name].pop()
|
|
330
|
+
logger_.removeHandler(file_handler)
|
|
331
|
+
|
|
332
|
+
if switch_out and len(self.__files_by_logger[logger_name]) > 0:
|
|
333
|
+
logger_.addHandler(self.__files_by_logger[logger_name][-1][1])
|
|
334
|
+
|
|
335
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def dependencies():
|
|
17
|
+
return None
|
|
18
|
+
|
|
19
|
+
def register():
|
|
20
|
+
from holado.common.context.session_context import SessionContext
|
|
21
|
+
|
|
22
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
23
|
+
SessionContext.instance().services.register_service_type("multitask_manager", MultitaskManager)
|
|
24
|
+
|
|
25
|
+
from holado_multitask.multiprocessing.processesmanager import ProcessesManager
|
|
26
|
+
SessionContext.instance().services.register_service_type("processes_manager",
|
|
27
|
+
lambda: ProcessesManager(SessionContext.instance().multitask_manager))
|
|
28
|
+
|
|
29
|
+
from holado_multitask.multithreading.threadsmanager import ThreadsManager
|
|
30
|
+
SessionContext.instance().services.register_service_type("threads_manager",
|
|
31
|
+
lambda: ThreadsManager(SessionContext.instance().multitask_manager))
|
|
32
|
+
|
|
33
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
from builtins import super
|
|
15
|
+
from holado.common.context.context import Context
|
|
16
|
+
import logging
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ProcessContext(Context):
|
|
22
|
+
def __init__(self, name, unique_name):
|
|
23
|
+
super().__init__(f"Process[{name};{unique_name}]")
|
|
24
|
+
|
|
25
|
+
self.__process_id = None
|
|
26
|
+
self.__process_name = name
|
|
27
|
+
self.__process_unique_name = unique_name
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def process_name(self):
|
|
31
|
+
return self.__process_name
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.block.function import Function
|
|
16
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
17
|
+
from holado_core.common.tools.tools import Tools
|
|
18
|
+
from holado_multitask.multiprocessing.process import InterruptableProcess
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FunctionProcess(InterruptableProcess):
|
|
24
|
+
'''
|
|
25
|
+
Execute in a process given function with given arguments
|
|
26
|
+
'''
|
|
27
|
+
|
|
28
|
+
def __init__(self, target, args=None, kwargs=None, name = None, default_wait_timeout = None, register_process = True, delay_before_run_sec=None, delay_between_run_sec=None):
|
|
29
|
+
super().__init__(name if name is not None else f"FunctionProcess({repr(target)})", default_wait_timeout = default_wait_timeout, register_process = register_process, delay_before_run_sec=delay_before_run_sec, delay_between_run_sec=delay_between_run_sec)
|
|
30
|
+
|
|
31
|
+
if args is None:
|
|
32
|
+
args = []
|
|
33
|
+
if kwargs is None:
|
|
34
|
+
kwargs = {}
|
|
35
|
+
|
|
36
|
+
self._function = Function(target, *args, **kwargs)
|
|
37
|
+
self.__error = None
|
|
38
|
+
self.__result = None
|
|
39
|
+
self.__interrupt_function = None
|
|
40
|
+
self.__callback_function = None
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def error(self):
|
|
44
|
+
return self.__error
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def result(self):
|
|
48
|
+
return self.__result
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def interrupt_function(self):
|
|
52
|
+
return self.__interrupt_function
|
|
53
|
+
|
|
54
|
+
@interrupt_function.setter
|
|
55
|
+
def interrupt_function(self, func):
|
|
56
|
+
"""Set the Function to call on interrupt"""
|
|
57
|
+
self.__interrupt_function = func
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def callback_function(self):
|
|
61
|
+
return self.__callback_function
|
|
62
|
+
|
|
63
|
+
@callback_function.setter
|
|
64
|
+
def callback_function(self, func):
|
|
65
|
+
"""Set the callback function"""
|
|
66
|
+
self.__callback_function = func
|
|
67
|
+
|
|
68
|
+
def run(self):
|
|
69
|
+
# Start running by superclass run
|
|
70
|
+
super().run()
|
|
71
|
+
|
|
72
|
+
# self._raise_if_interrupted()
|
|
73
|
+
self.wait_before_run()
|
|
74
|
+
|
|
75
|
+
# self._raise_if_interrupted()
|
|
76
|
+
try:
|
|
77
|
+
# logging.debug("+++++++++ Launching function [{}({})]".format(repr(self._target), repr(self._args)))
|
|
78
|
+
self.__result = self._function.run()
|
|
79
|
+
except Exception as exc:
|
|
80
|
+
logger.exception(f"[{self.name}] Exception catched during processed function [{self._function.represent()}]")
|
|
81
|
+
self.__error = exc
|
|
82
|
+
|
|
83
|
+
# self._raise_if_interrupted()
|
|
84
|
+
try:
|
|
85
|
+
if self.__callback_function:
|
|
86
|
+
self.__callback_function.run(self.result, self.error)
|
|
87
|
+
except Exception as exc:
|
|
88
|
+
msg = f"[{self.name}] Exception catched while calling callback function:\n callback_function: {repr(self.__callback_function)}\n result: [{Tools.truncate_text(repr(self.result))}]\n error: [{repr(self.error)}]"
|
|
89
|
+
logger.exception(msg)
|
|
90
|
+
raise FunctionalException(msg) from exc
|
|
91
|
+
|
|
92
|
+
logger.info(f"[{self.name}] Process has finished")
|
|
93
|
+
|
|
94
|
+
def throw_if_error(self):
|
|
95
|
+
if self.error:
|
|
96
|
+
raise FunctionalException(f"[{self.name}] Error during call of function [{repr(self._target)}({repr(self._args)})]") from self.error
|
|
97
|
+
|
|
98
|
+
def interrupt(self):
|
|
99
|
+
if not self.is_interrupted and self.is_alive():
|
|
100
|
+
super().interrupt()
|
|
101
|
+
if self.interrupt_function is not None:
|
|
102
|
+
self.interrupt_function.run()
|