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

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

Potentially problematic release.


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

Files changed (523) hide show
  1. {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/METADATA +13 -9
  2. holado-0.2.3.dist-info/RECORD +535 -0
  3. holado_ais/__init__.py +33 -0
  4. holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
  5. holado_ais/ais/ais_manager.py +151 -0
  6. holado_ais/ais/ais_messages.py +203 -0
  7. holado_ais/ais/ais_payload.py +35 -0
  8. holado_ais/ais/enums.py +37 -0
  9. holado_ais/ais/patch_pyais.py +1303 -0
  10. holado_ais/tests/behave/steps/__init__.py +17 -0
  11. holado_ais/tests/behave/steps/ais/__init__.py +0 -0
  12. holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
  13. holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
  14. holado_binary/__init__.py +17 -0
  15. holado_binary/ipc/binary.py +125 -0
  16. holado_binary/ipc/bit_series.py +307 -0
  17. holado_binary/tests/behave/steps/__init__.py +17 -0
  18. holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
  19. holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
  20. holado_context/__init__.py +16 -0
  21. holado_context/tests/behave/steps/__init__.py +16 -0
  22. holado_context/tests/behave/steps/private/__init__.py +16 -0
  23. holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
  24. holado_core/__init__.py +32 -0
  25. holado_core/common/__init__.py +0 -0
  26. holado_core/common/actors/actions.py +97 -0
  27. holado_core/common/actors/actor.py +226 -0
  28. holado_core/common/actors/element_actor.py +32 -0
  29. holado_core/common/actors/find_actor.py +106 -0
  30. holado_core/common/actors/tree_actor.py +32 -0
  31. holado_core/common/actors/verify_actions.py +69 -0
  32. holado_core/common/block/base.py +122 -0
  33. holado_core/common/block/block_manager.py +173 -0
  34. holado_core/common/block/block_method.py +46 -0
  35. holado_core/common/block/block_steps.py +37 -0
  36. holado_core/common/block/function.py +42 -0
  37. holado_core/common/block/scope_function.py +28 -0
  38. holado_core/common/block/scope_manager.py +238 -0
  39. holado_core/common/block/scope_steps.py +141 -0
  40. holado_core/common/criterias/and_criteria.py +61 -0
  41. holado_core/common/criterias/criteria.py +78 -0
  42. holado_core/common/criterias/or_criteria.py +64 -0
  43. holado_core/common/criterias/tools/criteria_context.py +20 -0
  44. holado_core/common/criterias/tools/criteria_parameters.py +18 -0
  45. holado_core/common/drivers/driver.py +153 -0
  46. holado_core/common/drivers/element_driver.py +30 -0
  47. holado_core/common/drivers/element_internal_api.py +239 -0
  48. holado_core/common/drivers/internal_api.py +40 -0
  49. holado_core/common/drivers/tree_driver.py +30 -0
  50. holado_core/common/drivers/tree_internal_api.py +176 -0
  51. holado_core/common/exceptions/__init__.py +0 -0
  52. holado_core/common/exceptions/element_exception.py +28 -0
  53. holado_core/common/exceptions/exceptions.py +24 -0
  54. holado_core/common/exceptions/functional_exception.py +21 -0
  55. holado_core/common/exceptions/holado_exception.py +25 -0
  56. holado_core/common/exceptions/technical_exception.py +27 -0
  57. holado_core/common/exceptions/timeout_exception.py +20 -0
  58. holado_core/common/exceptions/verify_exception.py +20 -0
  59. holado_core/common/finders/after_in_tree_finder.py +87 -0
  60. holado_core/common/finders/element_finder.py +60 -0
  61. holado_core/common/finders/else_finder.py +105 -0
  62. holado_core/common/finders/finder.py +478 -0
  63. holado_core/common/finders/or_finder.py +98 -0
  64. holado_core/common/finders/then_finder.py +157 -0
  65. holado_core/common/finders/tools/enums.py +30 -0
  66. holado_core/common/finders/tools/find_builder.py +118 -0
  67. holado_core/common/finders/tools/find_context.py +405 -0
  68. holado_core/common/finders/tools/find_info.py +27 -0
  69. holado_core/common/finders/tools/find_parameters.py +240 -0
  70. holado_core/common/finders/tools/find_updater.py +95 -0
  71. holado_core/common/finders/tools/finder_info.py +26 -0
  72. holado_core/common/finders/tree_finder.py +146 -0
  73. holado_core/common/handlers/__init__.py +0 -0
  74. holado_core/common/handlers/abstracts/base_redo.py +695 -0
  75. holado_core/common/handlers/abstracts/get_or_create.py +120 -0
  76. holado_core/common/handlers/element_holder.py +122 -0
  77. holado_core/common/handlers/enums.py +23 -0
  78. holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
  79. holado_core/common/handlers/features/resource_by_name.py +187 -0
  80. holado_core/common/handlers/features/resource_by_type.py +174 -0
  81. holado_core/common/handlers/redo.py +119 -0
  82. holado_core/common/handlers/wait.py +127 -0
  83. holado_core/common/inspectors/element_inspector.py +57 -0
  84. holado_core/common/inspectors/inspector.py +221 -0
  85. holado_core/common/inspectors/tools/inspect_builder.py +169 -0
  86. holado_core/common/inspectors/tools/inspect_context.py +69 -0
  87. holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
  88. holado_core/common/inspectors/tree_inspector.py +73 -0
  89. holado_core/common/resource/persisted_data_manager.py +113 -0
  90. holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
  91. holado_core/common/resource/resource_manager.py +143 -0
  92. holado_core/common/tables/__init__.py +1 -0
  93. holado_core/common/tables/comparators/__init__.py +0 -0
  94. holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
  95. holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
  96. holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
  97. holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
  98. holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
  99. holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
  100. holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
  101. holado_core/common/tables/comparators/string_table_comparator.py +29 -0
  102. holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
  103. holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
  104. holado_core/common/tables/comparators/table_comparator.py +209 -0
  105. holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
  106. holado_core/common/tables/comparators/table_row_comparator.py +116 -0
  107. holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
  108. holado_core/common/tables/converters/__init__.py +0 -0
  109. holado_core/common/tables/converters/table_converter.py +194 -0
  110. holado_core/common/tables/enums.py +23 -0
  111. holado_core/common/tables/table.py +261 -0
  112. holado_core/common/tables/table_cell.py +126 -0
  113. holado_core/common/tables/table_manager.py +366 -0
  114. holado_core/common/tables/table_row.py +169 -0
  115. holado_core/common/tables/table_with_header.py +236 -0
  116. holado_core/common/tools/__init__.py +0 -0
  117. holado_core/common/tools/comparators/comparator.py +151 -0
  118. holado_core/common/tools/comparators/object_comparator.py +21 -0
  119. holado_core/common/tools/converters/converter.py +107 -0
  120. holado_core/common/tools/path_manager.py +185 -0
  121. holado_core/common/tools/string_tools.py +135 -0
  122. holado_core/common/tools/tools.py +172 -0
  123. holado_core/common/transport/__init__.py +0 -0
  124. holado_core/common/transport/crc.py +40 -0
  125. holado_core/tests/behave/steps/__init__.py +20 -0
  126. holado_core/tests/behave/steps/common/__init__.py +0 -0
  127. holado_core/tests/behave/steps/common/common_steps.py +136 -0
  128. holado_core/tests/behave/steps/common/config_steps.py +42 -0
  129. holado_core/tests/behave/steps/common/resource_steps.py +62 -0
  130. holado_core/tests/behave/steps/common/tables_steps.py +537 -0
  131. holado_core/tools/__init__.py +0 -0
  132. holado_core/tools/abstracts/__init__.py +0 -0
  133. holado_core/tools/abstracts/blocking_command_service.py +56 -0
  134. holado_core/tools/abstracts/service.py +48 -0
  135. holado_data/__init__.py +31 -0
  136. holado_data/data/generator/base.py +93 -0
  137. holado_data/data/generator/python_generator.py +30 -0
  138. holado_data/tests/behave/steps/__init__.py +17 -0
  139. holado_data/tests/behave/steps/data/generator_steps.py +91 -0
  140. holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
  141. holado_db/__init__.py +32 -0
  142. holado_db/tests/behave/steps/__init__.py +18 -0
  143. holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
  144. holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
  145. holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
  146. holado_db/tools/db/clients/base/db_client.py +206 -0
  147. holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
  148. holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
  149. holado_db/tools/db/db_manager.py +109 -0
  150. holado_db/tools/db/query/base/query_builder.py +87 -0
  151. holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
  152. holado_db/tools/db/query/query_manager.py +77 -0
  153. holado_docker/__init__.py +25 -0
  154. holado_docker/sdk/docker/docker_client.py +268 -0
  155. holado_docker/sdk/docker/docker_service.py +71 -0
  156. holado_docker/tests/behave/steps/__init__.py +16 -0
  157. holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
  158. holado_docker/tools/docker_controler/__init__.py +26 -0
  159. holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
  160. holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
  161. holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
  162. holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
  163. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
  164. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
  165. holado_grpc/__init__.py +32 -0
  166. holado_grpc/api/rpc/TODO.txt +4 -0
  167. holado_grpc/api/rpc/grpc_client.py +181 -0
  168. holado_grpc/api/rpc/grpc_manager.py +81 -0
  169. holado_grpc/ipc/rpc/__init__.py +0 -0
  170. holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
  171. holado_grpc/ipc/rpc/grpc_services.py +165 -0
  172. holado_grpc/tests/behave/steps/__init__.py +16 -0
  173. holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
  174. holado_grpc/tests/behave/steps/private/__init__.py +16 -0
  175. holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
  176. holado_helper/__init__.py +35 -0
  177. holado_helper/debug/README.txt +32 -0
  178. holado_helper/debug/memory/memory_profiler.py +106 -0
  179. holado_helper/docker/init_user.sh +24 -0
  180. holado_helper/docker/logging.conf +42 -0
  181. holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
  182. holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
  183. holado_helper/docker/run_terminal_in_docker.sh +101 -0
  184. holado_helper/holado_module_template/__init__.py +31 -0
  185. holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
  186. holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
  187. holado_helper/script/action.py +109 -0
  188. holado_helper/script/action_script.py +477 -0
  189. holado_helper/script/any_action_script.py +126 -0
  190. holado_helper/script/behave_action_script.py +99 -0
  191. holado_helper/script/csv_action_script.py +142 -0
  192. holado_helper/script/initialize_script.py +115 -0
  193. holado_helper/script/input_output_script.py +136 -0
  194. holado_helper/script/job.py +75 -0
  195. holado_helper/script/json_action_script.py +104 -0
  196. holado_helper/script/script.py +110 -0
  197. holado_json/__init__.py +16 -0
  198. holado_json/ipc/json.py +125 -0
  199. holado_json/ipc/json_converter.py +69 -0
  200. holado_json/ipc/json_types.py +183 -0
  201. holado_json/tests/behave/steps/__init__.py +16 -0
  202. holado_json/tests/behave/steps/ipc/__init__.py +0 -0
  203. holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
  204. holado_keycloak/__init__.py +16 -0
  205. holado_keycloak/tests/behave/steps/__init__.py +16 -0
  206. holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
  207. holado_keycloak/tools/keycloak/__init__.py +0 -0
  208. holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
  209. holado_logging/__init__.py +36 -0
  210. holado_logging/common/logging/holado_logger.py +75 -0
  211. holado_logging/common/logging/log_config.py +128 -0
  212. holado_logging/common/logging/log_manager.py +292 -0
  213. holado_multitask/__init__.py +33 -0
  214. holado_multitask/multiprocessing/context/process_context.py +35 -0
  215. holado_multitask/multiprocessing/function_process.py +102 -0
  216. holado_multitask/multiprocessing/periodic_function_process.py +135 -0
  217. holado_multitask/multiprocessing/process.py +196 -0
  218. holado_multitask/multiprocessing/processesmanager.py +133 -0
  219. holado_multitask/multitasking/multitask_manager.py +439 -0
  220. holado_multitask/multithreading/__init__.py +0 -0
  221. holado_multitask/multithreading/context/thread_context.py +84 -0
  222. holado_multitask/multithreading/functionthreaded.py +129 -0
  223. holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
  224. holado_multitask/multithreading/loopthread.py +100 -0
  225. holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
  226. holado_multitask/multithreading/reflection/inspect.py +47 -0
  227. holado_multitask/multithreading/reflection/sys.py +29 -0
  228. holado_multitask/multithreading/reflection/traceback.py +35 -0
  229. holado_multitask/multithreading/thread.py +177 -0
  230. holado_multitask/multithreading/threadsmanager.py +162 -0
  231. holado_multitask/multithreading/timer.py +48 -0
  232. holado_multitask/tests/behave/steps/__init__.py +17 -0
  233. holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
  234. holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
  235. holado_protobuf/__init__.py +61 -0
  236. holado_protobuf/ipc/protobuf/__init__.py +0 -0
  237. holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
  238. holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
  239. holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
  240. holado_protobuf/ipc/protobuf/protobuf_messages.py +965 -0
  241. holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
  242. holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
  243. holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
  244. holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
  245. holado_protobuf/tests/behave/steps/__init__.py +16 -0
  246. holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
  247. holado_python/__init__.py +35 -0
  248. holado_python/common/enums.py +34 -0
  249. holado_python/common/iterables.py +30 -0
  250. holado_python/common/tools/comparators/boolean_comparator.py +37 -0
  251. holado_python/common/tools/comparators/bytes_comparator.py +48 -0
  252. holado_python/common/tools/comparators/datetime_comparator.py +74 -0
  253. holado_python/common/tools/comparators/float_comparator.py +97 -0
  254. holado_python/common/tools/comparators/integer_comparator.py +37 -0
  255. holado_python/common/tools/comparators/string_comparator.py +99 -0
  256. holado_python/common/tools/comparators/type_comparator.py +31 -0
  257. holado_python/common/tools/datetime.py +279 -0
  258. holado_python/standard_library/csv.py +207 -0
  259. holado_python/standard_library/hashlib.py +82 -0
  260. holado_python/standard_library/multiprocessing.py +62 -0
  261. holado_python/standard_library/queue.py +79 -0
  262. holado_python/standard_library/socket/blocking_socket.py +136 -0
  263. holado_python/standard_library/socket/echo_server.py +28 -0
  264. holado_python/standard_library/socket/message_socket.py +91 -0
  265. holado_python/standard_library/socket/non_blocking_socket.py +151 -0
  266. holado_python/standard_library/socket/socket.py +148 -0
  267. holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
  268. holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
  269. holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
  270. holado_python/standard_library/ssl/ssl.py +81 -0
  271. holado_python/standard_library/typing.py +192 -0
  272. holado_python/tests/behave/steps/__init__.py +27 -0
  273. holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
  274. holado_python/tests/behave/steps/convert_steps.py +59 -0
  275. holado_python/tests/behave/steps/iterable_steps.py +87 -0
  276. holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
  277. holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
  278. holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
  279. holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
  280. holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
  281. holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
  282. holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
  283. holado_rabbitmq/__init__.py +28 -0
  284. holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
  285. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
  286. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
  287. holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
  288. holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +675 -0
  289. holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
  290. holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
  291. holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
  292. holado_redis/__init__.py +17 -0
  293. holado_redis/tests/behave/steps/__init__.py +16 -0
  294. holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
  295. holado_redis/tools/redis/TODO.txt +7 -0
  296. holado_redis/tools/redis/redis_client.py +190 -0
  297. holado_redis/tools/redis/redis_manager.py +38 -0
  298. holado_report/__init__.py +27 -0
  299. holado_report/report/analyze/execution_historic_manager.py +96 -0
  300. holado_report/report/analyze/scenario_duration_manager.py +245 -0
  301. holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
  302. holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
  303. holado_report/report/builders/report_builder.py +64 -0
  304. holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
  305. holado_report/report/builders/summary_report_builder.py +89 -0
  306. holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
  307. holado_report/report/builders/summary_scenario_report_builder.py +74 -0
  308. holado_report/report/execution_historic.py +141 -0
  309. holado_report/report/report_manager.py +256 -0
  310. holado_report/report/reports/base_report.py +163 -0
  311. holado_report/report/reports/feature_report.py +106 -0
  312. holado_report/report/reports/scenario_report.py +64 -0
  313. holado_rest/__init__.py +24 -0
  314. holado_rest/api/rest/TODO.txt +2 -0
  315. holado_rest/api/rest/rest_client.py +113 -0
  316. holado_rest/api/rest/rest_manager.py +62 -0
  317. holado_rest/tests/behave/steps/__init__.py +16 -0
  318. holado_rest/tests/behave/steps/api/__init__.py +0 -0
  319. holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
  320. holado_rest/tests/behave/steps/private/__init__.py +16 -0
  321. holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
  322. holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
  323. holado_s3/__init__.py +17 -0
  324. holado_s3/tests/behave/steps/__init__.py +17 -0
  325. holado_s3/tests/behave/steps/private/__init__.py +16 -0
  326. holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
  327. holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
  328. holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
  329. holado_s3/tools/s3/__init__.py +0 -0
  330. holado_s3/tools/s3/boto3_s3_client.py +59 -0
  331. holado_s3/tools/s3/minio_client.py +75 -0
  332. holado_s3/tools/s3/moto_server.py +52 -0
  333. holado_scripting/__init__.py +53 -0
  334. holado_scripting/common/tools/dynamic_text_manager.py +73 -0
  335. holado_scripting/common/tools/evaluate_parameters.py +210 -0
  336. holado_scripting/common/tools/expression_evaluator.py +387 -0
  337. holado_scripting/common/tools/variable_manager.py +321 -0
  338. holado_scripting/tests/behave/steps/__init__.py +22 -0
  339. holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
  340. holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
  341. holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
  342. holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
  343. holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
  344. holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
  345. holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
  346. holado_scripting/text/base/base_function.py +25 -0
  347. holado_scripting/text/base/base_verify_function.py +25 -0
  348. holado_scripting/text/base/text_inspecter.py +204 -0
  349. holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
  350. holado_scripting/text/interpreter/functions/function_cast.py +60 -0
  351. holado_scripting/text/interpreter/functions/function_convert.py +57 -0
  352. holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
  353. holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
  354. holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
  355. holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
  356. holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
  357. holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
  358. holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
  359. holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
  360. holado_scripting/text/interpreter/text_interpreter.py +216 -0
  361. holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
  362. holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
  363. holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
  364. holado_scripting/text/verifier/text_verifier.py +103 -0
  365. holado_sftp/__init__.py +16 -0
  366. holado_sftp/tests/behave/steps/__init__.py +17 -0
  367. holado_sftp/tests/behave/steps/private/__init__.py +16 -0
  368. holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
  369. holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
  370. holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
  371. holado_sftp/tools/sftp/__init__.py +0 -0
  372. holado_sftp/tools/sftp/sftp_client.py +103 -0
  373. holado_sftp/tools/sftp/sftp_server.py +39 -0
  374. holado_swagger/__init__.py +31 -0
  375. holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
  376. holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
  377. holado_swagger/tests/behave/steps/__init__.py +16 -0
  378. holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
  379. holado_system/system/command/command.py +216 -0
  380. holado_system/system/command/command_result.py +128 -0
  381. holado_system/system/command/curl_command.py +101 -0
  382. holado_system/system/command/exceptions.py +59 -0
  383. holado_system/system/filesystem/file.py +76 -0
  384. holado_system/system/global_system.py +187 -0
  385. holado_system/tests/behave/steps/__init__.py +18 -0
  386. holado_system/tests/behave/steps/system/commands_steps.py +92 -0
  387. holado_system/tests/behave/steps/system/file_steps.py +215 -0
  388. holado_system/tests/behave/steps/system/system_steps.py +84 -0
  389. holado_test/__init__.py +27 -0
  390. holado_test/behave/__init__.py +0 -0
  391. holado_test/behave/behave.py +397 -0
  392. holado_test/behave/behave_environment.py +143 -0
  393. holado_test/behave/behave_function.py +33 -0
  394. holado_test/behave/behave_manager.py +555 -0
  395. holado_test/behave/independant_runner.py +68 -0
  396. holado_test/behave/scenario/__init__.py +0 -0
  397. holado_test/behave/scenario/behave_step_tools.py +157 -0
  398. holado_test/common/context/feature_context.py +79 -0
  399. holado_test/common/context/scenario_context.py +217 -0
  400. holado_test/common/context/step_context.py +66 -0
  401. holado_test/common/exceptions/undefined_step_exception.py +21 -0
  402. holado_test/scenario/step_tools.py +523 -0
  403. holado_test/scenario/tester_tools.py +52 -0
  404. holado_test/test_config.py +26 -0
  405. holado_test/tests/behave/steps/__init__.py +18 -0
  406. holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
  407. holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
  408. holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
  409. holado_value/__init__.py +24 -0
  410. holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
  411. holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
  412. holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
  413. holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
  414. holado_value/common/tables/converters/value_table_converter.py +217 -0
  415. holado_value/common/tables/value_table.py +29 -0
  416. holado_value/common/tables/value_table_cell.py +67 -0
  417. holado_value/common/tables/value_table_manager.py +58 -0
  418. holado_value/common/tables/value_table_row.py +44 -0
  419. holado_value/common/tables/value_table_with_header.py +28 -0
  420. holado_value/common/tools/unique_value_manager.py +108 -0
  421. holado_value/common/tools/value.py +164 -0
  422. holado_value/common/tools/value_types.py +35 -0
  423. holado_value/tests/behave/steps/__init__.py +16 -0
  424. holado_value/tests/behave/steps/private/__init__.py +16 -0
  425. holado_ws/__init__.py +16 -0
  426. holado_ws/api/ws/TODO.txt +2 -0
  427. holado_ws/tests/behave/steps/__init__.py +16 -0
  428. holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
  429. holado_yaml/__init__.py +31 -0
  430. holado_yaml/tests/behave/steps/__init__.py +16 -0
  431. holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
  432. holado_yaml/yaml/yaml_manager.py +86 -0
  433. test_holado/Dockerfile_test_holado +82 -0
  434. test_holado/__init__.py +4 -0
  435. test_holado/__main__.py +25 -0
  436. test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
  437. test_holado/environment.py +42 -0
  438. test_holado/features/NonReg/api/REST.feature +21 -0
  439. test_holado/features/NonReg/api/gRPC.feature +122 -0
  440. test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
  441. test_holado/features/NonReg/common/system/commands.feature +43 -0
  442. test_holado/features/NonReg/common/system/system.feature +20 -0
  443. test_holado/features/NonReg/common/tables/table.feature +239 -0
  444. test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
  445. test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
  446. test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
  447. test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
  448. test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
  449. test_holado/features/NonReg/holado_python/convert.feature +20 -0
  450. test_holado/features/NonReg/holado_python/iterable.feature +61 -0
  451. test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
  452. test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
  453. test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
  454. test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
  455. test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
  456. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
  457. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
  458. test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
  459. test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
  460. test_holado/features/NonReg/ipc/bit_series.feature +131 -0
  461. test_holado/features/NonReg/ipc/json.feature +20 -0
  462. test_holado/features/NonReg/scenario/scenario.feature +139 -0
  463. test_holado/features/NonReg/test_steps/behave.feature +275 -0
  464. test_holado/features/NonReg/test_steps/common.feature +100 -0
  465. test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
  466. test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
  467. test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
  468. test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
  469. test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
  470. test_holado/features/NonReg/tools/sFTP.feature +25 -0
  471. test_holado/features/Test/logger.feature +28 -0
  472. test_holado/features/__init__.py +0 -0
  473. test_holado/logging.conf +41 -0
  474. test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
  475. test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
  476. test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
  477. test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
  478. test_holado/resources/scripts/list_tags.sh +2 -0
  479. test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
  480. test_holado/steps/__init__.py +0 -0
  481. test_holado/steps/private_steps.py +20 -0
  482. test_holado/steps/public_steps.py +23 -0
  483. test_holado/test_holado_session_context.py +43 -0
  484. test_holado/tools/django/README.txt +3 -0
  485. test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
  486. test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
  487. test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
  488. test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
  489. test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
  490. test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
  491. test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
  492. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
  493. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
  494. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
  495. test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
  496. test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
  497. test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
  498. test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
  499. test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
  500. test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
  501. test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
  502. test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
  503. test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
  504. test_holado/tools/django/api_grpc/manage.py +27 -0
  505. test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
  506. test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
  507. test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
  508. test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
  509. test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
  510. test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
  511. test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
  512. test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
  513. test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
  514. test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
  515. test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
  516. test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
  517. test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
  518. test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
  519. test_holado/tools/django/api_rest/db.sqlite3 +0 -0
  520. test_holado/tools/django/api_rest/manage.py +22 -0
  521. holado-0.2.2.dist-info/RECORD +0 -17
  522. {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/WHEEL +0 -0
  523. {holado-0.2.2.dist-info → holado-0.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,207 @@
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
+ import logging
16
+ import csv
17
+ from holado_core.common.tables.table_with_header import TableWithHeader
18
+ from holado_core.common.tables.table_row import TableRow
19
+ from holado.common.context.session_context import SessionContext
20
+ from holado_core.common.tables.table import Table
21
+ from holado_core.common.tables.table_manager import TableManager
22
+ from holado_data.data.generator.base import BaseGenerator
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+
28
+
29
+ class CsvManager():
30
+ # Default settings for CSV files: dialect Excel but with ';' delimiter
31
+ default_dialect = "excel"
32
+ default_delimiter = ";"
33
+ default_quotechar = None
34
+ default_quoting = None
35
+
36
+ @classmethod
37
+ def __get_path_manager(cls):
38
+ return SessionContext.instance().path_manager
39
+
40
+ @classmethod
41
+ def _get_csv_kwargs(cls, dialect, delimiter, quotechar, quoting):
42
+ csv_kwargs = {}
43
+
44
+ if dialect is not None:
45
+ csv_kwargs['dialect'] = dialect
46
+ elif cls.default_dialect is not None:
47
+ csv_kwargs['dialect'] = cls.default_dialect
48
+
49
+ if delimiter is not None:
50
+ csv_kwargs['delimiter'] = delimiter
51
+ elif cls.default_delimiter is not None:
52
+ csv_kwargs['delimiter'] = cls.default_delimiter
53
+
54
+ if quotechar is not None:
55
+ csv_kwargs['quotechar'] = quotechar
56
+ elif cls.default_quotechar is not None:
57
+ csv_kwargs['quotechar'] = cls.default_quotechar
58
+
59
+ if quoting is not None:
60
+ csv_kwargs['quoting'] = quoting
61
+ elif cls.default_quoting is not None:
62
+ csv_kwargs['quoting'] = cls.default_quoting
63
+
64
+ return csv_kwargs
65
+
66
+ @classmethod
67
+ def table_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None, with_header=True):
68
+ csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
69
+
70
+ with open(path, 'r', encoding=encoding) as fin:
71
+ if with_header:
72
+ dr = csv.DictReader(fin, **csv_kwargs)
73
+
74
+ res = TableWithHeader()
75
+ res.header = TableRow(cells_content=dr.fieldnames)
76
+
77
+ for row in dr:
78
+ nrow=dict(row)
79
+ res.add_row(contents_by_colname=nrow)
80
+ else:
81
+ reader = csv.reader(fin, **csv_kwargs)
82
+
83
+ res = Table()
84
+ for row in reader:
85
+ res.add_row(cells_content=row)
86
+
87
+ return res
88
+
89
+ @classmethod
90
+ def dict_list_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
91
+ dg = cls.dict_generator_with_content_of_CSV_file(path, encoding, dialect, delimiter, quotechar, quoting)
92
+ return [d for d in dg]
93
+
94
+ @classmethod
95
+ def dict_generator_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
96
+ csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
97
+
98
+ class DictCSVGenerator(BaseGenerator):
99
+ def __init__(self, path, encoding, csv_kwargs):
100
+ super().__init__(name="dict CSV generator")
101
+
102
+ self.__path = path
103
+ self.__encoding = encoding
104
+ self.__csv_kwargs = csv_kwargs
105
+
106
+ self.__fin = None
107
+ self.__dict_reader = None
108
+
109
+ def __open_file_if_needed(self):
110
+ if self.__fin is None:
111
+ self.__fin = open(self.__path, 'r', encoding=self.__encoding)
112
+ self.__dict_reader = csv.DictReader(self.__fin, **self.__csv_kwargs)
113
+
114
+ def __close_file(self):
115
+ self.__dict_reader = None
116
+ self.__fin.close()
117
+ self.__fin = None
118
+
119
+ def __next__(self):
120
+ self.__open_file_if_needed()
121
+ try:
122
+ return dict(next(self.__dict_reader))
123
+ except StopIteration as exc:
124
+ self.__close_file()
125
+ raise exc
126
+
127
+ return DictCSVGenerator(path, encoding, csv_kwargs)
128
+
129
+ @classmethod
130
+ def tuple_list_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
131
+ tg = cls.tuple_generator_with_content_of_CSV_file(path, encoding, dialect, delimiter, quotechar, quoting)
132
+ return [t for t in tg]
133
+
134
+ @classmethod
135
+ def tuple_generator_with_content_of_CSV_file(cls, path, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
136
+ csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
137
+
138
+ class TupleCSVGenerator(BaseGenerator):
139
+ def __init__(self, path, encoding, csv_kwargs):
140
+ super().__init__(name="tuple CSV generator")
141
+
142
+ self.__path = path
143
+ self.__encoding = encoding
144
+ self.__csv_kwargs = csv_kwargs
145
+
146
+ self.__fin = None
147
+ self.__reader = None
148
+
149
+ def __open_file_if_needed(self):
150
+ if self.__fin is None:
151
+ self.__fin = open(self.__path, 'r', encoding=self.__encoding)
152
+ self.__reader = csv.reader(self.__fin, **self.__csv_kwargs)
153
+
154
+ def __close_file(self):
155
+ self.__reader = None
156
+ self.__fin.close()
157
+ self.__fin = None
158
+
159
+ def __next__(self):
160
+ self.__open_file_if_needed()
161
+ try:
162
+ return tuple(next(self.__reader))
163
+ except StopIteration as exc:
164
+ self.__close_file()
165
+ raise exc
166
+
167
+ return TupleCSVGenerator(path, encoding, csv_kwargs)
168
+
169
+ @classmethod
170
+ def create_csv_file(cls, path, table, encoding=None, dialect=None, delimiter=None, quotechar=None, quoting=None):
171
+ csv_kwargs = cls._get_csv_kwargs(dialect, delimiter, quotechar, quoting)
172
+
173
+ cls.__get_path_manager().makedirs(path)
174
+
175
+ with open(path, 'w', encoding=encoding) as fout:
176
+ if TableManager.is_table_with_header(table):
177
+ fieldnames = table.header.cells_content
178
+ dw = csv.DictWriter(fout, fieldnames=fieldnames, **csv_kwargs)
179
+
180
+ dw.writeheader()
181
+ for row in table.rows:
182
+ rowdict = {fieldnames[i]:row[i].string_content for i in range(len(fieldnames))}
183
+ dw.writerow(rowdict)
184
+ else:
185
+ writer = csv.writer(fout, **csv_kwargs)
186
+ for row in table.rows:
187
+ cells_content = [c.string_content for c in row]
188
+ writer.writerow(cells_content)
189
+
190
+ @classmethod
191
+ def merge_csv(cls, input_paths, output_path=None, sort_column=None, with_header=True):
192
+ input_tables = [cls.table_with_content_of_CSV_file(ip, with_header=with_header) for ip in input_paths]
193
+
194
+ # Merge tables
195
+ output_table = input_tables[0]
196
+ for i in range(1, len(input_tables)):
197
+ output_table.extend(input_tables[i])
198
+
199
+ # Sort rows
200
+ if sort_column is not None:
201
+ output_table.sort(names=[sort_column])
202
+
203
+ if output_path is not None:
204
+ cls.create_csv_file(output_path, output_table)
205
+ else:
206
+ return output_table
207
+
@@ -0,0 +1,82 @@
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
+ import logging
16
+ import hashlib
17
+ from holado_core.common.exceptions.technical_exception import TechnicalException
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+
23
+
24
+ class HashTools(object):
25
+
26
+ @classmethod
27
+ def code(cls, content, code_size=None, prefix=None):
28
+ hex_size = code_size
29
+ if hex_size is not None:
30
+ if prefix is not None:
31
+ hex_size = hex_size - len(prefix)
32
+ hex_size = hex_size // 2 * 2
33
+
34
+ res = cls.hexblake2(content, hex_size=hex_size)
35
+
36
+ if prefix is not None:
37
+ res = prefix + res
38
+
39
+ return res
40
+
41
+ @classmethod
42
+ def hexmd5(cls, content):
43
+ hash_obj = hashlib.md5()
44
+ cls._update_hash(hash_obj, content)
45
+ return hash_obj.hexdigest()
46
+
47
+ @classmethod
48
+ def hexblake2(cls, content, hex_size=None, **hash_kwargs):
49
+ if hex_size is not None:
50
+ if isinstance(hex_size, int):
51
+ digest_size = hex_size // 2
52
+ else:
53
+ raise TechnicalException(f"Parameter hex_size must be an integer")
54
+ hash_kwargs['digest_size'] = digest_size
55
+
56
+ hash_obj = hashlib.blake2b(**hash_kwargs)
57
+ cls._update_hash(hash_obj, content)
58
+ return hash_obj.hexdigest()
59
+
60
+ @classmethod
61
+ def _update_hash(cls, hash_obj, content):
62
+ # Manage list separately for memory purpose
63
+ done = False
64
+ if not isinstance(content, str):
65
+ try:
66
+ for cont in content:
67
+ if type(cont) != bytes:
68
+ cont = cont.encode('utf-8')
69
+ hash_obj.update(cont)
70
+ done = True
71
+ except TypeError:
72
+ done = False
73
+
74
+ if not done:
75
+ if type(content) != bytes:
76
+ content = content.encode('utf-8')
77
+ hash_obj.update(content)
78
+
79
+
80
+
81
+
82
+
@@ -0,0 +1,62 @@
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
+ import logging
16
+ import typing
17
+ import multiprocessing.context
18
+ import multiprocessing.queues
19
+ from holado_python.standard_library.queue import IterableQueue
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class IterableJoinableQueue(multiprocessing.queues.JoinableQueue, typing.Iterable):
25
+
26
+ __sentinel = IterableQueue.Sentinel()
27
+
28
+ def __init__(self, maxsize=0, block_on_get=True, block_on_get_timeout=None, block_on_put=True, block_on_put_timeout=None):
29
+ super().__init__(maxsize if maxsize else 0, ctx=multiprocessing.context._default_context.get_context())
30
+ self.__block_on_get = block_on_get if block_on_get is not None else True
31
+ self.__block_on_get_timeout = block_on_get_timeout
32
+ self.__block_on_put = block_on_put if block_on_put is not None else True
33
+ self.__block_on_put_timeout = block_on_put_timeout
34
+
35
+ def __iter__(self):
36
+ return iter(self.get, self.__sentinel)
37
+
38
+ def __len__(self):
39
+ return self.qsize()
40
+
41
+ def close(self):
42
+ self.put(self.__sentinel)
43
+
44
+ def get(self):
45
+ res = super().get(block=self.__block_on_get, timeout=self.__block_on_get_timeout)
46
+
47
+ # Put again the sentinel in case of multiple readers
48
+ if self.is_sentinel(res):
49
+ self.put(res)
50
+
51
+ return res
52
+
53
+ def put(self, item):
54
+ return super().put(item, block=self.__block_on_put, timeout=self.__block_on_put_timeout)
55
+
56
+ def is_sentinel(self, item):
57
+ return item == self.__sentinel
58
+
59
+
60
+
61
+
62
+
@@ -0,0 +1,79 @@
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
+ import logging
16
+ import queue
17
+ import typing
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class IterableQueue(queue.Queue, typing.Iterable):
23
+
24
+ class Sentinel(object):
25
+ def __eq__(self, __o: object) -> bool:
26
+ return isinstance(__o, IterableQueue.Sentinel)
27
+
28
+ __sentinel = Sentinel()
29
+
30
+
31
+ def __init__(self, maxsize=0, block_on_get=True, block_on_get_timeout=None, block_on_put=True, block_on_put_timeout=None):
32
+ super().__init__(maxsize if maxsize else 0)
33
+ self.__block_on_get = block_on_get if block_on_get is not None else True
34
+ self.__block_on_get_timeout = block_on_get_timeout
35
+ self.__block_on_put = block_on_put if block_on_put is not None else True
36
+ self.__block_on_put_timeout = block_on_put_timeout
37
+
38
+ def __iter__(self):
39
+ return iter(self.get, self.__sentinel)
40
+
41
+ def __len__(self):
42
+ return self.qsize()
43
+
44
+ def close(self):
45
+ self.put(self.__sentinel)
46
+
47
+ def get(self):
48
+ res = super().get(block=self.__block_on_get, timeout=self.__block_on_get_timeout)
49
+
50
+ # Put again the sentinel in case of multiple readers
51
+ if self.is_sentinel(res):
52
+ self.put(res)
53
+
54
+ return res
55
+
56
+ def put(self, item):
57
+ return super().put(item, block=self.__block_on_put, timeout=self.__block_on_put_timeout)
58
+
59
+ def is_sentinel(self, item):
60
+ return item == self.__sentinel
61
+
62
+
63
+ class IterableLifoQueue(IterableQueue):
64
+ '''Copyt of implementation of queue.LifoQueue but inheriting of IterableQueue.'''
65
+
66
+ def _init(self, maxsize):
67
+ self.queue = []
68
+
69
+ def _qsize(self):
70
+ return len(self.queue)
71
+
72
+ def _put(self, item):
73
+ self.queue.append(item)
74
+
75
+ def _get(self):
76
+ return self.queue.pop()
77
+
78
+
79
+
@@ -0,0 +1,136 @@
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
+ import socket
16
+ from holado_python.standard_library.socket.socket import SocketClient, SocketServer
17
+ import abc
18
+ from holado_multitask.multithreading.loopfunctionthreaded import LoopFunctionThreaded
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ ##########################################################################
24
+ ## Clients
25
+ ##########################################################################
26
+
27
+
28
+ class BlockingSocketClient(SocketClient):
29
+ """
30
+ Base class for blocking socket client.
31
+ """
32
+ __metaclass__ = abc.ABCMeta
33
+
34
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
35
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
36
+
37
+
38
+ class TCPBlockingSocketClient(BlockingSocketClient):
39
+ """
40
+ TCP socket client.
41
+ """
42
+
43
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
44
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
45
+
46
+ def create_ipv4_socket(self, host, port, **kwargs):
47
+ ssl_context, kwargs = self._new_ssl_context_if_required(**kwargs)
48
+
49
+ sock = socket.create_connection((host, port), **kwargs)
50
+
51
+ if ssl_context:
52
+ sock = ssl_context.wrap_socket(sock, server_hostname=host, do_handshake_on_connect=False)
53
+ # sock = ssl_context.wrap_socket(sock, server_hostname=host)
54
+ self._set_internal_socket(sock)
55
+
56
+
57
+
58
+
59
+ ##########################################################################
60
+ ## Servers
61
+ ##########################################################################
62
+
63
+
64
+ class BlockingSocketServer(SocketServer):
65
+ """
66
+ Base class for socket servers.
67
+ """
68
+ __metaclass__ = abc.ABCMeta
69
+
70
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
71
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
72
+
73
+ self.__start_thread = None
74
+
75
+ def start(self, read_bufsize=1024, *, read_kwargs=None, write_kwargs=None):
76
+ """Start server to wait a connection, and then listen data, process data, and send result.
77
+ Note: current implementation is simple and supports only one connection at a time.
78
+ """
79
+ kwargs = {'read_bufsize':read_bufsize, 'read_kwargs':read_kwargs, 'write_kwargs':write_kwargs}
80
+ self.__start_thread = LoopFunctionThreaded(self.wait_and_process_connection, kwargs=kwargs, register_thread=True, delay_before_run_sec=None)
81
+ self.__start_thread.start()
82
+
83
+ def stop(self):
84
+ if self.__start_thread is not None:
85
+ self.__start_thread.interrupt()
86
+ self.__start_thread.join()
87
+ self.__start_thread = None
88
+
89
+ def wait_and_process_connection(self, read_bufsize=1024, *, read_kwargs=None, write_kwargs=None):
90
+ """Wait a connection, and then listen data, process data, and send result.
91
+ Note: current implementation is simple and supports only one connection at a time.
92
+ """
93
+ read_kwargs = read_kwargs if read_kwargs is not None else {}
94
+ write_kwargs = write_kwargs if write_kwargs is not None else {}
95
+
96
+ conn, _ = self.accept()
97
+ if logger.isEnabledFor(logging.DEBUG):
98
+ logger.debug(f"[{self.name}] New connection: {conn}")
99
+ with conn:
100
+ while True:
101
+ data = conn.read(read_bufsize, **read_kwargs)
102
+ if logger.isEnabledFor(logging.DEBUG):
103
+ logger.debug(f"[{self.name}] Received: {data}")
104
+
105
+ if not data:
106
+ break
107
+ result = self._process_data(data)
108
+
109
+ if logger.isEnabledFor(logging.DEBUG):
110
+ logger.debug(f"[{self.name}] Sending: {result}")
111
+ conn.write(result, **write_kwargs)
112
+
113
+ @abc.abstractmethod
114
+ def _process_data(self, data):
115
+ raise NotImplementedError()
116
+
117
+
118
+
119
+ class TCPBlockingSocketServer(BlockingSocketServer):
120
+ """
121
+ TCP socket server
122
+ """
123
+
124
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
125
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
126
+
127
+ def create_ipv4_socket(self, host, port, **kwargs):
128
+ ssl_context, kwargs = self._new_ssl_context_if_required(server_side=True, **kwargs)
129
+
130
+ sock = socket.create_server((host, port), **kwargs)
131
+
132
+ if ssl_context:
133
+ # sock = ssl_context.wrap_socket(sock, do_handshake_on_connect=False, server_side=True)
134
+ sock = ssl_context.wrap_socket(sock, server_side=True)
135
+ self._set_internal_socket(sock)
136
+
@@ -0,0 +1,28 @@
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_python.standard_library.socket.blocking_socket import TCPBlockingSocketServer
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+
21
+ class EchoTCPBlockingSocketServer(TCPBlockingSocketServer):
22
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
23
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
24
+
25
+ def _process_data(self, data):
26
+ return data
27
+
28
+
@@ -0,0 +1,91 @@
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
+ import abc
16
+ import selectors
17
+ from holado_python.standard_library.socket.non_blocking_socket import TCPNonBlockingSocketClient
18
+ import copy
19
+ import threading
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ ##########################################################################
25
+ ## Clients
26
+ ##########################################################################
27
+
28
+
29
+ class MessageTCPSocketClient(TCPNonBlockingSocketClient):
30
+ """
31
+ Base class for blocking socket client.
32
+ """
33
+ __metaclass__ = abc.ABCMeta
34
+
35
+ def __init__(self, separator=b'\n', *, name=None, create_ipv4_socket_kwargs=None):
36
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
37
+
38
+ self.__separator = separator
39
+ self.__messages_lock = threading.Lock()
40
+ self.__messages = []
41
+
42
+ @property
43
+ def messages(self):
44
+ return self.__messages
45
+
46
+ @property
47
+ def nb_messages(self):
48
+ return len(self.__messages)
49
+
50
+ def _service_connection(self, key, mask, *, read_bufsize=1024, read_kwargs=None, write_kwargs=None):
51
+ # Read from socket & write in socket
52
+ super()._service_connection(key, mask, read_bufsize=read_bufsize, read_kwargs=read_kwargs, write_kwargs=write_kwargs)
53
+
54
+ # Extract messages from received data
55
+ if mask & selectors.EVENT_READ:
56
+ with self._data_lock:
57
+ while True:
58
+ ind = self._data.in_bytes.find(self.__separator)
59
+ if ind >=0:
60
+ msg = self._data.in_bytes[:ind]
61
+ self.__add_message(msg)
62
+ self._data.in_bytes = self._data.in_bytes[ind+len(self.__separator):]
63
+ else:
64
+ break
65
+
66
+ def __add_message(self, msg):
67
+ with self.__messages_lock:
68
+ self.__messages.append(msg)
69
+
70
+ def read_message(self):
71
+ res = None
72
+ with self.__messages_lock:
73
+ if len(self.__messages) > 0:
74
+ res = self.__messages.pop(0)
75
+ return res
76
+
77
+ def read_messages(self):
78
+ with self.__messages_lock:
79
+ res = copy.copy(self.__messages)
80
+ self.__messages.clear()
81
+ return res
82
+
83
+ def write_message(self, msg_bytes):
84
+ self.write(msg_bytes + self.__separator)
85
+
86
+
87
+
88
+
89
+
90
+
91
+