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,478 @@
|
|
|
1
|
+
#################################################
|
|
2
|
+
# HolAdo (Holistic Automation do)
|
|
3
|
+
#
|
|
4
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
5
|
+
#
|
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of self 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:
|
|
7
|
+
#
|
|
8
|
+
# The above copyright notice and self permission notice shall be included in all copies or substantial portions of the Software.
|
|
9
|
+
#
|
|
10
|
+
# 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.
|
|
11
|
+
#################################################
|
|
12
|
+
|
|
13
|
+
from holado_core.common.finders.tools.find_context import FindContext,\
|
|
14
|
+
ContainerFindContext, ListContainersFindContext
|
|
15
|
+
from holado_core.common.finders.tools.find_parameters import FindParameters
|
|
16
|
+
import logging
|
|
17
|
+
from holado_core.common.tools.tools import Tools
|
|
18
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
19
|
+
from holado_core.common.handlers.element_holder import ElementHolder
|
|
20
|
+
from holado_core.common.finders.tools.find_builder import FindBuilder
|
|
21
|
+
from holado_core.common.finders.tools.find_updater import FindUpdater
|
|
22
|
+
from holado_core.common.finders.tools.enums import FindType
|
|
23
|
+
from holado_core.common.exceptions.element_exception import NoSuchElementException,\
|
|
24
|
+
TooManyElementsException
|
|
25
|
+
from holado_core.common.finders.tools.finder_info import FinderInfo
|
|
26
|
+
import abc
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Finder(object):
|
|
32
|
+
""" Generic finder class.
|
|
33
|
+
|
|
34
|
+
Any inheriting class should override the appropriate methods.
|
|
35
|
+
Usually, methods _find_all_in_XXX are overridden, except _find_all_in_candidates.
|
|
36
|
+
"""
|
|
37
|
+
__metaclass__ = abc.ABCMeta
|
|
38
|
+
|
|
39
|
+
def __init__(self, description=None):
|
|
40
|
+
"""
|
|
41
|
+
@param description Description.
|
|
42
|
+
"""
|
|
43
|
+
self.__description = description
|
|
44
|
+
self.__inspector = None
|
|
45
|
+
# self.__info = None
|
|
46
|
+
self.__find_builder = None
|
|
47
|
+
self.__find_updater = None
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def has_info(self):
|
|
51
|
+
"""
|
|
52
|
+
@return If has finder information
|
|
53
|
+
"""
|
|
54
|
+
return self.__info is not None
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def info(self):
|
|
58
|
+
"""
|
|
59
|
+
@return Finder information
|
|
60
|
+
"""
|
|
61
|
+
if self.__info == None:
|
|
62
|
+
self.__info = FinderInfo()
|
|
63
|
+
return self.__info
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def inspector(self):
|
|
67
|
+
return self.__inspector
|
|
68
|
+
|
|
69
|
+
@inspector.setter
|
|
70
|
+
def inspector(self, inspector):
|
|
71
|
+
"""
|
|
72
|
+
@param inspector Inspector that has created self finder
|
|
73
|
+
"""
|
|
74
|
+
self.__inspector = inspector
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def find_builder(self):
|
|
78
|
+
"""
|
|
79
|
+
Priors find builder from inspector
|
|
80
|
+
@return Find builder
|
|
81
|
+
"""
|
|
82
|
+
if self.__inspector != None:
|
|
83
|
+
return self.__inspector.find_builder
|
|
84
|
+
else:
|
|
85
|
+
if self.__find_builder == None:
|
|
86
|
+
self.__find_builder = FindBuilder()
|
|
87
|
+
return self.__find_builder
|
|
88
|
+
|
|
89
|
+
@find_builder.setter
|
|
90
|
+
def find_builder(self, find_builder):
|
|
91
|
+
"""
|
|
92
|
+
@param find_builder Find builder to use
|
|
93
|
+
"""
|
|
94
|
+
self.__find_builder = find_builder
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def has_find_updater(self):
|
|
98
|
+
"""
|
|
99
|
+
@return If has find updater
|
|
100
|
+
"""
|
|
101
|
+
return self.__find_updater is not None
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def find_updater(self):
|
|
105
|
+
"""
|
|
106
|
+
@return Find updater
|
|
107
|
+
"""
|
|
108
|
+
if self.__find_updater == None:
|
|
109
|
+
self.__find_updater = FindUpdater()
|
|
110
|
+
return self.__find_updater
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def find_type(self):
|
|
114
|
+
"""
|
|
115
|
+
@return Specific find method type.
|
|
116
|
+
"""
|
|
117
|
+
return self.find_updater.find_type
|
|
118
|
+
|
|
119
|
+
@find_type.setter
|
|
120
|
+
def find_type(self, find_type):
|
|
121
|
+
"""
|
|
122
|
+
Set a specific find method type.
|
|
123
|
+
@param find_type Find method type.
|
|
124
|
+
"""
|
|
125
|
+
self.find_updater.find_type = find_type
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def finder_description(self):
|
|
129
|
+
return f"{self.__class__.__name__}({self.element_description})"
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def element_description(self):
|
|
133
|
+
"""
|
|
134
|
+
@return Description of the element(s) to find.
|
|
135
|
+
"""
|
|
136
|
+
return self.__description
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def update_context(self, find_context):
|
|
140
|
+
"""
|
|
141
|
+
@param find_context Context
|
|
142
|
+
@param find_parameters Parameters
|
|
143
|
+
@return Updated context
|
|
144
|
+
"""
|
|
145
|
+
if self.has_find_updater:
|
|
146
|
+
return find_context.update(self.find_updater)
|
|
147
|
+
else:
|
|
148
|
+
return find_context
|
|
149
|
+
|
|
150
|
+
def update_parameters(self, find_parameters):
|
|
151
|
+
"""
|
|
152
|
+
@param find_parameters Parameters
|
|
153
|
+
@return Updated parameters
|
|
154
|
+
"""
|
|
155
|
+
if self.has_find_updater:
|
|
156
|
+
return find_parameters.update(self.find_updater)
|
|
157
|
+
else:
|
|
158
|
+
return find_parameters
|
|
159
|
+
|
|
160
|
+
def find_in(self, container=None, candidates=None, find_context=None, find_parameters=None):
|
|
161
|
+
"""
|
|
162
|
+
@param container Container from which make search.
|
|
163
|
+
@param candidates Candidate containers.
|
|
164
|
+
@param find_context Find context
|
|
165
|
+
@param find_parameters Find parameters
|
|
166
|
+
@return Elements found.
|
|
167
|
+
"""
|
|
168
|
+
return self.find(FindType.In, container, candidates, find_context, find_parameters)
|
|
169
|
+
|
|
170
|
+
def find(self, find_type=None, container=None, candidates=None, find_context=None, find_parameters=None):
|
|
171
|
+
"""
|
|
172
|
+
Find element.
|
|
173
|
+
@param find_type Find type
|
|
174
|
+
@param container Container from which make search.
|
|
175
|
+
@param candidates Candidate containers.
|
|
176
|
+
@param find_context Find context
|
|
177
|
+
@param find_parameters Find parameters
|
|
178
|
+
@return Element found.
|
|
179
|
+
"""
|
|
180
|
+
if find_type is None:
|
|
181
|
+
find_type = self.find_type
|
|
182
|
+
find_context = self.find_builder.context(find_context, find_type, container, candidates)
|
|
183
|
+
find_parameters = self.find_builder.parameters(find_parameters)
|
|
184
|
+
|
|
185
|
+
# Process finders
|
|
186
|
+
candidates = self._find_all(find_context=find_context, find_parameters=find_parameters)
|
|
187
|
+
|
|
188
|
+
# Get element from candidates
|
|
189
|
+
return self._get_element_from_list(candidates, find_parameters)
|
|
190
|
+
|
|
191
|
+
def find_all_in(self, container=None, candidates=None, find_context=None, find_parameters=None):
|
|
192
|
+
"""
|
|
193
|
+
@param container Container from which make search.
|
|
194
|
+
@param candidates Candidate containers.
|
|
195
|
+
@param find_context Find context
|
|
196
|
+
@param find_parameters Find parameters
|
|
197
|
+
@return Elements found.
|
|
198
|
+
"""
|
|
199
|
+
return self.find_all(FindType.In, container, candidates, find_context, find_parameters)
|
|
200
|
+
|
|
201
|
+
def find_all(self, find_type=None, container=None, candidates=None, find_context=None, find_parameters=None):
|
|
202
|
+
"""
|
|
203
|
+
Find all elements.
|
|
204
|
+
@param find_type Find type
|
|
205
|
+
@param container Container from which make search.
|
|
206
|
+
@param candidates Candidate containers.
|
|
207
|
+
@param find_context Find context
|
|
208
|
+
@param find_parameters Find parameters
|
|
209
|
+
@return Elements found.
|
|
210
|
+
"""
|
|
211
|
+
if find_type is None:
|
|
212
|
+
find_type = self.find_type
|
|
213
|
+
find_context = self.find_builder.context(find_context, find_type, container, candidates)
|
|
214
|
+
find_parameters = self.find_builder.parameters(find_parameters)
|
|
215
|
+
|
|
216
|
+
return self._find_all(find_context, find_parameters)
|
|
217
|
+
|
|
218
|
+
def _find_all(self, find_context:FindContext, find_parameters:FindParameters):
|
|
219
|
+
"""
|
|
220
|
+
Find all elements.
|
|
221
|
+
@param find_context Find context
|
|
222
|
+
@param find_parameters Find parameters
|
|
223
|
+
@return Elements found.
|
|
224
|
+
"""
|
|
225
|
+
if isinstance(find_context, ContainerFindContext):
|
|
226
|
+
return self._find_all_container(self.update_context(find_context), self.update_parameters(find_parameters))
|
|
227
|
+
elif isinstance(find_context, ListContainersFindContext):
|
|
228
|
+
return self._find_all_candidates(self.update_context(find_context), self.update_parameters(find_parameters))
|
|
229
|
+
else:
|
|
230
|
+
raise TechnicalException(f"[{self.finder_description}] Unmanaged find context '{find_context}'")
|
|
231
|
+
|
|
232
|
+
def _find_all_container(self, find_context:ContainerFindContext, find_parameters:FindParameters):
|
|
233
|
+
"""
|
|
234
|
+
Find all elements for given container.
|
|
235
|
+
@param find_context Find context
|
|
236
|
+
@param find_parameters Find parameters
|
|
237
|
+
@return Elements found.
|
|
238
|
+
"""
|
|
239
|
+
if self.find_type == FindType.Custom:
|
|
240
|
+
# Unexpected case, self method should be overridden
|
|
241
|
+
raise NotImplementedError(f"[{self.finder_description}] {self}")
|
|
242
|
+
|
|
243
|
+
if find_context.find_type == FindType.In:
|
|
244
|
+
return self._find_all_in_container(find_context, find_parameters)
|
|
245
|
+
else:
|
|
246
|
+
raise TechnicalException(f"[{self.finder_description}] Unmanaged find type '{find_context.find_type.name}'")
|
|
247
|
+
|
|
248
|
+
def _find_all_candidates(self, find_context:ListContainersFindContext, find_parameters:FindParameters):
|
|
249
|
+
"""
|
|
250
|
+
Find all elements for given candidates.
|
|
251
|
+
@param find_context Find context
|
|
252
|
+
@param find_parameters Find parameters
|
|
253
|
+
@return Elements found.
|
|
254
|
+
"""
|
|
255
|
+
if self.find_type == FindType.Custom:
|
|
256
|
+
# Default implementation is to iterate on containers
|
|
257
|
+
return self._find_all_by_iteration(find_context, find_parameters)
|
|
258
|
+
|
|
259
|
+
if find_context.find_type == FindType.In:
|
|
260
|
+
return self._find_all_in_candidates(find_context, find_parameters)
|
|
261
|
+
else:
|
|
262
|
+
raise TechnicalException(f"[{self.finder_description}] Unmanaged find type '{find_context.find_type.name}'")
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _find_all_by_iteration(self, find_context:ListContainersFindContext, find_parameters:FindParameters):
|
|
266
|
+
"""
|
|
267
|
+
Find all elements by iterating on each container.
|
|
268
|
+
@param find_context Find context
|
|
269
|
+
@param find_parameters Find parameters
|
|
270
|
+
@return Elements found.
|
|
271
|
+
"""
|
|
272
|
+
res = []
|
|
273
|
+
exc_intermediate = None
|
|
274
|
+
|
|
275
|
+
prefix_logs = f"{self._get_indent_string_level(find_parameters)}[Finder({self.element_description}).findAll{'' if self.find_type is None else self.find_type.name}]"
|
|
276
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
277
|
+
logger.trace(f"{prefix_logs} -> begin with {find_context.nb_containers} candidates")
|
|
278
|
+
|
|
279
|
+
# Iterate on each container context
|
|
280
|
+
for index, container_find_context in enumerate(find_context):
|
|
281
|
+
container_context = self.update_context(container_find_context)
|
|
282
|
+
|
|
283
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
284
|
+
|
|
285
|
+
logger.trace(f"{prefix_logs} -> candidate {index}: {container_context.input_description}")
|
|
286
|
+
|
|
287
|
+
try:
|
|
288
|
+
cand_res = self._find_all(container_context, find_parameters)
|
|
289
|
+
res.extend(cand_res)
|
|
290
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
291
|
+
logger.trace(f"{prefix_logs} -> candidate {index} => {len(cand_res)} elements found")
|
|
292
|
+
except NoSuchElementException as exc:
|
|
293
|
+
if exc_intermediate is None:
|
|
294
|
+
exc_intermediate = exc
|
|
295
|
+
|
|
296
|
+
if len(res) == 0 and exc_intermediate is not None:
|
|
297
|
+
raise exc_intermediate
|
|
298
|
+
|
|
299
|
+
if len(res) > 0:
|
|
300
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
301
|
+
logger.trace(f"{prefix_logs} -> return 0 candidate")
|
|
302
|
+
else:
|
|
303
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
304
|
+
logger.trace(f"{prefix_logs} -> return {len(res)} candidates:\n{self._represent_candidates_output(res, 4)}")
|
|
305
|
+
return res
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def _find_all_in_container(self, find_context:ContainerFindContext, find_parameters:FindParameters):
|
|
309
|
+
"""
|
|
310
|
+
Find all elements in given container.
|
|
311
|
+
@param find_context Find context
|
|
312
|
+
@param find_parameters Find parameters
|
|
313
|
+
@return Elements found.
|
|
314
|
+
"""
|
|
315
|
+
if find_context.find_type == FindType.In:
|
|
316
|
+
# Unexpected case, self method should be overridden
|
|
317
|
+
raise NotImplementedError(f"[{self.finder_description}] {self}")
|
|
318
|
+
else:
|
|
319
|
+
return self._find_all_container(find_context.with_find_type(FindType.In), find_parameters)
|
|
320
|
+
|
|
321
|
+
def _find_all_in_candidates(self, find_context:ListContainersFindContext, find_parameters:FindParameters):
|
|
322
|
+
"""
|
|
323
|
+
Find all elements in given candidates.
|
|
324
|
+
@param find_context Find context
|
|
325
|
+
@param find_parameters Find parameters
|
|
326
|
+
@return Elements found.
|
|
327
|
+
"""
|
|
328
|
+
if find_context.find_type == FindType.In:
|
|
329
|
+
# Default implementation is to iterate on containers
|
|
330
|
+
return self._find_all_by_iteration(find_context, find_parameters)
|
|
331
|
+
else:
|
|
332
|
+
return self._find_all_candidates(find_context.with_find_type(FindType.In), find_parameters)
|
|
333
|
+
|
|
334
|
+
def _get_element_from_list(self, candidates, find_parameters):
|
|
335
|
+
if find_parameters.nth_element is not None:
|
|
336
|
+
return self._get_nth_element_from_list(candidates, find_parameters)
|
|
337
|
+
|
|
338
|
+
res = None
|
|
339
|
+
|
|
340
|
+
# Analyze search result
|
|
341
|
+
if len(candidates) == 1:
|
|
342
|
+
res = candidates[0]
|
|
343
|
+
elif len(candidates) > 1:
|
|
344
|
+
raise TooManyElementsException(f"More than one ({len(candidates)}) {self.element_description} were found:\n{self.represent_candidate_output(candidates, 4)}")
|
|
345
|
+
elif find_parameters.raise_no_such_element:
|
|
346
|
+
raise NoSuchElementException(f"Unable to find {self.element_description}")
|
|
347
|
+
|
|
348
|
+
return res
|
|
349
|
+
|
|
350
|
+
def _get_nth_element_from_list(self, candidates, find_parameters):
|
|
351
|
+
res = None
|
|
352
|
+
|
|
353
|
+
if find_parameters.nth_element is not None and find_parameters.nth_element < 1:
|
|
354
|
+
raise TechnicalException(f"Nth ({find_parameters.nth_element}) must be positive (>= 1)")
|
|
355
|
+
|
|
356
|
+
# Analyze search result
|
|
357
|
+
if len(candidates) < 1:
|
|
358
|
+
if find_parameters.raise_no_such_element:
|
|
359
|
+
raise NoSuchElementException(f"Unable to find {self.element_description}: no candidates were found")
|
|
360
|
+
elif len(candidates) < find_parameters.nth_element:
|
|
361
|
+
msg = f"Unable to find {self.element_description}: Nth ({find_parameters.nth_element}) is greater than number of candidates ({len(candidates)})"
|
|
362
|
+
if find_parameters.raise_no_such_element:
|
|
363
|
+
raise NoSuchElementException(msg)
|
|
364
|
+
else:
|
|
365
|
+
logger.warning(self._get_indent_string_level(find_parameters) + msg)
|
|
366
|
+
else:
|
|
367
|
+
res = candidates[find_parameters.nth_element - 1]
|
|
368
|
+
|
|
369
|
+
return res
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def verify_find_type_is_defined(self, error_message):
|
|
373
|
+
"""
|
|
374
|
+
@param error_message Error message to raise is find type is not defined.
|
|
375
|
+
"""
|
|
376
|
+
if self.find_type == FindType.Undefined:
|
|
377
|
+
raise TechnicalException(f"[{self.element_description}] {error_message}")
|
|
378
|
+
|
|
379
|
+
def is_valid_input(self, container, find_context, find_parameters):
|
|
380
|
+
"""
|
|
381
|
+
@param container Container to validate
|
|
382
|
+
@param find_context Find context
|
|
383
|
+
@param find_parameters Find parameters
|
|
384
|
+
@return True if container is valid according this finder
|
|
385
|
+
"""
|
|
386
|
+
raise NotImplementedError(f"Unimplemented is_valid_input since inconsistent for [{self.finder_description}]")
|
|
387
|
+
|
|
388
|
+
def _is_valid_input_in(self, finders, container, find_context, find_parameters):
|
|
389
|
+
"""
|
|
390
|
+
Internal use, to check if container is valid in any finder of given list.
|
|
391
|
+
@param finders Finder list
|
|
392
|
+
@param container Container to validate
|
|
393
|
+
@param find_parameters Find parameters
|
|
394
|
+
@return True if container is valid for any finder
|
|
395
|
+
"""
|
|
396
|
+
for finder in finders:
|
|
397
|
+
try:
|
|
398
|
+
if finder is not None:
|
|
399
|
+
if finder.is_valid_input(container, find_context, find_parameters):
|
|
400
|
+
return True
|
|
401
|
+
except NotImplementedError:
|
|
402
|
+
# continue
|
|
403
|
+
pass
|
|
404
|
+
|
|
405
|
+
return False
|
|
406
|
+
|
|
407
|
+
def is_valid_output(self, element, find_context, find_parameters):
|
|
408
|
+
"""
|
|
409
|
+
Return if element is valid according this finder.
|
|
410
|
+
@param element Element to validate
|
|
411
|
+
@param find_context Find context
|
|
412
|
+
@param find_parameters Find parameters
|
|
413
|
+
@return True if element is valid according this finder
|
|
414
|
+
"""
|
|
415
|
+
raise NotImplementedError(f"Unimplemented is_valid_output since inconsistent for [{self.finder_description}]")
|
|
416
|
+
|
|
417
|
+
def _is_valid_output_in(self, finders, element, find_context, find_parameters):
|
|
418
|
+
"""
|
|
419
|
+
Internal use, to check if element is valid in any finder of given list.
|
|
420
|
+
@param finders Finder list
|
|
421
|
+
@param element Element to validate
|
|
422
|
+
@param find_parameters Find parameters
|
|
423
|
+
@return True if element is valid for any finder
|
|
424
|
+
"""
|
|
425
|
+
for finder in finders:
|
|
426
|
+
try:
|
|
427
|
+
if finder is not None:
|
|
428
|
+
if finder.is_valid_output(element, find_context, find_parameters):
|
|
429
|
+
return True
|
|
430
|
+
except NotImplementedError:
|
|
431
|
+
# continue
|
|
432
|
+
pass
|
|
433
|
+
|
|
434
|
+
return False
|
|
435
|
+
|
|
436
|
+
def _represent_candidates_output(self, candidates, indent):
|
|
437
|
+
res_list = []
|
|
438
|
+
for index, cand in candidates:
|
|
439
|
+
res_list.append(f"{index}: {self._represent_candidate_output(cand)}")
|
|
440
|
+
return Tools.indent_string(indent, "\n".join(res_list))
|
|
441
|
+
|
|
442
|
+
def _represent_candidate_output(self, candidate):
|
|
443
|
+
raise NotImplementedError(f"Missing implementation in {self}")
|
|
444
|
+
|
|
445
|
+
def _get_indent_string_level(self, find_parameters: FindParameters=None, level=None):
|
|
446
|
+
if level is not None:
|
|
447
|
+
return Tools.get_indent_string(level * 4)
|
|
448
|
+
elif find_parameters is not None:
|
|
449
|
+
return self._get_indent_string_level(level=find_parameters.find_level)
|
|
450
|
+
else:
|
|
451
|
+
raise TechnicalException("level or find_parameters must be defined")
|
|
452
|
+
|
|
453
|
+
def _add_candidates(self, res, candidates):
|
|
454
|
+
for candidate in candidates:
|
|
455
|
+
self._add_candidate(res, candidate)
|
|
456
|
+
|
|
457
|
+
def _add_candidate(self, res, candidate):
|
|
458
|
+
if not candidate in res:
|
|
459
|
+
res.append(candidate)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def _build_result(self, res, find_context, find_parameters):
|
|
463
|
+
# Manage generic finders that don't heritate from ElementFinder, like ElseFinder
|
|
464
|
+
if isinstance(res, ElementHolder):
|
|
465
|
+
self._build_result_element(res, find_context, find_parameters)
|
|
466
|
+
return res
|
|
467
|
+
|
|
468
|
+
def _build_result_element(self, res, find_context, find_parameters):
|
|
469
|
+
res.update_find_info(self, find_context, find_parameters)
|
|
470
|
+
return res
|
|
471
|
+
|
|
472
|
+
def _build_result_list(self, res, find_context, find_parameters):
|
|
473
|
+
for el in res:
|
|
474
|
+
self._build_result(el, find_context, find_parameters)
|
|
475
|
+
return res
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#################################################
|
|
2
|
+
# HolAdo (Holistic Automation do)
|
|
3
|
+
#
|
|
4
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
5
|
+
#
|
|
6
|
+
# 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:
|
|
7
|
+
#
|
|
8
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
9
|
+
#
|
|
10
|
+
# 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.
|
|
11
|
+
#################################################
|
|
12
|
+
|
|
13
|
+
from timeit import default_timer as timer
|
|
14
|
+
from holado_core.common.finders.finder import Finder
|
|
15
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
16
|
+
from holado_core.common.exceptions.element_exception import NoSuchElementException
|
|
17
|
+
from holado.holado_config import Config
|
|
18
|
+
import logging
|
|
19
|
+
from holado_core.common.tools.tools import Tools
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class OrFinder(Finder):
|
|
25
|
+
""" Finder that search using multiple finder.
|
|
26
|
+
All referenced finders are executed, and all results are merged.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, description=None):
|
|
30
|
+
super().__init__(description)
|
|
31
|
+
self.__finders = []
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def finders(self):
|
|
35
|
+
return self.__finders
|
|
36
|
+
|
|
37
|
+
def add_finder(self, finder):
|
|
38
|
+
"""
|
|
39
|
+
Append given finder in or succession.
|
|
40
|
+
@param finder A finder
|
|
41
|
+
"""
|
|
42
|
+
self.__finders.append(finder)
|
|
43
|
+
|
|
44
|
+
def add_finders(self, other_finder):
|
|
45
|
+
"""
|
|
46
|
+
@param other_finder Other OrFinder to merge with
|
|
47
|
+
"""
|
|
48
|
+
for finder in other_finder.finders:
|
|
49
|
+
self.add_finder(finder)
|
|
50
|
+
|
|
51
|
+
def _find_all(self, find_context, find_parameters):
|
|
52
|
+
context = self.update_context(find_context)
|
|
53
|
+
parameters = self.update_parameters(find_parameters)
|
|
54
|
+
|
|
55
|
+
res = []
|
|
56
|
+
exc_previous = None
|
|
57
|
+
sub_find_parameters = parameters.get_next_level()
|
|
58
|
+
|
|
59
|
+
# Prepare analyze time spent
|
|
60
|
+
if parameters.analyze_time_spent:
|
|
61
|
+
start = Tools.timer_s()
|
|
62
|
+
|
|
63
|
+
for index, finder in enumerate(self.__finders):
|
|
64
|
+
try:
|
|
65
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
66
|
+
logger.trace(f"{self._get_indent_string_level(parameters)}[OrFinder({self.element_description})[{index}]:{finder.element_description}] begin")
|
|
67
|
+
beg = Tools.timer_s()
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
self._add_candidates(res, finder.find_all(context, sub_find_parameters))
|
|
71
|
+
except NoSuchElementException as exc:
|
|
72
|
+
if exc_previous is None:
|
|
73
|
+
exc_previous = exc
|
|
74
|
+
|
|
75
|
+
end = Tools.timer_s()
|
|
76
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
77
|
+
logger.trace(f"{self._get_indent_string_level(parameters)}[OrFinder({self.element_description})[{index}]:{finder.element_description}] end ({end-beg} s)")
|
|
78
|
+
except TechnicalException as exc:
|
|
79
|
+
raise TechnicalException(f"[OrFinder({self.element_description})[{index}]:{finder.element_description}] {exc.message}") from exc
|
|
80
|
+
|
|
81
|
+
# Analyze time spent
|
|
82
|
+
if parameters.analyze_time_spent:
|
|
83
|
+
duration = Tools.timer_s() - start
|
|
84
|
+
if duration > Config.threshold_warn_time_spent_s:
|
|
85
|
+
logger.warning(f"OrFinder[{self.element_description}].findAll end (took {duration} s) -> {len(res)} elements")
|
|
86
|
+
|
|
87
|
+
if len(res) == 0 and exc_previous is not None:
|
|
88
|
+
Tools.raise_same_exception_type(exc_previous, f"Unable to find {self.element_description} in {find_context.get_find_type_container_description_prefix()}{find_context.get_input_complete_description_and_details()}")
|
|
89
|
+
return res
|
|
90
|
+
|
|
91
|
+
def is_valid_input(self, container, find_context, find_parameters):
|
|
92
|
+
return self._is_valid_input_in(self.__finders, container, find_context, find_parameters)
|
|
93
|
+
|
|
94
|
+
def is_valid_output(self, element, find_context, find_parameters):
|
|
95
|
+
return self._is_valid_output_in(self.__finders, element, find_context, find_parameters)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|