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,167 @@
|
|
|
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
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
17
|
+
import holado_multitask.multithreading as hmm
|
|
18
|
+
from holado.common.handlers.undefined import default_context, undefined_argument
|
|
19
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ThreadsManager(object):
|
|
25
|
+
"""
|
|
26
|
+
Manage threads run by HolAdo, so that each thread can use HolAdo services.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
__has_native_id = hasattr(threading, '_HAVE_THREAD_NATIVE_ID') and threading._HAVE_THREAD_NATIVE_ID # @UndefinedVariable
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def has_native_id(cls):
|
|
33
|
+
return cls.__has_native_id
|
|
34
|
+
|
|
35
|
+
def __init__(self, multitask_manager):
|
|
36
|
+
self.__multitask_manager = multitask_manager
|
|
37
|
+
self.__managed_threads_lock = threading.Lock()
|
|
38
|
+
self.__managed_threads_by_scope = {}
|
|
39
|
+
|
|
40
|
+
def __get_scope_name(self, scope, create_if_doesnt_exist=True):
|
|
41
|
+
res = MultitaskManager.get_scope_name(scope)
|
|
42
|
+
|
|
43
|
+
if create_if_doesnt_exist:
|
|
44
|
+
with self.__managed_threads_lock:
|
|
45
|
+
if res not in self.__managed_threads_by_scope:
|
|
46
|
+
self.__managed_threads_by_scope[res] = {}
|
|
47
|
+
|
|
48
|
+
return res
|
|
49
|
+
|
|
50
|
+
def is_thread_registered(self, name, scope=default_context):
|
|
51
|
+
scope_name = self.__get_scope_name(scope, create_if_doesnt_exist=False)
|
|
52
|
+
with self.__managed_threads_lock:
|
|
53
|
+
return scope_name in self.__managed_threads_by_scope and name in self.__managed_threads_by_scope[scope_name]
|
|
54
|
+
|
|
55
|
+
def register_thread(self, name, thread, scope=default_context):
|
|
56
|
+
scope_name = self.__get_scope_name(scope)
|
|
57
|
+
with self.__managed_threads_lock:
|
|
58
|
+
if name in self.__managed_threads_by_scope[scope_name]:
|
|
59
|
+
# logger.error(f"A thread with name '{name}' is already registered, it will be overwritten: {self.__managed_threads_by_scope[name]}")
|
|
60
|
+
logger.error(f"A thread with name '{name}' is already registered in scope '{scope_name}', it will be overwritten: {self.__managed_threads_by_scope[scope_name][name]}", stack_info=True)
|
|
61
|
+
else:
|
|
62
|
+
logger.debug(f"Registered thread with name '{name}' in scope '{scope_name}': {thread}")
|
|
63
|
+
self.__managed_threads_by_scope[scope_name][name] = thread
|
|
64
|
+
return scope_name
|
|
65
|
+
|
|
66
|
+
def unregister_thread(self, name, scope=default_context):
|
|
67
|
+
scope_name = self.__get_scope_name(scope)
|
|
68
|
+
with self.__managed_threads_lock:
|
|
69
|
+
if name in self.__managed_threads_by_scope[scope_name]:
|
|
70
|
+
if self.__managed_threads_by_scope[scope_name][name].is_alive():
|
|
71
|
+
logger.warn(f"Unregistering thread with name '{name}' from scope '{scope_name}' whereas it is still alive")
|
|
72
|
+
else:
|
|
73
|
+
logger.debug(f"Unregistered thread with name '{name}' from scope '{scope_name}'")
|
|
74
|
+
del self.__managed_threads_by_scope[scope_name][name]
|
|
75
|
+
else:
|
|
76
|
+
raise Exception(f"Not registered thread of name '{name}' in scope '{scope_name}'")
|
|
77
|
+
return scope_name
|
|
78
|
+
|
|
79
|
+
def get_thread(self, name, scope=default_context):
|
|
80
|
+
scope_name = self.__get_scope_name(scope)
|
|
81
|
+
with self.__managed_threads_lock:
|
|
82
|
+
if name in self.__managed_threads_by_scope[scope_name]:
|
|
83
|
+
return self.__managed_threads_by_scope[scope_name][name]
|
|
84
|
+
else:
|
|
85
|
+
raise Exception(f"Not registered thread of name '{name}' in scope '{scope_name}'")
|
|
86
|
+
|
|
87
|
+
def interrupt_thread(self, name, scope=default_context, with_join=True, join_timeout=undefined_argument, raise_if_not_interruptable=True):
|
|
88
|
+
interrupt_status, join_status = False, False
|
|
89
|
+
|
|
90
|
+
thread = self.get_thread(name, scope=scope)
|
|
91
|
+
if thread.is_alive():
|
|
92
|
+
if self.is_interruptable(thread=thread):
|
|
93
|
+
try:
|
|
94
|
+
thread.interrupt()
|
|
95
|
+
except Exception as exc:
|
|
96
|
+
# logger.exception("Failed to interrupt thread of name '{}'".format(name))
|
|
97
|
+
raise exc
|
|
98
|
+
else:
|
|
99
|
+
interrupt_status = True
|
|
100
|
+
|
|
101
|
+
if with_join:
|
|
102
|
+
join_status = thread.join(join_timeout)
|
|
103
|
+
elif raise_if_not_interruptable:
|
|
104
|
+
raise TechnicalException("Thread '{}' is not interruptable".format(name))
|
|
105
|
+
|
|
106
|
+
return interrupt_status, join_status
|
|
107
|
+
|
|
108
|
+
def join_thread(self, name, scope=default_context, timeout=undefined_argument):
|
|
109
|
+
thread = self.get_thread(name, scope=scope)
|
|
110
|
+
if thread.is_alive():
|
|
111
|
+
thread.join(timeout=timeout)
|
|
112
|
+
|
|
113
|
+
def interrupt_all_threads(self, scope=default_context, with_join=True, join_timeout=undefined_argument):
|
|
114
|
+
"""Interrupt all threads that are interruptable."""
|
|
115
|
+
names = self.get_thread_names(scope=scope)
|
|
116
|
+
logger.debug(f"Interrupting all threads in scope '{self.__get_scope_name(scope)}': {names}")
|
|
117
|
+
interrupted_names = []
|
|
118
|
+
for name in names:
|
|
119
|
+
try:
|
|
120
|
+
interrupt_status, _ = self.interrupt_thread(name, scope=scope, with_join=False, raise_if_not_interruptable=False)
|
|
121
|
+
except Exception:
|
|
122
|
+
logger.exception("Failed to interrupt thread of name '{}'".format(name))
|
|
123
|
+
else:
|
|
124
|
+
if interrupt_status:
|
|
125
|
+
interrupted_names.append(name)
|
|
126
|
+
|
|
127
|
+
if with_join:
|
|
128
|
+
self.__join_threads(interrupted_names, scope=scope, timeout=join_timeout, skip_not_interruptable=True)
|
|
129
|
+
|
|
130
|
+
def join_all_threads(self, scope=default_context, timeout=undefined_argument, skip_not_interruptable=False):
|
|
131
|
+
names = self.get_thread_names(scope=scope)
|
|
132
|
+
self.__join_threads(names, scope=scope, timeout=timeout, skip_not_interruptable=skip_not_interruptable)
|
|
133
|
+
|
|
134
|
+
def __join_threads(self, thread_names, scope=default_context, timeout=undefined_argument, skip_not_interruptable=False):
|
|
135
|
+
for name in thread_names:
|
|
136
|
+
if skip_not_interruptable and not self.is_interruptable(name=name, scope=scope):
|
|
137
|
+
continue
|
|
138
|
+
self.join_thread(name, scope=scope, timeout=timeout)
|
|
139
|
+
|
|
140
|
+
def unregister_all_threads(self, scope=default_context, keep_alive=True):
|
|
141
|
+
names = self.get_thread_names(scope=scope)
|
|
142
|
+
for name in names:
|
|
143
|
+
thread = self.get_thread(name, scope=scope)
|
|
144
|
+
if not keep_alive or keep_alive and not thread.is_alive():
|
|
145
|
+
self.unregister_thread(name, scope=scope)
|
|
146
|
+
|
|
147
|
+
def get_thread_names(self, scope=default_context):
|
|
148
|
+
scope_name = self.__get_scope_name(scope)
|
|
149
|
+
with self.__managed_threads_lock:
|
|
150
|
+
return sorted(list( self.__managed_threads_by_scope[scope_name].keys() ))
|
|
151
|
+
|
|
152
|
+
def get_alive_thread_names(self, scope=default_context):
|
|
153
|
+
scope_name = self.__get_scope_name(scope)
|
|
154
|
+
with self.__managed_threads_lock:
|
|
155
|
+
res = sorted(list( self.__managed_threads_by_scope[scope_name].keys() ))
|
|
156
|
+
res = [name for name in res if self.__managed_threads_by_scope[scope_name][name].is_alive()]
|
|
157
|
+
|
|
158
|
+
def is_interruptable(self, thread=None, name=None, scope=default_context):
|
|
159
|
+
if name is not None:
|
|
160
|
+
thread = self.get_thread(name, scope=scope)
|
|
161
|
+
if thread is None:
|
|
162
|
+
raise TechnicalException("At least one argument must be not None")
|
|
163
|
+
|
|
164
|
+
return isinstance(thread, hmm.thread.InterruptableThread) and thread.is_interruptable
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
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 holado_multitask.multithreading.thread import InterruptableThread
|
|
15
|
+
from threading import Event
|
|
16
|
+
from holado.common.handlers.undefined import default_context
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Timer(InterruptableThread):
|
|
20
|
+
""" Helper class managing a timer.
|
|
21
|
+
|
|
22
|
+
The functional code is a copy of threading.Timer, but it inherists from HolAdo Thread class.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, name, interval, function, args=None, kwargs=None, default_wait_timeout=None, register_thread=True, register_scope=default_context):
|
|
26
|
+
super().__init__(name, default_wait_timeout=default_wait_timeout, register_thread=register_thread, register_scope=register_scope, delay_before_run_sec=None, delay_between_run_sec=None)
|
|
27
|
+
|
|
28
|
+
self.interval = interval
|
|
29
|
+
self.function = function
|
|
30
|
+
self.args = args if args is not None else []
|
|
31
|
+
self.kwargs = kwargs if kwargs is not None else {}
|
|
32
|
+
self.finished = Event()
|
|
33
|
+
|
|
34
|
+
def interrupt(self):
|
|
35
|
+
self.cancel()
|
|
36
|
+
super().interrupt()
|
|
37
|
+
|
|
38
|
+
def cancel(self):
|
|
39
|
+
"""Stop the timer if it hasn't finished yet."""
|
|
40
|
+
self.finished.set()
|
|
41
|
+
|
|
42
|
+
def run(self):
|
|
43
|
+
# Wait timer interval or canceled (ie finished==True)
|
|
44
|
+
self.finished.wait(self.interval)
|
|
45
|
+
|
|
46
|
+
# Run function if not canceled
|
|
47
|
+
if not self.finished.is_set():
|
|
48
|
+
self.function(*self.args, **self.kwargs)
|
|
49
|
+
self.finished.set()
|
|
50
|
+
|
|
51
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
from .multiprocessing_steps import *
|
|
17
|
+
from .multithreading_steps import *
|
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
from holado.common.context.session_context import SessionContext
|
|
17
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
18
|
+
from holado_test.behave.behave import * # @UnusedWildImport
|
|
19
|
+
from holado_core.common.block.function import Function
|
|
20
|
+
from holado_test.scenario.step_tools import StepTools
|
|
21
|
+
import logging
|
|
22
|
+
from holado_test.behave.scenario.behave_step_tools import BehaveStepTools
|
|
23
|
+
from holado_scripting.common.tools.evaluate_parameters import EvaluateParameters
|
|
24
|
+
from holado_multitask.multiprocessing.periodic_function_process import PeriodicFunctionProcess
|
|
25
|
+
from holado_multitask.multiprocessing.function_process import FunctionProcess
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def __get_scenario_context():
|
|
31
|
+
return SessionContext.instance().get_scenario_context()
|
|
32
|
+
|
|
33
|
+
def __get_processes_manager():
|
|
34
|
+
return SessionContext.instance().processes_manager
|
|
35
|
+
|
|
36
|
+
def __get_variable_manager():
|
|
37
|
+
return __get_scenario_context().get_variable_manager()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@Given(r"(?P<var_name>{Variable}) = new process that calls steps(?P<is_periodic_str> periodically)?(?: \((?:delay before: (?P<delay_before_str>{Float}) s)?(?: ; )?(?:period: (?P<period_str>{Float}) s(?: ; nb times: (?P<nb_times_str>{Int}))?)?(?: ; )?(?:format with: (?P<format_with>{Variable}(?:, {Variable})*))?\))?")
|
|
41
|
+
def step_impl(context, var_name, is_periodic_str, delay_before_str, period_str, nb_times_str, format_with):
|
|
42
|
+
"""
|
|
43
|
+
Create a process with given steps.
|
|
44
|
+
Notes:
|
|
45
|
+
- Each created process use a copy of the variable manager.
|
|
46
|
+
- Thus the variables, defined in variable manager before process creation, can be used in the steps.
|
|
47
|
+
- But variables created or updated in the steps by the process will affect only the process itself and won't affect the original variable manager or other processes.
|
|
48
|
+
"""
|
|
49
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
50
|
+
delay_before_sec = StepTools.evaluate_scenario_parameter(delay_before_str)
|
|
51
|
+
period_sec = StepTools.evaluate_scenario_parameter(period_str)
|
|
52
|
+
nb_times = StepTools.evaluate_scenario_parameter(nb_times_str)
|
|
53
|
+
format_with = StepTools.evaluate_variable_name(format_with)
|
|
54
|
+
steps = BehaveStepTools.get_step_multiline_text(context, eval_params=EvaluateParameters.nothing())
|
|
55
|
+
|
|
56
|
+
if is_periodic_str is not None and period_sec is None:
|
|
57
|
+
raise FunctionalException(f"Period must be defined for periodic steps")
|
|
58
|
+
if format_with is not None:
|
|
59
|
+
steps = StepTools.format_steps_with(steps, format_with.split(', '))
|
|
60
|
+
|
|
61
|
+
if period_sec is not None:
|
|
62
|
+
proc_name = f"PROC_CALL_STEPS_PERIODICALLY[{var_name};{period_sec}]"
|
|
63
|
+
func = PeriodicFunctionProcess(period_sec, execute_steps, args=[steps], name=proc_name, delay_before_run_sec=delay_before_sec, nb_times=nb_times)
|
|
64
|
+
res = func.unique_name
|
|
65
|
+
else:
|
|
66
|
+
proc_name = f"PROC_CALL_STEPS[{var_name}]"
|
|
67
|
+
func = FunctionProcess(execute_steps, args=[steps], name=proc_name, delay_before_run_sec=delay_before_sec)
|
|
68
|
+
res = func.unique_name
|
|
69
|
+
|
|
70
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
71
|
+
|
|
72
|
+
@Given(r"(?P<var_name>{Variable}) = call steps in a process(?: \((?:delay before: (?P<delay_before_str>{Float}) s)?(?: ; )?(?:format with: (?P<format_with>{Variable}(?:, {Variable})*))?\))?")
|
|
73
|
+
def step_impl(context, var_name, delay_before_str, format_with):
|
|
74
|
+
"""
|
|
75
|
+
Create and start a process with given steps.
|
|
76
|
+
Notes:
|
|
77
|
+
- Each created process use a copy of the variable manager.
|
|
78
|
+
- Thus the variables, defined in variable manager before process creation, can be used in the steps.
|
|
79
|
+
- But variables created or updated in the steps by the process will affect only the process itself and won't affect the original variable manager or other processes.
|
|
80
|
+
"""
|
|
81
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
82
|
+
delay_before_sec = StepTools.evaluate_scenario_parameter(delay_before_str)
|
|
83
|
+
format_with = StepTools.evaluate_variable_name(format_with)
|
|
84
|
+
steps = BehaveStepTools.get_step_multiline_text(context, eval_params=EvaluateParameters.nothing())
|
|
85
|
+
|
|
86
|
+
step_params_list = []
|
|
87
|
+
if delay_before_sec is not None:
|
|
88
|
+
step_params_list.append(f"delay before: {delay_before_sec} s")
|
|
89
|
+
if format_with is not None:
|
|
90
|
+
step_params_list.append(f"format with: {format_with} s")
|
|
91
|
+
step_params = " (" + " ; ".join(step_params_list) + ")" if len(step_params_list) > 0 else ""
|
|
92
|
+
|
|
93
|
+
execute_steps(u"""
|
|
94
|
+
Given {var_name} = new process that calls steps{step_params}
|
|
95
|
+
\"""{steps}\"""
|
|
96
|
+
Given start process {var_name}
|
|
97
|
+
""".format(var_name=var_name, step_params=step_params, steps=BehaveStepTools.format_steps_as_parameter(steps, 12)))
|
|
98
|
+
|
|
99
|
+
@Given(r"for process (?P<var_name>{Variable}), call steps for interrupt(?: \(format with: (?P<format_with>{Variable}(?:, {Variable})*)\))?")
|
|
100
|
+
def step_impl(context, var_name, format_with):
|
|
101
|
+
proc_id = StepTools.evaluate_variable_value(var_name)
|
|
102
|
+
format_with = StepTools.evaluate_variable_name(format_with)
|
|
103
|
+
steps = BehaveStepTools.get_step_multiline_text(context, eval_params=EvaluateParameters.nothing())
|
|
104
|
+
|
|
105
|
+
if format_with is not None:
|
|
106
|
+
steps = StepTools.format_steps_with(steps, format_with.split(', '))
|
|
107
|
+
|
|
108
|
+
interrupt_func = Function(execute_steps, steps)
|
|
109
|
+
|
|
110
|
+
func = __get_processes_manager().get_process(proc_id)
|
|
111
|
+
if hasattr(func, "interrupt_function"):
|
|
112
|
+
func.interrupt_function = interrupt_func
|
|
113
|
+
else:
|
|
114
|
+
raise FunctionalException("Process '{}' is not interruptable by a function".format(var_name))
|
|
115
|
+
|
|
116
|
+
@Step(r'start process (?P<var_name>{Variable})')
|
|
117
|
+
def step_impl(context, var_name):
|
|
118
|
+
proc_id = StepTools.evaluate_variable_value(var_name)
|
|
119
|
+
|
|
120
|
+
proc = __get_processes_manager().get_process(proc_id)
|
|
121
|
+
proc.start()
|
|
122
|
+
|
|
123
|
+
@Step(r'join process (?P<var_name>{Variable})')
|
|
124
|
+
def step_impl(context, var_name):
|
|
125
|
+
proc_id = StepTools.evaluate_variable_value(var_name)
|
|
126
|
+
|
|
127
|
+
proc = __get_processes_manager().get_process(proc_id)
|
|
128
|
+
proc.join()
|
|
129
|
+
|
|
130
|
+
@Step(r'stop process (?P<var_name>{Variable})')
|
|
131
|
+
def step_impl(context, var_name):
|
|
132
|
+
proc_id = StepTools.evaluate_variable_value(var_name)
|
|
133
|
+
|
|
134
|
+
proc = __get_processes_manager().get_process(proc_id)
|
|
135
|
+
proc.interrupt()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
from holado.common.context.session_context import SessionContext
|
|
17
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
18
|
+
from holado_multitask.multithreading.functionthreaded import FunctionThreaded
|
|
19
|
+
from holado_core.common.block.function import Function
|
|
20
|
+
from holado_test.scenario.step_tools import StepTools
|
|
21
|
+
import logging
|
|
22
|
+
from holado_test.behave.scenario.behave_step_tools import BehaveStepTools
|
|
23
|
+
from holado_scripting.common.tools.evaluate_parameters import EvaluateParameters
|
|
24
|
+
from holado_test.behave.behave import * # @UnusedWildImport
|
|
25
|
+
from holado_multitask.multithreading.periodicfunctionthreaded import PeriodicFunctionThreaded
|
|
26
|
+
from holado.common.handlers.undefined import undefined_argument
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def __get_scenario_context():
|
|
33
|
+
return SessionContext.instance().get_scenario_context()
|
|
34
|
+
|
|
35
|
+
def __get_threads_manager():
|
|
36
|
+
return SessionContext.instance().threads_manager
|
|
37
|
+
|
|
38
|
+
def __get_variable_manager():
|
|
39
|
+
return __get_scenario_context().get_variable_manager()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@Given(r"(?P<var_name>{Variable}) = new thread that calls steps(?P<is_periodic_str> periodically)?(?: \((?:delay before: (?P<delay_before_str>{Float}) s)?(?: ; )?(?:period: (?P<period_str>{Float}) s(?: ; nb times: (?P<nb_times_str>{Int}))?)?(?: ; )?(?:format with: (?P<format_with>{Variable}(?:, {Variable})*))?\))?")
|
|
45
|
+
def step_impl(context, var_name, is_periodic_str, delay_before_str, period_str, nb_times_str, format_with):
|
|
46
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
47
|
+
delay_before_sec = StepTools.evaluate_scenario_parameter(delay_before_str)
|
|
48
|
+
period_sec = StepTools.evaluate_scenario_parameter(period_str)
|
|
49
|
+
nb_times = StepTools.evaluate_scenario_parameter(nb_times_str)
|
|
50
|
+
format_with = StepTools.evaluate_variable_name(format_with)
|
|
51
|
+
steps = BehaveStepTools.get_step_multiline_text(context, eval_params=EvaluateParameters.nothing())
|
|
52
|
+
|
|
53
|
+
if is_periodic_str is not None and period_sec is None:
|
|
54
|
+
raise FunctionalException(f"Period must be defined for periodic steps")
|
|
55
|
+
if format_with is not None:
|
|
56
|
+
steps = StepTools.format_steps_with(steps, format_with.split(', '))
|
|
57
|
+
|
|
58
|
+
if period_sec is not None:
|
|
59
|
+
thread_name = f"CALL_STEPS_PERIODICALLY[{var_name};{period_sec}]"
|
|
60
|
+
func = PeriodicFunctionThreaded(period_sec, execute_steps, args=[steps], name=thread_name, delay_before_run_sec=delay_before_sec, nb_times=nb_times)
|
|
61
|
+
res = func.unique_name
|
|
62
|
+
else:
|
|
63
|
+
thread_name = f"CALL_STEPS[{var_name}]"
|
|
64
|
+
func = FunctionThreaded(execute_steps, args=[steps], name=thread_name, delay_before_run_sec=delay_before_sec)
|
|
65
|
+
res = func.unique_name
|
|
66
|
+
|
|
67
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
68
|
+
|
|
69
|
+
@Given(r"(?P<var_name>{Variable}) = call steps in a thread(?: \((?:delay before: (?P<delay_before_str>{Float}) s)?(?: ; )?(?:format with: (?P<format_with>{Variable}(?:, {Variable})*))?\))?")
|
|
70
|
+
def step_impl(context, var_name, delay_before_str, format_with):
|
|
71
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
72
|
+
delay_before_sec = StepTools.evaluate_scenario_parameter(delay_before_str)
|
|
73
|
+
format_with = StepTools.evaluate_variable_name(format_with)
|
|
74
|
+
steps = BehaveStepTools.get_step_multiline_text(context, eval_params=EvaluateParameters.nothing())
|
|
75
|
+
|
|
76
|
+
step_params_list = []
|
|
77
|
+
if delay_before_sec is not None:
|
|
78
|
+
step_params_list.append(f"delay before: {delay_before_sec} s")
|
|
79
|
+
if format_with is not None:
|
|
80
|
+
step_params_list.append(f"format with: {format_with} s")
|
|
81
|
+
step_params = " (" + " ; ".join(step_params_list) + ")" if len(step_params_list) > 0 else ""
|
|
82
|
+
|
|
83
|
+
execute_steps(u"""
|
|
84
|
+
Given {var_name} = new thread that calls steps{step_params}
|
|
85
|
+
\"""{steps}\"""
|
|
86
|
+
Given start thread {var_name}
|
|
87
|
+
""".format(var_name=var_name, step_params=step_params, steps=BehaveStepTools.format_steps_as_parameter(steps, 12)))
|
|
88
|
+
|
|
89
|
+
@Given(r"for thread (?P<var_name>{Variable}), call steps for interrupt(?: \(format with: (?P<format_with>{Variable}(?:, {Variable})*)\))?")
|
|
90
|
+
def step_impl(context, var_name, format_with):
|
|
91
|
+
thread_id = StepTools.evaluate_variable_value(var_name)
|
|
92
|
+
format_with = StepTools.evaluate_variable_name(format_with)
|
|
93
|
+
steps = BehaveStepTools.get_step_multiline_text(context, eval_params=EvaluateParameters.nothing())
|
|
94
|
+
|
|
95
|
+
if format_with is not None:
|
|
96
|
+
steps = StepTools.format_steps_with(steps, format_with.split(', '))
|
|
97
|
+
|
|
98
|
+
interrupt_func = Function(execute_steps, steps)
|
|
99
|
+
|
|
100
|
+
func = __get_threads_manager().get_thread(thread_id)
|
|
101
|
+
if hasattr(func, "interrupt_function"):
|
|
102
|
+
func.interrupt_function = interrupt_func
|
|
103
|
+
else:
|
|
104
|
+
raise FunctionalException("Thread '{}' is not interruptable by a function".format(var_name))
|
|
105
|
+
|
|
106
|
+
@Step(r'start thread (?P<var_name>{Variable})')
|
|
107
|
+
def step_impl(context, var_name):
|
|
108
|
+
thread_id = StepTools.evaluate_variable_value(var_name)
|
|
109
|
+
|
|
110
|
+
thread = __get_threads_manager().get_thread(thread_id)
|
|
111
|
+
thread.start()
|
|
112
|
+
|
|
113
|
+
@Step(r'join thread (?P<var_name>{Variable})(?: \(timeout: (?P<timeout_str>{Variable}) s\))?')
|
|
114
|
+
def step_impl(context, var_name, timeout_str):
|
|
115
|
+
thread_id = StepTools.evaluate_variable_value(var_name)
|
|
116
|
+
timeout = StepTools.evaluate_variable_value(timeout_str) if timeout_str is not None else undefined_argument
|
|
117
|
+
|
|
118
|
+
__get_threads_manager().join_thread(thread_id, timeout=timeout)
|
|
119
|
+
|
|
120
|
+
@Step(r'stop thread (?P<var_name>{Variable})')
|
|
121
|
+
def step_impl(context, var_name):
|
|
122
|
+
thread_id = StepTools.evaluate_variable_value(var_name)
|
|
123
|
+
|
|
124
|
+
thread = __get_threads_manager().get_thread(thread_id)
|
|
125
|
+
thread.interrupt()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
|
|
17
|
+
def dependencies():
|
|
18
|
+
return None
|
|
19
|
+
|
|
20
|
+
def register():
|
|
21
|
+
from holado.common.context.session_context import SessionContext
|
|
22
|
+
from holado_python.common.tools.comparators.datetime_comparator import DatetimeComparator
|
|
23
|
+
from holado_python.common.tools.datetime import DateTime
|
|
24
|
+
|
|
25
|
+
from holado_protobuf.ipc.protobuf.protobuf_messages import ProtobufMessages
|
|
26
|
+
if ProtobufMessages.is_available():
|
|
27
|
+
SessionContext.instance().services.register_service_type("protobuf_messages", ProtobufMessages,
|
|
28
|
+
lambda m: m.initialize() )
|
|
29
|
+
|
|
30
|
+
from holado_protobuf.ipc.protobuf.protobuf_converter import ProtobufConverter
|
|
31
|
+
SessionContext.instance().services.register_service_type("protobuf_converter", ProtobufConverter,
|
|
32
|
+
lambda m: m.initialize(SessionContext.instance().protobuf_messages) )
|
|
33
|
+
|
|
34
|
+
from holado_protobuf.ipc.protobuf.protobuf_modifier import ProtobufModifier
|
|
35
|
+
SessionContext.instance().services.register_service_type("protobuf_modifier", ProtobufModifier,
|
|
36
|
+
lambda m: m.initialize(SessionContext.instance().protobuf_messages) )
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# Register json conversion
|
|
40
|
+
|
|
41
|
+
from holado_json.ipc.json_types import JsonTypes
|
|
42
|
+
|
|
43
|
+
def to_json_from_message(msg):
|
|
44
|
+
converter = SessionContext.instance().protobuf_converter
|
|
45
|
+
return converter.convert_protobuf_object_to_json_object(msg)
|
|
46
|
+
|
|
47
|
+
JsonTypes.register_resource_for_type_in_class('protobuf.message', None, ProtobufMessages.is_object_message,
|
|
48
|
+
(None, to_json_from_message, None), index=0)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# Register datetime conversion
|
|
52
|
+
|
|
53
|
+
from holado_protobuf.ipc.protobuf.types.google.protobuf import Timestamp
|
|
54
|
+
DatetimeComparator.register_resource_for_type_in_class('protobuf.Timestamp', None,
|
|
55
|
+
lambda o: isinstance(o, Timestamp.protobuf_class()),
|
|
56
|
+
lambda o: DateTime.seconds_nanos_to_datetime(o.seconds, o.nanos),
|
|
57
|
+
index=0)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
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.exceptions.technical_exception import TechnicalException
|
|
16
|
+
import abc
|
|
17
|
+
from holado_python.standard_library.typing import Typing
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Type(object):
|
|
23
|
+
"""
|
|
24
|
+
Manage actions related to a specific protobuf type
|
|
25
|
+
"""
|
|
26
|
+
__metaclass__ = abc.ABCMeta
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def protobuf_class(cls):
|
|
30
|
+
raise NotImplementedError('Method not implemented!')
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def is_instance_of(cls, obj, raise_exception=False):
|
|
34
|
+
res = isinstance(obj, cls.protobuf_class())
|
|
35
|
+
if not res and raise_exception:
|
|
36
|
+
raise TechnicalException(f"Object has to be of protobuf type {cls.protobuf_class()} (obtained type: {Typing.get_object_class_fullname(obj)}")
|
|
37
|
+
return res
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def set_object_value(cls, obj, value, raise_exception=False):
|
|
41
|
+
cls.is_instance_of(obj, raise_exception=True)
|
|
42
|
+
return cls._set_object_value(obj, value, raise_exception=raise_exception)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|