holado 0.2.2__py3-none-any.whl → 0.2.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of holado might be problematic. Click here for more details.
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/METADATA +13 -9
- holado-0.2.3.dist-info/RECORD +535 -0
- holado_ais/__init__.py +33 -0
- holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
- holado_ais/ais/ais_manager.py +151 -0
- holado_ais/ais/ais_messages.py +203 -0
- holado_ais/ais/ais_payload.py +35 -0
- holado_ais/ais/enums.py +37 -0
- holado_ais/ais/patch_pyais.py +1303 -0
- holado_ais/tests/behave/steps/__init__.py +17 -0
- holado_ais/tests/behave/steps/ais/__init__.py +0 -0
- holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
- holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
- holado_binary/__init__.py +17 -0
- holado_binary/ipc/binary.py +125 -0
- holado_binary/ipc/bit_series.py +307 -0
- holado_binary/tests/behave/steps/__init__.py +17 -0
- holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
- holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
- holado_context/__init__.py +16 -0
- holado_context/tests/behave/steps/__init__.py +16 -0
- holado_context/tests/behave/steps/private/__init__.py +16 -0
- holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
- holado_core/__init__.py +32 -0
- holado_core/common/__init__.py +0 -0
- holado_core/common/actors/actions.py +97 -0
- holado_core/common/actors/actor.py +226 -0
- holado_core/common/actors/element_actor.py +32 -0
- holado_core/common/actors/find_actor.py +106 -0
- holado_core/common/actors/tree_actor.py +32 -0
- holado_core/common/actors/verify_actions.py +69 -0
- holado_core/common/block/base.py +122 -0
- holado_core/common/block/block_manager.py +173 -0
- holado_core/common/block/block_method.py +46 -0
- holado_core/common/block/block_steps.py +37 -0
- holado_core/common/block/function.py +42 -0
- holado_core/common/block/scope_function.py +28 -0
- holado_core/common/block/scope_manager.py +238 -0
- holado_core/common/block/scope_steps.py +141 -0
- holado_core/common/criterias/and_criteria.py +61 -0
- holado_core/common/criterias/criteria.py +78 -0
- holado_core/common/criterias/or_criteria.py +64 -0
- holado_core/common/criterias/tools/criteria_context.py +20 -0
- holado_core/common/criterias/tools/criteria_parameters.py +18 -0
- holado_core/common/drivers/driver.py +153 -0
- holado_core/common/drivers/element_driver.py +30 -0
- holado_core/common/drivers/element_internal_api.py +239 -0
- holado_core/common/drivers/internal_api.py +40 -0
- holado_core/common/drivers/tree_driver.py +30 -0
- holado_core/common/drivers/tree_internal_api.py +176 -0
- holado_core/common/exceptions/__init__.py +0 -0
- holado_core/common/exceptions/element_exception.py +28 -0
- holado_core/common/exceptions/exceptions.py +24 -0
- holado_core/common/exceptions/functional_exception.py +21 -0
- holado_core/common/exceptions/holado_exception.py +25 -0
- holado_core/common/exceptions/technical_exception.py +27 -0
- holado_core/common/exceptions/timeout_exception.py +20 -0
- holado_core/common/exceptions/verify_exception.py +20 -0
- holado_core/common/finders/after_in_tree_finder.py +87 -0
- holado_core/common/finders/element_finder.py +60 -0
- holado_core/common/finders/else_finder.py +105 -0
- holado_core/common/finders/finder.py +478 -0
- holado_core/common/finders/or_finder.py +98 -0
- holado_core/common/finders/then_finder.py +157 -0
- holado_core/common/finders/tools/enums.py +30 -0
- holado_core/common/finders/tools/find_builder.py +118 -0
- holado_core/common/finders/tools/find_context.py +405 -0
- holado_core/common/finders/tools/find_info.py +27 -0
- holado_core/common/finders/tools/find_parameters.py +240 -0
- holado_core/common/finders/tools/find_updater.py +95 -0
- holado_core/common/finders/tools/finder_info.py +26 -0
- holado_core/common/finders/tree_finder.py +146 -0
- holado_core/common/handlers/__init__.py +0 -0
- holado_core/common/handlers/abstracts/base_redo.py +695 -0
- holado_core/common/handlers/abstracts/get_or_create.py +120 -0
- holado_core/common/handlers/element_holder.py +122 -0
- holado_core/common/handlers/enums.py +23 -0
- holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
- holado_core/common/handlers/features/resource_by_name.py +187 -0
- holado_core/common/handlers/features/resource_by_type.py +174 -0
- holado_core/common/handlers/redo.py +119 -0
- holado_core/common/handlers/wait.py +127 -0
- holado_core/common/inspectors/element_inspector.py +57 -0
- holado_core/common/inspectors/inspector.py +221 -0
- holado_core/common/inspectors/tools/inspect_builder.py +169 -0
- holado_core/common/inspectors/tools/inspect_context.py +69 -0
- holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
- holado_core/common/inspectors/tree_inspector.py +73 -0
- holado_core/common/resource/persisted_data_manager.py +113 -0
- holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
- holado_core/common/resource/resource_manager.py +143 -0
- holado_core/common/tables/__init__.py +1 -0
- holado_core/common/tables/comparators/__init__.py +0 -0
- holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
- holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
- holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
- holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
- holado_core/common/tables/comparators/string_table_comparator.py +29 -0
- holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
- holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
- holado_core/common/tables/comparators/table_comparator.py +209 -0
- holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
- holado_core/common/tables/comparators/table_row_comparator.py +116 -0
- holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
- holado_core/common/tables/converters/__init__.py +0 -0
- holado_core/common/tables/converters/table_converter.py +194 -0
- holado_core/common/tables/enums.py +23 -0
- holado_core/common/tables/table.py +261 -0
- holado_core/common/tables/table_cell.py +126 -0
- holado_core/common/tables/table_manager.py +366 -0
- holado_core/common/tables/table_row.py +169 -0
- holado_core/common/tables/table_with_header.py +236 -0
- holado_core/common/tools/__init__.py +0 -0
- holado_core/common/tools/comparators/comparator.py +151 -0
- holado_core/common/tools/comparators/object_comparator.py +21 -0
- holado_core/common/tools/converters/converter.py +107 -0
- holado_core/common/tools/path_manager.py +185 -0
- holado_core/common/tools/string_tools.py +135 -0
- holado_core/common/tools/tools.py +172 -0
- holado_core/common/transport/__init__.py +0 -0
- holado_core/common/transport/crc.py +40 -0
- holado_core/tests/behave/steps/__init__.py +20 -0
- holado_core/tests/behave/steps/common/__init__.py +0 -0
- holado_core/tests/behave/steps/common/common_steps.py +136 -0
- holado_core/tests/behave/steps/common/config_steps.py +42 -0
- holado_core/tests/behave/steps/common/resource_steps.py +62 -0
- holado_core/tests/behave/steps/common/tables_steps.py +537 -0
- holado_core/tools/__init__.py +0 -0
- holado_core/tools/abstracts/__init__.py +0 -0
- holado_core/tools/abstracts/blocking_command_service.py +56 -0
- holado_core/tools/abstracts/service.py +48 -0
- holado_data/__init__.py +31 -0
- holado_data/data/generator/base.py +93 -0
- holado_data/data/generator/python_generator.py +30 -0
- holado_data/tests/behave/steps/__init__.py +17 -0
- holado_data/tests/behave/steps/data/generator_steps.py +91 -0
- holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
- holado_db/__init__.py +32 -0
- holado_db/tests/behave/steps/__init__.py +18 -0
- holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
- holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
- holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
- holado_db/tools/db/clients/base/db_client.py +206 -0
- holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
- holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
- holado_db/tools/db/db_manager.py +109 -0
- holado_db/tools/db/query/base/query_builder.py +87 -0
- holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
- holado_db/tools/db/query/query_manager.py +77 -0
- holado_docker/__init__.py +25 -0
- holado_docker/sdk/docker/docker_client.py +268 -0
- holado_docker/sdk/docker/docker_service.py +71 -0
- holado_docker/tests/behave/steps/__init__.py +16 -0
- holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
- holado_docker/tools/docker_controler/__init__.py +26 -0
- holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
- holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
- holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
- holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
- holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
- holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
- holado_grpc/__init__.py +32 -0
- holado_grpc/api/rpc/TODO.txt +4 -0
- holado_grpc/api/rpc/grpc_client.py +181 -0
- holado_grpc/api/rpc/grpc_manager.py +81 -0
- holado_grpc/ipc/rpc/__init__.py +0 -0
- holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
- holado_grpc/ipc/rpc/grpc_services.py +165 -0
- holado_grpc/tests/behave/steps/__init__.py +16 -0
- holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
- holado_grpc/tests/behave/steps/private/__init__.py +16 -0
- holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
- holado_helper/__init__.py +35 -0
- holado_helper/debug/README.txt +32 -0
- holado_helper/debug/memory/memory_profiler.py +106 -0
- holado_helper/docker/init_user.sh +24 -0
- holado_helper/docker/logging.conf +42 -0
- holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
- holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
- holado_helper/docker/run_terminal_in_docker.sh +101 -0
- holado_helper/holado_module_template/__init__.py +31 -0
- holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
- holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
- holado_helper/script/action.py +109 -0
- holado_helper/script/action_script.py +477 -0
- holado_helper/script/any_action_script.py +126 -0
- holado_helper/script/behave_action_script.py +99 -0
- holado_helper/script/csv_action_script.py +142 -0
- holado_helper/script/initialize_script.py +115 -0
- holado_helper/script/input_output_script.py +136 -0
- holado_helper/script/job.py +75 -0
- holado_helper/script/json_action_script.py +104 -0
- holado_helper/script/script.py +110 -0
- holado_json/__init__.py +16 -0
- holado_json/ipc/json.py +125 -0
- holado_json/ipc/json_converter.py +69 -0
- holado_json/ipc/json_types.py +183 -0
- holado_json/tests/behave/steps/__init__.py +16 -0
- holado_json/tests/behave/steps/ipc/__init__.py +0 -0
- holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
- holado_keycloak/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/__init__.py +16 -0
- holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
- holado_keycloak/tools/keycloak/__init__.py +0 -0
- holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
- holado_logging/__init__.py +36 -0
- holado_logging/common/logging/holado_logger.py +75 -0
- holado_logging/common/logging/log_config.py +128 -0
- holado_logging/common/logging/log_manager.py +292 -0
- holado_multitask/__init__.py +33 -0
- holado_multitask/multiprocessing/context/process_context.py +35 -0
- holado_multitask/multiprocessing/function_process.py +102 -0
- holado_multitask/multiprocessing/periodic_function_process.py +135 -0
- holado_multitask/multiprocessing/process.py +196 -0
- holado_multitask/multiprocessing/processesmanager.py +133 -0
- holado_multitask/multitasking/multitask_manager.py +439 -0
- holado_multitask/multithreading/__init__.py +0 -0
- holado_multitask/multithreading/context/thread_context.py +84 -0
- holado_multitask/multithreading/functionthreaded.py +129 -0
- holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
- holado_multitask/multithreading/loopthread.py +100 -0
- holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
- holado_multitask/multithreading/reflection/inspect.py +47 -0
- holado_multitask/multithreading/reflection/sys.py +29 -0
- holado_multitask/multithreading/reflection/traceback.py +35 -0
- holado_multitask/multithreading/thread.py +177 -0
- holado_multitask/multithreading/threadsmanager.py +162 -0
- holado_multitask/multithreading/timer.py +48 -0
- holado_multitask/tests/behave/steps/__init__.py +17 -0
- holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
- holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
- holado_protobuf/__init__.py +61 -0
- holado_protobuf/ipc/protobuf/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
- holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
- holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
- holado_protobuf/ipc/protobuf/protobuf_messages.py +965 -0
- holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
- holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
- holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
- holado_protobuf/tests/behave/steps/__init__.py +16 -0
- holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
- holado_python/__init__.py +35 -0
- holado_python/common/enums.py +34 -0
- holado_python/common/iterables.py +30 -0
- holado_python/common/tools/comparators/boolean_comparator.py +37 -0
- holado_python/common/tools/comparators/bytes_comparator.py +48 -0
- holado_python/common/tools/comparators/datetime_comparator.py +74 -0
- holado_python/common/tools/comparators/float_comparator.py +97 -0
- holado_python/common/tools/comparators/integer_comparator.py +37 -0
- holado_python/common/tools/comparators/string_comparator.py +99 -0
- holado_python/common/tools/comparators/type_comparator.py +31 -0
- holado_python/common/tools/datetime.py +279 -0
- holado_python/standard_library/csv.py +207 -0
- holado_python/standard_library/hashlib.py +82 -0
- holado_python/standard_library/multiprocessing.py +62 -0
- holado_python/standard_library/queue.py +79 -0
- holado_python/standard_library/socket/blocking_socket.py +136 -0
- holado_python/standard_library/socket/echo_server.py +28 -0
- holado_python/standard_library/socket/message_socket.py +91 -0
- holado_python/standard_library/socket/non_blocking_socket.py +151 -0
- holado_python/standard_library/socket/socket.py +148 -0
- holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
- holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
- holado_python/standard_library/ssl/ssl.py +81 -0
- holado_python/standard_library/typing.py +192 -0
- holado_python/tests/behave/steps/__init__.py +27 -0
- holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
- holado_python/tests/behave/steps/convert_steps.py +59 -0
- holado_python/tests/behave/steps/iterable_steps.py +87 -0
- holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
- holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
- holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
- holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
- holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
- holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
- holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
- holado_rabbitmq/__init__.py +28 -0
- holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
- holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +675 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
- holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
- holado_redis/__init__.py +17 -0
- holado_redis/tests/behave/steps/__init__.py +16 -0
- holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
- holado_redis/tools/redis/TODO.txt +7 -0
- holado_redis/tools/redis/redis_client.py +190 -0
- holado_redis/tools/redis/redis_manager.py +38 -0
- holado_report/__init__.py +27 -0
- holado_report/report/analyze/execution_historic_manager.py +96 -0
- holado_report/report/analyze/scenario_duration_manager.py +245 -0
- holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
- holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
- holado_report/report/builders/report_builder.py +64 -0
- holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
- holado_report/report/builders/summary_report_builder.py +89 -0
- holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
- holado_report/report/builders/summary_scenario_report_builder.py +74 -0
- holado_report/report/execution_historic.py +141 -0
- holado_report/report/report_manager.py +256 -0
- holado_report/report/reports/base_report.py +163 -0
- holado_report/report/reports/feature_report.py +106 -0
- holado_report/report/reports/scenario_report.py +64 -0
- holado_rest/__init__.py +24 -0
- holado_rest/api/rest/TODO.txt +2 -0
- holado_rest/api/rest/rest_client.py +113 -0
- holado_rest/api/rest/rest_manager.py +62 -0
- holado_rest/tests/behave/steps/__init__.py +16 -0
- holado_rest/tests/behave/steps/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
- holado_rest/tests/behave/steps/private/__init__.py +16 -0
- holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
- holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
- holado_s3/__init__.py +17 -0
- holado_s3/tests/behave/steps/__init__.py +17 -0
- holado_s3/tests/behave/steps/private/__init__.py +16 -0
- holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
- holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
- holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
- holado_s3/tools/s3/__init__.py +0 -0
- holado_s3/tools/s3/boto3_s3_client.py +59 -0
- holado_s3/tools/s3/minio_client.py +75 -0
- holado_s3/tools/s3/moto_server.py +52 -0
- holado_scripting/__init__.py +53 -0
- holado_scripting/common/tools/dynamic_text_manager.py +73 -0
- holado_scripting/common/tools/evaluate_parameters.py +210 -0
- holado_scripting/common/tools/expression_evaluator.py +387 -0
- holado_scripting/common/tools/variable_manager.py +321 -0
- holado_scripting/tests/behave/steps/__init__.py +22 -0
- holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
- holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
- holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
- holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
- holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
- holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
- holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
- holado_scripting/text/base/base_function.py +25 -0
- holado_scripting/text/base/base_verify_function.py +25 -0
- holado_scripting/text/base/text_inspecter.py +204 -0
- holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
- holado_scripting/text/interpreter/functions/function_cast.py +60 -0
- holado_scripting/text/interpreter/functions/function_convert.py +57 -0
- holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
- holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
- holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
- holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
- holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
- holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
- holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
- holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
- holado_scripting/text/interpreter/text_interpreter.py +216 -0
- holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
- holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
- holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
- holado_scripting/text/verifier/text_verifier.py +103 -0
- holado_sftp/__init__.py +16 -0
- holado_sftp/tests/behave/steps/__init__.py +17 -0
- holado_sftp/tests/behave/steps/private/__init__.py +16 -0
- holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
- holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
- holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
- holado_sftp/tools/sftp/__init__.py +0 -0
- holado_sftp/tools/sftp/sftp_client.py +103 -0
- holado_sftp/tools/sftp/sftp_server.py +39 -0
- holado_swagger/__init__.py +31 -0
- holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
- holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
- holado_swagger/tests/behave/steps/__init__.py +16 -0
- holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
- holado_system/system/command/command.py +216 -0
- holado_system/system/command/command_result.py +128 -0
- holado_system/system/command/curl_command.py +101 -0
- holado_system/system/command/exceptions.py +59 -0
- holado_system/system/filesystem/file.py +76 -0
- holado_system/system/global_system.py +187 -0
- holado_system/tests/behave/steps/__init__.py +18 -0
- holado_system/tests/behave/steps/system/commands_steps.py +92 -0
- holado_system/tests/behave/steps/system/file_steps.py +215 -0
- holado_system/tests/behave/steps/system/system_steps.py +84 -0
- holado_test/__init__.py +27 -0
- holado_test/behave/__init__.py +0 -0
- holado_test/behave/behave.py +397 -0
- holado_test/behave/behave_environment.py +143 -0
- holado_test/behave/behave_function.py +33 -0
- holado_test/behave/behave_manager.py +555 -0
- holado_test/behave/independant_runner.py +68 -0
- holado_test/behave/scenario/__init__.py +0 -0
- holado_test/behave/scenario/behave_step_tools.py +157 -0
- holado_test/common/context/feature_context.py +79 -0
- holado_test/common/context/scenario_context.py +217 -0
- holado_test/common/context/step_context.py +66 -0
- holado_test/common/exceptions/undefined_step_exception.py +21 -0
- holado_test/scenario/step_tools.py +523 -0
- holado_test/scenario/tester_tools.py +52 -0
- holado_test/test_config.py +26 -0
- holado_test/tests/behave/steps/__init__.py +18 -0
- holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
- holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
- holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
- holado_value/__init__.py +24 -0
- holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
- holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
- holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
- holado_value/common/tables/converters/value_table_converter.py +217 -0
- holado_value/common/tables/value_table.py +29 -0
- holado_value/common/tables/value_table_cell.py +67 -0
- holado_value/common/tables/value_table_manager.py +58 -0
- holado_value/common/tables/value_table_row.py +44 -0
- holado_value/common/tables/value_table_with_header.py +28 -0
- holado_value/common/tools/unique_value_manager.py +108 -0
- holado_value/common/tools/value.py +164 -0
- holado_value/common/tools/value_types.py +35 -0
- holado_value/tests/behave/steps/__init__.py +16 -0
- holado_value/tests/behave/steps/private/__init__.py +16 -0
- holado_ws/__init__.py +16 -0
- holado_ws/api/ws/TODO.txt +2 -0
- holado_ws/tests/behave/steps/__init__.py +16 -0
- holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
- holado_yaml/__init__.py +31 -0
- holado_yaml/tests/behave/steps/__init__.py +16 -0
- holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
- holado_yaml/yaml/yaml_manager.py +86 -0
- test_holado/Dockerfile_test_holado +82 -0
- test_holado/__init__.py +4 -0
- test_holado/__main__.py +25 -0
- test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
- test_holado/environment.py +42 -0
- test_holado/features/NonReg/api/REST.feature +21 -0
- test_holado/features/NonReg/api/gRPC.feature +122 -0
- test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
- test_holado/features/NonReg/common/system/commands.feature +43 -0
- test_holado/features/NonReg/common/system/system.feature +20 -0
- test_holado/features/NonReg/common/tables/table.feature +239 -0
- test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
- test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
- test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
- test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
- test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
- test_holado/features/NonReg/holado_python/convert.feature +20 -0
- test_holado/features/NonReg/holado_python/iterable.feature +61 -0
- test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
- test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
- test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
- test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
- test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
- test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
- test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
- test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
- test_holado/features/NonReg/ipc/bit_series.feature +131 -0
- test_holado/features/NonReg/ipc/json.feature +20 -0
- test_holado/features/NonReg/scenario/scenario.feature +139 -0
- test_holado/features/NonReg/test_steps/behave.feature +275 -0
- test_holado/features/NonReg/test_steps/common.feature +100 -0
- test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
- test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
- test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
- test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
- test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
- test_holado/features/NonReg/tools/sFTP.feature +25 -0
- test_holado/features/Test/logger.feature +28 -0
- test_holado/features/__init__.py +0 -0
- test_holado/logging.conf +41 -0
- test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
- test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
- test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
- test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
- test_holado/resources/scripts/list_tags.sh +2 -0
- test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
- test_holado/steps/__init__.py +0 -0
- test_holado/steps/private_steps.py +20 -0
- test_holado/steps/public_steps.py +23 -0
- test_holado/test_holado_session_context.py +43 -0
- test_holado/tools/django/README.txt +3 -0
- test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
- test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
- test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
- test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
- test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
- test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
- test_holado/tools/django/api_grpc/manage.py +27 -0
- test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
- test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
- test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
- test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
- test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
- test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
- test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
- test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
- test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
- test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
- test_holado/tools/django/api_rest/db.sqlite3 +0 -0
- test_holado/tools/django/api_rest/manage.py +22 -0
- holado-0.2.2.dist-info/RECORD +0 -17
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/WHEEL +0 -0
- {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.tools.comparators.comparator import Comparator
|
|
16
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
17
|
+
from holado_python.standard_library.typing import Typing
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class BytesComparator(Comparator):
|
|
23
|
+
|
|
24
|
+
def __init__(self, encoding_1=None, encoding_2=None):
|
|
25
|
+
super().__init__("bytes")
|
|
26
|
+
|
|
27
|
+
self.__encoding_1 = encoding_1
|
|
28
|
+
self.__encoding_2 = encoding_2
|
|
29
|
+
|
|
30
|
+
def _convert_input1(self, obj, name):
|
|
31
|
+
return self.__convert_input(obj, name, self.__encoding_1)
|
|
32
|
+
|
|
33
|
+
def _convert_input2(self, obj, name):
|
|
34
|
+
return self.__convert_input(obj, name, self.__encoding_2)
|
|
35
|
+
|
|
36
|
+
def __convert_input(self, obj, name, encoding):
|
|
37
|
+
if isinstance(obj, str):
|
|
38
|
+
if encoding is not None:
|
|
39
|
+
res = obj.encode(encoding=encoding)
|
|
40
|
+
else:
|
|
41
|
+
res = obj.encode()
|
|
42
|
+
else:
|
|
43
|
+
res = obj
|
|
44
|
+
|
|
45
|
+
if not isinstance(res, bytes):
|
|
46
|
+
raise FunctionalException(f"{name.capitalize()} value is not a bytes: [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
47
|
+
return res
|
|
48
|
+
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.tools.comparators.comparator import Comparator
|
|
16
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from holado_python.common.tools.datetime import DateTime
|
|
19
|
+
from holado_core.common.handlers.features.resource_by_type import FeatureObjectAndClassResourceByType
|
|
20
|
+
from holado_python.standard_library.typing import Typing
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DatetimeComparator(Comparator, FeatureObjectAndClassResourceByType):
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
Comparator.__init__(self, "datetime")
|
|
30
|
+
FeatureObjectAndClassResourceByType.__init__(self)
|
|
31
|
+
|
|
32
|
+
# Define resource description
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def _get_class_resource_description(cls, plural=False):
|
|
36
|
+
if plural:
|
|
37
|
+
return 'class datetime converters'
|
|
38
|
+
else:
|
|
39
|
+
return 'class datetime converter'
|
|
40
|
+
|
|
41
|
+
def _get_resource_description(self, plural=False):
|
|
42
|
+
if plural:
|
|
43
|
+
return 'datetime converters'
|
|
44
|
+
else:
|
|
45
|
+
return 'datetime converter'
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Define how to convert imputs before compare
|
|
49
|
+
|
|
50
|
+
def _convert_input(self, obj, name):
|
|
51
|
+
convert_func = self.get_resource_for_type(obj=obj, raise_if_not_found=False)
|
|
52
|
+
if convert_func:
|
|
53
|
+
res = convert_func(obj)
|
|
54
|
+
else:
|
|
55
|
+
res = obj
|
|
56
|
+
|
|
57
|
+
if not isinstance(res, datetime):
|
|
58
|
+
raise FunctionalException(f"{name.capitalize()} value is not a datetime: [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
59
|
+
if res.tzinfo is None:
|
|
60
|
+
res = res.replace(tzinfo=timezone.utc)
|
|
61
|
+
return res
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# Register default datetime converters
|
|
65
|
+
|
|
66
|
+
DatetimeComparator.register_resource_for_type_in_class('str', None,
|
|
67
|
+
lambda o: isinstance(o, str) and DateTime.is_str_datetime(o),
|
|
68
|
+
DateTime.str_2_datetime)
|
|
69
|
+
|
|
70
|
+
DatetimeComparator.register_resource_for_type_in_class('int or float', None,
|
|
71
|
+
lambda o: isinstance(o, int) or isinstance(o, float),
|
|
72
|
+
DateTime.timestamp_to_datetime)
|
|
73
|
+
|
|
74
|
+
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.tools.comparators.comparator import Comparator,\
|
|
16
|
+
CompareOperator
|
|
17
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
18
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
19
|
+
from holado_core.common.tools.converters.converter import Converter
|
|
20
|
+
from holado_python.standard_library.typing import Typing
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class FloatComparator(Comparator):
|
|
26
|
+
|
|
27
|
+
def __init__(self, diff_precision=None, relative_precision=1e-15):
|
|
28
|
+
"""
|
|
29
|
+
Define the comparing method and its associated precision.
|
|
30
|
+
If difference precision is defined, difference comparison is applied, else relative comparison is applied.
|
|
31
|
+
By default, a relative comparison is used with a precision of 1e-15
|
|
32
|
+
|
|
33
|
+
Notes:
|
|
34
|
+
1. Usually, python implement float type with 52 digits for significant digits, which is a precision of 2**-52=2.220446049250313e-16.
|
|
35
|
+
The default relative precision is 1e-15, a little bit over this limit precision, in order to manage small computational errors.
|
|
36
|
+
In many cases, this precision is too small ; if you don't know which precision to use, a relative precision of 1e-9 is quite usual.
|
|
37
|
+
2. For the same reason, the appropriate difference precision is dependent on the values compared and the number of comparable significant digits.
|
|
38
|
+
If you are not sure, prefer the relative comparison.
|
|
39
|
+
:param diff_precision: If defined, a difference comparison is done with this precision
|
|
40
|
+
:param relative_precision: If defined, a relative comparison is done with this precision
|
|
41
|
+
"""
|
|
42
|
+
super().__init__("float")
|
|
43
|
+
|
|
44
|
+
self.__diff_precision = diff_precision
|
|
45
|
+
self.__relative_precision = relative_precision
|
|
46
|
+
|
|
47
|
+
if self.__diff_precision is not None:
|
|
48
|
+
self.__relative_precision = None
|
|
49
|
+
if self.__diff_precision is None and self.__relative_precision is None:
|
|
50
|
+
raise TechnicalException("A precision must be defined")
|
|
51
|
+
|
|
52
|
+
def _convert_input(self, obj, name):
|
|
53
|
+
if Converter.is_float(obj):
|
|
54
|
+
res = float(obj)
|
|
55
|
+
else:
|
|
56
|
+
res = obj
|
|
57
|
+
|
|
58
|
+
if not isinstance(res, float):
|
|
59
|
+
raise FunctionalException(f"{name.capitalize()} value is not a float: [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
60
|
+
return res
|
|
61
|
+
|
|
62
|
+
def _compare_result(self, obj_1, operator: CompareOperator, obj_2):
|
|
63
|
+
if operator == CompareOperator.Different:
|
|
64
|
+
return not self.__almost_equals(obj_1, obj_2)
|
|
65
|
+
elif operator == CompareOperator.Equal:
|
|
66
|
+
return self.__almost_equals(obj_1, obj_2)
|
|
67
|
+
elif operator == CompareOperator.Inferior:
|
|
68
|
+
return (obj_1 < obj_2)
|
|
69
|
+
elif operator == CompareOperator.InferiorOrEqual:
|
|
70
|
+
return (obj_1 < obj_2) or self.__almost_equals(obj_1, obj_2)
|
|
71
|
+
elif operator == CompareOperator.Superior:
|
|
72
|
+
return (obj_1 > obj_2)
|
|
73
|
+
elif operator == CompareOperator.SuperiorOrEqual:
|
|
74
|
+
return (obj_1 > obj_2) or self.__almost_equals(obj_1, obj_2)
|
|
75
|
+
else:
|
|
76
|
+
raise TechnicalException(f"Unmanaged compare operator {operator}")
|
|
77
|
+
|
|
78
|
+
def __almost_equals(self, val_1, val_2):
|
|
79
|
+
if self.__relative_precision is not None:
|
|
80
|
+
return self.__almost_equals_relative(val_1, val_2)
|
|
81
|
+
else:
|
|
82
|
+
return self.__almost_equals_diff(val_1, val_2)
|
|
83
|
+
|
|
84
|
+
def __almost_equals_diff(self, val_1, val_2):
|
|
85
|
+
diff = abs(val_1 - val_2)
|
|
86
|
+
return (diff < self.__diff_precision)
|
|
87
|
+
|
|
88
|
+
def __almost_equals_relative(self, val_1, val_2):
|
|
89
|
+
diff = abs(val_1 - val_2)
|
|
90
|
+
vmax = max(abs(val_1), abs(val_2))
|
|
91
|
+
if vmax > 0:
|
|
92
|
+
return (diff < vmax * self.__relative_precision)
|
|
93
|
+
else:
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.tools.comparators.comparator import Comparator
|
|
16
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
17
|
+
from holado_core.common.tools.converters.converter import Converter
|
|
18
|
+
from holado_python.standard_library.typing import Typing
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class IntegerComparator(Comparator):
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
super().__init__("integer")
|
|
27
|
+
|
|
28
|
+
def _convert_input(self, obj, name):
|
|
29
|
+
if Converter.is_integer(obj):
|
|
30
|
+
res = int(obj)
|
|
31
|
+
else:
|
|
32
|
+
res = obj
|
|
33
|
+
|
|
34
|
+
if not isinstance(res, int):
|
|
35
|
+
raise FunctionalException(f"{name.capitalize()} value is not an integer: [{res}] (type: {Typing.get_object_class_fullname(res)})")
|
|
36
|
+
return res
|
|
37
|
+
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.tools.comparators.comparator import Comparator,\
|
|
16
|
+
CompareOperator
|
|
17
|
+
from holado_core.common.tools.tools import Tools
|
|
18
|
+
from holado.common.context.session_context import SessionContext
|
|
19
|
+
from holado_core.common.exceptions.verify_exception import VerifyException
|
|
20
|
+
from holado_python.standard_library.typing import Typing
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class StringComparator(Comparator):
|
|
26
|
+
|
|
27
|
+
def __init__(self, text_interpreter=None, text_verifier=None):
|
|
28
|
+
super().__init__("string")
|
|
29
|
+
self.__text_interpreter = text_interpreter
|
|
30
|
+
self.__text_verifier = text_verifier
|
|
31
|
+
|
|
32
|
+
def __get_text_interpreter(self):
|
|
33
|
+
if self.__text_interpreter is not None:
|
|
34
|
+
return self.__text_interpreter
|
|
35
|
+
elif SessionContext.instance().has_scenario_context():
|
|
36
|
+
return SessionContext.instance().get_scenario_context().get_text_interpreter()
|
|
37
|
+
else:
|
|
38
|
+
return SessionContext.instance().text_interpreter
|
|
39
|
+
|
|
40
|
+
def __get_text_verifier(self):
|
|
41
|
+
if self.__text_verifier is not None:
|
|
42
|
+
return self.__text_verifier
|
|
43
|
+
elif SessionContext.instance().has_scenario_context():
|
|
44
|
+
return SessionContext.instance().get_scenario_context().get_text_verifier()
|
|
45
|
+
else:
|
|
46
|
+
return SessionContext.instance().text_verifier
|
|
47
|
+
|
|
48
|
+
def _compare_by_operator(self, obj_1, operator: CompareOperator, obj_2, is_obtained_vs_expected = True, raise_exception = True, redirect_to_equals=True):
|
|
49
|
+
if operator == CompareOperator.Equal:
|
|
50
|
+
return self.__verify_by_text_interpreter(obj_1, obj_2, is_obtained_vs_expected, raise_exception)
|
|
51
|
+
else:
|
|
52
|
+
i_obj_1 = self.__get_text_interpreter().interpret(obj_1)
|
|
53
|
+
i_obj_2 = self.__get_text_interpreter().interpret(obj_2)
|
|
54
|
+
super()._compare_by_operator(i_obj_1, operator, i_obj_2, is_obtained_vs_expected, raise_exception, redirect_to_equals=redirect_to_equals)
|
|
55
|
+
|
|
56
|
+
def _convert_input(self, obj, name):
|
|
57
|
+
if isinstance(obj, str):
|
|
58
|
+
res = obj
|
|
59
|
+
else:
|
|
60
|
+
res = str(obj)
|
|
61
|
+
return res
|
|
62
|
+
|
|
63
|
+
def __verify_by_text_interpreter(self, str_1, str_2, is_obtained_vs_expected = True, raise_exception = True):
|
|
64
|
+
"""
|
|
65
|
+
Compare by equality.
|
|
66
|
+
Switch is_obtained_vs_expected:
|
|
67
|
+
- True: value 1 is considered obtained ; value 2 is considered expected ; only expected value is interpreted
|
|
68
|
+
- False: value 1 is considered expected ; value 2 is considered obtained ; only expected value is interpreted
|
|
69
|
+
- None: value 1 is compared to value 2 ; both values are interpreted
|
|
70
|
+
"""
|
|
71
|
+
if not isinstance(str_1, str):
|
|
72
|
+
if raise_exception:
|
|
73
|
+
raise VerifyException(f"{self._get_name_1(is_obtained_vs_expected).capitalize()} value is not a string: [{str_1}] (type: {Typing.get_object_class_fullname(str_1)})")
|
|
74
|
+
else:
|
|
75
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
76
|
+
logger.debug(f"Compare result is false since {self._get_name_1(is_obtained_vs_expected)} value is not a string: [{str_1}] (type: {Typing.get_object_class_fullname(str_1)})")
|
|
77
|
+
return False
|
|
78
|
+
if not isinstance(str_2, str):
|
|
79
|
+
if raise_exception:
|
|
80
|
+
raise VerifyException(f"{self._get_name_2(is_obtained_vs_expected).capitalize()} value is not a string: [{str_2}] (type: {Typing.get_object_class_fullname(str_2)})")
|
|
81
|
+
else:
|
|
82
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
83
|
+
logger.debug(f"Compare result is false since {self._get_name_2(is_obtained_vs_expected)} value is not a string: [{str_2}] (type: {Typing.get_object_class_fullname(str_2)})")
|
|
84
|
+
return False
|
|
85
|
+
|
|
86
|
+
if is_obtained_vs_expected is None:
|
|
87
|
+
# Interpret obtained as TextInterpreter.verify won't do it on obtained parameter
|
|
88
|
+
str_1 = self.__get_text_interpreter().interpret(str_1)
|
|
89
|
+
|
|
90
|
+
if is_obtained_vs_expected == True or is_obtained_vs_expected is None:
|
|
91
|
+
res = self.__get_text_verifier().verify(str_1, str_2, raise_exception=raise_exception)
|
|
92
|
+
else:
|
|
93
|
+
res = self.__get_text_verifier().verify(str_2, str_1, raise_exception=raise_exception)
|
|
94
|
+
|
|
95
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
96
|
+
logger.debug("[{}] str_1 equals str_2 => {}\n str_1 = [{}]\n str_2 = [{}]".format(Typing.get_object_class(self).__name__, res, str_1, str_2))
|
|
97
|
+
return res
|
|
98
|
+
|
|
99
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from holado_core.common.tools.comparators.comparator import Comparator
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TypeComparator(Comparator):
|
|
21
|
+
|
|
22
|
+
def __init__(self):
|
|
23
|
+
super().__init__("type")
|
|
24
|
+
|
|
25
|
+
def _convert_input(self, obj, name):
|
|
26
|
+
if isinstance(obj, type):
|
|
27
|
+
res = obj
|
|
28
|
+
else:
|
|
29
|
+
res = type(obj)
|
|
30
|
+
return res
|
|
31
|
+
|
|
@@ -0,0 +1,279 @@
|
|
|
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
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
EPOCH_1970 = datetime.datetime(year=1970, month=1, day=1, tzinfo=datetime.timezone.utc)
|
|
34
|
+
EPOCH_JULIAN_CNES = datetime.datetime(year=1950, month=1, day=1, tzinfo=datetime.timezone.utc)
|
|
35
|
+
EPOCH_JULIAN_NASA = datetime.datetime(year=1968, month=5, day=24, tzinfo=datetime.timezone.utc)
|
|
36
|
+
|
|
37
|
+
FORMAT_DATETIME_ISO = '%Y-%m-%dT%H:%M:%S.%fZ'
|
|
38
|
+
FORMAT_DATETIME_HUMAN_SECOND = '%Y-%m-%d %H:%M:%S'
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class DurationUnit(str, Enum):
|
|
42
|
+
# Nanosecond = "nanosecond"
|
|
43
|
+
Microsecond = "microsecond"
|
|
44
|
+
Millisecond = "millisecond"
|
|
45
|
+
Second = "second"
|
|
46
|
+
Minute = "minute"
|
|
47
|
+
Hour = "hour"
|
|
48
|
+
Day = "day"
|
|
49
|
+
Week = "week"
|
|
50
|
+
Month = "month"
|
|
51
|
+
Year = "year"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class DateTime(object):
|
|
56
|
+
|
|
57
|
+
__is_system_time_in_tai = None
|
|
58
|
+
__is_system_time_expected_in_tai = None
|
|
59
|
+
__utc_to_tai_timedelta = None
|
|
60
|
+
|
|
61
|
+
def __init__(self):
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def is_system_time_in_tai(cls):
|
|
66
|
+
"""Return if system time is in TAI (International Atomic Time)"""
|
|
67
|
+
if cls.__is_system_time_in_tai is None:
|
|
68
|
+
cls.__is_system_time_in_tai = Converter.to_boolean(os.getenv("HOLADO_SYSTEM_TIME_IS_IN_TAI", False))
|
|
69
|
+
return cls.__is_system_time_in_tai
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def now(cls):
|
|
73
|
+
return datetime.datetime.now()
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def utcnow(cls):
|
|
77
|
+
if cls.is_system_time_in_tai():
|
|
78
|
+
return datetime.datetime.utcnow() - cls.utc_to_tai_timedelta()
|
|
79
|
+
else:
|
|
80
|
+
return datetime.datetime.utcnow()
|
|
81
|
+
|
|
82
|
+
@classmethod
|
|
83
|
+
def tainow(cls):
|
|
84
|
+
if cls.is_system_time_in_tai():
|
|
85
|
+
return datetime.datetime.utcnow()
|
|
86
|
+
else:
|
|
87
|
+
return datetime.datetime.utcnow() + cls.utc_to_tai_timedelta()
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def utc_to_tai_timedelta(cls):
|
|
91
|
+
"""Return the timedelta to add to an UTC datetime to obtain a TAI datetime.
|
|
92
|
+
Note: Currently, only years 2020-2029 are managed"""
|
|
93
|
+
if cls.__utc_to_tai_timedelta is None:
|
|
94
|
+
cls.__utc_to_tai_timedelta = datetime.timedelta(seconds=37)
|
|
95
|
+
return cls.__utc_to_tai_timedelta
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
def apply_delta_on_datetime(cls, date:datetime, operator:ArithmeticOperator, duration, duration_unit:DurationUnit) -> datetime:
|
|
99
|
+
args={duration_unit.value+'s':duration}
|
|
100
|
+
if duration_unit in [DurationUnit.Millisecond]:
|
|
101
|
+
delta = timedelta(**args)
|
|
102
|
+
else:
|
|
103
|
+
delta = relativedelta(**args)
|
|
104
|
+
|
|
105
|
+
if operator == ArithmeticOperator.Subtraction:
|
|
106
|
+
res = date - delta
|
|
107
|
+
elif operator == ArithmeticOperator.Addition:
|
|
108
|
+
res = date + delta
|
|
109
|
+
else:
|
|
110
|
+
raise TechnicalException(f"Unmanaged operator '{operator.value}'")
|
|
111
|
+
|
|
112
|
+
return res
|
|
113
|
+
|
|
114
|
+
### Conversions to/from str
|
|
115
|
+
|
|
116
|
+
@classmethod
|
|
117
|
+
def is_str_datetime(cls, dt_str, dt_format=None):
|
|
118
|
+
"""Return if a string is a datetime of given format"""
|
|
119
|
+
res = True
|
|
120
|
+
try:
|
|
121
|
+
DateTime.str_2_datetime(dt_str, dt_format)
|
|
122
|
+
except (dateutil.parser._parser.ParserError, ValueError):
|
|
123
|
+
res = False
|
|
124
|
+
return res
|
|
125
|
+
|
|
126
|
+
@classmethod
|
|
127
|
+
def str_2_datetime(cls, dt_str, dt_format=None):
|
|
128
|
+
"""Convert string to datetime instance"""
|
|
129
|
+
res = None
|
|
130
|
+
if dt_format is None:
|
|
131
|
+
res = dateutil.parser.parse(dt_str)
|
|
132
|
+
else:
|
|
133
|
+
res = datetime.datetime.strptime(dt_str, dt_format)
|
|
134
|
+
# if res.tzinfo is None:
|
|
135
|
+
# res = res.replace(tzinfo=timezone.utc)
|
|
136
|
+
return res
|
|
137
|
+
|
|
138
|
+
@classmethod
|
|
139
|
+
def str_2_timedelta(cls, dur_str):
|
|
140
|
+
"""Convert string to timedelta instance"""
|
|
141
|
+
res = None
|
|
142
|
+
dur_regex = re.compile(r"(\d+(?:\.\d*)?) (?:s|sec|seconds)")
|
|
143
|
+
r = dur_regex.match(dur_str)
|
|
144
|
+
if r:
|
|
145
|
+
res = datetime.timedelta(seconds=float(r.group(1)))
|
|
146
|
+
else:
|
|
147
|
+
raise FunctionalException(r"Duration string must match pattern '\d+(\.\d*)? (s|sec|seconds)'")
|
|
148
|
+
return res
|
|
149
|
+
|
|
150
|
+
@classmethod
|
|
151
|
+
def datetime_2_str(cls, dt_value, dt_format=None):
|
|
152
|
+
res = None
|
|
153
|
+
if dt_format is None:
|
|
154
|
+
res = datetime.datetime.isoformat(dt_value)
|
|
155
|
+
else:
|
|
156
|
+
res = dt_value.strftime(dt_format)
|
|
157
|
+
return res
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
### Conversions to/from timestamp
|
|
161
|
+
|
|
162
|
+
@classmethod
|
|
163
|
+
def datetime_to_timestamp(cls, dt, epoch=None):
|
|
164
|
+
if epoch is not None and isinstance(epoch, str):
|
|
165
|
+
epoch = DateTime.str_2_datetime(epoch)
|
|
166
|
+
elif epoch is not None and not isinstance(epoch, datetime.datetime):
|
|
167
|
+
raise TechnicalException(f"Parameter 'epoch' should be a datetime or None")
|
|
168
|
+
|
|
169
|
+
if epoch is None:
|
|
170
|
+
return dt.timestamp()
|
|
171
|
+
else:
|
|
172
|
+
return (dt - epoch).total_seconds()
|
|
173
|
+
|
|
174
|
+
@classmethod
|
|
175
|
+
def timestamp_to_datetime(cls, ts, epoch=None):
|
|
176
|
+
"""
|
|
177
|
+
Convert timestamp to UTC datetime
|
|
178
|
+
"""
|
|
179
|
+
if epoch is not None and isinstance(epoch, str):
|
|
180
|
+
epoch = DateTime.str_2_datetime(epoch)
|
|
181
|
+
elif epoch is not None and not isinstance(epoch, datetime.datetime):
|
|
182
|
+
raise TechnicalException(f"Parameter 'epoch' should be a datetime or None")
|
|
183
|
+
|
|
184
|
+
res = datetime.datetime.utcfromtimestamp(ts)
|
|
185
|
+
if epoch is not None:
|
|
186
|
+
res = epoch + (res - EPOCH_1970)
|
|
187
|
+
return res
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
### Conversions to/from (seconds, nanos)
|
|
191
|
+
|
|
192
|
+
@classmethod
|
|
193
|
+
def datetime_to_seconds_nanos(cls, dt, epoch=None):
|
|
194
|
+
ts = cls.datetime_to_timestamp(dt, epoch)
|
|
195
|
+
return cls.timestamp_to_seconds_nanos(ts)
|
|
196
|
+
|
|
197
|
+
@classmethod
|
|
198
|
+
def seconds_nanos_to_datetime(cls, seconds, nanos, epoch=None, round_func=round):
|
|
199
|
+
"""
|
|
200
|
+
Convert timestamp to UTC datetime
|
|
201
|
+
@param round_func: defines the rounding method applied to microseconds (default: round ; possible methods: round, math.ceil, math.trunc)
|
|
202
|
+
"""
|
|
203
|
+
ts = cls.seconds_nanos_to_timestamp(seconds, nanos, round_func=round_func)
|
|
204
|
+
return cls.timestamp_to_datetime(ts, epoch)
|
|
205
|
+
|
|
206
|
+
@classmethod
|
|
207
|
+
def timestamp_to_seconds_nanos(cls, ts):
|
|
208
|
+
return round(ts), round(ts * 1e6 % 1e6)
|
|
209
|
+
|
|
210
|
+
@classmethod
|
|
211
|
+
def seconds_nanos_to_timestamp(cls, seconds, nanos, cast_func=float, round_func=round):
|
|
212
|
+
"""
|
|
213
|
+
Convert (seconds, nanos) to timestamp.
|
|
214
|
+
By default, it returns a timestamp as float with nanos rounded to microsecond precision.
|
|
215
|
+
To keep nanosecond precision, set cast_type=None and round_func=None, it will returns a timestamp as decimal.Decimal.
|
|
216
|
+
@param cast_func: Type of the returned value (default: float). The type can also be decimal.Decimal, usefull to keep nanosecond precision.
|
|
217
|
+
@param round_func: defines the rounding method applied to microseconds (default: round ; possible methods: round, math.ceil, math.trunc)
|
|
218
|
+
"""
|
|
219
|
+
res_dec = Decimal(seconds) + Decimal(nanos) / Decimal(1e9)
|
|
220
|
+
if round_func is not None:
|
|
221
|
+
res_dec = round_func(res_dec * 1000000) / 1000000
|
|
222
|
+
if cast_func is not None:
|
|
223
|
+
return cast_func(res_dec)
|
|
224
|
+
else:
|
|
225
|
+
return res_dec
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
### Conversions to/from Julian date
|
|
229
|
+
|
|
230
|
+
@classmethod
|
|
231
|
+
def datetime_to_julian_date(cls, dt, epoch=None):
|
|
232
|
+
if epoch is None:
|
|
233
|
+
return cls.datetime_to_julian_date(dt, epoch=EPOCH_JULIAN_CNES) + 2433282.5
|
|
234
|
+
else:
|
|
235
|
+
td = (dt - epoch)
|
|
236
|
+
return td.days + td.seconds / (3600 * 24)
|
|
237
|
+
|
|
238
|
+
@classmethod
|
|
239
|
+
def julian_date_to_datetime(cls, jd, epoch=None, precision_nb_digits=6):
|
|
240
|
+
""" Convert a Julian date to a datetime instance
|
|
241
|
+
@param precision_nb_digits Precision of the Julian date (default: 6 = microseconds)
|
|
242
|
+
"""
|
|
243
|
+
if epoch is None:
|
|
244
|
+
return cls.julian_date_to_datetime(jd - 2433282.5, epoch=EPOCH_JULIAN_CNES)
|
|
245
|
+
else:
|
|
246
|
+
jd_decimal, jd_days = math.modf(jd)
|
|
247
|
+
jd_seconds = round(jd_decimal * 3600 * 24, precision_nb_digits)
|
|
248
|
+
td = datetime.timedelta(days=round(jd_days), seconds=jd_seconds)
|
|
249
|
+
return epoch + td
|
|
250
|
+
|
|
251
|
+
@classmethod
|
|
252
|
+
def datetime_utc_to_tai(cls, dt, dt_format=None):
|
|
253
|
+
""" Convert a datetime in UTC to a datetime in TAI
|
|
254
|
+
@param dt Datetime in UTC
|
|
255
|
+
@param dt_format Format to use if 'dt' is a string (can be None for format autodetection)
|
|
256
|
+
"""
|
|
257
|
+
dt_src = dt
|
|
258
|
+
if isinstance(dt_src, str):
|
|
259
|
+
dt_src = cls.str_2_datetime(dt_src, dt_format)
|
|
260
|
+
|
|
261
|
+
return dt_src + DateTime.utc_to_tai_timedelta()
|
|
262
|
+
|
|
263
|
+
@classmethod
|
|
264
|
+
def datetime_tai_to_utc(cls, dt, dt_format=None):
|
|
265
|
+
""" Convert a datetime in TAI to a datetime in UTC
|
|
266
|
+
@param dt Datetime in TAI
|
|
267
|
+
@param dt_format Format to use if 'dt' is a string (can be None for format autodetection)
|
|
268
|
+
"""
|
|
269
|
+
dt_src = dt
|
|
270
|
+
if isinstance(dt_src, str):
|
|
271
|
+
dt_src = cls.str_2_datetime(dt_src, dt_format)
|
|
272
|
+
|
|
273
|
+
return dt_src - DateTime.utc_to_tai_timedelta()
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
|