holado 0.2.2__py3-none-any.whl → 0.2.4__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 (524) hide show
  1. holado/__init__.py +11 -1
  2. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/METADATA +13 -9
  3. holado-0.2.4.dist-info/RECORD +535 -0
  4. holado_ais/__init__.py +33 -0
  5. holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
  6. holado_ais/ais/ais_manager.py +151 -0
  7. holado_ais/ais/ais_messages.py +204 -0
  8. holado_ais/ais/ais_payload.py +35 -0
  9. holado_ais/ais/enums.py +37 -0
  10. holado_ais/ais/patch_pyais.py +1303 -0
  11. holado_ais/tests/behave/steps/__init__.py +17 -0
  12. holado_ais/tests/behave/steps/ais/__init__.py +0 -0
  13. holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
  14. holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
  15. holado_binary/__init__.py +17 -0
  16. holado_binary/ipc/binary.py +125 -0
  17. holado_binary/ipc/bit_series.py +307 -0
  18. holado_binary/tests/behave/steps/__init__.py +17 -0
  19. holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
  20. holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
  21. holado_context/__init__.py +16 -0
  22. holado_context/tests/behave/steps/__init__.py +16 -0
  23. holado_context/tests/behave/steps/private/__init__.py +16 -0
  24. holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
  25. holado_core/__init__.py +32 -0
  26. holado_core/common/__init__.py +0 -0
  27. holado_core/common/actors/actions.py +97 -0
  28. holado_core/common/actors/actor.py +226 -0
  29. holado_core/common/actors/element_actor.py +32 -0
  30. holado_core/common/actors/find_actor.py +106 -0
  31. holado_core/common/actors/tree_actor.py +32 -0
  32. holado_core/common/actors/verify_actions.py +69 -0
  33. holado_core/common/block/base.py +122 -0
  34. holado_core/common/block/block_manager.py +173 -0
  35. holado_core/common/block/block_method.py +46 -0
  36. holado_core/common/block/block_steps.py +37 -0
  37. holado_core/common/block/function.py +42 -0
  38. holado_core/common/block/scope_function.py +28 -0
  39. holado_core/common/block/scope_manager.py +238 -0
  40. holado_core/common/block/scope_steps.py +141 -0
  41. holado_core/common/criterias/and_criteria.py +61 -0
  42. holado_core/common/criterias/criteria.py +78 -0
  43. holado_core/common/criterias/or_criteria.py +64 -0
  44. holado_core/common/criterias/tools/criteria_context.py +20 -0
  45. holado_core/common/criterias/tools/criteria_parameters.py +18 -0
  46. holado_core/common/drivers/driver.py +153 -0
  47. holado_core/common/drivers/element_driver.py +30 -0
  48. holado_core/common/drivers/element_internal_api.py +239 -0
  49. holado_core/common/drivers/internal_api.py +40 -0
  50. holado_core/common/drivers/tree_driver.py +30 -0
  51. holado_core/common/drivers/tree_internal_api.py +176 -0
  52. holado_core/common/exceptions/__init__.py +0 -0
  53. holado_core/common/exceptions/element_exception.py +28 -0
  54. holado_core/common/exceptions/exceptions.py +24 -0
  55. holado_core/common/exceptions/functional_exception.py +21 -0
  56. holado_core/common/exceptions/holado_exception.py +25 -0
  57. holado_core/common/exceptions/technical_exception.py +27 -0
  58. holado_core/common/exceptions/timeout_exception.py +20 -0
  59. holado_core/common/exceptions/verify_exception.py +20 -0
  60. holado_core/common/finders/after_in_tree_finder.py +87 -0
  61. holado_core/common/finders/element_finder.py +60 -0
  62. holado_core/common/finders/else_finder.py +105 -0
  63. holado_core/common/finders/finder.py +478 -0
  64. holado_core/common/finders/or_finder.py +98 -0
  65. holado_core/common/finders/then_finder.py +157 -0
  66. holado_core/common/finders/tools/enums.py +30 -0
  67. holado_core/common/finders/tools/find_builder.py +118 -0
  68. holado_core/common/finders/tools/find_context.py +405 -0
  69. holado_core/common/finders/tools/find_info.py +27 -0
  70. holado_core/common/finders/tools/find_parameters.py +240 -0
  71. holado_core/common/finders/tools/find_updater.py +95 -0
  72. holado_core/common/finders/tools/finder_info.py +26 -0
  73. holado_core/common/finders/tree_finder.py +146 -0
  74. holado_core/common/handlers/__init__.py +0 -0
  75. holado_core/common/handlers/abstracts/base_redo.py +695 -0
  76. holado_core/common/handlers/abstracts/get_or_create.py +120 -0
  77. holado_core/common/handlers/element_holder.py +122 -0
  78. holado_core/common/handlers/enums.py +23 -0
  79. holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
  80. holado_core/common/handlers/features/resource_by_name.py +187 -0
  81. holado_core/common/handlers/features/resource_by_type.py +174 -0
  82. holado_core/common/handlers/redo.py +119 -0
  83. holado_core/common/handlers/wait.py +127 -0
  84. holado_core/common/inspectors/element_inspector.py +57 -0
  85. holado_core/common/inspectors/inspector.py +221 -0
  86. holado_core/common/inspectors/tools/inspect_builder.py +169 -0
  87. holado_core/common/inspectors/tools/inspect_context.py +69 -0
  88. holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
  89. holado_core/common/inspectors/tree_inspector.py +73 -0
  90. holado_core/common/resource/persisted_data_manager.py +113 -0
  91. holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
  92. holado_core/common/resource/resource_manager.py +143 -0
  93. holado_core/common/tables/__init__.py +1 -0
  94. holado_core/common/tables/comparators/__init__.py +0 -0
  95. holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
  96. holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
  97. holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
  98. holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
  99. holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
  100. holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
  101. holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
  102. holado_core/common/tables/comparators/string_table_comparator.py +29 -0
  103. holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
  104. holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
  105. holado_core/common/tables/comparators/table_comparator.py +209 -0
  106. holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
  107. holado_core/common/tables/comparators/table_row_comparator.py +116 -0
  108. holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
  109. holado_core/common/tables/converters/__init__.py +0 -0
  110. holado_core/common/tables/converters/table_converter.py +194 -0
  111. holado_core/common/tables/enums.py +23 -0
  112. holado_core/common/tables/table.py +261 -0
  113. holado_core/common/tables/table_cell.py +126 -0
  114. holado_core/common/tables/table_manager.py +366 -0
  115. holado_core/common/tables/table_row.py +169 -0
  116. holado_core/common/tables/table_with_header.py +236 -0
  117. holado_core/common/tools/__init__.py +0 -0
  118. holado_core/common/tools/comparators/comparator.py +151 -0
  119. holado_core/common/tools/comparators/object_comparator.py +21 -0
  120. holado_core/common/tools/converters/converter.py +107 -0
  121. holado_core/common/tools/path_manager.py +185 -0
  122. holado_core/common/tools/string_tools.py +135 -0
  123. holado_core/common/tools/tools.py +172 -0
  124. holado_core/common/transport/__init__.py +0 -0
  125. holado_core/common/transport/crc.py +40 -0
  126. holado_core/tests/behave/steps/__init__.py +20 -0
  127. holado_core/tests/behave/steps/common/__init__.py +0 -0
  128. holado_core/tests/behave/steps/common/common_steps.py +136 -0
  129. holado_core/tests/behave/steps/common/config_steps.py +42 -0
  130. holado_core/tests/behave/steps/common/resource_steps.py +62 -0
  131. holado_core/tests/behave/steps/common/tables_steps.py +537 -0
  132. holado_core/tools/__init__.py +0 -0
  133. holado_core/tools/abstracts/__init__.py +0 -0
  134. holado_core/tools/abstracts/blocking_command_service.py +56 -0
  135. holado_core/tools/abstracts/service.py +48 -0
  136. holado_data/__init__.py +31 -0
  137. holado_data/data/generator/base.py +93 -0
  138. holado_data/data/generator/python_generator.py +30 -0
  139. holado_data/tests/behave/steps/__init__.py +17 -0
  140. holado_data/tests/behave/steps/data/generator_steps.py +91 -0
  141. holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
  142. holado_db/__init__.py +32 -0
  143. holado_db/tests/behave/steps/__init__.py +18 -0
  144. holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
  145. holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
  146. holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
  147. holado_db/tools/db/clients/base/db_client.py +206 -0
  148. holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
  149. holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
  150. holado_db/tools/db/db_manager.py +109 -0
  151. holado_db/tools/db/query/base/query_builder.py +87 -0
  152. holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
  153. holado_db/tools/db/query/query_manager.py +77 -0
  154. holado_docker/__init__.py +25 -0
  155. holado_docker/sdk/docker/docker_client.py +268 -0
  156. holado_docker/sdk/docker/docker_service.py +71 -0
  157. holado_docker/tests/behave/steps/__init__.py +16 -0
  158. holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
  159. holado_docker/tools/docker_controler/__init__.py +26 -0
  160. holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
  161. holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
  162. holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
  163. holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
  164. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
  165. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
  166. holado_grpc/__init__.py +32 -0
  167. holado_grpc/api/rpc/TODO.txt +4 -0
  168. holado_grpc/api/rpc/grpc_client.py +181 -0
  169. holado_grpc/api/rpc/grpc_manager.py +81 -0
  170. holado_grpc/ipc/rpc/__init__.py +0 -0
  171. holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
  172. holado_grpc/ipc/rpc/grpc_services.py +165 -0
  173. holado_grpc/tests/behave/steps/__init__.py +16 -0
  174. holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
  175. holado_grpc/tests/behave/steps/private/__init__.py +16 -0
  176. holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
  177. holado_helper/__init__.py +35 -0
  178. holado_helper/debug/README.txt +32 -0
  179. holado_helper/debug/memory/memory_profiler.py +106 -0
  180. holado_helper/docker/init_user.sh +24 -0
  181. holado_helper/docker/logging.conf +42 -0
  182. holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
  183. holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
  184. holado_helper/docker/run_terminal_in_docker.sh +101 -0
  185. holado_helper/holado_module_template/__init__.py +31 -0
  186. holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
  187. holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
  188. holado_helper/script/action.py +109 -0
  189. holado_helper/script/action_script.py +477 -0
  190. holado_helper/script/any_action_script.py +126 -0
  191. holado_helper/script/behave_action_script.py +99 -0
  192. holado_helper/script/csv_action_script.py +142 -0
  193. holado_helper/script/initialize_script.py +115 -0
  194. holado_helper/script/input_output_script.py +136 -0
  195. holado_helper/script/job.py +75 -0
  196. holado_helper/script/json_action_script.py +104 -0
  197. holado_helper/script/script.py +110 -0
  198. holado_json/__init__.py +16 -0
  199. holado_json/ipc/json.py +125 -0
  200. holado_json/ipc/json_converter.py +69 -0
  201. holado_json/ipc/json_types.py +183 -0
  202. holado_json/tests/behave/steps/__init__.py +16 -0
  203. holado_json/tests/behave/steps/ipc/__init__.py +0 -0
  204. holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
  205. holado_keycloak/__init__.py +16 -0
  206. holado_keycloak/tests/behave/steps/__init__.py +16 -0
  207. holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
  208. holado_keycloak/tools/keycloak/__init__.py +0 -0
  209. holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
  210. holado_logging/__init__.py +37 -0
  211. holado_logging/common/logging/holado_logger.py +75 -0
  212. holado_logging/common/logging/log_config.py +128 -0
  213. holado_logging/common/logging/log_manager.py +292 -0
  214. holado_multitask/__init__.py +33 -0
  215. holado_multitask/multiprocessing/context/process_context.py +35 -0
  216. holado_multitask/multiprocessing/function_process.py +102 -0
  217. holado_multitask/multiprocessing/periodic_function_process.py +135 -0
  218. holado_multitask/multiprocessing/process.py +196 -0
  219. holado_multitask/multiprocessing/processesmanager.py +133 -0
  220. holado_multitask/multitasking/multitask_manager.py +439 -0
  221. holado_multitask/multithreading/__init__.py +0 -0
  222. holado_multitask/multithreading/context/thread_context.py +84 -0
  223. holado_multitask/multithreading/functionthreaded.py +129 -0
  224. holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
  225. holado_multitask/multithreading/loopthread.py +100 -0
  226. holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
  227. holado_multitask/multithreading/reflection/inspect.py +47 -0
  228. holado_multitask/multithreading/reflection/sys.py +29 -0
  229. holado_multitask/multithreading/reflection/traceback.py +35 -0
  230. holado_multitask/multithreading/thread.py +177 -0
  231. holado_multitask/multithreading/threadsmanager.py +162 -0
  232. holado_multitask/multithreading/timer.py +48 -0
  233. holado_multitask/tests/behave/steps/__init__.py +17 -0
  234. holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
  235. holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
  236. holado_protobuf/__init__.py +61 -0
  237. holado_protobuf/ipc/protobuf/__init__.py +0 -0
  238. holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
  239. holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
  240. holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
  241. holado_protobuf/ipc/protobuf/protobuf_messages.py +968 -0
  242. holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
  243. holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
  244. holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
  245. holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
  246. holado_protobuf/tests/behave/steps/__init__.py +16 -0
  247. holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
  248. holado_python/__init__.py +35 -0
  249. holado_python/common/enums.py +34 -0
  250. holado_python/common/iterables.py +30 -0
  251. holado_python/common/tools/comparators/boolean_comparator.py +37 -0
  252. holado_python/common/tools/comparators/bytes_comparator.py +48 -0
  253. holado_python/common/tools/comparators/datetime_comparator.py +74 -0
  254. holado_python/common/tools/comparators/float_comparator.py +97 -0
  255. holado_python/common/tools/comparators/integer_comparator.py +37 -0
  256. holado_python/common/tools/comparators/string_comparator.py +99 -0
  257. holado_python/common/tools/comparators/type_comparator.py +31 -0
  258. holado_python/common/tools/datetime.py +279 -0
  259. holado_python/standard_library/csv.py +207 -0
  260. holado_python/standard_library/hashlib.py +82 -0
  261. holado_python/standard_library/multiprocessing.py +62 -0
  262. holado_python/standard_library/queue.py +79 -0
  263. holado_python/standard_library/socket/blocking_socket.py +136 -0
  264. holado_python/standard_library/socket/echo_server.py +28 -0
  265. holado_python/standard_library/socket/message_socket.py +91 -0
  266. holado_python/standard_library/socket/non_blocking_socket.py +151 -0
  267. holado_python/standard_library/socket/socket.py +148 -0
  268. holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
  269. holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
  270. holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
  271. holado_python/standard_library/ssl/ssl.py +81 -0
  272. holado_python/standard_library/typing.py +192 -0
  273. holado_python/tests/behave/steps/__init__.py +27 -0
  274. holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
  275. holado_python/tests/behave/steps/convert_steps.py +59 -0
  276. holado_python/tests/behave/steps/iterable_steps.py +87 -0
  277. holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
  278. holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
  279. holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
  280. holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
  281. holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
  282. holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
  283. holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
  284. holado_rabbitmq/__init__.py +28 -0
  285. holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
  286. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
  287. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
  288. holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
  289. holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +674 -0
  290. holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
  291. holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
  292. holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
  293. holado_redis/__init__.py +17 -0
  294. holado_redis/tests/behave/steps/__init__.py +16 -0
  295. holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
  296. holado_redis/tools/redis/TODO.txt +7 -0
  297. holado_redis/tools/redis/redis_client.py +190 -0
  298. holado_redis/tools/redis/redis_manager.py +38 -0
  299. holado_report/__init__.py +27 -0
  300. holado_report/report/analyze/execution_historic_manager.py +96 -0
  301. holado_report/report/analyze/scenario_duration_manager.py +245 -0
  302. holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
  303. holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
  304. holado_report/report/builders/report_builder.py +64 -0
  305. holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
  306. holado_report/report/builders/summary_report_builder.py +89 -0
  307. holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
  308. holado_report/report/builders/summary_scenario_report_builder.py +74 -0
  309. holado_report/report/execution_historic.py +141 -0
  310. holado_report/report/report_manager.py +256 -0
  311. holado_report/report/reports/base_report.py +163 -0
  312. holado_report/report/reports/feature_report.py +106 -0
  313. holado_report/report/reports/scenario_report.py +64 -0
  314. holado_rest/__init__.py +24 -0
  315. holado_rest/api/rest/TODO.txt +2 -0
  316. holado_rest/api/rest/rest_client.py +113 -0
  317. holado_rest/api/rest/rest_manager.py +62 -0
  318. holado_rest/tests/behave/steps/__init__.py +16 -0
  319. holado_rest/tests/behave/steps/api/__init__.py +0 -0
  320. holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
  321. holado_rest/tests/behave/steps/private/__init__.py +16 -0
  322. holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
  323. holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
  324. holado_s3/__init__.py +17 -0
  325. holado_s3/tests/behave/steps/__init__.py +17 -0
  326. holado_s3/tests/behave/steps/private/__init__.py +16 -0
  327. holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
  328. holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
  329. holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
  330. holado_s3/tools/s3/__init__.py +0 -0
  331. holado_s3/tools/s3/boto3_s3_client.py +59 -0
  332. holado_s3/tools/s3/minio_client.py +75 -0
  333. holado_s3/tools/s3/moto_server.py +52 -0
  334. holado_scripting/__init__.py +53 -0
  335. holado_scripting/common/tools/dynamic_text_manager.py +73 -0
  336. holado_scripting/common/tools/evaluate_parameters.py +210 -0
  337. holado_scripting/common/tools/expression_evaluator.py +387 -0
  338. holado_scripting/common/tools/variable_manager.py +321 -0
  339. holado_scripting/tests/behave/steps/__init__.py +22 -0
  340. holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
  341. holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
  342. holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
  343. holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
  344. holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
  345. holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
  346. holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
  347. holado_scripting/text/base/base_function.py +25 -0
  348. holado_scripting/text/base/base_verify_function.py +25 -0
  349. holado_scripting/text/base/text_inspecter.py +204 -0
  350. holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
  351. holado_scripting/text/interpreter/functions/function_cast.py +60 -0
  352. holado_scripting/text/interpreter/functions/function_convert.py +57 -0
  353. holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
  354. holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
  355. holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
  356. holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
  357. holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
  358. holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
  359. holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
  360. holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
  361. holado_scripting/text/interpreter/text_interpreter.py +216 -0
  362. holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
  363. holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
  364. holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
  365. holado_scripting/text/verifier/text_verifier.py +103 -0
  366. holado_sftp/__init__.py +16 -0
  367. holado_sftp/tests/behave/steps/__init__.py +17 -0
  368. holado_sftp/tests/behave/steps/private/__init__.py +16 -0
  369. holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
  370. holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
  371. holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
  372. holado_sftp/tools/sftp/__init__.py +0 -0
  373. holado_sftp/tools/sftp/sftp_client.py +103 -0
  374. holado_sftp/tools/sftp/sftp_server.py +39 -0
  375. holado_swagger/__init__.py +31 -0
  376. holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
  377. holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
  378. holado_swagger/tests/behave/steps/__init__.py +16 -0
  379. holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
  380. holado_system/system/command/command.py +216 -0
  381. holado_system/system/command/command_result.py +128 -0
  382. holado_system/system/command/curl_command.py +101 -0
  383. holado_system/system/command/exceptions.py +59 -0
  384. holado_system/system/filesystem/file.py +76 -0
  385. holado_system/system/global_system.py +187 -0
  386. holado_system/tests/behave/steps/__init__.py +18 -0
  387. holado_system/tests/behave/steps/system/commands_steps.py +92 -0
  388. holado_system/tests/behave/steps/system/file_steps.py +215 -0
  389. holado_system/tests/behave/steps/system/system_steps.py +84 -0
  390. holado_test/__init__.py +27 -0
  391. holado_test/behave/__init__.py +0 -0
  392. holado_test/behave/behave.py +397 -0
  393. holado_test/behave/behave_environment.py +143 -0
  394. holado_test/behave/behave_function.py +33 -0
  395. holado_test/behave/behave_manager.py +555 -0
  396. holado_test/behave/independant_runner.py +68 -0
  397. holado_test/behave/scenario/__init__.py +0 -0
  398. holado_test/behave/scenario/behave_step_tools.py +157 -0
  399. holado_test/common/context/feature_context.py +79 -0
  400. holado_test/common/context/scenario_context.py +217 -0
  401. holado_test/common/context/step_context.py +66 -0
  402. holado_test/common/exceptions/undefined_step_exception.py +21 -0
  403. holado_test/scenario/step_tools.py +523 -0
  404. holado_test/scenario/tester_tools.py +52 -0
  405. holado_test/test_config.py +26 -0
  406. holado_test/tests/behave/steps/__init__.py +18 -0
  407. holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
  408. holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
  409. holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
  410. holado_value/__init__.py +24 -0
  411. holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
  412. holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
  413. holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
  414. holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
  415. holado_value/common/tables/converters/value_table_converter.py +217 -0
  416. holado_value/common/tables/value_table.py +29 -0
  417. holado_value/common/tables/value_table_cell.py +67 -0
  418. holado_value/common/tables/value_table_manager.py +58 -0
  419. holado_value/common/tables/value_table_row.py +44 -0
  420. holado_value/common/tables/value_table_with_header.py +28 -0
  421. holado_value/common/tools/unique_value_manager.py +108 -0
  422. holado_value/common/tools/value.py +164 -0
  423. holado_value/common/tools/value_types.py +35 -0
  424. holado_value/tests/behave/steps/__init__.py +16 -0
  425. holado_value/tests/behave/steps/private/__init__.py +16 -0
  426. holado_ws/__init__.py +16 -0
  427. holado_ws/api/ws/TODO.txt +2 -0
  428. holado_ws/tests/behave/steps/__init__.py +16 -0
  429. holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
  430. holado_yaml/__init__.py +31 -0
  431. holado_yaml/tests/behave/steps/__init__.py +16 -0
  432. holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
  433. holado_yaml/yaml/yaml_manager.py +86 -0
  434. test_holado/Dockerfile_test_holado +82 -0
  435. test_holado/__init__.py +4 -0
  436. test_holado/__main__.py +25 -0
  437. test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
  438. test_holado/environment.py +42 -0
  439. test_holado/features/NonReg/api/REST.feature +21 -0
  440. test_holado/features/NonReg/api/gRPC.feature +122 -0
  441. test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
  442. test_holado/features/NonReg/common/system/commands.feature +43 -0
  443. test_holado/features/NonReg/common/system/system.feature +20 -0
  444. test_holado/features/NonReg/common/tables/table.feature +239 -0
  445. test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
  446. test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
  447. test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
  448. test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
  449. test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
  450. test_holado/features/NonReg/holado_python/convert.feature +20 -0
  451. test_holado/features/NonReg/holado_python/iterable.feature +61 -0
  452. test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
  453. test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
  454. test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
  455. test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
  456. test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
  457. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
  458. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
  459. test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
  460. test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
  461. test_holado/features/NonReg/ipc/bit_series.feature +131 -0
  462. test_holado/features/NonReg/ipc/json.feature +20 -0
  463. test_holado/features/NonReg/scenario/scenario.feature +139 -0
  464. test_holado/features/NonReg/test_steps/behave.feature +275 -0
  465. test_holado/features/NonReg/test_steps/common.feature +100 -0
  466. test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
  467. test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
  468. test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
  469. test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
  470. test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
  471. test_holado/features/NonReg/tools/sFTP.feature +25 -0
  472. test_holado/features/Test/logger.feature +28 -0
  473. test_holado/features/__init__.py +0 -0
  474. test_holado/logging.conf +41 -0
  475. test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
  476. test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
  477. test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
  478. test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
  479. test_holado/resources/scripts/list_tags.sh +2 -0
  480. test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
  481. test_holado/steps/__init__.py +0 -0
  482. test_holado/steps/private_steps.py +20 -0
  483. test_holado/steps/public_steps.py +23 -0
  484. test_holado/test_holado_session_context.py +43 -0
  485. test_holado/tools/django/README.txt +3 -0
  486. test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
  487. test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
  488. test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
  489. test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
  490. test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
  491. test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
  492. test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
  493. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
  494. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
  495. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
  496. test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
  497. test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
  498. test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
  499. test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
  500. test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
  501. test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
  502. test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
  503. test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
  504. test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
  505. test_holado/tools/django/api_grpc/manage.py +27 -0
  506. test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
  507. test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
  508. test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
  509. test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
  510. test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
  511. test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
  512. test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
  513. test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
  514. test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
  515. test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
  516. test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
  517. test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
  518. test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
  519. test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
  520. test_holado/tools/django/api_rest/db.sqlite3 +0 -0
  521. test_holado/tools/django/api_rest/manage.py +22 -0
  522. holado-0.2.2.dist-info/RECORD +0 -17
  523. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/WHEEL +0 -0
  524. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/licenses/LICENSE +0 -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,146 @@
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
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+
22
+ class DetailedScenarioFailedReportBuilder(ReportBuilder):
23
+ def __init__(self, filepath):
24
+ self.__filepath = filepath.strip()
25
+ self.__file_fail = None
26
+ self.__is_format_xml = self.__filepath.lower().endswith(".xml")
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_fail_add_scenario(scenario, scenario_report, status_validation, step_failed, step_number)
40
+
41
+ def after_all(self):
42
+ # Manage file fail
43
+ if self.__file_fail is not None:
44
+ self.__file_fail.close()
45
+ self.__file_fail = None
46
+
47
+ def __file_fail_add_scenario(self, scenario, scenario_report, status_validation, step_failed, step_number):
48
+ if self.__is_format_xml:
49
+ self.__file_fail_add_scenario_xml(scenario, scenario_report, status_validation, step_failed, step_number)
50
+ else:
51
+ self.__file_fail_add_scenario_txt(scenario, scenario_report, status_validation, step_failed, step_number)
52
+
53
+ def __file_fail_add_scenario_xml(self, scenario, scenario_report, status_validation, step_failed, step_number):
54
+ from holado_report.report.report_manager import ReportManager
55
+
56
+ self.__open_file_if_needed()
57
+
58
+ msg_list = [f"<scenario>"]
59
+ msg_list.append(f" <file>{scenario.filename} - l.{scenario.line}</file>")
60
+ msg_list.append(f" <feature>{scenario.feature.name}</feature>")
61
+ msg_list.append(f" <scenario>{scenario.name}</scenario>")
62
+ msg_list.append(f" <report>{scenario_report.report_path}</report>")
63
+ msg_list.append(f" <tags>-t " + " -t ".join(scenario.feature.tags + scenario.tags) + "</tags>")
64
+ msg_list.append(f" <validation_status>{status_validation}</validation_status>")
65
+ if step_failed is not None:
66
+ msg_list.append(f" <failure>")
67
+ msg_list.append(f" <step_number>{step_number}</step_number>")
68
+ msg_list.append(f" <step_line>{step_failed.line}</step_line>")
69
+ step_descr = ReportManager.get_step_description(step_failed)
70
+ if "\n" in step_descr:
71
+ msg_list.append(f" <step>")
72
+ msg_list.append(Tools.indent_string(12, step_descr))
73
+ msg_list.append(f" </step>")
74
+ else:
75
+ msg_list.append(f" <step>{step_descr}</step>")
76
+
77
+ step_error_message = ReportManager.get_step_error_message(step_failed)
78
+ if step_error_message:
79
+ if "\n" in step_error_message:
80
+ msg_list.append(f" <error_message>")
81
+ msg_list.append(Tools.indent_string(12, step_error_message))
82
+ msg_list.append(f" </error_message>")
83
+ else:
84
+ msg_list.append(f" <error_message>{step_error_message}</error_message>")
85
+
86
+ step_error = ReportManager.get_step_error(step_failed)
87
+ if step_error and step_error != step_error_message:
88
+ if "\n" in step_error:
89
+ msg_list.append(f" <error>")
90
+ msg_list.append(Tools.indent_string(12, step_error))
91
+ msg_list.append(f" </error>")
92
+ else:
93
+ msg_list.append(f" <error>{step_error}</error>")
94
+
95
+ msg_list.append(f" </failure>")
96
+ else:
97
+ msg_list.append(f" <failure>No step failed, it has probably failed on a missing step implementation</failure>")
98
+ msg_list.append(f"</scenario>")
99
+ msg_list.append(f"")
100
+
101
+ msg = "\n".join(msg_list)
102
+ self.__file_fail.write(msg)
103
+ self.__file_fail.flush()
104
+
105
+ def __file_fail_add_scenario_txt(self, scenario, scenario_report, status_validation, step_failed, step_number):
106
+ from holado_report.report.report_manager import ReportManager
107
+
108
+ self.__open_file_if_needed()
109
+
110
+ msg_list = [f"{scenario.filename} - l.{scenario.line}"]
111
+ msg_list.append(f" Feature: {scenario.feature.name}")
112
+ msg_list.append(f" Scenario: {scenario.name}")
113
+ msg_list.append(f" Report: {scenario_report.report_path}")
114
+ msg_list.append(f" Tags: -t " + " -t ".join(scenario.feature.tags + scenario.tags))
115
+ msg_list.append(f" Validation status: {status_validation}")
116
+ if step_failed is not None:
117
+ msg_list.append(f" Failure:")
118
+ msg_list.append(f" Step number-line: {step_number} - l.{step_failed.line}")
119
+ step_descr = ReportManager.get_step_description(step_failed)
120
+ if "\n" in step_descr:
121
+ msg_list.append(f" Step:")
122
+ msg_list.append(Tools.indent_string(12, step_descr))
123
+ else:
124
+ msg_list.append(f" Step: {step_descr}")
125
+
126
+ step_error = ReportManager.get_step_error(step_failed)
127
+ if step_error:
128
+ if "\n" in step_error:
129
+ msg_list.append(f" Error:")
130
+ msg_list.append(Tools.indent_string(12, step_error))
131
+ else:
132
+ msg_list.append(f" Error: {step_error}")
133
+ else:
134
+ msg_list.append(f" Failure: No step failed, it has probably failed on a missing step implementation")
135
+ msg_list.append(f"")
136
+ msg_list.append(f"")
137
+
138
+ msg = "\n".join(msg_list)
139
+ self.__file_fail.write(msg)
140
+ self.__file_fail.flush()
141
+
142
+ def __open_file_if_needed(self):
143
+ if self.__file_fail is None:
144
+ self.__file_fail = open(self.__filepath, "wt")
145
+
146
+
@@ -0,0 +1,123 @@
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
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+
23
+ class JsonExecutionHistoricReportBuilder(ReportBuilder):
24
+ def __init__(self, execution_historic, filepath):
25
+ self.__execution_historic_weakref = weakref.ref(execution_historic)
26
+ self.__filepath = filepath
27
+
28
+ @property
29
+ def __execution_historic(self):
30
+ return self.__execution_historic_weakref()
31
+
32
+ def build(self):
33
+ with open(self.__filepath, "wt") as feh:
34
+ eh_json = self.__convert_execution_historic_to_json()
35
+ json_str = json.dumps(eh_json, ensure_ascii=False, indent=4)
36
+ feh.write(json_str)
37
+
38
+ def __convert_execution_historic_to_json(self):
39
+ return [self.__convert_execution_historic_feature_to_json(eh_feat) for eh_feat in self.__execution_historic]
40
+
41
+ def __convert_execution_historic_feature_to_json(self, eh_feature):
42
+ return {
43
+ 'feature': self.__convert_feature_to_json(eh_feature.feature, eh_feature.feature_context, eh_feature.feature_report),
44
+ 'scenarios': [self.__convert_execution_historic_scenario_to_json(eh_sce) for eh_sce in eh_feature.scenarios ]
45
+ }
46
+
47
+ def __convert_feature_to_json(self, feature, feature_context, feature_report):
48
+ res = {
49
+ 'name': feature.name,
50
+ 'description': feature.description,
51
+ 'tags': [str(tag) for tag in feature.tags],
52
+ 'status': feature.status.name,
53
+ 'duration': feature.duration,
54
+ 'start_date': feature_context.start_datetime.isoformat()
55
+ }
56
+ if feature_context.end_datetime:
57
+ res['end_date'] = feature_context.end_datetime.isoformat()
58
+ res.update({
59
+ 'filename': feature.filename,
60
+ 'report': feature_report.report_path
61
+ })
62
+ return res
63
+
64
+ def __convert_execution_historic_scenario_to_json(self, eh_scenario):
65
+ return {
66
+ 'scenario': self.__convert_scenario_to_json(eh_scenario.scenario, eh_scenario.scenario_context, eh_scenario.scenario_report),
67
+ '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()},
68
+ 'status_validation': eh_scenario.status_validation,
69
+ 'step_failed': self.__convert_step_to_json(eh_scenario.step_failed) if eh_scenario.step_failed is not None else None,
70
+ 'step_failed_number': eh_scenario.step_failed_number
71
+ }
72
+
73
+ def __convert_scenario_to_json(self, scenario, scenario_context, scenario_report):
74
+ res = {
75
+ 'name': scenario.name,
76
+ 'description': scenario.description,
77
+ 'tags': [str(tag) for tag in scenario.tags],
78
+ 'status': scenario.status.name,
79
+ 'duration': scenario.duration,
80
+ 'start_date': scenario_context.start_datetime.isoformat()
81
+ }
82
+ if scenario_context.end_datetime:
83
+ res['end_date'] = scenario_context.end_datetime.isoformat()
84
+ res.update({
85
+ 'filename': scenario.filename,
86
+ 'line': scenario.line,
87
+ 'report': scenario_report.report_path
88
+ })
89
+ return res
90
+
91
+ def __convert_execution_historic_step_to_json(self, eh_step):
92
+ if eh_step.step is not None:
93
+ res = self.__convert_step_to_json(eh_step.step)
94
+ else:
95
+ res = {}
96
+ if eh_step.step_context is not None:
97
+ if eh_step.step_context.status is not None:
98
+ res['status'] = eh_step.step_context.status
99
+ res['start_date'] = eh_step.step_context.start_datetime.isoformat()
100
+ if eh_step.step_context.end_datetime:
101
+ res['end_date'] = eh_step.step_context.end_datetime.isoformat()
102
+
103
+ res['description'] = eh_step.step_description
104
+ if eh_step.sub_steps:
105
+ res['sub_steps'] = [self.__convert_execution_historic_step_to_json(eh_sub_step) for eh_sub_step in eh_step.sub_steps ]
106
+ return res
107
+
108
+ def __convert_step_to_json(self, step):
109
+ from holado_report.report.report_manager import ReportManager
110
+ res = {
111
+ 'status': step.status.name,
112
+ 'duration': step.duration,
113
+ }
114
+ step_error = ReportManager.get_step_error(step)
115
+ if step_error:
116
+ res['error'] = step_error
117
+ if isinstance(step.filename, str) and step.filename != "<string>":
118
+ res['filename'] = step.filename
119
+ res['line'] = step.line
120
+ return res
121
+
122
+
123
+
@@ -0,0 +1,64 @@
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
+ import abc
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+
21
+ class ReportBuilder():
22
+ __metaclass__ = abc.ABCMeta
23
+
24
+ def __init__(self):
25
+ pass
26
+
27
+ @abc.abstractmethod
28
+ def build(self):
29
+ raise NotImplementedError()
30
+
31
+ @abc.abstractmethod
32
+ def before_all(self):
33
+ pass
34
+
35
+ @abc.abstractmethod
36
+ def before_feature(self, feature_context, feature, feature_report=None):
37
+ pass
38
+
39
+ @abc.abstractmethod
40
+ def before_scenario(self, scenario_context, scenario, scenario_report=None):
41
+ pass
42
+
43
+ @abc.abstractmethod
44
+ def before_step(self, step_context, step, step_level):
45
+ pass
46
+
47
+ @abc.abstractmethod
48
+ def after_step(self, step_context, step, step_level):
49
+ pass
50
+
51
+ @abc.abstractmethod
52
+ def after_scenario(self, scenario, scenario_report=None):
53
+ pass
54
+
55
+ @abc.abstractmethod
56
+ def after_feature(self, feature, feature_report=None):
57
+ pass
58
+
59
+ @abc.abstractmethod
60
+ def after_all(self):
61
+ pass
62
+
63
+
64
+
@@ -0,0 +1,76 @@
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_core.common.tools.tools import Tools
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+
22
+ class ShortScenarioFailedReportBuilder(ReportBuilder):
23
+ def __init__(self, filepath):
24
+ self.__filepath = filepath
25
+ self.__file_fail = None
26
+
27
+ def build(self):
28
+ '''
29
+ The file is built after each scenario
30
+ '''
31
+ pass
32
+
33
+ def after_scenario(self, scenario, scenario_report=None):
34
+ from holado_report.report.report_manager import ReportManager
35
+ status_validation, step_failed, step_number = ReportManager.get_current_scenario_status_information(scenario)
36
+
37
+ if status_validation != "Passed":
38
+ self.__file_fail_add_scenario(scenario, scenario_report, status_validation, step_failed, step_number)
39
+
40
+ def after_all(self):
41
+ # Manage file fail
42
+ if self.__file_fail is not None:
43
+ self.__file_fail.close()
44
+ self.__file_fail = None
45
+
46
+ def __file_fail_add_scenario(self, scenario, scenario_report, status_validation, step_failed, step_number):
47
+ from holado_report.report.report_manager import ReportManager
48
+
49
+ self.__open_file_if_needed()
50
+
51
+ msg_list = []
52
+ if step_failed is not None:
53
+ msg_list.append(f"scenario in {scenario.filename} at l.{scenario.line} - step {step_number} (l.{step_failed.line}) - {status_validation}")
54
+ else:
55
+ msg_list.append(f"scenario in {scenario.filename} at l.{scenario.line} - step ? (missing step implementation ?) - {status_validation}")
56
+ msg_list.append(f" Feature/Scenario: {scenario.feature.name} => {scenario.name}")
57
+ msg_list.append(f" Report: {scenario_report.report_path}")
58
+ msg_list.append(f" Tags: -t " + " -t ".join(scenario.feature.tags + scenario.tags))
59
+ step_error_message = ReportManager.get_step_error_message(step_failed)
60
+ if step_error_message:
61
+ if "\n" in step_error_message:
62
+ msg_list.append(f" Error message: ")
63
+ msg_list.append(Tools.indent_string(8, step_error_message))
64
+ else:
65
+ msg_list.append(f" Error message: {step_error_message}")
66
+ msg_list.append(f"")
67
+ msg_list.append(f"")
68
+
69
+ msg = "\n".join(msg_list)
70
+ self.__file_fail.write(msg)
71
+ self.__file_fail.flush()
72
+
73
+ def __open_file_if_needed(self):
74
+ if self.__file_fail is None:
75
+ self.__file_fail = open(self.__filepath, "wt")
76
+