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,341 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
import datetime
|
|
17
|
+
import dateutil.parser
|
|
18
|
+
import re
|
|
19
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
20
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
21
|
+
import os
|
|
22
|
+
from holado_core.common.tools.converters.converter import Converter
|
|
23
|
+
from enum import Enum
|
|
24
|
+
from holado_python.common.enums import ArithmeticOperator
|
|
25
|
+
from datetime import timedelta
|
|
26
|
+
from dateutil.relativedelta import relativedelta
|
|
27
|
+
import math
|
|
28
|
+
from decimal import Decimal
|
|
29
|
+
from holado_python.standard_library.typing import Typing
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
EPOCH_1970 = datetime.datetime(year=1970, month=1, day=1, tzinfo=datetime.timezone.utc)
|
|
35
|
+
EPOCH_JULIAN_CNES = datetime.datetime(year=1950, month=1, day=1, tzinfo=datetime.timezone.utc)
|
|
36
|
+
EPOCH_JULIAN_NASA = datetime.datetime(year=1968, month=5, day=24, tzinfo=datetime.timezone.utc)
|
|
37
|
+
|
|
38
|
+
FORMAT_DATETIME_ISO = '%Y-%m-%dT%H:%M:%S.%fZ'
|
|
39
|
+
FORMAT_DATETIME_ISO_SECONDS = '%Y-%m-%dT%H:%M:%SZ'
|
|
40
|
+
FORMAT_DATETIME_HUMAN_SECOND = '%Y-%m-%d %H:%M:%S'
|
|
41
|
+
FORMAT_TIME_ISO = '%H:%M:%S.%f'
|
|
42
|
+
FORMAT_TIME_ISO_SECONDS = '%H:%M:%S'
|
|
43
|
+
|
|
44
|
+
TIMEZONE_LOCAL = datetime.datetime.now().astimezone().tzinfo
|
|
45
|
+
TIMEZONE_UTC = datetime.timezone.utc
|
|
46
|
+
default_timezone = TIMEZONE_UTC
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class DurationUnit(str, Enum):
|
|
50
|
+
# Nanosecond = "nanosecond"
|
|
51
|
+
Microsecond = "microsecond"
|
|
52
|
+
Millisecond = "millisecond"
|
|
53
|
+
Second = "second"
|
|
54
|
+
Minute = "minute"
|
|
55
|
+
Hour = "hour"
|
|
56
|
+
Day = "day"
|
|
57
|
+
Week = "week"
|
|
58
|
+
Month = "month"
|
|
59
|
+
Year = "year"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class DateTime(object):
|
|
64
|
+
""" Tools to manipulate datetimes.
|
|
65
|
+
Note: Naive and aware datetimes cannot be compared. Thus HolAdo methods always set datetime timezone when it is known.
|
|
66
|
+
In methods unable to define the timezone (ex: str_2_datetime), it is highly recommended to specify 'tz' argument.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
__is_system_time_in_tai = None
|
|
70
|
+
__is_system_time_expected_in_tai = None
|
|
71
|
+
__utc_to_tai_timedelta = None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def __init__(self):
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def is_system_time_in_tai(cls):
|
|
79
|
+
"""Return if system time is in TAI (International Atomic Time)"""
|
|
80
|
+
if cls.__is_system_time_in_tai is None:
|
|
81
|
+
cls.__is_system_time_in_tai = Converter.to_boolean(os.getenv("HOLADO_SYSTEM_TIME_IS_IN_TAI", False))
|
|
82
|
+
return cls.__is_system_time_in_tai
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def now(cls, tz=default_timezone): # @UndefinedVariable
|
|
86
|
+
return datetime.datetime.now(tz=tz)
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def utcnow(cls):
|
|
90
|
+
if cls.is_system_time_in_tai():
|
|
91
|
+
return cls.now(TIMEZONE_UTC) - cls.utc_to_tai_timedelta()
|
|
92
|
+
else:
|
|
93
|
+
return cls.now(TIMEZONE_UTC)
|
|
94
|
+
|
|
95
|
+
@classmethod
|
|
96
|
+
def tainow(cls):
|
|
97
|
+
if cls.is_system_time_in_tai():
|
|
98
|
+
return cls.now(TIMEZONE_UTC)
|
|
99
|
+
else:
|
|
100
|
+
return cls.now(TIMEZONE_UTC) + cls.utc_to_tai_timedelta()
|
|
101
|
+
|
|
102
|
+
@classmethod
|
|
103
|
+
def utc_to_tai_timedelta(cls):
|
|
104
|
+
"""Return the timedelta to add to an UTC datetime to obtain a TAI datetime.
|
|
105
|
+
Note: Currently, only years 2020-2029 are managed"""
|
|
106
|
+
if cls.__utc_to_tai_timedelta is None:
|
|
107
|
+
cls.__utc_to_tai_timedelta = datetime.timedelta(seconds=37)
|
|
108
|
+
return cls.__utc_to_tai_timedelta
|
|
109
|
+
|
|
110
|
+
@classmethod
|
|
111
|
+
def apply_delta_on_datetime(cls, date:datetime, operator:ArithmeticOperator, duration, duration_unit:DurationUnit) -> datetime:
|
|
112
|
+
args={duration_unit.value+'s':duration}
|
|
113
|
+
if duration_unit in [DurationUnit.Millisecond]:
|
|
114
|
+
delta = timedelta(**args)
|
|
115
|
+
else:
|
|
116
|
+
delta = relativedelta(**args)
|
|
117
|
+
|
|
118
|
+
if operator == ArithmeticOperator.Subtraction:
|
|
119
|
+
res = date - delta
|
|
120
|
+
elif operator == ArithmeticOperator.Addition:
|
|
121
|
+
res = date + delta
|
|
122
|
+
else:
|
|
123
|
+
raise TechnicalException(f"Unmanaged operator '{operator.value}'")
|
|
124
|
+
|
|
125
|
+
return res
|
|
126
|
+
|
|
127
|
+
### Conversions to/from str
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def is_str_datetime(cls, dt_str, dt_format=None):
|
|
131
|
+
"""Return if a string is a datetime of given format"""
|
|
132
|
+
res = True
|
|
133
|
+
try:
|
|
134
|
+
DateTime.str_2_datetime(dt_str, dt_format)
|
|
135
|
+
except (dateutil.parser._parser.ParserError, ValueError, TypeError):
|
|
136
|
+
res = False
|
|
137
|
+
return res
|
|
138
|
+
|
|
139
|
+
@classmethod
|
|
140
|
+
def str_2_datetime(cls, dt_str, dt_format=None, tz=None):
|
|
141
|
+
"""Convert string to datetime instance
|
|
142
|
+
@param dt_format If defined, use this format to parse string rather than using first matching format
|
|
143
|
+
@param tz If defined, return a datetime with this timezone.
|
|
144
|
+
If string already defines a timezone, the datetime is converted to this timezone,
|
|
145
|
+
else the string is supposed to represent a datetime in this timezone and timezone is set in result datetime.
|
|
146
|
+
Note: Naive and aware datetimes cannot be compared. Thus HolAdo methods always set datetime timezone when it is known.
|
|
147
|
+
It is highly recommended to specify 'tz' argument
|
|
148
|
+
"""
|
|
149
|
+
res = None
|
|
150
|
+
if dt_format is None:
|
|
151
|
+
res = dateutil.parser.parse(dt_str)
|
|
152
|
+
else:
|
|
153
|
+
res = datetime.datetime.strptime(dt_str, dt_format)
|
|
154
|
+
|
|
155
|
+
# Set timezone if needed
|
|
156
|
+
if tz is not None:
|
|
157
|
+
if res.tzinfo is None:
|
|
158
|
+
res = res.replace(tzinfo=tz)
|
|
159
|
+
else:
|
|
160
|
+
res = res.astimezone(tz)
|
|
161
|
+
|
|
162
|
+
return res
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def str_2_timedelta(cls, dur_str):
|
|
166
|
+
"""Convert string to timedelta instance"""
|
|
167
|
+
res = None
|
|
168
|
+
dur_regex = re.compile(r"(\d+(?:\.\d*)?) (?:s|sec|seconds)")
|
|
169
|
+
r = dur_regex.match(dur_str)
|
|
170
|
+
if r:
|
|
171
|
+
res = datetime.timedelta(seconds=float(r.group(1)))
|
|
172
|
+
else:
|
|
173
|
+
raise FunctionalException(r"Duration string must match pattern '\d+(\.\d*)? (s|sec|seconds)'")
|
|
174
|
+
return res
|
|
175
|
+
|
|
176
|
+
@classmethod
|
|
177
|
+
def datetime_2_str(cls, dt_value, dt_format=None):
|
|
178
|
+
res = None
|
|
179
|
+
if dt_format is None:
|
|
180
|
+
res = datetime.datetime.isoformat(dt_value)
|
|
181
|
+
else:
|
|
182
|
+
res = dt_value.strftime(dt_format)
|
|
183
|
+
return res
|
|
184
|
+
|
|
185
|
+
@classmethod
|
|
186
|
+
def _get_datetime(cls, dt, tz_in_str=None):
|
|
187
|
+
res = None
|
|
188
|
+
if dt is not None:
|
|
189
|
+
if isinstance(dt, datetime.datetime):
|
|
190
|
+
res = dt
|
|
191
|
+
elif isinstance(dt, str):
|
|
192
|
+
res = DateTime.str_2_datetime(dt, tz=tz_in_str)
|
|
193
|
+
else:
|
|
194
|
+
raise TechnicalException(f"Datetime can be a datetime, a str containing a datetime, or None")
|
|
195
|
+
return res
|
|
196
|
+
|
|
197
|
+
@classmethod
|
|
198
|
+
def _get_epoch_datetime(cls, epoch, tz_in_str=None):
|
|
199
|
+
res = None
|
|
200
|
+
if epoch is not None:
|
|
201
|
+
if isinstance(epoch, datetime.datetime):
|
|
202
|
+
res = epoch
|
|
203
|
+
elif isinstance(epoch, str):
|
|
204
|
+
if epoch in ['EPOCH_1970', 'EPOCH_JULIAN_CNES', 'EPOCH_JULIAN_NASA']:
|
|
205
|
+
res = eval(epoch)
|
|
206
|
+
else:
|
|
207
|
+
res = DateTime.str_2_datetime(epoch, tz=tz_in_str)
|
|
208
|
+
else:
|
|
209
|
+
raise TechnicalException(f"Epoch can be a datetime, a str containing a datetime, a str containing an EPOCH name, or None")
|
|
210
|
+
return res
|
|
211
|
+
|
|
212
|
+
@classmethod
|
|
213
|
+
def _get_timestamp(cls, ts):
|
|
214
|
+
res = None
|
|
215
|
+
if ts is not None:
|
|
216
|
+
if isinstance(ts, float) or isinstance(ts, int):
|
|
217
|
+
res = ts
|
|
218
|
+
elif isinstance(ts, str) and (Converter.is_float(ts) or Converter.is_integer(ts)):
|
|
219
|
+
res = Converter.to_float(ts)
|
|
220
|
+
else:
|
|
221
|
+
raise TechnicalException(f"Timestamp must be a float|int or a string containing a float|int (obtained type: {Typing.get_object_class_fullname(ts)})")
|
|
222
|
+
return res
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
### Conversions to/from timestamp
|
|
226
|
+
|
|
227
|
+
@classmethod
|
|
228
|
+
def datetime_to_timestamp(cls, dt, epoch=None):
|
|
229
|
+
dt = cls._get_datetime(dt)
|
|
230
|
+
epoch = cls._get_epoch_datetime(epoch)
|
|
231
|
+
|
|
232
|
+
if epoch is None:
|
|
233
|
+
return dt.timestamp()
|
|
234
|
+
else:
|
|
235
|
+
return (dt - epoch).total_seconds()
|
|
236
|
+
|
|
237
|
+
@classmethod
|
|
238
|
+
def timestamp_to_datetime(cls, ts, epoch=None):
|
|
239
|
+
"""
|
|
240
|
+
Convert timestamp to UTC datetime
|
|
241
|
+
"""
|
|
242
|
+
ts = cls._get_timestamp(ts)
|
|
243
|
+
epoch = cls._get_epoch_datetime(epoch)
|
|
244
|
+
|
|
245
|
+
res = datetime.datetime.fromtimestamp(ts, tz=datetime.timezone.utc)
|
|
246
|
+
if epoch is not None:
|
|
247
|
+
res = epoch + (res - EPOCH_1970)
|
|
248
|
+
return res
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
### Conversions to/from (seconds, nanos)
|
|
252
|
+
|
|
253
|
+
@classmethod
|
|
254
|
+
def datetime_to_seconds_nanos(cls, dt, epoch=None):
|
|
255
|
+
ts = cls.datetime_to_timestamp(dt, epoch)
|
|
256
|
+
return cls.timestamp_to_seconds_nanos(ts)
|
|
257
|
+
|
|
258
|
+
@classmethod
|
|
259
|
+
def seconds_nanos_to_datetime(cls, seconds, nanos, epoch=None, round_func=round):
|
|
260
|
+
"""
|
|
261
|
+
Convert timestamp to UTC datetime
|
|
262
|
+
@param round_func: defines the rounding method applied to microseconds (default: round ; possible methods: round, math.ceil, math.trunc)
|
|
263
|
+
"""
|
|
264
|
+
ts = cls.seconds_nanos_to_timestamp(seconds, nanos, round_func=round_func)
|
|
265
|
+
return cls.timestamp_to_datetime(ts, epoch)
|
|
266
|
+
|
|
267
|
+
@classmethod
|
|
268
|
+
def timestamp_to_seconds_nanos(cls, ts):
|
|
269
|
+
return round(ts), round(ts * 1e6 % 1e6)
|
|
270
|
+
|
|
271
|
+
@classmethod
|
|
272
|
+
def seconds_nanos_to_timestamp(cls, seconds, nanos, cast_func=float, round_func=round):
|
|
273
|
+
"""
|
|
274
|
+
Convert (seconds, nanos) to timestamp.
|
|
275
|
+
By default, it returns a timestamp as float with nanos rounded to microsecond precision.
|
|
276
|
+
To keep nanosecond precision, set cast_func=None and round_func=None, it will returns a timestamp as decimal.Decimal.
|
|
277
|
+
@param cast_func: Type of the returned value (default: float). If None, no cast is applied, and result is of type decimal.Decimal, usefull to keep nanosecond precision.
|
|
278
|
+
@param round_func: defines the rounding method applied to microseconds (default: round ; possible methods: round, math.ceil, math.trunc). If None, value is not rounded.
|
|
279
|
+
"""
|
|
280
|
+
res_dec = Decimal(seconds) + Decimal(nanos) / Decimal(1e9)
|
|
281
|
+
if round_func is not None:
|
|
282
|
+
res_dec = round_func(res_dec * 1000000) / 1000000
|
|
283
|
+
if cast_func is not None:
|
|
284
|
+
return cast_func(res_dec)
|
|
285
|
+
else:
|
|
286
|
+
return res_dec
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
### Conversions to/from Julian date
|
|
290
|
+
|
|
291
|
+
@classmethod
|
|
292
|
+
def datetime_to_julian_date(cls, dt, epoch=None):
|
|
293
|
+
if epoch is None:
|
|
294
|
+
return cls.datetime_to_julian_date(dt, epoch=EPOCH_JULIAN_CNES) + 2433282.5
|
|
295
|
+
else:
|
|
296
|
+
td = (dt - epoch)
|
|
297
|
+
return td.days + td.seconds / (3600 * 24)
|
|
298
|
+
|
|
299
|
+
@classmethod
|
|
300
|
+
def julian_date_to_datetime(cls, jd, epoch=None, precision_nb_digits=6):
|
|
301
|
+
""" Convert a Julian date to a datetime instance
|
|
302
|
+
@param precision_nb_digits Precision of the Julian date (default: 6 = microseconds)
|
|
303
|
+
"""
|
|
304
|
+
if epoch is None:
|
|
305
|
+
return cls.julian_date_to_datetime(jd - 2433282.5, epoch=EPOCH_JULIAN_CNES)
|
|
306
|
+
else:
|
|
307
|
+
jd_decimal, jd_days = math.modf(jd)
|
|
308
|
+
jd_seconds = round(jd_decimal * 3600 * 24, precision_nb_digits)
|
|
309
|
+
td = datetime.timedelta(days=round(jd_days), seconds=jd_seconds)
|
|
310
|
+
return epoch + td
|
|
311
|
+
|
|
312
|
+
@classmethod
|
|
313
|
+
def datetime_utc_to_tai(cls, dt, dt_format=None):
|
|
314
|
+
""" Convert a datetime in UTC to a datetime in TAI
|
|
315
|
+
@param dt Datetime in UTC
|
|
316
|
+
@param dt_format Format to use if 'dt' is a string (can be None for format autodetection)
|
|
317
|
+
"""
|
|
318
|
+
dt_src = dt
|
|
319
|
+
if isinstance(dt_src, str):
|
|
320
|
+
dt_src = cls.str_2_datetime(dt_src, dt_format, tz=TIMEZONE_UTC)
|
|
321
|
+
|
|
322
|
+
return dt_src + DateTime.utc_to_tai_timedelta()
|
|
323
|
+
|
|
324
|
+
@classmethod
|
|
325
|
+
def datetime_tai_to_utc(cls, dt, dt_format=None):
|
|
326
|
+
""" Convert a datetime in TAI to a datetime in UTC
|
|
327
|
+
@param dt Datetime in TAI
|
|
328
|
+
@param dt_format Format to use if 'dt' is a string (can be None for format autodetection)
|
|
329
|
+
"""
|
|
330
|
+
dt_src = dt
|
|
331
|
+
if isinstance(dt_src, str):
|
|
332
|
+
dt_src = cls.str_2_datetime(dt_src, dt_format, tz=TIMEZONE_UTC)
|
|
333
|
+
|
|
334
|
+
return dt_src - DateTime.utc_to_tai_timedelta()
|
|
335
|
+
|
|
336
|
+
@classmethod
|
|
337
|
+
def truncate_datetime(cls, dt, precision_nanoseconds=1):
|
|
338
|
+
total_us = cls.datetime_to_timestamp(dt) * 1e9
|
|
339
|
+
trunc_total_us = total_us // precision_nanoseconds * precision_nanoseconds
|
|
340
|
+
return cls.timestamp_to_datetime(trunc_total_us / 1e9)
|
|
341
|
+
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
import csv
|
|
17
|
+
from holado_core.common.tables.table_with_header import TableWithHeader
|
|
18
|
+
from holado_core.common.tables.table_row import TableRow
|
|
19
|
+
from holado.common.context.session_context import SessionContext
|
|
20
|
+
from holado_core.common.tables.table import Table
|
|
21
|
+
from holado_core.common.tables.table_manager import TableManager
|
|
22
|
+
from holado_data.data.generator.base import BaseGenerator
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class CsvManager():
|
|
30
|
+
# Default settings for CSV files: dialect Excel but with ';' delimiter
|
|
31
|
+
default_dialect = "excel"
|
|
32
|
+
default_delimiter = ";"
|
|
33
|
+
default_quotechar = None
|
|
34
|
+
default_quoting = None
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def __get_path_manager(cls):
|
|
38
|
+
return SessionContext.instance().path_manager
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def _get_csv_kwargs(cls, dialect, delimiter, quotechar, quoting):
|
|
42
|
+
csv_kwargs = {}
|
|
43
|
+
|
|
44
|
+
if dialect is not None:
|
|
45
|
+
csv_kwargs['dialect'] = dialect
|
|
46
|
+
elif cls.default_dialect is not None:
|
|
47
|
+
csv_kwargs['dialect'] = cls.default_dialect
|
|
48
|
+
|
|
49
|
+
if delimiter is not None:
|
|
50
|
+
csv_kwargs['delimiter'] = delimiter
|
|
51
|
+
elif cls.default_delimiter is not None:
|
|
52
|
+
csv_kwargs['delimiter'] = cls.default_delimiter
|
|
53
|
+
|
|
54
|
+
if quotechar is not None:
|
|
55
|
+
csv_kwargs['quotechar'] = quotechar
|
|
56
|
+
elif cls.default_quotechar is not None:
|
|
57
|
+
csv_kwargs['quotechar'] = cls.default_quotechar
|
|
58
|
+
|
|
59
|
+
if quoting is not None:
|
|
60
|
+
csv_kwargs['quoting'] = quoting
|
|
61
|
+
elif cls.default_quoting is not None:
|
|
62
|
+
csv_kwargs['quoting'] = cls.default_quoting
|
|
63
|
+
|
|
64
|
+
return csv_kwargs
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def table_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None, with_header=True):
|
|
68
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
69
|
+
|
|
70
|
+
with open(path, 'r', encoding=encoding) as fin:
|
|
71
|
+
if with_header:
|
|
72
|
+
dr = csv.DictReader(fin, **csv_kwargs)
|
|
73
|
+
|
|
74
|
+
res = TableWithHeader()
|
|
75
|
+
res.header = TableRow(cells_content=dr.fieldnames)
|
|
76
|
+
|
|
77
|
+
for row in dr:
|
|
78
|
+
nrow=dict(row)
|
|
79
|
+
res.add_row(contents_by_colname=nrow)
|
|
80
|
+
else:
|
|
81
|
+
reader = csv.reader(fin, **csv_kwargs)
|
|
82
|
+
|
|
83
|
+
res = Table()
|
|
84
|
+
for row in reader:
|
|
85
|
+
res.add_row(cells_content=row)
|
|
86
|
+
|
|
87
|
+
return res
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def dict_list_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
91
|
+
dg = cls.dict_generator_with_content_of_CSV_file(path, encoding, dialect, delimiter, quotechar, quoting)
|
|
92
|
+
return [d for d in dg]
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def dict_generator_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
96
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
97
|
+
|
|
98
|
+
class DictCSVGenerator(BaseGenerator):
|
|
99
|
+
def __init__(self, path, encoding, csv_kwargs):
|
|
100
|
+
super().__init__(name="dict CSV generator")
|
|
101
|
+
|
|
102
|
+
self.__path = path
|
|
103
|
+
self.__encoding = encoding
|
|
104
|
+
self.__csv_kwargs = csv_kwargs
|
|
105
|
+
|
|
106
|
+
self.__fin = None
|
|
107
|
+
self.__dict_reader = None
|
|
108
|
+
|
|
109
|
+
def __open_file_if_needed(self):
|
|
110
|
+
if self.__fin is None:
|
|
111
|
+
self.__fin = open(self.__path, 'r', encoding=self.__encoding)
|
|
112
|
+
self.__dict_reader = csv.DictReader(self.__fin, **self.__csv_kwargs)
|
|
113
|
+
|
|
114
|
+
def __close_file(self):
|
|
115
|
+
self.__dict_reader = None
|
|
116
|
+
self.__fin.close()
|
|
117
|
+
self.__fin = None
|
|
118
|
+
|
|
119
|
+
def __next__(self):
|
|
120
|
+
self.__open_file_if_needed()
|
|
121
|
+
try:
|
|
122
|
+
return dict(next(self.__dict_reader))
|
|
123
|
+
except StopIteration as exc:
|
|
124
|
+
self.__close_file()
|
|
125
|
+
raise exc
|
|
126
|
+
|
|
127
|
+
return DictCSVGenerator(path, encoding, csv_kwargs)
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def tuple_list_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
131
|
+
tg = cls.tuple_generator_with_content_of_CSV_file(path, encoding, dialect, delimiter, quotechar, quoting)
|
|
132
|
+
return [t for t in tg]
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
def tuple_generator_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
136
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
137
|
+
|
|
138
|
+
class TupleCSVGenerator(BaseGenerator):
|
|
139
|
+
def __init__(self, path, encoding, csv_kwargs):
|
|
140
|
+
super().__init__(name="tuple CSV generator")
|
|
141
|
+
|
|
142
|
+
self.__path = path
|
|
143
|
+
self.__encoding = encoding
|
|
144
|
+
self.__csv_kwargs = csv_kwargs
|
|
145
|
+
|
|
146
|
+
self.__fin = None
|
|
147
|
+
self.__reader = None
|
|
148
|
+
|
|
149
|
+
def __open_file_if_needed(self):
|
|
150
|
+
if self.__fin is None:
|
|
151
|
+
self.__fin = open(self.__path, 'r', encoding=self.__encoding)
|
|
152
|
+
self.__reader = csv.reader(self.__fin, **self.__csv_kwargs)
|
|
153
|
+
|
|
154
|
+
def __close_file(self):
|
|
155
|
+
self.__reader = None
|
|
156
|
+
self.__fin.close()
|
|
157
|
+
self.__fin = None
|
|
158
|
+
|
|
159
|
+
def __next__(self):
|
|
160
|
+
self.__open_file_if_needed()
|
|
161
|
+
try:
|
|
162
|
+
return tuple(next(self.__reader))
|
|
163
|
+
except StopIteration as exc:
|
|
164
|
+
self.__close_file()
|
|
165
|
+
raise exc
|
|
166
|
+
|
|
167
|
+
return TupleCSVGenerator(path, encoding, csv_kwargs)
|
|
168
|
+
|
|
169
|
+
@classmethod
|
|
170
|
+
def create_csv_file(cls, path, table, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
|
|
171
|
+
csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
|
|
172
|
+
|
|
173
|
+
cls.__get_path_manager().makedirs(path)
|
|
174
|
+
|
|
175
|
+
with open(path, 'w', encoding=encoding) as fout:
|
|
176
|
+
if TableManager.is_table_with_header(table):
|
|
177
|
+
fieldnames = table.header.cells_content
|
|
178
|
+
dw = csv.DictWriter(fout, fieldnames=fieldnames, **csv_kwargs)
|
|
179
|
+
|
|
180
|
+
dw.writeheader()
|
|
181
|
+
for row in table.rows:
|
|
182
|
+
rowdict = {fieldnames[i]:row[i].string_content for i in range(len(fieldnames))}
|
|
183
|
+
dw.writerow(rowdict)
|
|
184
|
+
else:
|
|
185
|
+
writer = csv.writer(fout, **csv_kwargs)
|
|
186
|
+
for row in table.rows:
|
|
187
|
+
cells_content = [c.string_content for c in row]
|
|
188
|
+
writer.writerow(cells_content)
|
|
189
|
+
|
|
190
|
+
@classmethod
|
|
191
|
+
def merge_csv(cls, input_paths, output_path=None, sort_column=None, with_header=True):
|
|
192
|
+
input_tables = [cls.table_with_content_of_CSV_file(ip, with_header=with_header) for ip in input_paths]
|
|
193
|
+
|
|
194
|
+
# Merge tables
|
|
195
|
+
output_table = input_tables[0]
|
|
196
|
+
for i in range(1, len(input_tables)):
|
|
197
|
+
output_table.extend(input_tables[i])
|
|
198
|
+
|
|
199
|
+
# Sort rows
|
|
200
|
+
if sort_column is not None:
|
|
201
|
+
output_table.sort(names=[sort_column])
|
|
202
|
+
|
|
203
|
+
if output_path is not None:
|
|
204
|
+
cls.create_csv_file(output_path, output_table)
|
|
205
|
+
else:
|
|
206
|
+
return output_table
|
|
207
|
+
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
#################################################
|
|
4
|
+
# HolAdo (Holistic Automation do)
|
|
5
|
+
#
|
|
6
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
11
|
+
|
|
12
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
13
|
+
#################################################
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
import hashlib
|
|
17
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class HashTools(object):
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def code(cls, content, code_size=None, prefix=None):
|
|
28
|
+
hex_size = code_size
|
|
29
|
+
if hex_size is not None:
|
|
30
|
+
if prefix is not None:
|
|
31
|
+
hex_size = hex_size - len(prefix)
|
|
32
|
+
hex_size = hex_size // 2 * 2
|
|
33
|
+
|
|
34
|
+
res = cls.hexblake2(content, hex_size=hex_size)
|
|
35
|
+
|
|
36
|
+
if prefix is not None:
|
|
37
|
+
res = prefix + res
|
|
38
|
+
|
|
39
|
+
return res
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def hash(cls, algorithm_name, content, hash_size=None, **hash_kwargs):
|
|
43
|
+
hash_obj = hashlib.new(algorithm_name, **hash_kwargs)
|
|
44
|
+
cls._update_hash(hash_obj, content)
|
|
45
|
+
res = hash_obj.digest()
|
|
46
|
+
|
|
47
|
+
# Truncate result size if needed
|
|
48
|
+
if hash_size is not None:
|
|
49
|
+
if not isinstance(hash_size, int):
|
|
50
|
+
raise TechnicalException(f"Parameter size must be an integer")
|
|
51
|
+
res = res[:hash_size]
|
|
52
|
+
|
|
53
|
+
return res
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def hexhash(cls, algorithm_name, content, hex_size=None, **hash_kwargs):
|
|
57
|
+
hash_obj = hashlib.new(algorithm_name, **hash_kwargs)
|
|
58
|
+
cls._update_hash(hash_obj, content)
|
|
59
|
+
res = hash_obj.hexdigest()
|
|
60
|
+
|
|
61
|
+
# Truncate result size if needed
|
|
62
|
+
if hex_size is not None:
|
|
63
|
+
if not isinstance(hex_size, int):
|
|
64
|
+
raise TechnicalException(f"Parameter hex_size must be an integer")
|
|
65
|
+
res = res[:hex_size]
|
|
66
|
+
|
|
67
|
+
return res
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def hexmd5(cls, content):
|
|
71
|
+
hash_obj = hashlib.md5()
|
|
72
|
+
cls._update_hash(hash_obj, content)
|
|
73
|
+
return hash_obj.hexdigest()
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def hexblake2(cls, content, hex_size=None, **hash_kwargs):
|
|
77
|
+
if hex_size is not None:
|
|
78
|
+
if isinstance(hex_size, int):
|
|
79
|
+
digest_size = hex_size // 2
|
|
80
|
+
else:
|
|
81
|
+
raise TechnicalException(f"Parameter hex_size must be an integer")
|
|
82
|
+
hash_kwargs['digest_size'] = digest_size
|
|
83
|
+
|
|
84
|
+
hash_obj = hashlib.blake2b(**hash_kwargs)
|
|
85
|
+
cls._update_hash(hash_obj, content)
|
|
86
|
+
return hash_obj.hexdigest()
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def _update_hash(cls, hash_obj, content):
|
|
90
|
+
# Manage list separately for memory purpose
|
|
91
|
+
done = False
|
|
92
|
+
if not isinstance(content, str):
|
|
93
|
+
try:
|
|
94
|
+
for cont in content:
|
|
95
|
+
if type(cont) != bytes:
|
|
96
|
+
cont = cont.encode('utf-8')
|
|
97
|
+
hash_obj.update(cont)
|
|
98
|
+
done = True
|
|
99
|
+
except TypeError:
|
|
100
|
+
done = False
|
|
101
|
+
|
|
102
|
+
if not done:
|
|
103
|
+
if type(content) != bytes:
|
|
104
|
+
content = content.encode('utf-8')
|
|
105
|
+
hash_obj.update(content)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|