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,477 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
# This file is a helper to build scripts using HolAdo solution, with CSV files as input.
|
|
16
|
+
# Usually, it is copied and adapted for specific usage.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
import logging
|
|
20
|
+
import copy
|
|
21
|
+
from holado_helper.script.input_output_script import InputOutputScript
|
|
22
|
+
from holado_core.common.exceptions.verify_exception import VerifyException
|
|
23
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
24
|
+
from holado_python.standard_library.typing import Typing
|
|
25
|
+
from holado_helper.script.action import ActionInfo
|
|
26
|
+
from holado_core.common.actors.actor import Actor
|
|
27
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
28
|
+
from holado_python.common.tools.datetime import DateTime
|
|
29
|
+
from holado.common.handlers.object import Object
|
|
30
|
+
from holado.common.handlers.undefined import undefined_argument
|
|
31
|
+
from holado_helper.script.job import Job
|
|
32
|
+
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ActionScriptFile():
|
|
37
|
+
def __init__(self, file_ext):
|
|
38
|
+
super().__init__()
|
|
39
|
+
self.__file_ext = file_ext
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def file_extension(self):
|
|
43
|
+
return self.__file_ext
|
|
44
|
+
|
|
45
|
+
def read_jobs(self, file_path, action_script):
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
def write_jobs(self, file_path, jobs, action_script):
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class ActionRegistry(Object):
|
|
54
|
+
def __init__(self, name):
|
|
55
|
+
super().__init__(name)
|
|
56
|
+
|
|
57
|
+
self.__actions = {}
|
|
58
|
+
|
|
59
|
+
def register_action(self, action, parameters_default_values=None, parameters_replacements=None, static_parameters_values=None, **kwargs):
|
|
60
|
+
""" Register new action
|
|
61
|
+
@param action: Action name
|
|
62
|
+
@param parameters_default_values: define parameters default values (format: list of 2-uplets (parameter name, default value))
|
|
63
|
+
@param parameters_replacements: define values automatic replacements (format: dictionary of {parameter name: List of 2-uplets (alias value, replacement value)})
|
|
64
|
+
@param static_parameters_values: fixed parameter values known at action registration (format: dictonary of {parameter name: parameter value})
|
|
65
|
+
@param kwargs: any other action arguments
|
|
66
|
+
"""
|
|
67
|
+
action_kwargs = {
|
|
68
|
+
'parameters_default_values': parameters_default_values,
|
|
69
|
+
'parameters_replacements': parameters_replacements,
|
|
70
|
+
'static_parameters_values': static_parameters_values
|
|
71
|
+
}
|
|
72
|
+
action_kwargs.update(kwargs)
|
|
73
|
+
self.__actions[action] = action_kwargs
|
|
74
|
+
logger.info(f"[{self.name}] Registered action '{action}'")
|
|
75
|
+
|
|
76
|
+
def get_action_names(self):
|
|
77
|
+
return list(self.__actions.keys())
|
|
78
|
+
|
|
79
|
+
def get_action_parameter_names(self, action):
|
|
80
|
+
parameters_default_values = self.get_action_kwargs(action)['parameters_default_values']
|
|
81
|
+
return [p[0] for p in parameters_default_values]
|
|
82
|
+
|
|
83
|
+
def get_action_parameters_default_values(self, action):
|
|
84
|
+
return self.get_action_kwargs(action)['parameters_default_values']
|
|
85
|
+
|
|
86
|
+
def get_action_parameters_replacements(self, action):
|
|
87
|
+
return self.get_action_kwargs(action)['parameters_replacements']
|
|
88
|
+
|
|
89
|
+
def get_action_static_parameters_values(self, action):
|
|
90
|
+
return self.get_action_kwargs(action)['static_parameters_values']
|
|
91
|
+
|
|
92
|
+
def get_action_kwargs(self, action):
|
|
93
|
+
if action in self.__actions:
|
|
94
|
+
return self.__actions[action]
|
|
95
|
+
else:
|
|
96
|
+
raise TechnicalException(f"No registered action '{action}'")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class ActionScriptActor(Actor):
|
|
102
|
+
def __init__(self, module_name, action_registry=None):
|
|
103
|
+
super().__init__(module_name)
|
|
104
|
+
self.__action_registry = action_registry
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def action_registry(self):
|
|
108
|
+
return self.__action_registry
|
|
109
|
+
|
|
110
|
+
@action_registry.setter
|
|
111
|
+
def action_registry(self, action_registry):
|
|
112
|
+
self.__action_registry = action_registry
|
|
113
|
+
|
|
114
|
+
def act_process_action(self, action_info, action_script):
|
|
115
|
+
raise NotImplementedError()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class ActionScript(InputOutputScript):
|
|
119
|
+
def __init__(self, work_dir_path=None, with_input=True, with_output=True, with_template=True, with_action_parameter=True,
|
|
120
|
+
actor=None, action_registry=None, script_file=None):
|
|
121
|
+
super().__init__(work_dir_path=work_dir_path, with_input=with_input, with_output=with_output, with_template=with_template)
|
|
122
|
+
|
|
123
|
+
self.__actor = actor
|
|
124
|
+
self.__action_registry = action_registry if action_registry is not None else ActionRegistry("default")
|
|
125
|
+
self.__script_file = script_file
|
|
126
|
+
self.__with_action_parameter = with_action_parameter
|
|
127
|
+
|
|
128
|
+
# Post process
|
|
129
|
+
if self.__actor and self.__actor.action_registry is None:
|
|
130
|
+
self.__actor.action_registry = self.__action_registry
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def actor(self):
|
|
134
|
+
return self.__actor
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def action_registry(self):
|
|
138
|
+
return self.__action_registry
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def script_file(self):
|
|
142
|
+
return self.__script_file
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def with_action_parameter(self):
|
|
146
|
+
return self.__with_action_parameter
|
|
147
|
+
|
|
148
|
+
def get_description(self, script_command, short_description, action):
|
|
149
|
+
return """{short_description}
|
|
150
|
+
|
|
151
|
+
Usage:
|
|
152
|
+
1. Generate a template file for the desired action with parameter '--output-template' as in example 1.
|
|
153
|
+
It is possible to specify the name of the output file with parameter '-o'.
|
|
154
|
+
2. Copy the template line in order to have one line per action to do, and modify the template file with desired values.
|
|
155
|
+
3. Process actions described in a CSV file with parameter '-i'.
|
|
156
|
+
If an error occurs at a line, execution is stopped.
|
|
157
|
+
4. See result in output file. If parameter '-o' is not specified, the output filename is generated from parameter '-i'.
|
|
158
|
+
|
|
159
|
+
In template files, a default value is set in each column.
|
|
160
|
+
For columns with enum values, the default value is a combination of each possible enum values separated by a '|', but only one value is possible.
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
In input and output files, the first column 'STATUS' describes the status of execution of each line:
|
|
164
|
+
- 'TODO' (or ''): the line is to process (in output file, it means that execution was stopped on an error with a previous line)
|
|
165
|
+
- 'SUCCESS': the line was in success
|
|
166
|
+
- 'ERROR': the line was in error
|
|
167
|
+
- others: the line is not processed, you can specify your own status to skip this line
|
|
168
|
+
In template files, this column is automatically initialized with status 'TODO'.
|
|
169
|
+
Any output file can be used as input file, the lines that are in status 'ERROR' or 'TODO' will be processed again.
|
|
170
|
+
|
|
171
|
+
Example 1: Output CSV template for action '{action}'
|
|
172
|
+
|
|
173
|
+
{script_command} {action} --output-template -o {action}.csv
|
|
174
|
+
|
|
175
|
+
Example 2: Process action '{action}' with given input CSV
|
|
176
|
+
|
|
177
|
+
{script_command} {action} -i {action}.csv
|
|
178
|
+
""".format(short_description=short_description, script_command=script_command, action=action)
|
|
179
|
+
|
|
180
|
+
def _new_argument_parser(self, description=None, additional_arguments=None, add_help=True):
|
|
181
|
+
parser = super()._new_argument_parser(description=description, additional_arguments=additional_arguments, add_help=add_help)
|
|
182
|
+
|
|
183
|
+
if self.__with_action_parameter:
|
|
184
|
+
parser.add_argument('action', choices=self.possible_actions(), default=None, help='Action name')
|
|
185
|
+
|
|
186
|
+
return parser
|
|
187
|
+
|
|
188
|
+
def is_matching_file_path(self, file_path, raise_exception=False):
|
|
189
|
+
file_ext = self.script_file.file_extension.lower()
|
|
190
|
+
res = file_path.lower().endswith(file_ext)
|
|
191
|
+
|
|
192
|
+
if not res and raise_exception:
|
|
193
|
+
raise VerifyException(f"File path doesn't end by {file_ext} (case insensitive)")
|
|
194
|
+
return res
|
|
195
|
+
|
|
196
|
+
def is_matching_action(self, action, raise_exception=False):
|
|
197
|
+
"""Return if action is matching this action script
|
|
198
|
+
"""
|
|
199
|
+
res = action in self.possible_actions()
|
|
200
|
+
|
|
201
|
+
if not res and raise_exception:
|
|
202
|
+
raise VerifyException(f"Action '{action}' doesn't match this script (possible actions: {self.possible_actions()})")
|
|
203
|
+
return res
|
|
204
|
+
|
|
205
|
+
def is_matching_action_and_input_file_path(self, action, file_path, raise_exception=False):
|
|
206
|
+
"""Return if action and associated input file are matching this action script
|
|
207
|
+
"""
|
|
208
|
+
return self.is_matching_action(action, raise_exception) \
|
|
209
|
+
and self.is_matching_input_file_path(file_path, raise_exception=raise_exception)
|
|
210
|
+
|
|
211
|
+
def is_matching_action_and_output_file_path(self, action, file_path, raise_exception=False):
|
|
212
|
+
"""Return if action and associated output file are matching this action script
|
|
213
|
+
"""
|
|
214
|
+
return self.is_matching_action(action, raise_exception) \
|
|
215
|
+
and self.is_matching_output_file_path(file_path, raise_exception=raise_exception)
|
|
216
|
+
|
|
217
|
+
def _build_output_template_path(self):
|
|
218
|
+
if self.with_action_parameter:
|
|
219
|
+
default_path = f"{self.args.action}_template{self.script_file.file_extension}"
|
|
220
|
+
else:
|
|
221
|
+
default_path = None
|
|
222
|
+
|
|
223
|
+
try:
|
|
224
|
+
return self._build_output_path(self.args.output_filename, default_path, self.user_working_dir)
|
|
225
|
+
except Exception:
|
|
226
|
+
raise FunctionalException(f"[{Typing.get_object_class_fullname(self)}] Please define output template file path")
|
|
227
|
+
|
|
228
|
+
def possible_actions(self):
|
|
229
|
+
raise NotImplementedError
|
|
230
|
+
|
|
231
|
+
def build_template_jobs(self):
|
|
232
|
+
if self.with_action_parameter:
|
|
233
|
+
action = self.args.action
|
|
234
|
+
params_default_values = self.action_registry.get_action_parameters_default_values(action)
|
|
235
|
+
params = {pdv[0]:pdv[1] for pdv in params_default_values}
|
|
236
|
+
# Note: for templates, add static parameters is not needed
|
|
237
|
+
actions = [self.new_action_info(action, params=params)]
|
|
238
|
+
job = Job(actions=actions, in_parallel=False)
|
|
239
|
+
return [job]
|
|
240
|
+
else:
|
|
241
|
+
raise NotImplementedError()
|
|
242
|
+
|
|
243
|
+
def process_jobs(self, list_jobs):
|
|
244
|
+
res = []
|
|
245
|
+
got_error = False
|
|
246
|
+
|
|
247
|
+
for job in list_jobs:
|
|
248
|
+
if got_error:
|
|
249
|
+
res.append(job)
|
|
250
|
+
continue
|
|
251
|
+
|
|
252
|
+
res_job, got_error = self.process_job(job)
|
|
253
|
+
res.append(res_job)
|
|
254
|
+
|
|
255
|
+
return res, got_error
|
|
256
|
+
|
|
257
|
+
def process_job(self, job):
|
|
258
|
+
return self.process_actions(job.actions, job.in_parallel)
|
|
259
|
+
|
|
260
|
+
def new_action_info_from_args(self):
|
|
261
|
+
action = self.args.action
|
|
262
|
+
static_params = self.action_registry.get_action_static_parameters_values(action)
|
|
263
|
+
return self.new_action_info(action, static_params=static_params)
|
|
264
|
+
|
|
265
|
+
def new_action_info(self, action, uid=None, params=None, static_params=None, index=0):
|
|
266
|
+
processing_params = self.build_processing_action_params(action, action_args=self.args if self.with_action_parameter else None, action_params=params)
|
|
267
|
+
if uid is None:
|
|
268
|
+
dt_str = DateTime.datetime_2_str(DateTime.utcnow())
|
|
269
|
+
uid = f"{dt_str} - {action} - {processing_params}"
|
|
270
|
+
return ActionInfo(uid=uid, action=action, params=processing_params, static_params=static_params, index=index)
|
|
271
|
+
|
|
272
|
+
def build_processing_action_params(self, action, action_args=None, action_params=None, **kwargs): # @UnusedVariable
|
|
273
|
+
if action_params is not None:
|
|
274
|
+
return dict(action_params)
|
|
275
|
+
else:
|
|
276
|
+
return None
|
|
277
|
+
|
|
278
|
+
def process_actions(self, list_action_info, in_parallel):
|
|
279
|
+
if in_parallel:
|
|
280
|
+
return self._process_actions_parallel(list_action_info)
|
|
281
|
+
else:
|
|
282
|
+
return self._process_actions_serial(list_action_info)
|
|
283
|
+
|
|
284
|
+
def _process_actions_serial(self, list_action_info):
|
|
285
|
+
logger.info(f"Processing {len(list_action_info)} actions in serial mode")
|
|
286
|
+
res = []
|
|
287
|
+
got_error = False
|
|
288
|
+
|
|
289
|
+
for action_info in list_action_info:
|
|
290
|
+
action_status = action_info.params['STATUS'] if 'STATUS' in action_info.params else 'TODO'
|
|
291
|
+
res_action = copy.deepcopy(action_info)
|
|
292
|
+
|
|
293
|
+
if not got_error and action_status in ['TODO', 'ERROR']:
|
|
294
|
+
action_status = self.process_action(action_info)
|
|
295
|
+
got_error |= (action_status == 'ERROR')
|
|
296
|
+
elif got_error:
|
|
297
|
+
logger.info(f"Skip action of index {action_info.index} since a previous action has failed")
|
|
298
|
+
else:
|
|
299
|
+
logger.info(f"Skip action of index {action_info.index} since its statud is '{action_status}'")
|
|
300
|
+
|
|
301
|
+
res_action.params['STATUS'] = action_status
|
|
302
|
+
res.append(res_action)
|
|
303
|
+
|
|
304
|
+
return res, got_error
|
|
305
|
+
|
|
306
|
+
def _process_actions_parallel(self, list_action_info):
|
|
307
|
+
from holado_multitask.multiprocessing.function_process import FunctionProcess
|
|
308
|
+
|
|
309
|
+
logger.info(f"Processing {len(list_action_info)} actions in parallel mode")
|
|
310
|
+
res = []
|
|
311
|
+
got_error = False
|
|
312
|
+
processes = []
|
|
313
|
+
|
|
314
|
+
# Start all processes
|
|
315
|
+
for action_info in list_action_info:
|
|
316
|
+
action_status = action_info.params['STATUS'] if 'STATUS' in action_info.params else 'TODO'
|
|
317
|
+
res_action = copy.deepcopy(action_info)
|
|
318
|
+
|
|
319
|
+
if action_status in ['TODO', 'ERROR']:
|
|
320
|
+
proc = FunctionProcess(self.process_action, args=[action_info], name=f"Process action of index {action_info.index}")
|
|
321
|
+
proc.start()
|
|
322
|
+
processes.append((action_info, proc))
|
|
323
|
+
|
|
324
|
+
res_action.params['STATUS'] = action_status
|
|
325
|
+
res.append(res_action)
|
|
326
|
+
|
|
327
|
+
# Join all processes
|
|
328
|
+
for _, proc in processes:
|
|
329
|
+
proc.join()
|
|
330
|
+
|
|
331
|
+
# Update result
|
|
332
|
+
for action_info, proc in processes:
|
|
333
|
+
if proc.error is not None:
|
|
334
|
+
logger.error(f"Error when processing action of index {action_info.index}: {proc.error}")
|
|
335
|
+
action_status = 'ERROR'
|
|
336
|
+
if proc.result is not None:
|
|
337
|
+
action_status = proc.result
|
|
338
|
+
|
|
339
|
+
res[action_info.index].params['STATUS'] = action_status
|
|
340
|
+
got_error |= (action_status == 'ERROR')
|
|
341
|
+
|
|
342
|
+
return res, got_error
|
|
343
|
+
|
|
344
|
+
def _apply_replacements_on_action_params(self, action_params, params_replacements):
|
|
345
|
+
from holado_core.common.tools.tools import Tools
|
|
346
|
+
|
|
347
|
+
res = dict(action_params)
|
|
348
|
+
|
|
349
|
+
for key in action_params:
|
|
350
|
+
value = action_params[key]
|
|
351
|
+
if key in params_replacements:
|
|
352
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
353
|
+
logger.debug(f"Checking replacable value '{key}'")
|
|
354
|
+
for value_replaced, replacement in params_replacements[key]:
|
|
355
|
+
value_comp = value.lower() if isinstance(value, str) else value
|
|
356
|
+
value_replaced_comp = value_replaced.lower() if isinstance(value_replaced, str) else value_replaced
|
|
357
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
358
|
+
logger.debug(f"Evaluating value '{value_comp}' to '{value_replaced_comp}'. Value for '{key}' replaced by '{replacement}' if equals")
|
|
359
|
+
if value_comp == value_replaced_comp:
|
|
360
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
361
|
+
logger.debug(f"Value for '{key}' replaced by '{replacement}'")
|
|
362
|
+
value = replacement
|
|
363
|
+
break
|
|
364
|
+
res[key] = value
|
|
365
|
+
|
|
366
|
+
return res
|
|
367
|
+
|
|
368
|
+
def process_action(self, action_info):
|
|
369
|
+
if self.actor:
|
|
370
|
+
return self.actor.act_process_action(action_info, self).execute()
|
|
371
|
+
else:
|
|
372
|
+
raise NotImplementedError()
|
|
373
|
+
|
|
374
|
+
def read_jobs(self, input_path):
|
|
375
|
+
res = self.script_file.read_jobs(input_path, self)
|
|
376
|
+
|
|
377
|
+
# Verify action parameter names
|
|
378
|
+
self._verify_jobs_actions_parameters(res)
|
|
379
|
+
|
|
380
|
+
# Replace action parameters if needed
|
|
381
|
+
self._replace_jobs_actions_parameters(res)
|
|
382
|
+
|
|
383
|
+
return res
|
|
384
|
+
|
|
385
|
+
def _verify_jobs_actions_parameters(self, jobs):
|
|
386
|
+
for job in jobs:
|
|
387
|
+
for action_info in job.actions:
|
|
388
|
+
self._verify_action_parameters(action_info)
|
|
389
|
+
|
|
390
|
+
def _verify_action_parameters(self, action_info):
|
|
391
|
+
ai_param_names = set(action_info.params.keys())
|
|
392
|
+
expected_param_names = set(self.action_registry.get_action_parameter_names(action_info.action))
|
|
393
|
+
difference = ai_param_names.symmetric_difference(expected_param_names)
|
|
394
|
+
# Note: parameter 'STATUS' is added in action result and is possibly present in input
|
|
395
|
+
if len(difference) > 0 and difference != {'STATUS'}:
|
|
396
|
+
raise FunctionalException(
|
|
397
|
+
f"""Unexpected action parameter names for action '{action_info.action}':
|
|
398
|
+
obtained names: {ai_param_names}
|
|
399
|
+
expected names: {expected_param_names}""")
|
|
400
|
+
|
|
401
|
+
def _replace_jobs_actions_parameters(self, jobs):
|
|
402
|
+
for job in jobs:
|
|
403
|
+
for action_info in job.actions:
|
|
404
|
+
self._replace_action_parameters(action_info)
|
|
405
|
+
|
|
406
|
+
def _replace_action_parameters(self, action_info):
|
|
407
|
+
from holado_core.common.tools.tools import Tools
|
|
408
|
+
|
|
409
|
+
# Process replacements defined in action registry
|
|
410
|
+
params_replacements = self.action_registry.get_action_parameters_replacements(action_info.action)
|
|
411
|
+
if params_replacements:
|
|
412
|
+
for param_name in action_info.params:
|
|
413
|
+
value = action_info.params[param_name]
|
|
414
|
+
if param_name in params_replacements:
|
|
415
|
+
new_value = undefined_argument
|
|
416
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
417
|
+
logger.debug(f"Checking replacable value '{param_name}'")
|
|
418
|
+
for value_replaced, replacement in params_replacements[param_name]:
|
|
419
|
+
value_comp = value.lower() if isinstance(value, str) else value
|
|
420
|
+
value_replaced_comp = value_replaced.lower() if isinstance(value_replaced, str) else value_replaced
|
|
421
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
422
|
+
logger.trace(f"Comparing value '{value_comp}' to '{value_replaced_comp}'. Value for parameter '{param_name}' replaced by '{replacement}' if equals")
|
|
423
|
+
if value_comp == value_replaced_comp:
|
|
424
|
+
new_value = replacement
|
|
425
|
+
break
|
|
426
|
+
if new_value is not undefined_argument:
|
|
427
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
428
|
+
logger.debug(f"For parameter '{param_name}', value '{value}' is replaced by '{new_value}'")
|
|
429
|
+
action_info.params[param_name] = new_value
|
|
430
|
+
|
|
431
|
+
def write_jobs(self, output_path, result_jobs, got_error):
|
|
432
|
+
output_path_base, _, output_ext = self._build_output_path_base(output_path)
|
|
433
|
+
if got_error is not None:
|
|
434
|
+
if got_error:
|
|
435
|
+
output_base = f"{output_path_base}-FAIL"
|
|
436
|
+
else:
|
|
437
|
+
output_base = f"{output_path_base}-SUCCESS"
|
|
438
|
+
else:
|
|
439
|
+
output_base = output_path_base
|
|
440
|
+
real_output_path = self._build_output_path_from_base(output_base, output_ext)
|
|
441
|
+
|
|
442
|
+
self.script_file.write_jobs(real_output_path, result_jobs, self)
|
|
443
|
+
|
|
444
|
+
return real_output_path
|
|
445
|
+
|
|
446
|
+
def run_script(self):
|
|
447
|
+
if self.with_template and self.args.output_template:
|
|
448
|
+
output_path = self._build_output_template_path()
|
|
449
|
+
template_jobs = self.build_template_jobs()
|
|
450
|
+
real_output_path = self.write_jobs(output_path, template_jobs, got_error=None)
|
|
451
|
+
logger.print(f"Template created in file '{real_output_path}'")
|
|
452
|
+
elif self.with_input and self.args.input_filename:
|
|
453
|
+
# Read file
|
|
454
|
+
input_path = self._build_input_path(self.args.input_filename, self.user_working_dir)
|
|
455
|
+
list_jobs = self.read_jobs(input_path)
|
|
456
|
+
|
|
457
|
+
# Process jobs
|
|
458
|
+
result_jobs, got_error = self.process_jobs(list_jobs)
|
|
459
|
+
|
|
460
|
+
# Write file
|
|
461
|
+
if self.with_output and self.args.output_filename is not None:
|
|
462
|
+
output_path = self._build_output_path(self.args.output_filename, self.args.input_filename, self.user_working_dir)
|
|
463
|
+
real_output_path = self.write_jobs(output_path, result_jobs, got_error)
|
|
464
|
+
logger.print(f"Result outputed in file '{real_output_path}'")
|
|
465
|
+
else:
|
|
466
|
+
action_info = self.new_action_info_from_args()
|
|
467
|
+
result_action = self.process_action(action_info)
|
|
468
|
+
result_jobs=[{'actions': [result_action]}]
|
|
469
|
+
|
|
470
|
+
# Write file
|
|
471
|
+
if self.with_output and self.args.output_filename is not None:
|
|
472
|
+
output_path = self._build_output_path(self.args.output_filename, None, self.user_working_dir)
|
|
473
|
+
real_output_path = self.write_jobs(output_path, result_jobs)
|
|
474
|
+
logger.print(f"Result outputed in file '{real_output_path}'")
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
# This file is a helper to build scripts using HolAdo solution, with CSV files as input.
|
|
16
|
+
# Usually, it is copied and adapted for specific usage.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
import logging
|
|
20
|
+
from holado_helper.script.action_script import ActionScript
|
|
21
|
+
from holado_core.common.exceptions.element_exception import ElementNotFoundException
|
|
22
|
+
from holado_helper.script.script import Script
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
class AnyActionScript(ActionScript):
|
|
27
|
+
def __init__(self, work_dir_path=None, actor=None):
|
|
28
|
+
super().__init__(work_dir_path=work_dir_path, actor=actor)
|
|
29
|
+
|
|
30
|
+
self.__action_script_by_type = {}
|
|
31
|
+
|
|
32
|
+
@Script.user_working_dir.setter # @UndefinedVariable
|
|
33
|
+
def user_working_dir(self, wd):
|
|
34
|
+
Script.user_working_dir.fset(self, wd) # @UndefinedVariable
|
|
35
|
+
for action_type in self.__action_script_by_type.values():
|
|
36
|
+
action_type.user_working_dir = wd
|
|
37
|
+
|
|
38
|
+
def get_description(self, script_command, short_description, action):
|
|
39
|
+
return """{short_description}
|
|
40
|
+
|
|
41
|
+
Usage:
|
|
42
|
+
1. Generate a template file for the desired action with parameter '--output-template' as in example 1.
|
|
43
|
+
It is possible to specify the name of the output file with parameter '-o'.
|
|
44
|
+
2. Modify the generated file to define actions parameters.
|
|
45
|
+
3. Process actions described in file with parameter '-i'.
|
|
46
|
+
4. See result in output file. If parameter '-o' is not specified, the output filename is generated from parameter '-i'.
|
|
47
|
+
|
|
48
|
+
In template files, a default value is set for each parameter.
|
|
49
|
+
For parameters with enum values, the default value is a combination of each possible enum values separated by a '|', but only one value is possible.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
In input and output files, a parameter 'STATUS' describes the status of execution of each action:
|
|
53
|
+
- 'TODO' (or ''): the action is to process (in output file, it means that execution was stopped on an error on a previous action)
|
|
54
|
+
- 'SUCCESS': the action was in success
|
|
55
|
+
- 'ERROR': the action was in error
|
|
56
|
+
- others: the action is not processed, you can specify your own status to skip this action
|
|
57
|
+
In template files, this parameter is automatically initialized with status 'TODO'.
|
|
58
|
+
Any output file can be used as input file, the actions that are in status 'ERROR' or 'TODO' will be processed again.
|
|
59
|
+
|
|
60
|
+
Example 1: Output template for action '{action}' (case with CSV input file)
|
|
61
|
+
|
|
62
|
+
{script_command} {action} --output-template -o {action}.csv
|
|
63
|
+
|
|
64
|
+
Example 2: Process action '{action}' (case with CSV input file)
|
|
65
|
+
|
|
66
|
+
{script_command} {action} -i {action}.csv
|
|
67
|
+
""".format(short_description=short_description, script_command=script_command, action=action)
|
|
68
|
+
|
|
69
|
+
def register_action_type(self, action_type_name, action_type):
|
|
70
|
+
self.__action_script_by_type[action_type_name] = action_type
|
|
71
|
+
|
|
72
|
+
def _get_action_type_for_action(self, action):
|
|
73
|
+
for action_type in self.__action_script_by_type.values():
|
|
74
|
+
if action_type.is_matching_action(action):
|
|
75
|
+
return action_type
|
|
76
|
+
raise ElementNotFoundException(f"Action '{action}' is not matching any registered action type (registered action types: {list(self.__action_script_by_type.keys())})")
|
|
77
|
+
|
|
78
|
+
def _get_action_type_for_action_and_input_file(self, action, file_path):
|
|
79
|
+
for action_type in self.__action_script_by_type.values():
|
|
80
|
+
if action_type.with_input and action_type.is_matching_action_and_input_file_path(action, file_path):
|
|
81
|
+
return action_type
|
|
82
|
+
raise ElementNotFoundException(f"Action '{action}' with input file '{file_path}' is not matching any registered action type (registered action types: {list(self.__action_script_by_type.keys())})")
|
|
83
|
+
|
|
84
|
+
def _get_action_type_for_action_and_output_file(self, action, file_path):
|
|
85
|
+
for action_type in self.__action_script_by_type.values():
|
|
86
|
+
if action_type.is_matching_action_and_output_file_path(action, file_path):
|
|
87
|
+
return action_type
|
|
88
|
+
raise ElementNotFoundException(f"Action '{action}' with output file '{file_path}' is not matching any registered action type (registered action types: {list(self.__action_script_by_type.keys())})")
|
|
89
|
+
|
|
90
|
+
def _get_action_type_for_input_file(self, file_path):
|
|
91
|
+
for action_type in self.__action_script_by_type.values():
|
|
92
|
+
if action_type.is_matching_input_file_path(file_path):
|
|
93
|
+
return action_type
|
|
94
|
+
raise ElementNotFoundException(f"Input file '{file_path}' is not matching any registered action type (registered action types: {list(self.__action_script_by_type.keys())})")
|
|
95
|
+
|
|
96
|
+
def _get_action_type_for_output_file(self, file_path):
|
|
97
|
+
for action_type in self.__action_script_by_type.values():
|
|
98
|
+
if action_type.is_matching_output_file_path(file_path):
|
|
99
|
+
return action_type
|
|
100
|
+
raise ElementNotFoundException(f"Output file '{file_path}' is not matching any registered action type (registered action types: {list(self.__action_script_by_type.keys())})")
|
|
101
|
+
|
|
102
|
+
def possible_actions(self):
|
|
103
|
+
res = set()
|
|
104
|
+
for act_type in self.__action_script_by_type.values():
|
|
105
|
+
res.update(act_type.possible_actions())
|
|
106
|
+
return sorted(res)
|
|
107
|
+
|
|
108
|
+
def run_script(self):
|
|
109
|
+
# Note: At this step it is not possible to build real output path, thus action type is defined with action and filename given by user (if given)
|
|
110
|
+
if self.with_action_parameter:
|
|
111
|
+
if self.args.output_template and self.args.output_filename:
|
|
112
|
+
action_type = self._get_action_type_for_action_and_output_file(self.args.action, self.args.output_filename)
|
|
113
|
+
elif self.args.input_filename is not None:
|
|
114
|
+
action_type = self._get_action_type_for_action_and_input_file(self.args.action, self.args.input_filename)
|
|
115
|
+
else:
|
|
116
|
+
action_type = self._get_action_type_for_action(self.args.action)
|
|
117
|
+
elif self.args.output_template and self.args.output_filename:
|
|
118
|
+
action_type = self._get_action_type_for_output_file(self.args.output_filename)
|
|
119
|
+
elif self.args.input_filename is not None:
|
|
120
|
+
action_type = self._get_action_type_for_input_file(self.args.input_filename)
|
|
121
|
+
else:
|
|
122
|
+
raise ElementNotFoundException(f"Unable to define a matching registered action type with script args {self.args} (registered action types: {list(self.__action_script_by_type.keys())})")
|
|
123
|
+
|
|
124
|
+
action_type.run()
|
|
125
|
+
|
|
126
|
+
|