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,128 @@
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
+
16
+
17
+ # logger = logging.getLogger(__name__)
18
+
19
+
20
+ class LogConfig(object):
21
+ TLogger = None
22
+ TManager = None
23
+ default_level = logging.INFO
24
+
25
+ @classmethod
26
+ def configure(cls, initialize_logging=True, log_level=None):
27
+ # HolAdo needs at least to add logging level TRACE and PRINT
28
+ cls.add_logging_level_trace()
29
+ cls.add_logging_level_print()
30
+
31
+ if log_level:
32
+ if isinstance(log_level, str):
33
+ cls.default_level = logging._nameToLevel[log_level]
34
+ else:
35
+ cls.default_level = log_level
36
+
37
+ if initialize_logging:
38
+ from holado_logging.common.logging.holado_logger import HALogger
39
+
40
+ HALogger.default_message_size_limit = 10000
41
+ cls.TLogger = HALogger
42
+ cls.TManager = logging.Manager
43
+
44
+ # Configure logging
45
+ cls.configure_logging()
46
+
47
+ @classmethod
48
+ def configure_logging(cls):
49
+ #TODO EKL: make loggers configuration optional
50
+ # Configure loggers
51
+ from holado_logging.common.logging.holado_logger import TestRootLogger
52
+ logging.root = TestRootLogger(cls.default_level)
53
+ logging.Logger.root = logging.root
54
+ logging.Logger.manager = cls.TManager(cls.TLogger.root)
55
+
56
+ logging.setLoggerClass(cls.TLogger)
57
+
58
+
59
+ @classmethod
60
+ def add_logging_level_print(cls):
61
+ if not cls.has_logging_level("PRINT"):
62
+ cls.add_logging_level("PRINT", 45, None)
63
+
64
+ @classmethod
65
+ def add_logging_level_trace(cls):
66
+ if not cls.has_logging_level("TRACE"):
67
+ cls.add_logging_level("TRACE", 5, None)
68
+
69
+
70
+ @classmethod
71
+ def has_logging_level(cls, levelName):
72
+ return hasattr(logging, levelName)
73
+
74
+ @classmethod
75
+ def add_logging_level(cls, levelName, levelNum, methodName=None):
76
+ """
77
+ This method was implemented and shared by the author of library haggis (https://haggis.readthedocs.io).
78
+
79
+ Comprehensively adds a new logging level to the `logging` module and the
80
+ currently configured logging class.
81
+
82
+ `levelName` becomes an attribute of the `logging` module with the value
83
+ `levelNum`. `methodName` becomes a convenience method for both `logging`
84
+ itself and the class returned by `logging.getLoggerClass()` (usually just
85
+ `logging.Logger`). If `methodName` is not specified, `levelName.lower()` is
86
+ used.
87
+
88
+ To avoid accidental clobberings of existing attributes, this method will
89
+ raise an `AttributeError` if the level name is already an attribute of the
90
+ `logging` module or if the method name is already present
91
+
92
+ Example
93
+ -------
94
+ >>> addLoggingLevel('TRACE', logging.DEBUG - 5)
95
+ >>> logging.getLogger(__name__).setLevel("TRACE")
96
+ >>> logging.getLogger(__name__).trace('that worked')
97
+ >>> logging.trace('so did this')
98
+ >>> logging.TRACE
99
+ 5
100
+
101
+ """
102
+ if not methodName:
103
+ methodName = levelName.lower()
104
+
105
+ if hasattr(logging, levelName):
106
+ raise AttributeError('{} already defined in logging module'.format(levelName))
107
+ if hasattr(logging, methodName):
108
+ raise AttributeError('{} already defined in logging module'.format(methodName))
109
+ if hasattr(logging.getLoggerClass(), methodName):
110
+ raise AttributeError('{} already defined in logger class'.format(methodName))
111
+
112
+ # This method was inspired by the answers to Stack Overflow post
113
+ # http://stackoverflow.com/q/2183233/2988730, especially
114
+ # http://stackoverflow.com/a/13638084/2988730
115
+ def logForLevel(self, message, *args, **kwargs):
116
+ if self.isEnabledFor(levelNum):
117
+ self._log(levelNum, message, args, **kwargs)
118
+ def logToRoot(message, *args, **kwargs):
119
+ logging.log(levelNum, message, *args, **kwargs)
120
+
121
+ logging.addLevelName(levelNum, levelName)
122
+ setattr(logging, levelName, levelNum)
123
+ setattr(logging.getLoggerClass(), methodName, logForLevel)
124
+ setattr(logging, methodName, logToRoot)
125
+
126
+
127
+
128
+
@@ -0,0 +1,292 @@
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 threading
15
+ import logging
16
+ import sys
17
+ import os.path
18
+ from pathlib import Path
19
+ import configparser
20
+ from holado_logging.common.logging.log_config import LogConfig
21
+ from holado_core.common.tools.tools import Tools
22
+
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+ def filter_thread_native_id(record):
27
+ """Inject thread_native_id to log records"""
28
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
29
+ record.thread_native_id = MultitaskManager.get_thread_id(native=True)
30
+ return record
31
+
32
+ class LogManager(object):
33
+
34
+ def __init__(self):
35
+ self.__loggers_levels = []
36
+
37
+ self.__config_file_path = None
38
+
39
+ self.on_console = False
40
+ self.__console_handler = None
41
+
42
+ self.in_file = True
43
+ self.__files_lock = threading.Lock()
44
+ self.__file_names = []
45
+ self.__file_handlers = {}
46
+ self.__root_file_name = None
47
+ self.__root_file_handler = None
48
+ self.__root_file_handler_active = False
49
+
50
+ # Initialize format according python version
51
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
52
+ if MultitaskManager.has_thread_native_id():
53
+ # Exists since python 3.8
54
+ # self.format = '{asctime:s} | {thread_native_id:-5d} | {levelname:5s} | {name:50s} | {message:s}'
55
+ self.format = '{asctime:s} | {process:-5d}-{thread_native_id:-5d} | {levelname:5s} | {name:50s} | {message:s}'
56
+ self.style = '{'
57
+ else:
58
+ if sys.version_info > (3, 2):
59
+ # self.format = '{asctime:s} | {thread:-5d} | {levelname:5s} | {module:35s} | {message:s}'
60
+ self.format = '{asctime:s} | {process:-5d}-{thread:-5d} | {levelname:5s} | {name:50s} | {message:s}'
61
+ self.style = '{'
62
+ else:
63
+ self.format = '%(asctime)s | %(process)-5d-%(thread)-5d | %(levelname)5s | %(module)35s | %(message)s'
64
+ self.style = '%'
65
+
66
+ def initialize(self, log_on_console=True):
67
+ """
68
+ Initialize log manager.
69
+ If log_on_console is True, logs are published on console until a new configuration by calling method set_config
70
+ """
71
+ if log_on_console:
72
+ self.on_console = True
73
+ self.__console_handler = self.__new_console_handler()
74
+ logging.basicConfig(format=self.format, style=self.style, level=LogConfig.default_level, handlers=[self.__console_handler])
75
+ else:
76
+ logging.basicConfig(format=self.format, style=self.style, level=LogConfig.default_level, handlers=[])
77
+
78
+ def set_config_file_path(self, file_path, update_default_level=True):
79
+ self.__config_file_path = file_path
80
+
81
+ config = configparser.ConfigParser()
82
+ config.read(self.__config_file_path)
83
+ if update_default_level:
84
+ LogConfig.default_level = config.get("logger_root", "level")
85
+
86
+ if config.has_section("loggers_levels"):
87
+ self.__loggers_levels = config.items(section="loggers_levels")
88
+
89
+ def has_log_file(self, file_name):
90
+ with self.__files_lock:
91
+ return file_name in self.__file_names or file_name == self.__root_file_name
92
+
93
+ def set_root_log_file(self, file_name):
94
+ with self.__files_lock:
95
+ if file_name is not None and len(file_name) > 0:
96
+ self.__root_file_name = file_name
97
+
98
+ def reset_log_files(self):
99
+ with self.__files_lock:
100
+ self.__file_names.clear()
101
+
102
+ def add_log_file(self, file_name):
103
+ from holado_core.common.exceptions.technical_exception import TechnicalException
104
+
105
+ if file_name is not None and len(file_name) > 0:
106
+ if file_name == self.__root_file_name:
107
+ raise TechnicalException(f"Log file '{file_name}' is already set as root log file")
108
+ with self.__files_lock:
109
+ if file_name in self.__file_names:
110
+ raise TechnicalException(f"Log file '{file_name}' is already set")
111
+ self.__file_names.append(file_name)
112
+
113
+ def remove_log_file(self, file_name):
114
+ with self.__files_lock:
115
+ if file_name is not None and len(file_name) > 0 and file_name in self.__file_names:
116
+ self.__file_names.remove(file_name)
117
+
118
+ def __new_console_handler(self):
119
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
120
+
121
+ res = logging.StreamHandler()
122
+ res.setFormatter(logging.Formatter(fmt=self.format, style=self.style))
123
+ if MultitaskManager.has_thread_native_id():
124
+ res.addFilter(filter_thread_native_id)
125
+ return res
126
+
127
+ def set_config(self):
128
+ # print(f"Set logging config: {LogConfig.default_level=} ; {self.on_console=} ; {self.in_file=} ; {self.__root_file_name=}")
129
+ if Tools.do_log(logger, logging.DEBUG):
130
+ logger.debug(f"Set logging config: {LogConfig.default_level=} ; {self.on_console=} ; {self.in_file=} ; {self.__root_file_name=}")
131
+
132
+ # if self.__config_file_path is not None:
133
+ # logging.config.fileConfig(self.__config_file_path, defaults=None, disable_existing_loggers=False)
134
+
135
+ logger_ = logging.getLogger()
136
+
137
+ # Update log destination to console
138
+ if self.on_console:
139
+ if self.__console_handler is not None:
140
+ if Tools.do_log(logger, logging.DEBUG):
141
+ logger.debug("Log destination already set to console.")
142
+ else:
143
+ if Tools.do_log(logger, logging.DEBUG):
144
+ logger.debug("Adding log destination to console.")
145
+ self.__console_handler = self.__new_console_handler()
146
+ logger_.addHandler(self.__console_handler)
147
+ else:
148
+ if self.__console_handler is not None:
149
+ if Tools.do_log(logger, logging.DEBUG):
150
+ logger.debug("Removing log destination to console.")
151
+ logger_.removeHandler(self.__console_handler)
152
+ self.__console_handler = None
153
+
154
+ # Update log destination to files
155
+ with self.__files_lock:
156
+ # Remove old log files
157
+ # if self.__root_file_name:
158
+ # self.remove_root_file_handler(do_reset=True)
159
+ for file_name in list(self.__file_handlers.keys()):
160
+ if file_name not in self.__file_names:
161
+ self.remove_file_handler(file_name, do_remove_log_file=False)
162
+
163
+ # Add new log files
164
+ if self.__root_file_name and not self.__root_file_handler:
165
+ self.add_root_file_handler()
166
+ for file_name in self.__file_names:
167
+ if file_name not in list(self.__file_handlers.keys()):
168
+ self.add_file_handler(file_name)
169
+
170
+
171
+ # level
172
+ if logger_.getEffectiveLevel() != LogConfig.default_level:
173
+ logger_.setLevel(LogConfig.default_level)
174
+
175
+ # Loggers levels
176
+ for name, level in self.__loggers_levels:
177
+ if not name.startswith("#"):
178
+ logging.getLogger(name).setLevel(level)
179
+
180
+ def set_level(self, log_level, do_set_config=True):
181
+ from holado_core.common.exceptions.technical_exception import TechnicalException
182
+
183
+ if isinstance(log_level, str):
184
+ if hasattr(logging, log_level):
185
+ log_level = getattr(logging, log_level)
186
+ else:
187
+ raise TechnicalException(f"Unexpected log level string '{log_level}'")
188
+
189
+ LogConfig.default_level = log_level
190
+ if do_set_config:
191
+ self.set_config()
192
+
193
+ def add_root_file_handler(self):
194
+ from holado_core.common.exceptions.technical_exception import TechnicalException
195
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
196
+
197
+ logger_ = logging.getLogger()
198
+
199
+ if not self.__root_file_name:
200
+ raise TechnicalException("Root log file is not defined")
201
+
202
+ if self.__root_file_handler is None:
203
+ logger_.info("Creating file handler to root file '{}'.".format(self.__root_file_name))
204
+ Path(os.path.dirname(self.__root_file_name)).mkdir(parents=True, exist_ok=True)
205
+
206
+ self.__root_file_handler = logging.FileHandler(self.__root_file_name, mode='w', encoding='utf8')
207
+ self.__root_file_handler.setFormatter(logging.Formatter(fmt=self.format, style=self.style))
208
+ if MultitaskManager.has_thread_native_id():
209
+ self.__root_file_handler.addFilter(filter_thread_native_id)
210
+
211
+ logger_.addHandler(self.__root_file_handler)
212
+ self.__root_file_handler_active = True
213
+
214
+ def remove_root_file_handler(self, do_reset=False):
215
+ logger_ = logging.getLogger()
216
+ if self.__root_file_handler:
217
+ logger_.info(f"Removing log destination to root file '{self.__root_file_name}'.")
218
+ logger_.removeHandler(self.__root_file_handler)
219
+ self.__root_file_handler_active = False
220
+ if do_reset:
221
+ self.__root_file_handler = None
222
+
223
+ def add_file_handler(self, file_name, logger_=None):
224
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
225
+
226
+ if logger_ is None:
227
+ logger_ = logging.getLogger()
228
+
229
+ # In case this method is called outside "set_config" method, add file_name as a configured log_file
230
+ if not self.has_log_file(file_name):
231
+ self.add_log_file(file_name)
232
+
233
+ if file_name in self.__file_handlers:
234
+ logger_.debug("Log destination already set to file '{}'.".format(file_name))
235
+ else:
236
+ logger_.info("Adding log destination to file '{}'.".format(file_name))
237
+ Path(os.path.dirname(file_name)).mkdir(parents=True, exist_ok=True)
238
+
239
+ file_handler = logging.FileHandler(file_name, mode='w', encoding='utf8')
240
+ file_handler.setFormatter(logging.Formatter(fmt=self.format, style=self.style))
241
+ if MultitaskManager.has_thread_native_id():
242
+ file_handler.addFilter(filter_thread_native_id)
243
+
244
+ self.__file_handlers[file_name] = file_handler
245
+ logger_.addHandler(file_handler)
246
+
247
+ def remove_file_handler(self, file_name, logger_=None, do_remove_log_file=True):
248
+ from holado_core.common.exceptions.technical_exception import TechnicalException
249
+
250
+ if logger_ is None:
251
+ logger_ = logging.getLogger()
252
+
253
+ if file_name not in self.__file_handlers:
254
+ raise TechnicalException(f"Not set log destination to file '{file_name}'")
255
+
256
+ logger_.info("Removing log destination to file '{}'.".format(file_name))
257
+ logger_.removeHandler(self.__file_handlers[file_name])
258
+ del self.__file_handlers[file_name]
259
+
260
+ if do_remove_log_file:
261
+ self.remove_log_file(file_name)
262
+
263
+ def __remove_existing_file_handlers(self, log_level_if_exists=None):
264
+ with self.__files_lock:
265
+ if len(self.__file_names) > 0:
266
+ if log_level_if_exists is not None:
267
+ logger_ = logging.getLogger()
268
+ logger_.log(log_level_if_exists, f"Removing existing file handlers: {self.__file_names}")
269
+ file_names = list(self.__file_names)
270
+ else:
271
+ file_names = []
272
+
273
+ # Note: removes are done outside lock to avoid a deadlock
274
+ for fn in file_names:
275
+ self.remove_file_handler(fn)
276
+
277
+ def enter_log_file(self, file_name, do_remove_root_file_handler=True, do_remove_other_file_handlers=True):
278
+ if do_remove_other_file_handlers:
279
+ self.__remove_existing_file_handlers(log_level_if_exists=logging.ERROR)
280
+
281
+ self.add_file_handler(file_name)
282
+
283
+ if do_remove_root_file_handler:
284
+ self.remove_root_file_handler(do_reset=False)
285
+
286
+ def leave_log_file(self, file_name, do_remove_log_file=True):
287
+ if not self.__root_file_handler_active:
288
+ self.add_root_file_handler()
289
+ self.remove_file_handler(file_name, do_remove_log_file=do_remove_log_file)
290
+
291
+
292
+
@@ -0,0 +1,33 @@
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_multitask.multitasking.multitask_manager import MultitaskManager
23
+ SessionContext.instance().services.register_service_type("multitask_manager", MultitaskManager)
24
+
25
+ from holado_multitask.multiprocessing.processesmanager import ProcessesManager
26
+ SessionContext.instance().services.register_service_type("processes_manager",
27
+ lambda: ProcessesManager(SessionContext.instance().multitask_manager))
28
+
29
+ from holado_multitask.multithreading.threadsmanager import ThreadsManager
30
+ SessionContext.instance().services.register_service_type("threads_manager",
31
+ lambda: ThreadsManager(SessionContext.instance().multitask_manager))
32
+
33
+
@@ -0,0 +1,35 @@
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
+ from holado.common.context.context import Context
16
+ import logging
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class ProcessContext(Context):
22
+ def __init__(self, name, unique_name):
23
+ super().__init__(f"Process[{name};{unique_name}]")
24
+
25
+ self.__process_id = None
26
+ self.__process_name = name
27
+ self.__process_unique_name = unique_name
28
+
29
+ @property
30
+ def process_name(self):
31
+ return self.__process_name
32
+
33
+
34
+
35
+
@@ -0,0 +1,102 @@
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.block.function import Function
16
+ from holado_core.common.exceptions.functional_exception import FunctionalException
17
+ from holado_core.common.tools.tools import Tools
18
+ from holado_multitask.multiprocessing.process import InterruptableProcess
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class FunctionProcess(InterruptableProcess):
24
+ '''
25
+ Execute in a process given function with given arguments
26
+ '''
27
+
28
+ def __init__(self, target, args=None, kwargs=None, name = None, default_wait_timeout = None, register_process = True, delay_before_run_sec=None):
29
+ super().__init__(name if name is not None else f"FunctionProcess({repr(target)})", default_wait_timeout = default_wait_timeout, register_process = register_process, delay_before_run_sec=delay_before_run_sec)
30
+
31
+ if args is None:
32
+ args = []
33
+ if kwargs is None:
34
+ kwargs = {}
35
+
36
+ self._function = Function(target, *args, **kwargs)
37
+ self.__error = None
38
+ self.__result = None
39
+ self.__interrupt_function = None
40
+ self.__callback_function = None
41
+
42
+ @property
43
+ def error(self):
44
+ return self.__error
45
+
46
+ @property
47
+ def result(self):
48
+ return self.__result
49
+
50
+ @property
51
+ def interrupt_function(self):
52
+ return self.__interrupt_function
53
+
54
+ @interrupt_function.setter
55
+ def interrupt_function(self, func):
56
+ """Set the Function to call on interrupt"""
57
+ self.__interrupt_function = func
58
+
59
+ @property
60
+ def callback_function(self):
61
+ return self.__callback_function
62
+
63
+ @callback_function.setter
64
+ def callback_function(self, func):
65
+ """Set the callback function"""
66
+ self.__callback_function = func
67
+
68
+ def run(self):
69
+ # Start running by superclass run
70
+ super().run()
71
+
72
+ # self._raise_if_interrupted()
73
+ self.wait_before_run()
74
+
75
+ # self._raise_if_interrupted()
76
+ try:
77
+ # logging.debug("+++++++++ Launching function [{}({})]".format(repr(self._target), repr(self._args)))
78
+ self.__result = self._function.run()
79
+ except Exception as exc:
80
+ logger.exception(f"[{self.name}] Exception catched during processed function [{self._function.represent()}]")
81
+ self.__error = exc
82
+
83
+ # self._raise_if_interrupted()
84
+ try:
85
+ if self.__callback_function:
86
+ self.__callback_function.run(self.result, self.error)
87
+ except Exception as exc:
88
+ msg = f"[{self.name}] Exception catched while calling callback function:\n callback_function: {repr(self.__callback_function)}\n result: [{Tools.truncate_text(repr(self.result))}]\n error: [{repr(self.error)}]"
89
+ logger.exception(msg)
90
+ raise FunctionalException(msg) from exc
91
+
92
+ logger.info(f"[{self.name}] Process has finished")
93
+
94
+ def throw_if_error(self):
95
+ if self.error:
96
+ raise FunctionalException(f"[{self.name}] Error during call of function [{repr(self._target)}({repr(self._args)})]") from self.error
97
+
98
+ def interrupt(self):
99
+ if not self.is_interrupted and self.is_alive():
100
+ super().interrupt()
101
+ if self.interrupt_function is not None:
102
+ self.interrupt_function.run()