holado 0.2.1__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/__init__.py +8 -4
- {holado-0.2.1.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.1.dist-info/RECORD +0 -17
- {holado-0.2.1.dist-info → holado-0.2.3.dist-info}/WHEEL +0 -0
- {holado-0.2.1.dist-info → holado-0.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,207 @@
|
|
|
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
|
+
import logging
|
|
16
|
+
import csv
|
|
17
|
+
from holado_core.common.tables.table_with_header import TableWithHeader
|
|
18
|
+
from holado_core.common.tables.table_row import TableRow
|
|
19
|
+
from holado.common.context.session_context import SessionContext
|
|
20
|
+
from holado_core.common.tables.table import Table
|
|
21
|
+
from holado_core.common.tables.table_manager import TableManager
|
|
22
|
+
from holado_data.data.generator.base import BaseGenerator
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class CsvManager():
|
|
30
|
+
# Default settings for CSV files: dialect Excel but with ';' delimiter
|
|
31
|
+
default_dialect = "excel"
|
|
32
|
+
default_delimiter = ";"
|
|
33
|
+
default_quotechar = None
|
|
34
|
+
default_quoting = None
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def __get_path_manager(cls):
|
|
38
|
+
return SessionContext.instance().path_manager
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def _get_csv_kwargs(cls, dialect, delimiter, quotechar, quoting):
|
|
42
|
+
csv_kwargs = {}
|
|
43
|
+
|
|
44
|
+
if dialect is not None:
|
|
45
|
+
csv_kwargs['dialect'] = dialect
|
|
46
|
+
elif cls.default_dialect is not None:
|
|
47
|
+
csv_kwargs['dialect'] = cls.default_dialect
|
|
48
|
+
|
|
49
|
+
if delimiter is not None:
|
|
50
|
+
csv_kwargs['delimiter'] = delimiter
|
|
51
|
+
elif cls.default_delimiter is not None:
|
|
52
|
+
csv_kwargs['delimiter'] = cls.default_delimiter
|
|
53
|
+
|
|
54
|
+
if quotechar is not None:
|
|
55
|
+
csv_kwargs['quotechar'] = quotechar
|
|
56
|
+
elif cls.default_quotechar is not None:
|
|
57
|
+
csv_kwargs['quotechar'] = cls.default_quotechar
|
|
58
|
+
|
|
59
|
+
if quoting is not None:
|
|
60
|
+
csv_kwargs['quoting'] = quoting
|
|
61
|
+
elif cls.default_quoting is not None:
|
|
62
|
+
csv_kwargs['quoting'] = cls.default_quoting
|
|
63
|
+
|
|
64
|
+
return csv_kwargs
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def table_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None, with_header=True):
|
|
68
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
69
|
+
|
|
70
|
+
with open(path, 'r', encoding=encoding) as fin:
|
|
71
|
+
if with_header:
|
|
72
|
+
dr = csv.DictReader(fin, **csv_kwargs)
|
|
73
|
+
|
|
74
|
+
res = TableWithHeader()
|
|
75
|
+
res.header = TableRow(cells_content=dr.fieldnames)
|
|
76
|
+
|
|
77
|
+
for row in dr:
|
|
78
|
+
nrow=dict(row)
|
|
79
|
+
res.add_row(contents_by_colname=nrow)
|
|
80
|
+
else:
|
|
81
|
+
reader = csv.reader(fin, **csv_kwargs)
|
|
82
|
+
|
|
83
|
+
res = Table()
|
|
84
|
+
for row in reader:
|
|
85
|
+
res.add_row(cells_content=row)
|
|
86
|
+
|
|
87
|
+
return res
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def dict_list_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
91
|
+
dg = cls.dict_generator_with_content_of_CSV_file(path, encoding, dialect, delimiter, quotechar, quoting)
|
|
92
|
+
return [d for d in dg]
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def dict_generator_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
96
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
97
|
+
|
|
98
|
+
class DictCSVGenerator(BaseGenerator):
|
|
99
|
+
def __init__(self, path, encoding, csv_kwargs):
|
|
100
|
+
super().__init__(name="dict CSV generator")
|
|
101
|
+
|
|
102
|
+
self.__path = path
|
|
103
|
+
self.__encoding = encoding
|
|
104
|
+
self.__csv_kwargs = csv_kwargs
|
|
105
|
+
|
|
106
|
+
self.__fin = None
|
|
107
|
+
self.__dict_reader = None
|
|
108
|
+
|
|
109
|
+
def __open_file_if_needed(self):
|
|
110
|
+
if self.__fin is None:
|
|
111
|
+
self.__fin = open(self.__path, 'r', encoding=self.__encoding)
|
|
112
|
+
self.__dict_reader = csv.DictReader(self.__fin, **self.__csv_kwargs)
|
|
113
|
+
|
|
114
|
+
def __close_file(self):
|
|
115
|
+
self.__dict_reader = None
|
|
116
|
+
self.__fin.close()
|
|
117
|
+
self.__fin = None
|
|
118
|
+
|
|
119
|
+
def __next__(self):
|
|
120
|
+
self.__open_file_if_needed()
|
|
121
|
+
try:
|
|
122
|
+
return dict(next(self.__dict_reader))
|
|
123
|
+
except StopIteration as exc:
|
|
124
|
+
self.__close_file()
|
|
125
|
+
raise exc
|
|
126
|
+
|
|
127
|
+
return DictCSVGenerator(path, encoding, csv_kwargs)
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def tuple_list_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
131
|
+
tg = cls.tuple_generator_with_content_of_CSV_file(path, encoding, dialect, delimiter, quotechar, quoting)
|
|
132
|
+
return [t for t in tg]
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
def tuple_generator_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
136
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
137
|
+
|
|
138
|
+
class TupleCSVGenerator(BaseGenerator):
|
|
139
|
+
def __init__(self, path, encoding, csv_kwargs):
|
|
140
|
+
super().__init__(name="tuple CSV generator")
|
|
141
|
+
|
|
142
|
+
self.__path = path
|
|
143
|
+
self.__encoding = encoding
|
|
144
|
+
self.__csv_kwargs = csv_kwargs
|
|
145
|
+
|
|
146
|
+
self.__fin = None
|
|
147
|
+
self.__reader = None
|
|
148
|
+
|
|
149
|
+
def __open_file_if_needed(self):
|
|
150
|
+
if self.__fin is None:
|
|
151
|
+
self.__fin = open(self.__path, 'r', encoding=self.__encoding)
|
|
152
|
+
self.__reader = csv.reader(self.__fin, **self.__csv_kwargs)
|
|
153
|
+
|
|
154
|
+
def __close_file(self):
|
|
155
|
+
self.__reader = None
|
|
156
|
+
self.__fin.close()
|
|
157
|
+
self.__fin = None
|
|
158
|
+
|
|
159
|
+
def __next__(self):
|
|
160
|
+
self.__open_file_if_needed()
|
|
161
|
+
try:
|
|
162
|
+
return tuple(next(self.__reader))
|
|
163
|
+
except StopIteration as exc:
|
|
164
|
+
self.__close_file()
|
|
165
|
+
raise exc
|
|
166
|
+
|
|
167
|
+
return TupleCSVGenerator(path, encoding, csv_kwargs)
|
|
168
|
+
|
|
169
|
+
@classmethod
|
|
170
|
+
def create_csv_file(cls, path, table, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
171
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
172
|
+
|
|
173
|
+
cls.__get_path_manager().makedirs(path)
|
|
174
|
+
|
|
175
|
+
with open(path, 'w', encoding=encoding) as fout:
|
|
176
|
+
if TableManager.is_table_with_header(table):
|
|
177
|
+
fieldnames = table.header.cells_content
|
|
178
|
+
dw = csv.DictWriter(fout, fieldnames=fieldnames, **csv_kwargs)
|
|
179
|
+
|
|
180
|
+
dw.writeheader()
|
|
181
|
+
for row in table.rows:
|
|
182
|
+
rowdict = {fieldnames[i]:row[i].string_content for i in range(len(fieldnames))}
|
|
183
|
+
dw.writerow(rowdict)
|
|
184
|
+
else:
|
|
185
|
+
writer = csv.writer(fout, **csv_kwargs)
|
|
186
|
+
for row in table.rows:
|
|
187
|
+
cells_content = [c.string_content for c in row]
|
|
188
|
+
writer.writerow(cells_content)
|
|
189
|
+
|
|
190
|
+
@classmethod
|
|
191
|
+
def merge_csv(cls, input_paths, output_path=None, sort_column=None, with_header=True):
|
|
192
|
+
input_tables = [cls.table_with_content_of_CSV_file(ip, with_header=with_header) for ip in input_paths]
|
|
193
|
+
|
|
194
|
+
# Merge tables
|
|
195
|
+
output_table = input_tables[0]
|
|
196
|
+
for i in range(1, len(input_tables)):
|
|
197
|
+
output_table.extend(input_tables[i])
|
|
198
|
+
|
|
199
|
+
# Sort rows
|
|
200
|
+
if sort_column is not None:
|
|
201
|
+
output_table.sort(names=[sort_column])
|
|
202
|
+
|
|
203
|
+
if output_path is not None:
|
|
204
|
+
cls.create_csv_file(output_path, output_table)
|
|
205
|
+
else:
|
|
206
|
+
return output_table
|
|
207
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
import logging
|
|
16
|
+
import hashlib
|
|
17
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class HashTools(object):
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def code(cls, content, code_size=None, prefix=None):
|
|
28
|
+
hex_size = code_size
|
|
29
|
+
if hex_size is not None:
|
|
30
|
+
if prefix is not None:
|
|
31
|
+
hex_size = hex_size - len(prefix)
|
|
32
|
+
hex_size = hex_size // 2 * 2
|
|
33
|
+
|
|
34
|
+
res = cls.hexblake2(content, hex_size=hex_size)
|
|
35
|
+
|
|
36
|
+
if prefix is not None:
|
|
37
|
+
res = prefix + res
|
|
38
|
+
|
|
39
|
+
return res
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def hexmd5(cls, content):
|
|
43
|
+
hash_obj = hashlib.md5()
|
|
44
|
+
cls._update_hash(hash_obj, content)
|
|
45
|
+
return hash_obj.hexdigest()
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def hexblake2(cls, content, hex_size=None, **hash_kwargs):
|
|
49
|
+
if hex_size is not None:
|
|
50
|
+
if isinstance(hex_size, int):
|
|
51
|
+
digest_size = hex_size // 2
|
|
52
|
+
else:
|
|
53
|
+
raise TechnicalException(f"Parameter hex_size must be an integer")
|
|
54
|
+
hash_kwargs['digest_size'] = digest_size
|
|
55
|
+
|
|
56
|
+
hash_obj = hashlib.blake2b(**hash_kwargs)
|
|
57
|
+
cls._update_hash(hash_obj, content)
|
|
58
|
+
return hash_obj.hexdigest()
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def _update_hash(cls, hash_obj, content):
|
|
62
|
+
# Manage list separately for memory purpose
|
|
63
|
+
done = False
|
|
64
|
+
if not isinstance(content, str):
|
|
65
|
+
try:
|
|
66
|
+
for cont in content:
|
|
67
|
+
if type(cont) != bytes:
|
|
68
|
+
cont = cont.encode('utf-8')
|
|
69
|
+
hash_obj.update(cont)
|
|
70
|
+
done = True
|
|
71
|
+
except TypeError:
|
|
72
|
+
done = False
|
|
73
|
+
|
|
74
|
+
if not done:
|
|
75
|
+
if type(content) != bytes:
|
|
76
|
+
content = content.encode('utf-8')
|
|
77
|
+
hash_obj.update(content)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
import logging
|
|
16
|
+
import typing
|
|
17
|
+
import multiprocessing.context
|
|
18
|
+
import multiprocessing.queues
|
|
19
|
+
from holado_python.standard_library.queue import IterableQueue
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class IterableJoinableQueue(multiprocessing.queues.JoinableQueue, typing.Iterable):
|
|
25
|
+
|
|
26
|
+
__sentinel = IterableQueue.Sentinel()
|
|
27
|
+
|
|
28
|
+
def __init__(self, maxsize=0, block_on_get=True, block_on_get_timeout=None, block_on_put=True, block_on_put_timeout=None):
|
|
29
|
+
super().__init__(maxsize if maxsize else 0, ctx=multiprocessing.context._default_context.get_context())
|
|
30
|
+
self.__block_on_get = block_on_get if block_on_get is not None else True
|
|
31
|
+
self.__block_on_get_timeout = block_on_get_timeout
|
|
32
|
+
self.__block_on_put = block_on_put if block_on_put is not None else True
|
|
33
|
+
self.__block_on_put_timeout = block_on_put_timeout
|
|
34
|
+
|
|
35
|
+
def __iter__(self):
|
|
36
|
+
return iter(self.get, self.__sentinel)
|
|
37
|
+
|
|
38
|
+
def __len__(self):
|
|
39
|
+
return self.qsize()
|
|
40
|
+
|
|
41
|
+
def close(self):
|
|
42
|
+
self.put(self.__sentinel)
|
|
43
|
+
|
|
44
|
+
def get(self):
|
|
45
|
+
res = super().get(block=self.__block_on_get, timeout=self.__block_on_get_timeout)
|
|
46
|
+
|
|
47
|
+
# Put again the sentinel in case of multiple readers
|
|
48
|
+
if self.is_sentinel(res):
|
|
49
|
+
self.put(res)
|
|
50
|
+
|
|
51
|
+
return res
|
|
52
|
+
|
|
53
|
+
def put(self, item):
|
|
54
|
+
return super().put(item, block=self.__block_on_put, timeout=self.__block_on_put_timeout)
|
|
55
|
+
|
|
56
|
+
def is_sentinel(self, item):
|
|
57
|
+
return item == self.__sentinel
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
import logging
|
|
16
|
+
import queue
|
|
17
|
+
import typing
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class IterableQueue(queue.Queue, typing.Iterable):
|
|
23
|
+
|
|
24
|
+
class Sentinel(object):
|
|
25
|
+
def __eq__(self, __o: object) -> bool:
|
|
26
|
+
return isinstance(__o, IterableQueue.Sentinel)
|
|
27
|
+
|
|
28
|
+
__sentinel = Sentinel()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def __init__(self, maxsize=0, block_on_get=True, block_on_get_timeout=None, block_on_put=True, block_on_put_timeout=None):
|
|
32
|
+
super().__init__(maxsize if maxsize else 0)
|
|
33
|
+
self.__block_on_get = block_on_get if block_on_get is not None else True
|
|
34
|
+
self.__block_on_get_timeout = block_on_get_timeout
|
|
35
|
+
self.__block_on_put = block_on_put if block_on_put is not None else True
|
|
36
|
+
self.__block_on_put_timeout = block_on_put_timeout
|
|
37
|
+
|
|
38
|
+
def __iter__(self):
|
|
39
|
+
return iter(self.get, self.__sentinel)
|
|
40
|
+
|
|
41
|
+
def __len__(self):
|
|
42
|
+
return self.qsize()
|
|
43
|
+
|
|
44
|
+
def close(self):
|
|
45
|
+
self.put(self.__sentinel)
|
|
46
|
+
|
|
47
|
+
def get(self):
|
|
48
|
+
res = super().get(block=self.__block_on_get, timeout=self.__block_on_get_timeout)
|
|
49
|
+
|
|
50
|
+
# Put again the sentinel in case of multiple readers
|
|
51
|
+
if self.is_sentinel(res):
|
|
52
|
+
self.put(res)
|
|
53
|
+
|
|
54
|
+
return res
|
|
55
|
+
|
|
56
|
+
def put(self, item):
|
|
57
|
+
return super().put(item, block=self.__block_on_put, timeout=self.__block_on_put_timeout)
|
|
58
|
+
|
|
59
|
+
def is_sentinel(self, item):
|
|
60
|
+
return item == self.__sentinel
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class IterableLifoQueue(IterableQueue):
|
|
64
|
+
'''Copyt of implementation of queue.LifoQueue but inheriting of IterableQueue.'''
|
|
65
|
+
|
|
66
|
+
def _init(self, maxsize):
|
|
67
|
+
self.queue = []
|
|
68
|
+
|
|
69
|
+
def _qsize(self):
|
|
70
|
+
return len(self.queue)
|
|
71
|
+
|
|
72
|
+
def _put(self, item):
|
|
73
|
+
self.queue.append(item)
|
|
74
|
+
|
|
75
|
+
def _get(self):
|
|
76
|
+
return self.queue.pop()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
+
import socket
|
|
16
|
+
from holado_python.standard_library.socket.socket import SocketClient, SocketServer
|
|
17
|
+
import abc
|
|
18
|
+
from holado_multitask.multithreading.loopfunctionthreaded import LoopFunctionThreaded
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
##########################################################################
|
|
24
|
+
## Clients
|
|
25
|
+
##########################################################################
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class BlockingSocketClient(SocketClient):
|
|
29
|
+
"""
|
|
30
|
+
Base class for blocking socket client.
|
|
31
|
+
"""
|
|
32
|
+
__metaclass__ = abc.ABCMeta
|
|
33
|
+
|
|
34
|
+
def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
|
|
35
|
+
super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TCPBlockingSocketClient(BlockingSocketClient):
|
|
39
|
+
"""
|
|
40
|
+
TCP socket client.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
|
|
44
|
+
super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
|
|
45
|
+
|
|
46
|
+
def create_ipv4_socket(self, host, port, **kwargs):
|
|
47
|
+
ssl_context, kwargs = self._new_ssl_context_if_required(**kwargs)
|
|
48
|
+
|
|
49
|
+
sock = socket.create_connection((host, port), **kwargs)
|
|
50
|
+
|
|
51
|
+
if ssl_context:
|
|
52
|
+
sock = ssl_context.wrap_socket(sock, server_hostname=host, do_handshake_on_connect=False)
|
|
53
|
+
# sock = ssl_context.wrap_socket(sock, server_hostname=host)
|
|
54
|
+
self._set_internal_socket(sock)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
##########################################################################
|
|
60
|
+
## Servers
|
|
61
|
+
##########################################################################
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class BlockingSocketServer(SocketServer):
|
|
65
|
+
"""
|
|
66
|
+
Base class for socket servers.
|
|
67
|
+
"""
|
|
68
|
+
__metaclass__ = abc.ABCMeta
|
|
69
|
+
|
|
70
|
+
def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
|
|
71
|
+
super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
|
|
72
|
+
|
|
73
|
+
self.__start_thread = None
|
|
74
|
+
|
|
75
|
+
def start(self, read_bufsize=1024, *, read_kwargs=None, write_kwargs=None):
|
|
76
|
+
"""Start server to wait a connection, and then listen data, process data, and send result.
|
|
77
|
+
Note: current implementation is simple and supports only one connection at a time.
|
|
78
|
+
"""
|
|
79
|
+
kwargs = {'read_bufsize':read_bufsize, 'read_kwargs':read_kwargs, 'write_kwargs':write_kwargs}
|
|
80
|
+
self.__start_thread = LoopFunctionThreaded(self.wait_and_process_connection, kwargs=kwargs, register_thread=True, delay_before_run_sec=None)
|
|
81
|
+
self.__start_thread.start()
|
|
82
|
+
|
|
83
|
+
def stop(self):
|
|
84
|
+
if self.__start_thread is not None:
|
|
85
|
+
self.__start_thread.interrupt()
|
|
86
|
+
self.__start_thread.join()
|
|
87
|
+
self.__start_thread = None
|
|
88
|
+
|
|
89
|
+
def wait_and_process_connection(self, read_bufsize=1024, *, read_kwargs=None, write_kwargs=None):
|
|
90
|
+
"""Wait a connection, and then listen data, process data, and send result.
|
|
91
|
+
Note: current implementation is simple and supports only one connection at a time.
|
|
92
|
+
"""
|
|
93
|
+
read_kwargs = read_kwargs if read_kwargs is not None else {}
|
|
94
|
+
write_kwargs = write_kwargs if write_kwargs is not None else {}
|
|
95
|
+
|
|
96
|
+
conn, _ = self.accept()
|
|
97
|
+
if logger.isEnabledFor(logging.DEBUG):
|
|
98
|
+
logger.debug(f"[{self.name}] New connection: {conn}")
|
|
99
|
+
with conn:
|
|
100
|
+
while True:
|
|
101
|
+
data = conn.read(read_bufsize, **read_kwargs)
|
|
102
|
+
if logger.isEnabledFor(logging.DEBUG):
|
|
103
|
+
logger.debug(f"[{self.name}] Received: {data}")
|
|
104
|
+
|
|
105
|
+
if not data:
|
|
106
|
+
break
|
|
107
|
+
result = self._process_data(data)
|
|
108
|
+
|
|
109
|
+
if logger.isEnabledFor(logging.DEBUG):
|
|
110
|
+
logger.debug(f"[{self.name}] Sending: {result}")
|
|
111
|
+
conn.write(result, **write_kwargs)
|
|
112
|
+
|
|
113
|
+
@abc.abstractmethod
|
|
114
|
+
def _process_data(self, data):
|
|
115
|
+
raise NotImplementedError()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class TCPBlockingSocketServer(BlockingSocketServer):
|
|
120
|
+
"""
|
|
121
|
+
TCP socket server
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
|
|
125
|
+
super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
|
|
126
|
+
|
|
127
|
+
def create_ipv4_socket(self, host, port, **kwargs):
|
|
128
|
+
ssl_context, kwargs = self._new_ssl_context_if_required(server_side=True, **kwargs)
|
|
129
|
+
|
|
130
|
+
sock = socket.create_server((host, port), **kwargs)
|
|
131
|
+
|
|
132
|
+
if ssl_context:
|
|
133
|
+
# sock = ssl_context.wrap_socket(sock, do_handshake_on_connect=False, server_side=True)
|
|
134
|
+
sock = ssl_context.wrap_socket(sock, server_side=True)
|
|
135
|
+
self._set_internal_socket(sock)
|
|
136
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
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_python.standard_library.socket.blocking_socket import TCPBlockingSocketServer
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class EchoTCPBlockingSocketServer(TCPBlockingSocketServer):
|
|
22
|
+
def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
|
|
23
|
+
super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
|
|
24
|
+
|
|
25
|
+
def _process_data(self, data):
|
|
26
|
+
return data
|
|
27
|
+
|
|
28
|
+
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
import abc
|
|
16
|
+
import selectors
|
|
17
|
+
from holado_python.standard_library.socket.non_blocking_socket import TCPNonBlockingSocketClient
|
|
18
|
+
import copy
|
|
19
|
+
import threading
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
##########################################################################
|
|
25
|
+
## Clients
|
|
26
|
+
##########################################################################
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class MessageTCPSocketClient(TCPNonBlockingSocketClient):
|
|
30
|
+
"""
|
|
31
|
+
Base class for blocking socket client.
|
|
32
|
+
"""
|
|
33
|
+
__metaclass__ = abc.ABCMeta
|
|
34
|
+
|
|
35
|
+
def __init__(self, separator=b'\n', *, name=None, create_ipv4_socket_kwargs=None):
|
|
36
|
+
super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
|
|
37
|
+
|
|
38
|
+
self.__separator = separator
|
|
39
|
+
self.__messages_lock = threading.Lock()
|
|
40
|
+
self.__messages = []
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def messages(self):
|
|
44
|
+
return self.__messages
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def nb_messages(self):
|
|
48
|
+
return len(self.__messages)
|
|
49
|
+
|
|
50
|
+
def _service_connection(self, key, mask, *, read_bufsize=1024, read_kwargs=None, write_kwargs=None):
|
|
51
|
+
# Read from socket & write in socket
|
|
52
|
+
super()._service_connection(key, mask, read_bufsize=read_bufsize, read_kwargs=read_kwargs, write_kwargs=write_kwargs)
|
|
53
|
+
|
|
54
|
+
# Extract messages from received data
|
|
55
|
+
if mask & selectors.EVENT_READ:
|
|
56
|
+
with self._data_lock:
|
|
57
|
+
while True:
|
|
58
|
+
ind = self._data.in_bytes.find(self.__separator)
|
|
59
|
+
if ind >=0:
|
|
60
|
+
msg = self._data.in_bytes[:ind]
|
|
61
|
+
self.__add_message(msg)
|
|
62
|
+
self._data.in_bytes = self._data.in_bytes[ind+len(self.__separator):]
|
|
63
|
+
else:
|
|
64
|
+
break
|
|
65
|
+
|
|
66
|
+
def __add_message(self, msg):
|
|
67
|
+
with self.__messages_lock:
|
|
68
|
+
self.__messages.append(msg)
|
|
69
|
+
|
|
70
|
+
def read_message(self):
|
|
71
|
+
res = None
|
|
72
|
+
with self.__messages_lock:
|
|
73
|
+
if len(self.__messages) > 0:
|
|
74
|
+
res = self.__messages.pop(0)
|
|
75
|
+
return res
|
|
76
|
+
|
|
77
|
+
def read_messages(self):
|
|
78
|
+
with self.__messages_lock:
|
|
79
|
+
res = copy.copy(self.__messages)
|
|
80
|
+
self.__messages.clear()
|
|
81
|
+
return res
|
|
82
|
+
|
|
83
|
+
def write_message(self, msg_bytes):
|
|
84
|
+
self.write(msg_bytes + self.__separator)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|