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,366 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.tables.table_with_header import TableWithHeader
16
+ from builtins import object
17
+ from holado_core.common.tables.table import Table
18
+ from holado_value.common.tables.value_table_with_header import ValueTableWithHeader
19
+ from holado_core.common.tools.tools import Tools, reversed_range
20
+ from holado_python.standard_library.typing import Typing
21
+ import copy
22
+ from holado_value.common.tools.value_types import ValueTypes
23
+ from holado_core.common.exceptions.technical_exception import TechnicalException
24
+ from holado_value.common.tables.comparators.table_2_value_table_row_comparator import Table2ValueTable_RowComparator
25
+ from holado_core.common.exceptions.verify_exception import VerifyException
26
+ from holado_core.common.exceptions.functional_exception import FunctionalException
27
+ from holado_core.common.tables.comparators.table_comparator_manager import TableComparatorManager
28
+ from holado_core.common.tables.comparators.table_row_comparator import TableRowComparator
29
+ from holado_core.common.tables.comparators.table_comparator import TableComparator
30
+ from holado_core.common.tables.comparators.string_table_comparator import StringTableComparator
31
+ from holado_core.common.tables.table_row import TableRow
32
+ from holado_core.common.tables.comparators.string_table_row_comparator import StringTableRowComparator
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+
37
+ class TableManager(object):
38
+
39
+ @classmethod
40
+ def is_table_with_header(cls, table):
41
+ return isinstance(table, TableWithHeader)
42
+
43
+ @classmethod
44
+ def convert_object_attributes_2_name_value_table(cls, obj):
45
+ if Tools.do_log(logger, logging.DEBUG):
46
+ logger.debug("Converting object to name/value table")
47
+
48
+ res = TableWithHeader()
49
+
50
+ # Set header
51
+ res.header.add_cells_from_contents(["Name", "Value"])
52
+
53
+ # Get attributes
54
+ attributes = Typing.get_object_attributes(obj)
55
+
56
+ # Set body
57
+ for attr in attributes:
58
+ res.add_row(cells_content=attr)
59
+
60
+ return res
61
+
62
+ @classmethod
63
+ def convert_list_2_column_table(cls, el_list):
64
+ if Tools.do_log(logger, logging.DEBUG):
65
+ logger.debug("Converting list to column table")
66
+
67
+ res = Table()
68
+
69
+ # Set body
70
+ for el in el_list:
71
+ res.add_row(cells_content=[el])
72
+
73
+ return res
74
+
75
+ @classmethod
76
+ def convert_object_list_2_table_with_attributes_as_column(cls, list_obj):
77
+ if Tools.do_log(logger, logging.DEBUG):
78
+ logger.debug("Converting object list to table with object attributes as column...")
79
+ res = TableWithHeader()
80
+
81
+ for obj in list_obj:
82
+ if not res.header:
83
+ if isinstance(obj, dict):
84
+ header_names = list(obj.keys())
85
+ else:
86
+ header_names = Typing.get_object_attribute_names(obj)
87
+ res.header.add_cells_from_contents(cells_content=header_names)
88
+ if Tools.do_log(logger, logging.DEBUG):
89
+ logger.debug(f"Result table - set header {res.header.represent(0)}")
90
+
91
+ if isinstance(obj, dict):
92
+ values_by_name = obj
93
+ else:
94
+ values_by_name = Typing.get_object_attribute_names(obj)
95
+ if Tools.do_log(logger, logging.DEBUG):
96
+ logger.debug(f"Result table - add row with {values_by_name}")
97
+ res.add_row(contents_by_colname=values_by_name)
98
+
99
+ return res
100
+
101
+ @classmethod
102
+ def convert_object_list_2_column_table(cls, list_obj):
103
+ if Tools.do_log(logger, logging.DEBUG):
104
+ logger.debug("Converting object list to column table...")
105
+ res = Table()
106
+
107
+ for obj in list_obj:
108
+ # logger.debug(f"+++++ add row with object: {obj}")
109
+ res.add_row(cells_content=[obj])
110
+
111
+ return res
112
+
113
+
114
+ @classmethod
115
+ def convert_dict_2_name_value_table(cls, obj):
116
+ if Tools.do_log(logger, logging.DEBUG):
117
+ logger.debug("Converting dictionary to name/value table...")
118
+ res = TableWithHeader()
119
+
120
+ res.header.add_cells_from_contents(["Name", "Value"])
121
+
122
+ sorted_dict = dict(sorted(obj.items()))
123
+ for entry in sorted_dict.items():
124
+ res.add_row(cells_content=entry)
125
+
126
+ return res
127
+
128
+ @classmethod
129
+ def convert_dict_2_table_with_keys_as_column(cls, obj):
130
+ if Tools.do_log(logger, logging.DEBUG):
131
+ logger.debug("Converting dictionary to table with keyx as column name...")
132
+ res = TableWithHeader()
133
+
134
+ res.add_row()
135
+ sorted_dict = dict(sorted(obj.items()))
136
+ for key, value in sorted_dict.items():
137
+ res.add_column(name=key, cells_content=[value])
138
+
139
+ return res
140
+
141
+ @classmethod
142
+ def convert_table_2_list_of_tuples(cls, table):
143
+ if Tools.do_log(logger, logging.DEBUG):
144
+ logger.debug("Converting table to a list of tuples...")
145
+ return [tuple((cell.content for cell in row.cells)) for row in table.rows]
146
+
147
+
148
+ @classmethod
149
+ def compare_tables(cls, table_1, table_2, compare_params_table, reorder_columns_table_1=True, reorder_columns_table_2=True, raise_exception=True):
150
+ compared_tables, columns_compare_methods, compared_columns, expected_table_columns = cls._extract_compared_data(table_1, table_2, compare_params_table, reorder_columns_table_1, reorder_columns_table_2)
151
+
152
+ # Verify source table headers
153
+ res = cls._verify_expected_table_columns(table_1, table_2, expected_table_columns, raise_exception=raise_exception)
154
+ if not res:
155
+ return res
156
+
157
+ # Verify compared table headers
158
+ res = cls._verify_compared_table_columns(compared_tables, compared_columns, raise_exception=raise_exception)
159
+ if not res:
160
+ return res
161
+
162
+ # Compare table contents
163
+ if columns_compare_methods is not None:
164
+ cells_comparators = [TableComparatorManager.convert_compare_method_2_TableCellComparator(cm.value) if cm.value_type != ValueTypes.NotApplicable else None for cm in columns_compare_methods]
165
+ row_comparator = TableRowComparator(cells_comparators=cells_comparators)
166
+ comparator = TableComparator(row_comparator=row_comparator)
167
+ else:
168
+ comparator = StringTableComparator()
169
+ try:
170
+ res = comparator.equals(compared_tables[0], compared_tables[1], is_obtained_vs_expected=True, raise_exception=raise_exception)
171
+ except FunctionalException as exc:
172
+ raise FunctionalException(f"Tables are different (obtained = table 1 ; expected = table 2):\n{Tools.indent_string(4, exc.message)}") from exc
173
+
174
+ return res
175
+
176
+ @classmethod
177
+ def _extract_compared_data(cls, table_1, table_2, compare_params_table, reorder_columns_table_1, reorder_columns_table_2):
178
+ if not isinstance(compare_params_table, ValueTableWithHeader):
179
+ raise TechnicalException(f"Compare parameters table is expected to be a ValueTableWithHeader (obtained type: {Typing.get_object_class_fullname(compare_params_table)})")
180
+
181
+ res_t1 = copy.copy(table_1)
182
+ res_t2 = copy.copy(table_2)
183
+ colnames_t1 = compare_params_table.get_column(name="Column Names 1")
184
+ colnames_t2 = compare_params_table.get_column(name="Column Names 2")
185
+ has_compare_method = compare_params_table.has_column(name="Compare method", raise_exception=False)
186
+ columns_compare_methods = compare_params_table.get_column(name="Compare method") if has_compare_method else None
187
+
188
+ # Extract compared data
189
+ compare_colnames_t1 = copy.copy(colnames_t1)
190
+ compare_colnames_t2 = copy.copy(colnames_t2)
191
+ exp_colnames_t1 = copy.copy(colnames_t1)
192
+ exp_colnames_t2 = copy.copy(colnames_t2)
193
+ for ind in reversed_range(len(colnames_t1)):
194
+ if colnames_t1[ind].value_type == ValueTypes.NotApplicable or colnames_t2[ind].value_type == ValueTypes.NotApplicable:
195
+ del compare_colnames_t1[ind]
196
+ del compare_colnames_t2[ind]
197
+ if has_compare_method:
198
+ del columns_compare_methods[ind]
199
+ if colnames_t1[ind].value_type == ValueTypes.NotApplicable:
200
+ cn_t2 = colnames_t2[ind].string_content
201
+ res_t2.remove_column(name=cn_t2)
202
+ del exp_colnames_t1[ind]
203
+ if colnames_t2[ind].value_type == ValueTypes.NotApplicable:
204
+ cn_t1 = colnames_t1[ind].string_content
205
+ res_t1.remove_column(name=cn_t1)
206
+ del exp_colnames_t2[ind]
207
+
208
+ # Reorder tables
209
+ if reorder_columns_table_1:
210
+ table_1.order_columns(names=exp_colnames_t1.cells_value)
211
+ res_t1.order_columns(names=compare_colnames_t1.cells_value)
212
+ if reorder_columns_table_2:
213
+ table_2.order_columns(names=exp_colnames_t2.cells_value)
214
+ res_t2.order_columns(names=compare_colnames_t2.cells_value)
215
+
216
+ return (res_t1, res_t2), columns_compare_methods, (compare_colnames_t1, compare_colnames_t2), (exp_colnames_t1, exp_colnames_t2)
217
+
218
+ @classmethod
219
+ def _verify_expected_table_columns(cls, table_1, table_2, expected_table_columns, raise_exception=True):
220
+ comp = Table2ValueTable_RowComparator()
221
+ try:
222
+ comp.equals(table_1.header, expected_table_columns[0])
223
+ except VerifyException as exc:
224
+ if raise_exception:
225
+ msg_list = ["Column Names 1 is not matching table 1 columns (columns order is mandatory):",
226
+ " Table 1 columns: " + table_1.header.represent(0),
227
+ " Column Names 1: " + expected_table_columns[0].represent(0) ]
228
+ raise FunctionalException("\n".join(msg_list) + f"\n{'-'*20}\n{exc}") from exc
229
+ else:
230
+ return False
231
+
232
+ try:
233
+ sorted_table_2_header = copy.copy(table_2.header)
234
+ sorted_table_2_header.sort()
235
+ sorted_exp_colnames_t2 = copy.copy(expected_table_columns[1])
236
+ sorted_exp_colnames_t2.sort()
237
+ comp.equals(sorted_table_2_header, sorted_exp_colnames_t2)
238
+ except VerifyException as exc:
239
+ if raise_exception:
240
+ msg_list = ["Column Names 2 is not matching table 2 columns (columns order is not mandatory):",
241
+ " Table 2 columns: " + table_2.header.represent(0),
242
+ " Column Names 2: " + expected_table_columns[1].represent(0) ]
243
+ raise FunctionalException("\n".join(msg_list) + f"\n{'-'*20}\n{exc}") from exc
244
+ else:
245
+ return False
246
+
247
+ return True
248
+
249
+ @classmethod
250
+ def _verify_compared_table_columns(cls, compared_tables, compared_columns, raise_exception=True):
251
+ if compared_tables[0].nb_columns != len(compared_columns[0]):
252
+ if raise_exception:
253
+ msg_list = ["Compared columns are not matching table 1 columns:",
254
+ " Table 1 columns: " + compared_tables[0].header.represent(0),
255
+ " compared columns: " + compared_columns[0].represent(0) ]
256
+ raise FunctionalException("\n".join(msg_list))
257
+ else:
258
+ return False
259
+ if compared_tables[1].nb_columns != len(compared_columns[1]):
260
+ if raise_exception:
261
+ msg_list = ["Compared columns are not matching table 2 columns:",
262
+ " Table 2 columns: " + compared_tables[1].header.represent(0),
263
+ " compared columns: " + compared_columns[1].represent(0) ]
264
+ raise FunctionalException("\n".join(msg_list))
265
+ else:
266
+ return False
267
+
268
+ for ind in range(len(compared_columns[0])):
269
+ index_t1 = compared_tables[0].get_column_index(name=compared_columns[0][ind].string_content)
270
+ index_t2 = compared_tables[1].get_column_index(name=compared_columns[1][ind].string_content)
271
+ if index_t1 != index_t2:
272
+ if raise_exception:
273
+ msg_list = ["Compared columns have not same indexes in respective tables:",
274
+ " Table header 1: " + compared_tables[0].header.represent(0),
275
+ " Table header 2: " + compared_tables[1].header.represent(0) ]
276
+ raise FunctionalException("\n".join(msg_list))
277
+ else:
278
+ return False
279
+
280
+ return True
281
+
282
+ @classmethod
283
+ def verify_table_is_with_header(cls, table, raise_exception=True):
284
+ # Compare headers
285
+ if not cls.is_table_with_header(table):
286
+ if raise_exception:
287
+ raise TechnicalException(f"Table is expected with header (obtained type: {type(table)})")
288
+ else:
289
+ return False
290
+ return True
291
+
292
+ @classmethod
293
+ def verify_table_is_value_table(cls, table, raise_exception=True):
294
+ # Compare headers
295
+ res = cls.verify_table_is_with_header(table, raise_exception=raise_exception)
296
+ if not res:
297
+ return False
298
+
299
+ # Build expected header
300
+ expected = TableRow(cells_content=["Value"])
301
+
302
+ # Verify header content
303
+ comparator = StringTableRowComparator()
304
+ return comparator.equals(expected, table.header, raise_exception=raise_exception)
305
+
306
+ @classmethod
307
+ def verify_table_is_name_value_table(cls, table, raise_exception=True):
308
+ # Compare headers
309
+ res = cls.verify_table_is_with_header(table, raise_exception=raise_exception)
310
+ if not res:
311
+ return False
312
+
313
+ # Build expected header
314
+ expected = TableRow(cells_content=["Name", "Value"])
315
+
316
+ # Verify header content
317
+ comparator = StringTableRowComparator()
318
+ return comparator.equals(expected, table.header, raise_exception=raise_exception)
319
+
320
+ @classmethod
321
+ def verify_table_is_x_name_value_table(cls, table, x_name, raise_exception=True):
322
+ # Compare headers
323
+ res = cls.verify_table_is_with_header(table, raise_exception=raise_exception)
324
+ if not res:
325
+ return False
326
+
327
+ # Build expected header
328
+ expected = TableRow(cells_content=[x_name, "Name", "Value"])
329
+
330
+ # Verify header content
331
+ comparator = StringTableRowComparator()
332
+ return comparator.equals(expected, table.header, raise_exception=raise_exception)
333
+
334
+ @classmethod
335
+ def verify_table_is_x_table(cls, table, *x_names, raise_exception=True):
336
+ # Compare headers
337
+ res = cls.verify_table_is_with_header(table, raise_exception=raise_exception)
338
+ if not res:
339
+ return False
340
+
341
+ # Build expected header
342
+ expected = TableRow(cells_content=x_names)
343
+
344
+ # Verify header content
345
+ comparator = StringTableRowComparator()
346
+ return comparator.equals(expected, table.header, raise_exception=raise_exception)
347
+
348
+ @classmethod
349
+ def represent_table(cls, table, indent=0):
350
+ res_list = []
351
+
352
+ if cls.is_table_with_header(table):
353
+ res_list.append("| " + " | ".join(table.header.cells_content) + " |")
354
+
355
+ for row in table.rows:
356
+ res_list.append("| " + " | ".join(row.cells_content) + " |")
357
+
358
+ return Tools.indent_string(indent, "\n".join(res_list))
359
+
360
+ @classmethod
361
+ def set_object_attributes_according_name_value_table(cls, obj, table):
362
+ # Verify table structure
363
+ cls.verify_table_is_name_value_table(table)
364
+
365
+ for row in table.rows:
366
+ setattr(obj, row.get_cell(0).content, row.get_cell(1).content)
@@ -0,0 +1,169 @@
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.tables.table_cell import TableCell
18
+ from holado_core.common.tools.tools import Tools
19
+ import copy
20
+ from holado_core.common.exceptions.technical_exception import TechnicalException
21
+ import logging
22
+ from holado_python.standard_library.typing import Typing
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class TableRow(list):
28
+ def __init__(self, cells=None, cells_content=None, **kwargs):
29
+ super().__init__()
30
+
31
+ self.__content = None
32
+ self.__parent = None
33
+
34
+ if cells is not None:
35
+ self.cells.extend(cells)
36
+ elif cells_content is not None:
37
+ self.add_cells_from_contents(cells_content, **kwargs)
38
+
39
+ @property
40
+ def content(self):
41
+ """ Content of whole table row, relevant for some table types. """
42
+ return self.__content
43
+
44
+ @content.setter
45
+ def content(self, content):
46
+ """ Set content of whole table row, relevant for some table types. """
47
+ self.__content = content
48
+
49
+ @property
50
+ def parent(self):
51
+ """ Parent, relevant for some table types. It's usually the origin of its creation. """
52
+ return self.__parent
53
+
54
+ @parent.setter
55
+ def parent(self, parent):
56
+ """ Set parent. """
57
+ self.__parent = parent
58
+
59
+ @property
60
+ def cells(self):
61
+ return self
62
+
63
+ @property
64
+ def cells_content(self):
65
+ return tuple(c.content for c in self.cells)
66
+
67
+ @property
68
+ def nb_cells(self):
69
+ return len(self.cells)
70
+
71
+ def __copy__(self):
72
+ cls = self.__class__
73
+ res = cls()
74
+
75
+ # Copy cells
76
+ for cell in self.cells:
77
+ res.add_cell(cell=copy.copy(cell))
78
+
79
+ return res
80
+
81
+ def __deepcopy__(self, memo):
82
+ cls = self.__class__
83
+ result = cls.__new__(cls)
84
+ memo[id(self)] = result
85
+ for k, v in self.__dict__.items():
86
+ setattr(result, k, copy.deepcopy(v, memo))
87
+ return result
88
+
89
+ def __repr__(self)->str:
90
+ if self.nb_cells < 100:
91
+ return f"<{self.__class__.__name__}>({self.nb_cells})[{self.represent()}]"
92
+ else:
93
+ return f"<{self.__class__.__name__}>({self.nb_cells})"
94
+
95
+ def add_cell(self, cell=None, content=None, **kwargs):
96
+ """Add a cell
97
+ @param cell: Cell instance
98
+ @param content: Cell content
99
+ @param kwargs: Additional arguments needed by sub-classes.
100
+ """
101
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
102
+ logger.trace(f"add_cell({cell=}, {content=} [{Typing.get_object_class_fullname(content)}])")
103
+ if cell is not None:
104
+ self.cells.append(cell)
105
+ else:
106
+ self.add_cell(cell=self._new_cell(content, **kwargs), **kwargs)
107
+
108
+ def add_cells_from_contents(self, cells_content, **kwargs):
109
+ """Add cells from their contents
110
+ @param cells_content: Cells content
111
+ @param kwargs: Additional arguments needed by sub-classes.
112
+ """
113
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
114
+ logger.trace(f"add_cells_from_contents({cells_content=})")
115
+ for cell_content in cells_content:
116
+ self.add_cell(content=cell_content, **kwargs)
117
+
118
+ def get_cell(self, index, **kwargs) -> TableCell : # @UnusedVariable
119
+ return self.cells[index]
120
+
121
+ def _new_cell(self, content, **kwargs): # @UnusedVariable
122
+ return TableCell(cell_content=content)
123
+
124
+ def remove_cell(self, index, **kwargs): # @UnusedVariable
125
+ return self.cells.pop(index)
126
+
127
+ def keep_cells(self, indexes, **kwargs):
128
+ for i in reversed(range(self.nb_cells)):
129
+ if i not in indexes:
130
+ self.remove_cell(i, **kwargs)
131
+
132
+ def represent(self, indent = 0, value_prefix = None, value_postfix = None, marge_left = " ", marge_right = " "):
133
+ res_list = []
134
+
135
+ res_list.append(Tools.get_indent_string(indent))
136
+ res_list.append("|")
137
+ for cell in self.cells:
138
+ if marge_left is not None:
139
+ res_list.append(marge_left)
140
+
141
+ if cell is not None:
142
+ if value_prefix is not None or value_postfix is not None:
143
+ res_list.append(cell.represent(0, value_prefix, value_postfix))
144
+ else:
145
+ res_list.append(cell.represent(0))
146
+ else:
147
+ res_list.append("{CELL_IS_NONE}")
148
+
149
+ if marge_right is not None:
150
+ res_list.append(marge_right)
151
+
152
+ res_list.append("|")
153
+
154
+ return "".join(res_list)
155
+
156
+ def order_cells(self, indexes=None, **kwargs):
157
+ orig_indexes = list(range(self.nb_cells))
158
+ for cell_index, orig_cell_ind in enumerate(indexes):
159
+ cur_cell_ind = orig_indexes.index(orig_cell_ind)
160
+ if cur_cell_ind != cell_index:
161
+ self.switch_cells(index_1=cell_index, index_2=cur_cell_ind, **kwargs)
162
+ orig_indexes[cell_index], orig_indexes[cur_cell_ind] = orig_indexes[cur_cell_ind], orig_indexes[cell_index]
163
+
164
+ def switch_cells(self, index_1, index_2, **kwargs):
165
+ if index_1 == index_2:
166
+ raise TechnicalException(f"The two indexes are equal (index = {index_1})")
167
+
168
+ self.cells[index_1], self.cells[index_2] = self.cells[index_2], self.cells[index_1]
169
+