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,245 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2023 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
import csv
|
|
16
|
+
import json
|
|
17
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
18
|
+
import itertools
|
|
19
|
+
from holado_core.common.exceptions.functional_exception import FunctionalException
|
|
20
|
+
import os
|
|
21
|
+
from holado_core.common.tools.converters.converter import Converter
|
|
22
|
+
from holado_core.common.tools.tools import Tools
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ScenarioDurationManager(object):
|
|
29
|
+
def __init__(self):
|
|
30
|
+
self.__execution_historic = None
|
|
31
|
+
|
|
32
|
+
def import_execution_historic(self, filepath):
|
|
33
|
+
with open(filepath, "r") as fin:
|
|
34
|
+
self.__execution_historic = json.load(fin)
|
|
35
|
+
|
|
36
|
+
def create_file_scenario_duration_limits(self, filepath, scenario_duration_limits):
|
|
37
|
+
header = ["Duration Limit", "Nb of Scenarios", "Total Spent Time", "Nb of Scenarios (limit)", "Total Spent Time (limit)", "Mean Duration (limit)"]
|
|
38
|
+
with open(filepath, "w", newline='') as fout:
|
|
39
|
+
dw = csv.DictWriter(fout, fieldnames=header, delimiter=';')#, quoting=csv.QUOTE_NONE)
|
|
40
|
+
dw.writeheader()
|
|
41
|
+
|
|
42
|
+
for sd in scenario_duration_limits:
|
|
43
|
+
dw.writerow(sd)
|
|
44
|
+
|
|
45
|
+
def compute_scenario_duration_limits(self, duration_limits=None):
|
|
46
|
+
if duration_limits is None:
|
|
47
|
+
duration_limits = sorted(set(itertools.chain(*((0.1*x, x, 10*x, 60*x, 60*60*x) for x in range(1,10))))) + [60*60*24*30]
|
|
48
|
+
|
|
49
|
+
res = [self.__compute_scenario_duration_limit(dur_lim) for dur_lim in duration_limits]
|
|
50
|
+
|
|
51
|
+
# Compute base data in limit: spent time, nb of scenario
|
|
52
|
+
res[0]["Total Spent Time (limit)"] = res[0]["Total Spent Time"]
|
|
53
|
+
res[0]["Nb of Scenarios (limit)"] = res[0]["Nb of Scenarios"]
|
|
54
|
+
for ind in range(1,len(res)):
|
|
55
|
+
res[ind]["Total Spent Time (limit)"] = res[ind]["Total Spent Time"] - res[ind-1]["Total Spent Time"]
|
|
56
|
+
res[ind]["Nb of Scenarios (limit)"] = res[ind]["Nb of Scenarios"] - res[ind-1]["Nb of Scenarios"]
|
|
57
|
+
|
|
58
|
+
# Compute mean duration in limit
|
|
59
|
+
for ind in range(len(res)):
|
|
60
|
+
if res[ind]["Nb of Scenarios (limit)"] > 0:
|
|
61
|
+
res[ind]["Mean Duration (limit)"] = res[ind]["Total Spent Time (limit)"] / res[ind]["Nb of Scenarios (limit)"]
|
|
62
|
+
else:
|
|
63
|
+
res[ind]["Mean Duration (limit)"] = None
|
|
64
|
+
|
|
65
|
+
return res
|
|
66
|
+
|
|
67
|
+
def __compute_scenario_duration_limit(self, duration_limit):
|
|
68
|
+
res = {"Duration Limit" : duration_limit,
|
|
69
|
+
"Nb of Scenarios" : 0,
|
|
70
|
+
"Total Spent Time" : 0}
|
|
71
|
+
for eh_feat in self.__execution_historic:
|
|
72
|
+
for eh_sce in eh_feat['scenarios']:
|
|
73
|
+
if eh_sce['scenario']['status'] == 'passed':
|
|
74
|
+
sce_dur = eh_sce['scenario']['duration']
|
|
75
|
+
if sce_dur < duration_limit:
|
|
76
|
+
res["Nb of Scenarios"] += 1
|
|
77
|
+
res["Total Spent Time"] += sce_dur
|
|
78
|
+
return res
|
|
79
|
+
|
|
80
|
+
def create_file_scenario_duration_tags(self, filepath, scenario_duration_tags):
|
|
81
|
+
header = ["Feature", "Scenario", "File", "Line", "Status", "Duration", "Current tag", "New tag"]
|
|
82
|
+
if scenario_duration_tags and len(scenario_duration_tags) > 0:
|
|
83
|
+
header.extend(set(scenario_duration_tags[0].keys()) - set(header))
|
|
84
|
+
|
|
85
|
+
with open(filepath, "w", newline='') as fout:
|
|
86
|
+
dw = csv.DictWriter(fout, fieldnames=header, delimiter=';')#, quoting=csv.QUOTE_NONE)
|
|
87
|
+
dw.writeheader()
|
|
88
|
+
|
|
89
|
+
for sd in scenario_duration_tags:
|
|
90
|
+
dw.writerow(sd)
|
|
91
|
+
|
|
92
|
+
def compute_scenario_duration_tags(self, duration_limit_tags, default_tag, tag_prefix="ScenarioDuration=", missing_tag=True, new_tag=True, unchanged_tag=False, with_failed=False, add_apply=False):
|
|
93
|
+
if duration_limit_tags is None or not isinstance(duration_limit_tags, list):
|
|
94
|
+
raise TechnicalException("Parameter 'duration_limit_tags' must be specified as a list of tuples (limit, tag)")
|
|
95
|
+
if default_tag is None:
|
|
96
|
+
raise TechnicalException("Parameter 'default_tag' must be specified")
|
|
97
|
+
|
|
98
|
+
res = []
|
|
99
|
+
for eh_feat in self.__execution_historic:
|
|
100
|
+
for eh_sce in eh_feat['scenarios']:
|
|
101
|
+
sce_res = {"Feature" : eh_feat['feature']['name'],
|
|
102
|
+
"Scenario" : eh_sce['scenario']['name'],
|
|
103
|
+
"File" : eh_sce['scenario']['filename'],
|
|
104
|
+
"Line" : eh_sce['scenario']['line'],
|
|
105
|
+
"Status" : eh_sce['scenario']['status'],
|
|
106
|
+
"Duration" : eh_sce['scenario']['duration'],
|
|
107
|
+
"Current tag" : None,
|
|
108
|
+
"New tag" : None}
|
|
109
|
+
|
|
110
|
+
cur_tag = None
|
|
111
|
+
for tag in eh_sce['scenario']['tags']:
|
|
112
|
+
tag = str(tag)
|
|
113
|
+
if tag.startswith(tag_prefix):
|
|
114
|
+
cur_tag = tag[len(tag_prefix):]
|
|
115
|
+
break
|
|
116
|
+
sce_res["Current tag"] = cur_tag
|
|
117
|
+
|
|
118
|
+
cur_status = eh_sce['scenario']['status']
|
|
119
|
+
new_tag = None
|
|
120
|
+
if cur_status == "passed":
|
|
121
|
+
sce_dur = float(eh_sce['scenario']['duration'])
|
|
122
|
+
for lim_tag in duration_limit_tags:
|
|
123
|
+
if sce_dur < lim_tag[0]:
|
|
124
|
+
new_tag = lim_tag[1]
|
|
125
|
+
break
|
|
126
|
+
if new_tag is None:
|
|
127
|
+
new_tag = default_tag
|
|
128
|
+
sce_res["New tag"] = new_tag
|
|
129
|
+
|
|
130
|
+
if add_apply:
|
|
131
|
+
apply = None
|
|
132
|
+
if new_tag is not None:
|
|
133
|
+
if cur_tag is None:
|
|
134
|
+
apply = True
|
|
135
|
+
elif new_tag != cur_tag:
|
|
136
|
+
if cur_tag.endswith("!fixed"):
|
|
137
|
+
apply = False
|
|
138
|
+
else:
|
|
139
|
+
apply = True
|
|
140
|
+
sce_res["Apply"] = apply
|
|
141
|
+
|
|
142
|
+
if (with_failed and cur_status != "passed"
|
|
143
|
+
or cur_status == "passed"
|
|
144
|
+
and (missing_tag and cur_tag is None)):
|
|
145
|
+
res.append(sce_res)
|
|
146
|
+
return res
|
|
147
|
+
|
|
148
|
+
def update_scenario_durations(self, scenario_duration_tags_filepath, features_path, tag_prefix="ScenarioDuration=", dry_run=False):
|
|
149
|
+
sdt_by_file = {}
|
|
150
|
+
with open(scenario_duration_tags_filepath, 'r', newline='') as csvfile:
|
|
151
|
+
reader = csv.DictReader(csvfile, delimiter=';')
|
|
152
|
+
|
|
153
|
+
# Verify presence of 'Apply' column
|
|
154
|
+
if 'Apply' not in reader.fieldnames:
|
|
155
|
+
raise FunctionalException(f"File '{scenario_duration_tags_filepath}' doesn't have column 'Apply'. Please regenerate it with column 'Apply'.")
|
|
156
|
+
|
|
157
|
+
for row in reader:
|
|
158
|
+
file = row["File"]
|
|
159
|
+
if file not in sdt_by_file:
|
|
160
|
+
sdt_by_file[file] = []
|
|
161
|
+
sdt_by_file[file].append(row)
|
|
162
|
+
|
|
163
|
+
logger.info(f"Updating scenario duration tags with prefix '{tag_prefix}' for scenarios in folder '{features_path}'")
|
|
164
|
+
for file in sorted(sdt_by_file.keys()):
|
|
165
|
+
sorted_sdt = sorted(sdt_by_file[file], key=lambda x: -int(x["Line"]))
|
|
166
|
+
for sdt in sorted_sdt:
|
|
167
|
+
self.__update_scenario_duration(sdt, features_path, tag_prefix, dry_run)
|
|
168
|
+
|
|
169
|
+
def __update_scenario_duration(self, scenario_duration_tag, features_path, tag_prefix, dry_run):
|
|
170
|
+
apply = scenario_duration_tag["Apply"]
|
|
171
|
+
if apply and Converter.is_boolean(apply) and Converter.to_boolean(apply):
|
|
172
|
+
file = scenario_duration_tag["File"]
|
|
173
|
+
line_nb = int(scenario_duration_tag["Line"])
|
|
174
|
+
cur_tag = scenario_duration_tag["Current tag"]
|
|
175
|
+
new_tag = scenario_duration_tag["New tag"]
|
|
176
|
+
|
|
177
|
+
if file.startswith('features'):
|
|
178
|
+
file = file[len('features')+1:]
|
|
179
|
+
filepath = os.path.join(features_path, file)
|
|
180
|
+
|
|
181
|
+
logger.info(f" in {file} l.{line_nb}: '{cur_tag}' -> '{new_tag}'")
|
|
182
|
+
self.__update_scenario_duration_in_file(filepath, line_nb, cur_tag, new_tag, tag_prefix, dry_run)
|
|
183
|
+
|
|
184
|
+
def __update_scenario_duration_in_file(self, filepath, line_nb, cur_tag, new_tag, tag_prefix, dry_run):
|
|
185
|
+
# Read file content
|
|
186
|
+
with open(filepath, 'r') as fin:
|
|
187
|
+
lines = fin.readlines()
|
|
188
|
+
|
|
189
|
+
# Verify line line_nb is a scenario
|
|
190
|
+
if not lines[line_nb].strip().startswith("Scenario:"):
|
|
191
|
+
raise FunctionalException(f"In file '{filepath}', line {line_nb} is not a scenario. This happens when scenario duration tags file is not synchronized with feature files.")
|
|
192
|
+
|
|
193
|
+
# Find current tag in file
|
|
194
|
+
index_duration = None
|
|
195
|
+
index = line_nb - 2
|
|
196
|
+
while index >= 0:
|
|
197
|
+
line_content = lines[index].strip()
|
|
198
|
+
if line_content.startswith("@" + tag_prefix):
|
|
199
|
+
index_duration = index
|
|
200
|
+
break
|
|
201
|
+
elif not self.__is_line_before_scenario(line_content):
|
|
202
|
+
break
|
|
203
|
+
else:
|
|
204
|
+
index += 1
|
|
205
|
+
|
|
206
|
+
# Extract and verify current tag
|
|
207
|
+
if index_duration is not None:
|
|
208
|
+
scenario_tag = line_content[len("@" + tag_prefix):]
|
|
209
|
+
if scenario_tag != cur_tag:
|
|
210
|
+
logger.warning(f" WARNING: Actual tag in file is '{scenario_tag}' (expected: '{cur_tag}')")
|
|
211
|
+
elif cur_tag:
|
|
212
|
+
logger.warning(f" WARNING: Scenario has no actual tag in file (expected: '{cur_tag}')")
|
|
213
|
+
|
|
214
|
+
# Compute new meta line
|
|
215
|
+
index_sce = lines[line_nb - 1].find("Scenario")
|
|
216
|
+
new_line = " " * index_sce + "@" + tag_prefix + new_tag + "\n"
|
|
217
|
+
|
|
218
|
+
# Apply modification
|
|
219
|
+
if index_duration is not None:
|
|
220
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
221
|
+
logger.debug(f"{' '*8}Replacing line {index_duration+1}:\n{' '*12}old: [{lines[index_duration][:-1]}]\n{' '*12}new: [{new_line[:-1]}]")
|
|
222
|
+
if not dry_run:
|
|
223
|
+
lines[index_duration] = new_line
|
|
224
|
+
else:
|
|
225
|
+
index_insert = line_nb - 1
|
|
226
|
+
while True:
|
|
227
|
+
prev_content = lines[index_insert - 1].strip() if index_insert > 0 else None
|
|
228
|
+
if prev_content is not None and len(prev_content) > 2 and prev_content[1].isupper() and prev_content > new_line.strip():
|
|
229
|
+
index_insert -= 1
|
|
230
|
+
else:
|
|
231
|
+
break
|
|
232
|
+
if Tools.do_log(logger, logging.DEBUG):
|
|
233
|
+
logger.debug(f"{' '*8}Insert in line {index_insert+1}: [{new_line[:-1]}]")
|
|
234
|
+
if not dry_run:
|
|
235
|
+
lines.insert(index_insert, new_line)
|
|
236
|
+
|
|
237
|
+
# Save in file
|
|
238
|
+
if not dry_run:
|
|
239
|
+
with open(filepath, 'w') as fout:
|
|
240
|
+
fout.writelines(lines)
|
|
241
|
+
|
|
242
|
+
def __is_line_before_scenario(self, line):
|
|
243
|
+
return not any((line.strip().startswith(txt) for txt in ['Given', 'When', 'Then', 'Feature', '|', '"""', "'''"]))
|
|
244
|
+
|
|
245
|
+
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
|
|
2
|
+
#################################################
|
|
3
|
+
# HolAdo (Holistic Automation do)
|
|
4
|
+
#
|
|
5
|
+
# (C) Copyright 2021-2025 by Eric Klumpp
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
8
|
+
#
|
|
9
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
10
|
+
|
|
11
|
+
# The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
from holado_core.common.tools.tools import Tools
|
|
15
|
+
import logging
|
|
16
|
+
from holado_report.report.builders.report_builder import ReportBuilder
|
|
17
|
+
from holado_xml.xml.stream_xml_file import StreamXMLFile
|
|
18
|
+
from holado_system.system.filesystem.file import File
|
|
19
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class DetailedScenarioReportBuilder(ReportBuilder):
|
|
26
|
+
""" Detailed scenario report
|
|
27
|
+
It is dedicated to have a convenient compromise between completeness and shortness.
|
|
28
|
+
|
|
29
|
+
Notes: XML version of this report is mandatory by test-server as it uses CampaignManager that needs it in its campaign import process.
|
|
30
|
+
For this import process, all periods must be in uncompact format, thus this format is forced in XML format management.
|
|
31
|
+
"""
|
|
32
|
+
def __init__(self, filepath, file_format='xml', exclude_statuses=None, exclude_categories=None):
|
|
33
|
+
self.__file_format = file_format.lower()
|
|
34
|
+
self.__exclude_statuses = exclude_statuses
|
|
35
|
+
self.__exclude_categories = exclude_categories
|
|
36
|
+
|
|
37
|
+
if self.__file_format == 'xml':
|
|
38
|
+
self.__file = StreamXMLFile(filepath, mode='wt')
|
|
39
|
+
elif self.__file_format == 'txt':
|
|
40
|
+
self.__file = File(filepath, mode='wt')
|
|
41
|
+
else:
|
|
42
|
+
raise TechnicalException(f"Unmanaged format '{self.__file_format}' (possible formats: 'txt', 'xml')")
|
|
43
|
+
|
|
44
|
+
def build(self):
|
|
45
|
+
'''
|
|
46
|
+
The file is built after each scenario
|
|
47
|
+
'''
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
def after_scenario(self, scenario, scenario_report=None):
|
|
51
|
+
from holado_report.report.report_manager import ReportManager
|
|
52
|
+
category_validation, status_validation, step_failed, step_number, scenario_context, step_context = ReportManager.get_current_scenario_status_information(scenario)
|
|
53
|
+
|
|
54
|
+
# Manage excluded scenarios
|
|
55
|
+
if self.__exclude_statuses and status_validation in self.__exclude_statuses:
|
|
56
|
+
return
|
|
57
|
+
if category_validation is not None and self.__exclude_categories:
|
|
58
|
+
ind = category_validation.find(' (')
|
|
59
|
+
category = category_validation[:ind] if ind > 0 else category_validation
|
|
60
|
+
if category in self.__exclude_categories:
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
self.__file_add_scenario(scenario, scenario_report, category_validation, status_validation, step_failed, step_number, scenario_context, step_context)
|
|
64
|
+
|
|
65
|
+
def after_all(self):
|
|
66
|
+
# Manage file
|
|
67
|
+
self.__file.close()
|
|
68
|
+
|
|
69
|
+
def __file_add_scenario(self, scenario, scenario_report, category_validation, status_validation, step_failed, step_number, scenario_context, step_context):
|
|
70
|
+
if self.__file_format == 'xml':
|
|
71
|
+
self.__file_add_scenario_xml(scenario, scenario_report, category_validation, status_validation, step_failed, step_number, scenario_context, step_context)
|
|
72
|
+
else:
|
|
73
|
+
self.__file_add_scenario_txt(scenario, scenario_report, category_validation, status_validation, step_failed, step_number, scenario_context, step_context)
|
|
74
|
+
|
|
75
|
+
def __file_add_scenario_xml(self, scenario, scenario_report, category_validation, status_validation, step_failed, step_number, scenario_context, step_context):
|
|
76
|
+
from holado_report.report.report_manager import ReportManager
|
|
77
|
+
|
|
78
|
+
self.__open_file_if_needed()
|
|
79
|
+
|
|
80
|
+
data = {
|
|
81
|
+
'scenario': {
|
|
82
|
+
'file': ReportManager.format_scenario_short_description(scenario),
|
|
83
|
+
'feature': scenario.feature.name,
|
|
84
|
+
'scenario': scenario.name,
|
|
85
|
+
'scenario_period': ReportManager.format_context_period(scenario_context, use_compact_format=False),
|
|
86
|
+
'report': scenario_report.report_path,
|
|
87
|
+
'tags': "-t " + " -t ".join(scenario.feature.tags + scenario.tags),
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if category_validation:
|
|
91
|
+
data['scenario']['validation_category'] = category_validation
|
|
92
|
+
data['scenario']['validation_status'] = status_validation
|
|
93
|
+
if step_failed is not None:
|
|
94
|
+
failure_data = {
|
|
95
|
+
'step_number': step_number,
|
|
96
|
+
'step_line': step_failed.line
|
|
97
|
+
}
|
|
98
|
+
if step_context and step_context.start_datetime is not None:
|
|
99
|
+
failure_data['step_period'] = ReportManager.format_context_period(step_context, use_compact_format=False)
|
|
100
|
+
|
|
101
|
+
step_descr = ReportManager.get_step_description(step_failed)
|
|
102
|
+
if "\n" in step_descr:
|
|
103
|
+
failure_data['step'] = "\n" + Tools.indent_string(12, step_descr) + Tools.indent_string(8, "\n")
|
|
104
|
+
else:
|
|
105
|
+
failure_data['step'] = step_descr
|
|
106
|
+
|
|
107
|
+
step_error_message = ReportManager.get_step_error_message(step_failed)
|
|
108
|
+
if step_error_message:
|
|
109
|
+
if "\n" in step_error_message:
|
|
110
|
+
failure_data['error_message'] = "\n" + Tools.indent_string(12, step_error_message) + Tools.indent_string(8, "\n")
|
|
111
|
+
else:
|
|
112
|
+
failure_data['error_message'] = step_error_message
|
|
113
|
+
|
|
114
|
+
step_error = ReportManager.get_step_error(step_failed)
|
|
115
|
+
if step_error and step_error != step_error_message:
|
|
116
|
+
if "\n" in step_error:
|
|
117
|
+
failure_data['error'] = "\n" + Tools.indent_string(12, step_error) + Tools.indent_string(8, "\n")
|
|
118
|
+
else:
|
|
119
|
+
failure_data['error'] = step_error
|
|
120
|
+
data['scenario']['failure'] = failure_data
|
|
121
|
+
elif status_validation != 'Passed':
|
|
122
|
+
data['scenario']['failure'] = "No step failed, it has probably failed on a missing step implementation"
|
|
123
|
+
|
|
124
|
+
self.__file.write_element_dict(data, pretty=True, indent=Tools.indent_string(4, ''))
|
|
125
|
+
# Add 2 empty lines for more readability
|
|
126
|
+
self.__file.internal_file.writelines(['', ''])
|
|
127
|
+
|
|
128
|
+
def __file_add_scenario_txt(self, scenario, scenario_report, category_validation, status_validation, step_failed, step_number, scenario_context, step_context):
|
|
129
|
+
from holado_report.report.report_manager import ReportManager
|
|
130
|
+
|
|
131
|
+
self.__open_file_if_needed()
|
|
132
|
+
|
|
133
|
+
msg_list = [f"{scenario.filename} - l.{scenario.line}"]
|
|
134
|
+
msg_list.append(f" Feature: {scenario.feature.name}")
|
|
135
|
+
msg_list.append(f" Scenario: {scenario.name}")
|
|
136
|
+
msg_list.append(f" Report: {scenario_report.report_path}")
|
|
137
|
+
msg_list.append(f" Scenario period: {ReportManager.format_context_period(scenario_context)}")
|
|
138
|
+
msg_list.append(f" Tags: -t " + " -t ".join(scenario.feature.tags + scenario.tags))
|
|
139
|
+
if category_validation:
|
|
140
|
+
msg_list.append(f" Validation category: {category_validation}")
|
|
141
|
+
msg_list.append(f" Validation status: {status_validation}")
|
|
142
|
+
if step_failed is not None:
|
|
143
|
+
msg_list.append(f" Failure:")
|
|
144
|
+
msg_list.append(f" Step number-line: {step_number} - l.{step_failed.line}")
|
|
145
|
+
if step_context and step_context.start_datetime is not None:
|
|
146
|
+
msg_list.append(f" Step period: {ReportManager.format_context_period(step_context)}")
|
|
147
|
+
step_descr = ReportManager.get_step_description(step_failed)
|
|
148
|
+
if "\n" in step_descr:
|
|
149
|
+
msg_list.append(f" Step:")
|
|
150
|
+
msg_list.append(Tools.indent_string(12, step_descr))
|
|
151
|
+
else:
|
|
152
|
+
msg_list.append(f" Step: {step_descr}")
|
|
153
|
+
|
|
154
|
+
step_error = ReportManager.get_step_error(step_failed)
|
|
155
|
+
if step_error:
|
|
156
|
+
if "\n" in step_error:
|
|
157
|
+
msg_list.append(f" Error:")
|
|
158
|
+
msg_list.append(Tools.indent_string(12, step_error))
|
|
159
|
+
else:
|
|
160
|
+
msg_list.append(f" Error: {step_error}")
|
|
161
|
+
else:
|
|
162
|
+
msg_list.append(f" Failure: No step failed, it has probably failed on a missing step implementation")
|
|
163
|
+
msg_list.append(f"")
|
|
164
|
+
msg_list.append(f"")
|
|
165
|
+
|
|
166
|
+
self.__file.writelines(msg_list)
|
|
167
|
+
|
|
168
|
+
def __open_file_if_needed(self):
|
|
169
|
+
if not self.__file.is_open:
|
|
170
|
+
self.__file.open()
|
|
171
|
+
|
|
172
|
+
|
|
@@ -0,0 +1,132 @@
|
|
|
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 json
|
|
15
|
+
import logging
|
|
16
|
+
from holado_report.report.builders.report_builder import ReportBuilder
|
|
17
|
+
import weakref
|
|
18
|
+
from holado_python.common.tools.datetime import FORMAT_DATETIME_ISO, DateTime
|
|
19
|
+
from holado_core.common.exceptions.technical_exception import TechnicalException
|
|
20
|
+
from holado_system.system.filesystem.file import File
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ExecutionHistoricReportBuilder(ReportBuilder):
|
|
27
|
+
def __init__(self, execution_historic, filepath, file_format='json'):
|
|
28
|
+
self.__execution_historic_weakref = weakref.ref(execution_historic)
|
|
29
|
+
self.__file_format = file_format.lower()
|
|
30
|
+
|
|
31
|
+
if self.__file_format == 'json':
|
|
32
|
+
self.__file = File(filepath, mode='wt')
|
|
33
|
+
else:
|
|
34
|
+
raise TechnicalException(f"Unmanaged format '{self.__file_format}' (possible formats: 'json')")
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def __execution_historic(self):
|
|
38
|
+
return self.__execution_historic_weakref()
|
|
39
|
+
|
|
40
|
+
def build(self):
|
|
41
|
+
with self.__file as feh:
|
|
42
|
+
eh_json = self.__convert_execution_historic_to_json()
|
|
43
|
+
json_str = json.dumps(eh_json, ensure_ascii=False, indent=4)
|
|
44
|
+
feh.write(json_str)
|
|
45
|
+
|
|
46
|
+
def __convert_execution_historic_to_json(self):
|
|
47
|
+
return [self.__convert_execution_historic_feature_to_json(eh_feat) for eh_feat in self.__execution_historic]
|
|
48
|
+
|
|
49
|
+
def __convert_execution_historic_feature_to_json(self, eh_feature):
|
|
50
|
+
return {
|
|
51
|
+
'feature': self.__convert_feature_to_json(eh_feature.feature, eh_feature.feature_context, eh_feature.feature_report),
|
|
52
|
+
'scenarios': [self.__convert_execution_historic_scenario_to_json(eh_sce) for eh_sce in eh_feature.scenarios ]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
def __convert_feature_to_json(self, feature, feature_context, feature_report):
|
|
56
|
+
res = {
|
|
57
|
+
'name': feature.name,
|
|
58
|
+
'description': feature.description,
|
|
59
|
+
'tags': [str(tag) for tag in feature.tags],
|
|
60
|
+
'status': feature.status.name,
|
|
61
|
+
'duration': feature.duration,
|
|
62
|
+
'start_date': DateTime.datetime_2_str(feature_context.start_datetime, dt_format=FORMAT_DATETIME_ISO)
|
|
63
|
+
}
|
|
64
|
+
if feature_context.end_datetime:
|
|
65
|
+
res['end_date'] = DateTime.datetime_2_str(feature_context.end_datetime, dt_format=FORMAT_DATETIME_ISO)
|
|
66
|
+
res.update({
|
|
67
|
+
'filename': feature.filename,
|
|
68
|
+
'report': feature_report.report_path
|
|
69
|
+
})
|
|
70
|
+
return res
|
|
71
|
+
|
|
72
|
+
def __convert_execution_historic_scenario_to_json(self, eh_scenario):
|
|
73
|
+
return {
|
|
74
|
+
'scenario': self.__convert_scenario_to_json(eh_scenario.scenario, eh_scenario.scenario_context, eh_scenario.scenario_report),
|
|
75
|
+
'steps_by_scope': {scope_name:[self.__convert_execution_historic_step_to_json(eh_step) for eh_step in steps] for scope_name, steps in eh_scenario.steps_by_scope.items()},
|
|
76
|
+
'status_validation': eh_scenario.status_validation,
|
|
77
|
+
'step_failed': self.__convert_step_to_json(eh_scenario.step_failed) if eh_scenario.step_failed is not None else None,
|
|
78
|
+
'step_failed_number': eh_scenario.step_failed_number
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
def __convert_scenario_to_json(self, scenario, scenario_context, scenario_report):
|
|
82
|
+
res = {
|
|
83
|
+
'name': scenario.name,
|
|
84
|
+
'description': scenario.description,
|
|
85
|
+
'tags': [str(tag) for tag in scenario.tags],
|
|
86
|
+
'status': scenario.status.name,
|
|
87
|
+
'duration': scenario.duration,
|
|
88
|
+
'start_date': DateTime.datetime_2_str(scenario_context.start_datetime, dt_format=FORMAT_DATETIME_ISO)
|
|
89
|
+
}
|
|
90
|
+
if scenario_context.end_datetime:
|
|
91
|
+
res['end_date'] = DateTime.datetime_2_str(scenario_context.end_datetime, dt_format=FORMAT_DATETIME_ISO)
|
|
92
|
+
res.update({
|
|
93
|
+
'filename': scenario.filename,
|
|
94
|
+
'line': scenario.line,
|
|
95
|
+
'report': scenario_report.report_path
|
|
96
|
+
})
|
|
97
|
+
return res
|
|
98
|
+
|
|
99
|
+
def __convert_execution_historic_step_to_json(self, eh_step):
|
|
100
|
+
if eh_step.step is not None:
|
|
101
|
+
res = self.__convert_step_to_json(eh_step.step)
|
|
102
|
+
else:
|
|
103
|
+
res = {}
|
|
104
|
+
if eh_step.step_context is not None:
|
|
105
|
+
if eh_step.step_context.status is not None:
|
|
106
|
+
res['status'] = eh_step.step_context.status
|
|
107
|
+
if eh_step.step_context.start_datetime:
|
|
108
|
+
res['start_date'] = DateTime.datetime_2_str(eh_step.step_context.start_datetime, dt_format=FORMAT_DATETIME_ISO)
|
|
109
|
+
if eh_step.step_context.end_datetime:
|
|
110
|
+
res['end_date'] = DateTime.datetime_2_str(eh_step.step_context.end_datetime, dt_format=FORMAT_DATETIME_ISO)
|
|
111
|
+
|
|
112
|
+
res['description'] = eh_step.step_description
|
|
113
|
+
if eh_step.sub_steps:
|
|
114
|
+
res['sub_steps'] = [self.__convert_execution_historic_step_to_json(eh_sub_step) for eh_sub_step in eh_step.sub_steps ]
|
|
115
|
+
return res
|
|
116
|
+
|
|
117
|
+
def __convert_step_to_json(self, step):
|
|
118
|
+
from holado_report.report.report_manager import ReportManager
|
|
119
|
+
res = {
|
|
120
|
+
'status': step.status.name,
|
|
121
|
+
'duration': step.duration,
|
|
122
|
+
}
|
|
123
|
+
step_error = ReportManager.get_step_error(step)
|
|
124
|
+
if step_error:
|
|
125
|
+
res['error'] = step_error
|
|
126
|
+
if isinstance(step.filename, str) and step.filename != "<string>":
|
|
127
|
+
res['filename'] = step.filename
|
|
128
|
+
res['line'] = step.line
|
|
129
|
+
return res
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|