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,321 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.exceptions.functional_exception import FunctionalException
16
+ import re
17
+ from holado.common.handlers.object import Object, DeleteableObject
18
+ from holado_core.common.tools.tools import Tools
19
+ from holado.holado_config import Config
20
+ from contextlib import contextmanager
21
+ from typing import NamedTuple
22
+ import threading
23
+ from holado.common.tools.gc_manager import GcManager
24
+ from holado_python.standard_library.typing import Typing
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ class VariableManager(DeleteableObject):
30
+ """
31
+ Manage variables as couples of (name, value).
32
+
33
+ Variable names can contain any character except: ".", "["
34
+ Variable names can end by any dynamic suffix symbol, the symbol will be replaced by the associated suffix.
35
+ """
36
+
37
+ def __init__(self, parent=None):
38
+ super().__init__("variable manager")
39
+
40
+ self.__parent = parent
41
+ self.__dynamic_text_manager = None
42
+ self.__unique_value_manager = None
43
+ self.__variables = {}
44
+
45
+ # Manage temporary variables
46
+ self.__temporary_variables_lock = threading.Lock()
47
+ self.__temporary_variables = {}
48
+
49
+ def initialize(self, dynamic_text_manager, unique_value_manager):
50
+ self.__dynamic_text_manager = dynamic_text_manager
51
+ self.__unique_value_manager = unique_value_manager
52
+
53
+ @property
54
+ def parent(self):
55
+ return self.__parent
56
+
57
+ def _delete_object(self):
58
+ # Delete all variables
59
+ names = set(self.__variables.keys())
60
+ if Tools.do_log(logger, logging.DEBUG):
61
+ logger.debug(f"Removing {len(names)} variables: {names}")
62
+ for index, name in enumerate(names):
63
+ if name in self.__variables:
64
+ value = self.__variables[name]
65
+ if Tools.do_log(logger, logging.DEBUG):
66
+ logger.debug(f"Removing variable {index+1}/{len(names)}: '{name}' (type: {Typing.get_object_class_fullname(value)})")
67
+ self.unregister_variable(name, through_parent=False, delete_value=True)
68
+ if Tools.do_log(logger, logging.DEBUG):
69
+ logger.debug(f"Finished to remove {len(names)} variables: {names}")
70
+
71
+ # # Clear variables
72
+ # self.__variables.clear()
73
+
74
+ @contextmanager
75
+ def temporary_variables(self):
76
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
77
+
78
+ uid = MultitaskManager.get_thread_uid()
79
+ with self.__temporary_variables_lock:
80
+ if uid not in self.__temporary_variables:
81
+ self.__temporary_variables[uid] = NamedTuple("TempVars", counter=int, variable_names=list)
82
+ self.__temporary_variables[uid].counter = 0
83
+ self.__temporary_variables[uid].variable_names = set()
84
+ self.__temporary_variables[uid].counter += 1
85
+
86
+ try:
87
+ yield None
88
+ finally:
89
+ with self.__temporary_variables_lock:
90
+ self.__temporary_variables[uid].counter -= 1
91
+ if self.__temporary_variables[uid].counter == 0:
92
+ logger.info(f"Unregistering temporary variables: {self.__temporary_variables[uid].variable_names}")
93
+ for var_name in self.__temporary_variables[uid].variable_names:
94
+ if self.exists_variable(var_name, through_parent=False):
95
+ self.unregister_variable(var_name, through_parent=False, delete_value=True)
96
+ del self.__temporary_variables[uid]
97
+ GcManager.collect()
98
+
99
+
100
+ def new_local_variable_name(self, sub_name=None):
101
+ if sub_name is not None:
102
+ return f"__VAR_{sub_name}_{self.__unique_value_manager.new_string(do_log=False)}__"
103
+ else:
104
+ return f"__VAR{self.__unique_value_manager.new_string(do_log=False)}__"
105
+
106
+ def new_variable_name(self):
107
+ res = None
108
+ while True:
109
+ res = self.new_local_variable_name()
110
+ if not self.exists_variable(variable_name=res):
111
+ break
112
+ return res
113
+
114
+ def evaluate_variable_name(self, var_name):
115
+ if var_name.endswith(Config.DYNAMIC_SYMBOL):
116
+ return self.__dynamic_text_manager.get(var_name[:-1])
117
+ elif var_name.endswith(Config.THREAD_DYNAMIC_SYMBOL):
118
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
119
+ return self.__dynamic_text_manager.get(var_name[:-1], scope=MultitaskManager.get_thread_id())
120
+ elif var_name.endswith(Config.UNIQUE_SYMBOL):
121
+ return var_name[:-1] + self.__unique_value_manager.new_string(padding_length=Config.unique_string_padding_length)
122
+ else:
123
+ return var_name
124
+
125
+ def register_variable(self, variable_name, value, accept_expression=True, log_level=logging.INFO):
126
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
127
+
128
+ if Tools.do_log(logger, logging.TRACE): # @UndefinedVariable
129
+ logger.trace(f"Setting variable: {variable_name}=[{value}] (type: {Typing.get_object_class_fullname(value)})...")
130
+
131
+ names = variable_name.rsplit('.', 1)
132
+ if accept_expression and len(names) > 1:
133
+ if not self.exists_variable(expression=names[0]):
134
+ self.register_variable(names[0], Object())
135
+ var = self.get_value(names[0], through_patent=False)
136
+ setattr(var, names[1], value)
137
+ if Tools.do_log(logger, log_level):
138
+ logger.log(log_level, f"Set variable expression: {variable_name}=[{value}] (type: {Typing.get_object_class_fullname(value)})")
139
+ else:
140
+ var_name = self.evaluate_variable_name(variable_name)
141
+ self.__variables[var_name] = value
142
+ if Tools.do_log(logger, log_level):
143
+ logger.log(log_level, f"Set variable: {var_name}=[{value}] (type: {Typing.get_object_class_fullname(value)})")
144
+
145
+ # Manage temporary variables
146
+ uid = MultitaskManager.get_thread_uid()
147
+ with self.__temporary_variables_lock:
148
+ if uid in self.__temporary_variables:
149
+ self.__temporary_variables[uid].variable_names.add(var_name)
150
+
151
+ def unregister_variable(self, variable_name, through_parent=False, delete_value=False):
152
+ var_name = self.evaluate_variable_name(variable_name)
153
+ if self.exists_variable(var_name, through_parent=False):
154
+ value = self.__variables[var_name]
155
+ if Tools.do_log(logger, logging.DEBUG):
156
+ logger.debug(f"Unregistering variable '{var_name}' (type: {Typing.get_object_class_fullname(value)})")
157
+
158
+ if delete_value and isinstance(value, DeleteableObject):
159
+ try:
160
+ value.delete_object()
161
+ except Exception:
162
+ logger.exception(f"Catched exception while deleting object '{var_name}' (type: {Typing.get_object_class_fullname(value)})")
163
+ else:
164
+ if Tools.do_log(logger, logging.DEBUG):
165
+ logger.debug(f"Deleted variable '{var_name}' (type: {Typing.get_object_class_fullname(value)})")
166
+
167
+ del self.__variables[var_name]
168
+ elif through_parent and self.parent:
169
+ return self.parent.unregister_variable(variable_name, through_parent=through_parent, delete_value=delete_value)
170
+ else:
171
+ raise FunctionalException(f"Variable '{var_name}' has not been found. Missing initialisation ?")
172
+
173
+ def pop_variable(self, variable_name):
174
+ res = self.get_variable_value(variable_name, through_parent=False)
175
+ self.unregister_variable(variable_name, through_parent=False, delete_value=False)
176
+ return res
177
+
178
+ def get_variable_value(self, variable_name, attributes = [], through_parent=True):
179
+ # Get variable value
180
+ var_name = self.evaluate_variable_name(variable_name)
181
+ if self.exists_variable(var_name, through_parent=False):
182
+ res = self.__variables[var_name]
183
+ elif through_parent and self.parent:
184
+ return self.parent.get_variable_value(variable_name, attributes)
185
+ else:
186
+ raise FunctionalException("Variable '{}' has not been found. Missing initialisation ?".format(variable_name))
187
+
188
+ # If needed, call attributes
189
+ for attr in attributes:
190
+ res = getattr(res, attr)
191
+
192
+ return res
193
+
194
+ def get_value(self, expression, through_patent=True):
195
+ res = None
196
+
197
+ if self.is_variable_expression(expression, through_parent=through_patent):
198
+ try:
199
+ res = self.eval_variable_expression(expression, through_parent=through_patent)
200
+ except (SyntaxError, NameError):
201
+ raise FunctionalException("Expression '{}' is not evaluable. Is an initialization missing ?".format(expression))
202
+ else:
203
+ res = self.get_variable_value(expression, through_parent=through_patent)
204
+
205
+ return res
206
+
207
+ def set_value(self, expression, value, through_parent=True):
208
+ if self.is_variable_expression(expression, through_parent=through_parent):
209
+ try:
210
+ self.exec_set_variable_expression(expression, value, through_parent=through_parent)
211
+ except (SyntaxError, NameError):
212
+ raise FunctionalException("Expression '{}' is not evaluable. Is an initialization missing ?".format(expression))
213
+ else:
214
+ self.register_variable(expression, value)
215
+
216
+ def exists_variable(self, variable_name=None, expression=None, through_parent=True):
217
+ if expression is not None:
218
+ expression = expression.strip()
219
+ m_operator = re.search("[.[]", expression)
220
+ if m_operator:
221
+ # Return directly False if found operator is not an operator
222
+ # EKL: Why this check is done ???
223
+ if m_operator.group(0) not in ['.', '[']:
224
+ return False
225
+ # Begin by looking for variable existance
226
+ variable_name = expression[:m_operator.start()]
227
+ else:
228
+ variable_name = expression
229
+
230
+ var_name = self.evaluate_variable_name(variable_name)
231
+ res = var_name in self.__variables
232
+
233
+ # For expression, look if sub variable exist
234
+ if res and expression is not None and variable_name != expression:
235
+ try:
236
+ _ = self.eval_variable_expression(expression, through_parent=False)
237
+ except:
238
+ res = False
239
+ else:
240
+ res = True
241
+
242
+ if not res and through_parent and self.parent:
243
+ if expression is not None:
244
+ res = self.parent.exists_variable(expression=expression)
245
+ else:
246
+ res = self.parent.exists_variable(variable_name=variable_name)
247
+ return res
248
+
249
+ def is_variable_expression(self, expression, through_parent=True):
250
+ try:
251
+ var_name, expr_rest = self.__extract_expression_name(expression)
252
+ return len(var_name) > 0 and self.exists_variable(var_name, through_parent=through_parent) and len(expr_rest) > 0
253
+ except SyntaxError:
254
+ return False
255
+
256
+ def eval_variable_expression(self, expression, through_parent=True):
257
+ var_name, expr_rest = self.__extract_expression_name(expression)
258
+ var_value = self.get_variable_value(var_name, through_parent=through_parent)
259
+ new_var_name = self.new_local_variable_name(sub_name=self.__regular_variable_name(var_name))
260
+ locals()[new_var_name] = var_value
261
+
262
+ new_expr = f"{new_var_name}{expr_rest}"
263
+ try:
264
+ return eval(new_expr)
265
+ except Exception as exc:
266
+ try:
267
+ var_repr = Tools.represent_object(var_value)
268
+ except:
269
+ var_repr = str(var_value)
270
+ Tools.raise_same_exception_type(exc, f"{exc}\nVariable '{var_name}': {var_repr}", add_from=True)
271
+
272
+ def exec_set_variable_expression(self, expression, value, through_parent=True, log_level=logging.INFO):
273
+ var_name, expr_rest = self.__extract_expression_name(expression)
274
+ var_value = self.get_variable_value(var_name, through_parent=through_parent)
275
+ new_var_name = self.new_local_variable_name(sub_name=self.__regular_variable_name(var_name))
276
+ locals()[new_var_name] = var_value
277
+
278
+ new_var_value = self.new_local_variable_name(sub_name='value')
279
+ locals()[new_var_value] = value
280
+
281
+ new_expr = f"{new_var_name}{expr_rest}={new_var_value}"
282
+ try:
283
+ exec(new_expr)
284
+ except Exception as exc:
285
+ try:
286
+ var_repr = Tools.represent_object(var_value)
287
+ except:
288
+ var_repr = str(var_value)
289
+ # Tools.raise_same_exception_type(exc, f"{exc}\nVariable '{var_name}': {var_repr}", add_from=True)
290
+ raise FunctionalException(f"Failed to set value in variable expression (by exec): {expression}=[{value}] (type: {Typing.get_object_class_fullname(value)})\nVariable '{var_name}': {var_repr}") from exc
291
+ else:
292
+ if Tools.do_log(logger, log_level):
293
+ logger.log(log_level, f"Set value in variable expression (by exec): {expression}=[{value}] (type: {Typing.get_object_class_fullname(value)})")
294
+
295
+ def __regular_variable_name(self, name):
296
+ return "".join([c if re.match(r'\w', c) else '_' for c in name])
297
+
298
+ # def set_variable_expression(self, expression, value):
299
+ # var_name, expr_rest = self.__extract_expression_name(expression)
300
+ # if len(expr_rest) == 0:
301
+ # self.register_variable(expression, value)
302
+ # else:
303
+ # var_value = self.get_variable_value(var_name)
304
+ #
305
+ # while len(expr_rest) > 0:
306
+ #
307
+
308
+
309
+ def __extract_expression_name(self, expression):
310
+ regex_name = re.compile("^([^.[]+)(.*)")
311
+ m = regex_name.match(expression)
312
+ if not m:
313
+ raise SyntaxError(f"Expression [{expression}] is not a variable expression")
314
+ var_name, expr_rest = m.group(1), m.group(2)
315
+ var_name = self.evaluate_variable_name(var_name)
316
+ return var_name, expr_rest
317
+
318
+
319
+
320
+
321
+
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ #################################################
4
+ # HolAdo (Holistic Automation do)
5
+ #
6
+ # (C) Copyright 2021-2025 by Eric Klumpp
7
+ #
8
+ # 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:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11
+
12
+ # 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.
13
+ #################################################
14
+
15
+
16
+ from .common.tools.variable_convert_steps import *
17
+ from .common.tools.variable_new_steps import *
18
+ from .common.tools.variable_steps import *
19
+ from .common.tools.variable_verify_steps import *
20
+ from .scenario.function_steps import *
21
+ from .scenario.if_steps import *
22
+ from .scenario.loop_steps import *
@@ -0,0 +1,158 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ #################################################
4
+ # HolAdo (Holistic Automation do)
5
+ #
6
+ # (C) Copyright 2021-2025 by Eric Klumpp
7
+ #
8
+ # 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:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11
+
12
+ # 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.
13
+ #################################################
14
+
15
+
16
+ from holado_test.scenario.step_tools import StepTools
17
+ from holado.common.context.session_context import SessionContext
18
+ from holado_test.behave.behave import *
19
+ from holado_core.common.exceptions.functional_exception import FunctionalException
20
+ from holado_core.common.exceptions.technical_exception import TechnicalException
21
+ import base64
22
+ import codecs
23
+ import logging
24
+ from holado_core.common.tables.table import Table
25
+ from holado_value.common.tables.value_table_with_header import ValueTableWithHeader
26
+ from holado_value.common.tables.value_table import ValueTable
27
+ from holado_core.common.tools.tools import Tools
28
+ from holado_python.standard_library.typing import Typing
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ def __get_scenario_context():
34
+ return SessionContext.instance().get_scenario_context()
35
+
36
+ def __get_text_interpreter():
37
+ return __get_scenario_context().get_text_interpreter()
38
+
39
+ def __get_unique_value_manager():
40
+ return SessionContext.instance().unique_value_manager
41
+
42
+ def __get_variable_manager():
43
+ return __get_scenario_context().get_variable_manager()
44
+
45
+
46
+
47
+
48
+
49
+ @Given(r"(?P<var_name>{Variable}) = convert list (?P<list_var_name>{Variable}) to list of object attribute (?P<attribute_name>{Str})")
50
+ def step_impl(context, var_name, list_var_name, attribute_name): # @DuplicatedSignature
51
+ var_name = StepTools.evaluate_variable_name(var_name)
52
+ attr_name = StepTools.evaluate_scenario_parameter(attribute_name)
53
+ list_obj = StepTools.evaluate_variable_value(list_var_name)
54
+
55
+ res = []
56
+ for index, obj in enumerate(list_obj):
57
+ if hasattr(obj, attr_name):
58
+ attr_val = getattr(obj, attr_name)
59
+ if Tools.do_log(logger, logging.DEBUG):
60
+ logger.debug(f"Result list - add attribute value [{attr_val}] (type: {Typing.get_object_class_fullname(attr_val)} ; dir: {dir(attr_val)})")
61
+ res.append(attr_val)
62
+ else:
63
+ raise FunctionalException(f"In list, object of index {index} hasn't attribute '{attr_name}'")
64
+
65
+ __get_variable_manager().register_variable(var_name, res)
66
+
67
+ @Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to string")
68
+ def step_impl(context, var_name, object_value):
69
+ var_name = StepTools.evaluate_variable_name(var_name)
70
+ object_value = StepTools.evaluate_variable_value(object_value)
71
+ if isinstance(object_value, bytes):
72
+ res = object_value.decode('utf-8')
73
+ else:
74
+ res = str(object_value)
75
+ __get_variable_manager().register_variable(var_name, res)
76
+
77
+ @Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to integer")
78
+ def step_impl(context, var_name, object_value):
79
+ var_name = StepTools.evaluate_variable_name(var_name)
80
+ object_value = StepTools.evaluate_variable_value(object_value)
81
+ __get_variable_manager().register_variable(var_name, int(object_value))
82
+
83
+ @Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to list")
84
+ def step_impl(context, var_name, object_value):
85
+ var_name = StepTools.evaluate_variable_name(var_name)
86
+ object_value = StepTools.evaluate_variable_value(object_value)
87
+
88
+ if isinstance(object_value, Table):
89
+ table = object_value
90
+ if table.nb_columns > 1 and table.nb_rows > 1:
91
+ raise FunctionalException(f"Table must have only one column or only one row (table has {table.nb_columns} and {table.nb_rows})")
92
+
93
+ if table.nb_columns > 1 and table.nb_rows == 1:
94
+ row = table.get_row(0)
95
+ elif table.nb_rows > 1 and table.nb_columns == 1:
96
+ row = table.get_column(0)
97
+ else:
98
+ row = None
99
+
100
+ if row is not None:
101
+ if isinstance(table, ValueTable) or isinstance(table, ValueTableWithHeader):
102
+ res = [c.value for c in row]
103
+ else:
104
+ res = [c.content for c in row]
105
+ else:
106
+ res = []
107
+ else:
108
+ res = list(object_value)
109
+
110
+ __get_variable_manager().register_variable(var_name, res)
111
+
112
+ @Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to dict")
113
+ def step_impl(context, var_name, object_value):
114
+ var_name = StepTools.evaluate_variable_name(var_name)
115
+ object_value = StepTools.evaluate_variable_value(object_value)
116
+ __get_variable_manager().register_variable(var_name, dict(object_value))
117
+
118
+ @Step(r"(?P<var_name>{Variable}) = convert object value (?P<object_value>{Str}) to base 64")
119
+ def step_impl(context, var_name, object_value):
120
+ var_name = StepTools.evaluate_variable_name(var_name)
121
+ object_value = StepTools.evaluate_variable_value(object_value)
122
+ if isinstance(object_value, bytes):
123
+ value_bytes = object_value
124
+ elif isinstance(object_value, str):
125
+ value_bytes = object_value.encode('utf-8')
126
+ else:
127
+ raise TechnicalException(f"Unexpected object value type {Typing.get_object_class_fullname(object_value)} (allowed types: string, bytes)")
128
+ res = base64.b64encode(value_bytes)
129
+ __get_variable_manager().register_variable(var_name, res)
130
+
131
+ @Step(r"(?P<var_name>{Variable}) = convert hex string (?P<object_value>{Str}) to bytes")
132
+ def step_impl(context, var_name, object_value):
133
+ var_name = StepTools.evaluate_variable_name(var_name)
134
+ object_value = StepTools.evaluate_scenario_parameter(object_value)
135
+ if isinstance(object_value, str):
136
+ res = codecs.decode(object_value, 'hex_codec')
137
+ else:
138
+ raise TechnicalException(f"Unexpected value type {Typing.get_object_class_fullname(object_value)}")
139
+ __get_variable_manager().register_variable(var_name, res)
140
+
141
+ @Step(r"(?P<var_name>{Variable}) = convert hex string (?P<object_value>{Str}) to base 64")
142
+ def step_impl(context, var_name, object_value):
143
+ var_name = StepTools.evaluate_variable_name(var_name)
144
+ execute_steps(u"""
145
+ {keyword} __{var_name}_BYTES__ = convert hex string {object_value} to bytes
146
+ {keyword} {var_name} = convert object value __{var_name}_BYTES__ to base 64
147
+ """.format(keyword=context.step.keyword, var_name=var_name, object_value=object_value))
148
+
149
+
150
+ @Step(r"(?P<var_name>{Variable}) = convert base 64 (?P<value>{Str}) to bytes")
151
+ def step_impl(context, var_name, value):
152
+ var_name = StepTools.evaluate_variable_name(var_name)
153
+ value = StepTools.evaluate_scenario_parameter(value)
154
+ if not isinstance(value, str):
155
+ raise TechnicalException(f"Unexpected value type {Typing.get_object_class_fullname(value)} (allowed types: string)")
156
+ res = base64.b64decode(value)
157
+ __get_variable_manager().register_variable(var_name, res)
158
+
@@ -0,0 +1,130 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ #################################################
4
+ # HolAdo (Holistic Automation do)
5
+ #
6
+ # (C) Copyright 2021-2025 by Eric Klumpp
7
+ #
8
+ # 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:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11
+
12
+ # 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.
13
+ #################################################
14
+
15
+
16
+ from holado_value.common.tables.value_table_manager import ValueTableManager
17
+ from holado_test.scenario.step_tools import StepTools
18
+ from holado.common.context.session_context import SessionContext
19
+ from holado_test.behave.behave import *
20
+ import logging
21
+ from holado_core.common.exceptions.functional_exception import FunctionalException
22
+ from holado_test.behave.scenario.behave_step_tools import BehaveStepTools
23
+ from holado_value.common.tables.converters.value_table_converter import ValueTableConverter
24
+ from holado_python.standard_library.typing import Typing
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ def __get_scenario_context():
30
+ return SessionContext.instance().get_scenario_context()
31
+
32
+ def __get_text_interpreter():
33
+ return __get_scenario_context().get_text_interpreter()
34
+
35
+ def __get_unique_value_manager():
36
+ return SessionContext.instance().unique_value_manager
37
+
38
+ def __get_variable_manager():
39
+ return __get_scenario_context().get_variable_manager()
40
+
41
+
42
+
43
+
44
+ @Given(r"(?P<var_name>{Variable}) = new (?P<type_name>{Str}) with attributes")
45
+ def step_impl(context, var_name, type_name):
46
+ var_name = StepTools.evaluate_variable_name(var_name)
47
+ type_name = StepTools.evaluate_string_parameter(type_name)
48
+ table = BehaveStepTools.convert_step_table_2_value_table_with_header(context.table)
49
+
50
+ # Get class type
51
+ class_ = Typing.get_class_for_type_name(type_name)
52
+
53
+ # Create object
54
+ obj = class_()
55
+ ValueTableManager.set_object_attributes_according_name_value_table(obj, table)
56
+
57
+ # Store in variable
58
+ __get_variable_manager().register_variable(var_name, obj)
59
+
60
+ @Given(r"(?P<var_name>{Variable}) = new (?P<type_name>{Str}) with constructor parameters")
61
+ def step_impl(context, var_name, type_name): # @DuplicatedSignature
62
+ var_name = StepTools.evaluate_variable_name(var_name)
63
+ type_name = StepTools.evaluate_string_parameter(type_name)
64
+
65
+ # Get class type
66
+ class_ = Typing.get_class_for_type_name(type_name)
67
+
68
+ # Create object
69
+ table = BehaveStepTools.convert_step_table_2_value_table_with_header(context.table)
70
+ unnamed_parameters, named_parameters = ValueTableConverter.convert_name_value_table_2_list_and_dict(table)
71
+ logger.info("creating new '{}' with parameters {} and {}".format(class_, unnamed_parameters, named_parameters))
72
+ obj = class_(*unnamed_parameters, **named_parameters)
73
+
74
+ # Store in variable
75
+ __get_variable_manager().register_variable(var_name, obj)
76
+
77
+ @Given(r"(?P<var_name>{Variable}) = list")
78
+ def step_impl(context, var_name):
79
+ var_name = StepTools.evaluate_variable_name(var_name)
80
+ table = BehaveStepTools.convert_step_table_2_value_table(context.table)
81
+ if table.nb_columns > 1 and table.nb_rows > 1:
82
+ raise FunctionalException("Table must be a single column or a single row")
83
+
84
+ if table.nb_rows > 1:
85
+ res = list(table.get_column(0).cells_value)
86
+ else:
87
+ res = list(table.get_row(0).cells_value)
88
+
89
+ # Store in variable
90
+ __get_variable_manager().register_variable(var_name, res)
91
+
92
+ @Given(r"(?P<var_name>{Variable}) = multiline text")
93
+ def step_impl(context, var_name):
94
+ var_name = StepTools.evaluate_variable_name(var_name)
95
+ res = BehaveStepTools.get_step_multiline_text(context)
96
+ __get_variable_manager().register_variable(var_name, res)
97
+
98
+ @Given(r"(?P<var_name>{Variable}) = new unique integer")
99
+ def step_impl(context, var_name):
100
+ var_name = StepTools.evaluate_variable_name(var_name)
101
+ res = __get_unique_value_manager().new_integer()
102
+ __get_variable_manager().register_variable(var_name, res)
103
+
104
+ @Given(r"(?P<var_name>{Variable}) = new unique HEX integer")
105
+ def step_impl(context, var_name):
106
+ var_name = StepTools.evaluate_variable_name(var_name)
107
+ res = __get_unique_value_manager().new_hex()
108
+ __get_variable_manager().register_variable(var_name, res)
109
+
110
+ @Given(r"(?P<var_name>{Variable}) = new unique HEX integer \(length: (?P<length>{Int})\)")
111
+ def step_impl(context, var_name, length):
112
+ var_name = StepTools.evaluate_variable_name(var_name)
113
+ length = StepTools.evaluate_scenario_parameter(length)
114
+ res = __get_unique_value_manager().new_hex(length=length)
115
+ __get_variable_manager().register_variable(var_name, res)
116
+
117
+ @Given(r"(?P<var_name>{Variable}) = new unique string")
118
+ def step_impl(context, var_name):
119
+ var_name = StepTools.evaluate_variable_name(var_name)
120
+ res = __get_unique_value_manager().new_string()
121
+ __get_variable_manager().register_variable(var_name, res)
122
+
123
+ @Given(r"(?P<var_name>{Variable}) = new unique string \(padding length: (?P<pad_len>{Int})\)")
124
+ def step_impl(context, var_name, pad_len):
125
+ var_name = StepTools.evaluate_variable_name(var_name)
126
+ pad_len = StepTools.evaluate_scenario_parameter(pad_len)
127
+ res = __get_unique_value_manager().new_string(padding_length=pad_len)
128
+ __get_variable_manager().register_variable(var_name, res)
129
+
130
+