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,209 @@
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
+
15
+
16
+ from builtins import range
17
+ from builtins import super
18
+ from holado_core.common.tools.comparators.comparator import Comparator
19
+ from holado_core.common.exceptions.verify_exception import VerifyException
20
+ from holado_core.common.exceptions.technical_exception import TechnicalException
21
+ from holado_core.common.exceptions.functional_exception import FunctionalException
22
+ import logging
23
+ from holado_core.common.tables.comparators.string_table_row_comparator import StringTableRowComparator
24
+ from holado_core.common.exceptions.exceptions import Exceptions
25
+ from holado_core.common.tools.tools import Tools
26
+ from holado_core.common.tables.comparators.table_row_comparator import TableRowComparator
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ class TableComparator(Comparator):
32
+ def __init__(self, row_comparator=None, cell_comparator=None):
33
+ super().__init__("table")
34
+
35
+ if row_comparator is not None:
36
+ self.__row_comparator = row_comparator
37
+ elif cell_comparator is not None:
38
+ self.__row_comparator = TableRowComparator(cell_comparator)
39
+ else:
40
+ self.__row_comparator = StringTableRowComparator()
41
+
42
+ @property
43
+ def row_comparator(self):
44
+ return self.__row_comparator
45
+
46
+ def equals(self, table_1, table_2, is_obtained_vs_expected = True, raise_exception = True):
47
+ try:
48
+ res = True
49
+
50
+ # Verify number of rows
51
+ if table_1.nb_rows != table_2.nb_rows:
52
+ if raise_exception:
53
+ raise VerifyException("Tables have not same number of rows (table {name1}: {nb1} rows ; table {name2}: {nb2} rows):\n table {name1}:\n{repr1}\n table {name2}:\n{repr2})".format(
54
+ name1=self._get_name_1(is_obtained_vs_expected), nb1=table_1.nb_rows, repr1=table_1.represent(4),
55
+ name2=self._get_name_2(is_obtained_vs_expected), nb2=table_2.nb_rows, repr2=table_2.represent(4)))
56
+ else:
57
+ return False
58
+
59
+ # Compare rows content
60
+ for i in range(table_1.nb_rows):
61
+ try:
62
+ res = self.__row_comparator.equals(table_1.get_row(i),
63
+ table_2.get_row(i),
64
+ is_obtained_vs_expected=is_obtained_vs_expected,
65
+ raise_exception=raise_exception)
66
+ except FunctionalException as exc:
67
+ msg = "Difference exists at line of index {}:\n----------------------------------\n -> {}\n----------------------------------\n table {}:\n{}\n table {}:\n{}".format(
68
+ i, Exceptions.exception_message(exc), self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
69
+ raise VerifyException(msg) from exc
70
+ except Exception as exc:
71
+ msg = "Error while comparing line of index {}:\n----------------------------------\n -> {}\n----------------------------------\n table {}:\n{}\n table {}:\n{}".format(
72
+ i, Exceptions.exception_message(exc), self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
73
+ raise TechnicalException(msg) from exc
74
+
75
+ if not res:
76
+ if raise_exception:
77
+ raise TechnicalException("This case should have already raised an exception")
78
+ else:
79
+ if Tools.do_log(logger, logging.DEBUG):
80
+ logger.debug("Difference exists at line of index {}:\n table {}:\n{}\n table {}:\n{}".format(
81
+ i, self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4)))
82
+ break
83
+
84
+ return res
85
+ except (FunctionalException, TechnicalException) as exc:
86
+ raise exc
87
+ except Exception as exc:
88
+ msg = "Error while comparing tables:\n{}\n table {}:\n{}\n table {}:\n{}".format(
89
+ Tools.indent_string(4, Exceptions.exception_message(exc)),
90
+ self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4),
91
+ self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
92
+ raise TechnicalException(msg) from exc
93
+
94
+ def contains_rows(self, table_1, table_2, check_row_order = True, is_obtained_vs_expected = True, raise_exception = True):
95
+ try:
96
+ res = True
97
+
98
+ # Compare rows content
99
+ start_index = 0
100
+ for i in range(table_2.nb_rows):
101
+ try:
102
+ res, row_index = self.contains_row(table_1, table_2.get_row(i), start_row_index = start_index,
103
+ is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception)
104
+ if check_row_order:
105
+ start_index = row_index + 1
106
+ except FunctionalException as exc:
107
+ msg = "Table {} doesn't contain row {} of index {}:\n----------------------------------\n -> {}\n----------------------------------\n table {}:\n{}\n table {}:\n{}".format(
108
+ self._get_name_1(is_obtained_vs_expected), self._get_name_2(is_obtained_vs_expected), i, Exceptions.exception_message(exc), self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
109
+ raise VerifyException(msg) from exc
110
+ except Exception as exc:
111
+ msg = "Error while checking if table {} contains row {} of index {}:\n----------------------------------\n -> {}\n----------------------------------\n table {}:\n{}\n table {}:\n{}".format(
112
+ self._get_name_1(is_obtained_vs_expected), self._get_name_2(is_obtained_vs_expected), i, Exceptions.exception_message(exc), self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
113
+ raise TechnicalException(msg) from exc
114
+
115
+ if not res:
116
+ break
117
+
118
+ return res
119
+ except (FunctionalException, TechnicalException) as exc:
120
+ raise exc
121
+ except Exception as exc:
122
+ msg = "Error while checking if table {} contains rows of table {}:\n{}\n table {}:\n{}\n table {}:\n{}".format(
123
+ self._get_name_1(is_obtained_vs_expected), self._get_name_2(is_obtained_vs_expected),
124
+ Tools.indent_string(4, Exceptions.exception_message(exc)),
125
+ self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4),
126
+ self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
127
+ raise TechnicalException(msg) from exc
128
+
129
+ def doesnt_contain_rows(self, table_1, table_2, is_obtained_vs_expected = True, raise_exception = True):
130
+ try:
131
+ res = True
132
+
133
+ # Compare rows content
134
+ for i in range(table_2.nb_rows):
135
+ try:
136
+ row_res, _ = self.contains_row(table_1, table_2.get_row(i),
137
+ is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=False)
138
+ except Exception as exc:
139
+ msg = "Error while checking if table {} contains row {} of index {}:\n----------------------------------\n -> {}\n----------------------------------\n table {}:\n{}\n table {}:\n{}".format(
140
+ self._get_name_1(is_obtained_vs_expected), self._get_name_2(is_obtained_vs_expected), i, Exceptions.exception_message(exc), self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
141
+ raise TechnicalException(msg) from exc
142
+
143
+ if row_res:
144
+ if raise_exception:
145
+ msg = "Table {} contains row {} of index {}:\n table {}:\n{}\n table {}:\n{}".format(
146
+ self._get_name_1(is_obtained_vs_expected), self._get_name_2(is_obtained_vs_expected), i, self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
147
+ raise VerifyException(msg)
148
+ else:
149
+ res = False
150
+ break
151
+
152
+ return res
153
+ except (FunctionalException, TechnicalException) as exc:
154
+ raise exc
155
+ except Exception as exc:
156
+ msg = "Error while checking if table {} contains rows of table {}:\n{}\n table {}:\n{}\n table {}:\n{}".format(
157
+ self._get_name_1(is_obtained_vs_expected), self._get_name_2(is_obtained_vs_expected),
158
+ Tools.indent_string(4, Exceptions.exception_message(exc)),
159
+ self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4),
160
+ self._get_name_2(is_obtained_vs_expected), self._represent_table(table_2, 4))
161
+ raise TechnicalException(msg) from exc
162
+
163
+ def contains_row(self, table_1, row_2, start_row_index = 0, is_obtained_vs_expected = True, raise_exception = True):
164
+ try:
165
+ res = True
166
+ res_index = -1
167
+
168
+ # Compare rows content
169
+ for i in range(start_row_index, table_1.nb_rows):
170
+ try:
171
+ res = self.__row_comparator.equals(table_1.get_row(i),
172
+ row_2,
173
+ is_obtained_vs_expected=is_obtained_vs_expected,
174
+ raise_exception=False)
175
+ except Exception as exc:
176
+ msg = "Error while comparing line of index {}:\n----------------------------------\n -> {}\n----------------------------------\n table {}:\n{}\n table {}:\n{}".format(
177
+ i, Exceptions.exception_message(exc), self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_row(row_2, 4))
178
+ raise TechnicalException(msg) from exc
179
+
180
+ if res:
181
+ res_index = i
182
+ break
183
+
184
+ if not res and raise_exception:
185
+ msg = "Table doesn't contain the row:\n table {}:\n{}\n row {}:\n{}".format(
186
+ self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4), self._get_name_2(is_obtained_vs_expected), self._represent_row(row_2, 4))
187
+ raise VerifyException(msg)
188
+
189
+ return (res, res_index)
190
+ except (FunctionalException, TechnicalException) as exc:
191
+ raise exc
192
+ except Exception as exc:
193
+ msg = "Error while searching row in table:\n{}\n table {}:\n{}\n row {}:\n{}".format(
194
+ Tools.indent_string(4, Exceptions.exception_message(exc)),
195
+ self._get_name_1(is_obtained_vs_expected), self._represent_table(table_1, 4),
196
+ self._get_name_2(is_obtained_vs_expected), self._represent_row(row_2, 4))
197
+ raise TechnicalException(msg) from exc
198
+
199
+ def _represent_table(self, table, indent):
200
+ try:
201
+ return table.represent(indent)
202
+ except Exception as exc:
203
+ return f"[ERROR while representing table: {Exceptions.exception_message(exc)}]"
204
+
205
+ def _represent_row(self, row, indent):
206
+ try:
207
+ return row.represent(indent)
208
+ except Exception as exc:
209
+ return f"[ERROR while representing table row: {Exceptions.exception_message(exc)}]"
@@ -0,0 +1,60 @@
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 builtins import object
16
+ from holado_core.common.tables.comparators.string_table_cell_comparator import StringTableCellComparator
17
+ import re
18
+ from holado_core.common.exceptions.functional_exception import FunctionalException
19
+ from holado_core.common.tables.comparators.integer_table_cell_comparator import IntegerTableCellComparator
20
+ from holado_core.common.tables.comparators.float_table_cell_comparator import FloatTableCellComparator
21
+ from holado_core.common.tables.comparators.bytes_table_cell_comparator import BytesTableCellComparator
22
+ from holado_core.common.tables.comparators.datetime_table_cell_comparator import DatetimeTableCellComparator
23
+ from holado_core.common.tables.comparators.boolean_table_cell_comparator import BooleanTableCellComparator
24
+ from holado_core.common.tools.converters.converter import Converter
25
+ from holado_core.common.tools.tools import Tools
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+
30
+ class TableComparatorManager(object):
31
+
32
+ @classmethod
33
+ def convert_compare_method_2_TableCellComparator(cls, compare_method):
34
+ if Tools.do_log(logger, logging.DEBUG):
35
+ logger.debug("Converting compare method name to associated TableCellComparator")
36
+
37
+ if compare_method == "Boolean":
38
+ return BooleanTableCellComparator()
39
+ elif compare_method == "Bytes":
40
+ return BytesTableCellComparator()
41
+ elif compare_method == "Datetime":
42
+ return DatetimeTableCellComparator()
43
+ elif compare_method.startswith("Float"):
44
+ regex = re.compile(r"Float\((.*)\)")
45
+ r_match = regex.match(compare_method)
46
+ if r_match:
47
+ precision_str = r_match.group(1)
48
+ if Converter.is_float(precision_str):
49
+ precision = float(precision_str)
50
+ return FloatTableCellComparator(diff_precision=precision, relative_precision=None)
51
+ else:
52
+ raise FunctionalException("The parameter of compare method 'Float' is a precision that must be a float")
53
+ else:
54
+ return FloatTableCellComparator()
55
+ elif compare_method == "Integer":
56
+ return IntegerTableCellComparator()
57
+ elif compare_method == "String":
58
+ return StringTableCellComparator()
59
+
60
+
@@ -0,0 +1,116 @@
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
+
15
+
16
+ from builtins import range
17
+ from builtins import super
18
+ from holado_core.common.tools.comparators.comparator import Comparator
19
+ from holado_core.common.tools.tools import Tools
20
+ from holado_core.common.exceptions.verify_exception import VerifyException
21
+ from holado_core.common.exceptions.technical_exception import TechnicalException
22
+ from holado_core.common.exceptions.functional_exception import FunctionalException
23
+ import logging
24
+ from holado_core.common.exceptions.exceptions import Exceptions
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ class TableRowComparator(Comparator):
30
+ def __init__(self, cell_comparator=None, cells_comparators=None):
31
+ """
32
+ Define the method used to compare cells.
33
+ Implementation tests first if cells_comparators is defined, else it uses cell_comparator
34
+ """
35
+ super().__init__("table row")
36
+
37
+ self.__cell_comparator = cell_comparator
38
+ self.__cells_comparators = cells_comparators
39
+ if self.__cell_comparator is None and self.__cells_comparators is None:
40
+ raise TechnicalException("No cell comparator is defined")
41
+
42
+ def equals(self, row_1, row_2, is_obtained_vs_expected = True, raise_exception = True):
43
+ try:
44
+ res = True
45
+
46
+ # Verify number of cells
47
+ if row_1.nb_cells != row_2.nb_cells:
48
+ if raise_exception:
49
+ raise VerifyException("Rows have not same number of cells (row {name1}: {nb1} cells ; row {name2}: {nb2} cells):\n row {name1}:\n{repr1}\n row {name2}:\n{repr2})".format(
50
+ name1=self._get_name_1(is_obtained_vs_expected), nb1=row_1.nb_cells, repr1=row_1.represent(0),
51
+ name2=self._get_name_2(is_obtained_vs_expected), nb2=row_2.nb_cells, repr2=row_2.represent(0)))
52
+ else:
53
+ return False
54
+ if self.__cells_comparators is not None and row_1.nb_cells > len(self.__cells_comparators):
55
+ raise TechnicalException("Rows have more cells than defined in list of cells comparators")
56
+
57
+
58
+ # Compare cells content
59
+ for i in range(row_1.nb_cells):
60
+ # Define cell comparator to use
61
+ if self.__cells_comparators is not None:
62
+ cell_comp = self.__cells_comparators[i]
63
+ else:
64
+ cell_comp = self.__cell_comparator
65
+
66
+ # Manage case where the cell comparator is None, meaning the cells mustn't be compared
67
+ if cell_comp is None:
68
+ continue
69
+
70
+ # Compare cells
71
+ try:
72
+ res = cell_comp.equals(row_1.get_cell(i),
73
+ row_2.get_cell(i),
74
+ is_obtained_vs_expected = is_obtained_vs_expected,
75
+ raise_exception = raise_exception)
76
+ except FunctionalException as exc:
77
+ msg = "Difference exists in row at cells of index {}:\n{}\n row {}: {}\n row {}: {}\n cell comparator: {}".format(
78
+ i, Tools.indent_string(4, Exceptions.exception_message(exc)),
79
+ self._get_name_1(is_obtained_vs_expected), self.__represent_row(row_1),
80
+ self._get_name_2(is_obtained_vs_expected), self.__represent_row(row_2),
81
+ cell_comp)
82
+ raise VerifyException(msg) from exc
83
+ except Exception as exc:
84
+ msg = "Error while comparing cells of index {}:\n{}\n row {}: {}\n row {}: {}\n cell comparator: {}".format(
85
+ i, Tools.indent_string(4, Exceptions.exception_message(exc)),
86
+ self._get_name_1(is_obtained_vs_expected), self.__represent_row(row_1),
87
+ self._get_name_2(is_obtained_vs_expected), self.__represent_row(row_2),
88
+ cell_comp)
89
+ raise TechnicalException(msg) from exc
90
+
91
+ if not res:
92
+ if raise_exception:
93
+ raise TechnicalException("This case should have already raised an exception")
94
+ else:
95
+ if Tools.do_log(logger, logging.DEBUG):
96
+ logger.debug("Difference exists in row at cells of index {}:\n row {}:\n{}\n row {}:\n{}".format(
97
+ i, self._get_name_1(is_obtained_vs_expected), self.__represent_row(row_1, 4), self._get_name_2(is_obtained_vs_expected), self.__represent_row(row_2, 4)))
98
+ break
99
+
100
+ return res
101
+ except (FunctionalException, TechnicalException) as exc:
102
+ raise exc
103
+ except Exception as exc:
104
+ msg = "Error while comparing rows:\n{}\n row {}: {}\n row {}: {}".format(
105
+ Tools.indent_string(4, Exceptions.exception_message(exc)),
106
+ self._get_name_1(is_obtained_vs_expected), self.__represent_row(row_1),
107
+ self._get_name_2(is_obtained_vs_expected), self.__represent_row(row_2))
108
+ raise TechnicalException(msg) from exc
109
+
110
+ def __represent_row(self, row, indent=0):
111
+ try:
112
+ return row.represent(indent)
113
+ except Exception as exc:
114
+ return f"[ERROR while representing row: {Exceptions.exception_message(exc)}]"
115
+
116
+
@@ -0,0 +1,68 @@
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
+
15
+
16
+ from builtins import super
17
+ from holado_core.common.exceptions.verify_exception import VerifyException
18
+ from holado_core.common.exceptions.technical_exception import TechnicalException
19
+ from holado_core.common.exceptions.functional_exception import FunctionalException
20
+ import logging
21
+ from holado_core.common.tables.comparators.string_table_row_comparator import StringTableRowComparator
22
+ from holado_core.common.exceptions.exceptions import Exceptions
23
+ from holado_core.common.tools.tools import Tools
24
+ from holado_core.common.tables.comparators.table_comparator import TableComparator
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ class TableWithHeaderComparator(TableComparator):
30
+ def __init__(self, header_comparator=None, row_comparator=None, cell_comparator=None):
31
+ super().__init__(row_comparator=row_comparator, cell_comparator=cell_comparator)
32
+
33
+ self.__header_comparator = header_comparator if header_comparator is not None else StringTableRowComparator()
34
+
35
+ @property
36
+ def header_comparator(self):
37
+ return self.__header_comparator
38
+
39
+ def equals(self, table_1, table_2, is_obtained_vs_expected = True, raise_exception = True):
40
+ return (self.equals_headers(table_1, table_2, is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception)
41
+ and super().equals(table_1, table_2, is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception))
42
+
43
+ def contains_rows(self, table_1, table_2, check_row_order = True, is_obtained_vs_expected = True, raise_exception = True):
44
+ return (self.equals_headers(table_1, table_2, is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception)
45
+ and super().contains_rows(table_1, table_2, check_row_order=check_row_order, is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception))
46
+
47
+ def doesnt_contain_rows(self, table_1, table_2, is_obtained_vs_expected = True, raise_exception = True):
48
+ return (self.equals_headers(table_1, table_2, is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception)
49
+ and super().doesnt_contain_rows(table_1, table_2, is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception))
50
+
51
+ def equals_headers(self, table_1, table_2, is_obtained_vs_expected = True, raise_exception = True):
52
+ try:
53
+ return self.__header_comparator.equals(table_1.header, table_2.header, is_obtained_vs_expected=is_obtained_vs_expected, raise_exception=raise_exception);
54
+ except FunctionalException as exc:
55
+ msg = f"Table headers are not the same:\n -> {Exceptions.exception_message(exc)}"
56
+ if raise_exception:
57
+ raise VerifyException(msg) from exc
58
+ else:
59
+ if Tools.do_log(logger, logging.DEBUG):
60
+ logger.debug(msg)
61
+ return False
62
+ except Exception as exc:
63
+ msg = "Error while comparing tables headers:\n{}\n table {} header: {}\n table {} header: {}".format(
64
+ Tools.indent_string(4, Exceptions.exception_message(exc)),
65
+ self._get_name_1(is_obtained_vs_expected), self._represent_row(table_1.header, 0),
66
+ self._get_name_2(is_obtained_vs_expected), self._represent_row(table_2.header, 0))
67
+ raise TechnicalException(msg) from exc
68
+
File without changes
@@ -0,0 +1,194 @@
1
+ #################################################
2
+ # HolAdo (Holistic Automation do)
3
+ #
4
+ # (C) Copyright 2021-2025 by Eric Klumpp
5
+ #
6
+ # 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:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9
+ #
10
+ # 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.
11
+ #################################################
12
+
13
+ from holado_core.common.tables.table_with_header import TableWithHeader
14
+ from holado_core.common.tables.table_row import TableRow
15
+ from holado_core.common.exceptions.technical_exception import TechnicalException
16
+ from holado_core.common.tools.converters.converter import Converter
17
+ from holado_python.standard_library.typing import Typing
18
+ import logging
19
+ from holado_json.ipc.json_converter import JsonConverter
20
+ from holado_core.common.tables.table_manager import TableManager
21
+ from holado_core.common.exceptions.functional_exception import FunctionalException
22
+ import re
23
+ from holado_core.common.tools.tools import Tools
24
+
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+
30
+ class TableConverter(object):
31
+
32
+ @classmethod
33
+ def convert_table_with_header_to_dict(cls, table):
34
+ res_list = cls.convert_table_with_header_to_dict_list(table)
35
+ if len(res_list) == 0:
36
+ return None
37
+ elif len(res_list) == 1:
38
+ return res_list[0]
39
+ else:
40
+ raise TechnicalException(f"Failed to convert table to dict, since table has more than one row.")
41
+
42
+ @classmethod
43
+ def convert_table_with_header_to_dict_list(cls, table):
44
+ index_by_name = table.get_column_indexes_by_string_content()
45
+
46
+ res = []
47
+ for row in table.rows:
48
+ new_dict = {name: row.get_cell(index).content for name, index in index_by_name.items()}
49
+ res.append(new_dict)
50
+
51
+ return res
52
+
53
+ @classmethod
54
+ def convert_dict_list_to_table_with_header(cls, dict_list):
55
+ """
56
+ Builds a table with header from a list of dictionaries.
57
+ """
58
+ header = set()
59
+ for index, new_dict in enumerate(dict_list):
60
+ if not Converter.is_dict(new_dict):
61
+ raise TechnicalException(f"The list element of index {index} is not a dict (obtained type: {Typing.get_object_class_fullname(new_dict)})")
62
+ header = header.union(new_dict.keys())
63
+ header = sorted(header)
64
+
65
+ res = TableWithHeader()
66
+ res.header = TableRow(cells_content=header)
67
+
68
+ for new_dict in dict_list:
69
+ res.add_row(contents_by_colname=new_dict)
70
+
71
+ return res
72
+
73
+ @classmethod
74
+ def convert_name_value_table_2_dict(cls, table):
75
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
76
+ logger.trace(f"Converting Name/Value table to dict (table = {table})")
77
+
78
+ # Verify table structure
79
+ TableManager.verify_table_is_name_value_table(table)
80
+
81
+ res = {}
82
+ for row in table.rows:
83
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
84
+ logger.trace("Converting row (%s)", row)
85
+
86
+ name = row.get_cell(0).content
87
+ value = row.get_cell(1).content
88
+
89
+ if name in res:
90
+ raise FunctionalException("Name '{}' appears several times in table".format(name))
91
+ else:
92
+ res[name] = value
93
+
94
+ if Tools.do_log(logger, logging.DEBUG):
95
+ logger.debug(f"Converting Name/Value table to dict (table = {table}) => {res}")
96
+ return res
97
+
98
+ @classmethod
99
+ def convert_name_value_table_2_json_object(cls, table, converter=None):
100
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
101
+ logger.trace(f"Converting Name/Value table to json object (table = {table})")
102
+ if converter is None:
103
+ converter = JsonConverter()
104
+
105
+ # Verify table structure
106
+ TableManager.verify_table_is_name_value_table(table)
107
+
108
+ res = {}
109
+ for row in table.rows:
110
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
111
+ logger.trace("Converting row (%s)", row)
112
+
113
+ name = row.get_cell(0).content
114
+ value = row.get_cell(1).content
115
+ value = converter.to_json(value)
116
+
117
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
118
+ logger.trace(f"Adding for name '{name}' json value [{value}] (type: {Typing.get_object_class_fullname(value)})")
119
+ cls._fill_json_dict(res, name, value)
120
+
121
+ if Tools.do_log(logger, logging.DEBUG):
122
+ logger.debug(f"Converting Name/Value table to json object (table = {table}) => {res}")
123
+ return res
124
+
125
+ @classmethod
126
+ def extract_table_with_header_from_table(cls, table, row_first_index, row_last_index, col_first_index, col_last_index):
127
+ res = TableWithHeader()
128
+
129
+ header_content = [c.content for c in table.rows[row_first_index].cells[col_first_index:col_last_index+1]]
130
+ res.header = TableRow(cells_content=header_content)
131
+
132
+ for i in range(row_first_index+1, row_last_index+1):
133
+ row_content = [c.content for c in table.rows[i].cells[col_first_index:col_last_index+1]]
134
+ res.add_row(cells_content=row_content)
135
+
136
+ return res
137
+
138
+
139
+ @classmethod
140
+ def _fill_json_dict(cls, json_res, name, value):
141
+ if not isinstance(json_res, dict):
142
+ raise TechnicalException(f"Type '{Typing.get_object_class_fullname(json_res)}' is not a dict")
143
+
144
+ names = name.split(".", maxsplit=1)
145
+ name0 = names[0]
146
+ name1 = names[1] if len(names) > 1 else None
147
+
148
+ # manage lists
149
+ m = re.match(r"^([^[]+)\[(.*)\]$", name0)
150
+ if m:
151
+ li_name = m.group(1)
152
+ index = int(m.group(2))
153
+
154
+ if li_name not in json_res:
155
+ json_res[li_name] = []
156
+ cls._fill_json_list(json_res[li_name], index, name1, value)
157
+ return
158
+
159
+ if name1 is None:
160
+ cls._fill_json_dict_entry(json_res, name0, value)
161
+ else:
162
+ if name0 not in json_res:
163
+ json_res[name0] = {}
164
+ cls._fill_json_dict(json_res[name0], name1, value)
165
+
166
+ @classmethod
167
+ def _fill_json_dict_entry(cls, json_res, name, value):
168
+ if name in json_res:
169
+ raise FunctionalException(f"Name '{name}' is already set")
170
+ else:
171
+ json_res[name] = value
172
+
173
+ @classmethod
174
+ def _fill_json_list(cls, json_res, index, name, value):
175
+ if not isinstance(json_res, list):
176
+ raise TechnicalException(f"Type '{Typing.get_object_class_fullname(json_res)}' is not a list")
177
+
178
+ # Prepare list with missing elements
179
+ if index + 1 > len(json_res):
180
+ for _ in range(len(json_res), index + 1):
181
+ json_res.append(None)
182
+
183
+ if name is None:
184
+ if json_res[index] is None:
185
+ json_res[index] = value
186
+ else:
187
+ raise FunctionalException("List has already an element at index {}".format(index))
188
+ else:
189
+ if json_res[index] is None:
190
+ json_res[index] = {}
191
+ cls._fill_json_dict(json_res[index], name, value)
192
+
193
+
194
+