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,547 @@
|
|
|
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.common.context.session_context import SessionContext
|
|
15
|
+
import logging
|
|
16
|
+
import re
|
|
17
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
18
|
+
from holado_scripting.common.tools.variable_manager import VariableManager
|
|
19
|
+
from holado_core.common.tools.tools import Tools
|
|
20
|
+
from holado_value.common.tables.value_table import ValueTable
|
|
21
|
+
from holado_value.common.tables.value_table_with_header import ValueTableWithHeader
|
|
22
|
+
from holado_core.common.tables.table_with_header import TableWithHeader
|
|
23
|
+
from holado_value.common.tables.converters.value_table_converter import ValueTableConverter
|
|
24
|
+
from holado_core.common.tables.table import Table
|
|
25
|
+
from holado_core.common.tables.table_row import TableRow
|
|
26
|
+
from holado_core.common.tables.table_cell import TableCell
|
|
27
|
+
from holado_value.common.tables.value_table_row import ValueTableRow
|
|
28
|
+
from holado_value.common.tables.value_table_cell import ValueTableCell
|
|
29
|
+
from holado_value.common.tools.value_types import ValueTypes
|
|
30
|
+
from holado_value.common.tables.comparators.table_2_value_table_with_header_comparator import Table2ValueTable_WithHeaderComparator
|
|
31
|
+
from holado_value.common.tables.comparators.table_2_value_table_comparator import Table2ValueTable_Comparator
|
|
32
|
+
from holado_core.common.tables.table_manager import TableManager
|
|
33
|
+
from holado_scripting.common.tools.evaluate_parameters import EvaluateParameters
|
|
34
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
35
|
+
from holado.holado_config import Config
|
|
36
|
+
from holado_python.standard_library.typing import Typing
|
|
37
|
+
from holado_value.common.tables.value_table_manager import ValueTableManager
|
|
38
|
+
|
|
39
|
+
logger = logging.getLogger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class SRE(object):
|
|
44
|
+
"""
|
|
45
|
+
Step RegExp
|
|
46
|
+
All registered step parameter types are added in this class as public attributes,
|
|
47
|
+
with type name as attribute name, and pattern as associated value
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def all_as_dict():
|
|
52
|
+
return Typing.get_object_attribute_values_by_name(SRE)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
#TODO: make it a service in SessionContext
|
|
56
|
+
class StepTools(object):
|
|
57
|
+
|
|
58
|
+
__registered_types = {}
|
|
59
|
+
|
|
60
|
+
@staticmethod
|
|
61
|
+
def _get_scenario_context():
|
|
62
|
+
return SessionContext.instance().get_scenario_context()
|
|
63
|
+
|
|
64
|
+
@staticmethod
|
|
65
|
+
def _get_expression_evaluator():
|
|
66
|
+
return StepTools._get_scenario_context().get_expression_evaluator()
|
|
67
|
+
|
|
68
|
+
@staticmethod
|
|
69
|
+
def _get_text_interpreter():
|
|
70
|
+
return StepTools._get_scenario_context().get_text_interpreter()
|
|
71
|
+
|
|
72
|
+
@staticmethod
|
|
73
|
+
def _get_variable_manager() -> VariableManager:
|
|
74
|
+
return StepTools._get_scenario_context().get_variable_manager()
|
|
75
|
+
|
|
76
|
+
@staticmethod
|
|
77
|
+
def unescape_string(text):
|
|
78
|
+
#res = bytes(text, "utf-8").decode("unicode_escape")
|
|
79
|
+
res = text.encode('latin-1').decode('unicode-escape')
|
|
80
|
+
|
|
81
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
82
|
+
logger.trace("unescaping string [{}] -> [{}]".format(text, res))
|
|
83
|
+
return res
|
|
84
|
+
|
|
85
|
+
@staticmethod
|
|
86
|
+
def extract_string_value(text_param):
|
|
87
|
+
return StepTools._get_expression_evaluator().extract_string_value(text_param)
|
|
88
|
+
|
|
89
|
+
@staticmethod
|
|
90
|
+
def evaluate_string_parameter(text_param, do_interpret=True, log_level=logging.DEBUG):
|
|
91
|
+
eval_params = EvaluateParameters.default().with_interpret(do_interpret).with_eval(False).with_result_type(str)
|
|
92
|
+
_, res = StepTools._get_expression_evaluator().evaluate_expression(text_param, eval_params=eval_params, log_level=Tools.do_log_level(log_level, logging.TRACE)) # @UndefinedVariable
|
|
93
|
+
if Tools.do_log_if_objects_are_different(logger, log_level, text_param, res):
|
|
94
|
+
logger.log(log_level, "evaluate_string_parameter: [{}] -> [{}]".format(text_param, res))
|
|
95
|
+
return res
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def evaluate_variable_name(text_param, log_level=logging.DEBUG):
|
|
99
|
+
if text_param is None:
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
eval_params = EvaluateParameters.default_without_eval(False).with_result_type(str)
|
|
103
|
+
res = StepTools._get_text_interpreter().interpret(text_param, eval_params=eval_params, log_level=Tools.do_log_level(log_level, logging.TRACE)) # @UndefinedVariable
|
|
104
|
+
if Tools.do_log_if_objects_are_different(logger, log_level, text_param, res):
|
|
105
|
+
logger.log(log_level, f"evaluate_variable_name: [{text_param}] -> [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
106
|
+
return res
|
|
107
|
+
|
|
108
|
+
@staticmethod
|
|
109
|
+
def evaluate_variable_value(text_param, log_level=logging.DEBUG):
|
|
110
|
+
if text_param is None:
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
eval_params = EvaluateParameters.default_without_eval(False)
|
|
114
|
+
_, res = StepTools._get_expression_evaluator().evaluate_expression(text_param, eval_params=eval_params, log_level=Tools.do_log_level(log_level, logging.TRACE)) # @UndefinedVariable
|
|
115
|
+
if Tools.do_log_if_objects_are_different(logger, log_level, text_param, res):
|
|
116
|
+
logger.log(log_level, f"evaluate_variable_name: [{text_param}] -> [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
117
|
+
return res
|
|
118
|
+
|
|
119
|
+
@staticmethod
|
|
120
|
+
def evaluate_scenario_parameter(text_param, log_level=logging.DEBUG):
|
|
121
|
+
if text_param is None:
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
eval_params = EvaluateParameters.default().with_raise_on_eval_error(False)
|
|
125
|
+
_, res = StepTools._get_expression_evaluator().evaluate_expression(text_param, eval_params=eval_params, log_level=Tools.do_log_level(log_level, logging.TRACE)) # @UndefinedVariable
|
|
126
|
+
if Tools.do_log_if_objects_are_different(logger, log_level, text_param, res):
|
|
127
|
+
logger.log(log_level, f"evaluate_scenario_parameter: [{text_param}] -> [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
128
|
+
return res
|
|
129
|
+
|
|
130
|
+
@staticmethod
|
|
131
|
+
def evaluate_list_scenario_parameter(text_param, param_name, log_level=logging.DEBUG):
|
|
132
|
+
res = StepTools.evaluate_scenario_parameter(text_param, log_level=log_level)
|
|
133
|
+
if isinstance(res, str):
|
|
134
|
+
regex = re.compile(r"^\s*\[(.*)\]\s*$")
|
|
135
|
+
m = regex.match(res)
|
|
136
|
+
if m:
|
|
137
|
+
param_names = m.group(1).split(',')
|
|
138
|
+
res = [StepTools.evaluate_scenario_parameter(pn.strip()) for pn in param_names]
|
|
139
|
+
else:
|
|
140
|
+
raise FunctionalException(f"Parameter '{param_name}' must be specified in a list format (ex: \"['Name1', 'Name2',...]\")")
|
|
141
|
+
if Tools.do_log_if_objects_are_different(logger, log_level, text_param, res):
|
|
142
|
+
logger.log(log_level, f"evaluate_list_scenario_parameter for parameter '{param_name}': {text_param} -> {res}")
|
|
143
|
+
return res
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def replace_variable_names(cls, text, log_level=logging.DEBUG):
|
|
147
|
+
res = text
|
|
148
|
+
if res is None:
|
|
149
|
+
return None
|
|
150
|
+
|
|
151
|
+
pattern_var = re.compile(SRE.VariableName)
|
|
152
|
+
pos = 0
|
|
153
|
+
m = pattern_var.search(res, pos)
|
|
154
|
+
while m:
|
|
155
|
+
var_name = cls._get_variable_manager().evaluate_variable_name(m.group())
|
|
156
|
+
if cls._get_variable_manager().exists_variable(var_name):
|
|
157
|
+
res = res[:m.start()] + var_name + res[m.end():]
|
|
158
|
+
pos = m.start() + len(var_name)
|
|
159
|
+
else:
|
|
160
|
+
pos = m.end()
|
|
161
|
+
m = pattern_var.search(res, pos)
|
|
162
|
+
|
|
163
|
+
if res != text:
|
|
164
|
+
if Tools.do_log(logger, log_level):
|
|
165
|
+
logger.log(log_level, f"replace_variable_names: [{text}] -> [{res}]")
|
|
166
|
+
return res
|
|
167
|
+
|
|
168
|
+
@classmethod
|
|
169
|
+
def get_step_multiline_text(cls, *args, **kwargs):
|
|
170
|
+
"""
|
|
171
|
+
Get the step multiline text interpreted.
|
|
172
|
+
Note: parameter context can be the step context or the step object.
|
|
173
|
+
"""
|
|
174
|
+
raise NotImplementedError
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@classmethod
|
|
178
|
+
def get_step_table(cls, *args, **kwargs):
|
|
179
|
+
"""
|
|
180
|
+
Get the step table interpreted.
|
|
181
|
+
Note: parameter context can be the step context or the step object.
|
|
182
|
+
"""
|
|
183
|
+
raise NotImplementedError
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@classmethod
|
|
187
|
+
def convert_step_table_2_value_table(cls, table, do_eval_once=True):
|
|
188
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
189
|
+
logger.trace(f"Converting step table to scenario table (step table = {table})")
|
|
190
|
+
|
|
191
|
+
res = ValueTable()
|
|
192
|
+
|
|
193
|
+
# Set body
|
|
194
|
+
previous_row = None
|
|
195
|
+
for row in cls._get_table_rows(table):
|
|
196
|
+
srow = cls._convert_step_table_row_2_value_table_row(row, previous_row, do_eval_once=do_eval_once)
|
|
197
|
+
res.add_row(row=srow)
|
|
198
|
+
previous_row = srow
|
|
199
|
+
|
|
200
|
+
# Manage one cell table referencing a variable containing a table
|
|
201
|
+
res = cls._extract_inner_table_if_present(res, do_eval_once=do_eval_once)
|
|
202
|
+
|
|
203
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
204
|
+
logger.debug(f"Converting step table to scenario table (step table = {table}) => {res}")
|
|
205
|
+
return res
|
|
206
|
+
|
|
207
|
+
@classmethod
|
|
208
|
+
def convert_step_table_2_value_table_with_header(cls, table, do_eval_once=True) -> ValueTableWithHeader :
|
|
209
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
210
|
+
logger.trace(f"Converting step table to scenario table with header (step table = {table})")
|
|
211
|
+
if table is None:
|
|
212
|
+
raise FunctionalException("This step needs a table")
|
|
213
|
+
|
|
214
|
+
res = ValueTableWithHeader()
|
|
215
|
+
|
|
216
|
+
# Set header
|
|
217
|
+
res.header = cls._convert_step_table_header_2_table_header(cls._get_table_header(table))
|
|
218
|
+
|
|
219
|
+
# Set body
|
|
220
|
+
previous_row = None
|
|
221
|
+
for row in cls._get_table_rows(table):
|
|
222
|
+
srow = cls._convert_step_table_row_2_value_table_row(row, previous_row, do_eval_once=do_eval_once)
|
|
223
|
+
res.add_row(row=srow)
|
|
224
|
+
previous_row = srow
|
|
225
|
+
|
|
226
|
+
# Manage one cell table referencing a variable containing a table
|
|
227
|
+
res = cls._extract_inner_table_if_present(res, do_eval_once=do_eval_once)
|
|
228
|
+
|
|
229
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
230
|
+
logger.debug(f"Converting step table to scenario table with header (step table = {table}) => {res}")
|
|
231
|
+
return res
|
|
232
|
+
|
|
233
|
+
@classmethod
|
|
234
|
+
def _extract_inner_table_if_present(cls, table, do_eval_once=True):
|
|
235
|
+
res = table
|
|
236
|
+
if isinstance(table, TableWithHeader):
|
|
237
|
+
if res.nb_columns == 1 and res.nb_rows == 0:
|
|
238
|
+
cell_content = res.header.get_cell(0).content
|
|
239
|
+
if cls._get_variable_manager().exists_variable(variable_name=cell_content):
|
|
240
|
+
value = cls._get_variable_manager().get_variable_value(cell_content)
|
|
241
|
+
if ValueTableManager.is_value_table(value):
|
|
242
|
+
res = value
|
|
243
|
+
elif isinstance(value, TableWithHeader):
|
|
244
|
+
res = ValueTableConverter.convert_table_2_value_table(value, do_eval_once=do_eval_once)
|
|
245
|
+
elif isinstance(value, Table):
|
|
246
|
+
raise FunctionalException(f"The table in variable '{cell_content}' is expected to be with header")
|
|
247
|
+
elif isinstance(table, Table):
|
|
248
|
+
if res.nb_columns == 1 and res.nb_rows == 1:
|
|
249
|
+
value = res.get_row(0).get_cell(0).value
|
|
250
|
+
if ValueTableManager.is_value_table(value):
|
|
251
|
+
res = value
|
|
252
|
+
elif isinstance(value, Table):
|
|
253
|
+
res = ValueTableConverter.convert_table_2_value_table(value, do_eval_once=do_eval_once)
|
|
254
|
+
|
|
255
|
+
if res != table and Tools.do_log(logger, logging.DEBUG):
|
|
256
|
+
logger.debug(f"Extracted inner table: {table} => {res}")
|
|
257
|
+
return res
|
|
258
|
+
|
|
259
|
+
@classmethod
|
|
260
|
+
def _convert_step_table_header_2_table_header(cls, header):
|
|
261
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
262
|
+
logger.trace("Converting step table header to table header")
|
|
263
|
+
|
|
264
|
+
res = TableRow()
|
|
265
|
+
|
|
266
|
+
for hcell in header:
|
|
267
|
+
cell = TableCell(hcell)
|
|
268
|
+
|
|
269
|
+
# TODO: manage merged header cells
|
|
270
|
+
|
|
271
|
+
res.add_cell(cell=cell)
|
|
272
|
+
|
|
273
|
+
return res
|
|
274
|
+
|
|
275
|
+
@classmethod
|
|
276
|
+
def _convert_step_table_row_2_value_table_row(cls, row, previous_row, do_eval_once=True): # @UnusedVariable
|
|
277
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
278
|
+
logger.trace("Converting behave table row to scenario table row")
|
|
279
|
+
|
|
280
|
+
res = ValueTableRow()
|
|
281
|
+
|
|
282
|
+
for cell in row:
|
|
283
|
+
scell = ValueTableCell(cell, do_eval_once=do_eval_once)
|
|
284
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
285
|
+
logger.trace("Converting cell [{}] -> scenario table cell (content=[{}] ; value_type='{}')".format(cell, scell.content, scell.value_type.name))
|
|
286
|
+
|
|
287
|
+
# TODO: manage merged cells
|
|
288
|
+
|
|
289
|
+
res.add_cell(cell=scell)
|
|
290
|
+
|
|
291
|
+
return res
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
@classmethod
|
|
295
|
+
def has_table_header(cls, table):
|
|
296
|
+
"""
|
|
297
|
+
Return True if scenario table has a header (for HolAdo framework).
|
|
298
|
+
For HolAdo framework, table header names are all texts without quotes.
|
|
299
|
+
"""
|
|
300
|
+
internal_header = cls._get_table_header(table)
|
|
301
|
+
if internal_header is None:
|
|
302
|
+
return False
|
|
303
|
+
|
|
304
|
+
for cell in internal_header:
|
|
305
|
+
scell = ValueTableCell(cell)
|
|
306
|
+
if not scell.content_type == ValueTypes.Symbol:
|
|
307
|
+
return False
|
|
308
|
+
|
|
309
|
+
return True
|
|
310
|
+
|
|
311
|
+
@classmethod
|
|
312
|
+
def _has_table_header(cls, table):
|
|
313
|
+
"""Return True if scenario table has a header (for internal tool interpreting scenario text)."""
|
|
314
|
+
return cls._get_table_header(table) is not None
|
|
315
|
+
|
|
316
|
+
@classmethod
|
|
317
|
+
def _is_scenario_step_table(cls, table):
|
|
318
|
+
"""Return if a table is a scenario step table."""
|
|
319
|
+
raise NotImplementedError()
|
|
320
|
+
|
|
321
|
+
@classmethod
|
|
322
|
+
def _get_table_header(cls, table):
|
|
323
|
+
"""Return iterable object on scenario table header (for internal tool interpreting scenario text)."""
|
|
324
|
+
raise NotImplementedError()
|
|
325
|
+
|
|
326
|
+
@classmethod
|
|
327
|
+
def _get_table_rows(cls, table):
|
|
328
|
+
"""Return iterable object on scenario table rows (for internal tool interpreting scenario text)."""
|
|
329
|
+
raise NotImplementedError()
|
|
330
|
+
|
|
331
|
+
@classmethod
|
|
332
|
+
def represent_step_table(cls, table, indent=0):
|
|
333
|
+
res_list = []
|
|
334
|
+
|
|
335
|
+
header = cls._get_table_header(table)
|
|
336
|
+
if header:
|
|
337
|
+
res_list.append("| " + " | ".join(header) + " |")
|
|
338
|
+
|
|
339
|
+
for row in cls._get_table_rows(table):
|
|
340
|
+
res_list.append("| " + " | ".join(row) + " |")
|
|
341
|
+
|
|
342
|
+
return Tools.indent_string(indent, "\n".join(res_list))
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
@classmethod
|
|
346
|
+
def then_table_is(cls, table_obtained, table_expected, raise_exception=True):
|
|
347
|
+
is_with_header = TableManager.is_table_with_header(table_obtained)
|
|
348
|
+
if cls._is_scenario_step_table(table_expected):
|
|
349
|
+
if is_with_header:
|
|
350
|
+
table_expected = cls.convert_step_table_2_value_table_with_header(table_expected)
|
|
351
|
+
else:
|
|
352
|
+
table_expected = cls.convert_step_table_2_value_table(table_expected)
|
|
353
|
+
|
|
354
|
+
if is_with_header:
|
|
355
|
+
comparator = Table2ValueTable_WithHeaderComparator()
|
|
356
|
+
else:
|
|
357
|
+
comparator = Table2ValueTable_Comparator()
|
|
358
|
+
try:
|
|
359
|
+
return comparator.equals(table_obtained, table_expected, is_obtained_vs_expected=True, raise_exception=raise_exception)
|
|
360
|
+
except FunctionalException as exc:
|
|
361
|
+
raise FunctionalException(f"Tables are different (obtained = table 1 ; expected = table 2):\n{Tools.indent_string(4, exc.message)}") from exc
|
|
362
|
+
|
|
363
|
+
@classmethod
|
|
364
|
+
def then_table_contains(cls, table_obtained, table_expected, raise_exception=True):
|
|
365
|
+
is_with_header = TableManager.is_table_with_header(table_obtained)
|
|
366
|
+
if cls._is_scenario_step_table(table_expected):
|
|
367
|
+
if is_with_header:
|
|
368
|
+
table_expected = cls.convert_step_table_2_value_table_with_header(table_expected)
|
|
369
|
+
else:
|
|
370
|
+
table_expected = cls.convert_step_table_2_value_table(table_expected)
|
|
371
|
+
|
|
372
|
+
if is_with_header:
|
|
373
|
+
comparator = Table2ValueTable_WithHeaderComparator()
|
|
374
|
+
else:
|
|
375
|
+
comparator = Table2ValueTable_Comparator()
|
|
376
|
+
|
|
377
|
+
try:
|
|
378
|
+
return comparator.contains_rows(table_obtained, table_expected, is_obtained_vs_expected=True, raise_exception=raise_exception)
|
|
379
|
+
except FunctionalException as exc:
|
|
380
|
+
raise FunctionalException(f"Obtained table doesn't contain expected table (obtained = table 1 ; expected = table 2):\n{Tools.indent_string(4, exc.message)}") from exc
|
|
381
|
+
|
|
382
|
+
@classmethod
|
|
383
|
+
def then_table_doesnt_contain(cls, table_obtained, table_expected, raise_exception=True):
|
|
384
|
+
is_with_header = TableManager.is_table_with_header(table_obtained)
|
|
385
|
+
if cls._is_scenario_step_table(table_expected):
|
|
386
|
+
if is_with_header:
|
|
387
|
+
table_expected = cls.convert_step_table_2_value_table_with_header(table_expected)
|
|
388
|
+
else:
|
|
389
|
+
table_expected = cls.convert_step_table_2_value_table(table_expected)
|
|
390
|
+
|
|
391
|
+
if is_with_header:
|
|
392
|
+
comparator = Table2ValueTable_WithHeaderComparator()
|
|
393
|
+
else:
|
|
394
|
+
comparator = Table2ValueTable_Comparator()
|
|
395
|
+
|
|
396
|
+
try:
|
|
397
|
+
return comparator.doesnt_contain_rows(table_obtained, table_expected, is_obtained_vs_expected=True, raise_exception=raise_exception)
|
|
398
|
+
except FunctionalException as exc:
|
|
399
|
+
raise FunctionalException(f"Obtained table contains at least a row of expected table (obtained = table 1 ; expected = table 2):\n{Tools.indent_string(4, exc.message)}") from exc
|
|
400
|
+
|
|
401
|
+
@classmethod
|
|
402
|
+
def format_step(cls, step_str, keyword=None, table=None, text=None):
|
|
403
|
+
step_str = step_str.strip()
|
|
404
|
+
|
|
405
|
+
if keyword is not None:
|
|
406
|
+
res = f"{keyword} {step_str}"
|
|
407
|
+
else:
|
|
408
|
+
res = step_str
|
|
409
|
+
|
|
410
|
+
if table is not None:
|
|
411
|
+
if isinstance(table, Table):
|
|
412
|
+
rendered_table = table.represent(indent=4)
|
|
413
|
+
else:
|
|
414
|
+
raise TechnicalException(f"Unmanaged table of type '{Typing.get_object_class_fullname(table)}'")
|
|
415
|
+
res = u"{res}\n{table}".format(res=res, table=rendered_table)
|
|
416
|
+
elif text is not None:
|
|
417
|
+
rendered_text = text.replace(u'"""', u'\\"\\"\\"')
|
|
418
|
+
rendered_text = Tools.indent_string(4, u'"""\n' + rendered_text + '\n"""\n')
|
|
419
|
+
res = u"{res}\n{text}".format(res=res, text=rendered_text)
|
|
420
|
+
|
|
421
|
+
return res
|
|
422
|
+
|
|
423
|
+
@classmethod
|
|
424
|
+
def format_steps_with(cls, steps, format_with_list):
|
|
425
|
+
res = steps
|
|
426
|
+
for form in format_with_list:
|
|
427
|
+
_, form_eval = cls._get_expression_evaluator().evaluate_expression(form, log_level=logging.TRACE) # @UndefinedVariable
|
|
428
|
+
if form_eval == form:
|
|
429
|
+
raise FunctionalException(f"Not able to evaluation expression [{form}]. Is missing its initialization ?")
|
|
430
|
+
res = res.replace(f"${{{form}}}", str(form_eval))
|
|
431
|
+
return res
|
|
432
|
+
|
|
433
|
+
@classmethod
|
|
434
|
+
def format_steps_as_parameter(cls, steps, indent):
|
|
435
|
+
return "\n" + Tools.indent_string(indent, steps+'\n')
|
|
436
|
+
|
|
437
|
+
@classmethod
|
|
438
|
+
def register_type(cls, type_name, pattern, eval_func, **eval_func_kwargs):
|
|
439
|
+
# Register type in behave
|
|
440
|
+
def func(text):
|
|
441
|
+
return eval_func(text, **eval_func_kwargs)
|
|
442
|
+
func.pattern = pattern
|
|
443
|
+
|
|
444
|
+
# Add type in SRE class
|
|
445
|
+
setattr(SRE, type_name, pattern)
|
|
446
|
+
|
|
447
|
+
# Store type as registered
|
|
448
|
+
new_type = {'pattern':pattern, 'function':func}
|
|
449
|
+
if type_name in cls.__registered_types:
|
|
450
|
+
logger.warning(f"Overriding step parameter type '{type_name}': {cls.__registered_types[type_name]['pattern']} -> {new_type['pattern']}")
|
|
451
|
+
import traceback
|
|
452
|
+
logging.warning("".join(traceback.format_list(traceback.extract_stack())))
|
|
453
|
+
cls.__registered_types[type_name] = new_type
|
|
454
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
455
|
+
logger.trace(f"Registered step parameter type '{type_name}'")
|
|
456
|
+
|
|
457
|
+
@classmethod
|
|
458
|
+
def get_registered_type_names(cls):
|
|
459
|
+
return list(cls.__registered_types)
|
|
460
|
+
|
|
461
|
+
@classmethod
|
|
462
|
+
def get_registered_type_pattern(cls, type_name):
|
|
463
|
+
if type_name not in cls.__registered_types:
|
|
464
|
+
raise TechnicalException(f"Type '{type_name}' is not registered")
|
|
465
|
+
return cls.__registered_types[type_name]['pattern']
|
|
466
|
+
|
|
467
|
+
@classmethod
|
|
468
|
+
def get_registered_type_function(cls, type_name):
|
|
469
|
+
if type_name not in cls.__registered_types:
|
|
470
|
+
raise TechnicalException(f"Type '{type_name}' is not registered")
|
|
471
|
+
return cls.__registered_types[type_name]['function']
|
|
472
|
+
|
|
473
|
+
@classmethod
|
|
474
|
+
def register_default_types(cls):
|
|
475
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
476
|
+
logger.trace(f"Registering step parameter types...")
|
|
477
|
+
##### Old implementation:
|
|
478
|
+
# __step_regex = {
|
|
479
|
+
# 'variable name': r"[\w${}]+",
|
|
480
|
+
# 'variable expression': r"(?:(?! = | by )[^=])+",
|
|
481
|
+
# 'any parameter': r"(?:[^' ]+|.*)",
|
|
482
|
+
# 'float parameter': r"(?:[^' ]+|\d+(?:\.\d*)?)",
|
|
483
|
+
# 'int parameter': r"(?:[^' ]+|\d+)",
|
|
484
|
+
# 'str parameter': r"(?:[^' ]+|'[^']*'(?:%|#)?)",
|
|
485
|
+
# 'str parameter with quotes': r"(?:[^' ]+|'.*'(?:%|#)?)",
|
|
486
|
+
# }
|
|
487
|
+
|
|
488
|
+
regex_suffix = f"(?:{Config.DYNAMIC_SYMBOL}|{Config.THREAD_DYNAMIC_SYMBOL}|{Config.UNIQUE_SYMBOL})?"
|
|
489
|
+
regex_suffix_chars = f"{Config.DYNAMIC_SYMBOL}{Config.THREAD_DYNAMIC_SYMBOL}{Config.UNIQUE_SYMBOL}"
|
|
490
|
+
|
|
491
|
+
# Variable types
|
|
492
|
+
cls.register_type('VariableName',
|
|
493
|
+
r"[\w$\{{\}}]+{suffix}".format(suffix=regex_suffix),
|
|
494
|
+
StepTools.evaluate_variable_name)
|
|
495
|
+
# cls.register_type('VariableExpression', r"(?:(?! = | by )[^=])+", StepTools.evaluate_variable_name)
|
|
496
|
+
cls.register_type('VariableExpression',
|
|
497
|
+
r"[\w\-\+$\{{\}}\[\]\(\)\.:,'{suffix_chars}]+".format(suffix_chars=regex_suffix_chars),
|
|
498
|
+
StepTools.evaluate_variable_name)
|
|
499
|
+
cls.register_type('Variable',
|
|
500
|
+
cls.get_registered_type_pattern('VariableExpression'),
|
|
501
|
+
StepTools.evaluate_variable_name)
|
|
502
|
+
|
|
503
|
+
cls.register_type('Any',
|
|
504
|
+
r".*",
|
|
505
|
+
StepTools.evaluate_scenario_parameter)
|
|
506
|
+
cls.register_type('AnyLazy',
|
|
507
|
+
r".*?",
|
|
508
|
+
StepTools.evaluate_scenario_parameter)
|
|
509
|
+
cls.register_type('Float',
|
|
510
|
+
r"{Variable}|(?:-)?\d+(?:\.\d*)?".format(Variable=cls.get_registered_type_pattern('Variable')),
|
|
511
|
+
StepTools.evaluate_scenario_parameter)
|
|
512
|
+
cls.register_type('Int',
|
|
513
|
+
r"{Variable}|(?:-)?\d+".format(Variable=cls.get_registered_type_pattern('Variable')),
|
|
514
|
+
StepTools.evaluate_scenario_parameter)
|
|
515
|
+
cls.register_type('Boolean',
|
|
516
|
+
r"{Variable}|True|False".format(Variable=cls.get_registered_type_pattern('Variable')),
|
|
517
|
+
StepTools.evaluate_scenario_parameter)
|
|
518
|
+
|
|
519
|
+
# String types
|
|
520
|
+
cls.register_type('Bytes',
|
|
521
|
+
r"{Variable}|b'[^']*'".format(Variable=cls.get_registered_type_pattern('Variable')),
|
|
522
|
+
StepTools.evaluate_scenario_parameter)
|
|
523
|
+
cls.register_type('Str',
|
|
524
|
+
r"{Variable}|r?'[^']*'{suffix}".format(Variable=cls.get_registered_type_pattern('Variable'), suffix=regex_suffix),
|
|
525
|
+
StepTools.evaluate_scenario_parameter)
|
|
526
|
+
cls.register_type('RawStr',
|
|
527
|
+
r"{Variable}|'.*'{suffix}".format(Variable=cls.get_registered_type_pattern('Variable'), suffix=regex_suffix),
|
|
528
|
+
StepTools.evaluate_string_parameter)
|
|
529
|
+
cls.register_type('AnyStr',
|
|
530
|
+
r"{Variable}|'.*'{suffix}".format(Variable=cls.get_registered_type_pattern('Variable'), suffix=regex_suffix),
|
|
531
|
+
StepTools.evaluate_scenario_parameter)
|
|
532
|
+
cls.register_type('Code',
|
|
533
|
+
r"[^ ]+",
|
|
534
|
+
StepTools.evaluate_scenario_parameter)
|
|
535
|
+
|
|
536
|
+
# Generic types
|
|
537
|
+
cls.register_type('Enum',
|
|
538
|
+
r"{Variable}|\w+".format(Variable=cls.get_registered_type_pattern('Variable')),
|
|
539
|
+
StepTools.evaluate_scenario_parameter)
|
|
540
|
+
cls.register_type('Dict',
|
|
541
|
+
r"{Variable}|\{{.*\}}".format(Variable=cls.get_registered_type_pattern('Variable')),
|
|
542
|
+
StepTools.evaluate_scenario_parameter)
|
|
543
|
+
cls.register_type('List',
|
|
544
|
+
r"{Variable}|\[.*\]".format(Variable=cls.get_registered_type_pattern('Variable')),
|
|
545
|
+
StepTools.evaluate_list_scenario_parameter)
|
|
546
|
+
|
|
547
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
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.common.context.session_context import SessionContext
|
|
15
|
+
import logging
|
|
16
|
+
from holado_core.common.tables.table import Table
|
|
17
|
+
from holado_core.common.tools.tools import Tools
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TesterTools(object):
|
|
24
|
+
|
|
25
|
+
__logger_is_configured = False
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def __configure_logger(cls):
|
|
29
|
+
if not cls.__logger_is_configured:
|
|
30
|
+
if cls.__get_report_manager().has_report_path:
|
|
31
|
+
file_path = cls.__get_report_manager().get_path("logs", "tester.log")
|
|
32
|
+
SessionContext.instance().log_manager.add_file_handler(file_path, logger)
|
|
33
|
+
__logger_is_configured = True
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def __get_report_manager(cls):
|
|
37
|
+
return SessionContext.instance().report_manager
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def log(cls, msg, unlimited=False):
|
|
41
|
+
cls.__configure_logger()
|
|
42
|
+
|
|
43
|
+
if unlimited:
|
|
44
|
+
logger.print(msg, msg_size_limit=-1)
|
|
45
|
+
else:
|
|
46
|
+
# logger.info(msg)
|
|
47
|
+
logger.print(msg)
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def represent(cls, obj):
|
|
51
|
+
if isinstance(obj, Table):
|
|
52
|
+
res = obj.represent()
|
|
53
|
+
else:
|
|
54
|
+
# res = str(obj)
|
|
55
|
+
res = Tools.represent_object(obj)
|
|
56
|
+
return res
|
|
57
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
|
|
15
|
+
class TestConfig():
|
|
16
|
+
"""Config of holado_test"""
|
|
17
|
+
|
|
18
|
+
wait_on_step_failure_s = 0
|
|
19
|
+
# wait_on_step_failure_s = 600
|
|
20
|
+
|
|
21
|
+
# Profiling configuration
|
|
22
|
+
# Note: many profiling methods are implemented and can be activated on demand with following booleans
|
|
23
|
+
profile_memory_in_features = False
|
|
24
|
+
profile_memory_in_scenarios = False
|
|
25
|
+
|
|
26
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
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 .scenario.exception_steps import *
|
|
17
|
+
from .scenario.scenario_steps import *
|
|
18
|
+
from .scenario.tester_steps import *
|