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,233 @@
|
|
|
1
|
+
#################################################
|
|
2
|
+
# HolAdo (Holistic Automation do)
|
|
3
|
+
#
|
|
4
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
5
|
+
#
|
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
7
|
+
#
|
|
8
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
9
|
+
#
|
|
10
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
11
|
+
#################################################
|
|
12
|
+
|
|
13
|
+
from holado_core.common.tables.table_with_header import TableWithHeader
|
|
14
|
+
from holado_core.common.tables.table_row import TableRow
|
|
15
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
16
|
+
from holado_core.common.tools.converters.converter import Converter
|
|
17
|
+
from holado_python.standard_library.typing import Typing
|
|
18
|
+
import logging
|
|
19
|
+
from holado_json.ipc.json_converter import JsonConverter
|
|
20
|
+
from holado_core.common.tables.table_manager import TableManager
|
|
21
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
22
|
+
import re
|
|
23
|
+
from holado_core.common.tools.tools import Tools
|
|
24
|
+
from holado_data.data.generator.base import BaseGenerator
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class TableConverter(object):
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def convert_table_with_header_to_dict(cls, table):
|
|
35
|
+
res_list = cls.convert_table_with_header_to_dict_list(table, as_generator=False)
|
|
36
|
+
if len(res_list) == 0:
|
|
37
|
+
return None
|
|
38
|
+
elif len(res_list) == 1:
|
|
39
|
+
return res_list[0]
|
|
40
|
+
else:
|
|
41
|
+
raise TechnicalException(f"Failed to convert table to dict, since table has more than one row.")
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def convert_table_with_header_to_dict_list(cls, table, as_generator=False):
|
|
45
|
+
if as_generator:
|
|
46
|
+
class TableWithHeader2DictGenerator(BaseGenerator):
|
|
47
|
+
def __init__(self, table):
|
|
48
|
+
super().__init__(name="table with header to dict generator")
|
|
49
|
+
self.__table = table
|
|
50
|
+
self.__index_by_name = table.get_column_indexes_by_string_content()
|
|
51
|
+
self.__table_rows_iter = iter(self.__table.rows)
|
|
52
|
+
|
|
53
|
+
def __next__(self):
|
|
54
|
+
row = next(self.__table_rows_iter)
|
|
55
|
+
return {name: row.get_cell(index).content for name, index in self.__index_by_name.items()}
|
|
56
|
+
|
|
57
|
+
return TableWithHeader2DictGenerator(table)
|
|
58
|
+
else:
|
|
59
|
+
# index_by_name = table.get_column_indexes_by_string_content()
|
|
60
|
+
#
|
|
61
|
+
# res = []
|
|
62
|
+
# for row in table.rows:
|
|
63
|
+
# new_dict = {name: row.get_cell(index).content for name, index in index_by_name.items()}
|
|
64
|
+
# res.append(new_dict)
|
|
65
|
+
#
|
|
66
|
+
# return res
|
|
67
|
+
gen = cls.convert_table_with_header_to_dict_list(table, as_generator=True)
|
|
68
|
+
return [e for e in gen]
|
|
69
|
+
|
|
70
|
+
@classmethod
|
|
71
|
+
def convert_table_2_list_of_tuples(cls, table, as_generator=False):
|
|
72
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
73
|
+
logger.debug("Converting table to a list of tuples...")
|
|
74
|
+
if as_generator:
|
|
75
|
+
class Table2TupleGenerator(BaseGenerator):
|
|
76
|
+
def __init__(self, table):
|
|
77
|
+
super().__init__(name="table with header to dict generator")
|
|
78
|
+
self.__table = table
|
|
79
|
+
self.__table_rows_iter = iter(self.__table.rows)
|
|
80
|
+
|
|
81
|
+
def __next__(self):
|
|
82
|
+
row = next(self.__table_rows_iter)
|
|
83
|
+
return tuple((cell.content for cell in row.cells))
|
|
84
|
+
|
|
85
|
+
return Table2TupleGenerator(table)
|
|
86
|
+
else:
|
|
87
|
+
# return [tuple((cell.content for cell in row.cells)) for row in table.rows]
|
|
88
|
+
gen = cls.convert_table_2_list_of_tuples(table, as_generator=True)
|
|
89
|
+
return [e for e in gen]
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
def convert_dict_list_to_table_with_header(cls, dict_list):
|
|
93
|
+
"""
|
|
94
|
+
Builds a table with header from a list of dictionaries.
|
|
95
|
+
"""
|
|
96
|
+
header = set()
|
|
97
|
+
for index, new_dict in enumerate(dict_list):
|
|
98
|
+
if not Converter.is_dict(new_dict):
|
|
99
|
+
raise TechnicalException(f"The list element of index {index} is not a dict (obtained type: {Typing.get_object_class_fullname(new_dict)})")
|
|
100
|
+
header = header.union(new_dict.keys())
|
|
101
|
+
header = sorted(header)
|
|
102
|
+
|
|
103
|
+
res = TableWithHeader()
|
|
104
|
+
res.header = TableRow(cells_content=header)
|
|
105
|
+
|
|
106
|
+
for new_dict in dict_list:
|
|
107
|
+
res.add_row(contents_by_colname=new_dict)
|
|
108
|
+
|
|
109
|
+
return res
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def convert_name_value_table_2_dict(cls, table):
|
|
113
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
114
|
+
logger.trace(f"Converting Name/Value table to dict (table = {table})")
|
|
115
|
+
|
|
116
|
+
res = {}
|
|
117
|
+
if table is not None:
|
|
118
|
+
# Verify table structure
|
|
119
|
+
TableManager.verify_table_is_name_value_table(table)
|
|
120
|
+
|
|
121
|
+
for row in table.rows:
|
|
122
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
123
|
+
logger.trace("Converting row (%s)", row)
|
|
124
|
+
|
|
125
|
+
name = row.get_cell(0).content
|
|
126
|
+
value = row.get_cell(1).content
|
|
127
|
+
|
|
128
|
+
if name in res:
|
|
129
|
+
raise FunctionalException("Name '{}' appears several times in table".format(name))
|
|
130
|
+
else:
|
|
131
|
+
res[name] = value
|
|
132
|
+
|
|
133
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
134
|
+
logger.debug(f"Converting Name/Value table to dict (table = {table}) => {res}")
|
|
135
|
+
return res
|
|
136
|
+
|
|
137
|
+
@classmethod
|
|
138
|
+
def convert_name_value_table_2_json_object(cls, table, converter=None):
|
|
139
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
140
|
+
logger.trace(f"Converting Name/Value table to json object (table = {table})")
|
|
141
|
+
if converter is None:
|
|
142
|
+
converter = JsonConverter()
|
|
143
|
+
|
|
144
|
+
# Verify table structure
|
|
145
|
+
TableManager.verify_table_is_name_value_table(table)
|
|
146
|
+
|
|
147
|
+
res = {}
|
|
148
|
+
for row in table.rows:
|
|
149
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
150
|
+
logger.trace("Converting row (%s)", row)
|
|
151
|
+
|
|
152
|
+
name = row.get_cell(0).content
|
|
153
|
+
value = row.get_cell(1).content
|
|
154
|
+
value = converter.to_json(value)
|
|
155
|
+
|
|
156
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
157
|
+
logger.trace(f"Adding for name '{name}' json value [{value}] (type: {Typing.get_object_class_fullname(value)})")
|
|
158
|
+
cls._fill_json_dict(res, name, value)
|
|
159
|
+
|
|
160
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
161
|
+
logger.debug(f"Converting Name/Value table to json object (table = {table}) => {res}")
|
|
162
|
+
return res
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def extract_table_with_header_from_table(cls, table, row_first_index, row_last_index, col_first_index, col_last_index):
|
|
166
|
+
res = TableWithHeader()
|
|
167
|
+
|
|
168
|
+
header_content = [c.content for c in table.rows[row_first_index].cells[col_first_index:col_last_index+1]]
|
|
169
|
+
res.header = TableRow(cells_content=header_content)
|
|
170
|
+
|
|
171
|
+
for i in range(row_first_index+1, row_last_index+1):
|
|
172
|
+
row_content = [c.content for c in table.rows[i].cells[col_first_index:col_last_index+1]]
|
|
173
|
+
res.add_row(cells_content=row_content)
|
|
174
|
+
|
|
175
|
+
return res
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
@classmethod
|
|
179
|
+
def _fill_json_dict(cls, json_res, name, value):
|
|
180
|
+
if not isinstance(json_res, dict):
|
|
181
|
+
raise TechnicalException(f"Type '{Typing.get_object_class_fullname(json_res)}' is not a dict")
|
|
182
|
+
|
|
183
|
+
names = name.split(".", maxsplit=1)
|
|
184
|
+
name0 = names[0]
|
|
185
|
+
name1 = names[1] if len(names) > 1 else None
|
|
186
|
+
|
|
187
|
+
# manage lists
|
|
188
|
+
m = re.match(r"^([^[]+)\[(.*)\]$", name0)
|
|
189
|
+
if m:
|
|
190
|
+
li_name = m.group(1)
|
|
191
|
+
index = int(m.group(2))
|
|
192
|
+
|
|
193
|
+
if li_name not in json_res:
|
|
194
|
+
json_res[li_name] = []
|
|
195
|
+
cls._fill_json_list(json_res[li_name], index, name1, value)
|
|
196
|
+
return
|
|
197
|
+
|
|
198
|
+
if name1 is None:
|
|
199
|
+
cls._fill_json_dict_entry(json_res, name0, value)
|
|
200
|
+
else:
|
|
201
|
+
if name0 not in json_res:
|
|
202
|
+
json_res[name0] = {}
|
|
203
|
+
cls._fill_json_dict(json_res[name0], name1, value)
|
|
204
|
+
|
|
205
|
+
@classmethod
|
|
206
|
+
def _fill_json_dict_entry(cls, json_res, name, value):
|
|
207
|
+
if name in json_res:
|
|
208
|
+
raise FunctionalException(f"Name '{name}' is already set")
|
|
209
|
+
else:
|
|
210
|
+
json_res[name] = value
|
|
211
|
+
|
|
212
|
+
@classmethod
|
|
213
|
+
def _fill_json_list(cls, json_res, index, name, value):
|
|
214
|
+
if not isinstance(json_res, list):
|
|
215
|
+
raise TechnicalException(f"Type '{Typing.get_object_class_fullname(json_res)}' is not a list")
|
|
216
|
+
|
|
217
|
+
# Prepare list with missing elements
|
|
218
|
+
if index + 1 > len(json_res):
|
|
219
|
+
for _ in range(len(json_res), index + 1):
|
|
220
|
+
json_res.append(None)
|
|
221
|
+
|
|
222
|
+
if name is None:
|
|
223
|
+
if json_res[index] is None:
|
|
224
|
+
json_res[index] = value
|
|
225
|
+
else:
|
|
226
|
+
raise FunctionalException("List has already an element at index {}".format(index))
|
|
227
|
+
else:
|
|
228
|
+
if json_res[index] is None:
|
|
229
|
+
json_res[index] = {}
|
|
230
|
+
cls._fill_json_dict(json_res[index], name, value)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#################################################
|
|
2
|
+
# HolAdo (Holistic Automation do)
|
|
3
|
+
#
|
|
4
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
5
|
+
#
|
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
7
|
+
#
|
|
8
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
9
|
+
#
|
|
10
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
11
|
+
#################################################
|
|
12
|
+
|
|
13
|
+
from holado.common.handlers.enums import AutoNumber
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class MergeTypes(AutoNumber):
|
|
17
|
+
"""
|
|
18
|
+
Types of cell merge.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
LeftMerged = ()
|
|
22
|
+
TopMerged = ()
|
|
23
|
+
|
|
@@ -0,0 +1,261 @@
|
|
|
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
|
+
|
|
15
|
+
|
|
16
|
+
from builtins import super
|
|
17
|
+
from holado_core.common.tables.table_row import TableRow
|
|
18
|
+
import copy
|
|
19
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
20
|
+
import logging
|
|
21
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
22
|
+
from holado_core.common.tools.tools import Tools
|
|
23
|
+
from holado_python.standard_library.typing import Typing
|
|
24
|
+
from holado_python.common.iterables import is_sorted
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Table(object):
|
|
30
|
+
def __init__(self):
|
|
31
|
+
super().__init__()
|
|
32
|
+
|
|
33
|
+
self.__content = None
|
|
34
|
+
self.__parent = None
|
|
35
|
+
|
|
36
|
+
self.__rows = []
|
|
37
|
+
|
|
38
|
+
def __iter__(self):
|
|
39
|
+
return self.__rows.__iter__()
|
|
40
|
+
|
|
41
|
+
def __next__(self):
|
|
42
|
+
return self.__rows.__next__()
|
|
43
|
+
|
|
44
|
+
def __getitem__(self, key):
|
|
45
|
+
if isinstance(key, int):
|
|
46
|
+
return self.__rows[key]
|
|
47
|
+
else:
|
|
48
|
+
raise TechnicalException(f"Unmanaged key: {key} (type: {Typing.get_object_class_fullname(key)})")
|
|
49
|
+
|
|
50
|
+
def __copy__(self):
|
|
51
|
+
cls = self.__class__
|
|
52
|
+
res = cls()
|
|
53
|
+
|
|
54
|
+
# Copy rows
|
|
55
|
+
for row in self.rows:
|
|
56
|
+
res.add_row(row=copy.copy(row))
|
|
57
|
+
|
|
58
|
+
return res
|
|
59
|
+
|
|
60
|
+
def __deepcopy__(self, memo):
|
|
61
|
+
cls = self.__class__
|
|
62
|
+
result = cls.__new__(cls)
|
|
63
|
+
memo[id(self)] = result
|
|
64
|
+
for k, v in self.__dict__.items():
|
|
65
|
+
setattr(result, k, copy.deepcopy(v, memo))
|
|
66
|
+
return result
|
|
67
|
+
|
|
68
|
+
def __repr__(self)->str:
|
|
69
|
+
if self.nb_rows < 10 or self.nb_rows * self.nb_columns < 100:
|
|
70
|
+
return f"<{self.__class__.__name__}>({self.nb_rows}x{self.nb_columns})\n{self.represent()}"
|
|
71
|
+
else:
|
|
72
|
+
return f"<{self.__class__.__name__}>({self.nb_rows}x{self.nb_columns})\n{self.represent(limit_rows=10)}[...]"
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def content(self):
|
|
76
|
+
""" Content of whole table, relevant for some table types. """
|
|
77
|
+
return self.__content
|
|
78
|
+
|
|
79
|
+
@content.setter
|
|
80
|
+
def content(self, content):
|
|
81
|
+
""" Set content of whole table, relevant for some table types. """
|
|
82
|
+
self.__content = content
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def parent(self):
|
|
86
|
+
""" Parent, relevant for some table types. It's usually the origin of its creation. """
|
|
87
|
+
return self.__parent
|
|
88
|
+
|
|
89
|
+
@parent.setter
|
|
90
|
+
def parent(self, parent):
|
|
91
|
+
""" Set parent. """
|
|
92
|
+
self.__parent = parent
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def rows(self):
|
|
96
|
+
return self.__rows
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def nb_columns(self):
|
|
100
|
+
if self.nb_rows > 0:
|
|
101
|
+
return len(self.rows[0])
|
|
102
|
+
else:
|
|
103
|
+
return 0
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def nb_rows(self):
|
|
107
|
+
return len(self.__rows)
|
|
108
|
+
|
|
109
|
+
def add_row(self, row=None, cells=None, cells_content=None, **kwargs):
|
|
110
|
+
if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
|
|
111
|
+
logger.trace(f"add_row({row=}, {cells=}, {cells_content=})")
|
|
112
|
+
if row is not None:
|
|
113
|
+
self.__rows.append(row)
|
|
114
|
+
return row
|
|
115
|
+
else:
|
|
116
|
+
return self.add_row(row=self._new_row(cells=cells, cells_content=cells_content, **kwargs), **kwargs)
|
|
117
|
+
|
|
118
|
+
def extend(self, table, copy_method=None, **kwargs): # @UnusedVariable
|
|
119
|
+
for row in table.rows:
|
|
120
|
+
if copy_method is not None:
|
|
121
|
+
new_row = copy_method(row)
|
|
122
|
+
else:
|
|
123
|
+
new_row = row
|
|
124
|
+
self.add_row(row=new_row, **kwargs)
|
|
125
|
+
|
|
126
|
+
def _new_row(self, cells=None, cells_content=None, **kwargs): # @UnusedVariable
|
|
127
|
+
return TableRow(cells=cells, cells_content=cells_content)
|
|
128
|
+
|
|
129
|
+
def get_row(self, index, **kwargs) -> TableRow : # @UnusedVariable
|
|
130
|
+
return self.rows[index]
|
|
131
|
+
|
|
132
|
+
def get_column(self, index, **kwargs):
|
|
133
|
+
res = self._new_row(**kwargs)
|
|
134
|
+
for row in self.rows:
|
|
135
|
+
res.add_cell(cell=row[index], **kwargs)
|
|
136
|
+
return res
|
|
137
|
+
|
|
138
|
+
def add_column(self, col=None, cells=None, cells_content=None, **kwargs):
|
|
139
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
140
|
+
logger.debug(f"add_column({col=}, {cells=}, {cells_content=})")
|
|
141
|
+
if col is not None:
|
|
142
|
+
self.add_column(cells=col.cells, **kwargs)
|
|
143
|
+
elif cells is not None:
|
|
144
|
+
if len(cells) != self.nb_rows:
|
|
145
|
+
raise TechnicalException(f"Length of cells is {len(cells)} whereas table has {self.nb_rows} rows")
|
|
146
|
+
for i, cell in enumerate(cells):
|
|
147
|
+
self.get_row(i).add_cell(cell=cell, **kwargs)
|
|
148
|
+
elif cells_content is not None:
|
|
149
|
+
if len(cells_content) != self.nb_rows:
|
|
150
|
+
raise TechnicalException(f"Length of cells is {len(cells_content)} whereas table has {self.nb_rows} rows")
|
|
151
|
+
for i, cell_content in enumerate(cells_content):
|
|
152
|
+
self.get_row(i).add_cell(content=cell_content, **kwargs)
|
|
153
|
+
else:
|
|
154
|
+
for row in self.rows:
|
|
155
|
+
row.add_cell(content=None, **kwargs)
|
|
156
|
+
|
|
157
|
+
def remove_column(self, index=None, **kwargs):
|
|
158
|
+
if index is None:
|
|
159
|
+
raise TechnicalException("index must be specified")
|
|
160
|
+
|
|
161
|
+
for row in self.rows:
|
|
162
|
+
row.remove_cell(index, **kwargs)
|
|
163
|
+
|
|
164
|
+
def remove_row(self, index=None, **kwargs): # @UnusedVariable
|
|
165
|
+
if index is None:
|
|
166
|
+
raise TechnicalException("index must be specified")
|
|
167
|
+
elif index >= self.nb_rows:
|
|
168
|
+
raise FunctionalException(f"index is out of range ({index} >= {self.nb_rows})")
|
|
169
|
+
|
|
170
|
+
return self.rows.pop(index)
|
|
171
|
+
|
|
172
|
+
def represent(self, indent = 0, limit_rows=-1):
|
|
173
|
+
res_list = []
|
|
174
|
+
has_limited = False
|
|
175
|
+
for row in self.rows:
|
|
176
|
+
if limit_rows >=0 and len(res_list) >= limit_rows:
|
|
177
|
+
has_limited = True
|
|
178
|
+
break
|
|
179
|
+
|
|
180
|
+
if row is not None:
|
|
181
|
+
res_row = row.represent(indent)
|
|
182
|
+
else:
|
|
183
|
+
res_row = "{ROW_IS_NONE}"
|
|
184
|
+
res_row += "\n"
|
|
185
|
+
res_list.append(res_row)
|
|
186
|
+
|
|
187
|
+
res = "".join(res_list)
|
|
188
|
+
if has_limited:
|
|
189
|
+
res += Tools.indent_string(indent, "[...]\n")
|
|
190
|
+
return res
|
|
191
|
+
|
|
192
|
+
def switch_columns(self, index_1, index_2, **kwargs):
|
|
193
|
+
if index_1 == index_2:
|
|
194
|
+
raise TechnicalException(f"The two indexes are equal (index = {index_1})")
|
|
195
|
+
|
|
196
|
+
for row in self.rows:
|
|
197
|
+
row.switch_cells(index_1, index_2, **kwargs)
|
|
198
|
+
|
|
199
|
+
def sort(self, indexes, reverse=False, **kwargs): # @UnusedVariable
|
|
200
|
+
"""Sort table rows according to indexes order."""
|
|
201
|
+
if not indexes:
|
|
202
|
+
raise TechnicalException("At least one index must be defined")
|
|
203
|
+
self.__rows.sort(key=lambda x: tuple(x[i] for i in indexes), reverse=reverse)
|
|
204
|
+
|
|
205
|
+
def is_sorted(self, indexes, reverse=False, **kwargs): # @UnusedVariable
|
|
206
|
+
"""Check if table rows are sorted according to indexes order."""
|
|
207
|
+
if not indexes:
|
|
208
|
+
raise TechnicalException("At least one index must be defined")
|
|
209
|
+
return is_sorted(self.__rows, key=lambda x: tuple(x[i] for i in indexes), reverse=reverse)
|
|
210
|
+
|
|
211
|
+
def order_columns(self, indexes=None, **kwargs):
|
|
212
|
+
orig_col_indexes = list(range(self.nb_columns))
|
|
213
|
+
for col_index, orig_col_ind in enumerate(indexes):
|
|
214
|
+
cur_col_ind = orig_col_indexes.index(orig_col_ind)
|
|
215
|
+
if cur_col_ind != col_index:
|
|
216
|
+
self.switch_columns(index_1=col_index, index_2=cur_col_ind, **kwargs)
|
|
217
|
+
orig_col_indexes[col_index], orig_col_indexes[cur_col_ind] = orig_col_indexes[cur_col_ind], orig_col_indexes[col_index]
|
|
218
|
+
|
|
219
|
+
def remove_rows_verifying(self, expected_table, table_comparator, keep_rows=False, **kwargs):
|
|
220
|
+
"""
|
|
221
|
+
Remove rows that are equals compared to at least one line of expected_table.
|
|
222
|
+
If keep_rows is True, keep the rows rather than remove them.
|
|
223
|
+
"""
|
|
224
|
+
n = 0
|
|
225
|
+
while n < self.nb_rows:
|
|
226
|
+
row = self.get_row(n, **kwargs)
|
|
227
|
+
|
|
228
|
+
found = False
|
|
229
|
+
for i in range(expected_table.nb_rows):
|
|
230
|
+
found = table_comparator.row_comparator.equals(row, expected_table.get_row(i), raise_exception=False);
|
|
231
|
+
if found:
|
|
232
|
+
break
|
|
233
|
+
|
|
234
|
+
if found ^ keep_rows:
|
|
235
|
+
self.remove_row(n)
|
|
236
|
+
else:
|
|
237
|
+
n += 1
|
|
238
|
+
|
|
239
|
+
def remove_rows_duplicated(self, row_comparator, **kwargs):
|
|
240
|
+
"""
|
|
241
|
+
Remove rows that are duplicates of previous rows, using given row_comparator.
|
|
242
|
+
"""
|
|
243
|
+
n = 1
|
|
244
|
+
while n < self.nb_rows:
|
|
245
|
+
row = self.get_row(n)
|
|
246
|
+
|
|
247
|
+
found = False
|
|
248
|
+
for i in range(n):
|
|
249
|
+
found = row_comparator.equals(row, self.get_row(i), raise_exception=False);
|
|
250
|
+
if found:
|
|
251
|
+
break
|
|
252
|
+
|
|
253
|
+
if found:
|
|
254
|
+
self.remove_row(n, **kwargs)
|
|
255
|
+
else:
|
|
256
|
+
n += 1
|
|
257
|
+
|
|
258
|
+
def is_empty(self, **kwargs): # @UnusedVariable
|
|
259
|
+
return self.nb_rows == 0
|
|
260
|
+
|
|
261
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
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.tools.tools import Tools
|
|
15
|
+
import copy
|
|
16
|
+
from functools import total_ordering
|
|
17
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
18
|
+
from holado_python.standard_library.typing import Typing
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@total_ordering
|
|
22
|
+
class TableCell(object):
|
|
23
|
+
EMPTY_SYMBOL = u"None"
|
|
24
|
+
# LEFT_MERGED_SYMBOL = u"LeftMerged";
|
|
25
|
+
# TOP_MERGED_SYMBOL = u"TopMerged";
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
@summary: Table cell
|
|
29
|
+
"""
|
|
30
|
+
def __init__(self, cell_content = None):
|
|
31
|
+
self.__parent = None
|
|
32
|
+
|
|
33
|
+
if cell_content is not None and isinstance(cell_content, str) and cell_content == TableCell.EMPTY_SYMBOL:
|
|
34
|
+
self.__content = None
|
|
35
|
+
else:
|
|
36
|
+
self.__content = cell_content
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def parent(self):
|
|
40
|
+
""" Parent, relevant for some table types. It's usually the origin of its creation. """
|
|
41
|
+
return self.__parent
|
|
42
|
+
|
|
43
|
+
@parent.setter
|
|
44
|
+
def parent(self, parent):
|
|
45
|
+
""" Set parent. """
|
|
46
|
+
self.__parent = parent
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def content(self):
|
|
50
|
+
return self.__content
|
|
51
|
+
|
|
52
|
+
@content.setter
|
|
53
|
+
def content(self, cell_content):
|
|
54
|
+
self.__content = cell_content
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def string_content(self):
|
|
58
|
+
if self.__content is not None:
|
|
59
|
+
return str(self.__content)
|
|
60
|
+
else:
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
def _verify_valid_compared_object(self, other, raise_exception=True):
|
|
64
|
+
res = isinstance(other, TableCell)
|
|
65
|
+
if not res and raise_exception:
|
|
66
|
+
return TechnicalException(f"Unmanaged comparison between types '{self.__class__.__name__}' and '{other.__class__.__name__}'")
|
|
67
|
+
|
|
68
|
+
def __eq__(self, other):
|
|
69
|
+
self._verify_valid_compared_object(other)
|
|
70
|
+
return (self.content == other.content)
|
|
71
|
+
|
|
72
|
+
def __lt__(self, other):
|
|
73
|
+
self._verify_valid_compared_object(other)
|
|
74
|
+
return (self.content < other.content)
|
|
75
|
+
|
|
76
|
+
def __copy__(self):
|
|
77
|
+
cls = self.__class__
|
|
78
|
+
result = cls.__new__(cls)
|
|
79
|
+
result.__dict__.update(self.__dict__)
|
|
80
|
+
return result
|
|
81
|
+
|
|
82
|
+
def __deepcopy__(self, memo):
|
|
83
|
+
cls = self.__class__
|
|
84
|
+
result = cls.__new__(cls)
|
|
85
|
+
memo[id(self)] = result
|
|
86
|
+
for k, v in self.__dict__.items():
|
|
87
|
+
setattr(result, k, copy.deepcopy(v, memo))
|
|
88
|
+
return result
|
|
89
|
+
|
|
90
|
+
def __eq__(self, other):
|
|
91
|
+
if not isinstance(other, TableCell):
|
|
92
|
+
return NotImplemented(f"Not implemented to compare a {Typing.get_object_class_fullname(self)} to a {Typing.get_object_class_fullname(other)}")
|
|
93
|
+
return (self.content == other.content)
|
|
94
|
+
|
|
95
|
+
def __lt__(self, other):
|
|
96
|
+
if not isinstance(other, TableCell):
|
|
97
|
+
return NotImplemented(f"Not implemented to compare a {Typing.get_object_class_fullname(self)} to a {Typing.get_object_class_fullname(other)}")
|
|
98
|
+
return (self.content < other.content)
|
|
99
|
+
|
|
100
|
+
def __repr__(self)->str:
|
|
101
|
+
return f"<{self.__class__.__name__}>[{self.represent()}]"
|
|
102
|
+
|
|
103
|
+
def is_empty(self, **kwargs): # @UnusedVariable
|
|
104
|
+
return (self.__content is None)
|
|
105
|
+
|
|
106
|
+
def represent(self, indent = 0, cell_value_prefix = "'", cell_value_postfix = "'"):
|
|
107
|
+
res_list = []
|
|
108
|
+
|
|
109
|
+
res_list.append(Tools.get_indent_string(indent))
|
|
110
|
+
|
|
111
|
+
if self.is_empty():
|
|
112
|
+
res_list.append(TableCell.EMPTY_SYMBOL)
|
|
113
|
+
elif isinstance(self.__content, str):
|
|
114
|
+
if cell_value_prefix is not None:
|
|
115
|
+
res_list.append(cell_value_prefix)
|
|
116
|
+
res_list.append(self.string_content)
|
|
117
|
+
if cell_value_postfix is not None:
|
|
118
|
+
res_list.append(cell_value_postfix)
|
|
119
|
+
else:
|
|
120
|
+
res_list.append(self.string_content)
|
|
121
|
+
|
|
122
|
+
return "".join(res_list)
|
|
123
|
+
|
|
124
|
+
def compare_to(self, cell):
|
|
125
|
+
raise NotImplementedError()
|
|
126
|
+
|