holado 0.2.2__py3-none-any.whl → 0.2.3__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.
Potentially problematic release.
This version of holado might be problematic. Click here for more details.
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/METADATA +13 -9
- holado-0.2.3.dist-info/RECORD +535 -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 +203 -0
- holado_ais/ais/ais_payload.py +35 -0
- holado_ais/ais/enums.py +37 -0
- holado_ais/ais/patch_pyais.py +1303 -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 +182 -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 +131 -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 +36 -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 +695 -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 +133 -0
- holado_core/common/resource/resource_manager.py +143 -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 +194 -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 +366 -0
- holado_core/common/tables/table_row.py +169 -0
- holado_core/common/tables/table_with_header.py +236 -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 +107 -0
- holado_core/common/tools/path_manager.py +185 -0
- holado_core/common/tools/string_tools.py +135 -0
- holado_core/common/tools/tools.py +172 -0
- holado_core/common/transport/__init__.py +0 -0
- holado_core/common/transport/crc.py +40 -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 +136 -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 +537 -0
- holado_core/tools/__init__.py +0 -0
- holado_core/tools/abstracts/__init__.py +0 -0
- holado_core/tools/abstracts/blocking_command_service.py +56 -0
- holado_core/tools/abstracts/service.py +48 -0
- holado_data/__init__.py +31 -0
- holado_data/data/generator/base.py +93 -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 +60 -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_client.py +206 -0
- holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
- holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
- holado_db/tools/db/db_manager.py +109 -0
- holado_db/tools/db/query/base/query_builder.py +87 -0
- holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
- holado_db/tools/db/query/query_manager.py +77 -0
- holado_docker/__init__.py +25 -0
- holado_docker/sdk/docker/docker_client.py +268 -0
- holado_docker/sdk/docker/docker_service.py +71 -0
- holado_docker/tests/behave/steps/__init__.py +16 -0
- holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
- holado_docker/tools/docker_controler/__init__.py +26 -0
- holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
- holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
- holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
- holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
- holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
- holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
- holado_grpc/__init__.py +32 -0
- holado_grpc/api/rpc/TODO.txt +4 -0
- holado_grpc/api/rpc/grpc_client.py +181 -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 +42 -0
- holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
- holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
- holado_helper/docker/run_terminal_in_docker.sh +101 -0
- holado_helper/holado_module_template/__init__.py +31 -0
- holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
- holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
- holado_helper/script/action.py +109 -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 +115 -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/ipc/json.py +125 -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 +120 -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 +59 -0
- holado_keycloak/tools/keycloak/__init__.py +0 -0
- holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
- holado_logging/__init__.py +36 -0
- holado_logging/common/logging/holado_logger.py +75 -0
- holado_logging/common/logging/log_config.py +128 -0
- holado_logging/common/logging/log_manager.py +292 -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 +135 -0
- holado_multitask/multiprocessing/process.py +196 -0
- holado_multitask/multiprocessing/processesmanager.py +133 -0
- holado_multitask/multitasking/multitask_manager.py +439 -0
- holado_multitask/multithreading/__init__.py +0 -0
- holado_multitask/multithreading/context/thread_context.py +84 -0
- holado_multitask/multithreading/functionthreaded.py +129 -0
- holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
- holado_multitask/multithreading/loopthread.py +100 -0
- holado_multitask/multithreading/periodicfunctionthreaded.py +136 -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 +177 -0
- holado_multitask/multithreading/threadsmanager.py +162 -0
- holado_multitask/multithreading/timer.py +48 -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 +965 -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 +35 -0
- holado_python/common/enums.py +34 -0
- holado_python/common/iterables.py +30 -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 +279 -0
- holado_python/standard_library/csv.py +207 -0
- holado_python/standard_library/hashlib.py +82 -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 +136 -0
- holado_python/standard_library/socket/echo_server.py +28 -0
- holado_python/standard_library/socket/message_socket.py +91 -0
- holado_python/standard_library/socket/non_blocking_socket.py +151 -0
- holado_python/standard_library/socket/socket.py +148 -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 +81 -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 +258 -0
- holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -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 +537 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +675 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -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 +27 -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_failed_report_builder.py +146 -0
- holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
- holado_report/report/builders/report_builder.py +64 -0
- holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
- holado_report/report/builders/summary_report_builder.py +89 -0
- holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
- holado_report/report/builders/summary_scenario_report_builder.py +74 -0
- holado_report/report/execution_historic.py +141 -0
- holado_report/report/report_manager.py +256 -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 +24 -0
- holado_rest/api/rest/TODO.txt +2 -0
- holado_rest/api/rest/rest_client.py +113 -0
- holado_rest/api/rest/rest_manager.py +62 -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 +141 -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 +70 -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 +53 -0
- holado_scripting/common/tools/dynamic_text_manager.py +73 -0
- holado_scripting/common/tools/evaluate_parameters.py +210 -0
- holado_scripting/common/tools/expression_evaluator.py +387 -0
- holado_scripting/common/tools/variable_manager.py +321 -0
- holado_scripting/tests/behave/steps/__init__.py +22 -0
- holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -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_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/text_interpreter.py +216 -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 +32 -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 +216 -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 +76 -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 +215 -0
- holado_system/tests/behave/steps/system/system_steps.py +84 -0
- holado_test/__init__.py +27 -0
- holado_test/behave/__init__.py +0 -0
- holado_test/behave/behave.py +397 -0
- holado_test/behave/behave_environment.py +143 -0
- holado_test/behave/behave_function.py +33 -0
- holado_test/behave/behave_manager.py +555 -0
- holado_test/behave/independant_runner.py +68 -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 +79 -0
- holado_test/common/context/scenario_context.py +217 -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 +523 -0
- holado_test/scenario/tester_tools.py +52 -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 +87 -0
- holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
- holado_value/__init__.py +24 -0
- holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -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 +217 -0
- holado_value/common/tables/value_table.py +29 -0
- holado_value/common/tables/value_table_cell.py +67 -0
- holado_value/common/tables/value_table_manager.py +58 -0
- holado_value/common/tables/value_table_row.py +44 -0
- holado_value/common/tables/value_table_with_header.py +28 -0
- holado_value/common/tools/unique_value_manager.py +108 -0
- holado_value/common/tools/value.py +164 -0
- holado_value/common/tools/value_types.py +35 -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_yaml/__init__.py +31 -0
- holado_yaml/tests/behave/steps/__init__.py +16 -0
- holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
- holado_yaml/yaml/yaml_manager.py +86 -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 +42 -0
- test_holado/features/NonReg/api/REST.feature +21 -0
- test_holado/features/NonReg/api/gRPC.feature +122 -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 +239 -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_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.feature +101 -0
- test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -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 +218 -0
- test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
- test_holado/features/NonReg/ipc/bit_series.feature +131 -0
- test_holado/features/NonReg/ipc/json.feature +20 -0
- test_holado/features/NonReg/scenario/scenario.feature +139 -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/__init__.py +0 -0
- test_holado/logging.conf +41 -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/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 +27 -0
- test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -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
- holado-0.2.2.dist-info/RECORD +0 -17
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/WHEEL +0 -0
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
from builtins import object
|
|
15
|
+
import logging
|
|
16
|
+
from holado_value.common.tools.value_types import ValueTypes
|
|
17
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
18
|
+
import re
|
|
19
|
+
import importlib
|
|
20
|
+
from holado_core.common.tools.converters.converter import Converter
|
|
21
|
+
import types
|
|
22
|
+
from holado_core.common.tools.tools import Tools
|
|
23
|
+
from holado_multitask.multithreading.reflection import traceback
|
|
24
|
+
from holado_scripting.common.tools.evaluate_parameters import EvaluateParameters
|
|
25
|
+
from holado.holado_config import Config
|
|
26
|
+
from holado_multitask.multitasking.multitask_manager import MultitaskManager
|
|
27
|
+
from holado_python.standard_library.typing import Typing
|
|
28
|
+
from holado.common.handlers.undefined import undefined_value
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ExpressionEvaluator(object):
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
self.__dynamic_text_manager = None
|
|
37
|
+
self.__text_interpreter = None
|
|
38
|
+
self.__unique_value_manager = None
|
|
39
|
+
self.__variable_manager = None
|
|
40
|
+
|
|
41
|
+
# self.__modules_already_imported = []
|
|
42
|
+
|
|
43
|
+
def initialize(self, dynamic_text_manager, unique_value_manager, text_interpreter, variable_manager):
|
|
44
|
+
self.__dynamic_text_manager = dynamic_text_manager
|
|
45
|
+
self.__text_interpreter = text_interpreter
|
|
46
|
+
self.__unique_value_manager = unique_value_manager
|
|
47
|
+
self.__variable_manager = variable_manager
|
|
48
|
+
|
|
49
|
+
def evaluate_expression(self, expression, unescape_string_method=None, eval_params=EvaluateParameters.default(), log_level=logging.DEBUG):
|
|
50
|
+
value_type, value, value_to_eval = self.extract_expression_information(expression, unescape_string_method)
|
|
51
|
+
if value_to_eval is not undefined_value:
|
|
52
|
+
res = self.evaluate_expression_of_information(value_type, value_to_eval, eval_params=eval_params)
|
|
53
|
+
else:
|
|
54
|
+
res = value
|
|
55
|
+
if Tools.do_log(logger, log_level):
|
|
56
|
+
logger.log(log_level, f"Evaluate expression [{expression}] => ({value_type}, {value}, '{value_to_eval}') => [{res}] (type: {Typing.get_object_class_fullname(res)}) (with evaluate parameters: {eval_params})")
|
|
57
|
+
return res
|
|
58
|
+
|
|
59
|
+
def evaluate_python_expression(self, expression, eval_params=EvaluateParameters.default(), log_level=logging.DEBUG):
|
|
60
|
+
res = self.evaluate_expression_of_information(ValueTypes.Symbol, expression, eval_params=eval_params)
|
|
61
|
+
if Tools.do_log(logger, log_level):
|
|
62
|
+
logger.log(log_level, f"Evaluate python expression [{expression}] => [{res}] (type: {Typing.get_object_class_fullname(res)}) (with evaluate parameters: {eval_params})")
|
|
63
|
+
return res
|
|
64
|
+
|
|
65
|
+
def extract_expression_information(self, expression, unescape_string_method=None, log_level=logging.TRACE): # @UndefinedVariable
|
|
66
|
+
res = self.__extract_expression_information(expression, unescape_string_method=unescape_string_method)
|
|
67
|
+
if Tools.do_log(logger, log_level):
|
|
68
|
+
logger.log(log_level, f"Extract expression information [{expression}] => {res}")
|
|
69
|
+
return res
|
|
70
|
+
|
|
71
|
+
def __extract_expression_information(self, expression, unescape_string_method=None):
|
|
72
|
+
if isinstance(expression, str):
|
|
73
|
+
return self.__extract_expression_information_str(expression, unescape_string_method = unescape_string_method)
|
|
74
|
+
else:
|
|
75
|
+
return self.__extract_value_information(expression)
|
|
76
|
+
|
|
77
|
+
def __extract_expression_information_str(self, expression, unescape_string_method=None):
|
|
78
|
+
if unescape_string_method is None:
|
|
79
|
+
from holado_test.scenario.step_tools import StepTools
|
|
80
|
+
unescape_string_method = StepTools.unescape_string
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
expr_content = expression.strip()
|
|
84
|
+
|
|
85
|
+
# Manage usual types
|
|
86
|
+
if expr_content == Config.NONE_SYMBOL:
|
|
87
|
+
return (ValueTypes.Null, None, undefined_value)
|
|
88
|
+
elif expr_content == Config.NOT_APPLICABLE_SYMBOL:
|
|
89
|
+
return (ValueTypes.NotApplicable, undefined_value, undefined_value)
|
|
90
|
+
elif Converter.is_boolean(expr_content):
|
|
91
|
+
return (ValueTypes.Boolean, Converter.to_boolean(expr_content), undefined_value)
|
|
92
|
+
elif Converter.is_integer(expr_content):
|
|
93
|
+
return (ValueTypes.Integer, int(expr_content), undefined_value)
|
|
94
|
+
elif Converter.is_float(expr_content):
|
|
95
|
+
return (ValueTypes.Float, float(expr_content), undefined_value)
|
|
96
|
+
|
|
97
|
+
# Manage strings
|
|
98
|
+
for end_sym, val_type in [(Config.DYNAMIC_SYMBOL, ValueTypes.DynamicString),
|
|
99
|
+
(Config.THREAD_DYNAMIC_SYMBOL, ValueTypes.ThreadDynamicString),
|
|
100
|
+
(Config.UNIQUE_SYMBOL, ValueTypes.UniqueString),
|
|
101
|
+
("", ValueTypes.String)]:
|
|
102
|
+
if expr_content.startswith("'") and expr_content.endswith("'" + end_sym):
|
|
103
|
+
text = expr_content[1:-1-len(end_sym)]
|
|
104
|
+
if unescape_string_method is not None:
|
|
105
|
+
text = unescape_string_method(text)
|
|
106
|
+
return (val_type, undefined_value, text)
|
|
107
|
+
|
|
108
|
+
# # Manage evaluated values
|
|
109
|
+
# try:
|
|
110
|
+
# value_evaluated = eval(expr_content)
|
|
111
|
+
# evaluated = True
|
|
112
|
+
# except (SyntaxError, NameError, ValueError):
|
|
113
|
+
# evaluated = False
|
|
114
|
+
# if evaluated:
|
|
115
|
+
# if isinstance(value_evaluated, bool):
|
|
116
|
+
# value_type = ValueTypes.Boolean
|
|
117
|
+
# elif isinstance(value_evaluated, int):
|
|
118
|
+
# value_type = ValueTypes.Integer
|
|
119
|
+
# elif isinstance(value_evaluated, float):
|
|
120
|
+
# value_type = ValueTypes.Float
|
|
121
|
+
# elif isinstance(value_evaluated, str):
|
|
122
|
+
# value_type = ValueTypes.String
|
|
123
|
+
# else:
|
|
124
|
+
# value_type = ValueTypes.Generic
|
|
125
|
+
# return (value_type, value_evaluated)
|
|
126
|
+
|
|
127
|
+
# Else consider content as a symbol
|
|
128
|
+
return (ValueTypes.Symbol, undefined_value, expr_content)
|
|
129
|
+
except Exception as exc:
|
|
130
|
+
raise TechnicalException(f"Error while extracting expression information in expression [{expression}] (type: {Typing.get_object_class_fullname(expression)})") from exc
|
|
131
|
+
|
|
132
|
+
def extract_value_information(self, value):
|
|
133
|
+
return self.__extract_value_information(value)
|
|
134
|
+
|
|
135
|
+
def __extract_value_information(self, value):
|
|
136
|
+
if value is undefined_value:
|
|
137
|
+
return (ValueTypes.Undefined, undefined_value, undefined_value)
|
|
138
|
+
elif value is None:
|
|
139
|
+
return (ValueTypes.Null, None, undefined_value)
|
|
140
|
+
elif isinstance(value, bool):
|
|
141
|
+
return (ValueTypes.Boolean, value, undefined_value)
|
|
142
|
+
elif isinstance(value, int):
|
|
143
|
+
return (ValueTypes.Integer, value, undefined_value)
|
|
144
|
+
elif isinstance(value, float):
|
|
145
|
+
return (ValueTypes.Float, value, undefined_value)
|
|
146
|
+
elif isinstance(value, str):
|
|
147
|
+
return (ValueTypes.String, value, undefined_value)
|
|
148
|
+
else:
|
|
149
|
+
return (ValueTypes.Generic, value, undefined_value)
|
|
150
|
+
|
|
151
|
+
def evaluate_expression_of_information(self, value_type, value, eval_params=EvaluateParameters.default()):
|
|
152
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
153
|
+
logger.trace(f"Evaluating expression of information ({value_type.name}, {value}, {eval_params})")
|
|
154
|
+
res = self.__evaluate_expression_of_information(value_type, value, eval_params=eval_params)
|
|
155
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
156
|
+
logger.trace(f"Evaluate expression of information ({value_type.name}, {value}) => [{res}] (type: {Typing.get_object_class_fullname(res)}) (with evaluate parameters: {eval_params})")
|
|
157
|
+
return res
|
|
158
|
+
|
|
159
|
+
def __evaluate_expression_of_information(self, value_type, value, eval_params=EvaluateParameters.default()):
|
|
160
|
+
if value_type in [ValueTypes.Null]:
|
|
161
|
+
return None
|
|
162
|
+
elif value_type in [ValueTypes.Boolean, ValueTypes.Integer, ValueTypes.Float, ValueTypes.Generic]:
|
|
163
|
+
return value
|
|
164
|
+
elif value_type in [ValueTypes.String, ValueTypes.DynamicString, ValueTypes.ThreadDynamicString, ValueTypes.UniqueString]:
|
|
165
|
+
return self.__evaluate_expression_of_information_string(value_type, value, eval_params=eval_params)
|
|
166
|
+
elif value_type in [ValueTypes.Symbol]:
|
|
167
|
+
return self.__evaluate_expression_of_information_symbol(value, eval_params=eval_params)
|
|
168
|
+
else:
|
|
169
|
+
return value
|
|
170
|
+
|
|
171
|
+
def __evaluate_expression_of_information_string(self, value_type, value, eval_params=EvaluateParameters.default_without_raise()):
|
|
172
|
+
if eval_params.do_interpret:
|
|
173
|
+
res = self.__text_interpreter.interpret(value, eval_params=eval_params)
|
|
174
|
+
else:
|
|
175
|
+
res = value
|
|
176
|
+
|
|
177
|
+
if isinstance(res, bytes):
|
|
178
|
+
res = res.decode('utf-8')
|
|
179
|
+
elif not isinstance(res, str):
|
|
180
|
+
res = str(res)
|
|
181
|
+
|
|
182
|
+
if value_type == ValueTypes.DynamicString:
|
|
183
|
+
return self.__dynamic_text_manager.get(res)
|
|
184
|
+
elif value_type == ValueTypes.ThreadDynamicString:
|
|
185
|
+
return self.__dynamic_text_manager.get(res, scope=MultitaskManager.get_thread_id())
|
|
186
|
+
elif value_type == ValueTypes.UniqueString:
|
|
187
|
+
return res + self.__unique_value_manager.new_string(padding_length=Config.unique_string_padding_length)
|
|
188
|
+
else:
|
|
189
|
+
return res
|
|
190
|
+
|
|
191
|
+
def __evaluate_expression_of_information_symbol(self, value, eval_params=EvaluateParameters.default()):
|
|
192
|
+
if logger.isEnabledFor(logging.TRACE): # @UndefinedVariable
|
|
193
|
+
logger.trace(f"Evaluating symbol ([{value}], {eval_params})")
|
|
194
|
+
res = value
|
|
195
|
+
|
|
196
|
+
# Replace explicit interpret parts
|
|
197
|
+
if eval_params.do_interpret and isinstance(res, str):
|
|
198
|
+
res, _, is_evaluated = self.__evaluate_interpret_expression(res, eval_params=eval_params)
|
|
199
|
+
if is_evaluated:
|
|
200
|
+
# If symbol is already evaluated, stop evaluation process
|
|
201
|
+
if logger.isEnabledFor(logging.TRACE): # @UndefinedVariable
|
|
202
|
+
logger.trace(f"Evaluate symbol [{value}] => [{res}] (type: {Typing.get_object_class_fullname(res)}) (after interpret, with evaluate parameters: {eval_params})")
|
|
203
|
+
return res
|
|
204
|
+
# if logger.isEnabledFor(logging.TRACE): # @UndefinedVariable
|
|
205
|
+
# logger.trace(f"Evaluate symbol [{value}] - after interpret: [{res}] (type: {Typing.get_object_class_fullname(res)}) (with evaluate parameters: {eval_params})")
|
|
206
|
+
|
|
207
|
+
# Evaluate variable expression
|
|
208
|
+
# Note: if an eval must be done after interpret, variable shouldn't be evaluated unless it can makes failing eval
|
|
209
|
+
if eval_params.do_eval_variable and isinstance(res, str) and len(res) > 0:
|
|
210
|
+
result, is_evaluated = self.__evaluate_variable_expression(res, eval_params=eval_params)
|
|
211
|
+
if is_evaluated:
|
|
212
|
+
# If symbol is a variable expression, don't evaluate the result of the variable
|
|
213
|
+
if logger.isEnabledFor(logging.TRACE): # @UndefinedVariable
|
|
214
|
+
logger.trace(f"Evaluate symbol [{value}] => [{result}] (type: {Typing.get_object_class_fullname(result)}) (after variable evaluation, with evaluate parameters: {eval_params})")
|
|
215
|
+
return result
|
|
216
|
+
|
|
217
|
+
# Evaluate expression
|
|
218
|
+
# if eval_params.do_eval and (isinstance(res, str) or isinstance(res, bytes)): # Commented as it doesn't work currently with bytes
|
|
219
|
+
if eval_params.do_eval and isinstance(res, str):
|
|
220
|
+
res = self.__evaluate_expression(res, locals_={}, eval_params=eval_params)
|
|
221
|
+
|
|
222
|
+
# logger.debug(f"Evaluate symbol [{value}] => [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
223
|
+
if logger.isEnabledFor(logging.TRACE): # @UndefinedVariable
|
|
224
|
+
logger.trace(f"Evaluate symbol [{value}] => [{res}] (type: {Typing.get_object_class_fullname(res)}) (after full evaluation, with evaluate parameters: {eval_params})")
|
|
225
|
+
return res
|
|
226
|
+
|
|
227
|
+
def __evaluate_interpret_expression(self, value, eval_params=EvaluateParameters.default()):
|
|
228
|
+
result, is_interpreted, is_evaluated = value, False, False
|
|
229
|
+
|
|
230
|
+
nb_sections = self.__text_interpreter.get_number_of_sections(value)
|
|
231
|
+
if nb_sections > 0:
|
|
232
|
+
# If eval is authorized, and many sections exists, prefer interpret sections and eval result
|
|
233
|
+
if eval_params.do_eval and nb_sections > 1:
|
|
234
|
+
result, locals_ = self.__text_interpreter._interpret_sections(value, eval_params=eval_params)
|
|
235
|
+
if result != value:
|
|
236
|
+
result = self.__evaluate_expression(result, locals_, eval_params=eval_params)
|
|
237
|
+
is_evaluated = True
|
|
238
|
+
else:
|
|
239
|
+
result = self.__text_interpreter.interpret(value, eval_params=eval_params)
|
|
240
|
+
is_interpreted = result != value
|
|
241
|
+
|
|
242
|
+
# Manage recursive interpret, only in case of first interpret and if it wasn't evaluated
|
|
243
|
+
if eval_params.do_interpret_recursively and is_interpreted and not is_evaluated and isinstance(result, str):
|
|
244
|
+
new_result, new_is_interpreted, new_is_evaluated = self.__evaluate_interpret_expression(result, eval_params.with_raise_on_interpret_error(False))
|
|
245
|
+
if new_is_interpreted:
|
|
246
|
+
result = new_result
|
|
247
|
+
is_evaluated = new_is_evaluated
|
|
248
|
+
|
|
249
|
+
return result, is_interpreted, is_evaluated
|
|
250
|
+
|
|
251
|
+
def __evaluate_variable_expression(self, value, eval_params=EvaluateParameters.default()):
|
|
252
|
+
is_evaluated, result = False, None
|
|
253
|
+
|
|
254
|
+
if self.__variable_manager.exists_variable(value):
|
|
255
|
+
result = self.__variable_manager.get_variable_value(value)
|
|
256
|
+
is_evaluated = True
|
|
257
|
+
elif self.__variable_manager.is_variable_expression(value):
|
|
258
|
+
try:
|
|
259
|
+
result = self.__variable_manager.eval_variable_expression(value)
|
|
260
|
+
except Exception as exc:
|
|
261
|
+
if eval_params.raise_on_variable_eval_error:
|
|
262
|
+
raise exc
|
|
263
|
+
else:
|
|
264
|
+
# logger.error(f"Error while evaluating variable expression [{value}]: {exc}")
|
|
265
|
+
logger.error(f"Error while evaluating variable expression [{value}]: {Tools.represent_exception(exc)}\n -> traceback:\n{traceback.represent_stack(indent=4)}")
|
|
266
|
+
else:
|
|
267
|
+
is_evaluated = True
|
|
268
|
+
|
|
269
|
+
# Manage recursive evaluation, only in case of first variable evaluation
|
|
270
|
+
if eval_params.do_eval_variable_recursively and is_evaluated and isinstance(result, str) and result != value:
|
|
271
|
+
new_result, new_is_evaluated = self.__evaluate_variable_expression(result, eval_params.with_raise_on_variable_eval_error(False))
|
|
272
|
+
if new_is_evaluated:
|
|
273
|
+
result = new_result
|
|
274
|
+
|
|
275
|
+
return result, is_evaluated
|
|
276
|
+
|
|
277
|
+
def __evaluate_expression(self, value, locals_, eval_params=EvaluateParameters.default()):
|
|
278
|
+
res = value
|
|
279
|
+
while True:
|
|
280
|
+
try:
|
|
281
|
+
result = None
|
|
282
|
+
if isinstance(value, str):
|
|
283
|
+
# Try first by replacing double semicolon
|
|
284
|
+
try:
|
|
285
|
+
txt_to_eval = value.replace("{{", "{").replace("}}", "}")
|
|
286
|
+
result = eval(txt_to_eval, globals(), locals_)
|
|
287
|
+
except SyntaxError as exc:
|
|
288
|
+
# Retry without replacing double semicolon
|
|
289
|
+
pass
|
|
290
|
+
|
|
291
|
+
if result is None:
|
|
292
|
+
result = eval(value, globals(), locals_)
|
|
293
|
+
except NameError as exc:
|
|
294
|
+
# logger.trace(f"Error while expression evaluation:\n exception: {Tools.represent_exception(exc)}\n globals: {globals()}\n locals: {locals_}")
|
|
295
|
+
# In case the name concerns a library, try to import the library
|
|
296
|
+
m = re.match(r"name '(.*)' is not defined", str(exc))
|
|
297
|
+
is_imported = False
|
|
298
|
+
if m:
|
|
299
|
+
module_name = m.group(1)
|
|
300
|
+
is_imported = self.__import_module(module_name, locals_)
|
|
301
|
+
|
|
302
|
+
# If no import is done
|
|
303
|
+
if not is_imported:
|
|
304
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
305
|
+
logger.debug(f"Error while evaluating expression [{value}]: {exc}")
|
|
306
|
+
break
|
|
307
|
+
except Exception as exc:
|
|
308
|
+
if eval_params.raise_on_eval_error:
|
|
309
|
+
raise exc
|
|
310
|
+
else:
|
|
311
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
312
|
+
logger.trace(f"Error while evaluating expression [{value}]: {Tools.represent_exception(exc)}")
|
|
313
|
+
elif Tools.do_log(logger, logging.DEBUG):
|
|
314
|
+
if isinstance(exc, SyntaxError):
|
|
315
|
+
logger.debug(f"Error while evaluating expression [{value}]: {repr(exc)}")
|
|
316
|
+
else:
|
|
317
|
+
logger.debug(f"Error while evaluating expression [{value}]: [{Typing.get_object_class_fullname(exc)}] {exc}")
|
|
318
|
+
break
|
|
319
|
+
else:
|
|
320
|
+
if not isinstance(result, types.ModuleType):
|
|
321
|
+
res = result
|
|
322
|
+
break
|
|
323
|
+
|
|
324
|
+
# logger.debug(f"Evaluate [{value}] => [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
325
|
+
return res
|
|
326
|
+
|
|
327
|
+
# def __import_module(self, module_name, locals_):
|
|
328
|
+
# res = False
|
|
329
|
+
#
|
|
330
|
+
# if module_name in locals_:
|
|
331
|
+
# raise TechnicalException(f"Module '{module_name}' is already imported (locals_: {locals_})")
|
|
332
|
+
#
|
|
333
|
+
# if module_name not in self.__modules_already_imported:
|
|
334
|
+
# if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
335
|
+
# logger.trace(f"Importing module '{module_name}'")
|
|
336
|
+
# try:
|
|
337
|
+
# module = importlib.import_module(module_name)
|
|
338
|
+
# locals_[module_name] = module
|
|
339
|
+
# except Exception as exc2:
|
|
340
|
+
# if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
341
|
+
# logger.trace(f"Failed to import module '{module_name}': {exc2}")
|
|
342
|
+
# else:
|
|
343
|
+
# if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
344
|
+
# logger.trace(f"Imported module '{module_name}' for expression evaluation")
|
|
345
|
+
# res = True
|
|
346
|
+
# finally:
|
|
347
|
+
# self.__modules_already_imported.append(module_name)
|
|
348
|
+
# else:
|
|
349
|
+
# if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
350
|
+
# logger.trace(f"Skip import of module '{module_name}' since it was already imported")
|
|
351
|
+
#
|
|
352
|
+
# return res
|
|
353
|
+
def __import_module(self, module_name, locals_):
|
|
354
|
+
res = False
|
|
355
|
+
|
|
356
|
+
if module_name in locals_:
|
|
357
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
358
|
+
logger.trace(f"Skip import of module '{module_name}' since it was already imported")
|
|
359
|
+
else:
|
|
360
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
361
|
+
logger.trace(f"Importing module '{module_name}'")
|
|
362
|
+
try:
|
|
363
|
+
module = importlib.import_module(module_name)
|
|
364
|
+
locals_[module_name] = module
|
|
365
|
+
except Exception as exc2:
|
|
366
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
367
|
+
logger.trace(f"Failed to import module '{module_name}': {exc2}")
|
|
368
|
+
else:
|
|
369
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
370
|
+
logger.trace(f"Imported module '{module_name}' for expression evaluation")
|
|
371
|
+
res = True
|
|
372
|
+
|
|
373
|
+
return res
|
|
374
|
+
|
|
375
|
+
def extract_string_value(self, expression, unescape_string_method=None, log_level=logging.DEBUG):
|
|
376
|
+
value_type, value_str, value_to_eval = self.extract_expression_information(expression, unescape_string_method)
|
|
377
|
+
if value_type in [ValueTypes.String, ValueTypes.DynamicString, ValueTypes.ThreadDynamicString, ValueTypes.UniqueString]:
|
|
378
|
+
if value_to_eval is not undefined_value:
|
|
379
|
+
res = value_to_eval
|
|
380
|
+
else:
|
|
381
|
+
res = value_str
|
|
382
|
+
else:
|
|
383
|
+
res = expression
|
|
384
|
+
if Tools.do_log(logger, log_level):
|
|
385
|
+
logger.debug(f"Extract string value [{expression}] => ({value_type}, '{value_str}') => [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
386
|
+
return res
|
|
387
|
+
|