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.

Files changed (523) hide show
  1. {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/METADATA +13 -9
  2. holado-0.2.3.dist-info/RECORD +535 -0
  3. holado_ais/__init__.py +33 -0
  4. holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
  5. holado_ais/ais/ais_manager.py +151 -0
  6. holado_ais/ais/ais_messages.py +203 -0
  7. holado_ais/ais/ais_payload.py +35 -0
  8. holado_ais/ais/enums.py +37 -0
  9. holado_ais/ais/patch_pyais.py +1303 -0
  10. holado_ais/tests/behave/steps/__init__.py +17 -0
  11. holado_ais/tests/behave/steps/ais/__init__.py +0 -0
  12. holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
  13. holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
  14. holado_binary/__init__.py +17 -0
  15. holado_binary/ipc/binary.py +125 -0
  16. holado_binary/ipc/bit_series.py +307 -0
  17. holado_binary/tests/behave/steps/__init__.py +17 -0
  18. holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
  19. holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
  20. holado_context/__init__.py +16 -0
  21. holado_context/tests/behave/steps/__init__.py +16 -0
  22. holado_context/tests/behave/steps/private/__init__.py +16 -0
  23. holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
  24. holado_core/__init__.py +32 -0
  25. holado_core/common/__init__.py +0 -0
  26. holado_core/common/actors/actions.py +97 -0
  27. holado_core/common/actors/actor.py +226 -0
  28. holado_core/common/actors/element_actor.py +32 -0
  29. holado_core/common/actors/find_actor.py +106 -0
  30. holado_core/common/actors/tree_actor.py +32 -0
  31. holado_core/common/actors/verify_actions.py +69 -0
  32. holado_core/common/block/base.py +122 -0
  33. holado_core/common/block/block_manager.py +173 -0
  34. holado_core/common/block/block_method.py +46 -0
  35. holado_core/common/block/block_steps.py +37 -0
  36. holado_core/common/block/function.py +42 -0
  37. holado_core/common/block/scope_function.py +28 -0
  38. holado_core/common/block/scope_manager.py +238 -0
  39. holado_core/common/block/scope_steps.py +141 -0
  40. holado_core/common/criterias/and_criteria.py +61 -0
  41. holado_core/common/criterias/criteria.py +78 -0
  42. holado_core/common/criterias/or_criteria.py +64 -0
  43. holado_core/common/criterias/tools/criteria_context.py +20 -0
  44. holado_core/common/criterias/tools/criteria_parameters.py +18 -0
  45. holado_core/common/drivers/driver.py +153 -0
  46. holado_core/common/drivers/element_driver.py +30 -0
  47. holado_core/common/drivers/element_internal_api.py +239 -0
  48. holado_core/common/drivers/internal_api.py +40 -0
  49. holado_core/common/drivers/tree_driver.py +30 -0
  50. holado_core/common/drivers/tree_internal_api.py +176 -0
  51. holado_core/common/exceptions/__init__.py +0 -0
  52. holado_core/common/exceptions/element_exception.py +28 -0
  53. holado_core/common/exceptions/exceptions.py +24 -0
  54. holado_core/common/exceptions/functional_exception.py +21 -0
  55. holado_core/common/exceptions/holado_exception.py +25 -0
  56. holado_core/common/exceptions/technical_exception.py +27 -0
  57. holado_core/common/exceptions/timeout_exception.py +20 -0
  58. holado_core/common/exceptions/verify_exception.py +20 -0
  59. holado_core/common/finders/after_in_tree_finder.py +87 -0
  60. holado_core/common/finders/element_finder.py +60 -0
  61. holado_core/common/finders/else_finder.py +105 -0
  62. holado_core/common/finders/finder.py +478 -0
  63. holado_core/common/finders/or_finder.py +98 -0
  64. holado_core/common/finders/then_finder.py +157 -0
  65. holado_core/common/finders/tools/enums.py +30 -0
  66. holado_core/common/finders/tools/find_builder.py +118 -0
  67. holado_core/common/finders/tools/find_context.py +405 -0
  68. holado_core/common/finders/tools/find_info.py +27 -0
  69. holado_core/common/finders/tools/find_parameters.py +240 -0
  70. holado_core/common/finders/tools/find_updater.py +95 -0
  71. holado_core/common/finders/tools/finder_info.py +26 -0
  72. holado_core/common/finders/tree_finder.py +146 -0
  73. holado_core/common/handlers/__init__.py +0 -0
  74. holado_core/common/handlers/abstracts/base_redo.py +695 -0
  75. holado_core/common/handlers/abstracts/get_or_create.py +120 -0
  76. holado_core/common/handlers/element_holder.py +122 -0
  77. holado_core/common/handlers/enums.py +23 -0
  78. holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
  79. holado_core/common/handlers/features/resource_by_name.py +187 -0
  80. holado_core/common/handlers/features/resource_by_type.py +174 -0
  81. holado_core/common/handlers/redo.py +119 -0
  82. holado_core/common/handlers/wait.py +127 -0
  83. holado_core/common/inspectors/element_inspector.py +57 -0
  84. holado_core/common/inspectors/inspector.py +221 -0
  85. holado_core/common/inspectors/tools/inspect_builder.py +169 -0
  86. holado_core/common/inspectors/tools/inspect_context.py +69 -0
  87. holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
  88. holado_core/common/inspectors/tree_inspector.py +73 -0
  89. holado_core/common/resource/persisted_data_manager.py +113 -0
  90. holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
  91. holado_core/common/resource/resource_manager.py +143 -0
  92. holado_core/common/tables/__init__.py +1 -0
  93. holado_core/common/tables/comparators/__init__.py +0 -0
  94. holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
  95. holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
  96. holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
  97. holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
  98. holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
  99. holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
  100. holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
  101. holado_core/common/tables/comparators/string_table_comparator.py +29 -0
  102. holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
  103. holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
  104. holado_core/common/tables/comparators/table_comparator.py +209 -0
  105. holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
  106. holado_core/common/tables/comparators/table_row_comparator.py +116 -0
  107. holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
  108. holado_core/common/tables/converters/__init__.py +0 -0
  109. holado_core/common/tables/converters/table_converter.py +194 -0
  110. holado_core/common/tables/enums.py +23 -0
  111. holado_core/common/tables/table.py +261 -0
  112. holado_core/common/tables/table_cell.py +126 -0
  113. holado_core/common/tables/table_manager.py +366 -0
  114. holado_core/common/tables/table_row.py +169 -0
  115. holado_core/common/tables/table_with_header.py +236 -0
  116. holado_core/common/tools/__init__.py +0 -0
  117. holado_core/common/tools/comparators/comparator.py +151 -0
  118. holado_core/common/tools/comparators/object_comparator.py +21 -0
  119. holado_core/common/tools/converters/converter.py +107 -0
  120. holado_core/common/tools/path_manager.py +185 -0
  121. holado_core/common/tools/string_tools.py +135 -0
  122. holado_core/common/tools/tools.py +172 -0
  123. holado_core/common/transport/__init__.py +0 -0
  124. holado_core/common/transport/crc.py +40 -0
  125. holado_core/tests/behave/steps/__init__.py +20 -0
  126. holado_core/tests/behave/steps/common/__init__.py +0 -0
  127. holado_core/tests/behave/steps/common/common_steps.py +136 -0
  128. holado_core/tests/behave/steps/common/config_steps.py +42 -0
  129. holado_core/tests/behave/steps/common/resource_steps.py +62 -0
  130. holado_core/tests/behave/steps/common/tables_steps.py +537 -0
  131. holado_core/tools/__init__.py +0 -0
  132. holado_core/tools/abstracts/__init__.py +0 -0
  133. holado_core/tools/abstracts/blocking_command_service.py +56 -0
  134. holado_core/tools/abstracts/service.py +48 -0
  135. holado_data/__init__.py +31 -0
  136. holado_data/data/generator/base.py +93 -0
  137. holado_data/data/generator/python_generator.py +30 -0
  138. holado_data/tests/behave/steps/__init__.py +17 -0
  139. holado_data/tests/behave/steps/data/generator_steps.py +91 -0
  140. holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
  141. holado_db/__init__.py +32 -0
  142. holado_db/tests/behave/steps/__init__.py +18 -0
  143. holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
  144. holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
  145. holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
  146. holado_db/tools/db/clients/base/db_client.py +206 -0
  147. holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
  148. holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
  149. holado_db/tools/db/db_manager.py +109 -0
  150. holado_db/tools/db/query/base/query_builder.py +87 -0
  151. holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
  152. holado_db/tools/db/query/query_manager.py +77 -0
  153. holado_docker/__init__.py +25 -0
  154. holado_docker/sdk/docker/docker_client.py +268 -0
  155. holado_docker/sdk/docker/docker_service.py +71 -0
  156. holado_docker/tests/behave/steps/__init__.py +16 -0
  157. holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
  158. holado_docker/tools/docker_controler/__init__.py +26 -0
  159. holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
  160. holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
  161. holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
  162. holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
  163. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
  164. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
  165. holado_grpc/__init__.py +32 -0
  166. holado_grpc/api/rpc/TODO.txt +4 -0
  167. holado_grpc/api/rpc/grpc_client.py +181 -0
  168. holado_grpc/api/rpc/grpc_manager.py +81 -0
  169. holado_grpc/ipc/rpc/__init__.py +0 -0
  170. holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
  171. holado_grpc/ipc/rpc/grpc_services.py +165 -0
  172. holado_grpc/tests/behave/steps/__init__.py +16 -0
  173. holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
  174. holado_grpc/tests/behave/steps/private/__init__.py +16 -0
  175. holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
  176. holado_helper/__init__.py +35 -0
  177. holado_helper/debug/README.txt +32 -0
  178. holado_helper/debug/memory/memory_profiler.py +106 -0
  179. holado_helper/docker/init_user.sh +24 -0
  180. holado_helper/docker/logging.conf +42 -0
  181. holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
  182. holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
  183. holado_helper/docker/run_terminal_in_docker.sh +101 -0
  184. holado_helper/holado_module_template/__init__.py +31 -0
  185. holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
  186. holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
  187. holado_helper/script/action.py +109 -0
  188. holado_helper/script/action_script.py +477 -0
  189. holado_helper/script/any_action_script.py +126 -0
  190. holado_helper/script/behave_action_script.py +99 -0
  191. holado_helper/script/csv_action_script.py +142 -0
  192. holado_helper/script/initialize_script.py +115 -0
  193. holado_helper/script/input_output_script.py +136 -0
  194. holado_helper/script/job.py +75 -0
  195. holado_helper/script/json_action_script.py +104 -0
  196. holado_helper/script/script.py +110 -0
  197. holado_json/__init__.py +16 -0
  198. holado_json/ipc/json.py +125 -0
  199. holado_json/ipc/json_converter.py +69 -0
  200. holado_json/ipc/json_types.py +183 -0
  201. holado_json/tests/behave/steps/__init__.py +16 -0
  202. holado_json/tests/behave/steps/ipc/__init__.py +0 -0
  203. holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
  204. holado_keycloak/__init__.py +16 -0
  205. holado_keycloak/tests/behave/steps/__init__.py +16 -0
  206. holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
  207. holado_keycloak/tools/keycloak/__init__.py +0 -0
  208. holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
  209. holado_logging/__init__.py +36 -0
  210. holado_logging/common/logging/holado_logger.py +75 -0
  211. holado_logging/common/logging/log_config.py +128 -0
  212. holado_logging/common/logging/log_manager.py +292 -0
  213. holado_multitask/__init__.py +33 -0
  214. holado_multitask/multiprocessing/context/process_context.py +35 -0
  215. holado_multitask/multiprocessing/function_process.py +102 -0
  216. holado_multitask/multiprocessing/periodic_function_process.py +135 -0
  217. holado_multitask/multiprocessing/process.py +196 -0
  218. holado_multitask/multiprocessing/processesmanager.py +133 -0
  219. holado_multitask/multitasking/multitask_manager.py +439 -0
  220. holado_multitask/multithreading/__init__.py +0 -0
  221. holado_multitask/multithreading/context/thread_context.py +84 -0
  222. holado_multitask/multithreading/functionthreaded.py +129 -0
  223. holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
  224. holado_multitask/multithreading/loopthread.py +100 -0
  225. holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
  226. holado_multitask/multithreading/reflection/inspect.py +47 -0
  227. holado_multitask/multithreading/reflection/sys.py +29 -0
  228. holado_multitask/multithreading/reflection/traceback.py +35 -0
  229. holado_multitask/multithreading/thread.py +177 -0
  230. holado_multitask/multithreading/threadsmanager.py +162 -0
  231. holado_multitask/multithreading/timer.py +48 -0
  232. holado_multitask/tests/behave/steps/__init__.py +17 -0
  233. holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
  234. holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
  235. holado_protobuf/__init__.py +61 -0
  236. holado_protobuf/ipc/protobuf/__init__.py +0 -0
  237. holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
  238. holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
  239. holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
  240. holado_protobuf/ipc/protobuf/protobuf_messages.py +965 -0
  241. holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
  242. holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
  243. holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
  244. holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
  245. holado_protobuf/tests/behave/steps/__init__.py +16 -0
  246. holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
  247. holado_python/__init__.py +35 -0
  248. holado_python/common/enums.py +34 -0
  249. holado_python/common/iterables.py +30 -0
  250. holado_python/common/tools/comparators/boolean_comparator.py +37 -0
  251. holado_python/common/tools/comparators/bytes_comparator.py +48 -0
  252. holado_python/common/tools/comparators/datetime_comparator.py +74 -0
  253. holado_python/common/tools/comparators/float_comparator.py +97 -0
  254. holado_python/common/tools/comparators/integer_comparator.py +37 -0
  255. holado_python/common/tools/comparators/string_comparator.py +99 -0
  256. holado_python/common/tools/comparators/type_comparator.py +31 -0
  257. holado_python/common/tools/datetime.py +279 -0
  258. holado_python/standard_library/csv.py +207 -0
  259. holado_python/standard_library/hashlib.py +82 -0
  260. holado_python/standard_library/multiprocessing.py +62 -0
  261. holado_python/standard_library/queue.py +79 -0
  262. holado_python/standard_library/socket/blocking_socket.py +136 -0
  263. holado_python/standard_library/socket/echo_server.py +28 -0
  264. holado_python/standard_library/socket/message_socket.py +91 -0
  265. holado_python/standard_library/socket/non_blocking_socket.py +151 -0
  266. holado_python/standard_library/socket/socket.py +148 -0
  267. holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
  268. holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
  269. holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
  270. holado_python/standard_library/ssl/ssl.py +81 -0
  271. holado_python/standard_library/typing.py +192 -0
  272. holado_python/tests/behave/steps/__init__.py +27 -0
  273. holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
  274. holado_python/tests/behave/steps/convert_steps.py +59 -0
  275. holado_python/tests/behave/steps/iterable_steps.py +87 -0
  276. holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
  277. holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
  278. holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
  279. holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
  280. holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
  281. holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
  282. holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
  283. holado_rabbitmq/__init__.py +28 -0
  284. holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
  285. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
  286. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
  287. holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
  288. holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +675 -0
  289. holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
  290. holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
  291. holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
  292. holado_redis/__init__.py +17 -0
  293. holado_redis/tests/behave/steps/__init__.py +16 -0
  294. holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
  295. holado_redis/tools/redis/TODO.txt +7 -0
  296. holado_redis/tools/redis/redis_client.py +190 -0
  297. holado_redis/tools/redis/redis_manager.py +38 -0
  298. holado_report/__init__.py +27 -0
  299. holado_report/report/analyze/execution_historic_manager.py +96 -0
  300. holado_report/report/analyze/scenario_duration_manager.py +245 -0
  301. holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
  302. holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
  303. holado_report/report/builders/report_builder.py +64 -0
  304. holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
  305. holado_report/report/builders/summary_report_builder.py +89 -0
  306. holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
  307. holado_report/report/builders/summary_scenario_report_builder.py +74 -0
  308. holado_report/report/execution_historic.py +141 -0
  309. holado_report/report/report_manager.py +256 -0
  310. holado_report/report/reports/base_report.py +163 -0
  311. holado_report/report/reports/feature_report.py +106 -0
  312. holado_report/report/reports/scenario_report.py +64 -0
  313. holado_rest/__init__.py +24 -0
  314. holado_rest/api/rest/TODO.txt +2 -0
  315. holado_rest/api/rest/rest_client.py +113 -0
  316. holado_rest/api/rest/rest_manager.py +62 -0
  317. holado_rest/tests/behave/steps/__init__.py +16 -0
  318. holado_rest/tests/behave/steps/api/__init__.py +0 -0
  319. holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
  320. holado_rest/tests/behave/steps/private/__init__.py +16 -0
  321. holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
  322. holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
  323. holado_s3/__init__.py +17 -0
  324. holado_s3/tests/behave/steps/__init__.py +17 -0
  325. holado_s3/tests/behave/steps/private/__init__.py +16 -0
  326. holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
  327. holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
  328. holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
  329. holado_s3/tools/s3/__init__.py +0 -0
  330. holado_s3/tools/s3/boto3_s3_client.py +59 -0
  331. holado_s3/tools/s3/minio_client.py +75 -0
  332. holado_s3/tools/s3/moto_server.py +52 -0
  333. holado_scripting/__init__.py +53 -0
  334. holado_scripting/common/tools/dynamic_text_manager.py +73 -0
  335. holado_scripting/common/tools/evaluate_parameters.py +210 -0
  336. holado_scripting/common/tools/expression_evaluator.py +387 -0
  337. holado_scripting/common/tools/variable_manager.py +321 -0
  338. holado_scripting/tests/behave/steps/__init__.py +22 -0
  339. holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
  340. holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
  341. holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
  342. holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
  343. holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
  344. holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
  345. holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
  346. holado_scripting/text/base/base_function.py +25 -0
  347. holado_scripting/text/base/base_verify_function.py +25 -0
  348. holado_scripting/text/base/text_inspecter.py +204 -0
  349. holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
  350. holado_scripting/text/interpreter/functions/function_cast.py +60 -0
  351. holado_scripting/text/interpreter/functions/function_convert.py +57 -0
  352. holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
  353. holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
  354. holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
  355. holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
  356. holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
  357. holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
  358. holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
  359. holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
  360. holado_scripting/text/interpreter/text_interpreter.py +216 -0
  361. holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
  362. holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
  363. holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
  364. holado_scripting/text/verifier/text_verifier.py +103 -0
  365. holado_sftp/__init__.py +16 -0
  366. holado_sftp/tests/behave/steps/__init__.py +17 -0
  367. holado_sftp/tests/behave/steps/private/__init__.py +16 -0
  368. holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
  369. holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
  370. holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
  371. holado_sftp/tools/sftp/__init__.py +0 -0
  372. holado_sftp/tools/sftp/sftp_client.py +103 -0
  373. holado_sftp/tools/sftp/sftp_server.py +39 -0
  374. holado_swagger/__init__.py +31 -0
  375. holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
  376. holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
  377. holado_swagger/tests/behave/steps/__init__.py +16 -0
  378. holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
  379. holado_system/system/command/command.py +216 -0
  380. holado_system/system/command/command_result.py +128 -0
  381. holado_system/system/command/curl_command.py +101 -0
  382. holado_system/system/command/exceptions.py +59 -0
  383. holado_system/system/filesystem/file.py +76 -0
  384. holado_system/system/global_system.py +187 -0
  385. holado_system/tests/behave/steps/__init__.py +18 -0
  386. holado_system/tests/behave/steps/system/commands_steps.py +92 -0
  387. holado_system/tests/behave/steps/system/file_steps.py +215 -0
  388. holado_system/tests/behave/steps/system/system_steps.py +84 -0
  389. holado_test/__init__.py +27 -0
  390. holado_test/behave/__init__.py +0 -0
  391. holado_test/behave/behave.py +397 -0
  392. holado_test/behave/behave_environment.py +143 -0
  393. holado_test/behave/behave_function.py +33 -0
  394. holado_test/behave/behave_manager.py +555 -0
  395. holado_test/behave/independant_runner.py +68 -0
  396. holado_test/behave/scenario/__init__.py +0 -0
  397. holado_test/behave/scenario/behave_step_tools.py +157 -0
  398. holado_test/common/context/feature_context.py +79 -0
  399. holado_test/common/context/scenario_context.py +217 -0
  400. holado_test/common/context/step_context.py +66 -0
  401. holado_test/common/exceptions/undefined_step_exception.py +21 -0
  402. holado_test/scenario/step_tools.py +523 -0
  403. holado_test/scenario/tester_tools.py +52 -0
  404. holado_test/test_config.py +26 -0
  405. holado_test/tests/behave/steps/__init__.py +18 -0
  406. holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
  407. holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
  408. holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
  409. holado_value/__init__.py +24 -0
  410. holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
  411. holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
  412. holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
  413. holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
  414. holado_value/common/tables/converters/value_table_converter.py +217 -0
  415. holado_value/common/tables/value_table.py +29 -0
  416. holado_value/common/tables/value_table_cell.py +67 -0
  417. holado_value/common/tables/value_table_manager.py +58 -0
  418. holado_value/common/tables/value_table_row.py +44 -0
  419. holado_value/common/tables/value_table_with_header.py +28 -0
  420. holado_value/common/tools/unique_value_manager.py +108 -0
  421. holado_value/common/tools/value.py +164 -0
  422. holado_value/common/tools/value_types.py +35 -0
  423. holado_value/tests/behave/steps/__init__.py +16 -0
  424. holado_value/tests/behave/steps/private/__init__.py +16 -0
  425. holado_ws/__init__.py +16 -0
  426. holado_ws/api/ws/TODO.txt +2 -0
  427. holado_ws/tests/behave/steps/__init__.py +16 -0
  428. holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
  429. holado_yaml/__init__.py +31 -0
  430. holado_yaml/tests/behave/steps/__init__.py +16 -0
  431. holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
  432. holado_yaml/yaml/yaml_manager.py +86 -0
  433. test_holado/Dockerfile_test_holado +82 -0
  434. test_holado/__init__.py +4 -0
  435. test_holado/__main__.py +25 -0
  436. test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
  437. test_holado/environment.py +42 -0
  438. test_holado/features/NonReg/api/REST.feature +21 -0
  439. test_holado/features/NonReg/api/gRPC.feature +122 -0
  440. test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
  441. test_holado/features/NonReg/common/system/commands.feature +43 -0
  442. test_holado/features/NonReg/common/system/system.feature +20 -0
  443. test_holado/features/NonReg/common/tables/table.feature +239 -0
  444. test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
  445. test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
  446. test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
  447. test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
  448. test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
  449. test_holado/features/NonReg/holado_python/convert.feature +20 -0
  450. test_holado/features/NonReg/holado_python/iterable.feature +61 -0
  451. test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
  452. test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
  453. test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
  454. test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
  455. test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
  456. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
  457. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
  458. test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
  459. test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
  460. test_holado/features/NonReg/ipc/bit_series.feature +131 -0
  461. test_holado/features/NonReg/ipc/json.feature +20 -0
  462. test_holado/features/NonReg/scenario/scenario.feature +139 -0
  463. test_holado/features/NonReg/test_steps/behave.feature +275 -0
  464. test_holado/features/NonReg/test_steps/common.feature +100 -0
  465. test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
  466. test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
  467. test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
  468. test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
  469. test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
  470. test_holado/features/NonReg/tools/sFTP.feature +25 -0
  471. test_holado/features/Test/logger.feature +28 -0
  472. test_holado/features/__init__.py +0 -0
  473. test_holado/logging.conf +41 -0
  474. test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
  475. test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
  476. test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
  477. test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
  478. test_holado/resources/scripts/list_tags.sh +2 -0
  479. test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
  480. test_holado/steps/__init__.py +0 -0
  481. test_holado/steps/private_steps.py +20 -0
  482. test_holado/steps/public_steps.py +23 -0
  483. test_holado/test_holado_session_context.py +43 -0
  484. test_holado/tools/django/README.txt +3 -0
  485. test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
  486. test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
  487. test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
  488. test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
  489. test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
  490. test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
  491. test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
  492. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
  493. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
  494. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
  495. test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
  496. test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
  497. test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
  498. test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
  499. test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
  500. test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
  501. test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
  502. test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
  503. test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
  504. test_holado/tools/django/api_grpc/manage.py +27 -0
  505. test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
  506. test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
  507. test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
  508. test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
  509. test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
  510. test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
  511. test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
  512. test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
  513. test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
  514. test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
  515. test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
  516. test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
  517. test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
  518. test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
  519. test_holado/tools/django/api_rest/db.sqlite3 +0 -0
  520. test_holado/tools/django/api_rest/manage.py +22 -0
  521. holado-0.2.2.dist-info/RECORD +0 -17
  522. {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/WHEEL +0 -0
  523. {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,89 @@
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_report.report.builders.report_builder import ReportBuilder
16
+ import weakref
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+
22
+ class SummaryByExecutionHistoricReportBuilder(ReportBuilder):
23
+ def __init__(self, execution_historic, filepath):
24
+ self.__execution_historic_weakref = weakref.ref(execution_historic)
25
+ self.__filepath = filepath
26
+
27
+ @property
28
+ def __execution_historic(self):
29
+ return self.__execution_historic_weakref()
30
+
31
+ def build(self):
32
+ features = {}
33
+ scenarios = {}
34
+ for eh_feat in self.__execution_historic:
35
+ status_name = eh_feat.feature.status.name
36
+ if status_name not in features:
37
+ features[status_name] = 0
38
+ features[status_name] += 1
39
+
40
+ for eh_sce in eh_feat.scenarios:
41
+ status_name = eh_sce.status_validation
42
+ # status_name = eh_sce[0].status.name.lower()
43
+ if status_name not in scenarios:
44
+ scenarios[status_name] = 0
45
+ scenarios[status_name] += 1
46
+
47
+ with open(self.__filepath, "wt") as feh:
48
+ feh.write("features: " + ", ".join([f"{v} {k}" for k, v in dict(sorted(features.items())).items()]) + "\n")
49
+ feh.write("scenarios: " + ", ".join([f"{v} {k}" for k, v in dict(sorted(scenarios.items())).items()]) + "\n")
50
+
51
+
52
+ class SummaryReportBuilder(ReportBuilder):
53
+ def __init__(self, filepath):
54
+ self.__filepath = filepath
55
+ self.__features = {}
56
+ self.__scenarios = {}
57
+
58
+ def build(self):
59
+ '''
60
+ The file is built after each scenario
61
+ '''
62
+ pass
63
+
64
+ def after_scenario(self, scenario, scenario_report=None):
65
+ from holado_report.report.report_manager import ReportManager
66
+ status_name, _, _ = ReportManager.get_current_scenario_status_information(scenario)
67
+
68
+ if status_name not in self.__scenarios:
69
+ self.__scenarios[status_name] = 0
70
+ self.__scenarios[status_name] += 1
71
+
72
+ self.__update_file()
73
+
74
+ def after_feature(self, feature, feature_report=None):
75
+ status_name = feature.status.name
76
+ if status_name not in self.__features:
77
+ self.__features[status_name] = 0
78
+ self.__features[status_name] += 1
79
+
80
+ self.__update_file()
81
+
82
+ def __update_file(self):
83
+ with open(self.__filepath, "wt") as feh:
84
+ feh.write("features: " + ", ".join([f"{v} {k}" for k, v in dict(sorted(self.__features.items())).items()]) + "\n")
85
+ feh.write("scenarios: " + ", ".join([f"{v} {k}" for k, v in dict(sorted(self.__scenarios.items())).items()]) + "\n")
86
+
87
+
88
+
89
+
@@ -0,0 +1,56 @@
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_report.report.builders.report_builder import ReportBuilder
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+
21
+ class SummaryScenarioFailedReportBuilder(ReportBuilder):
22
+ def __init__(self, filepath):
23
+ self.__filepath = filepath
24
+ self.__file_fail = None
25
+
26
+ def build(self):
27
+ '''
28
+ The file is built after each scenario
29
+ '''
30
+ pass
31
+
32
+ def after_scenario(self, scenario, scenario_report=None):
33
+ from holado_report.report.report_manager import ReportManager
34
+ status_validation, step_failed, step_number = ReportManager.get_current_scenario_status_information(scenario)
35
+
36
+ if status_validation != "Passed":
37
+ self.__file_fail_add_scenario(scenario, status_validation, step_failed, step_number)
38
+
39
+ def after_all(self):
40
+ # Manage file fail
41
+ if self.__file_fail is not None:
42
+ self.__file_fail.close()
43
+ self.__file_fail = None
44
+
45
+ def __file_fail_add_scenario(self, scenario, status_validation, step_failed, step_number):
46
+ self.__open_file_if_needed()
47
+ if step_failed is not None:
48
+ self.__file_fail.write(f"scenario in {scenario.filename} at l.{scenario.line} - step {step_number} (l.{step_failed.line}) - {status_validation}\n")
49
+ else:
50
+ self.__file_fail.write(f"scenario in {scenario.filename} at l.{scenario.line} - step ? (missing step implementation ?) - {status_validation}\n")
51
+ self.__file_fail.flush()
52
+
53
+ def __open_file_if_needed(self):
54
+ if self.__file_fail is None:
55
+ self.__file_fail = open(self.__filepath, "wt")
56
+
@@ -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_report.report.builders.report_builder import ReportBuilder
16
+ from holado_python.common.tools.datetime import DateTime,\
17
+ FORMAT_DATETIME_HUMAN_SECOND
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+
23
+ class SummaryScenarioReportBuilder(ReportBuilder):
24
+ def __init__(self, filepath):
25
+ self.__filepath = filepath
26
+ self.__file = None
27
+
28
+ def build(self):
29
+ '''
30
+ The file is built after each scenario
31
+ '''
32
+ pass
33
+
34
+ def after_scenario(self, scenario, scenario_report=None):
35
+ from holado_report.report.report_manager import ReportManager
36
+ status_validation, step_failed, step_number = ReportManager.get_current_scenario_status_information(scenario)
37
+
38
+ if status_validation == "Passed":
39
+ self.__file_add_scenario_success(scenario, status_validation)
40
+ else:
41
+ self.__file_add_scenario_fail(scenario, status_validation, step_failed, step_number)
42
+
43
+ def after_all(self):
44
+ # Manage file fail
45
+ if self.__file is not None:
46
+ self.__file.close()
47
+ self.__file = None
48
+
49
+ def __file_add_scenario_success(self, scenario, status_validation):
50
+ self.__open_file_if_needed()
51
+ self.__file_write(scenario, None, status_validation)
52
+ self.__file.flush()
53
+
54
+ def __file_add_scenario_fail(self, scenario, status_validation, step_failed, step_number):
55
+ self.__open_file_if_needed()
56
+ if step_failed is not None:
57
+ self.__file_write(scenario, f"step {step_number} (l.{step_failed.line})", status_validation)
58
+ else:
59
+ self.__file_write(scenario, f"step ? (missing step implementation ?)", status_validation)
60
+ self.__file.flush()
61
+
62
+ def __file_write(self, scenario, text, status_validation):
63
+ dt = DateTime.now()
64
+ dt_str = DateTime.datetime_2_str(dt, FORMAT_DATETIME_HUMAN_SECOND)
65
+
66
+ if text:
67
+ self.__file.write(f"{dt_str} - {scenario.filename} at l.{scenario.line} - {text} - {status_validation}\n")
68
+ else:
69
+ self.__file.write(f"{dt_str} - {scenario.filename} at l.{scenario.line} - {status_validation}\n")
70
+
71
+ def __open_file_if_needed(self):
72
+ if self.__file is None:
73
+ self.__file = open(self.__filepath, "wt")
74
+
@@ -0,0 +1,141 @@
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.exceptions.technical_exception import TechnicalException
16
+ from typing import NamedTuple
17
+ from holado.common.context.session_context import SessionContext
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+
23
+ class ExecutionHistoric():
24
+ def __init__(self):
25
+ self.__execution_historic = []
26
+
27
+ def __iter__(self):
28
+ return self.__execution_historic.__iter__()
29
+
30
+ def __next__(self):
31
+ return self.__execution_historic.__next__()
32
+
33
+ def __has_scenario_context(self):
34
+ return SessionContext.instance().has_scenario_context()
35
+
36
+ @property
37
+ def __multitask_manager(self):
38
+ return SessionContext.instance().multitask_manager
39
+
40
+ def before_all(self):
41
+ pass
42
+
43
+ def before_feature(self, feature_context, feature, feature_report=None):
44
+ self.__execution_historic.append( self.__new_FeatureExecutionHistoric(feature_context, feature, feature_report) )
45
+
46
+ def __new_FeatureExecutionHistoric(self, feature_context, feature, feature_report=None):
47
+ res = NamedTuple("FeatureExecutionHistoric", feature_context=object, feature=object, feature_report=object, scenarios=list)
48
+ res.feature_context = feature_context
49
+ res.feature = feature
50
+ res.feature_report = feature_report
51
+ res.scenarios = []
52
+ return res
53
+
54
+ def before_scenario(self, scenario_context, scenario, scenario_report=None):
55
+ seh = self.__new_ScenarioExecutionHistoric(scenario_context, scenario, scenario_report)
56
+ self.__get_execution_historic_current_feature_scenarios().append(seh)
57
+
58
+ def __new_ScenarioExecutionHistoric(self, scenario_context, scenario, scenario_report):
59
+ res = NamedTuple("ScenarioExecutionHistoric", scenario_context=object, scenario=object, scenario_report=object, steps_by_scope=dict, status_validation=str, step_failed=object, step_failed_number=int)
60
+ res.scenario_context = scenario_context
61
+ res.scenario = scenario
62
+ res.scenario_report = scenario_report
63
+ res.steps_by_scope = {}
64
+ res.status_validation = None
65
+ res.step_failed = None
66
+ res.step_failed_number = None
67
+ return res
68
+
69
+ def before_step(self, step_context, step, step_level):
70
+ seh = self.__new_StepExecutionHistoric(step_context, step)
71
+ self.__get_execution_historic_current_scenario_steps(step_level).append(seh)
72
+
73
+ def __new_StepExecutionHistoric(self, step_context, step, step_description=None):
74
+ if step_description is None and step is not None:
75
+ from holado_report.report.report_manager import ReportManager
76
+ step_description = ReportManager.get_step_description(step)
77
+
78
+ res = NamedTuple("StepExecutionHistoric", step_context=object, step=object, step_description=str, sub_steps=list)
79
+ res.step_context = step_context
80
+ res.step = step
81
+ res.step_description = step_description
82
+ res.sub_steps = []
83
+ return res
84
+
85
+ def after_step(self, step_context, step, step_level):
86
+ pass
87
+
88
+ def after_scenario(self, scenario, scenario_report=None):
89
+ from holado_report.report.report_manager import ReportManager
90
+ status_validation, step_failed, step_number = ReportManager.get_current_scenario_status_information(scenario)
91
+
92
+ # Update execution historic
93
+ current_scenario = self.__get_execution_historic_current_scenario()
94
+ current_scenario.status_validation = status_validation
95
+ current_scenario.step_failed = step_failed
96
+ current_scenario.step_failed_number = step_number
97
+
98
+ # Prepare after scenario steps
99
+ seh = self.__new_StepExecutionHistoric(step_context=None, step=None, step_description="After scenario steps")
100
+ self.__get_execution_historic_current_scenario_steps(0).append(seh)
101
+
102
+
103
+ def after_feature(self, feature, feature_report=None):
104
+ pass
105
+
106
+ def after_all(self):
107
+ # logger.info(f"++++++++++ Execution historic size: {len(self.__execution_historic)}")
108
+ pass
109
+
110
+ def __get_execution_historic_current_feature_scenarios(self):
111
+ if len(self.__execution_historic) > 0:
112
+ return self.__execution_historic[-1].scenarios
113
+ else:
114
+ raise TechnicalException(f"No feature in execution historic")
115
+
116
+ def __get_execution_historic_current_scenario(self):
117
+ scenario_list = self.__get_execution_historic_current_feature_scenarios()
118
+ if len(scenario_list) > 0:
119
+ return scenario_list[-1]
120
+ else:
121
+ raise TechnicalException(f"No scenario in current feature in execution historic")
122
+
123
+ def __get_execution_historic_current_scenario_steps(self, step_level):
124
+ steps_by_scope = self.__get_execution_historic_current_scenario().steps_by_scope
125
+
126
+ if self.__multitask_manager.is_main_thread:
127
+ scope_name = "main"
128
+ else:
129
+ scope_name = self.__multitask_manager.get_thread_id()
130
+ if scope_name not in steps_by_scope:
131
+ steps_by_scope[scope_name] = []
132
+ res = steps_by_scope[scope_name]
133
+
134
+ for level in range(step_level):
135
+ if len(res) == 0:
136
+ logger.warning(f"Failed to get current scenario step list of level {step_level} (step list of level {level}: {res}) ; Add a fake step with description '[Missing step]'")
137
+ res.append( self.__new_StepExecutionHistoric(None, None, "[Missing step]") )
138
+ res = res[-1].sub_steps
139
+ return res
140
+
141
+
@@ -0,0 +1,256 @@
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.common.context.session_context import SessionContext
15
+ from behave.model_core import Status
16
+ from holado_core.common.tools.tools import Tools
17
+ import logging
18
+ # from holado_report.report.builders.json_execution_historic_report_builder import JsonExecutionHistoricReportBuilder
19
+ from holado_report.report.builders.detailed_scenario_failed_report_builder import DetailedScenarioFailedReportBuilder
20
+ from holado_report.report.builders.summary_report_builder import SummaryReportBuilder
21
+ from holado_report.report.builders.summary_scenario_failed_report_builder import SummaryScenarioFailedReportBuilder
22
+ from holado_report.report.builders.short_scenario_failed_report_builder import ShortScenarioFailedReportBuilder
23
+ from holado_report.report.reports.base_report import BaseReport
24
+ from holado_scripting.common.tools.evaluate_parameters import EvaluateParameters
25
+ from holado_report.report.builders.summary_scenario_report_builder import SummaryScenarioReportBuilder
26
+ # from holado_core.scenario.scenario_duration_manager import ScenarioDurationManager
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+
32
+
33
+ class ReportManager(BaseReport):
34
+ TFeatureReport = None
35
+ TStepTools = None
36
+
37
+ def __init__(self):
38
+ super().__init__()
39
+
40
+ self.__multitask_manager = None
41
+
42
+ # Auto configuration
43
+ self.configure()
44
+
45
+ def configure(self):
46
+ from holado_report.report.reports.feature_report import FeatureReport
47
+ ReportManager.TFeatureReport = FeatureReport
48
+
49
+ from holado_test.behave.scenario.behave_step_tools import BehaveStepTools
50
+ ReportManager.TStepTools = BehaveStepTools
51
+
52
+ def initialize(self, multitask_manager):
53
+ self.__multitask_manager = multitask_manager
54
+
55
+ def initialize_reports(self):
56
+ # self.set_execution_historic()
57
+
58
+ if self.has_report_path:
59
+ # fn = self.get_path("execution_historic.json")
60
+ # self.add_report_builder(JsonExecutionHistoricReportBuilder(self.execution_historic, fn))
61
+
62
+ fn = self.get_path("report_summary_scenario_failed.txt")
63
+ self.add_report_builder(SummaryScenarioFailedReportBuilder(fn))
64
+
65
+ fn = self.get_path("report_summary_scenario_all.txt")
66
+ self.add_report_builder(SummaryScenarioReportBuilder(fn))
67
+
68
+ fn = self.get_path("report_short_scenario_failed.txt")
69
+ self.add_report_builder(ShortScenarioFailedReportBuilder(fn))
70
+
71
+ # fn = self.get_path("report_detailed_scenario_failed.txt")
72
+ fn = self.get_path("report_detailed_scenario_failed.xml")
73
+ self.add_report_builder(DetailedScenarioFailedReportBuilder(fn))
74
+
75
+ fn = self.get_path("report_summary.txt")
76
+ self.add_report_builder(SummaryReportBuilder(fn))
77
+
78
+ @property
79
+ def __feature_reports(self):
80
+ return self.children_reports("feature")
81
+
82
+ @property
83
+ def current_feature_report(self):
84
+ # if self.__feature_reports:
85
+ # return self.__feature_reports[-1][1]
86
+ # else:
87
+ # return None
88
+ if SessionContext.instance().has_feature_context():
89
+ feature_context = SessionContext.instance().get_feature_context()
90
+ if feature_context.has_object("feature_report"):
91
+ return feature_context.get_object("feature_report")
92
+ return None
93
+
94
+ @property
95
+ def current_scenario_report(self):
96
+ cfr = self.current_feature_report
97
+ if cfr:
98
+ return cfr.current_scenario_report
99
+ else:
100
+ return None
101
+
102
+ def new_session(self, report_path):
103
+ self.report_path = report_path
104
+ if self.has_report_path:
105
+ SessionContext.instance().path_manager.makedirs(self.report_path, is_directory=True)
106
+
107
+ self.initialize_reports()
108
+
109
+ def before_all(self):
110
+ super().before_all()
111
+
112
+ def before_feature(self, feature_context, feature):
113
+ # Create new feature report
114
+ fr = ReportManager.TFeatureReport(self, feature_context, feature)
115
+ self.add_child_report(fr, "feature", feature.name, feature.filename)
116
+ fr.initialize_reports()
117
+
118
+ # Process self reports
119
+ super().before_feature(feature_context, feature, feature_report=fr)
120
+
121
+ # Store feature report in current feature context
122
+ self.__multitask_manager.get_feature_context().set_object("feature_report", fr)
123
+
124
+ def before_scenario(self, scenario_context, scenario):
125
+ # Create new scenario report in feature report
126
+ sr = self.current_feature_report.new_scenario_report(scenario_context, scenario)
127
+
128
+ # Process feature report
129
+ self.current_feature_report.before_scenario(scenario_context, scenario, scenario_report=sr)
130
+
131
+ # Process self reports
132
+ super().before_scenario(scenario_context, scenario, scenario_report=sr)
133
+
134
+ # Change active log file to scenario one
135
+ self.__enter_current_scenario_log_file()
136
+
137
+ def before_step(self, step_context, step, step_level):
138
+ super().before_step(step_context, step, step_level)
139
+
140
+ # Note: A step can be executed without scenario report (ex: post processes after scenario)
141
+ if self.current_scenario_report:
142
+ self.current_scenario_report.before_step(step_context, step, step_level)
143
+
144
+ def after_step(self, step_context, step, step_level):
145
+ super().after_step(step_context, step, step_level)
146
+
147
+ # Note: A step can be executed without scenario report (ex: post processes after scenario)
148
+ if self.current_scenario_report:
149
+ self.current_scenario_report.after_step(step_context, step, step_level)
150
+
151
+ def after_scenario(self, scenario):
152
+ self.current_feature_report.after_scenario(scenario, self.current_scenario_report)
153
+ super().after_scenario(scenario, self.current_scenario_report)
154
+
155
+ # Change active log file to root one
156
+ self.__leave_current_scenario_log_file()
157
+
158
+ self.current_scenario_report.release_resources()
159
+
160
+ def after_feature(self, feature):
161
+ super().after_feature(feature, self.current_feature_report)
162
+
163
+ self.current_feature_report.release_resources()
164
+
165
+ def after_all(self):
166
+ super().after_all(build_reports=True)
167
+
168
+ # Create files using execution historic as input
169
+ # fn_eh = self.get_path("execution_historic.json")
170
+ # sdm = ScenarioDurationManager()
171
+ # sdm.import_execution_historic(fn_eh)
172
+ #
173
+ # fn = self.get_path("scenario_durations.csv")
174
+ # scenario_duration_limits = sdm.compute_scenario_duration_limits()
175
+ # sdm.create_file_scenario_duration_limits(fn, scenario_duration_limits)
176
+ #
177
+ # fn = self.get_path("scenario_duration_tags.csv")
178
+ # duration_limit_tags = [(1, "fast"), (5, "rapid"), (60, "slow")]
179
+ # scenario_duration_tags = sdm.compute_scenario_duration_tags(duration_limit_tags, "long", missing_tag=True, new_tag=True, unchanged_tag=True, with_failed=True)
180
+ # sdm.create_file_scenario_duration_tags(fn, scenario_duration_tags)
181
+
182
+ def __enter_current_scenario_log_file(self):
183
+ if SessionContext.instance().log_manager.in_file and self.has_report_path:
184
+ log_filename = self.current_scenario_report.get_path("logs", "report.log")
185
+ SessionContext.instance().path_manager.makedirs(log_filename)
186
+ # Note: do_remove_other_file_handlers is set to True, in case leaving previous scenario log file has failed.
187
+ # Normally this case shouldn't appear but it was already observed. And when it appeared, execution slowdowned drastically.
188
+ SessionContext.instance().log_manager.enter_log_file(log_filename, do_remove_other_file_handlers=True)
189
+
190
+ def __leave_current_scenario_log_file(self):
191
+ if SessionContext.instance().log_manager.in_file and self.has_report_path:
192
+ log_filename = self.current_scenario_report.get_path("logs", "report.log")
193
+ SessionContext.instance().log_manager.leave_log_file(log_filename, do_remove_log_file=True)
194
+
195
+ @classmethod
196
+ def get_current_scenario_status_information(cls, scenario):
197
+ step_failed, step_nb = cls.get_step_failed_info(scenario)
198
+
199
+ if step_failed is not None and hasattr(SessionContext.instance().get_scenario_context(), "is_in_preconditions") and SessionContext.instance().get_scenario_context().is_in_preconditions:
200
+ status = "Failed in Preconditions"
201
+ elif step_failed is not None and step_failed.keyword == "Given":
202
+ status = "Failed in Given"
203
+ elif step_failed is not None or scenario.status.has_failed():
204
+ status = "Failed"
205
+ else:
206
+ status = scenario.status.name.capitalize()
207
+
208
+ return [status, step_failed, step_nb]
209
+
210
+ @classmethod
211
+ def get_step_failed_info(cls, scenario):
212
+ res_step, res_step_number = None, None
213
+ for ind, step in enumerate(scenario.steps):
214
+ if step.status.has_failed():
215
+ res_step, res_step_number = step, ind+1
216
+ break
217
+ return res_step, res_step_number
218
+
219
+ @classmethod
220
+ def get_step_description(cls, step):
221
+ res = "{} {}".format(step.keyword, step.name)
222
+ text = cls.TStepTools.get_step_multiline_text(step, eval_params=EvaluateParameters.nothing(), raise_exception_if_none=False, log_level=logging.TRACE) # @UndefinedVariable
223
+ if text is not None:
224
+ res += "\n\"\"\"\n{}\n\"\"\"".format(text)
225
+ if step.table:
226
+ res += "\n{}".format(cls.TStepTools.represent_step_table(step.table, 4))
227
+ return res
228
+
229
+ @classmethod
230
+ def get_step_error_message(cls, step):
231
+ if step:
232
+ if step.exception:
233
+ return str(step.exception)
234
+ elif step.error_message:
235
+ return step.error_message
236
+ elif step.status.is_undefined():
237
+ return "Undefined step"
238
+ elif step.status.is_pending():
239
+ return "Step exists but is not implemented"
240
+ elif step.status.has_failed():
241
+ return "Unknown error (unexpected error case)"
242
+ return None
243
+
244
+ @classmethod
245
+ def get_step_error(cls, step):
246
+ if step:
247
+ if step.exception:
248
+ formatted_exception = Tools.represent_exception(step.exception)
249
+ return "exception:\n{}".format(Tools.indent_string(4, formatted_exception))
250
+ elif step.error_message:
251
+ return "error_message:\n{}".format(Tools.indent_string(4, step.error_message))
252
+ else:
253
+ return cls.get_step_error_message(step)
254
+ return None
255
+
256
+