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,354 @@
|
|
|
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.functional_exception import FunctionalException
|
|
16
|
+
import re
|
|
17
|
+
from holado.common.handlers.object import Object, DeleteableObject
|
|
18
|
+
from holado_core.common.tools.tools import Tools
|
|
19
|
+
from holado.holado_config import Config
|
|
20
|
+
from contextlib import contextmanager
|
|
21
|
+
from typing import NamedTuple
|
|
22
|
+
import threading
|
|
23
|
+
from holado.common.tools.gc_manager import GcManager
|
|
24
|
+
from holado_python.standard_library.typing import Typing
|
|
25
|
+
from holado.common.context.session_context import SessionContext
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
# logger_update = logging.getLogger(__name__ + ".update")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class VariableManager(DeleteableObject):
|
|
32
|
+
"""
|
|
33
|
+
Manage variables as couples of (name, value).
|
|
34
|
+
|
|
35
|
+
Variable names can contain any character except: ".", "["
|
|
36
|
+
Variable names can end by any dynamic suffix symbol, the symbol will be replaced by the associated suffix.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, parent=None):
|
|
40
|
+
super().__init__("variable manager")
|
|
41
|
+
|
|
42
|
+
self.__parent = parent
|
|
43
|
+
self.__dynamic_text_manager = None
|
|
44
|
+
self.__unique_value_manager = None
|
|
45
|
+
self.__variables = {}
|
|
46
|
+
|
|
47
|
+
# Manage temporary variables
|
|
48
|
+
self.__temporary_variables_lock = threading.Lock()
|
|
49
|
+
self.__temporary_variables = {}
|
|
50
|
+
|
|
51
|
+
# Manage variable update log file
|
|
52
|
+
self.__variable_update_log_file_path = None
|
|
53
|
+
self.__is_entered_in_variable_update_log_file = False
|
|
54
|
+
self.__logger_update = logging.getLogger(__name__ + f".update.{id(self)}")
|
|
55
|
+
|
|
56
|
+
def initialize(self, dynamic_text_manager, unique_value_manager, variable_update_log_file_path=None):
|
|
57
|
+
""" Initialize variable manager
|
|
58
|
+
@param dynamic_text_manager Dynamic text manager instance to use
|
|
59
|
+
@param unique_value_manager Unique value manager instance to use
|
|
60
|
+
@param variable_update_log_filename If defined, log all variable updates in given file in addition to normal logs
|
|
61
|
+
"""
|
|
62
|
+
self.__dynamic_text_manager = dynamic_text_manager
|
|
63
|
+
self.__unique_value_manager = unique_value_manager
|
|
64
|
+
|
|
65
|
+
# Manage variable update log file
|
|
66
|
+
self.__variable_update_log_file_path = variable_update_log_file_path
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def parent(self):
|
|
70
|
+
return self.__parent
|
|
71
|
+
|
|
72
|
+
def _delete_object(self):
|
|
73
|
+
# Delete all variables
|
|
74
|
+
names = set(self.__variables.keys())
|
|
75
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
76
|
+
logger.debug(f"Removing {len(names)} variables: {names}")
|
|
77
|
+
for index, name in enumerate(names):
|
|
78
|
+
if name in self.__variables:
|
|
79
|
+
value = self.__variables[name]
|
|
80
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
81
|
+
logger.debug(f"Removing variable {index+1}/{len(names)}: '{name}' (type: {Typing.get_object_class_fullname(value)})")
|
|
82
|
+
self.unregister_variable(name, through_parent=False, delete_value=True)
|
|
83
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
84
|
+
logger.debug(f"Finished to remove {len(names)} variables: {names}")
|
|
85
|
+
|
|
86
|
+
# # Clear variables
|
|
87
|
+
# self.__variables.clear()
|
|
88
|
+
|
|
89
|
+
# Leave variable update log file
|
|
90
|
+
self.__leave_variable_update_log_file()
|
|
91
|
+
|
|
92
|
+
def __enter_variable_update_log_file(self):
|
|
93
|
+
if self.__variable_update_log_file_path is not None and not self.__is_entered_in_variable_update_log_file:
|
|
94
|
+
SessionContext.instance().log_manager.enter_log_file_for_logger(self.__logger_update, self.__variable_update_log_file_path, use_format_short=True)
|
|
95
|
+
self.__is_entered_in_variable_update_log_file = True
|
|
96
|
+
|
|
97
|
+
def __leave_variable_update_log_file(self):
|
|
98
|
+
if self.__variable_update_log_file_path is not None and self.__is_entered_in_variable_update_log_file:
|
|
99
|
+
SessionContext.instance().log_manager.leave_log_file_for_logger(self.__logger_update)
|
|
100
|
+
self.__is_entered_in_variable_update_log_file = False
|
|
101
|
+
|
|
102
|
+
@contextmanager
|
|
103
|
+
def temporary_variables(self):
|
|
104
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
105
|
+
|
|
106
|
+
uid = MultitaskManager.get_thread_uid()
|
|
107
|
+
with self.__temporary_variables_lock:
|
|
108
|
+
if uid not in self.__temporary_variables:
|
|
109
|
+
self.__temporary_variables[uid] = NamedTuple("TempVars", counter=int, variable_names=list)
|
|
110
|
+
self.__temporary_variables[uid].counter = 0
|
|
111
|
+
self.__temporary_variables[uid].variable_names = set()
|
|
112
|
+
self.__temporary_variables[uid].counter += 1
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
yield None
|
|
116
|
+
finally:
|
|
117
|
+
with self.__temporary_variables_lock:
|
|
118
|
+
self.__temporary_variables[uid].counter -= 1
|
|
119
|
+
if self.__temporary_variables[uid].counter == 0:
|
|
120
|
+
logger.info(f"Unregistering temporary variables: {self.__temporary_variables[uid].variable_names}")
|
|
121
|
+
for var_name in self.__temporary_variables[uid].variable_names:
|
|
122
|
+
if self.exists_variable(var_name, through_parent=False):
|
|
123
|
+
self.unregister_variable(var_name, through_parent=False, delete_value=True)
|
|
124
|
+
del self.__temporary_variables[uid]
|
|
125
|
+
GcManager.collect()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def new_local_variable_name(self, sub_name=None):
|
|
129
|
+
if sub_name is not None:
|
|
130
|
+
return f"__VAR_{sub_name}_{self.__unique_value_manager.new_string(do_log=False)}__"
|
|
131
|
+
else:
|
|
132
|
+
return f"__VAR{self.__unique_value_manager.new_string(do_log=False)}__"
|
|
133
|
+
|
|
134
|
+
def new_variable_name(self):
|
|
135
|
+
res = None
|
|
136
|
+
while True:
|
|
137
|
+
res = self.new_local_variable_name()
|
|
138
|
+
if not self.exists_variable(variable_name=res):
|
|
139
|
+
break
|
|
140
|
+
return res
|
|
141
|
+
|
|
142
|
+
def evaluate_variable_name(self, var_name):
|
|
143
|
+
if var_name.endswith(Config.DYNAMIC_SYMBOL):
|
|
144
|
+
return self.__dynamic_text_manager.get(var_name[:-1])
|
|
145
|
+
elif var_name.endswith(Config.THREAD_DYNAMIC_SYMBOL):
|
|
146
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
147
|
+
return self.__dynamic_text_manager.get(var_name[:-1], scope=MultitaskManager.get_thread_id())
|
|
148
|
+
elif var_name.endswith(Config.UNIQUE_SYMBOL):
|
|
149
|
+
return var_name[:-1] + self.__unique_value_manager.new_string(padding_length=Config.unique_string_padding_length)
|
|
150
|
+
else:
|
|
151
|
+
return var_name
|
|
152
|
+
|
|
153
|
+
def register_variable(self, variable_name, value, accept_expression=True, log_level=logging.INFO):
|
|
154
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
155
|
+
|
|
156
|
+
self.__enter_variable_update_log_file()
|
|
157
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
158
|
+
logger.trace(f"Setting variable: {variable_name}=[{value}] (type: {Typing.get_object_class_fullname(value)})...")
|
|
159
|
+
|
|
160
|
+
names = variable_name.rsplit('.', 1)
|
|
161
|
+
if accept_expression and len(names) > 1:
|
|
162
|
+
if not self.exists_variable(expression=names[0]):
|
|
163
|
+
self.register_variable(names[0], Object())
|
|
164
|
+
var = self.get_value(names[0], through_patent=False)
|
|
165
|
+
setattr(var, names[1], value)
|
|
166
|
+
if Tools.do_log(self.__logger_update, log_level):
|
|
167
|
+
self.__logger_update.log(log_level, f"Set variable expression: {variable_name}=[{value}] (type: {Typing.get_object_class_fullname(value)})")
|
|
168
|
+
else:
|
|
169
|
+
var_name = self.evaluate_variable_name(variable_name)
|
|
170
|
+
self.__variables[var_name] = value
|
|
171
|
+
if Tools.do_log(self.__logger_update, log_level):
|
|
172
|
+
self.__logger_update.log(log_level, f"Set variable: {var_name}=[{value}] (type: {Typing.get_object_class_fullname(value)})")
|
|
173
|
+
|
|
174
|
+
# Manage temporary variables
|
|
175
|
+
uid = MultitaskManager.get_thread_uid()
|
|
176
|
+
with self.__temporary_variables_lock:
|
|
177
|
+
if uid in self.__temporary_variables:
|
|
178
|
+
self.__temporary_variables[uid].variable_names.add(var_name)
|
|
179
|
+
|
|
180
|
+
def unregister_variable(self, variable_name, through_parent=False, delete_value=False):
|
|
181
|
+
self.__enter_variable_update_log_file()
|
|
182
|
+
|
|
183
|
+
var_name = self.evaluate_variable_name(variable_name)
|
|
184
|
+
if self.exists_variable(var_name, through_parent=False):
|
|
185
|
+
value = self.__variables[var_name]
|
|
186
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
187
|
+
logger.debug(f"Unregistering variable '{var_name}' (type: {Typing.get_object_class_fullname(value)})")
|
|
188
|
+
|
|
189
|
+
if delete_value and isinstance(value, DeleteableObject):
|
|
190
|
+
try:
|
|
191
|
+
value.delete_object()
|
|
192
|
+
except Exception:
|
|
193
|
+
logger.exception(f"Catched exception while deleting object '{var_name}' (type: {Typing.get_object_class_fullname(value)})")
|
|
194
|
+
else:
|
|
195
|
+
if Tools.do_log(self.__logger_update, logging.DEBUG):
|
|
196
|
+
self.__logger_update.debug(f"Deleted variable '{var_name}' (type: {Typing.get_object_class_fullname(value)})")
|
|
197
|
+
|
|
198
|
+
del self.__variables[var_name]
|
|
199
|
+
elif through_parent and self.parent:
|
|
200
|
+
return self.parent.unregister_variable(variable_name, through_parent=through_parent, delete_value=delete_value)
|
|
201
|
+
else:
|
|
202
|
+
raise FunctionalException(f"Variable '{var_name}' has not been found. Missing initialisation ?")
|
|
203
|
+
|
|
204
|
+
def pop_variable(self, variable_name):
|
|
205
|
+
res = self.get_variable_value(variable_name, through_parent=False)
|
|
206
|
+
self.unregister_variable(variable_name, through_parent=False, delete_value=False)
|
|
207
|
+
return res
|
|
208
|
+
|
|
209
|
+
def get_variable_value(self, variable_name, attributes = [], through_parent=True):
|
|
210
|
+
# Get variable value
|
|
211
|
+
var_name = self.evaluate_variable_name(variable_name)
|
|
212
|
+
if self.exists_variable(var_name, through_parent=False):
|
|
213
|
+
res = self.__variables[var_name]
|
|
214
|
+
elif through_parent and self.parent:
|
|
215
|
+
return self.parent.get_variable_value(variable_name, attributes)
|
|
216
|
+
else:
|
|
217
|
+
raise FunctionalException("Variable '{}' has not been found. Missing initialisation ?".format(variable_name))
|
|
218
|
+
|
|
219
|
+
# If needed, call attributes
|
|
220
|
+
for attr in attributes:
|
|
221
|
+
res = getattr(res, attr)
|
|
222
|
+
|
|
223
|
+
return res
|
|
224
|
+
|
|
225
|
+
def get_value(self, expression, through_patent=True):
|
|
226
|
+
res = None
|
|
227
|
+
|
|
228
|
+
if self.is_variable_expression(expression, through_parent=through_patent):
|
|
229
|
+
try:
|
|
230
|
+
res = self.eval_variable_expression(expression, through_parent=through_patent)
|
|
231
|
+
except (SyntaxError, NameError):
|
|
232
|
+
raise FunctionalException("Expression '{}' is not evaluable. Is an initialization missing ?".format(expression))
|
|
233
|
+
else:
|
|
234
|
+
res = self.get_variable_value(expression, through_parent=through_patent)
|
|
235
|
+
|
|
236
|
+
return res
|
|
237
|
+
|
|
238
|
+
def set_value(self, expression, value, through_parent=True):
|
|
239
|
+
if self.is_variable_expression(expression, through_parent=through_parent):
|
|
240
|
+
try:
|
|
241
|
+
self.exec_set_variable_expression(expression, value, through_parent=through_parent)
|
|
242
|
+
except (SyntaxError, NameError):
|
|
243
|
+
raise FunctionalException("Expression '{}' is not evaluable. Is an initialization missing ?".format(expression))
|
|
244
|
+
else:
|
|
245
|
+
self.register_variable(expression, value)
|
|
246
|
+
|
|
247
|
+
def exists_variable(self, variable_name=None, expression=None, through_parent=True):
|
|
248
|
+
if expression is not None:
|
|
249
|
+
expression = expression.strip()
|
|
250
|
+
m_operator = re.search("[.[]", expression)
|
|
251
|
+
if m_operator:
|
|
252
|
+
# Return directly False if found operator is not an operator
|
|
253
|
+
# EKL: Why this check is done ???
|
|
254
|
+
if m_operator.group(0) not in ['.', '[']:
|
|
255
|
+
return False
|
|
256
|
+
# Begin by looking for variable existance
|
|
257
|
+
variable_name = expression[:m_operator.start()]
|
|
258
|
+
else:
|
|
259
|
+
variable_name = expression
|
|
260
|
+
|
|
261
|
+
var_name = self.evaluate_variable_name(variable_name)
|
|
262
|
+
res = var_name in self.__variables
|
|
263
|
+
|
|
264
|
+
# For expression, look if sub variable exist
|
|
265
|
+
if res and expression is not None and variable_name != expression:
|
|
266
|
+
try:
|
|
267
|
+
_ = self.eval_variable_expression(expression, through_parent=False)
|
|
268
|
+
except:
|
|
269
|
+
res = False
|
|
270
|
+
else:
|
|
271
|
+
res = True
|
|
272
|
+
|
|
273
|
+
if not res and through_parent and self.parent:
|
|
274
|
+
if expression is not None:
|
|
275
|
+
res = self.parent.exists_variable(expression=expression)
|
|
276
|
+
else:
|
|
277
|
+
res = self.parent.exists_variable(variable_name=variable_name)
|
|
278
|
+
return res
|
|
279
|
+
|
|
280
|
+
def is_variable_expression(self, expression, through_parent=True):
|
|
281
|
+
try:
|
|
282
|
+
var_name, expr_rest = self.__extract_expression_name(expression)
|
|
283
|
+
return len(var_name) > 0 and self.exists_variable(var_name, through_parent=through_parent) and len(expr_rest) > 0
|
|
284
|
+
except SyntaxError:
|
|
285
|
+
return False
|
|
286
|
+
|
|
287
|
+
def eval_variable_expression(self, expression, through_parent=True):
|
|
288
|
+
var_name, expr_rest = self.__extract_expression_name(expression)
|
|
289
|
+
var_value = self.get_variable_value(var_name, through_parent=through_parent)
|
|
290
|
+
new_var_name = self.new_local_variable_name(sub_name=self.__regular_variable_name(var_name))
|
|
291
|
+
locals()[new_var_name] = var_value
|
|
292
|
+
|
|
293
|
+
new_expr = f"{new_var_name}{expr_rest}"
|
|
294
|
+
try:
|
|
295
|
+
return eval(new_expr)
|
|
296
|
+
except Exception as exc:
|
|
297
|
+
try:
|
|
298
|
+
var_repr = Tools.represent_object(var_value)
|
|
299
|
+
except:
|
|
300
|
+
var_repr = str(var_value)
|
|
301
|
+
Tools.raise_same_exception_type(exc, f"{exc}\nVariable '{var_name}': {var_repr}", add_from=True)
|
|
302
|
+
|
|
303
|
+
def exec_set_variable_expression(self, expression, value, through_parent=True, log_level=logging.INFO):
|
|
304
|
+
self.__enter_variable_update_log_file()
|
|
305
|
+
|
|
306
|
+
var_name, expr_rest = self.__extract_expression_name(expression)
|
|
307
|
+
var_value = self.get_variable_value(var_name, through_parent=through_parent)
|
|
308
|
+
new_var_name = self.new_local_variable_name(sub_name=self.__regular_variable_name(var_name))
|
|
309
|
+
locals()[new_var_name] = var_value
|
|
310
|
+
|
|
311
|
+
new_var_value = self.new_local_variable_name(sub_name='value')
|
|
312
|
+
locals()[new_var_value] = value
|
|
313
|
+
|
|
314
|
+
new_expr = f"{new_var_name}{expr_rest}={new_var_value}"
|
|
315
|
+
try:
|
|
316
|
+
exec(new_expr)
|
|
317
|
+
except Exception as exc:
|
|
318
|
+
try:
|
|
319
|
+
var_repr = Tools.represent_object(var_value)
|
|
320
|
+
except:
|
|
321
|
+
var_repr = str(var_value)
|
|
322
|
+
# Tools.raise_same_exception_type(exc, f"{exc}\nVariable '{var_name}': {var_repr}", add_from=True)
|
|
323
|
+
raise FunctionalException(f"Failed to set value in variable expression (by exec): {expression}=[{value}] (type: {Typing.get_object_class_fullname(value)})\nVariable '{var_name}': {var_repr}") from exc
|
|
324
|
+
else:
|
|
325
|
+
if Tools.do_log(self.__logger_update, log_level):
|
|
326
|
+
self.__logger_update.log(log_level, f"Set value in variable expression (by exec): {expression}=[{value}] (type: {Typing.get_object_class_fullname(value)})")
|
|
327
|
+
|
|
328
|
+
def __regular_variable_name(self, name):
|
|
329
|
+
return "".join([c if re.match(r'\w', c) else '_' for c in name])
|
|
330
|
+
|
|
331
|
+
# def set_variable_expression(self, expression, value):
|
|
332
|
+
# var_name, expr_rest = self.__extract_expression_name(expression)
|
|
333
|
+
# if len(expr_rest) == 0:
|
|
334
|
+
# self.register_variable(expression, value)
|
|
335
|
+
# else:
|
|
336
|
+
# var_value = self.get_variable_value(var_name)
|
|
337
|
+
#
|
|
338
|
+
# while len(expr_rest) > 0:
|
|
339
|
+
#
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def __extract_expression_name(self, expression):
|
|
343
|
+
regex_name = re.compile("^([^.[]+)(.*)")
|
|
344
|
+
m = regex_name.match(expression)
|
|
345
|
+
if not m:
|
|
346
|
+
raise SyntaxError(f"Expression [{expression}] is not a variable expression")
|
|
347
|
+
var_name, expr_rest = m.group(1), m.group(2)
|
|
348
|
+
var_name = self.evaluate_variable_name(var_name)
|
|
349
|
+
return var_name, expr_rest
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
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 .common.tools.variable_convert_steps import *
|
|
17
|
+
from .common.tools.variable_new_steps import *
|
|
18
|
+
from .common.tools.variable_steps import *
|
|
19
|
+
from .common.tools.variable_verify_steps import *
|
|
20
|
+
from .scenario.function_steps import *
|
|
21
|
+
from .scenario.if_steps import *
|
|
22
|
+
from .scenario.loop_steps import *
|
|
@@ -0,0 +1,159 @@
|
|
|
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_test.scenario.step_tools import StepTools
|
|
17
|
+
from holado.common.context.session_context import SessionContext
|
|
18
|
+
from holado_test.behave.behave import * # @UnusedWildImport
|
|
19
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
20
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
21
|
+
import base64
|
|
22
|
+
import codecs
|
|
23
|
+
import logging
|
|
24
|
+
from holado_core.common.tables.table import Table
|
|
25
|
+
from holado_value.common.tables.value_table_with_header import ValueTableWithHeader
|
|
26
|
+
from holado_value.common.tables.value_table import ValueTable
|
|
27
|
+
from holado_core.common.tools.tools import Tools
|
|
28
|
+
from holado_python.standard_library.typing import Typing
|
|
29
|
+
from holado_value.common.tables.value_table_manager import ValueTableManager
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def __get_scenario_context():
|
|
35
|
+
return SessionContext.instance().get_scenario_context()
|
|
36
|
+
|
|
37
|
+
def __get_text_interpreter():
|
|
38
|
+
return __get_scenario_context().get_text_interpreter()
|
|
39
|
+
|
|
40
|
+
def __get_unique_value_manager():
|
|
41
|
+
return SessionContext.instance().unique_value_manager
|
|
42
|
+
|
|
43
|
+
def __get_variable_manager():
|
|
44
|
+
return __get_scenario_context().get_variable_manager()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@Given(r"(?P<var_name>{Variable}) = convert list (?P<list_var_name>{Variable}) to list of object attribute (?P<attribute_name>{Str})")
|
|
51
|
+
def step_impl(context, var_name, list_var_name, attribute_name): # @DuplicatedSignature
|
|
52
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
53
|
+
attr_name = StepTools.evaluate_scenario_parameter(attribute_name)
|
|
54
|
+
list_obj = StepTools.evaluate_variable_value(list_var_name)
|
|
55
|
+
|
|
56
|
+
res = []
|
|
57
|
+
for index, obj in enumerate(list_obj):
|
|
58
|
+
if hasattr(obj, attr_name):
|
|
59
|
+
attr_val = getattr(obj, attr_name)
|
|
60
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
61
|
+
logger.debug(f"Result list - add attribute value [{attr_val}] (type: {Typing.get_object_class_fullname(attr_val)} ; dir: {dir(attr_val)})")
|
|
62
|
+
res.append(attr_val)
|
|
63
|
+
else:
|
|
64
|
+
raise FunctionalException(f"In list, object of index {index} hasn't attribute '{attr_name}'")
|
|
65
|
+
|
|
66
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
67
|
+
|
|
68
|
+
@Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to string")
|
|
69
|
+
def step_impl(context, var_name, object_value):
|
|
70
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
71
|
+
object_value = StepTools.evaluate_variable_value(object_value)
|
|
72
|
+
if isinstance(object_value, bytes):
|
|
73
|
+
res = object_value.decode('utf-8')
|
|
74
|
+
else:
|
|
75
|
+
res = str(object_value)
|
|
76
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
77
|
+
|
|
78
|
+
@Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to integer")
|
|
79
|
+
def step_impl(context, var_name, object_value):
|
|
80
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
81
|
+
object_value = StepTools.evaluate_variable_value(object_value)
|
|
82
|
+
__get_variable_manager().register_variable(var_name, int(object_value))
|
|
83
|
+
|
|
84
|
+
@Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to list")
|
|
85
|
+
def step_impl(context, var_name, object_value):
|
|
86
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
87
|
+
object_value = StepTools.evaluate_variable_value(object_value)
|
|
88
|
+
|
|
89
|
+
if isinstance(object_value, Table):
|
|
90
|
+
table = object_value
|
|
91
|
+
if table.nb_columns > 1 and table.nb_rows > 1:
|
|
92
|
+
raise FunctionalException(f"Table must have only one column or only one row (table has {table.nb_columns} and {table.nb_rows})")
|
|
93
|
+
|
|
94
|
+
if table.nb_columns > 1 and table.nb_rows == 1:
|
|
95
|
+
row = table.get_row(0)
|
|
96
|
+
elif table.nb_rows > 1 and table.nb_columns == 1:
|
|
97
|
+
row = table.get_column(0)
|
|
98
|
+
else:
|
|
99
|
+
row = None
|
|
100
|
+
|
|
101
|
+
if row is not None:
|
|
102
|
+
if ValueTableManager.is_value_table(table):
|
|
103
|
+
res = [c.value for c in row]
|
|
104
|
+
else:
|
|
105
|
+
res = [c.content for c in row]
|
|
106
|
+
else:
|
|
107
|
+
res = []
|
|
108
|
+
else:
|
|
109
|
+
res = list(object_value)
|
|
110
|
+
|
|
111
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
112
|
+
|
|
113
|
+
@Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to dict")
|
|
114
|
+
def step_impl(context, var_name, object_value):
|
|
115
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
116
|
+
object_value = StepTools.evaluate_variable_value(object_value)
|
|
117
|
+
__get_variable_manager().register_variable(var_name, dict(object_value))
|
|
118
|
+
|
|
119
|
+
@Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to base 64")
|
|
120
|
+
def step_impl(context, var_name, object_value):
|
|
121
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
122
|
+
object_value = StepTools.evaluate_variable_value(object_value)
|
|
123
|
+
if isinstance(object_value, bytes):
|
|
124
|
+
value_bytes = object_value
|
|
125
|
+
elif isinstance(object_value, str):
|
|
126
|
+
value_bytes = object_value.encode('utf-8')
|
|
127
|
+
else:
|
|
128
|
+
raise TechnicalException(f"Unexpected object value type {Typing.get_object_class_fullname(object_value)} (allowed types: string, bytes)")
|
|
129
|
+
res = base64.b64encode(value_bytes)
|
|
130
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
131
|
+
|
|
132
|
+
@Step(r"(?P<var_name>{Variable}) = convert hex string (?P<object_value>{Str}) to bytes")
|
|
133
|
+
def step_impl(context, var_name, object_value):
|
|
134
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
135
|
+
object_value = StepTools.evaluate_scenario_parameter(object_value)
|
|
136
|
+
if isinstance(object_value, str):
|
|
137
|
+
res = codecs.decode(object_value, 'hex_codec')
|
|
138
|
+
else:
|
|
139
|
+
raise TechnicalException(f"Unexpected value type {Typing.get_object_class_fullname(object_value)}")
|
|
140
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
141
|
+
|
|
142
|
+
@Step(r"(?P<var_name>{Variable}) = convert hex string (?P<object_value>{Str}) to base 64")
|
|
143
|
+
def step_impl(context, var_name, object_value):
|
|
144
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
145
|
+
execute_steps(u"""
|
|
146
|
+
{keyword} __{var_name}_BYTES__ = convert hex string {object_value} to bytes
|
|
147
|
+
{keyword} {var_name} = convert object value __{var_name}_BYTES__ to base 64
|
|
148
|
+
""".format(keyword=context.step.keyword, var_name=var_name, object_value=object_value))
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@Step(r"(?P<var_name>{Variable}) = convert base 64 (?P<value>{Str}) to bytes")
|
|
152
|
+
def step_impl(context, var_name, value):
|
|
153
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
154
|
+
value = StepTools.evaluate_scenario_parameter(value)
|
|
155
|
+
if not isinstance(value, str):
|
|
156
|
+
raise TechnicalException(f"Unexpected value type {Typing.get_object_class_fullname(value)} (allowed types: string)")
|
|
157
|
+
res = base64.b64decode(value)
|
|
158
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
159
|
+
|
|
@@ -0,0 +1,130 @@
|
|
|
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_value.common.tables.value_table_manager import ValueTableManager
|
|
17
|
+
from holado_test.scenario.step_tools import StepTools
|
|
18
|
+
from holado.common.context.session_context import SessionContext
|
|
19
|
+
from holado_test.behave.behave import * # @UnusedWildImport
|
|
20
|
+
import logging
|
|
21
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
22
|
+
from holado_test.behave.scenario.behave_step_tools import BehaveStepTools
|
|
23
|
+
from holado_value.common.tables.converters.value_table_converter import ValueTableConverter
|
|
24
|
+
from holado_python.standard_library.typing import Typing
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def __get_scenario_context():
|
|
30
|
+
return SessionContext.instance().get_scenario_context()
|
|
31
|
+
|
|
32
|
+
def __get_text_interpreter():
|
|
33
|
+
return __get_scenario_context().get_text_interpreter()
|
|
34
|
+
|
|
35
|
+
def __get_unique_value_manager():
|
|
36
|
+
return SessionContext.instance().unique_value_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 (?P<type_name>{Str}) with attributes")
|
|
45
|
+
def step_impl(context, var_name, type_name):
|
|
46
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
47
|
+
type_name = StepTools.evaluate_string_parameter(type_name)
|
|
48
|
+
table = BehaveStepTools.convert_step_table_2_value_table_with_header(context.table)
|
|
49
|
+
|
|
50
|
+
# Get class type
|
|
51
|
+
class_ = Typing.get_class_for_type_name(type_name)
|
|
52
|
+
|
|
53
|
+
# Create object
|
|
54
|
+
obj = class_()
|
|
55
|
+
ValueTableManager.set_object_attributes_according_name_value_table(obj, table)
|
|
56
|
+
|
|
57
|
+
# Store in variable
|
|
58
|
+
__get_variable_manager().register_variable(var_name, obj)
|
|
59
|
+
|
|
60
|
+
@Given(r"(?P<var_name>{Variable}) = new (?P<type_name>{Str}) with constructor parameters")
|
|
61
|
+
def step_impl(context, var_name, type_name): # @DuplicatedSignature
|
|
62
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
63
|
+
type_name = StepTools.evaluate_string_parameter(type_name)
|
|
64
|
+
|
|
65
|
+
# Get class type
|
|
66
|
+
class_ = Typing.get_class_for_type_name(type_name)
|
|
67
|
+
|
|
68
|
+
# Create object
|
|
69
|
+
table = BehaveStepTools.convert_step_table_2_value_table_with_header(context.table)
|
|
70
|
+
unnamed_parameters, named_parameters = ValueTableConverter.convert_name_value_table_2_list_and_dict(table)
|
|
71
|
+
logger.info("creating new '{}' with parameters {} and {}".format(class_, unnamed_parameters, named_parameters))
|
|
72
|
+
obj = class_(*unnamed_parameters, **named_parameters)
|
|
73
|
+
|
|
74
|
+
# Store in variable
|
|
75
|
+
__get_variable_manager().register_variable(var_name, obj)
|
|
76
|
+
|
|
77
|
+
@Given(r"(?P<var_name>{Variable}) = list")
|
|
78
|
+
def step_impl(context, var_name):
|
|
79
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
80
|
+
table = BehaveStepTools.convert_step_table_2_value_table(context.table)
|
|
81
|
+
if table.nb_columns > 1 and table.nb_rows > 1:
|
|
82
|
+
raise FunctionalException("Table must be a single column or a single row")
|
|
83
|
+
|
|
84
|
+
if table.nb_rows > 1:
|
|
85
|
+
res = list(table.get_column(0).cells_value)
|
|
86
|
+
else:
|
|
87
|
+
res = list(table.get_row(0).cells_value)
|
|
88
|
+
|
|
89
|
+
# Store in variable
|
|
90
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
91
|
+
|
|
92
|
+
@Given(r"(?P<var_name>{Variable}) = multiline text")
|
|
93
|
+
def step_impl(context, var_name):
|
|
94
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
95
|
+
res = BehaveStepTools.get_step_multiline_text(context)
|
|
96
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
97
|
+
|
|
98
|
+
@Given(r"(?P<var_name>{Variable}) = new unique integer")
|
|
99
|
+
def step_impl(context, var_name):
|
|
100
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
101
|
+
res = __get_unique_value_manager().new_integer()
|
|
102
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
103
|
+
|
|
104
|
+
@Given(r"(?P<var_name>{Variable}) = new unique HEX integer")
|
|
105
|
+
def step_impl(context, var_name):
|
|
106
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
107
|
+
res = __get_unique_value_manager().new_hex()
|
|
108
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
109
|
+
|
|
110
|
+
@Given(r"(?P<var_name>{Variable}) = new unique HEX integer \(length: (?P<length>{Int})\)")
|
|
111
|
+
def step_impl(context, var_name, length):
|
|
112
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
113
|
+
length = StepTools.evaluate_scenario_parameter(length)
|
|
114
|
+
res = __get_unique_value_manager().new_hex(length=length)
|
|
115
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
116
|
+
|
|
117
|
+
@Given(r"(?P<var_name>{Variable}) = new unique string")
|
|
118
|
+
def step_impl(context, var_name):
|
|
119
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
120
|
+
res = __get_unique_value_manager().new_string()
|
|
121
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
122
|
+
|
|
123
|
+
@Given(r"(?P<var_name>{Variable}) = new unique string \(padding length: (?P<pad_len>{Int})\)")
|
|
124
|
+
def step_impl(context, var_name, pad_len):
|
|
125
|
+
var_name = StepTools.evaluate_variable_name(var_name)
|
|
126
|
+
pad_len = StepTools.evaluate_scenario_parameter(pad_len)
|
|
127
|
+
res = __get_unique_value_manager().new_string(padding_length=pad_len)
|
|
128
|
+
__get_variable_manager().register_variable(var_name, res)
|
|
129
|
+
|
|
130
|
+
|