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,31 @@
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
+ def dependencies():
17
+ """
18
+ Return None or the list of names of modules it depend on
19
+ """
20
+ return None
21
+
22
+ def register():
23
+ """
24
+ Register the services of this module
25
+ """
26
+ # from holado.common.context.session_context import SessionContext
27
+
28
+ # from holado_xxx.xxx import XXXManager
29
+ # SessionContext.instance().services.register_service_type("xxx_manager", XXXManager)
30
+ pass
31
+
@@ -0,0 +1,16 @@
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 .xxx import *
@@ -0,0 +1,16 @@
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 .xxx import *
@@ -0,0 +1,109 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ from builtins import super
15
+ import logging
16
+ from holado_test.behave.behave_function import BehaveFunction
17
+ from typing import Dict, Union
18
+ from holado_core.common.tools.tools import Tools
19
+ from holado_core.common.actors.actions import Action
20
+ from holado_core.common.exceptions.technical_exception import TechnicalException
21
+ from holado_python.standard_library.typing import Typing
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class ActionInfo(object):
27
+ def __init__(self, uid:str, action:str, params:Dict[str, Union[str,int]], static_params:Dict[str, Union[str,int]], index:int):
28
+ self.uid = uid
29
+ self.action = action
30
+ self.params = params
31
+ self.static_params = static_params
32
+ self.index = index
33
+
34
+ def __str__(self)->str:
35
+ return f"{Typing.get_object_class_fullname(self)}({self.__dict__})"
36
+
37
+ class BehaveActionInfo(ActionInfo):
38
+ def __init__(self, uid:str, action:str, params:Dict[str, Union[str,int]], static_params:Dict[str, Union[str,int]], index:int, behave_args:str):
39
+ super().__init__(uid, action, params, static_params, index)
40
+ self.behave_args = behave_args
41
+
42
+
43
+ class FeaturesBehaveAction(Action):
44
+ '''Behave action running features.
45
+ The features to execute are defined by parameter behave_args.
46
+
47
+ It is possible to pass arguments to the features, by writing the scenarios with expected variables.
48
+ At execution, given parameter 'variable_values' must define expected variable values.
49
+ '''
50
+
51
+ def __init__(self, behave_args, variable_manager):
52
+ # Method execute is overriden and doesn't use a method reference, thus parameter func_execute is None
53
+ super().__init__("behave", None)
54
+ self.__behave_function = BehaveFunction(behave_args)
55
+ self.__variable_manager = variable_manager
56
+
57
+ def execute(self, variable_values=None):
58
+ """Execute features with given variable values.
59
+ """
60
+ if variable_values is not None and not isinstance(variable_values, dict):
61
+ raise TechnicalException(f"Parameter 'variable_values' must be a dict")
62
+
63
+ if variable_values:
64
+ for key, value in variable_values.items():
65
+ self.__variable_manager.register_variable(key, value)
66
+
67
+ try:
68
+ return self.__behave_function.run()
69
+ except Exception as exc:
70
+ raise TechnicalException(f"Execution of features with behave failed: {exc}") from exc
71
+
72
+
73
+ class BehaveActionRunner():
74
+ '''
75
+ Behave action runner.
76
+ Return True if succeeded
77
+ '''
78
+
79
+ def __init__(self, action_info, variable_manager):
80
+ self.__action = FeaturesBehaveAction(action_info.behave_args, variable_manager)
81
+ self.__action_info = action_info
82
+
83
+ def run(self):
84
+ logger.info(f"Processing action '{self.__action_info.action}' of index {self.__action_info.index}: {self.__action_info.params}")
85
+ if Tools.do_log(logger, logging.DEBUG):
86
+ logger.debug(f"Running behave with arguments '{self.__action_info.behave_args}' on action of index {self.__action_info.index}: {self.__action_info.params}")
87
+
88
+ variable_values = {}
89
+ if self.__action_info.static_params:
90
+ for key, value in self.__action_info.static_params.items():
91
+ variable_values[key] = value
92
+ if self.__action_info.params:
93
+ for key, value in self.__action_info.params.items():
94
+ if key == 'STATUS':
95
+ continue
96
+ variable_values[key] = value
97
+
98
+ logger.info(f"Launching behave with arguments: {self.__action_info.behave_args}")
99
+ res = self.__action.execute(variable_values)
100
+ logger.info(f"behave finished with result: {res}")
101
+
102
+ if res:
103
+ logger.print(f"Success of action '{self.__action_info.action}' on action of index {self.__action_info.index}: {self.__action_info.params}")
104
+ else:
105
+ logger.error(f"Action '{self.__action_info.action}' failed on action of index {self.__action_info.index}: {self.__action_info.params}")
106
+
107
+ return res
108
+
109
+
@@ -0,0 +1,477 @@
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
+ # This file is a helper to build scripts using HolAdo solution, with CSV files as input.
16
+ # Usually, it is copied and adapted for specific usage.
17
+
18
+
19
+ import logging
20
+ import copy
21
+ from holado_helper.script.input_output_script import InputOutputScript
22
+ from holado_core.common.exceptions.verify_exception import VerifyException
23
+ from holado_core.common.exceptions.functional_exception import FunctionalException
24
+ from holado_python.standard_library.typing import Typing
25
+ from holado_helper.script.action import ActionInfo
26
+ from holado_core.common.actors.actor import Actor
27
+ from holado_core.common.exceptions.technical_exception import TechnicalException
28
+ from holado_python.common.tools.datetime import DateTime
29
+ from holado.common.handlers.object import Object
30
+ from holado.common.handlers.undefined import undefined_argument
31
+ from holado_helper.script.job import Job
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ class ActionScriptFile():
37
+ def __init__(self, file_ext):
38
+ super().__init__()
39
+ self.__file_ext = file_ext
40
+
41
+ @property
42
+ def file_extension(self):
43
+ return self.__file_ext
44
+
45
+ def read_jobs(self, file_path, action_script):
46
+ pass
47
+
48
+ def write_jobs(self, file_path, jobs, action_script):
49
+ pass
50
+
51
+
52
+
53
+ class ActionRegistry(Object):
54
+ def __init__(self, name):
55
+ super().__init__(name)
56
+
57
+ self.__actions = {}
58
+
59
+ def register_action(self, action, parameters_default_values=None, parameters_replacements=None, static_parameters_values=None, **kwargs):
60
+ """ Register new action
61
+ @param action: Action name
62
+ @param parameters_default_values: define parameters default values (format: list of 2-uplets (parameter name, default value))
63
+ @param parameters_replacements: define values automatic replacements (format: dictionary of {parameter name: List of 2-uplets (alias value, replacement value)})
64
+ @param static_parameters_values: fixed parameter values known at action registration (format: dictonary of {parameter name: parameter value})
65
+ @param kwargs: any other action arguments
66
+ """
67
+ action_kwargs = {
68
+ 'parameters_default_values': parameters_default_values,
69
+ 'parameters_replacements': parameters_replacements,
70
+ 'static_parameters_values': static_parameters_values
71
+ }
72
+ action_kwargs.update(kwargs)
73
+ self.__actions[action] = action_kwargs
74
+ logger.info(f"[{self.name}] Registered action '{action}'")
75
+
76
+ def get_action_names(self):
77
+ return list(self.__actions.keys())
78
+
79
+ def get_action_parameter_names(self, action):
80
+ parameters_default_values = self.get_action_kwargs(action)['parameters_default_values']
81
+ return [p[0] for p in parameters_default_values]
82
+
83
+ def get_action_parameters_default_values(self, action):
84
+ return self.get_action_kwargs(action)['parameters_default_values']
85
+
86
+ def get_action_parameters_replacements(self, action):
87
+ return self.get_action_kwargs(action)['parameters_replacements']
88
+
89
+ def get_action_static_parameters_values(self, action):
90
+ return self.get_action_kwargs(action)['static_parameters_values']
91
+
92
+ def get_action_kwargs(self, action):
93
+ if action in self.__actions:
94
+ return self.__actions[action]
95
+ else:
96
+ raise TechnicalException(f"No registered action '{action}'")
97
+
98
+
99
+
100
+
101
+ class ActionScriptActor(Actor):
102
+ def __init__(self, module_name, action_registry=None):
103
+ super().__init__(module_name)
104
+ self.__action_registry = action_registry
105
+
106
+ @property
107
+ def action_registry(self):
108
+ return self.__action_registry
109
+
110
+ @action_registry.setter
111
+ def action_registry(self, action_registry):
112
+ self.__action_registry = action_registry
113
+
114
+ def act_process_action(self, action_info, action_script):
115
+ raise NotImplementedError()
116
+
117
+
118
+ class ActionScript(InputOutputScript):
119
+ def __init__(self, work_dir_path=None, with_input=True, with_output=True, with_template=True, with_action_parameter=True,
120
+ actor=None, action_registry=None, script_file=None):
121
+ super().__init__(work_dir_path=work_dir_path, with_input=with_input, with_output=with_output, with_template=with_template)
122
+
123
+ self.__actor = actor
124
+ self.__action_registry = action_registry if action_registry is not None else ActionRegistry("default")
125
+ self.__script_file = script_file
126
+ self.__with_action_parameter = with_action_parameter
127
+
128
+ # Post process
129
+ if self.__actor and self.__actor.action_registry is None:
130
+ self.__actor.action_registry = self.__action_registry
131
+
132
+ @property
133
+ def actor(self):
134
+ return self.__actor
135
+
136
+ @property
137
+ def action_registry(self):
138
+ return self.__action_registry
139
+
140
+ @property
141
+ def script_file(self):
142
+ return self.__script_file
143
+
144
+ @property
145
+ def with_action_parameter(self):
146
+ return self.__with_action_parameter
147
+
148
+ def get_description(self, script_command, short_description, action):
149
+ return """{short_description}
150
+
151
+ Usage:
152
+ 1. Generate a template file for the desired action with parameter '--output-template' as in example 1.
153
+ It is possible to specify the name of the output file with parameter '-o'.
154
+ 2. Copy the template line in order to have one line per action to do, and modify the template file with desired values.
155
+ 3. Process actions described in a CSV file with parameter '-i'.
156
+ If an error occurs at a line, execution is stopped.
157
+ 4. See result in output file. If parameter '-o' is not specified, the output filename is generated from parameter '-i'.
158
+
159
+ In template files, a default value is set in each column.
160
+ For columns with enum values, the default value is a combination of each possible enum values separated by a '|', but only one value is possible.
161
+
162
+
163
+ In input and output files, the first column 'STATUS' describes the status of execution of each line:
164
+ - 'TODO' (or ''): the line is to process (in output file, it means that execution was stopped on an error with a previous line)
165
+ - 'SUCCESS': the line was in success
166
+ - 'ERROR': the line was in error
167
+ - others: the line is not processed, you can specify your own status to skip this line
168
+ In template files, this column is automatically initialized with status 'TODO'.
169
+ Any output file can be used as input file, the lines that are in status 'ERROR' or 'TODO' will be processed again.
170
+
171
+ Example 1: Output CSV template for action '{action}'
172
+
173
+ {script_command} {action} --output-template -o {action}.csv
174
+
175
+ Example 2: Process action '{action}' with given input CSV
176
+
177
+ {script_command} {action} -i {action}.csv
178
+ """.format(short_description=short_description, script_command=script_command, action=action)
179
+
180
+ def _new_argument_parser(self, description=None, additional_arguments=None, add_help=True):
181
+ parser = super()._new_argument_parser(description=description, additional_arguments=additional_arguments, add_help=add_help)
182
+
183
+ if self.__with_action_parameter:
184
+ parser.add_argument('action', choices=self.possible_actions(), default=None, help='Action name')
185
+
186
+ return parser
187
+
188
+ def is_matching_file_path(self, file_path, raise_exception=False):
189
+ file_ext = self.script_file.file_extension.lower()
190
+ res = file_path.lower().endswith(file_ext)
191
+
192
+ if not res and raise_exception:
193
+ raise VerifyException(f"File path doesn't end by {file_ext} (case insensitive)")
194
+ return res
195
+
196
+ def is_matching_action(self, action, raise_exception=False):
197
+ """Return if action is matching this action script
198
+ """
199
+ res = action in self.possible_actions()
200
+
201
+ if not res and raise_exception:
202
+ raise VerifyException(f"Action '{action}' doesn't match this script (possible actions: {self.possible_actions()})")
203
+ return res
204
+
205
+ def is_matching_action_and_input_file_path(self, action, file_path, raise_exception=False):
206
+ """Return if action and associated input file are matching this action script
207
+ """
208
+ return self.is_matching_action(action, raise_exception) \
209
+ and self.is_matching_input_file_path(file_path, raise_exception=raise_exception)
210
+
211
+ def is_matching_action_and_output_file_path(self, action, file_path, raise_exception=False):
212
+ """Return if action and associated output file are matching this action script
213
+ """
214
+ return self.is_matching_action(action, raise_exception) \
215
+ and self.is_matching_output_file_path(file_path, raise_exception=raise_exception)
216
+
217
+ def _build_output_template_path(self):
218
+ if self.with_action_parameter:
219
+ default_path = f"{self.args.action}_template{self.script_file.file_extension}"
220
+ else:
221
+ default_path = None
222
+
223
+ try:
224
+ return self._build_output_path(self.args.output_filename, default_path, self.user_working_dir)
225
+ except Exception:
226
+ raise FunctionalException(f"[{Typing.get_object_class_fullname(self)}] Please define output template file path")
227
+
228
+ def possible_actions(self):
229
+ raise NotImplementedError
230
+
231
+ def build_template_jobs(self):
232
+ if self.with_action_parameter:
233
+ action = self.args.action
234
+ params_default_values = self.action_registry.get_action_parameters_default_values(action)
235
+ params = {pdv[0]:pdv[1] for pdv in params_default_values}
236
+ # Note: for templates, add static parameters is not needed
237
+ actions = [self.new_action_info(action, params=params)]
238
+ job = Job(actions=actions, in_parallel=False)
239
+ return [job]
240
+ else:
241
+ raise NotImplementedError()
242
+
243
+ def process_jobs(self, list_jobs):
244
+ res = []
245
+ got_error = False
246
+
247
+ for job in list_jobs:
248
+ if got_error:
249
+ res.append(job)
250
+ continue
251
+
252
+ res_job, got_error = self.process_job(job)
253
+ res.append(res_job)
254
+
255
+ return res, got_error
256
+
257
+ def process_job(self, job):
258
+ return self.process_actions(job.actions, job.in_parallel)
259
+
260
+ def new_action_info_from_args(self):
261
+ action = self.args.action
262
+ static_params = self.action_registry.get_action_static_parameters_values(action)
263
+ return self.new_action_info(action, static_params=static_params)
264
+
265
+ def new_action_info(self, action, uid=None, params=None, static_params=None, index=0):
266
+ processing_params = self.build_processing_action_params(action, action_args=self.args if self.with_action_parameter else None, action_params=params)
267
+ if uid is None:
268
+ dt_str = DateTime.datetime_2_str(DateTime.utcnow())
269
+ uid = f"{dt_str} - {action} - {processing_params}"
270
+ return ActionInfo(uid=uid, action=action, params=processing_params, static_params=static_params, index=index)
271
+
272
+ def build_processing_action_params(self, action, action_args=None, action_params=None, **kwargs): # @UnusedVariable
273
+ if action_params is not None:
274
+ return dict(action_params)
275
+ else:
276
+ return None
277
+
278
+ def process_actions(self, list_action_info, in_parallel):
279
+ if in_parallel:
280
+ return self._process_actions_parallel(list_action_info)
281
+ else:
282
+ return self._process_actions_serial(list_action_info)
283
+
284
+ def _process_actions_serial(self, list_action_info):
285
+ logger.info(f"Processing {len(list_action_info)} actions in serial mode")
286
+ res = []
287
+ got_error = False
288
+
289
+ for action_info in list_action_info:
290
+ action_status = action_info.params['STATUS'] if 'STATUS' in action_info.params else 'TODO'
291
+ res_action = copy.deepcopy(action_info)
292
+
293
+ if not got_error and action_status in ['TODO', 'ERROR']:
294
+ action_status = self.process_action(action_info)
295
+ got_error |= (action_status == 'ERROR')
296
+ elif got_error:
297
+ logger.info(f"Skip action of index {action_info.index} since a previous action has failed")
298
+ else:
299
+ logger.info(f"Skip action of index {action_info.index} since its statud is '{action_status}'")
300
+
301
+ res_action.params['STATUS'] = action_status
302
+ res.append(res_action)
303
+
304
+ return res, got_error
305
+
306
+ def _process_actions_parallel(self, list_action_info):
307
+ from holado_multitask.multiprocessing.function_process import FunctionProcess
308
+
309
+ logger.info(f"Processing {len(list_action_info)} actions in parallel mode")
310
+ res = []
311
+ got_error = False
312
+ processes = []
313
+
314
+ # Start all processes
315
+ for action_info in list_action_info:
316
+ action_status = action_info.params['STATUS'] if 'STATUS' in action_info.params else 'TODO'
317
+ res_action = copy.deepcopy(action_info)
318
+
319
+ if action_status in ['TODO', 'ERROR']:
320
+ proc = FunctionProcess(self.process_action, args=[action_info], name=f"Process action of index {action_info.index}")
321
+ proc.start()
322
+ processes.append((action_info, proc))
323
+
324
+ res_action.params['STATUS'] = action_status
325
+ res.append(res_action)
326
+
327
+ # Join all processes
328
+ for _, proc in processes:
329
+ proc.join()
330
+
331
+ # Update result
332
+ for action_info, proc in processes:
333
+ if proc.error is not None:
334
+ logger.error(f"Error when processing action of index {action_info.index}: {proc.error}")
335
+ action_status = 'ERROR'
336
+ if proc.result is not None:
337
+ action_status = proc.result
338
+
339
+ res[action_info.index].params['STATUS'] = action_status
340
+ got_error |= (action_status == 'ERROR')
341
+
342
+ return res, got_error
343
+
344
+ def _apply_replacements_on_action_params(self, action_params, params_replacements):
345
+ from holado_core.common.tools.tools import Tools
346
+
347
+ res = dict(action_params)
348
+
349
+ for key in action_params:
350
+ value = action_params[key]
351
+ if key in params_replacements:
352
+ if Tools.do_log(logger, logging.DEBUG):
353
+ logger.debug(f"Checking replacable value '{key}'")
354
+ for value_replaced, replacement in params_replacements[key]:
355
+ value_comp = value.lower() if isinstance(value, str) else value
356
+ value_replaced_comp = value_replaced.lower() if isinstance(value_replaced, str) else value_replaced
357
+ if Tools.do_log(logger, logging.DEBUG):
358
+ logger.debug(f"Evaluating value '{value_comp}' to '{value_replaced_comp}'. Value for '{key}' replaced by '{replacement}' if equals")
359
+ if value_comp == value_replaced_comp:
360
+ if Tools.do_log(logger, logging.DEBUG):
361
+ logger.debug(f"Value for '{key}' replaced by '{replacement}'")
362
+ value = replacement
363
+ break
364
+ res[key] = value
365
+
366
+ return res
367
+
368
+ def process_action(self, action_info):
369
+ if self.actor:
370
+ return self.actor.act_process_action(action_info, self).execute()
371
+ else:
372
+ raise NotImplementedError()
373
+
374
+ def read_jobs(self, input_path):
375
+ res = self.script_file.read_jobs(input_path, self)
376
+
377
+ # Verify action parameter names
378
+ self._verify_jobs_actions_parameters(res)
379
+
380
+ # Replace action parameters if needed
381
+ self._replace_jobs_actions_parameters(res)
382
+
383
+ return res
384
+
385
+ def _verify_jobs_actions_parameters(self, jobs):
386
+ for job in jobs:
387
+ for action_info in job.actions:
388
+ self._verify_action_parameters(action_info)
389
+
390
+ def _verify_action_parameters(self, action_info):
391
+ ai_param_names = set(action_info.params.keys())
392
+ expected_param_names = set(self.action_registry.get_action_parameter_names(action_info.action))
393
+ difference = ai_param_names.symmetric_difference(expected_param_names)
394
+ # Note: parameter 'STATUS' is added in action result and is possibly present in input
395
+ if len(difference) > 0 and difference != {'STATUS'}:
396
+ raise FunctionalException(
397
+ f"""Unexpected action parameter names for action '{action_info.action}':
398
+ obtained names: {ai_param_names}
399
+ expected names: {expected_param_names}""")
400
+
401
+ def _replace_jobs_actions_parameters(self, jobs):
402
+ for job in jobs:
403
+ for action_info in job.actions:
404
+ self._replace_action_parameters(action_info)
405
+
406
+ def _replace_action_parameters(self, action_info):
407
+ from holado_core.common.tools.tools import Tools
408
+
409
+ # Process replacements defined in action registry
410
+ params_replacements = self.action_registry.get_action_parameters_replacements(action_info.action)
411
+ if params_replacements:
412
+ for param_name in action_info.params:
413
+ value = action_info.params[param_name]
414
+ if param_name in params_replacements:
415
+ new_value = undefined_argument
416
+ if Tools.do_log(logger, logging.DEBUG):
417
+ logger.debug(f"Checking replacable value '{param_name}'")
418
+ for value_replaced, replacement in params_replacements[param_name]:
419
+ value_comp = value.lower() if isinstance(value, str) else value
420
+ value_replaced_comp = value_replaced.lower() if isinstance(value_replaced, str) else value_replaced
421
+ if Tools.do_log(logger, logging.DEBUG):
422
+ logger.trace(f"Comparing value '{value_comp}' to '{value_replaced_comp}'. Value for parameter '{param_name}' replaced by '{replacement}' if equals")
423
+ if value_comp == value_replaced_comp:
424
+ new_value = replacement
425
+ break
426
+ if new_value is not undefined_argument:
427
+ if Tools.do_log(logger, logging.DEBUG):
428
+ logger.debug(f"For parameter '{param_name}', value '{value}' is replaced by '{new_value}'")
429
+ action_info.params[param_name] = new_value
430
+
431
+ def write_jobs(self, output_path, result_jobs, got_error):
432
+ output_path_base, _, output_ext = self._build_output_path_base(output_path)
433
+ if got_error is not None:
434
+ if got_error:
435
+ output_base = f"{output_path_base}-FAIL"
436
+ else:
437
+ output_base = f"{output_path_base}-SUCCESS"
438
+ else:
439
+ output_base = output_path_base
440
+ real_output_path = self._build_output_path_from_base(output_base, output_ext)
441
+
442
+ self.script_file.write_jobs(real_output_path, result_jobs, self)
443
+
444
+ return real_output_path
445
+
446
+ def run_script(self):
447
+ if self.with_template and self.args.output_template:
448
+ output_path = self._build_output_template_path()
449
+ template_jobs = self.build_template_jobs()
450
+ real_output_path = self.write_jobs(output_path, template_jobs, got_error=None)
451
+ logger.print(f"Template created in file '{real_output_path}'")
452
+ elif self.with_input and self.args.input_filename:
453
+ # Read file
454
+ input_path = self._build_input_path(self.args.input_filename, self.user_working_dir)
455
+ list_jobs = self.read_jobs(input_path)
456
+
457
+ # Process jobs
458
+ result_jobs, got_error = self.process_jobs(list_jobs)
459
+
460
+ # Write file
461
+ if self.with_output and self.args.output_filename is not None:
462
+ output_path = self._build_output_path(self.args.output_filename, self.args.input_filename, self.user_working_dir)
463
+ real_output_path = self.write_jobs(output_path, result_jobs, got_error)
464
+ logger.print(f"Result outputed in file '{real_output_path}'")
465
+ else:
466
+ action_info = self.new_action_info_from_args()
467
+ result_action = self.process_action(action_info)
468
+ result_jobs=[{'actions': [result_action]}]
469
+
470
+ # Write file
471
+ if self.with_output and self.args.output_filename is not None:
472
+ output_path = self._build_output_path(self.args.output_filename, None, self.user_working_dir)
473
+ real_output_path = self.write_jobs(output_path, result_jobs)
474
+ logger.print(f"Result outputed in file '{real_output_path}'")
475
+
476
+
477
+