holado 0.2.2__py3-none-any.whl → 0.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of holado might be problematic. Click here for more details.

Files changed (524) hide show
  1. holado/__init__.py +11 -1
  2. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/METADATA +13 -9
  3. holado-0.2.4.dist-info/RECORD +535 -0
  4. holado_ais/__init__.py +33 -0
  5. holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
  6. holado_ais/ais/ais_manager.py +151 -0
  7. holado_ais/ais/ais_messages.py +204 -0
  8. holado_ais/ais/ais_payload.py +35 -0
  9. holado_ais/ais/enums.py +37 -0
  10. holado_ais/ais/patch_pyais.py +1303 -0
  11. holado_ais/tests/behave/steps/__init__.py +17 -0
  12. holado_ais/tests/behave/steps/ais/__init__.py +0 -0
  13. holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
  14. holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
  15. holado_binary/__init__.py +17 -0
  16. holado_binary/ipc/binary.py +125 -0
  17. holado_binary/ipc/bit_series.py +307 -0
  18. holado_binary/tests/behave/steps/__init__.py +17 -0
  19. holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
  20. holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
  21. holado_context/__init__.py +16 -0
  22. holado_context/tests/behave/steps/__init__.py +16 -0
  23. holado_context/tests/behave/steps/private/__init__.py +16 -0
  24. holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
  25. holado_core/__init__.py +32 -0
  26. holado_core/common/__init__.py +0 -0
  27. holado_core/common/actors/actions.py +97 -0
  28. holado_core/common/actors/actor.py +226 -0
  29. holado_core/common/actors/element_actor.py +32 -0
  30. holado_core/common/actors/find_actor.py +106 -0
  31. holado_core/common/actors/tree_actor.py +32 -0
  32. holado_core/common/actors/verify_actions.py +69 -0
  33. holado_core/common/block/base.py +122 -0
  34. holado_core/common/block/block_manager.py +173 -0
  35. holado_core/common/block/block_method.py +46 -0
  36. holado_core/common/block/block_steps.py +37 -0
  37. holado_core/common/block/function.py +42 -0
  38. holado_core/common/block/scope_function.py +28 -0
  39. holado_core/common/block/scope_manager.py +238 -0
  40. holado_core/common/block/scope_steps.py +141 -0
  41. holado_core/common/criterias/and_criteria.py +61 -0
  42. holado_core/common/criterias/criteria.py +78 -0
  43. holado_core/common/criterias/or_criteria.py +64 -0
  44. holado_core/common/criterias/tools/criteria_context.py +20 -0
  45. holado_core/common/criterias/tools/criteria_parameters.py +18 -0
  46. holado_core/common/drivers/driver.py +153 -0
  47. holado_core/common/drivers/element_driver.py +30 -0
  48. holado_core/common/drivers/element_internal_api.py +239 -0
  49. holado_core/common/drivers/internal_api.py +40 -0
  50. holado_core/common/drivers/tree_driver.py +30 -0
  51. holado_core/common/drivers/tree_internal_api.py +176 -0
  52. holado_core/common/exceptions/__init__.py +0 -0
  53. holado_core/common/exceptions/element_exception.py +28 -0
  54. holado_core/common/exceptions/exceptions.py +24 -0
  55. holado_core/common/exceptions/functional_exception.py +21 -0
  56. holado_core/common/exceptions/holado_exception.py +25 -0
  57. holado_core/common/exceptions/technical_exception.py +27 -0
  58. holado_core/common/exceptions/timeout_exception.py +20 -0
  59. holado_core/common/exceptions/verify_exception.py +20 -0
  60. holado_core/common/finders/after_in_tree_finder.py +87 -0
  61. holado_core/common/finders/element_finder.py +60 -0
  62. holado_core/common/finders/else_finder.py +105 -0
  63. holado_core/common/finders/finder.py +478 -0
  64. holado_core/common/finders/or_finder.py +98 -0
  65. holado_core/common/finders/then_finder.py +157 -0
  66. holado_core/common/finders/tools/enums.py +30 -0
  67. holado_core/common/finders/tools/find_builder.py +118 -0
  68. holado_core/common/finders/tools/find_context.py +405 -0
  69. holado_core/common/finders/tools/find_info.py +27 -0
  70. holado_core/common/finders/tools/find_parameters.py +240 -0
  71. holado_core/common/finders/tools/find_updater.py +95 -0
  72. holado_core/common/finders/tools/finder_info.py +26 -0
  73. holado_core/common/finders/tree_finder.py +146 -0
  74. holado_core/common/handlers/__init__.py +0 -0
  75. holado_core/common/handlers/abstracts/base_redo.py +695 -0
  76. holado_core/common/handlers/abstracts/get_or_create.py +120 -0
  77. holado_core/common/handlers/element_holder.py +122 -0
  78. holado_core/common/handlers/enums.py +23 -0
  79. holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
  80. holado_core/common/handlers/features/resource_by_name.py +187 -0
  81. holado_core/common/handlers/features/resource_by_type.py +174 -0
  82. holado_core/common/handlers/redo.py +119 -0
  83. holado_core/common/handlers/wait.py +127 -0
  84. holado_core/common/inspectors/element_inspector.py +57 -0
  85. holado_core/common/inspectors/inspector.py +221 -0
  86. holado_core/common/inspectors/tools/inspect_builder.py +169 -0
  87. holado_core/common/inspectors/tools/inspect_context.py +69 -0
  88. holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
  89. holado_core/common/inspectors/tree_inspector.py +73 -0
  90. holado_core/common/resource/persisted_data_manager.py +113 -0
  91. holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
  92. holado_core/common/resource/resource_manager.py +143 -0
  93. holado_core/common/tables/__init__.py +1 -0
  94. holado_core/common/tables/comparators/__init__.py +0 -0
  95. holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
  96. holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
  97. holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
  98. holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
  99. holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
  100. holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
  101. holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
  102. holado_core/common/tables/comparators/string_table_comparator.py +29 -0
  103. holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
  104. holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
  105. holado_core/common/tables/comparators/table_comparator.py +209 -0
  106. holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
  107. holado_core/common/tables/comparators/table_row_comparator.py +116 -0
  108. holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
  109. holado_core/common/tables/converters/__init__.py +0 -0
  110. holado_core/common/tables/converters/table_converter.py +194 -0
  111. holado_core/common/tables/enums.py +23 -0
  112. holado_core/common/tables/table.py +261 -0
  113. holado_core/common/tables/table_cell.py +126 -0
  114. holado_core/common/tables/table_manager.py +366 -0
  115. holado_core/common/tables/table_row.py +169 -0
  116. holado_core/common/tables/table_with_header.py +236 -0
  117. holado_core/common/tools/__init__.py +0 -0
  118. holado_core/common/tools/comparators/comparator.py +151 -0
  119. holado_core/common/tools/comparators/object_comparator.py +21 -0
  120. holado_core/common/tools/converters/converter.py +107 -0
  121. holado_core/common/tools/path_manager.py +185 -0
  122. holado_core/common/tools/string_tools.py +135 -0
  123. holado_core/common/tools/tools.py +172 -0
  124. holado_core/common/transport/__init__.py +0 -0
  125. holado_core/common/transport/crc.py +40 -0
  126. holado_core/tests/behave/steps/__init__.py +20 -0
  127. holado_core/tests/behave/steps/common/__init__.py +0 -0
  128. holado_core/tests/behave/steps/common/common_steps.py +136 -0
  129. holado_core/tests/behave/steps/common/config_steps.py +42 -0
  130. holado_core/tests/behave/steps/common/resource_steps.py +62 -0
  131. holado_core/tests/behave/steps/common/tables_steps.py +537 -0
  132. holado_core/tools/__init__.py +0 -0
  133. holado_core/tools/abstracts/__init__.py +0 -0
  134. holado_core/tools/abstracts/blocking_command_service.py +56 -0
  135. holado_core/tools/abstracts/service.py +48 -0
  136. holado_data/__init__.py +31 -0
  137. holado_data/data/generator/base.py +93 -0
  138. holado_data/data/generator/python_generator.py +30 -0
  139. holado_data/tests/behave/steps/__init__.py +17 -0
  140. holado_data/tests/behave/steps/data/generator_steps.py +91 -0
  141. holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
  142. holado_db/__init__.py +32 -0
  143. holado_db/tests/behave/steps/__init__.py +18 -0
  144. holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
  145. holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
  146. holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
  147. holado_db/tools/db/clients/base/db_client.py +206 -0
  148. holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
  149. holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
  150. holado_db/tools/db/db_manager.py +109 -0
  151. holado_db/tools/db/query/base/query_builder.py +87 -0
  152. holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
  153. holado_db/tools/db/query/query_manager.py +77 -0
  154. holado_docker/__init__.py +25 -0
  155. holado_docker/sdk/docker/docker_client.py +268 -0
  156. holado_docker/sdk/docker/docker_service.py +71 -0
  157. holado_docker/tests/behave/steps/__init__.py +16 -0
  158. holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
  159. holado_docker/tools/docker_controler/__init__.py +26 -0
  160. holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
  161. holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
  162. holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
  163. holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
  164. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
  165. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
  166. holado_grpc/__init__.py +32 -0
  167. holado_grpc/api/rpc/TODO.txt +4 -0
  168. holado_grpc/api/rpc/grpc_client.py +181 -0
  169. holado_grpc/api/rpc/grpc_manager.py +81 -0
  170. holado_grpc/ipc/rpc/__init__.py +0 -0
  171. holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
  172. holado_grpc/ipc/rpc/grpc_services.py +165 -0
  173. holado_grpc/tests/behave/steps/__init__.py +16 -0
  174. holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
  175. holado_grpc/tests/behave/steps/private/__init__.py +16 -0
  176. holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
  177. holado_helper/__init__.py +35 -0
  178. holado_helper/debug/README.txt +32 -0
  179. holado_helper/debug/memory/memory_profiler.py +106 -0
  180. holado_helper/docker/init_user.sh +24 -0
  181. holado_helper/docker/logging.conf +42 -0
  182. holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
  183. holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
  184. holado_helper/docker/run_terminal_in_docker.sh +101 -0
  185. holado_helper/holado_module_template/__init__.py +31 -0
  186. holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
  187. holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
  188. holado_helper/script/action.py +109 -0
  189. holado_helper/script/action_script.py +477 -0
  190. holado_helper/script/any_action_script.py +126 -0
  191. holado_helper/script/behave_action_script.py +99 -0
  192. holado_helper/script/csv_action_script.py +142 -0
  193. holado_helper/script/initialize_script.py +115 -0
  194. holado_helper/script/input_output_script.py +136 -0
  195. holado_helper/script/job.py +75 -0
  196. holado_helper/script/json_action_script.py +104 -0
  197. holado_helper/script/script.py +110 -0
  198. holado_json/__init__.py +16 -0
  199. holado_json/ipc/json.py +125 -0
  200. holado_json/ipc/json_converter.py +69 -0
  201. holado_json/ipc/json_types.py +183 -0
  202. holado_json/tests/behave/steps/__init__.py +16 -0
  203. holado_json/tests/behave/steps/ipc/__init__.py +0 -0
  204. holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
  205. holado_keycloak/__init__.py +16 -0
  206. holado_keycloak/tests/behave/steps/__init__.py +16 -0
  207. holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
  208. holado_keycloak/tools/keycloak/__init__.py +0 -0
  209. holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
  210. holado_logging/__init__.py +37 -0
  211. holado_logging/common/logging/holado_logger.py +75 -0
  212. holado_logging/common/logging/log_config.py +128 -0
  213. holado_logging/common/logging/log_manager.py +292 -0
  214. holado_multitask/__init__.py +33 -0
  215. holado_multitask/multiprocessing/context/process_context.py +35 -0
  216. holado_multitask/multiprocessing/function_process.py +102 -0
  217. holado_multitask/multiprocessing/periodic_function_process.py +135 -0
  218. holado_multitask/multiprocessing/process.py +196 -0
  219. holado_multitask/multiprocessing/processesmanager.py +133 -0
  220. holado_multitask/multitasking/multitask_manager.py +439 -0
  221. holado_multitask/multithreading/__init__.py +0 -0
  222. holado_multitask/multithreading/context/thread_context.py +84 -0
  223. holado_multitask/multithreading/functionthreaded.py +129 -0
  224. holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
  225. holado_multitask/multithreading/loopthread.py +100 -0
  226. holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
  227. holado_multitask/multithreading/reflection/inspect.py +47 -0
  228. holado_multitask/multithreading/reflection/sys.py +29 -0
  229. holado_multitask/multithreading/reflection/traceback.py +35 -0
  230. holado_multitask/multithreading/thread.py +177 -0
  231. holado_multitask/multithreading/threadsmanager.py +162 -0
  232. holado_multitask/multithreading/timer.py +48 -0
  233. holado_multitask/tests/behave/steps/__init__.py +17 -0
  234. holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
  235. holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
  236. holado_protobuf/__init__.py +61 -0
  237. holado_protobuf/ipc/protobuf/__init__.py +0 -0
  238. holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
  239. holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
  240. holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
  241. holado_protobuf/ipc/protobuf/protobuf_messages.py +968 -0
  242. holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
  243. holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
  244. holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
  245. holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
  246. holado_protobuf/tests/behave/steps/__init__.py +16 -0
  247. holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
  248. holado_python/__init__.py +35 -0
  249. holado_python/common/enums.py +34 -0
  250. holado_python/common/iterables.py +30 -0
  251. holado_python/common/tools/comparators/boolean_comparator.py +37 -0
  252. holado_python/common/tools/comparators/bytes_comparator.py +48 -0
  253. holado_python/common/tools/comparators/datetime_comparator.py +74 -0
  254. holado_python/common/tools/comparators/float_comparator.py +97 -0
  255. holado_python/common/tools/comparators/integer_comparator.py +37 -0
  256. holado_python/common/tools/comparators/string_comparator.py +99 -0
  257. holado_python/common/tools/comparators/type_comparator.py +31 -0
  258. holado_python/common/tools/datetime.py +279 -0
  259. holado_python/standard_library/csv.py +207 -0
  260. holado_python/standard_library/hashlib.py +82 -0
  261. holado_python/standard_library/multiprocessing.py +62 -0
  262. holado_python/standard_library/queue.py +79 -0
  263. holado_python/standard_library/socket/blocking_socket.py +136 -0
  264. holado_python/standard_library/socket/echo_server.py +28 -0
  265. holado_python/standard_library/socket/message_socket.py +91 -0
  266. holado_python/standard_library/socket/non_blocking_socket.py +151 -0
  267. holado_python/standard_library/socket/socket.py +148 -0
  268. holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
  269. holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
  270. holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
  271. holado_python/standard_library/ssl/ssl.py +81 -0
  272. holado_python/standard_library/typing.py +192 -0
  273. holado_python/tests/behave/steps/__init__.py +27 -0
  274. holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
  275. holado_python/tests/behave/steps/convert_steps.py +59 -0
  276. holado_python/tests/behave/steps/iterable_steps.py +87 -0
  277. holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
  278. holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
  279. holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
  280. holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
  281. holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
  282. holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
  283. holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
  284. holado_rabbitmq/__init__.py +28 -0
  285. holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
  286. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
  287. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
  288. holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
  289. holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +674 -0
  290. holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
  291. holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
  292. holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
  293. holado_redis/__init__.py +17 -0
  294. holado_redis/tests/behave/steps/__init__.py +16 -0
  295. holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
  296. holado_redis/tools/redis/TODO.txt +7 -0
  297. holado_redis/tools/redis/redis_client.py +190 -0
  298. holado_redis/tools/redis/redis_manager.py +38 -0
  299. holado_report/__init__.py +27 -0
  300. holado_report/report/analyze/execution_historic_manager.py +96 -0
  301. holado_report/report/analyze/scenario_duration_manager.py +245 -0
  302. holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
  303. holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
  304. holado_report/report/builders/report_builder.py +64 -0
  305. holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
  306. holado_report/report/builders/summary_report_builder.py +89 -0
  307. holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
  308. holado_report/report/builders/summary_scenario_report_builder.py +74 -0
  309. holado_report/report/execution_historic.py +141 -0
  310. holado_report/report/report_manager.py +256 -0
  311. holado_report/report/reports/base_report.py +163 -0
  312. holado_report/report/reports/feature_report.py +106 -0
  313. holado_report/report/reports/scenario_report.py +64 -0
  314. holado_rest/__init__.py +24 -0
  315. holado_rest/api/rest/TODO.txt +2 -0
  316. holado_rest/api/rest/rest_client.py +113 -0
  317. holado_rest/api/rest/rest_manager.py +62 -0
  318. holado_rest/tests/behave/steps/__init__.py +16 -0
  319. holado_rest/tests/behave/steps/api/__init__.py +0 -0
  320. holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
  321. holado_rest/tests/behave/steps/private/__init__.py +16 -0
  322. holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
  323. holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
  324. holado_s3/__init__.py +17 -0
  325. holado_s3/tests/behave/steps/__init__.py +17 -0
  326. holado_s3/tests/behave/steps/private/__init__.py +16 -0
  327. holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
  328. holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
  329. holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
  330. holado_s3/tools/s3/__init__.py +0 -0
  331. holado_s3/tools/s3/boto3_s3_client.py +59 -0
  332. holado_s3/tools/s3/minio_client.py +75 -0
  333. holado_s3/tools/s3/moto_server.py +52 -0
  334. holado_scripting/__init__.py +53 -0
  335. holado_scripting/common/tools/dynamic_text_manager.py +73 -0
  336. holado_scripting/common/tools/evaluate_parameters.py +210 -0
  337. holado_scripting/common/tools/expression_evaluator.py +387 -0
  338. holado_scripting/common/tools/variable_manager.py +321 -0
  339. holado_scripting/tests/behave/steps/__init__.py +22 -0
  340. holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
  341. holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
  342. holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
  343. holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
  344. holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
  345. holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
  346. holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
  347. holado_scripting/text/base/base_function.py +25 -0
  348. holado_scripting/text/base/base_verify_function.py +25 -0
  349. holado_scripting/text/base/text_inspecter.py +204 -0
  350. holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
  351. holado_scripting/text/interpreter/functions/function_cast.py +60 -0
  352. holado_scripting/text/interpreter/functions/function_convert.py +57 -0
  353. holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
  354. holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
  355. holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
  356. holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
  357. holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
  358. holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
  359. holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
  360. holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
  361. holado_scripting/text/interpreter/text_interpreter.py +216 -0
  362. holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
  363. holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
  364. holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
  365. holado_scripting/text/verifier/text_verifier.py +103 -0
  366. holado_sftp/__init__.py +16 -0
  367. holado_sftp/tests/behave/steps/__init__.py +17 -0
  368. holado_sftp/tests/behave/steps/private/__init__.py +16 -0
  369. holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
  370. holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
  371. holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
  372. holado_sftp/tools/sftp/__init__.py +0 -0
  373. holado_sftp/tools/sftp/sftp_client.py +103 -0
  374. holado_sftp/tools/sftp/sftp_server.py +39 -0
  375. holado_swagger/__init__.py +31 -0
  376. holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
  377. holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
  378. holado_swagger/tests/behave/steps/__init__.py +16 -0
  379. holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
  380. holado_system/system/command/command.py +216 -0
  381. holado_system/system/command/command_result.py +128 -0
  382. holado_system/system/command/curl_command.py +101 -0
  383. holado_system/system/command/exceptions.py +59 -0
  384. holado_system/system/filesystem/file.py +76 -0
  385. holado_system/system/global_system.py +187 -0
  386. holado_system/tests/behave/steps/__init__.py +18 -0
  387. holado_system/tests/behave/steps/system/commands_steps.py +92 -0
  388. holado_system/tests/behave/steps/system/file_steps.py +215 -0
  389. holado_system/tests/behave/steps/system/system_steps.py +84 -0
  390. holado_test/__init__.py +27 -0
  391. holado_test/behave/__init__.py +0 -0
  392. holado_test/behave/behave.py +397 -0
  393. holado_test/behave/behave_environment.py +143 -0
  394. holado_test/behave/behave_function.py +33 -0
  395. holado_test/behave/behave_manager.py +555 -0
  396. holado_test/behave/independant_runner.py +68 -0
  397. holado_test/behave/scenario/__init__.py +0 -0
  398. holado_test/behave/scenario/behave_step_tools.py +157 -0
  399. holado_test/common/context/feature_context.py +79 -0
  400. holado_test/common/context/scenario_context.py +217 -0
  401. holado_test/common/context/step_context.py +66 -0
  402. holado_test/common/exceptions/undefined_step_exception.py +21 -0
  403. holado_test/scenario/step_tools.py +523 -0
  404. holado_test/scenario/tester_tools.py +52 -0
  405. holado_test/test_config.py +26 -0
  406. holado_test/tests/behave/steps/__init__.py +18 -0
  407. holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
  408. holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
  409. holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
  410. holado_value/__init__.py +24 -0
  411. holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
  412. holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
  413. holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
  414. holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
  415. holado_value/common/tables/converters/value_table_converter.py +217 -0
  416. holado_value/common/tables/value_table.py +29 -0
  417. holado_value/common/tables/value_table_cell.py +67 -0
  418. holado_value/common/tables/value_table_manager.py +58 -0
  419. holado_value/common/tables/value_table_row.py +44 -0
  420. holado_value/common/tables/value_table_with_header.py +28 -0
  421. holado_value/common/tools/unique_value_manager.py +108 -0
  422. holado_value/common/tools/value.py +164 -0
  423. holado_value/common/tools/value_types.py +35 -0
  424. holado_value/tests/behave/steps/__init__.py +16 -0
  425. holado_value/tests/behave/steps/private/__init__.py +16 -0
  426. holado_ws/__init__.py +16 -0
  427. holado_ws/api/ws/TODO.txt +2 -0
  428. holado_ws/tests/behave/steps/__init__.py +16 -0
  429. holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
  430. holado_yaml/__init__.py +31 -0
  431. holado_yaml/tests/behave/steps/__init__.py +16 -0
  432. holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
  433. holado_yaml/yaml/yaml_manager.py +86 -0
  434. test_holado/Dockerfile_test_holado +82 -0
  435. test_holado/__init__.py +4 -0
  436. test_holado/__main__.py +25 -0
  437. test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
  438. test_holado/environment.py +42 -0
  439. test_holado/features/NonReg/api/REST.feature +21 -0
  440. test_holado/features/NonReg/api/gRPC.feature +122 -0
  441. test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
  442. test_holado/features/NonReg/common/system/commands.feature +43 -0
  443. test_holado/features/NonReg/common/system/system.feature +20 -0
  444. test_holado/features/NonReg/common/tables/table.feature +239 -0
  445. test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
  446. test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
  447. test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
  448. test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
  449. test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
  450. test_holado/features/NonReg/holado_python/convert.feature +20 -0
  451. test_holado/features/NonReg/holado_python/iterable.feature +61 -0
  452. test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
  453. test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
  454. test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
  455. test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
  456. test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
  457. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
  458. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
  459. test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
  460. test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
  461. test_holado/features/NonReg/ipc/bit_series.feature +131 -0
  462. test_holado/features/NonReg/ipc/json.feature +20 -0
  463. test_holado/features/NonReg/scenario/scenario.feature +139 -0
  464. test_holado/features/NonReg/test_steps/behave.feature +275 -0
  465. test_holado/features/NonReg/test_steps/common.feature +100 -0
  466. test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
  467. test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
  468. test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
  469. test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
  470. test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
  471. test_holado/features/NonReg/tools/sFTP.feature +25 -0
  472. test_holado/features/Test/logger.feature +28 -0
  473. test_holado/features/__init__.py +0 -0
  474. test_holado/logging.conf +41 -0
  475. test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
  476. test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
  477. test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
  478. test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
  479. test_holado/resources/scripts/list_tags.sh +2 -0
  480. test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
  481. test_holado/steps/__init__.py +0 -0
  482. test_holado/steps/private_steps.py +20 -0
  483. test_holado/steps/public_steps.py +23 -0
  484. test_holado/test_holado_session_context.py +43 -0
  485. test_holado/tools/django/README.txt +3 -0
  486. test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
  487. test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
  488. test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
  489. test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
  490. test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
  491. test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
  492. test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
  493. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
  494. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
  495. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
  496. test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
  497. test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
  498. test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
  499. test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
  500. test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
  501. test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
  502. test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
  503. test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
  504. test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
  505. test_holado/tools/django/api_grpc/manage.py +27 -0
  506. test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
  507. test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
  508. test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
  509. test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
  510. test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
  511. test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
  512. test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
  513. test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
  514. test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
  515. test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
  516. test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
  517. test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
  518. test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
  519. test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
  520. test_holado/tools/django/api_rest/db.sqlite3 +0 -0
  521. test_holado/tools/django/api_rest/manage.py +22 -0
  522. holado-0.2.2.dist-info/RECORD +0 -17
  523. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/WHEEL +0 -0
  524. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,193 @@
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.technical_exception import TechnicalException
16
+ from holado_db.tools.db.query.base.query_builder import QueryBuilder
17
+ from holado_core.common.tools.tools import Tools
18
+ from holado_core.common.tools.comparators.comparator import CompareOperator
19
+ from holado_python.standard_library.typing import Typing
20
+
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+ try:
25
+ import pypika.functions
26
+ from pypika.queries import Table, Query
27
+ from pypika.terms import Parameter
28
+ with_pypika = True
29
+ except Exception as exc:
30
+ if Tools.do_log(logger, logging.DEBUG):
31
+ logger.debug(f"PyPika is not available for QueryBuilder. Initialization failed on error: {exc}")
32
+ with_pypika = False
33
+
34
+
35
+
36
+ class PypikaQueryBuilder(QueryBuilder):
37
+ """
38
+ Query builder for PyPika library.
39
+ """
40
+ @classmethod
41
+ def is_available(cls):
42
+ return with_pypika
43
+
44
+ def __init__(self, name, db_client=None):
45
+ super().__init__(name, db_client)
46
+
47
+ def select(self, table_name, where_data: dict=None, sql_return="*"):
48
+ """
49
+ Simple query & values builder of a select by filtering on given where data.
50
+ Parameter 'where_data' has to be a dictionary with keys equal to table column names.
51
+ """
52
+ table = Table(table_name)
53
+ res = Query.from_(table)
54
+ values = ()
55
+
56
+ if sql_return == "count(*)":
57
+ res = res.select(pypika.functions.Count("*"))
58
+ elif isinstance(sql_return, list):
59
+ res = res.select(*sql_return)
60
+ else:
61
+ res = res.select(sql_return)
62
+
63
+ if where_data:
64
+ res, values = self.where(res, values, where_data)
65
+
66
+ return res, values
67
+
68
+ def insert(self, table_name, data: dict):
69
+ """
70
+ Simple query & values builder of an insert of given data.
71
+ Parameter 'data' has to be a dictionary with keys equal to table column names.
72
+ """
73
+ col_names = tuple(sorted(data.keys()))
74
+ values = tuple((data[c] for c in col_names))
75
+ sql_placeholder = self.db_client._get_sql_placeholder()
76
+
77
+ values_placeholder = [Parameter(sql_placeholder)] * len(col_names)
78
+ res = Query.into(table_name).columns(*col_names).insert(*values_placeholder)
79
+
80
+ return res, values
81
+
82
+ def update(self, table_name, data: dict, where_data: dict):
83
+ """
84
+ Simple query & values builder of an update of given data.
85
+ Parameters 'data' and 'where_data' have to be dictionaries with keys equal to table column names.
86
+ """
87
+ col_names = tuple(sorted(data.keys()))
88
+ values = tuple((data[c] for c in col_names))
89
+ sql_placeholder = self.db_client._get_sql_placeholder()
90
+
91
+ table = Table(table_name)
92
+ res = Query.update(table)
93
+ for c in col_names:
94
+ res = res.set(c, Parameter(sql_placeholder))
95
+
96
+ if where_data:
97
+ res, values = self.where(res, values, where_data)
98
+
99
+ return res, values
100
+
101
+ def delete(self, table_name, where_data: dict=None):
102
+ """
103
+ Simple query & values builder of a delete by filtering on given where data.
104
+ Parameter 'where_data' has to be a dictionary with keys equal to table column names.
105
+ """
106
+ table = Table(table_name)
107
+ res = Query.from_(table).delete()
108
+ values = ()
109
+
110
+ if where_data:
111
+ res, values = self.where(res, values, where_data)
112
+
113
+ return res, values
114
+
115
+ def where(self, query, values, where_data: dict):
116
+ col_names = tuple(sorted(where_data.keys()))
117
+ where_values = tuple((where_data[c] for c in col_names))
118
+ sql_placeholder = self.db_client._get_sql_placeholder()
119
+
120
+ res = query
121
+ table = self.__get_table(query)
122
+ for c in col_names:
123
+ res = res.where(getattr(table, c) == Parameter(sql_placeholder))
124
+
125
+ if values is not None:
126
+ values = (*values, *where_values)
127
+ else:
128
+ values = where_values
129
+ return res, values
130
+
131
+ def where_compare(self, query, values, field_name, operator:CompareOperator, value):
132
+ table = self.__get_table(query)
133
+ sql_placeholder = self.db_client._get_sql_placeholder()
134
+
135
+ if operator == CompareOperator.Different:
136
+ res = query.where(getattr(table, field_name) != Parameter(sql_placeholder))
137
+ elif operator == CompareOperator.Equal:
138
+ res = query.where(getattr(table, field_name) == Parameter(sql_placeholder))
139
+ elif operator == CompareOperator.Inferior:
140
+ res = query.where(getattr(table, field_name) < Parameter(sql_placeholder))
141
+ elif operator == CompareOperator.InferiorOrEqual:
142
+ res = query.where(getattr(table, field_name) <= Parameter(sql_placeholder))
143
+ elif operator == CompareOperator.Superior:
144
+ res = query.where(getattr(table, field_name) > Parameter(sql_placeholder))
145
+ elif operator == CompareOperator.SuperiorOrEqual:
146
+ res = query.where(getattr(table, field_name) >= Parameter(sql_placeholder))
147
+ else:
148
+ raise TechnicalException(f"Unmanaged compare operator {operator}")
149
+
150
+ if values is not None:
151
+ values = (*values, value)
152
+ else:
153
+ values = (value)
154
+ return res, values
155
+
156
+ def where_in(self, query, values, field_name, field_values, not_in=False):
157
+ table = self.__get_table(query)
158
+ if not_in:
159
+ res = query.where(getattr(table, field_name).notin(field_values))
160
+ else:
161
+ res = query.where(getattr(table, field_name).isin(field_values))
162
+ return res, values
163
+
164
+ def where_json_value(self, query, values, field_name, key, value, as_text_value=False):
165
+ table = self.__get_table(query)
166
+ sql_placeholder = self.db_client._get_sql_placeholder()
167
+
168
+ if as_text_value:
169
+ res = query.where(getattr(table, field_name).get_text_value(key) == Parameter(sql_placeholder))
170
+ else:
171
+ res = query.where(getattr(table, field_name).get_json_value(key) == Parameter(sql_placeholder))
172
+
173
+ if values is not None:
174
+ values = (*values, value)
175
+ else:
176
+ values = (value)
177
+ return res, values
178
+
179
+ def to_sql(self, query):
180
+ if query.__module__.startswith('pypika'):
181
+ return query.get_sql()
182
+ else:
183
+ raise TechnicalException(f"Unmanaged query of type {Typing.get_object_class_fullname(query)}")
184
+
185
+ def __get_table(self, query):
186
+ if query._from is not None and len(query._from) > 0:
187
+ return query._from[0]
188
+ elif query._insert_table is not None:
189
+ return query._insert_table
190
+ elif query._update_table is not None:
191
+ return query._update_table
192
+ else:
193
+ raise TechnicalException(f"Failed to extract table from query [{query}]: {Tools.represent_object(query)}")
@@ -0,0 +1,77 @@
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.technical_exception import TechnicalException
16
+ from holado_core.common.tools.tools import Tools
17
+
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+
23
+ class QueryManager():
24
+ """
25
+ Manage Query builders, agnostic to managed libraries.
26
+ """
27
+
28
+ def __init__(self, name):
29
+ self.__name = name if name else "QueryManager"
30
+
31
+ self.__builder_new_func_by_type = {}
32
+ self.__default_builder_type = None
33
+
34
+ def initialize(self):
35
+ from holado_db.tools.db.query.pypika.pypika_query_builder import PypikaQueryBuilder
36
+ if PypikaQueryBuilder.is_available():
37
+ self.register_query_builder("pypika", PypikaQueryBuilder)
38
+ self.__default_builder_type = "pypika"
39
+ else:
40
+ if Tools.do_log(logger, logging.DEBUG):
41
+ logger.debug("PyPika package is not installed, this type of Query builder is not available")
42
+
43
+ @property
44
+ def name(self):
45
+ return self.__name
46
+
47
+ @property
48
+ def default_builder_type(self):
49
+ return self.__default_builder_type
50
+
51
+ @default_builder_type.setter
52
+ def default_builder_type(self, builder_type):
53
+ self.__default_builder_type = builder_type
54
+
55
+ def register_query_builder(self, builder_type, new_builder_func):
56
+ self.__builder_new_func_by_type[builder_type] = new_builder_func
57
+ if Tools.do_log(logger, logging.DEBUG):
58
+ logger.debug(f"Registered Query builder type '{builder_type}'")
59
+
60
+ def new_default_query_builder(self, name, db_client):
61
+ if self.__default_builder_type is None:
62
+ raise TechnicalException(f"Default query builder type is not defined. Registered query builders: {list(self.__builder_new_func_by_type.keys())}")
63
+ return self.new_query_builder(name, self.__default_builder_type, db_client)
64
+
65
+ def new_query_builder(self, name, builder_type, db_client):
66
+ if builder_type in self.__builder_new_func_by_type:
67
+ try:
68
+ res = self.__builder_new_func_by_type[builder_type](name, db_client)
69
+ except Exception as exc:
70
+ raise TechnicalException(f"Failed to create Query builder for builder type '{builder_type}'") from exc
71
+ else:
72
+ raise TechnicalException(f"Unmanaged Query builder type '{builder_type}'")
73
+ return res
74
+
75
+
76
+
77
+
@@ -0,0 +1,25 @@
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
+ return None
18
+
19
+ def register():
20
+ from holado.common.context.session_context import SessionContext
21
+
22
+ from holado_docker.sdk.docker.docker_client import DockerClient
23
+ if DockerClient.is_available():
24
+ SessionContext.instance().services.register_service_type("docker_client", DockerClient)
25
+
@@ -0,0 +1,268 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ from holado_core.common.exceptions.functional_exception import FunctionalException
15
+ import time
16
+ import logging
17
+ from holado_core.common.exceptions.technical_exception import TechnicalException
18
+ from holado.common.handlers.object import DeleteableObject
19
+ from holado_core.common.tools.tools import Tools
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ try:
24
+ import docker
25
+ with_docker = True
26
+ except Exception as exc:
27
+ if Tools.do_log(logger, logging.DEBUG):
28
+ logger.debug(f"DockerClient is not available. Initialization failed on error: {exc}")
29
+ with_docker = False
30
+
31
+
32
+ class DockerClient(object):
33
+ @classmethod
34
+ def is_available(cls):
35
+ return with_docker
36
+
37
+ def __init__(self):
38
+ self.__client = docker.from_env()
39
+ self.__containers = {}
40
+ self.__volumes = {}
41
+
42
+ @property
43
+ def client(self):
44
+ return self.__client
45
+
46
+ def has_container(self, name, in_list = True):
47
+ # Note: Even if name exists in __containers, it is possible that the container has been removed
48
+ if in_list:
49
+ c = self.__get_container_from_list(name)
50
+ res = c is not None
51
+ else:
52
+ res = name in self.__containers
53
+ return res
54
+
55
+ def get_container(self, name):
56
+ if name not in self.__containers:
57
+ c = self.__get_container_from_list(name)
58
+ if c:
59
+ self.__containers[name] = DockerContainer(self, c)
60
+ return self.__containers.get(name)
61
+
62
+ def get_all_container_names(self):
63
+ for _ in range(3):
64
+ try:
65
+ return [c.name for c in self.__client.containers.list(all=True)]
66
+ except docker.errors.NotFound:
67
+ pass
68
+
69
+ def __get_container_from_list(self, name):
70
+ res = None
71
+ for _ in range(3):
72
+ try:
73
+ for c in self.__client.containers.list(all=True):
74
+ if c.name == name:
75
+ res = c
76
+ break
77
+ except docker.errors.NotFound:
78
+ pass
79
+ return res
80
+
81
+ def has_volume(self, name, in_list = False):
82
+ res = name in self.__volumes
83
+ if not res and in_list:
84
+ v = self.__get_volume_from_list(name)
85
+ res = v is not None
86
+ return res
87
+
88
+ def get_volume(self, name):
89
+ if name not in self.__volumes:
90
+ v = self.__get_volume_from_list(name)
91
+ if v:
92
+ self.__volumes[name] = DockerVolume(v)
93
+ return self.__volumes.get(name)
94
+
95
+ def get_all_volume_names(self):
96
+ return [v.name for v in self.__client.volumes.list()]
97
+
98
+ def __get_volume_from_list(self, name):
99
+ res = None
100
+ for v in self.__client.volumes.list():
101
+ if v.name == name:
102
+ res = v
103
+ break
104
+ return res
105
+
106
+ def run_container(self, name, image, remove_existing=False, wait_running=True, auto_stop=True, **kwargs):
107
+ if Tools.do_log(logger, logging.DEBUG):
108
+ logger.debug(f"Running docker container '{name}' with image '{image}' and arguments {kwargs}{', and waiting running status' if wait_running else ''}")
109
+
110
+ # Manage remove if already existing
111
+ cont = self.get_container(name)
112
+ if cont:
113
+ if remove_existing:
114
+ if cont.status == "running":
115
+ if Tools.do_log(logger, logging.DEBUG):
116
+ logger.debug(f"Docker container '{name}' is running, stopping it before remove")
117
+ self.stop_container(name)
118
+
119
+ if self.has_container(name): # After stop, container is able to be automatically removed depending on its run parameters
120
+ self.remove_container(name)
121
+ else:
122
+ logger.info(f"Docker container '{name}' is already running")
123
+ return
124
+
125
+ # Run container
126
+ c = self.__client.containers.run(image, name=name, detach=True, **kwargs)
127
+ container = DockerContainer(self, c)
128
+ self.__containers[name] = container
129
+
130
+ # Manage wait running status
131
+ if wait_running:
132
+ for _ in range(100):
133
+ time.sleep(1)
134
+ if container.status == "running":
135
+ break
136
+ if container.status != "running":
137
+ raise TechnicalException("Failed to run container of name '{}' (status: {})".format(name, container.status))
138
+ else:
139
+ if Tools.do_log(logger, logging.DEBUG):
140
+ logger.debug(f"Run docker container '{name}' with image '{image}' and arguments {kwargs}{', and wait running status' if wait_running else ''}")
141
+
142
+ # Set properties
143
+ container.auto_stop = auto_stop
144
+
145
+ return container
146
+
147
+ def start_container(self, name, wait_running=True, **kwargs):
148
+ if Tools.do_log(logger, logging.DEBUG):
149
+ logger.debug(f"Starting docker container '{name}' with arguments {kwargs}{', and waiting running status' if wait_running else ''}")
150
+ container = self.get_container(name)
151
+ if not container:
152
+ raise FunctionalException("Container of name '{}' doesn't exist")
153
+
154
+ container.start(**kwargs)
155
+
156
+ if wait_running:
157
+ for _ in range(120):
158
+ time.sleep(1)
159
+ if container.status == "running":
160
+ break
161
+ if container.status != "running":
162
+ raise TechnicalException("Failed to run container of name '{}' (status: {})".format(name, container.status))
163
+ else:
164
+ if Tools.do_log(logger, logging.DEBUG):
165
+ logger.debug(f"Started docker container '{name}' with arguments {kwargs}{', and waited running status' if wait_running else ''}")
166
+
167
+ def stop_container(self, name):
168
+ if Tools.do_log(logger, logging.DEBUG):
169
+ logger.debug(f"Stopping docker container of name '{name}'")
170
+ if name not in self.__containers:
171
+ raise FunctionalException("Unknown container of name '{}'".format(name))
172
+ elif self.__containers[name].status != "running":
173
+ raise FunctionalException("Container of name '{}' is not running (status: {})".format(name, self.__containers[name].status))
174
+
175
+ self.__containers[name].stop()
176
+ try:
177
+ self.__containers[name].wait()
178
+ except docker.errors.NotFound:
179
+ # This exception occurs on containers automatically removed on stop
180
+ pass
181
+
182
+ if self.__containers[name].status == "running":
183
+ raise FunctionalException("Failed to stop container of name '{}' (status: {})".format(name, self.__containers[name].status))
184
+ else:
185
+ if Tools.do_log(logger, logging.DEBUG):
186
+ logger.debug(f"Stopped docker container of name '{name}'")
187
+
188
+ def remove_container(self, name):
189
+ if Tools.do_log(logger, logging.DEBUG):
190
+ logger.debug(f"Removing docker container of name '{name}'")
191
+ if not self.has_container(name):
192
+ raise FunctionalException(f"Container of name '{name}' doesn't exist")
193
+
194
+ del self.__containers[name]
195
+ self.client.api.remove_container(name)
196
+
197
+ if self.has_container(name):
198
+ raise FunctionalException(f"Failed to remove container of name '{name}'")
199
+ else:
200
+ if Tools.do_log(logger, logging.DEBUG):
201
+ logger.debug(f"Removed docker container of name '{name}'")
202
+
203
+ class DockerContainer(DeleteableObject):
204
+ def __init__(self, docker_client, container):
205
+ super().__init__(container.name)
206
+
207
+ self.__docker_client = docker_client
208
+ self.__container = container
209
+ self.__auto_stop = False
210
+
211
+ def _delete_object(self):
212
+ if self.auto_stop and self.__docker_client and self.__docker_client.has_container(self.name) \
213
+ and self.__docker_client.get_container(self.name).status == "running":
214
+ self.__docker_client.stop_container(self.name)
215
+
216
+ @property
217
+ def container(self):
218
+ self.__container
219
+
220
+ @property
221
+ def status(self):
222
+ try:
223
+ self.__container.reload()
224
+ except docker.errors.NotFound:
225
+ return "removed"
226
+ return self.__container.status
227
+
228
+ @property
229
+ def auto_stop(self):
230
+ self.__auto_stop
231
+
232
+ @auto_stop.setter
233
+ def auto_stop(self, auto_stop):
234
+ self.__auto_stop = auto_stop
235
+
236
+ def start(self, **kwargs):
237
+ return self.__container.start(**kwargs)
238
+
239
+ def stop(self, **kwargs):
240
+ return self.__container.stop(**kwargs)
241
+
242
+ def wait(self, **kwargs):
243
+ return self.__container.wait(**kwargs)
244
+
245
+ class DockerVolume(object):
246
+ def __init__(self, volume):
247
+ self.__volume = volume
248
+
249
+ @property
250
+ def volume(self):
251
+ self.__volume
252
+
253
+ @property
254
+ def attributes(self):
255
+ self.__volume.reload()
256
+ return self.__volume.attrs
257
+
258
+ def get_attribute(self, attr_path):
259
+ names = attr_path.split('.')
260
+ attrs = self.attributes
261
+ res = attrs
262
+ for i, name in enumerate(names):
263
+ if name in res:
264
+ res = res[name]
265
+ else:
266
+ raise FunctionalException(f"Attribute '{'.'.join(names[:i+1])}' doesn't exist (requested attribute: '{attr_path}' ; volume attributes: {attrs})")
267
+ return res
268
+
@@ -0,0 +1,71 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ from holado_docker.sdk.docker.docker_client import DockerClient
15
+ from holado_core.common.exceptions.technical_exception import TechnicalException
16
+ import logging
17
+ from holado_core.tools.abstracts.service import Service
18
+ from holado_system.system.command.command import CommandStates
19
+ from holado_core.common.tools.tools import Tools
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class DockerService(Service):
25
+ @classmethod
26
+ def is_available(cls):
27
+ return DockerClient.is_available()
28
+
29
+ def __init__(self, name):
30
+ super().__init__(name)
31
+ self.__docker_client = None
32
+ self.__docker_container = None
33
+
34
+ @property
35
+ def status(self):
36
+ if self.__docker_container is not None and self.__docker_client.has_container(self.name):
37
+ status = self.__docker_container.status
38
+ if status in ["running", "paused", "restarting"]:
39
+ return CommandStates.Running
40
+ elif status == "exited":
41
+ result = self.__docker_container.wait(timeout=10)
42
+ error_code = result["StatusCode"]
43
+ if error_code == 0:
44
+ return CommandStates.Success
45
+ else:
46
+ return CommandStates.Error
47
+ else:
48
+ raise TechnicalException(f"Unmanaged docker status '{status}'")
49
+ else:
50
+ return None
51
+
52
+ def run_as_docker(self, image, remove_existing=True, remove=True, auto_stop=True, **kwargs):
53
+ """
54
+ Run the service as a docker image.
55
+
56
+ :param image: Image name
57
+ :param remove_existing: If true (default) and docker already exists, remove docker before creating a new one
58
+ :param remove: If true (default), remove the docker at stop
59
+ :param auto_stop: If true (default), automatically stop docker when docker instance is released
60
+ """
61
+ self.__docker_client = DockerClient()
62
+ self.__docker_container = self.__docker_client.run_container(self.name, image, remove_existing=remove_existing, remove=remove, auto_stop=auto_stop, **kwargs)
63
+
64
+ def stop(self):
65
+ if Tools.do_log(logger, logging.DEBUG):
66
+ logger.debug(f"Stopping service '{self.name}'")
67
+ if self.__docker_container is not None:
68
+ if self.__docker_client.has_container(self.name) and self.__docker_client.get_container(self.name).status == "running":
69
+ self.__docker_client.stop_container(self.name)
70
+ else:
71
+ raise TechnicalException(f"Service '{self.name}' is not started")
@@ -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 .tools.docker_steps import *