holado 0.13.22__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- holado/__init__.py +358 -0
- holado/common/__init__.py +25 -0
- holado/common/context/__init__.py +25 -0
- holado/common/context/context.py +248 -0
- holado/common/context/service_manager.py +262 -0
- holado/common/context/session_context.py +516 -0
- holado/common/handlers/__init__.py +19 -0
- holado/common/handlers/enums.py +41 -0
- holado/common/handlers/object.py +175 -0
- holado/common/handlers/undefined.py +55 -0
- holado/common/tools/__init__.py +19 -0
- holado/common/tools/gc_manager.py +155 -0
- holado/holado_config.py +45 -0
- holado-0.13.22.dist-info/METADATA +194 -0
- holado-0.13.22.dist-info/RECORD +698 -0
- holado-0.13.22.dist-info/WHEEL +4 -0
- holado-0.13.22.dist-info/licenses/LICENSE +21 -0
- holado_ais/__init__.py +33 -0
- holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
- holado_ais/ais/ais_manager.py +151 -0
- holado_ais/ais/ais_messages.py +356 -0
- holado_ais/ais/ais_payload.py +35 -0
- holado_ais/ais/enums.py +37 -0
- holado_ais/ais/patch_pyais.py +1174 -0
- holado_ais/tests/behave/steps/__init__.py +17 -0
- holado_ais/tests/behave/steps/ais/__init__.py +0 -0
- holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
- holado_ais/tests/behave/steps/ais/ais_messages_steps.py +237 -0
- holado_binary/__init__.py +17 -0
- holado_binary/ipc/binary.py +125 -0
- holado_binary/ipc/bit_series.py +307 -0
- holado_binary/tests/behave/steps/__init__.py +17 -0
- holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
- holado_binary/tests/behave/steps/ipc/bit_series_steps.py +132 -0
- holado_context/__init__.py +16 -0
- holado_context/tests/behave/steps/__init__.py +16 -0
- holado_context/tests/behave/steps/private/__init__.py +16 -0
- holado_context/tests/behave/steps/private/common/context_steps.py +68 -0
- holado_core/__init__.py +32 -0
- holado_core/common/__init__.py +0 -0
- holado_core/common/actors/actions.py +97 -0
- holado_core/common/actors/actor.py +226 -0
- holado_core/common/actors/element_actor.py +32 -0
- holado_core/common/actors/find_actor.py +106 -0
- holado_core/common/actors/tree_actor.py +32 -0
- holado_core/common/actors/verify_actions.py +69 -0
- holado_core/common/block/base.py +122 -0
- holado_core/common/block/block_manager.py +173 -0
- holado_core/common/block/block_method.py +46 -0
- holado_core/common/block/block_steps.py +37 -0
- holado_core/common/block/function.py +42 -0
- holado_core/common/block/scope_function.py +28 -0
- holado_core/common/block/scope_manager.py +238 -0
- holado_core/common/block/scope_steps.py +141 -0
- holado_core/common/criterias/and_criteria.py +61 -0
- holado_core/common/criterias/criteria.py +78 -0
- holado_core/common/criterias/or_criteria.py +64 -0
- holado_core/common/criterias/tools/criteria_context.py +20 -0
- holado_core/common/criterias/tools/criteria_parameters.py +18 -0
- holado_core/common/drivers/driver.py +153 -0
- holado_core/common/drivers/element_driver.py +30 -0
- holado_core/common/drivers/element_internal_api.py +239 -0
- holado_core/common/drivers/internal_api.py +40 -0
- holado_core/common/drivers/tree_driver.py +30 -0
- holado_core/common/drivers/tree_internal_api.py +176 -0
- holado_core/common/exceptions/__init__.py +0 -0
- holado_core/common/exceptions/element_exception.py +28 -0
- holado_core/common/exceptions/exceptions.py +24 -0
- holado_core/common/exceptions/functional_exception.py +21 -0
- holado_core/common/exceptions/holado_exception.py +25 -0
- holado_core/common/exceptions/technical_exception.py +27 -0
- holado_core/common/exceptions/timeout_exception.py +20 -0
- holado_core/common/exceptions/verify_exception.py +20 -0
- holado_core/common/finders/after_in_tree_finder.py +87 -0
- holado_core/common/finders/element_finder.py +60 -0
- holado_core/common/finders/else_finder.py +105 -0
- holado_core/common/finders/finder.py +478 -0
- holado_core/common/finders/or_finder.py +98 -0
- holado_core/common/finders/then_finder.py +157 -0
- holado_core/common/finders/tools/enums.py +30 -0
- holado_core/common/finders/tools/find_builder.py +118 -0
- holado_core/common/finders/tools/find_context.py +405 -0
- holado_core/common/finders/tools/find_info.py +27 -0
- holado_core/common/finders/tools/find_parameters.py +240 -0
- holado_core/common/finders/tools/find_updater.py +95 -0
- holado_core/common/finders/tools/finder_info.py +26 -0
- holado_core/common/finders/tree_finder.py +146 -0
- holado_core/common/handlers/__init__.py +0 -0
- holado_core/common/handlers/abstracts/base_redo.py +702 -0
- holado_core/common/handlers/abstracts/get_or_create.py +120 -0
- holado_core/common/handlers/element_holder.py +122 -0
- holado_core/common/handlers/enums.py +23 -0
- holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
- holado_core/common/handlers/features/resource_by_name.py +187 -0
- holado_core/common/handlers/features/resource_by_type.py +174 -0
- holado_core/common/handlers/redo.py +119 -0
- holado_core/common/handlers/wait.py +127 -0
- holado_core/common/inspectors/element_inspector.py +57 -0
- holado_core/common/inspectors/inspector.py +221 -0
- holado_core/common/inspectors/tools/inspect_builder.py +169 -0
- holado_core/common/inspectors/tools/inspect_context.py +69 -0
- holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
- holado_core/common/inspectors/tree_inspector.py +73 -0
- holado_core/common/resource/persisted_data_manager.py +113 -0
- holado_core/common/resource/persisted_method_to_call_manager.py +263 -0
- holado_core/common/resource/resource_manager.py +126 -0
- holado_core/common/resource/table_data_manager.py +110 -0
- holado_core/common/tables/__init__.py +1 -0
- holado_core/common/tables/comparators/__init__.py +0 -0
- holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
- holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
- holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/string_table_comparator.py +29 -0
- holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
- holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
- holado_core/common/tables/comparators/table_comparator.py +209 -0
- holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
- holado_core/common/tables/comparators/table_row_comparator.py +116 -0
- holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
- holado_core/common/tables/converters/__init__.py +0 -0
- holado_core/common/tables/converters/table_converter.py +233 -0
- holado_core/common/tables/enums.py +23 -0
- holado_core/common/tables/table.py +261 -0
- holado_core/common/tables/table_cell.py +126 -0
- holado_core/common/tables/table_manager.py +365 -0
- holado_core/common/tables/table_row.py +169 -0
- holado_core/common/tables/table_with_header.py +242 -0
- holado_core/common/tools/__init__.py +0 -0
- holado_core/common/tools/comparators/comparator.py +151 -0
- holado_core/common/tools/comparators/object_comparator.py +21 -0
- holado_core/common/tools/converters/converter.py +118 -0
- holado_core/common/tools/path_manager.py +238 -0
- holado_core/common/tools/string_tools.py +144 -0
- holado_core/common/tools/tools.py +197 -0
- holado_core/tests/behave/steps/__init__.py +20 -0
- holado_core/tests/behave/steps/common/__init__.py +0 -0
- holado_core/tests/behave/steps/common/common_steps.py +137 -0
- holado_core/tests/behave/steps/common/config_steps.py +42 -0
- holado_core/tests/behave/steps/common/resource_steps.py +62 -0
- holado_core/tests/behave/steps/common/tables_steps.py +560 -0
- holado_core/tools/__init__.py +0 -0
- holado_core/tools/abstracts/__init__.py +0 -0
- holado_core/tools/abstracts/blocking_command_service.py +64 -0
- holado_core/tools/abstracts/service.py +48 -0
- holado_crypto/__init__.py +31 -0
- holado_crypto/crypto/crypto.py +108 -0
- holado_crypto/crypto/key.py +92 -0
- holado_crypto/crypto/tcpbin.py +105 -0
- holado_crypto/crypto/transport/__init__.py +0 -0
- holado_crypto/crypto/transport/crc.py +40 -0
- holado_crypto/tests/behave/steps/__init__.py +18 -0
- holado_crypto/tests/behave/steps/crypto_steps.py +112 -0
- holado_crypto/tests/behave/steps/key_steps.py +82 -0
- holado_crypto/tests/behave/steps/tcpbin_steps.py +79 -0
- holado_data/__init__.py +31 -0
- holado_data/data/generator/base.py +93 -0
- holado_data/data/generator/generator_manager.py +27 -0
- holado_data/data/generator/python_generator.py +30 -0
- holado_data/tests/behave/steps/__init__.py +17 -0
- holado_data/tests/behave/steps/data/generator_steps.py +91 -0
- holado_data/tests/behave/steps/tools/utils_steps.py +59 -0
- holado_db/__init__.py +32 -0
- holado_db/tests/behave/steps/__init__.py +18 -0
- holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
- holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
- holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
- holado_db/tools/db/clients/base/db_audit.py +94 -0
- holado_db/tools/db/clients/base/db_client.py +344 -0
- holado_db/tools/db/clients/postgresql/postgresql_audit.py +75 -0
- holado_db/tools/db/clients/postgresql/postgresql_client.py +84 -0
- holado_db/tools/db/clients/sqlite/sqlite_audit.py +70 -0
- holado_db/tools/db/clients/sqlite/sqlite_client.py +60 -0
- holado_db/tools/db/db_manager.py +109 -0
- holado_db/tools/db/query/base/query_builder.py +138 -0
- holado_db/tools/db/query/pypika/pypika_query_builder.py +244 -0
- holado_db/tools/db/query/query_manager.py +77 -0
- holado_django/__init__.py +31 -0
- holado_django/server/HOWTO.txt +27 -0
- holado_django/server/django_projects/rest_api/db.sqlite3 +0 -0
- holado_django/server/django_projects/rest_api/manage.py +22 -0
- holado_django/server/django_projects/rest_api/rest_api/__init__.py +0 -0
- holado_django/server/django_projects/rest_api/rest_api/application/__init__.py +0 -0
- holado_django/server/django_projects/rest_api/rest_api/application/admin.py +3 -0
- holado_django/server/django_projects/rest_api/rest_api/application/apps.py +9 -0
- holado_django/server/django_projects/rest_api/rest_api/application/migrations/__init__.py +0 -0
- holado_django/server/django_projects/rest_api/rest_api/application/models.py +3 -0
- holado_django/server/django_projects/rest_api/rest_api/application/tests.py +3 -0
- holado_django/server/django_projects/rest_api/rest_api/application/views.py +6 -0
- holado_django/server/django_projects/rest_api/rest_api/asgi.py +16 -0
- holado_django/server/django_projects/rest_api/rest_api/settings.py +130 -0
- holado_django/server/django_projects/rest_api/rest_api/urls.py +35 -0
- holado_django/server/django_projects/rest_api/rest_api/wsgi.py +16 -0
- holado_django/server/django_server.py +110 -0
- holado_django/server/grpc_django_server.py +57 -0
- holado_django/server/patch_djangogrpcframework.py +46 -0
- holado_django/tests/behave/steps/__init__.py +16 -0
- holado_django/tests/behave/steps/django_server_steps.py +83 -0
- holado_docker/__init__.py +25 -0
- holado_docker/sdk/docker/container_logs.py +447 -0
- holado_docker/sdk/docker/docker_client.py +537 -0
- holado_docker/sdk/docker/docker_service.py +71 -0
- holado_docker/tests/behave/steps/__init__.py +16 -0
- holado_docker/tests/behave/steps/sdk/docker/container_logs_steps.py +47 -0
- holado_examples/projects/server_rest/server_rest_example/initialize_holado.py +72 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/db.sqlite3 +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/manage.py +22 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/__init__.py +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/__init__.py +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/admin.py +3 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/apps.py +7 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/migrations/__init__.py +0 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/models.py +3 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/serializers.py +15 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/tests.py +3 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/views.py +24 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/asgi.py +16 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/settings.py +130 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/urls.py +31 -0
- holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/wsgi.py +16 -0
- holado_examples/projects/server_rest/server_rest_example/rest_server.py +37 -0
- holado_examples/scripts/script_custom_initialization.py +16 -0
- holado_examples/scripts/script_minimal_initialization.py +23 -0
- holado_examples/tests/behave/testing_solution/__main__.py +13 -0
- holado_examples/tests/behave/testing_solution/behave_environment.py +35 -0
- holado_examples/tests/behave/testing_solution/environment.py +36 -0
- holado_examples/tests/behave/testing_solution/features/Configuration/Actions/configure_system.feature +10 -0
- holado_examples/tests/behave/testing_solution/features/NonReg/example.feature +26 -0
- holado_examples/tests/behave/testing_solution/initialize_holado.py +62 -0
- holado_examples/tests/behave/testing_solution/logging.conf +102 -0
- holado_examples/tests/behave/testing_solution/requirements.txt +5 -0
- holado_examples/tests/behave/testing_solution/run_test.sh +7 -0
- holado_examples/tests/behave/testing_solution/run_test_nonreg.sh +6 -0
- holado_examples/tests/behave/testing_solution/src/common/tools/path_manager.py +40 -0
- holado_examples/tests/behave/testing_solution/src/config/config_manager.py +30 -0
- holado_examples/tests/behave/testing_solution/src/context/session_context.py +45 -0
- holado_examples/tests/behave/testing_solution/steps/config_steps.py +21 -0
- holado_examples/tests/behave/testing_solution/steps/public_steps.py +10 -0
- holado_grpc/TODO +8 -0
- holado_grpc/__init__.py +40 -0
- holado_grpc/api/rpc/TODO.txt +4 -0
- holado_grpc/api/rpc/grpc_client.py +210 -0
- holado_grpc/api/rpc/grpc_manager.py +81 -0
- holado_grpc/ipc/rpc/__init__.py +0 -0
- holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
- holado_grpc/ipc/rpc/grpc_services.py +165 -0
- holado_grpc/tests/behave/steps/__init__.py +16 -0
- holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
- holado_grpc/tests/behave/steps/private/__init__.py +16 -0
- holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
- holado_helper/__init__.py +35 -0
- holado_helper/debug/README.txt +32 -0
- holado_helper/debug/memory/memory_profiler.py +106 -0
- holado_helper/docker/init_user.sh +24 -0
- holado_helper/docker/logging.conf +44 -0
- holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
- holado_helper/docker/run_terminal_in_docker.sh +101 -0
- holado_helper/holado_module_template/__init__.py +38 -0
- holado_helper/holado_module_template/tests/behave/steps/__init__.py +16 -0
- holado_helper/holado_module_template/tests/behave/steps/private/__init__.py +16 -0
- holado_helper/initialize_holado.py +72 -0
- holado_helper/script/action.py +130 -0
- holado_helper/script/action_script.py +477 -0
- holado_helper/script/any_action_script.py +126 -0
- holado_helper/script/behave_action_script.py +99 -0
- holado_helper/script/csv_action_script.py +142 -0
- holado_helper/script/initialize_script.py +95 -0
- holado_helper/script/input_output_script.py +136 -0
- holado_helper/script/job.py +75 -0
- holado_helper/script/json_action_script.py +104 -0
- holado_helper/script/script.py +110 -0
- holado_json/__init__.py +16 -0
- holado_json/filesystem/json_file.py +94 -0
- holado_json/filesystem/stream_json_file.py +117 -0
- holado_json/ipc/json.py +146 -0
- holado_json/ipc/json_converter.py +69 -0
- holado_json/ipc/json_types.py +183 -0
- holado_json/tests/behave/steps/__init__.py +16 -0
- holado_json/tests/behave/steps/ipc/__init__.py +0 -0
- holado_json/tests/behave/steps/ipc/json_steps.py +131 -0
- holado_keycloak/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +73 -0
- holado_keycloak/tools/keycloak/__init__.py +0 -0
- holado_keycloak/tools/keycloak/keycloak_client.py +90 -0
- holado_logging/__init__.py +38 -0
- holado_logging/common/logging/holado_logger.py +71 -0
- holado_logging/common/logging/log_config.py +163 -0
- holado_logging/common/logging/log_manager.py +335 -0
- holado_multitask/__init__.py +33 -0
- holado_multitask/multiprocessing/context/process_context.py +35 -0
- holado_multitask/multiprocessing/function_process.py +102 -0
- holado_multitask/multiprocessing/periodic_function_process.py +137 -0
- holado_multitask/multiprocessing/process.py +213 -0
- holado_multitask/multiprocessing/processesmanager.py +137 -0
- holado_multitask/multitasking/multitask_manager.py +464 -0
- holado_multitask/multithreading/__init__.py +0 -0
- holado_multitask/multithreading/context/thread_context.py +86 -0
- holado_multitask/multithreading/functionthreaded.py +129 -0
- holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
- holado_multitask/multithreading/loopthread.py +110 -0
- holado_multitask/multithreading/periodicfunctionthreaded.py +135 -0
- holado_multitask/multithreading/reflection/inspect.py +47 -0
- holado_multitask/multithreading/reflection/sys.py +29 -0
- holado_multitask/multithreading/reflection/traceback.py +35 -0
- holado_multitask/multithreading/thread.py +203 -0
- holado_multitask/multithreading/threadsmanager.py +167 -0
- holado_multitask/multithreading/timer.py +51 -0
- holado_multitask/tests/behave/steps/__init__.py +17 -0
- holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
- holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
- holado_protobuf/__init__.py +61 -0
- holado_protobuf/ipc/protobuf/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
- holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
- holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
- holado_protobuf/ipc/protobuf/protobuf_messages.py +968 -0
- holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
- holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
- holado_protobuf/tests/behave/steps/__init__.py +16 -0
- holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
- holado_python/__init__.py +36 -0
- holado_python/common/enums.py +34 -0
- holado_python/common/iterables.py +38 -0
- holado_python/common/tools/comparators/boolean_comparator.py +37 -0
- holado_python/common/tools/comparators/bytes_comparator.py +48 -0
- holado_python/common/tools/comparators/datetime_comparator.py +74 -0
- holado_python/common/tools/comparators/float_comparator.py +97 -0
- holado_python/common/tools/comparators/integer_comparator.py +37 -0
- holado_python/common/tools/comparators/string_comparator.py +99 -0
- holado_python/common/tools/comparators/type_comparator.py +31 -0
- holado_python/common/tools/datetime.py +341 -0
- holado_python/standard_library/csv.py +207 -0
- holado_python/standard_library/hashlib.py +110 -0
- holado_python/standard_library/multiprocessing.py +62 -0
- holado_python/standard_library/queue.py +79 -0
- holado_python/standard_library/socket/blocking_socket.py +219 -0
- holado_python/standard_library/socket/echo_server.py +29 -0
- holado_python/standard_library/socket/message_socket.py +152 -0
- holado_python/standard_library/socket/non_blocking_socket.py +172 -0
- holado_python/standard_library/socket/socket.py +411 -0
- holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
- holado_python/standard_library/ssl/ssl.py +131 -0
- holado_python/standard_library/typing.py +192 -0
- holado_python/tests/behave/steps/__init__.py +27 -0
- holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
- holado_python/tests/behave/steps/convert_steps.py +59 -0
- holado_python/tests/behave/steps/iterable_steps.py +87 -0
- holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
- holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
- holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
- holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
- holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
- holado_python/tests/behave/steps/standard_library/socket_steps.py +384 -0
- holado_python/tests/behave/steps/standard_library/ssl_steps.py +71 -0
- holado_rabbitmq/__init__.py +28 -0
- holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +565 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +333 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +678 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +146 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
- holado_redis/__init__.py +17 -0
- holado_redis/tests/behave/steps/__init__.py +16 -0
- holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
- holado_redis/tools/redis/TODO.txt +7 -0
- holado_redis/tools/redis/redis_client.py +190 -0
- holado_redis/tools/redis/redis_manager.py +38 -0
- holado_report/__init__.py +36 -0
- holado_report/campaign/campaign_manager.py +348 -0
- holado_report/report/analyze/execution_historic_manager.py +96 -0
- holado_report/report/analyze/scenario_duration_manager.py +245 -0
- holado_report/report/builders/detailed_scenario_report_builder.py +172 -0
- holado_report/report/builders/execution_historic_report_builder.py +132 -0
- holado_report/report/builders/failure_report_builder.py +150 -0
- holado_report/report/builders/report_builder.py +64 -0
- holado_report/report/builders/short_scenario_report_builder.py +94 -0
- holado_report/report/builders/summary_by_category_report_builder.py +103 -0
- holado_report/report/builders/summary_report_builder.py +110 -0
- holado_report/report/builders/summary_scenario_by_category_report_builder.py +109 -0
- holado_report/report/builders/summary_scenario_report_builder.py +81 -0
- holado_report/report/execution_historic.py +144 -0
- holado_report/report/report_manager.py +424 -0
- holado_report/report/reports/base_report.py +163 -0
- holado_report/report/reports/feature_report.py +106 -0
- holado_report/report/reports/scenario_report.py +64 -0
- holado_rest/__init__.py +32 -0
- holado_rest/api/rest/TODO.txt +2 -0
- holado_rest/api/rest/rest_client.py +200 -0
- holado_rest/api/rest/rest_manager.py +72 -0
- holado_rest/tests/behave/steps/__init__.py +16 -0
- holado_rest/tests/behave/steps/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/api/rest_client_steps.py +181 -0
- holado_rest/tests/behave/steps/private/__init__.py +16 -0
- holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/private/api/rest_steps.py +75 -0
- holado_s3/__init__.py +17 -0
- holado_s3/tests/behave/steps/__init__.py +17 -0
- holado_s3/tests/behave/steps/private/__init__.py +16 -0
- holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
- holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
- holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
- holado_s3/tools/s3/__init__.py +0 -0
- holado_s3/tools/s3/boto3_s3_client.py +59 -0
- holado_s3/tools/s3/minio_client.py +75 -0
- holado_s3/tools/s3/moto_server.py +52 -0
- holado_scripting/__init__.py +54 -0
- holado_scripting/common/tools/dynamic_text_manager.py +73 -0
- holado_scripting/common/tools/evaluate_parameters.py +228 -0
- holado_scripting/common/tools/expression_evaluator.py +389 -0
- holado_scripting/common/tools/variable_manager.py +354 -0
- holado_scripting/tests/behave/steps/__init__.py +22 -0
- holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +159 -0
- holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
- holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
- holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
- holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
- holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
- holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
- holado_scripting/text/base/base_function.py +25 -0
- holado_scripting/text/base/base_verify_function.py +25 -0
- holado_scripting/text/base/text_inspecter.py +204 -0
- holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
- holado_scripting/text/interpreter/functions/function_apply_function.py +60 -0
- holado_scripting/text/interpreter/functions/function_cast.py +60 -0
- holado_scripting/text/interpreter/functions/function_convert.py +57 -0
- holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
- holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
- holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
- holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
- holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
- holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
- holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
- holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
- holado_scripting/text/interpreter/functions/function_to_string.py +50 -0
- holado_scripting/text/interpreter/text_interpreter.py +219 -0
- holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
- holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
- holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
- holado_scripting/text/verifier/text_verifier.py +103 -0
- holado_sftp/__init__.py +16 -0
- holado_sftp/tests/behave/steps/__init__.py +17 -0
- holado_sftp/tests/behave/steps/private/__init__.py +16 -0
- holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
- holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
- holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
- holado_sftp/tools/sftp/__init__.py +0 -0
- holado_sftp/tools/sftp/sftp_client.py +103 -0
- holado_sftp/tools/sftp/sftp_server.py +39 -0
- holado_swagger/__init__.py +31 -0
- holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
- holado_swagger/swagger_hub/mockserver/mockserver_manager.py +33 -0
- holado_swagger/tests/behave/steps/__init__.py +16 -0
- holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
- holado_system/system/command/command.py +247 -0
- holado_system/system/command/command_result.py +128 -0
- holado_system/system/command/curl_command.py +101 -0
- holado_system/system/command/exceptions.py +59 -0
- holado_system/system/filesystem/file.py +150 -0
- holado_system/system/global_system.py +187 -0
- holado_system/tests/behave/steps/__init__.py +18 -0
- holado_system/tests/behave/steps/system/commands_steps.py +92 -0
- holado_system/tests/behave/steps/system/file_steps.py +231 -0
- holado_system/tests/behave/steps/system/system_steps.py +84 -0
- holado_test/__init__.py +30 -0
- holado_test/behave/__init__.py +0 -0
- holado_test/behave/behave.py +400 -0
- holado_test/behave/behave_environment.py +169 -0
- holado_test/behave/behave_function.py +33 -0
- holado_test/behave/behave_manager.py +558 -0
- holado_test/behave/independant_runner.py +66 -0
- holado_test/behave/scenario/__init__.py +0 -0
- holado_test/behave/scenario/behave_step_tools.py +157 -0
- holado_test/common/context/feature_context.py +81 -0
- holado_test/common/context/scenario_context.py +169 -0
- holado_test/common/context/step_context.py +66 -0
- holado_test/common/exceptions/undefined_step_exception.py +21 -0
- holado_test/scenario/step_tools.py +547 -0
- holado_test/scenario/tester_tools.py +57 -0
- holado_test/test_config.py +26 -0
- holado_test/tests/behave/steps/__init__.py +18 -0
- holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
- holado_test/tests/behave/steps/scenario/scenario_steps.py +100 -0
- holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
- holado_test/tools/test_server/client/rest/test_server_client.py +150 -0
- holado_test/tools/test_server/server/Dockerfile +60 -0
- holado_test/tools/test_server/server/core/server_context.py +42 -0
- holado_test/tools/test_server/server/core/server_manager.py +41 -0
- holado_test/tools/test_server/server/requirements.txt +2 -0
- holado_test/tools/test_server/server/rest/README +2 -0
- holado_test/tools/test_server/server/rest/api/__init__.py +24 -0
- holado_test/tools/test_server/server/rest/api/campaign/__init__.py +32 -0
- holado_test/tools/test_server/server/rest/api/campaign/scenario.py +40 -0
- holado_test/tools/test_server/server/rest/initialize_holado.py +72 -0
- holado_test/tools/test_server/server/rest/logging.conf +51 -0
- holado_test/tools/test_server/server/rest/openapi.yaml +57 -0
- holado_test/tools/test_server/server/rest/run.py +41 -0
- holado_test/tools/test_server/server/run.sh +6 -0
- holado_test/tools/test_server/server/run_test_server_in_docker.sh +104 -0
- holado_tools/__init__.py +38 -0
- holado_tools/scripts/execute_persisted_post_processes/execute_persisted_post_processes.py +36 -0
- holado_tools/scripts/execute_persisted_post_processes/execute_persisted_post_processes.sh +6 -0
- holado_tools/scripts/execute_persisted_post_processes/initialize_holado.py +62 -0
- holado_tools/tests/behave/steps/__init__.py +16 -0
- holado_tools/tests/behave/steps/tools/host_controller/client_steps.py +97 -0
- holado_tools/tools/host_controller/client/rest/host_controller_client.py +275 -0
- holado_tools/tools/host_controller/server/Dockerfile +60 -0
- holado_tools/tools/host_controller/server/requirements.txt +2 -0
- holado_tools/tools/host_controller/server/rest/README +2 -0
- holado_tools/tools/host_controller/server/rest/api/__init__.py +24 -0
- holado_tools/tools/host_controller/server/rest/api/config.py +88 -0
- holado_tools/tools/host_controller/server/rest/api/docker/__init__.py +66 -0
- holado_tools/tools/host_controller/server/rest/api/docker/container.py +144 -0
- holado_tools/tools/host_controller/server/rest/api/docker/logs.py +66 -0
- holado_tools/tools/host_controller/server/rest/api/os.py +58 -0
- holado_tools/tools/host_controller/server/rest/initialize_holado.py +72 -0
- holado_tools/tools/host_controller/server/rest/openapi.yaml +561 -0
- holado_tools/tools/host_controller/server/rest/run.py +31 -0
- holado_tools/tools/host_controller/server/run_host_controller_in_docker.sh +107 -0
- holado_tools/tools/host_viewer/client/rest/host_viewer_client.py +190 -0
- holado_tools/tools/host_viewer/server/Dockerfile +60 -0
- holado_tools/tools/host_viewer/server/requirements.txt +2 -0
- holado_tools/tools/host_viewer/server/rest/README +2 -0
- holado_tools/tools/host_viewer/server/rest/api/__init__.py +24 -0
- holado_tools/tools/host_viewer/server/rest/api/docker/__init__.py +65 -0
- holado_tools/tools/host_viewer/server/rest/api/docker/container.py +87 -0
- holado_tools/tools/host_viewer/server/rest/api/os.py +58 -0
- holado_tools/tools/host_viewer/server/rest/initialize_holado.py +72 -0
- holado_tools/tools/host_viewer/server/rest/openapi.yaml +301 -0
- holado_tools/tools/host_viewer/server/rest/run.py +31 -0
- holado_tools/tools/host_viewer/server/run_host_viewer_in_docker.sh +107 -0
- holado_value/__init__.py +24 -0
- holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +196 -0
- holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
- holado_value/common/tables/converters/value_table_converter.py +267 -0
- holado_value/common/tables/value_table.py +29 -0
- holado_value/common/tables/value_table_cell.py +76 -0
- holado_value/common/tables/value_table_manager.py +48 -0
- holado_value/common/tables/value_table_row.py +43 -0
- holado_value/common/tables/value_table_with_header.py +28 -0
- holado_value/common/tools/unique_value_manager.py +109 -0
- holado_value/common/tools/value.py +191 -0
- holado_value/common/tools/value_types.py +41 -0
- holado_value/tests/behave/steps/__init__.py +16 -0
- holado_value/tests/behave/steps/private/__init__.py +16 -0
- holado_ws/__init__.py +16 -0
- holado_ws/api/ws/TODO.txt +2 -0
- holado_ws/tests/behave/steps/__init__.py +16 -0
- holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
- holado_xml/__init__.py +38 -0
- holado_xml/tests/behave/steps/__init__.py +16 -0
- holado_xml/tests/behave/steps/private/__init__.py +16 -0
- holado_xml/xml/stream_xml_file.py +181 -0
- holado_xml/xml/xml_file.py +97 -0
- holado_xml/xml/xml_manager.py +35 -0
- holado_yaml/__init__.py +31 -0
- holado_yaml/tests/behave/steps/__init__.py +16 -0
- holado_yaml/tests/behave/steps/yaml_steps.py +161 -0
- holado_yaml/yaml/enums.py +28 -0
- holado_yaml/yaml/pyyaml/pyyaml_client.py +72 -0
- holado_yaml/yaml/ruamel/ruamel_yaml_client.py +80 -0
- holado_yaml/yaml/yaml_client.py +203 -0
- holado_yaml/yaml/yaml_manager.py +94 -0
- test_holado/Dockerfile_test_holado +82 -0
- test_holado/__init__.py +4 -0
- test_holado/__main__.py +25 -0
- test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
- test_holado/environment.py +60 -0
- test_holado/features/Configuration/Actions/execute_persisted_post_processes.feature +13 -0
- test_holado/features/NonReg/api/REST.feature +26 -0
- test_holado/features/NonReg/api/gRPC.feature +116 -0
- test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
- test_holado/features/NonReg/common/system/commands.feature +43 -0
- test_holado/features/NonReg/common/system/system.feature +20 -0
- test_holado/features/NonReg/common/tables/table.feature +245 -0
- test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
- test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
- test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
- test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
- test_holado/features/NonReg/holado_ais/ais_message-nmea_raw_to_dict.feature +93 -0
- test_holado/features/NonReg/holado_ais/message_types/type-10.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-12.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-14.feature +36 -0
- test_holado/features/NonReg/holado_ais/message_types/type-15.feature +36 -0
- test_holado/features/NonReg/holado_ais/message_types/type-16.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-17.feature +46 -0
- test_holado/features/NonReg/holado_ais/message_types/type-18.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-19.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-1_2_3.feature +42 -0
- test_holado/features/NonReg/holado_ais/message_types/type-20.feature +38 -0
- test_holado/features/NonReg/holado_ais/message_types/type-21.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-22.feature +84 -0
- test_holado/features/NonReg/holado_ais/message_types/type-23.feature +49 -0
- test_holado/features/NonReg/holado_ais/message_types/type-24.feature +72 -0
- test_holado/features/NonReg/holado_ais/message_types/type-25.feature +143 -0
- test_holado/features/NonReg/holado_ais/message_types/type-26.feature +144 -0
- test_holado/features/NonReg/holado_ais/message_types/type-27.feature +36 -0
- test_holado/features/NonReg/holado_ais/message_types/type-4_11.feature +39 -0
- test_holado/features/NonReg/holado_ais/message_types/type-5.feature +33 -0
- test_holado/features/NonReg/holado_ais/message_types/type-6.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-7_13.feature +43 -0
- test_holado/features/NonReg/holado_ais/message_types/type-8.feature +37 -0
- test_holado/features/NonReg/holado_ais/message_types/type-9.feature +37 -0
- test_holado/features/NonReg/holado_binary/bit_series.error.feature +33 -0
- test_holado/features/NonReg/holado_binary/bit_series.feature +144 -0
- test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
- test_holado/features/NonReg/holado_python/convert.feature +20 -0
- test_holado/features/NonReg/holado_python/iterable.feature +61 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_reset.feature +191 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_with_tls_and_verify.feature +279 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_with_tls_without_verify.feature +299 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_without_tls.feature +163 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_with_mtls.feature +214 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_with_tls.feature +184 -0
- test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_without_tls.feature +169 -0
- test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
- test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
- test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
- test_holado/features/NonReg/holado_yaml/yaml.feature +514 -0
- test_holado/features/NonReg/ipc/json.feature +20 -0
- test_holado/features/NonReg/scenario/scenario.feature +183 -0
- test_holado/features/NonReg/test_steps/behave.feature +275 -0
- test_holado/features/NonReg/test_steps/common.feature +100 -0
- test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
- test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
- test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
- test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
- test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
- test_holado/features/NonReg/tools/sFTP.feature +25 -0
- test_holado/features/Test/logger.feature +28 -0
- test_holado/features/Test/test_host_controller.feature +13 -0
- test_holado/features/Test/test_parameter.feature +15 -0
- test_holado/features/__init__.py +0 -0
- test_holado/initialize_holado.py +62 -0
- test_holado/logging.conf +53 -0
- test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
- test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
- test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
- test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
- test_holado/resources/scripts/list_tags.sh +2 -0
- test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
- test_holado/steps/__init__.py +0 -0
- test_holado/steps/private_steps.py +20 -0
- test_holado/steps/public_steps.py +23 -0
- test_holado/test_holado_session_context.py +43 -0
- test_holado/tools/connexion/api_rest/openapi.yaml +16 -0
- test_holado/tools/connexion/api_rest/run.py +19 -0
- test_holado/tools/django/README.txt +3 -0
- test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
- test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
- test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
- test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
- test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
- test_holado/tools/django/api_grpc/manage.py +29 -0
- test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
- test_holado/tools/django/api_grpc/patch_djangogrpcframework.py +42 -0
- test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
- test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
- test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
- test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
- test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
- test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
- test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
- test_holado/tools/django/api_rest/db.sqlite3 +0 -0
- test_holado/tools/django/api_rest/manage.py +22 -0
|
@@ -0,0 +1,238 @@
|
|
|
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 os
|
|
16
|
+
from glob import glob
|
|
17
|
+
import shutil
|
|
18
|
+
import re
|
|
19
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
20
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
21
|
+
from datetime import datetime
|
|
22
|
+
from holado_core.common.tools.tools import Tools
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from holado_python.common.tools.datetime import DateTime
|
|
25
|
+
from holado.holado_config import Config
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class PathManager(object):
|
|
31
|
+
|
|
32
|
+
def __init__(self):
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
def get_user_group(self, path):
|
|
36
|
+
p = Path(path)
|
|
37
|
+
return p.owner(), p.group()
|
|
38
|
+
|
|
39
|
+
def get_mode(self, path):
|
|
40
|
+
return os.stat(path).st_mode & 0o777
|
|
41
|
+
|
|
42
|
+
def makedirs(self, path, mode = None, is_directory = False, user = None, group = None):
|
|
43
|
+
if not is_directory:
|
|
44
|
+
path = os.path.dirname(path)
|
|
45
|
+
if not os.path.exists(path):
|
|
46
|
+
if mode:
|
|
47
|
+
os.makedirs(path, mode)
|
|
48
|
+
else:
|
|
49
|
+
os.makedirs(path)
|
|
50
|
+
self.chown(path, user, group)
|
|
51
|
+
|
|
52
|
+
def makefile(self, path, mode = None, user = None, group = None):
|
|
53
|
+
if not os.path.exists(path):
|
|
54
|
+
self.makedirs(path, mode, False, user, group)
|
|
55
|
+
open(path, 'a').close()
|
|
56
|
+
|
|
57
|
+
if mode:
|
|
58
|
+
os.chmod(path, mode)
|
|
59
|
+
self.chown(path, user, group)
|
|
60
|
+
|
|
61
|
+
def remove_path(self, path, ignore_errors=False):
|
|
62
|
+
if os.path.isfile(path):
|
|
63
|
+
try:
|
|
64
|
+
os.remove(path)
|
|
65
|
+
except Exception as exc:
|
|
66
|
+
if not ignore_errors:
|
|
67
|
+
raise exc
|
|
68
|
+
elif os.path.isdir(path):
|
|
69
|
+
shutil.rmtree(path, ignore_errors=ignore_errors)
|
|
70
|
+
|
|
71
|
+
def remove_paths(self, glob_pattern, ignore_errors=False):
|
|
72
|
+
paths = glob(glob_pattern)
|
|
73
|
+
for path in paths:
|
|
74
|
+
self.remove_path(path, ignore_errors)
|
|
75
|
+
|
|
76
|
+
def copy_path_recursively(self, src_path, dst_path, filter_patterns = None, ignore_patterns = None, do_log = False, log_prefix = "", user = None, group = None):
|
|
77
|
+
# logging.debug("Copying path '{}' -> '{}' (ignoring {})".format(src_path, dst_path, ignore_patterns))
|
|
78
|
+
# Copy path
|
|
79
|
+
if os.path.isfile(src_path):
|
|
80
|
+
if self.__filter_path(src_path, filter_patterns=filter_patterns, ignore_patterns=ignore_patterns, do_log=do_log, log_prefix=log_prefix):
|
|
81
|
+
if do_log:
|
|
82
|
+
logger.debug("{}Copy file '{}' -> '{}".format(log_prefix, src_path, dst_path))
|
|
83
|
+
self.makedirs(dst_path, user=user, group=group)
|
|
84
|
+
shutil.copy2(src_path, dst_path)
|
|
85
|
+
self.chown(dst_path, user, group)
|
|
86
|
+
elif os.path.isdir(src_path):
|
|
87
|
+
lp = os.listdir(src_path)
|
|
88
|
+
for cp in lp:
|
|
89
|
+
cur_src_path = os.path.join(src_path, cp)
|
|
90
|
+
cur_dst_path = os.path.join(dst_path, cp)
|
|
91
|
+
self.copy_path_recursively(cur_src_path, cur_dst_path, filter_patterns=filter_patterns, ignore_patterns=ignore_patterns, do_log=do_log, log_prefix=log_prefix, user=user, group=group)
|
|
92
|
+
|
|
93
|
+
def __filter_paths(self, paths, filter_patterns = None, ignore_patterns = None, do_log = False, log_prefix = ""):
|
|
94
|
+
if filter_patterns is not None and not isinstance(filter_patterns, list):
|
|
95
|
+
raise TechnicalException("Parameter 'filter_patterns' must be None or a list of patterns")
|
|
96
|
+
if ignore_patterns is not None and not isinstance(ignore_patterns, list):
|
|
97
|
+
raise TechnicalException("Parameter 'ignore_patterns' must be None or a list of patterns")
|
|
98
|
+
|
|
99
|
+
res = []
|
|
100
|
+
for path in paths:
|
|
101
|
+
if self.__filter_path(path, filter_patterns, ignore_patterns, do_log, log_prefix):
|
|
102
|
+
res.append(path)
|
|
103
|
+
|
|
104
|
+
return res
|
|
105
|
+
|
|
106
|
+
def __filter_path(self, path, filter_patterns = None, ignore_patterns = None, do_log = False, log_prefix = ""):
|
|
107
|
+
if filter_patterns is not None and not isinstance(filter_patterns, list):
|
|
108
|
+
raise TechnicalException("Parameter 'filter_patterns' must be None or a list of patterns")
|
|
109
|
+
if ignore_patterns is not None and not isinstance(ignore_patterns, list):
|
|
110
|
+
raise TechnicalException("Parameter 'ignore_patterns' must be None or a list of patterns")
|
|
111
|
+
|
|
112
|
+
if filter_patterns is not None and len(filter_patterns) > 0:
|
|
113
|
+
is_matching_a_filter = False
|
|
114
|
+
for pattern in filter_patterns:
|
|
115
|
+
if re.match(pattern, path):
|
|
116
|
+
if do_log:
|
|
117
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
118
|
+
logger.debug(f"{log_prefix}File '{path}' is matching filter '{pattern}'")
|
|
119
|
+
is_matching_a_filter = True
|
|
120
|
+
break
|
|
121
|
+
if not is_matching_a_filter:
|
|
122
|
+
if do_log:
|
|
123
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
124
|
+
logger.debug(f"{log_prefix}File '{path}' is excluded by filters {filter_patterns}")
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
if ignore_patterns is not None and len(ignore_patterns) > 0:
|
|
128
|
+
is_ignored = False
|
|
129
|
+
for pattern in ignore_patterns:
|
|
130
|
+
if re.match(pattern, path):
|
|
131
|
+
if do_log:
|
|
132
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
133
|
+
logger.debug(f"{log_prefix}File '{path}' is ignored since it matches pattern '{pattern}'")
|
|
134
|
+
is_ignored = True
|
|
135
|
+
break
|
|
136
|
+
if is_ignored:
|
|
137
|
+
return False
|
|
138
|
+
|
|
139
|
+
return True
|
|
140
|
+
|
|
141
|
+
def rename(self, src, dst, raise_if_exists=True):
|
|
142
|
+
if raise_if_exists:
|
|
143
|
+
os.rename(src, dst)
|
|
144
|
+
else:
|
|
145
|
+
os.replace(src, dst)
|
|
146
|
+
|
|
147
|
+
def get_user_home_path(self):
|
|
148
|
+
import pathlib
|
|
149
|
+
return str(pathlib.Path.home())
|
|
150
|
+
|
|
151
|
+
def get_local_resources_path(self, name=None):
|
|
152
|
+
base_path = os.getenv('HOLADO_LOCAL_RESOURCES_BASEDIR')
|
|
153
|
+
if base_path is None:
|
|
154
|
+
base_path = os.path.join(self.get_user_home_path(), '.holado', 'resources')
|
|
155
|
+
|
|
156
|
+
if name is not None:
|
|
157
|
+
return os.path.join(base_path, name)
|
|
158
|
+
else:
|
|
159
|
+
return base_path
|
|
160
|
+
|
|
161
|
+
def get_reports_path(self, name=None, with_application_group=True):
|
|
162
|
+
base_path = os.getenv('HOLADO_OUTPUT_BASEDIR')
|
|
163
|
+
if base_path is None:
|
|
164
|
+
base_path = os.path.join(self.get_user_home_path(), '.holado', 'output')
|
|
165
|
+
|
|
166
|
+
res = os.path.join(base_path, "reports")
|
|
167
|
+
if with_application_group and Config.application_group is not None:
|
|
168
|
+
res = os.path.join(res, Config.application_group)
|
|
169
|
+
if name is not None:
|
|
170
|
+
res = os.path.join(res, name)
|
|
171
|
+
return res
|
|
172
|
+
|
|
173
|
+
def chown(self, path, user = None, group = None):
|
|
174
|
+
if user is not None or group is not None:
|
|
175
|
+
if user is None or group is None:
|
|
176
|
+
raise TechnicalException(f"User and group (name or ID) cannot be None (user={user} ; group={group})")
|
|
177
|
+
shutil.chown(path, user, group)
|
|
178
|
+
|
|
179
|
+
def check_file_exists(self, path, do_exist=True, raise_exception=True):
|
|
180
|
+
"""
|
|
181
|
+
@param path Path
|
|
182
|
+
@param do_exist Define to check if file exists or not
|
|
183
|
+
@param raise_exception If True, raises an exception rather than returning False
|
|
184
|
+
@return True if given path is an existing file
|
|
185
|
+
"""
|
|
186
|
+
res = (do_exist == os.path.exists(path))
|
|
187
|
+
|
|
188
|
+
if not res and raise_exception:
|
|
189
|
+
raise FunctionalException(f"File '{path}' " + "doesn't exist" if do_exist else "exists")
|
|
190
|
+
return res
|
|
191
|
+
|
|
192
|
+
def get_timestamped_path(self, prefix, ext, dt=None, dt_format="%Y%m%d-%H%M%S"):
|
|
193
|
+
ext = ext.strip('.')
|
|
194
|
+
if dt is None:
|
|
195
|
+
dt = DateTime.now()
|
|
196
|
+
now_str = datetime.strftime(dt, dt_format)
|
|
197
|
+
return f"{prefix}_{now_str}.{ext}"
|
|
198
|
+
|
|
199
|
+
def find_files(self, dir_path, prefix=None, subdir_relative_path=None, since_datetime=None):
|
|
200
|
+
res = []
|
|
201
|
+
for filename in os.listdir(dir_path):
|
|
202
|
+
file_path = os.path.join(dir_path, filename)
|
|
203
|
+
|
|
204
|
+
if subdir_relative_path is not None:
|
|
205
|
+
# Filter directories that doesn't contain expected sub-file
|
|
206
|
+
if not os.path.isdir(file_path):
|
|
207
|
+
continue
|
|
208
|
+
file_path = os.path.join(file_path, subdir_relative_path)
|
|
209
|
+
if not os.path.exists(file_path):
|
|
210
|
+
continue
|
|
211
|
+
else:
|
|
212
|
+
# Filter paths that are not files
|
|
213
|
+
if not os.path.isfile(file_path):
|
|
214
|
+
continue
|
|
215
|
+
|
|
216
|
+
# Filter on prefix
|
|
217
|
+
if prefix is not None and not filename.startswith(prefix):
|
|
218
|
+
continue
|
|
219
|
+
|
|
220
|
+
# Filter on file modification datetime
|
|
221
|
+
if since_datetime is not None:
|
|
222
|
+
dt_last_modif = DateTime.timestamp_to_datetime(os.path.getmtime(file_path))
|
|
223
|
+
if dt_last_modif < since_datetime:
|
|
224
|
+
continue
|
|
225
|
+
|
|
226
|
+
# File is matching criteria
|
|
227
|
+
res.append(file_path)
|
|
228
|
+
return res
|
|
229
|
+
|
|
230
|
+
def find_file(self, dir_path, prefix=None, since_datetime=None):
|
|
231
|
+
files = self.find_files(dir_path, prefix=prefix, since_datetime=since_datetime)
|
|
232
|
+
|
|
233
|
+
if len(files) == 0:
|
|
234
|
+
raise FunctionalException(f"Unable to find a file starting with '{prefix}' in folder '{dir_path}'")
|
|
235
|
+
elif len(files) > 1:
|
|
236
|
+
raise FunctionalException(f"Found many ({len(files)}) files starting with '{prefix}' in folder '{dir_path}': {files}")
|
|
237
|
+
return files[0]
|
|
238
|
+
|
|
@@ -0,0 +1,144 @@
|
|
|
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.technical_exception import TechnicalException
|
|
15
|
+
import logging
|
|
16
|
+
import string
|
|
17
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
18
|
+
import re
|
|
19
|
+
from holado_python.standard_library.typing import Typing
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
from bitarray import bitarray
|
|
23
|
+
with_bitarray = True
|
|
24
|
+
except:
|
|
25
|
+
with_bitarray = False
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class StrTools(object):
|
|
31
|
+
|
|
32
|
+
#TODO EKL: move following methods from Tools to this class
|
|
33
|
+
# @classmethod
|
|
34
|
+
# def get_indent_string(cls, indent):
|
|
35
|
+
# return " " * indent
|
|
36
|
+
#
|
|
37
|
+
# @classmethod
|
|
38
|
+
# def indent_string(cls, indent, txt):
|
|
39
|
+
# ind_str = StrTools.get_indent_string(indent)
|
|
40
|
+
# lines = txt.split("\n") if txt else []
|
|
41
|
+
# return ind_str + ("\n" + ind_str).join(lines)
|
|
42
|
+
#
|
|
43
|
+
# @classmethod
|
|
44
|
+
# def truncate_text(cls, text, length = Config.message_truncate_length, truncated_suffix = "[...]", is_length_with_suffix=False):
|
|
45
|
+
# if len(text) > length:
|
|
46
|
+
# if truncated_suffix:
|
|
47
|
+
# if is_length_with_suffix:
|
|
48
|
+
# return text[0 : length - len(truncated_suffix)] + truncated_suffix
|
|
49
|
+
# else:
|
|
50
|
+
# return text[0 : length] + truncated_suffix
|
|
51
|
+
# else:
|
|
52
|
+
# return text[0 : length]
|
|
53
|
+
# else:
|
|
54
|
+
# return text
|
|
55
|
+
|
|
56
|
+
if with_bitarray:
|
|
57
|
+
@classmethod
|
|
58
|
+
def is_bitarray(cls, src):
|
|
59
|
+
# Convert source to str
|
|
60
|
+
if isinstance(src, bytes):
|
|
61
|
+
value_str = src.decode('utf-8')
|
|
62
|
+
elif isinstance(src, str):
|
|
63
|
+
value_str = src
|
|
64
|
+
else:
|
|
65
|
+
raise FunctionalException(f"Unexpected source type {Typing.get_object_class_fullname(src)} (allowed types: string, bytes)")
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
bitarray(value_str)
|
|
69
|
+
except:
|
|
70
|
+
return False
|
|
71
|
+
return True
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def is_hex(cls, src):
|
|
75
|
+
if not isinstance(src, str):
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
hex_digits = set(string.hexdigits)
|
|
79
|
+
return all(c in hex_digits for c in src)
|
|
80
|
+
|
|
81
|
+
@classmethod
|
|
82
|
+
def hex_to_bytes(cls, src):
|
|
83
|
+
if not cls.is_hex(src):
|
|
84
|
+
raise FunctionalException(f"Source [{src}] (type: {Typing.get_object_class_fullname(src)}) is not an hexadecimal string")
|
|
85
|
+
|
|
86
|
+
if len(src) % 2 != 0:
|
|
87
|
+
raise FunctionalException(f"Hex string must have a length multiple of 2. If not, a padding is usually applied with a 0 at left or right. Hex string: '{src}'")
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
res = bytes.fromhex(src)
|
|
91
|
+
except ValueError as exc:
|
|
92
|
+
raise TechnicalException(f"Error with hex string '{src}'") from exc
|
|
93
|
+
|
|
94
|
+
# if len(res) * 2 != len(src):
|
|
95
|
+
# raise TechnicalException(f"Failed to convert hex to bytes: hex length is {len(src)} ; bytes length is {len(res)}")
|
|
96
|
+
|
|
97
|
+
return res
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def to_bytes(cls, src):
|
|
101
|
+
if isinstance(src, int):
|
|
102
|
+
signed = True if src < 0 else False
|
|
103
|
+
|
|
104
|
+
length = 1
|
|
105
|
+
val = src
|
|
106
|
+
while val > 255:
|
|
107
|
+
length += 1
|
|
108
|
+
val = val / 256
|
|
109
|
+
|
|
110
|
+
res = src.to_bytes(length, 'big', signed=signed)
|
|
111
|
+
elif isinstance(src, bytes):
|
|
112
|
+
res = src
|
|
113
|
+
elif isinstance(src, str):
|
|
114
|
+
if re.match(r"^b('|\").*\1$", src):
|
|
115
|
+
res = eval(src)
|
|
116
|
+
if not isinstance(res, bytes):
|
|
117
|
+
raise TechnicalException(f"Failed to eval string [{src}] as bytes ; eval result: [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
118
|
+
else:
|
|
119
|
+
res = src.encode('utf-8')
|
|
120
|
+
else:
|
|
121
|
+
raise FunctionalException(f"Unexpected source type {Typing.get_object_class_fullname(src)} (allowed types: int, string, bytes)")
|
|
122
|
+
|
|
123
|
+
return res
|
|
124
|
+
|
|
125
|
+
@classmethod
|
|
126
|
+
def to_hex(cls, src, do_upper=True):
|
|
127
|
+
src_bytes = cls.to_bytes(src)
|
|
128
|
+
|
|
129
|
+
res = src_bytes.hex()
|
|
130
|
+
if do_upper:
|
|
131
|
+
res = res.upper()
|
|
132
|
+
|
|
133
|
+
return res
|
|
134
|
+
|
|
135
|
+
@classmethod
|
|
136
|
+
def to_string(cls, src):
|
|
137
|
+
if isinstance(src, bytes):
|
|
138
|
+
return src.decode('utf-8')
|
|
139
|
+
elif isinstance(src, str):
|
|
140
|
+
return src
|
|
141
|
+
else:
|
|
142
|
+
return str(src)
|
|
143
|
+
|
|
144
|
+
|
|
@@ -0,0 +1,197 @@
|
|
|
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.holado_config import Config
|
|
15
|
+
import traceback
|
|
16
|
+
import sys
|
|
17
|
+
from holado_core.common.handlers.enums import AccessType
|
|
18
|
+
import logging
|
|
19
|
+
import time
|
|
20
|
+
from holado_python.standard_library.typing import Typing
|
|
21
|
+
from holado.common.handlers.undefined import default_value
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def reversed_enumerate(l):
|
|
27
|
+
return zip(range(len(l)-1, -1, -1), reversed(l))
|
|
28
|
+
|
|
29
|
+
def reversed_range(min_, max_=None, step=-1):
|
|
30
|
+
if max_ is None:
|
|
31
|
+
min_, max_ = 0, min_
|
|
32
|
+
return range(max_-1, min_-1, step)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Tools(object):
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
def get_indent_string(cls, indent):
|
|
39
|
+
return " " * indent
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def indent_string(cls, indent, txt, *, do_indent_first_line=True):
|
|
43
|
+
ind_str = Tools.get_indent_string(indent)
|
|
44
|
+
lines = txt.split("\n") if txt else []
|
|
45
|
+
if do_indent_first_line:
|
|
46
|
+
return ind_str + ("\n" + ind_str).join(lines)
|
|
47
|
+
else:
|
|
48
|
+
return ("\n" + ind_str).join(lines)
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def truncate_text(cls, text, length=Config.message_truncate_length, truncated_suffix=default_value, is_length_with_suffix=False, is_suffix_with_truncated_length=True):
|
|
52
|
+
"""Truncate text if needed.
|
|
53
|
+
Default truncate suffix is '[...(xxx)]' if is_suffix_with_truncated_length=True else '[...]'
|
|
54
|
+
Note: length can be None, meaning no truncate to do
|
|
55
|
+
"""
|
|
56
|
+
if length is not None and len(text) > length:
|
|
57
|
+
if truncated_suffix is default_value:
|
|
58
|
+
truncated_suffix = f"[...({len(text)-length})]" if is_suffix_with_truncated_length else "[...]"
|
|
59
|
+
if truncated_suffix:
|
|
60
|
+
if is_length_with_suffix:
|
|
61
|
+
return text[0 : length - len(truncated_suffix)] + truncated_suffix
|
|
62
|
+
else:
|
|
63
|
+
return text[0 : length] + truncated_suffix
|
|
64
|
+
else:
|
|
65
|
+
return text[0 : length]
|
|
66
|
+
else:
|
|
67
|
+
return text
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def represent_exception(cls, exc, tb=None, indent=0):
|
|
71
|
+
if sys.version_info >= (3,10):
|
|
72
|
+
if tb is not None:
|
|
73
|
+
list_format = traceback.format_exception(exc, value=exc, tb=tb)
|
|
74
|
+
else:
|
|
75
|
+
list_format = traceback.format_exception(exc)
|
|
76
|
+
else:
|
|
77
|
+
list_format = traceback.format_exception(type(exc), exc, exc.__traceback__)
|
|
78
|
+
return Tools.indent_string(indent, "".join(list_format))
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
def represent_object(cls, obj, indent=0, *, do_indent_first_line=True, full_details=False, access_type=AccessType.Public, max_level=3):
|
|
82
|
+
return cls.__represent_object(obj, indent, do_indent_first_line, full_details, access_type, max_level, [])
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def __represent_object(cls, obj, indent, do_indent_first_line, full_details, access_type, max_level, _internal):
|
|
86
|
+
from holado_core.common.tools.converters.converter import Converter
|
|
87
|
+
|
|
88
|
+
if Converter.is_primitive(obj) and not Converter.is_dict(obj) and not Converter.is_list(obj):
|
|
89
|
+
# logger.print(f"+++++ Tools.__represent_object: is primitive")
|
|
90
|
+
res = f"{obj} [{str(type(obj))}]" if full_details else f"{obj}"
|
|
91
|
+
else:
|
|
92
|
+
id_obj = id(obj)
|
|
93
|
+
if id_obj in _internal:
|
|
94
|
+
res = f"[RECURSION] (type: {str(type(obj))} ; id: {id_obj})" if full_details else f"[RECURSION]"
|
|
95
|
+
else:
|
|
96
|
+
_internal.append(id_obj)
|
|
97
|
+
|
|
98
|
+
if Converter.is_dict(obj):
|
|
99
|
+
# logger.print(f"+++++ Tools.__represent_object: is dict")
|
|
100
|
+
res_list = [f"{str(type(obj))}({id_obj})"] if full_details else []
|
|
101
|
+
# keys = sorted(value.keys())
|
|
102
|
+
keys = list(obj.keys())
|
|
103
|
+
for key in keys:
|
|
104
|
+
# logger.print(f"+++++ Tools.__represent_object: key: {key}")
|
|
105
|
+
val_str = cls.__represent_object(obj[key], 0, True, full_details, access_type, max_level-1, _internal)
|
|
106
|
+
if '\n' in val_str:
|
|
107
|
+
res_list.append(f" {key}:")
|
|
108
|
+
res_list.append(Tools.indent_string(4, val_str))
|
|
109
|
+
else:
|
|
110
|
+
res_list.append(f" {key}: {val_str}")
|
|
111
|
+
res = "\n".join(res_list)
|
|
112
|
+
elif Converter.is_list(obj):
|
|
113
|
+
# logger.print(f"+++++ Tools.__represent_object: is list")
|
|
114
|
+
res_list = [f"{str(type(obj))}({id_obj})"] if full_details else ["["]
|
|
115
|
+
# keys = sorted(value.keys())
|
|
116
|
+
for el in obj:
|
|
117
|
+
# for index, el in enumerate(obj):
|
|
118
|
+
# logger.print(f"+++++ Tools.__represent_object: index: {index}")
|
|
119
|
+
el_str = cls.__represent_object(el, 0, True, full_details, access_type, max_level-1, _internal)
|
|
120
|
+
if '\n' in el_str:
|
|
121
|
+
res_list.append(" {")
|
|
122
|
+
res_list.append(Tools.indent_string(4, el_str))
|
|
123
|
+
res_list.append(" }")
|
|
124
|
+
else:
|
|
125
|
+
res_list.append(f" {el_str}")
|
|
126
|
+
if not full_details:
|
|
127
|
+
res_list.append("]")
|
|
128
|
+
res = "\n".join(res_list)
|
|
129
|
+
else:
|
|
130
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
131
|
+
logger.trace(f"Representing object of type {Typing.get_object_class_fullname(obj)}")
|
|
132
|
+
attributes = Typing.get_object_attributes(obj, access_type=access_type)
|
|
133
|
+
# logger.print(f"+++++ Tools.__represent_object: {str(type(obj))} is object with {attributes=}")
|
|
134
|
+
if attributes:
|
|
135
|
+
res_list = [f"{str(type(obj))}({id_obj})"] if full_details else [f"{str(type(obj))}"]
|
|
136
|
+
if max_level > 0:
|
|
137
|
+
for name, value in attributes:
|
|
138
|
+
# logger.print(f"+++++ Tools.__represent_object: attribute '{name}'")
|
|
139
|
+
res_list.append(f" {name}: {cls.__represent_object(value, 4, False, full_details, access_type, max_level-1, _internal)}")
|
|
140
|
+
res = "\n".join(res_list)
|
|
141
|
+
else:
|
|
142
|
+
res = f"{obj} [{str(type(obj))}({id_obj})]" if full_details else f"{obj}"
|
|
143
|
+
# raise TechnicalException(f"Unmanaged representation of object of type '{Typing.get_object_class_fullname(obj)}'")
|
|
144
|
+
|
|
145
|
+
return Tools.indent_string(indent, res, do_indent_first_line=do_indent_first_line)
|
|
146
|
+
|
|
147
|
+
@classmethod
|
|
148
|
+
def has_sub_kwargs(cls, kwargs: dict, prefix: str):
|
|
149
|
+
for k in kwargs.keys():
|
|
150
|
+
if k.startswith(prefix):
|
|
151
|
+
return True
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
@classmethod
|
|
155
|
+
def pop_sub_kwargs(cls, kwargs: dict, prefix: str):
|
|
156
|
+
res = {}
|
|
157
|
+
for k in list(kwargs.keys()):
|
|
158
|
+
if k.startswith(prefix):
|
|
159
|
+
res[k[len(prefix):]] = kwargs.pop(k)
|
|
160
|
+
return res
|
|
161
|
+
|
|
162
|
+
@classmethod
|
|
163
|
+
def do_log_level(cls, log_level, max_log_level):
|
|
164
|
+
"""Define the log level to use: if log_level is greater than max_log_level, return max_log_level.
|
|
165
|
+
"""
|
|
166
|
+
return min(log_level, max_log_level)
|
|
167
|
+
|
|
168
|
+
@classmethod
|
|
169
|
+
def do_log(cls, logger, log_level, max_log_level=logging.CRITICAL):
|
|
170
|
+
return logger.isEnabledFor(cls.do_log_level(log_level, max_log_level))
|
|
171
|
+
|
|
172
|
+
@classmethod
|
|
173
|
+
def do_log_if_objects_are_different(cls, logger, log_level, obj1, obj2, max_log_level=logging.CRITICAL):
|
|
174
|
+
try:
|
|
175
|
+
return cls.do_log(logger, log_level, max_log_level) and (obj1 != obj2)
|
|
176
|
+
except Exception as exc:
|
|
177
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
178
|
+
logger.trace(f"Assume a log is needed since usually a comparison fails on mismatching types and thus objects are different. Obtained error: {exc}")
|
|
179
|
+
return True
|
|
180
|
+
|
|
181
|
+
@classmethod
|
|
182
|
+
def raise_same_exception_type(cls, exception, new_message, add_from=True):
|
|
183
|
+
exc = type(exception)(new_message)
|
|
184
|
+
if add_from:
|
|
185
|
+
raise exc from exception
|
|
186
|
+
else:
|
|
187
|
+
raise exc
|
|
188
|
+
|
|
189
|
+
@classmethod
|
|
190
|
+
def timer_s(cls):
|
|
191
|
+
return time.perf_counter()
|
|
192
|
+
|
|
193
|
+
@classmethod
|
|
194
|
+
def timer_ns(cls):
|
|
195
|
+
return time.perf_counter_ns()
|
|
196
|
+
|
|
197
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
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 .common.common_steps import *
|
|
17
|
+
from .common.config_steps import *
|
|
18
|
+
from .common.resource_steps import *
|
|
19
|
+
from .common.tables_steps import *
|
|
20
|
+
|
|
File without changes
|