holado 0.2.2__py3-none-any.whl → 0.2.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of holado might be problematic. Click here for more details.
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/METADATA +13 -9
- holado-0.2.3.dist-info/RECORD +535 -0
- holado_ais/__init__.py +33 -0
- holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
- holado_ais/ais/ais_manager.py +151 -0
- holado_ais/ais/ais_messages.py +203 -0
- holado_ais/ais/ais_payload.py +35 -0
- holado_ais/ais/enums.py +37 -0
- holado_ais/ais/patch_pyais.py +1303 -0
- holado_ais/tests/behave/steps/__init__.py +17 -0
- holado_ais/tests/behave/steps/ais/__init__.py +0 -0
- holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
- holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
- holado_binary/__init__.py +17 -0
- holado_binary/ipc/binary.py +125 -0
- holado_binary/ipc/bit_series.py +307 -0
- holado_binary/tests/behave/steps/__init__.py +17 -0
- holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
- holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
- holado_context/__init__.py +16 -0
- holado_context/tests/behave/steps/__init__.py +16 -0
- holado_context/tests/behave/steps/private/__init__.py +16 -0
- holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
- holado_core/__init__.py +32 -0
- holado_core/common/__init__.py +0 -0
- holado_core/common/actors/actions.py +97 -0
- holado_core/common/actors/actor.py +226 -0
- holado_core/common/actors/element_actor.py +32 -0
- holado_core/common/actors/find_actor.py +106 -0
- holado_core/common/actors/tree_actor.py +32 -0
- holado_core/common/actors/verify_actions.py +69 -0
- holado_core/common/block/base.py +122 -0
- holado_core/common/block/block_manager.py +173 -0
- holado_core/common/block/block_method.py +46 -0
- holado_core/common/block/block_steps.py +37 -0
- holado_core/common/block/function.py +42 -0
- holado_core/common/block/scope_function.py +28 -0
- holado_core/common/block/scope_manager.py +238 -0
- holado_core/common/block/scope_steps.py +141 -0
- holado_core/common/criterias/and_criteria.py +61 -0
- holado_core/common/criterias/criteria.py +78 -0
- holado_core/common/criterias/or_criteria.py +64 -0
- holado_core/common/criterias/tools/criteria_context.py +20 -0
- holado_core/common/criterias/tools/criteria_parameters.py +18 -0
- holado_core/common/drivers/driver.py +153 -0
- holado_core/common/drivers/element_driver.py +30 -0
- holado_core/common/drivers/element_internal_api.py +239 -0
- holado_core/common/drivers/internal_api.py +40 -0
- holado_core/common/drivers/tree_driver.py +30 -0
- holado_core/common/drivers/tree_internal_api.py +176 -0
- holado_core/common/exceptions/__init__.py +0 -0
- holado_core/common/exceptions/element_exception.py +28 -0
- holado_core/common/exceptions/exceptions.py +24 -0
- holado_core/common/exceptions/functional_exception.py +21 -0
- holado_core/common/exceptions/holado_exception.py +25 -0
- holado_core/common/exceptions/technical_exception.py +27 -0
- holado_core/common/exceptions/timeout_exception.py +20 -0
- holado_core/common/exceptions/verify_exception.py +20 -0
- holado_core/common/finders/after_in_tree_finder.py +87 -0
- holado_core/common/finders/element_finder.py +60 -0
- holado_core/common/finders/else_finder.py +105 -0
- holado_core/common/finders/finder.py +478 -0
- holado_core/common/finders/or_finder.py +98 -0
- holado_core/common/finders/then_finder.py +157 -0
- holado_core/common/finders/tools/enums.py +30 -0
- holado_core/common/finders/tools/find_builder.py +118 -0
- holado_core/common/finders/tools/find_context.py +405 -0
- holado_core/common/finders/tools/find_info.py +27 -0
- holado_core/common/finders/tools/find_parameters.py +240 -0
- holado_core/common/finders/tools/find_updater.py +95 -0
- holado_core/common/finders/tools/finder_info.py +26 -0
- holado_core/common/finders/tree_finder.py +146 -0
- holado_core/common/handlers/__init__.py +0 -0
- holado_core/common/handlers/abstracts/base_redo.py +695 -0
- holado_core/common/handlers/abstracts/get_or_create.py +120 -0
- holado_core/common/handlers/element_holder.py +122 -0
- holado_core/common/handlers/enums.py +23 -0
- holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
- holado_core/common/handlers/features/resource_by_name.py +187 -0
- holado_core/common/handlers/features/resource_by_type.py +174 -0
- holado_core/common/handlers/redo.py +119 -0
- holado_core/common/handlers/wait.py +127 -0
- holado_core/common/inspectors/element_inspector.py +57 -0
- holado_core/common/inspectors/inspector.py +221 -0
- holado_core/common/inspectors/tools/inspect_builder.py +169 -0
- holado_core/common/inspectors/tools/inspect_context.py +69 -0
- holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
- holado_core/common/inspectors/tree_inspector.py +73 -0
- holado_core/common/resource/persisted_data_manager.py +113 -0
- holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
- holado_core/common/resource/resource_manager.py +143 -0
- holado_core/common/tables/__init__.py +1 -0
- holado_core/common/tables/comparators/__init__.py +0 -0
- holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
- holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
- holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/string_table_comparator.py +29 -0
- holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
- holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
- holado_core/common/tables/comparators/table_comparator.py +209 -0
- holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
- holado_core/common/tables/comparators/table_row_comparator.py +116 -0
- holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
- holado_core/common/tables/converters/__init__.py +0 -0
- holado_core/common/tables/converters/table_converter.py +194 -0
- holado_core/common/tables/enums.py +23 -0
- holado_core/common/tables/table.py +261 -0
- holado_core/common/tables/table_cell.py +126 -0
- holado_core/common/tables/table_manager.py +366 -0
- holado_core/common/tables/table_row.py +169 -0
- holado_core/common/tables/table_with_header.py +236 -0
- holado_core/common/tools/__init__.py +0 -0
- holado_core/common/tools/comparators/comparator.py +151 -0
- holado_core/common/tools/comparators/object_comparator.py +21 -0
- holado_core/common/tools/converters/converter.py +107 -0
- holado_core/common/tools/path_manager.py +185 -0
- holado_core/common/tools/string_tools.py +135 -0
- holado_core/common/tools/tools.py +172 -0
- holado_core/common/transport/__init__.py +0 -0
- holado_core/common/transport/crc.py +40 -0
- holado_core/tests/behave/steps/__init__.py +20 -0
- holado_core/tests/behave/steps/common/__init__.py +0 -0
- holado_core/tests/behave/steps/common/common_steps.py +136 -0
- holado_core/tests/behave/steps/common/config_steps.py +42 -0
- holado_core/tests/behave/steps/common/resource_steps.py +62 -0
- holado_core/tests/behave/steps/common/tables_steps.py +537 -0
- holado_core/tools/__init__.py +0 -0
- holado_core/tools/abstracts/__init__.py +0 -0
- holado_core/tools/abstracts/blocking_command_service.py +56 -0
- holado_core/tools/abstracts/service.py +48 -0
- holado_data/__init__.py +31 -0
- holado_data/data/generator/base.py +93 -0
- holado_data/data/generator/python_generator.py +30 -0
- holado_data/tests/behave/steps/__init__.py +17 -0
- holado_data/tests/behave/steps/data/generator_steps.py +91 -0
- holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
- holado_db/__init__.py +32 -0
- holado_db/tests/behave/steps/__init__.py +18 -0
- holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
- holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
- holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
- holado_db/tools/db/clients/base/db_client.py +206 -0
- holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
- holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
- holado_db/tools/db/db_manager.py +109 -0
- holado_db/tools/db/query/base/query_builder.py +87 -0
- holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
- holado_db/tools/db/query/query_manager.py +77 -0
- holado_docker/__init__.py +25 -0
- holado_docker/sdk/docker/docker_client.py +268 -0
- holado_docker/sdk/docker/docker_service.py +71 -0
- holado_docker/tests/behave/steps/__init__.py +16 -0
- holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
- holado_docker/tools/docker_controler/__init__.py +26 -0
- holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
- holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
- holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
- holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
- holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
- holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
- holado_grpc/__init__.py +32 -0
- holado_grpc/api/rpc/TODO.txt +4 -0
- holado_grpc/api/rpc/grpc_client.py +181 -0
- holado_grpc/api/rpc/grpc_manager.py +81 -0
- holado_grpc/ipc/rpc/__init__.py +0 -0
- holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
- holado_grpc/ipc/rpc/grpc_services.py +165 -0
- holado_grpc/tests/behave/steps/__init__.py +16 -0
- holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
- holado_grpc/tests/behave/steps/private/__init__.py +16 -0
- holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
- holado_helper/__init__.py +35 -0
- holado_helper/debug/README.txt +32 -0
- holado_helper/debug/memory/memory_profiler.py +106 -0
- holado_helper/docker/init_user.sh +24 -0
- holado_helper/docker/logging.conf +42 -0
- holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
- holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
- holado_helper/docker/run_terminal_in_docker.sh +101 -0
- holado_helper/holado_module_template/__init__.py +31 -0
- holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
- holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
- holado_helper/script/action.py +109 -0
- holado_helper/script/action_script.py +477 -0
- holado_helper/script/any_action_script.py +126 -0
- holado_helper/script/behave_action_script.py +99 -0
- holado_helper/script/csv_action_script.py +142 -0
- holado_helper/script/initialize_script.py +115 -0
- holado_helper/script/input_output_script.py +136 -0
- holado_helper/script/job.py +75 -0
- holado_helper/script/json_action_script.py +104 -0
- holado_helper/script/script.py +110 -0
- holado_json/__init__.py +16 -0
- holado_json/ipc/json.py +125 -0
- holado_json/ipc/json_converter.py +69 -0
- holado_json/ipc/json_types.py +183 -0
- holado_json/tests/behave/steps/__init__.py +16 -0
- holado_json/tests/behave/steps/ipc/__init__.py +0 -0
- holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
- holado_keycloak/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
- holado_keycloak/tools/keycloak/__init__.py +0 -0
- holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
- holado_logging/__init__.py +36 -0
- holado_logging/common/logging/holado_logger.py +75 -0
- holado_logging/common/logging/log_config.py +128 -0
- holado_logging/common/logging/log_manager.py +292 -0
- holado_multitask/__init__.py +33 -0
- holado_multitask/multiprocessing/context/process_context.py +35 -0
- holado_multitask/multiprocessing/function_process.py +102 -0
- holado_multitask/multiprocessing/periodic_function_process.py +135 -0
- holado_multitask/multiprocessing/process.py +196 -0
- holado_multitask/multiprocessing/processesmanager.py +133 -0
- holado_multitask/multitasking/multitask_manager.py +439 -0
- holado_multitask/multithreading/__init__.py +0 -0
- holado_multitask/multithreading/context/thread_context.py +84 -0
- holado_multitask/multithreading/functionthreaded.py +129 -0
- holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
- holado_multitask/multithreading/loopthread.py +100 -0
- holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
- holado_multitask/multithreading/reflection/inspect.py +47 -0
- holado_multitask/multithreading/reflection/sys.py +29 -0
- holado_multitask/multithreading/reflection/traceback.py +35 -0
- holado_multitask/multithreading/thread.py +177 -0
- holado_multitask/multithreading/threadsmanager.py +162 -0
- holado_multitask/multithreading/timer.py +48 -0
- holado_multitask/tests/behave/steps/__init__.py +17 -0
- holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
- holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
- holado_protobuf/__init__.py +61 -0
- holado_protobuf/ipc/protobuf/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
- holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
- holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
- holado_protobuf/ipc/protobuf/protobuf_messages.py +965 -0
- holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
- holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
- holado_protobuf/tests/behave/steps/__init__.py +16 -0
- holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
- holado_python/__init__.py +35 -0
- holado_python/common/enums.py +34 -0
- holado_python/common/iterables.py +30 -0
- holado_python/common/tools/comparators/boolean_comparator.py +37 -0
- holado_python/common/tools/comparators/bytes_comparator.py +48 -0
- holado_python/common/tools/comparators/datetime_comparator.py +74 -0
- holado_python/common/tools/comparators/float_comparator.py +97 -0
- holado_python/common/tools/comparators/integer_comparator.py +37 -0
- holado_python/common/tools/comparators/string_comparator.py +99 -0
- holado_python/common/tools/comparators/type_comparator.py +31 -0
- holado_python/common/tools/datetime.py +279 -0
- holado_python/standard_library/csv.py +207 -0
- holado_python/standard_library/hashlib.py +82 -0
- holado_python/standard_library/multiprocessing.py +62 -0
- holado_python/standard_library/queue.py +79 -0
- holado_python/standard_library/socket/blocking_socket.py +136 -0
- holado_python/standard_library/socket/echo_server.py +28 -0
- holado_python/standard_library/socket/message_socket.py +91 -0
- holado_python/standard_library/socket/non_blocking_socket.py +151 -0
- holado_python/standard_library/socket/socket.py +148 -0
- holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
- holado_python/standard_library/ssl/ssl.py +81 -0
- holado_python/standard_library/typing.py +192 -0
- holado_python/tests/behave/steps/__init__.py +27 -0
- holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
- holado_python/tests/behave/steps/convert_steps.py +59 -0
- holado_python/tests/behave/steps/iterable_steps.py +87 -0
- holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
- holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
- holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
- holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
- holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
- holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
- holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
- holado_rabbitmq/__init__.py +28 -0
- holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +675 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
- holado_redis/__init__.py +17 -0
- holado_redis/tests/behave/steps/__init__.py +16 -0
- holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
- holado_redis/tools/redis/TODO.txt +7 -0
- holado_redis/tools/redis/redis_client.py +190 -0
- holado_redis/tools/redis/redis_manager.py +38 -0
- holado_report/__init__.py +27 -0
- holado_report/report/analyze/execution_historic_manager.py +96 -0
- holado_report/report/analyze/scenario_duration_manager.py +245 -0
- holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
- holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
- holado_report/report/builders/report_builder.py +64 -0
- holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
- holado_report/report/builders/summary_report_builder.py +89 -0
- holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
- holado_report/report/builders/summary_scenario_report_builder.py +74 -0
- holado_report/report/execution_historic.py +141 -0
- holado_report/report/report_manager.py +256 -0
- holado_report/report/reports/base_report.py +163 -0
- holado_report/report/reports/feature_report.py +106 -0
- holado_report/report/reports/scenario_report.py +64 -0
- holado_rest/__init__.py +24 -0
- holado_rest/api/rest/TODO.txt +2 -0
- holado_rest/api/rest/rest_client.py +113 -0
- holado_rest/api/rest/rest_manager.py +62 -0
- holado_rest/tests/behave/steps/__init__.py +16 -0
- holado_rest/tests/behave/steps/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
- holado_rest/tests/behave/steps/private/__init__.py +16 -0
- holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
- holado_s3/__init__.py +17 -0
- holado_s3/tests/behave/steps/__init__.py +17 -0
- holado_s3/tests/behave/steps/private/__init__.py +16 -0
- holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
- holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
- holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
- holado_s3/tools/s3/__init__.py +0 -0
- holado_s3/tools/s3/boto3_s3_client.py +59 -0
- holado_s3/tools/s3/minio_client.py +75 -0
- holado_s3/tools/s3/moto_server.py +52 -0
- holado_scripting/__init__.py +53 -0
- holado_scripting/common/tools/dynamic_text_manager.py +73 -0
- holado_scripting/common/tools/evaluate_parameters.py +210 -0
- holado_scripting/common/tools/expression_evaluator.py +387 -0
- holado_scripting/common/tools/variable_manager.py +321 -0
- holado_scripting/tests/behave/steps/__init__.py +22 -0
- holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
- holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
- holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
- holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
- holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
- holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
- holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
- holado_scripting/text/base/base_function.py +25 -0
- holado_scripting/text/base/base_verify_function.py +25 -0
- holado_scripting/text/base/text_inspecter.py +204 -0
- holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
- holado_scripting/text/interpreter/functions/function_cast.py +60 -0
- holado_scripting/text/interpreter/functions/function_convert.py +57 -0
- holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
- holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
- holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
- holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
- holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
- holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
- holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
- holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
- holado_scripting/text/interpreter/text_interpreter.py +216 -0
- holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
- holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
- holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
- holado_scripting/text/verifier/text_verifier.py +103 -0
- holado_sftp/__init__.py +16 -0
- holado_sftp/tests/behave/steps/__init__.py +17 -0
- holado_sftp/tests/behave/steps/private/__init__.py +16 -0
- holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
- holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
- holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
- holado_sftp/tools/sftp/__init__.py +0 -0
- holado_sftp/tools/sftp/sftp_client.py +103 -0
- holado_sftp/tools/sftp/sftp_server.py +39 -0
- holado_swagger/__init__.py +31 -0
- holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
- holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
- holado_swagger/tests/behave/steps/__init__.py +16 -0
- holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
- holado_system/system/command/command.py +216 -0
- holado_system/system/command/command_result.py +128 -0
- holado_system/system/command/curl_command.py +101 -0
- holado_system/system/command/exceptions.py +59 -0
- holado_system/system/filesystem/file.py +76 -0
- holado_system/system/global_system.py +187 -0
- holado_system/tests/behave/steps/__init__.py +18 -0
- holado_system/tests/behave/steps/system/commands_steps.py +92 -0
- holado_system/tests/behave/steps/system/file_steps.py +215 -0
- holado_system/tests/behave/steps/system/system_steps.py +84 -0
- holado_test/__init__.py +27 -0
- holado_test/behave/__init__.py +0 -0
- holado_test/behave/behave.py +397 -0
- holado_test/behave/behave_environment.py +143 -0
- holado_test/behave/behave_function.py +33 -0
- holado_test/behave/behave_manager.py +555 -0
- holado_test/behave/independant_runner.py +68 -0
- holado_test/behave/scenario/__init__.py +0 -0
- holado_test/behave/scenario/behave_step_tools.py +157 -0
- holado_test/common/context/feature_context.py +79 -0
- holado_test/common/context/scenario_context.py +217 -0
- holado_test/common/context/step_context.py +66 -0
- holado_test/common/exceptions/undefined_step_exception.py +21 -0
- holado_test/scenario/step_tools.py +523 -0
- holado_test/scenario/tester_tools.py +52 -0
- holado_test/test_config.py +26 -0
- holado_test/tests/behave/steps/__init__.py +18 -0
- holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
- holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
- holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
- holado_value/__init__.py +24 -0
- holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
- holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
- holado_value/common/tables/converters/value_table_converter.py +217 -0
- holado_value/common/tables/value_table.py +29 -0
- holado_value/common/tables/value_table_cell.py +67 -0
- holado_value/common/tables/value_table_manager.py +58 -0
- holado_value/common/tables/value_table_row.py +44 -0
- holado_value/common/tables/value_table_with_header.py +28 -0
- holado_value/common/tools/unique_value_manager.py +108 -0
- holado_value/common/tools/value.py +164 -0
- holado_value/common/tools/value_types.py +35 -0
- holado_value/tests/behave/steps/__init__.py +16 -0
- holado_value/tests/behave/steps/private/__init__.py +16 -0
- holado_ws/__init__.py +16 -0
- holado_ws/api/ws/TODO.txt +2 -0
- holado_ws/tests/behave/steps/__init__.py +16 -0
- holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
- holado_yaml/__init__.py +31 -0
- holado_yaml/tests/behave/steps/__init__.py +16 -0
- holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
- holado_yaml/yaml/yaml_manager.py +86 -0
- test_holado/Dockerfile_test_holado +82 -0
- test_holado/__init__.py +4 -0
- test_holado/__main__.py +25 -0
- test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
- test_holado/environment.py +42 -0
- test_holado/features/NonReg/api/REST.feature +21 -0
- test_holado/features/NonReg/api/gRPC.feature +122 -0
- test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
- test_holado/features/NonReg/common/system/commands.feature +43 -0
- test_holado/features/NonReg/common/system/system.feature +20 -0
- test_holado/features/NonReg/common/tables/table.feature +239 -0
- test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
- test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
- test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
- test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
- test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
- test_holado/features/NonReg/holado_python/convert.feature +20 -0
- test_holado/features/NonReg/holado_python/iterable.feature +61 -0
- test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
- test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
- test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
- test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
- test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
- test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
- test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
- test_holado/features/NonReg/ipc/bit_series.feature +131 -0
- test_holado/features/NonReg/ipc/json.feature +20 -0
- test_holado/features/NonReg/scenario/scenario.feature +139 -0
- test_holado/features/NonReg/test_steps/behave.feature +275 -0
- test_holado/features/NonReg/test_steps/common.feature +100 -0
- test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
- test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
- test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
- test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
- test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
- test_holado/features/NonReg/tools/sFTP.feature +25 -0
- test_holado/features/Test/logger.feature +28 -0
- test_holado/features/__init__.py +0 -0
- test_holado/logging.conf +41 -0
- test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
- test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
- test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
- test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
- test_holado/resources/scripts/list_tags.sh +2 -0
- test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
- test_holado/steps/__init__.py +0 -0
- test_holado/steps/private_steps.py +20 -0
- test_holado/steps/public_steps.py +23 -0
- test_holado/test_holado_session_context.py +43 -0
- test_holado/tools/django/README.txt +3 -0
- test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
- test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
- test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
- test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
- test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
- test_holado/tools/django/api_grpc/manage.py +27 -0
- test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
- test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
- test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
- test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
- test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
- test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
- test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
- test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
- test_holado/tools/django/api_rest/db.sqlite3 +0 -0
- test_holado/tools/django/api_rest/manage.py +22 -0
- holado-0.2.2.dist-info/RECORD +0 -17
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/WHEEL +0 -0
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
16
|
+
from holado_db.tools.db.query.base.query_builder import QueryBuilder
|
|
17
|
+
from holado_core.common.tools.tools import Tools
|
|
18
|
+
from holado_core.common.tools.comparators.comparator import CompareOperator
|
|
19
|
+
from holado_python.standard_library.typing import Typing
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
import pypika.functions
|
|
26
|
+
from pypika.queries import Table, Query
|
|
27
|
+
from pypika.terms import Parameter
|
|
28
|
+
with_pypika = True
|
|
29
|
+
except Exception as exc:
|
|
30
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
31
|
+
logger.debug(f"PyPika is not available for QueryBuilder. Initialization failed on error: {exc}")
|
|
32
|
+
with_pypika = False
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class PypikaQueryBuilder(QueryBuilder):
|
|
37
|
+
"""
|
|
38
|
+
Query builder for PyPika library.
|
|
39
|
+
"""
|
|
40
|
+
@classmethod
|
|
41
|
+
def is_available(cls):
|
|
42
|
+
return with_pypika
|
|
43
|
+
|
|
44
|
+
def __init__(self, name, db_client=None):
|
|
45
|
+
super().__init__(name, db_client)
|
|
46
|
+
|
|
47
|
+
def select(self, table_name, where_data: dict=None, sql_return="*"):
|
|
48
|
+
"""
|
|
49
|
+
Simple query & values builder of a select by filtering on given where data.
|
|
50
|
+
Parameter 'where_data' has to be a dictionary with keys equal to table column names.
|
|
51
|
+
"""
|
|
52
|
+
table = Table(table_name)
|
|
53
|
+
res = Query.from_(table)
|
|
54
|
+
values = ()
|
|
55
|
+
|
|
56
|
+
if sql_return == "count(*)":
|
|
57
|
+
res = res.select(pypika.functions.Count("*"))
|
|
58
|
+
elif isinstance(sql_return, list):
|
|
59
|
+
res = res.select(*sql_return)
|
|
60
|
+
else:
|
|
61
|
+
res = res.select(sql_return)
|
|
62
|
+
|
|
63
|
+
if where_data:
|
|
64
|
+
res, values = self.where(res, values, where_data)
|
|
65
|
+
|
|
66
|
+
return res, values
|
|
67
|
+
|
|
68
|
+
def insert(self, table_name, data: dict):
|
|
69
|
+
"""
|
|
70
|
+
Simple query & values builder of an insert of given data.
|
|
71
|
+
Parameter 'data' has to be a dictionary with keys equal to table column names.
|
|
72
|
+
"""
|
|
73
|
+
col_names = tuple(sorted(data.keys()))
|
|
74
|
+
values = tuple((data[c] for c in col_names))
|
|
75
|
+
sql_placeholder = self.db_client._get_sql_placeholder()
|
|
76
|
+
|
|
77
|
+
values_placeholder = [Parameter(sql_placeholder)] * len(col_names)
|
|
78
|
+
res = Query.into(table_name).columns(*col_names).insert(*values_placeholder)
|
|
79
|
+
|
|
80
|
+
return res, values
|
|
81
|
+
|
|
82
|
+
def update(self, table_name, data: dict, where_data: dict):
|
|
83
|
+
"""
|
|
84
|
+
Simple query & values builder of an update of given data.
|
|
85
|
+
Parameters 'data' and 'where_data' have to be dictionaries with keys equal to table column names.
|
|
86
|
+
"""
|
|
87
|
+
col_names = tuple(sorted(data.keys()))
|
|
88
|
+
values = tuple((data[c] for c in col_names))
|
|
89
|
+
sql_placeholder = self.db_client._get_sql_placeholder()
|
|
90
|
+
|
|
91
|
+
table = Table(table_name)
|
|
92
|
+
res = Query.update(table)
|
|
93
|
+
for c in col_names:
|
|
94
|
+
res = res.set(c, Parameter(sql_placeholder))
|
|
95
|
+
|
|
96
|
+
if where_data:
|
|
97
|
+
res, values = self.where(res, values, where_data)
|
|
98
|
+
|
|
99
|
+
return res, values
|
|
100
|
+
|
|
101
|
+
def delete(self, table_name, where_data: dict=None):
|
|
102
|
+
"""
|
|
103
|
+
Simple query & values builder of a delete by filtering on given where data.
|
|
104
|
+
Parameter 'where_data' has to be a dictionary with keys equal to table column names.
|
|
105
|
+
"""
|
|
106
|
+
table = Table(table_name)
|
|
107
|
+
res = Query.from_(table).delete()
|
|
108
|
+
values = ()
|
|
109
|
+
|
|
110
|
+
if where_data:
|
|
111
|
+
res, values = self.where(res, values, where_data)
|
|
112
|
+
|
|
113
|
+
return res, values
|
|
114
|
+
|
|
115
|
+
def where(self, query, values, where_data: dict):
|
|
116
|
+
col_names = tuple(sorted(where_data.keys()))
|
|
117
|
+
where_values = tuple((where_data[c] for c in col_names))
|
|
118
|
+
sql_placeholder = self.db_client._get_sql_placeholder()
|
|
119
|
+
|
|
120
|
+
res = query
|
|
121
|
+
table = self.__get_table(query)
|
|
122
|
+
for c in col_names:
|
|
123
|
+
res = res.where(getattr(table, c) == Parameter(sql_placeholder))
|
|
124
|
+
|
|
125
|
+
if values is not None:
|
|
126
|
+
values = (*values, *where_values)
|
|
127
|
+
else:
|
|
128
|
+
values = where_values
|
|
129
|
+
return res, values
|
|
130
|
+
|
|
131
|
+
def where_compare(self, query, values, field_name, operator:CompareOperator, value):
|
|
132
|
+
table = self.__get_table(query)
|
|
133
|
+
sql_placeholder = self.db_client._get_sql_placeholder()
|
|
134
|
+
|
|
135
|
+
if operator == CompareOperator.Different:
|
|
136
|
+
res = query.where(getattr(table, field_name) != Parameter(sql_placeholder))
|
|
137
|
+
elif operator == CompareOperator.Equal:
|
|
138
|
+
res = query.where(getattr(table, field_name) == Parameter(sql_placeholder))
|
|
139
|
+
elif operator == CompareOperator.Inferior:
|
|
140
|
+
res = query.where(getattr(table, field_name) < Parameter(sql_placeholder))
|
|
141
|
+
elif operator == CompareOperator.InferiorOrEqual:
|
|
142
|
+
res = query.where(getattr(table, field_name) <= Parameter(sql_placeholder))
|
|
143
|
+
elif operator == CompareOperator.Superior:
|
|
144
|
+
res = query.where(getattr(table, field_name) > Parameter(sql_placeholder))
|
|
145
|
+
elif operator == CompareOperator.SuperiorOrEqual:
|
|
146
|
+
res = query.where(getattr(table, field_name) >= Parameter(sql_placeholder))
|
|
147
|
+
else:
|
|
148
|
+
raise TechnicalException(f"Unmanaged compare operator {operator}")
|
|
149
|
+
|
|
150
|
+
if values is not None:
|
|
151
|
+
values = (*values, value)
|
|
152
|
+
else:
|
|
153
|
+
values = (value)
|
|
154
|
+
return res, values
|
|
155
|
+
|
|
156
|
+
def where_in(self, query, values, field_name, field_values, not_in=False):
|
|
157
|
+
table = self.__get_table(query)
|
|
158
|
+
if not_in:
|
|
159
|
+
res = query.where(getattr(table, field_name).notin(field_values))
|
|
160
|
+
else:
|
|
161
|
+
res = query.where(getattr(table, field_name).isin(field_values))
|
|
162
|
+
return res, values
|
|
163
|
+
|
|
164
|
+
def where_json_value(self, query, values, field_name, key, value, as_text_value=False):
|
|
165
|
+
table = self.__get_table(query)
|
|
166
|
+
sql_placeholder = self.db_client._get_sql_placeholder()
|
|
167
|
+
|
|
168
|
+
if as_text_value:
|
|
169
|
+
res = query.where(getattr(table, field_name).get_text_value(key) == Parameter(sql_placeholder))
|
|
170
|
+
else:
|
|
171
|
+
res = query.where(getattr(table, field_name).get_json_value(key) == Parameter(sql_placeholder))
|
|
172
|
+
|
|
173
|
+
if values is not None:
|
|
174
|
+
values = (*values, value)
|
|
175
|
+
else:
|
|
176
|
+
values = (value)
|
|
177
|
+
return res, values
|
|
178
|
+
|
|
179
|
+
def to_sql(self, query):
|
|
180
|
+
if query.__module__.startswith('pypika'):
|
|
181
|
+
return query.get_sql()
|
|
182
|
+
else:
|
|
183
|
+
raise TechnicalException(f"Unmanaged query of type {Typing.get_object_class_fullname(query)}")
|
|
184
|
+
|
|
185
|
+
def __get_table(self, query):
|
|
186
|
+
if query._from is not None and len(query._from) > 0:
|
|
187
|
+
return query._from[0]
|
|
188
|
+
elif query._insert_table is not None:
|
|
189
|
+
return query._insert_table
|
|
190
|
+
elif query._update_table is not None:
|
|
191
|
+
return query._update_table
|
|
192
|
+
else:
|
|
193
|
+
raise TechnicalException(f"Failed to extract table from query [{query}]: {Tools.represent_object(query)}")
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
16
|
+
from holado_core.common.tools.tools import Tools
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class QueryManager():
|
|
24
|
+
"""
|
|
25
|
+
Manage Query builders, agnostic to managed libraries.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, name):
|
|
29
|
+
self.__name = name if name else "QueryManager"
|
|
30
|
+
|
|
31
|
+
self.__builder_new_func_by_type = {}
|
|
32
|
+
self.__default_builder_type = None
|
|
33
|
+
|
|
34
|
+
def initialize(self):
|
|
35
|
+
from holado_db.tools.db.query.pypika.pypika_query_builder import PypikaQueryBuilder
|
|
36
|
+
if PypikaQueryBuilder.is_available():
|
|
37
|
+
self.register_query_builder("pypika", PypikaQueryBuilder)
|
|
38
|
+
self.__default_builder_type = "pypika"
|
|
39
|
+
else:
|
|
40
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
41
|
+
logger.debug("PyPika package is not installed, this type of Query builder is not available")
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def name(self):
|
|
45
|
+
return self.__name
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def default_builder_type(self):
|
|
49
|
+
return self.__default_builder_type
|
|
50
|
+
|
|
51
|
+
@default_builder_type.setter
|
|
52
|
+
def default_builder_type(self, builder_type):
|
|
53
|
+
self.__default_builder_type = builder_type
|
|
54
|
+
|
|
55
|
+
def register_query_builder(self, builder_type, new_builder_func):
|
|
56
|
+
self.__builder_new_func_by_type[builder_type] = new_builder_func
|
|
57
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
58
|
+
logger.debug(f"Registered Query builder type '{builder_type}'")
|
|
59
|
+
|
|
60
|
+
def new_default_query_builder(self, name, db_client):
|
|
61
|
+
if self.__default_builder_type is None:
|
|
62
|
+
raise TechnicalException(f"Default query builder type is not defined. Registered query builders: {list(self.__builder_new_func_by_type.keys())}")
|
|
63
|
+
return self.new_query_builder(name, self.__default_builder_type, db_client)
|
|
64
|
+
|
|
65
|
+
def new_query_builder(self, name, builder_type, db_client):
|
|
66
|
+
if builder_type in self.__builder_new_func_by_type:
|
|
67
|
+
try:
|
|
68
|
+
res = self.__builder_new_func_by_type[builder_type](name, db_client)
|
|
69
|
+
except Exception as exc:
|
|
70
|
+
raise TechnicalException(f"Failed to create Query builder for builder type '{builder_type}'") from exc
|
|
71
|
+
else:
|
|
72
|
+
raise TechnicalException(f"Unmanaged Query builder type '{builder_type}'")
|
|
73
|
+
return res
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def dependencies():
|
|
17
|
+
return None
|
|
18
|
+
|
|
19
|
+
def register():
|
|
20
|
+
from holado.common.context.session_context import SessionContext
|
|
21
|
+
|
|
22
|
+
from holado_docker.sdk.docker.docker_client import DockerClient
|
|
23
|
+
if DockerClient.is_available():
|
|
24
|
+
SessionContext.instance().services.register_service_type("docker_client", DockerClient)
|
|
25
|
+
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
15
|
+
import time
|
|
16
|
+
import logging
|
|
17
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
18
|
+
from holado.common.handlers.object import DeleteableObject
|
|
19
|
+
from holado_core.common.tools.tools import Tools
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
import docker
|
|
25
|
+
with_docker = True
|
|
26
|
+
except Exception as exc:
|
|
27
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
28
|
+
logger.debug(f"DockerClient is not available. Initialization failed on error: {exc}")
|
|
29
|
+
with_docker = False
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class DockerClient(object):
|
|
33
|
+
@classmethod
|
|
34
|
+
def is_available(cls):
|
|
35
|
+
return with_docker
|
|
36
|
+
|
|
37
|
+
def __init__(self):
|
|
38
|
+
self.__client = docker.from_env()
|
|
39
|
+
self.__containers = {}
|
|
40
|
+
self.__volumes = {}
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def client(self):
|
|
44
|
+
return self.__client
|
|
45
|
+
|
|
46
|
+
def has_container(self, name, in_list = True):
|
|
47
|
+
# Note: Even if name exists in __containers, it is possible that the container has been removed
|
|
48
|
+
if in_list:
|
|
49
|
+
c = self.__get_container_from_list(name)
|
|
50
|
+
res = c is not None
|
|
51
|
+
else:
|
|
52
|
+
res = name in self.__containers
|
|
53
|
+
return res
|
|
54
|
+
|
|
55
|
+
def get_container(self, name):
|
|
56
|
+
if name not in self.__containers:
|
|
57
|
+
c = self.__get_container_from_list(name)
|
|
58
|
+
if c:
|
|
59
|
+
self.__containers[name] = DockerContainer(self, c)
|
|
60
|
+
return self.__containers.get(name)
|
|
61
|
+
|
|
62
|
+
def get_all_container_names(self):
|
|
63
|
+
for _ in range(3):
|
|
64
|
+
try:
|
|
65
|
+
return [c.name for c in self.__client.containers.list(all=True)]
|
|
66
|
+
except docker.errors.NotFound:
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
def __get_container_from_list(self, name):
|
|
70
|
+
res = None
|
|
71
|
+
for _ in range(3):
|
|
72
|
+
try:
|
|
73
|
+
for c in self.__client.containers.list(all=True):
|
|
74
|
+
if c.name == name:
|
|
75
|
+
res = c
|
|
76
|
+
break
|
|
77
|
+
except docker.errors.NotFound:
|
|
78
|
+
pass
|
|
79
|
+
return res
|
|
80
|
+
|
|
81
|
+
def has_volume(self, name, in_list = False):
|
|
82
|
+
res = name in self.__volumes
|
|
83
|
+
if not res and in_list:
|
|
84
|
+
v = self.__get_volume_from_list(name)
|
|
85
|
+
res = v is not None
|
|
86
|
+
return res
|
|
87
|
+
|
|
88
|
+
def get_volume(self, name):
|
|
89
|
+
if name not in self.__volumes:
|
|
90
|
+
v = self.__get_volume_from_list(name)
|
|
91
|
+
if v:
|
|
92
|
+
self.__volumes[name] = DockerVolume(v)
|
|
93
|
+
return self.__volumes.get(name)
|
|
94
|
+
|
|
95
|
+
def get_all_volume_names(self):
|
|
96
|
+
return [v.name for v in self.__client.volumes.list()]
|
|
97
|
+
|
|
98
|
+
def __get_volume_from_list(self, name):
|
|
99
|
+
res = None
|
|
100
|
+
for v in self.__client.volumes.list():
|
|
101
|
+
if v.name == name:
|
|
102
|
+
res = v
|
|
103
|
+
break
|
|
104
|
+
return res
|
|
105
|
+
|
|
106
|
+
def run_container(self, name, image, remove_existing=False, wait_running=True, auto_stop=True, **kwargs):
|
|
107
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
108
|
+
logger.debug(f"Running docker container '{name}' with image '{image}' and arguments {kwargs}{', and waiting running status' if wait_running else ''}")
|
|
109
|
+
|
|
110
|
+
# Manage remove if already existing
|
|
111
|
+
cont = self.get_container(name)
|
|
112
|
+
if cont:
|
|
113
|
+
if remove_existing:
|
|
114
|
+
if cont.status == "running":
|
|
115
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
116
|
+
logger.debug(f"Docker container '{name}' is running, stopping it before remove")
|
|
117
|
+
self.stop_container(name)
|
|
118
|
+
|
|
119
|
+
if self.has_container(name): # After stop, container is able to be automatically removed depending on its run parameters
|
|
120
|
+
self.remove_container(name)
|
|
121
|
+
else:
|
|
122
|
+
logger.info(f"Docker container '{name}' is already running")
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
# Run container
|
|
126
|
+
c = self.__client.containers.run(image, name=name, detach=True, **kwargs)
|
|
127
|
+
container = DockerContainer(self, c)
|
|
128
|
+
self.__containers[name] = container
|
|
129
|
+
|
|
130
|
+
# Manage wait running status
|
|
131
|
+
if wait_running:
|
|
132
|
+
for _ in range(100):
|
|
133
|
+
time.sleep(1)
|
|
134
|
+
if container.status == "running":
|
|
135
|
+
break
|
|
136
|
+
if container.status != "running":
|
|
137
|
+
raise TechnicalException("Failed to run container of name '{}' (status: {})".format(name, container.status))
|
|
138
|
+
else:
|
|
139
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
140
|
+
logger.debug(f"Run docker container '{name}' with image '{image}' and arguments {kwargs}{', and wait running status' if wait_running else ''}")
|
|
141
|
+
|
|
142
|
+
# Set properties
|
|
143
|
+
container.auto_stop = auto_stop
|
|
144
|
+
|
|
145
|
+
return container
|
|
146
|
+
|
|
147
|
+
def start_container(self, name, wait_running=True, **kwargs):
|
|
148
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
149
|
+
logger.debug(f"Starting docker container '{name}' with arguments {kwargs}{', and waiting running status' if wait_running else ''}")
|
|
150
|
+
container = self.get_container(name)
|
|
151
|
+
if not container:
|
|
152
|
+
raise FunctionalException("Container of name '{}' doesn't exist")
|
|
153
|
+
|
|
154
|
+
container.start(**kwargs)
|
|
155
|
+
|
|
156
|
+
if wait_running:
|
|
157
|
+
for _ in range(120):
|
|
158
|
+
time.sleep(1)
|
|
159
|
+
if container.status == "running":
|
|
160
|
+
break
|
|
161
|
+
if container.status != "running":
|
|
162
|
+
raise TechnicalException("Failed to run container of name '{}' (status: {})".format(name, container.status))
|
|
163
|
+
else:
|
|
164
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
165
|
+
logger.debug(f"Started docker container '{name}' with arguments {kwargs}{', and waited running status' if wait_running else ''}")
|
|
166
|
+
|
|
167
|
+
def stop_container(self, name):
|
|
168
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
169
|
+
logger.debug(f"Stopping docker container of name '{name}'")
|
|
170
|
+
if name not in self.__containers:
|
|
171
|
+
raise FunctionalException("Unknown container of name '{}'".format(name))
|
|
172
|
+
elif self.__containers[name].status != "running":
|
|
173
|
+
raise FunctionalException("Container of name '{}' is not running (status: {})".format(name, self.__containers[name].status))
|
|
174
|
+
|
|
175
|
+
self.__containers[name].stop()
|
|
176
|
+
try:
|
|
177
|
+
self.__containers[name].wait()
|
|
178
|
+
except docker.errors.NotFound:
|
|
179
|
+
# This exception occurs on containers automatically removed on stop
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
if self.__containers[name].status == "running":
|
|
183
|
+
raise FunctionalException("Failed to stop container of name '{}' (status: {})".format(name, self.__containers[name].status))
|
|
184
|
+
else:
|
|
185
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
186
|
+
logger.debug(f"Stopped docker container of name '{name}'")
|
|
187
|
+
|
|
188
|
+
def remove_container(self, name):
|
|
189
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
190
|
+
logger.debug(f"Removing docker container of name '{name}'")
|
|
191
|
+
if not self.has_container(name):
|
|
192
|
+
raise FunctionalException(f"Container of name '{name}' doesn't exist")
|
|
193
|
+
|
|
194
|
+
del self.__containers[name]
|
|
195
|
+
self.client.api.remove_container(name)
|
|
196
|
+
|
|
197
|
+
if self.has_container(name):
|
|
198
|
+
raise FunctionalException(f"Failed to remove container of name '{name}'")
|
|
199
|
+
else:
|
|
200
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
201
|
+
logger.debug(f"Removed docker container of name '{name}'")
|
|
202
|
+
|
|
203
|
+
class DockerContainer(DeleteableObject):
|
|
204
|
+
def __init__(self, docker_client, container):
|
|
205
|
+
super().__init__(container.name)
|
|
206
|
+
|
|
207
|
+
self.__docker_client = docker_client
|
|
208
|
+
self.__container = container
|
|
209
|
+
self.__auto_stop = False
|
|
210
|
+
|
|
211
|
+
def _delete_object(self):
|
|
212
|
+
if self.auto_stop and self.__docker_client and self.__docker_client.has_container(self.name) \
|
|
213
|
+
and self.__docker_client.get_container(self.name).status == "running":
|
|
214
|
+
self.__docker_client.stop_container(self.name)
|
|
215
|
+
|
|
216
|
+
@property
|
|
217
|
+
def container(self):
|
|
218
|
+
self.__container
|
|
219
|
+
|
|
220
|
+
@property
|
|
221
|
+
def status(self):
|
|
222
|
+
try:
|
|
223
|
+
self.__container.reload()
|
|
224
|
+
except docker.errors.NotFound:
|
|
225
|
+
return "removed"
|
|
226
|
+
return self.__container.status
|
|
227
|
+
|
|
228
|
+
@property
|
|
229
|
+
def auto_stop(self):
|
|
230
|
+
self.__auto_stop
|
|
231
|
+
|
|
232
|
+
@auto_stop.setter
|
|
233
|
+
def auto_stop(self, auto_stop):
|
|
234
|
+
self.__auto_stop = auto_stop
|
|
235
|
+
|
|
236
|
+
def start(self, **kwargs):
|
|
237
|
+
return self.__container.start(**kwargs)
|
|
238
|
+
|
|
239
|
+
def stop(self, **kwargs):
|
|
240
|
+
return self.__container.stop(**kwargs)
|
|
241
|
+
|
|
242
|
+
def wait(self, **kwargs):
|
|
243
|
+
return self.__container.wait(**kwargs)
|
|
244
|
+
|
|
245
|
+
class DockerVolume(object):
|
|
246
|
+
def __init__(self, volume):
|
|
247
|
+
self.__volume = volume
|
|
248
|
+
|
|
249
|
+
@property
|
|
250
|
+
def volume(self):
|
|
251
|
+
self.__volume
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
def attributes(self):
|
|
255
|
+
self.__volume.reload()
|
|
256
|
+
return self.__volume.attrs
|
|
257
|
+
|
|
258
|
+
def get_attribute(self, attr_path):
|
|
259
|
+
names = attr_path.split('.')
|
|
260
|
+
attrs = self.attributes
|
|
261
|
+
res = attrs
|
|
262
|
+
for i, name in enumerate(names):
|
|
263
|
+
if name in res:
|
|
264
|
+
res = res[name]
|
|
265
|
+
else:
|
|
266
|
+
raise FunctionalException(f"Attribute '{'.'.join(names[:i+1])}' doesn't exist (requested attribute: '{attr_path}' ; volume attributes: {attrs})")
|
|
267
|
+
return res
|
|
268
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
from holado_docker.sdk.docker.docker_client import DockerClient
|
|
15
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
16
|
+
import logging
|
|
17
|
+
from holado_core.tools.abstracts.service import Service
|
|
18
|
+
from holado_system.system.command.command import CommandStates
|
|
19
|
+
from holado_core.common.tools.tools import Tools
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DockerService(Service):
|
|
25
|
+
@classmethod
|
|
26
|
+
def is_available(cls):
|
|
27
|
+
return DockerClient.is_available()
|
|
28
|
+
|
|
29
|
+
def __init__(self, name):
|
|
30
|
+
super().__init__(name)
|
|
31
|
+
self.__docker_client = None
|
|
32
|
+
self.__docker_container = None
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def status(self):
|
|
36
|
+
if self.__docker_container is not None and self.__docker_client.has_container(self.name):
|
|
37
|
+
status = self.__docker_container.status
|
|
38
|
+
if status in ["running", "paused", "restarting"]:
|
|
39
|
+
return CommandStates.Running
|
|
40
|
+
elif status == "exited":
|
|
41
|
+
result = self.__docker_container.wait(timeout=10)
|
|
42
|
+
error_code = result["StatusCode"]
|
|
43
|
+
if error_code == 0:
|
|
44
|
+
return CommandStates.Success
|
|
45
|
+
else:
|
|
46
|
+
return CommandStates.Error
|
|
47
|
+
else:
|
|
48
|
+
raise TechnicalException(f"Unmanaged docker status '{status}'")
|
|
49
|
+
else:
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
def run_as_docker(self, image, remove_existing=True, remove=True, auto_stop=True, **kwargs):
|
|
53
|
+
"""
|
|
54
|
+
Run the service as a docker image.
|
|
55
|
+
|
|
56
|
+
:param image: Image name
|
|
57
|
+
:param remove_existing: If true (default) and docker already exists, remove docker before creating a new one
|
|
58
|
+
:param remove: If true (default), remove the docker at stop
|
|
59
|
+
:param auto_stop: If true (default), automatically stop docker when docker instance is released
|
|
60
|
+
"""
|
|
61
|
+
self.__docker_client = DockerClient()
|
|
62
|
+
self.__docker_container = self.__docker_client.run_container(self.name, image, remove_existing=remove_existing, remove=remove, auto_stop=auto_stop, **kwargs)
|
|
63
|
+
|
|
64
|
+
def stop(self):
|
|
65
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
66
|
+
logger.debug(f"Stopping service '{self.name}'")
|
|
67
|
+
if self.__docker_container is not None:
|
|
68
|
+
if self.__docker_client.has_container(self.name) and self.__docker_client.get_container(self.name).status == "running":
|
|
69
|
+
self.__docker_client.stop_container(self.name)
|
|
70
|
+
else:
|
|
71
|
+
raise TechnicalException(f"Service '{self.name}' is not started")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
from .tools.docker_steps import *
|