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,151 @@
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
17
+ import abc
18
+ from holado_multitask.multithreading.loopfunctionthreaded import LoopFunctionThreaded
19
+ import selectors
20
+ import types
21
+ import threading
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ ##########################################################################
27
+ ## Clients
28
+ ##########################################################################
29
+
30
+
31
+ class NonBlockingSocketClient(SocketClient):
32
+ """
33
+ Base class for blocking socket client.
34
+ """
35
+ __metaclass__ = abc.ABCMeta
36
+
37
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
38
+ self.__selector = selectors.DefaultSelector()
39
+
40
+ self.__data_lock = threading.Lock()
41
+ self.__data = types.SimpleNamespace(
42
+ in_bytes=b"",
43
+ out_bytes=b"",
44
+ )
45
+
46
+ # Note: __selector and __data must be defined before, since Socket.__init__ can execute create_ipv4_socket
47
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
48
+
49
+ self.__start_thread = None
50
+
51
+ def _delete_object(self):
52
+ self.stop()
53
+ if self.internal_socket:
54
+ self.__selector.unregister(self.internal_socket)
55
+
56
+ super()._delete_object()
57
+
58
+ def _register_socket(self, sock):
59
+ events = selectors.EVENT_READ | selectors.EVENT_WRITE
60
+ self.__selector.register(sock, events, data=self.__data)
61
+
62
+ @property
63
+ def _data_lock(self):
64
+ return self.__data_lock
65
+
66
+ @property
67
+ def _data(self):
68
+ return self.__data
69
+
70
+ def start(self, *, read_bufsize=1024, read_kwargs=None, write_kwargs=None):
71
+ """Start client event loop.
72
+ """
73
+ kwargs = {'read_bufsize':read_bufsize, 'read_kwargs':read_kwargs, 'write_kwargs':write_kwargs}
74
+ self.__start_thread = LoopFunctionThreaded(self._wait_and_process_events, kwargs=kwargs, register_thread=True, delay_before_run_sec=None)
75
+ self.__start_thread.start()
76
+
77
+ def stop(self):
78
+ if self.__start_thread is not None:
79
+ self.__start_thread.interrupt()
80
+ self.__start_thread.join()
81
+ self.__start_thread = None
82
+
83
+ def _wait_and_process_events(self, *, read_bufsize=1024, read_kwargs=None, write_kwargs=None):
84
+ events = self.__selector.select(timeout=None)
85
+ for key, mask in events:
86
+ self._service_connection(key, mask, read_bufsize=read_bufsize, read_kwargs=read_kwargs, write_kwargs=write_kwargs)
87
+
88
+ def _service_connection(self, key, mask, *, read_bufsize=1024, read_kwargs=None, write_kwargs=None):
89
+ read_kwargs = read_kwargs if read_kwargs is not None else {}
90
+ write_kwargs = write_kwargs if write_kwargs is not None else {}
91
+
92
+ sock = key.fileobj
93
+ data = key.data
94
+ if mask & selectors.EVENT_READ:
95
+ recv_data = sock.recv(read_bufsize, **read_kwargs)
96
+ if recv_data:
97
+ with self.__data_lock: # data is self.__data
98
+ data.in_bytes += recv_data
99
+ if mask & selectors.EVENT_WRITE:
100
+ with self.__data_lock: # data is self.__data
101
+ if data.out_bytes:
102
+ sent = sock.send(data.out_bytes)
103
+ data.out_bytes = data.out_bytes[sent:]
104
+
105
+ @property
106
+ def received_data_size(self):
107
+ with self.__data_lock:
108
+ res = len(self.__data.in_bytes)
109
+ return res
110
+
111
+ def read(self, bufsize=1024):
112
+ with self.__data_lock:
113
+ if self.__data.in_bytes:
114
+ res = self.__data.in_bytes[:bufsize]
115
+ self.__data.in_bytes = self.__data.in_bytes[bufsize:]
116
+ else:
117
+ res = b''
118
+ return res
119
+
120
+ def write(self, data_bytes):
121
+ with self.__data_lock:
122
+ self.__data.out_bytes += data_bytes
123
+
124
+
125
+ class TCPNonBlockingSocketClient(NonBlockingSocketClient):
126
+ """
127
+ TCP socket client.
128
+ """
129
+
130
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
131
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
132
+
133
+ def create_ipv4_socket(self, host, port, **kwargs):
134
+ ssl_context, kwargs = self._new_ssl_context_if_required(**kwargs)
135
+
136
+ sock = socket.create_connection((host, port), **kwargs)
137
+ sock.setblocking(False)
138
+
139
+ if ssl_context:
140
+ sock = ssl_context.wrap_socket(sock, server_hostname=host, do_handshake_on_connect=False)
141
+ self._set_internal_socket(sock)
142
+
143
+ # Register socket
144
+ self._register_socket(sock)
145
+
146
+
147
+
148
+
149
+
150
+
151
+
@@ -0,0 +1,148 @@
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 _socket import SHUT_RDWR
17
+ from holado.common.handlers.object import DeleteableObject
18
+ import abc
19
+ from holado_core.common.exceptions.functional_exception import FunctionalException
20
+ from holado_core.common.tools.tools import Tools
21
+ from holado_python.standard_library.ssl.ssl import SslManager
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class Socket(DeleteableObject):
27
+ """
28
+ Base class for socket objects.
29
+
30
+ It is implemented internally with standard library socket.
31
+ """
32
+ __metaclass__ = abc.ABCMeta
33
+
34
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
35
+ if name is None and create_ipv4_socket_kwargs is not None:
36
+ if not set(create_ipv4_socket_kwargs.keys()).issuperset({'host', 'port'}):
37
+ raise FunctionalException(f"Parameters 'host' and 'port' must be defined")
38
+ name = f"{create_ipv4_socket_kwargs['host']}:{create_ipv4_socket_kwargs['port']}"
39
+
40
+ super().__init__(name)
41
+ self.__socket = None
42
+
43
+ if create_ipv4_socket_kwargs is not None:
44
+ self.create_ipv4_socket(**create_ipv4_socket_kwargs)
45
+
46
+ def __enter__(self):
47
+ return self
48
+
49
+ def __exit__(self, *args):
50
+ self.close()
51
+
52
+ def _delete_object(self):
53
+ self.close()
54
+
55
+ @property
56
+ def internal_socket(self) -> socket.socket:
57
+ return self.__socket
58
+
59
+ def _set_internal_socket(self, socket):
60
+ self.__socket = socket
61
+
62
+ @abc.abstractmethod
63
+ def create_ipv4_socket(self, host, port, **kwargs):
64
+ raise NotImplementedError()
65
+
66
+ def close(self):
67
+ if self.__socket is not None:
68
+ try:
69
+ self.__socket.shutdown(SHUT_RDWR)
70
+ except OSError as exc:
71
+ if 'Errno 107' in str(exc):
72
+ logger.info(f"Got following error on socket shutdown (known to appear sometimes at shutdown): {exc}")
73
+ else:
74
+ raise exc
75
+ self.__socket.close()
76
+ self.__socket = None
77
+
78
+ def read(self, bufsize=1024, **kwargs):
79
+ res = self.internal_socket.recv(bufsize, **kwargs)
80
+ if logger.isEnabledFor(logging.DEBUG):
81
+ logger.debug(f"[{self.name}] Received [{res}] (type: {type(res)})")
82
+ return res
83
+
84
+ def write(self, data_bytes, loop_until_all_is_sent=True, **kwargs):
85
+ if loop_until_all_is_sent:
86
+ # Note: no return is done, since sendall return None or raise an exception on error
87
+ self.internal_socket.sendall(data_bytes, **kwargs)
88
+ if logger.isEnabledFor(logging.DEBUG):
89
+ logger.debug(f"[{self.name}] Sent all [{data_bytes}] (type: {type(data_bytes)})")
90
+ else:
91
+ res = self.internal_socket.send(data_bytes, **kwargs)
92
+ if logger.isEnabledFor(logging.DEBUG):
93
+ logger.debug(f"[{self.name}] Sent {res}/{len(data_bytes)} bytes of [{data_bytes}] (type: {type(data_bytes)})")
94
+ return res
95
+
96
+ def _new_ssl_context_if_required(self, server_side=False, **socket_kwargs):
97
+ """Return a SSLContext if required, and the remaining socket kwargs.
98
+ """
99
+ res = None
100
+ if Tools.has_sub_kwargs(socket_kwargs, 'ssl.'):
101
+ ssl_kwargs = Tools.pop_sub_kwargs(socket_kwargs, 'ssl.')
102
+ res = SslManager.new_ssl_context(server_side=server_side, flat_kwargs=ssl_kwargs)
103
+ return res, socket_kwargs
104
+
105
+
106
+ class SocketClient(Socket):
107
+ """
108
+ Base class for socket clients.
109
+ """
110
+ __metaclass__ = abc.ABCMeta
111
+
112
+ def __init__(self, *, name=None, create_ipv4_socket_kwargs=None):
113
+ super().__init__(name=name, create_ipv4_socket_kwargs=create_ipv4_socket_kwargs)
114
+
115
+
116
+
117
+
118
+ class SocketServer(Socket):
119
+ """
120
+ Base class for socket servers.
121
+ """
122
+ __metaclass__ = abc.ABCMeta
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 accept(self):
128
+ conn, addr = self.internal_socket.accept()
129
+ res = Socket(name=f"[{self.name}] Connection with {addr}")
130
+ res._set_internal_socket(conn)
131
+ return res, addr
132
+
133
+ @abc.abstractmethod
134
+ def start(self, read_bufsize=1024, *, read_kwargs=None, write_kwargs=None):
135
+ """Start server.
136
+ """
137
+ raise NotImplementedError()
138
+
139
+ @abc.abstractmethod
140
+ def stop(self):
141
+ raise NotImplementedError()
142
+
143
+ @abc.abstractmethod
144
+ def _process_data(self, data):
145
+ raise NotImplementedError()
146
+
147
+
148
+
@@ -0,0 +1,5 @@
1
+ localhost.ct and localhost.key were generated with command:
2
+ openssl req -x509 -out localhost.crt -keyout localhost.key \
3
+ -newkey rsa:2048 -nodes -sha256 \
4
+ -subj '/CN=localhost' -extensions EXT -config <( \
5
+ printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDDzCCAfegAwIBAgIURN+rwAAcCgo1skxp67Fe8gQmfsQwDQYJKoZIhvcNAQEL
3
+ BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1MDMxODA5Mzg1M1oXDTI1MDQx
4
+ NzA5Mzg1M1owFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
5
+ AAOCAQ8AMIIBCgKCAQEA0LcxwmvlWDdgvUcTokDXXK/oOCs0gxaIciFGcgLd8vAA
6
+ ghgd38U7lvJFJtIsEZZc2TBchx8AMaucQbnxTmI7cCCSuxRtzDPypFGNxRf1JxZx
7
+ M5lwdww9JVtYmvMlfxnd+Q0yjvCvgl/DcKmbn0lhOmnviFUdfPb/9z5HAkHbl16Q
8
+ XQLI8vnyk2xwZwL9My/n++9X351kOjpwNRL9Ti9uLlD5MqjNOpLwPmBBx2ndy3Id
9
+ 7dl38KWSgOO4L8sH1YS0jmfGEX9nnMaki87uxptC5Eah2kMWACEZ3uYl2bapksdl
10
+ byX2623KhxEC1NpElsZkydg2umkTKicpgRBuWDQL1wIDAQABo1kwVzAUBgNVHREE
11
+ DTALgglsb2NhbGhvc3QwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMB
12
+ MB0GA1UdDgQWBBSTWa2UN+AuGAb68WLJkydR+TYDKjANBgkqhkiG9w0BAQsFAAOC
13
+ AQEAJLui3fct/B0oVR+WYfzpRYm4nWzaSsnmnRjfrMPg43GG5oHEf7wqF2yc7sDx
14
+ SPJgKOqZRrhXDXXPg3tLUZGpY37HusZOLauNko91VF7gl4x2749PMYkOiJw887my
15
+ 2lcod7SUh0O2lv0J14YsafcDaBa0kp1ibbvUdUJwiDMhRMVm5WvM1927fWuYBiQ2
16
+ 7Po+X/05E3T5HvFFu/W6l54UHFpChwvhNq9JKgxfMSdVKYhDWhbQeh0qucWU2Atg
17
+ 0PoB48ykW13/9yImQgtIreu2g2urPYXLCN963pRUDwBKQ/e+Or+I45AmpB6DaKA1
18
+ SL0QdGkPBGuRhPs+ovsteVIFnQ==
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDQtzHCa+VYN2C9
3
+ RxOiQNdcr+g4KzSDFohyIUZyAt3y8ACCGB3fxTuW8kUm0iwRllzZMFyHHwAxq5xB
4
+ ufFOYjtwIJK7FG3MM/KkUY3FF/UnFnEzmXB3DD0lW1ia8yV/Gd35DTKO8K+CX8Nw
5
+ qZufSWE6ae+IVR189v/3PkcCQduXXpBdAsjy+fKTbHBnAv0zL+f771ffnWQ6OnA1
6
+ Ev1OL24uUPkyqM06kvA+YEHHad3Lch3t2XfwpZKA47gvywfVhLSOZ8YRf2ecxqSL
7
+ zu7Gm0LkRqHaQxYAIRne5iXZtqmSx2VvJfbrbcqHEQLU2kSWxmTJ2Da6aRMqJymB
8
+ EG5YNAvXAgMBAAECggEAF8F3f8I5cmxV2HVUk20p62TM250fTE8Dl2nuKLU8Kes4
9
+ mOtsdbcZ7I5at0EeFEphpbQkHppgB/HucRSxldMHIjYIPWmP2GQ5Q+FRxOh7K3MZ
10
+ zgkIN09Eo7yH6JWwOOKVf0QJ8yG1+Eg0vd1a1ysfo+nBgmpIVvGOJMgJMQU/RzUe
11
+ 2PYWg+qeVl98LxjlCRExlyeDWEklTkKUbfp9yn2FeklAzfX38U6wgCXWAuzmSaPS
12
+ vv5u7Y1iOBRTJ32MlyvZVZReW0enzbT8i49coE5msmGm9cNE7Y02boLMIro318Zk
13
+ MYeEkqKPHsAMByXgrbpex9PW8m4Lo92MM1NOasFqUQKBgQDy2o4iy0KWsV/9i1jy
14
+ hQb6YezQEe8gB2HkDDFP5A2EAyO6pTeD8RBYauKdO7VDi9LSKR/1/4uRsjqIwkyV
15
+ nM86W3Dg7jZNlovl37kyZgGFpovwTgenkNFnjdA/pgL1xQ6tRIHfi2KUhluA5PK1
16
+ 5zsx3SejmccmDCXTGTH2s6ck0wKBgQDcA45cXkShvwap9H9SKFRDLqqn14CLSHiW
17
+ 8JDrly7jeLaq6hnvawHPcMyp2b1NCMDNJcMqW/BNLMq1EumK+bTL5h876M4KcTuy
18
+ dWfj4QLtmsqj7n4CnutBcC65a4Qdtqx62hd+GXG4U2ytjOhdNezsVYxxsOxOMs7L
19
+ UEBVEc5qbQKBgQDtdVh/mwG8OSmjz6okUICXOEMG3FJVngJQqr9Y36N7jlpUORJE
20
+ V+Tkn3Z/yY8ewcxdJEsVDU8aIgxsBpg9vjs+U4TW2vWL/gVCuvPp3KXmWggA6zs+
21
+ 1DJ9L8QNSDUivRDxyMe4niDBG3LDYJoV1UgjJJyKsmVwxXYCqGMbV2S6cwKBgEwT
22
+ OrV7rxWSnPZFYYUCBujYCRBSNtNycqgWdLXRp9fl1JvSqLcddBnLcilE7ezmGuyU
23
+ oyBRfAzjcRAdgv2YDEj4wFIR1LTNpIu3hv3HvyBzhqAahh3X35bX+IAKyjsQACHW
24
+ qYrjt2u6BPkZoPsh+1NY3WAugfckIFcy35vKtWodAoGAWTlEW9Qs7KeYVEQbE1nu
25
+ odT5NXgXjXa7xTh8zg8ezpvUnPsC8roG9lA13Wlbgj4cxulzWJAtTdOQ0vwWM1nL
26
+ EHeMjGdHO84O9ulENWT1H1Rths7/5FkLKLGjOIpc8TqTlJnlpS+RV7mJG4JZlHNZ
27
+ Od7K/qyK05io0lnF9lDQfZk=
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,81 @@
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 ssl
16
+ from holado_core.common.exceptions.functional_exception import FunctionalException
17
+ from holado_core.common.tools.tools import Tools
18
+ from holado_json.ipc.json import set_object_attributes_with_json_dict
19
+ from holado_core.common.exceptions.technical_exception import TechnicalException
20
+ import os
21
+ import copy
22
+ from ssl import Purpose
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class SslManager(object):
28
+ """
29
+ Helper for ssl module.
30
+
31
+ It is implemented internally with standard library ssl.
32
+ """
33
+
34
+ @classmethod
35
+ def new_ssl_context(cls, server_side=False, flat_kwargs=None):
36
+ res = None
37
+
38
+ if flat_kwargs is None:
39
+ flat_kwargs = {}
40
+ kwargs = copy.copy(flat_kwargs)
41
+
42
+ try:
43
+ activate_ssl = kwargs.pop('activate', True)
44
+ if activate_ssl:
45
+ purpose = Purpose.CLIENT_AUTH if server_side else Purpose.SERVER_AUTH
46
+ res = ssl.create_default_context(purpose=purpose)
47
+
48
+ if Tools.has_sub_kwargs(kwargs, 'context.'):
49
+ context_kwargs = Tools.pop_sub_kwargs(kwargs, 'context.')
50
+
51
+ ciphers = context_kwargs.pop('ciphers', None)
52
+ if ciphers is not None:
53
+ res.set_ciphers(ciphers)
54
+ if Tools.has_sub_kwargs(context_kwargs, 'load_cert_chain.'):
55
+ load_cert_chain_kwargs = Tools.pop_sub_kwargs(context_kwargs, 'load_cert_chain.')
56
+ res.load_cert_chain(**load_cert_chain_kwargs)
57
+ if Tools.has_sub_kwargs(context_kwargs, 'load_verify_locations.'):
58
+ load_verify_locations_kwargs = Tools.pop_sub_kwargs(context_kwargs, 'load_verify_locations.')
59
+ res.load_verify_locations(**load_verify_locations_kwargs)
60
+
61
+ # Set context attributes with remaining kwargs
62
+ if len(context_kwargs) > 0:
63
+ set_object_attributes_with_json_dict(res, context_kwargs)
64
+ except Exception as exc:
65
+ msg = f"Failed to create SSL context with parameters {flat_kwargs}: {exc}"
66
+ logger.error(msg)
67
+ raise TechnicalException(msg) from exc
68
+
69
+ # Verify all kwargs were applied
70
+ if len(kwargs) > 0:
71
+ raise TechnicalException(f"Unmanaged ssl parameters: {kwargs}")
72
+
73
+ return res
74
+
75
+ @classmethod
76
+ def get_localhost_certificate(cls):
77
+ here = os.path.abspath(os.path.dirname(__file__))
78
+ certfile_path = os.path.join(here, 'resources', 'certificates', 'localhost.crt')
79
+ keyfile_path = os.path.join(here, 'resources', 'certificates', 'localhost.key')
80
+ return (certfile_path, keyfile_path)
81
+
@@ -0,0 +1,192 @@
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
+ from typing import NamedTuple, get_origin
17
+ from typing import types # @UnresolvedImport
18
+ from holado_core.common.handlers.enums import AccessType
19
+ import inspect
20
+ from holado_core.common.exceptions.technical_exception import TechnicalException
21
+
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class Typing(object):
27
+
28
+ @classmethod
29
+ def is_NamedTuple(cls, obj=None, class_=None):
30
+ # if obj is not None:
31
+ # class_ = type(obj)
32
+ # return hasattr(class_, '__orig_bases__') and class_.__orig_bases__[0] == NamedTuple
33
+ if obj is not None:
34
+ return (hasattr(obj, "__base__") and obj.__base__ == tuple or not hasattr(obj, "__dict__")) \
35
+ and hasattr(obj, '_fields') and len(obj._fields) > 0 and any(map(lambda x:isinstance(x, str), obj._fields))
36
+ else:
37
+ return hasattr(class_, '__orig_bases__') and class_.__orig_bases__[0] == NamedTuple
38
+
39
+ @classmethod
40
+ def is_Generic(cls, generic_name, obj=None, class_=None):
41
+ if obj is not None:
42
+ class_ = type(obj)
43
+ return hasattr(class_, '_name') and class_._name == generic_name
44
+
45
+ @classmethod
46
+ def is_List(cls, obj=None, class_=None):
47
+ return cls.is_Generic('List', obj, class_)
48
+
49
+ @classmethod
50
+ def is_Dict(cls, obj=None, class_=None):
51
+ return cls.is_Generic('Dict', obj, class_)
52
+
53
+ @classmethod
54
+ def is_typing_type(cls, class_):
55
+ return get_origin(class_) is not None
56
+
57
+ @classmethod
58
+ def get_origin_type(cls, class_):
59
+ if class_ is not None and cls.is_typing_type(class_):
60
+ orig_type = get_origin(class_)
61
+ if type(orig_type) == type:
62
+ return orig_type
63
+ else:
64
+ return None
65
+ else:
66
+ return class_
67
+
68
+ @classmethod
69
+ def is_function(cls, target):
70
+ return isinstance(target, types.FunctionType)
71
+
72
+ @classmethod
73
+ def is_method(cls, target):
74
+ return isinstance(target, types.MethodType)
75
+
76
+ @classmethod
77
+ def get_method_function(cls, target):
78
+ return target.__func__
79
+
80
+ @classmethod
81
+ def get_method_object_instance(cls, target):
82
+ return target.__self__
83
+
84
+ @classmethod
85
+ def get_function_qualname(cls, target):
86
+ return target.__qualname__
87
+
88
+ @classmethod
89
+ def get_function_fullname(cls, target):
90
+ func_qualname = cls.get_function_qualname(target)
91
+ if hasattr(target, "__module__"):
92
+ return target.__module__ + "." + func_qualname
93
+ else:
94
+ return func_qualname
95
+
96
+
97
+ @classmethod
98
+ def get_class_name(cls, class_):
99
+ return class_.__name__
100
+
101
+ @classmethod
102
+ def get_class_fullname(cls, class_):
103
+ if class_ is None:
104
+ return None
105
+
106
+ class_name = cls.get_class_name(class_)
107
+ if hasattr(class_, "__module__"):
108
+ return class_.__module__ + "." + class_name
109
+ else:
110
+ return class_name
111
+
112
+ @classmethod
113
+ def get_object_class(cls, obj):
114
+ if hasattr(obj, "__class__"):
115
+ return obj.__class__
116
+ else:
117
+ return type(obj)
118
+
119
+ @classmethod
120
+ def get_object_class_name(cls, obj):
121
+ return cls.get_object_class(obj).__name__
122
+
123
+ @classmethod
124
+ def get_object_class_fullname(cls, obj):
125
+ obj_class_name = cls.get_object_class_name(obj)
126
+ if hasattr(obj, "__module__"):
127
+ return obj.__module__ + "." + obj_class_name
128
+ else:
129
+ return obj_class_name
130
+
131
+ @classmethod
132
+ def get_object_attributes(cls, obj, access_type=AccessType.Public):
133
+ if hasattr(obj, "__module__") and getattr(obj, "__module__") == 'zeep.objects' and hasattr(obj, "__values__"):
134
+ # Manage zeep objects separately
135
+ d = getattr(obj, "__values__")
136
+ return [(key, d[key]) for key in sorted(d)]
137
+ elif Typing.is_NamedTuple(obj):
138
+ return [(k, getattr(obj, k)) for k in obj._fields]
139
+ else:
140
+ try:
141
+ try:
142
+ if not hasattr(obj, '__bases__'):
143
+ obj.__bases__ = ()
144
+ except KeyError:
145
+ obj.__bases__ = ()
146
+ except AttributeError:
147
+ pass
148
+
149
+ if access_type == AccessType.Public:
150
+ return [(name, member) for name, member in inspect.getmembers(obj, lambda a: not inspect.isroutine(a)) if not name.startswith('_')]
151
+ elif access_type == AccessType.Protected:
152
+ return [(name, member) for name, member in inspect.getmembers(obj, lambda a: not inspect.isroutine(a)) if not name.startswith('__')]
153
+ elif access_type == AccessType.Private:
154
+ return [(name, member) for name, member in inspect.getmembers(obj, lambda a: not inspect.isroutine(a))]
155
+ else:
156
+ raise TechnicalException(f"Unmanaged access type '{access_type}'")
157
+ except ModuleNotFoundError:
158
+ return []
159
+
160
+ @classmethod
161
+ def get_object_attribute_names(cls, obj):
162
+ if hasattr(obj, "__module__") and getattr(obj, "__module__") == 'zeep.objects' and hasattr(obj, "__values__"):
163
+ # Manage zeep objects separately
164
+ d = getattr(obj, "__values__")
165
+ return [key for key in sorted(d)]
166
+ else:
167
+ return [name for name, _ in inspect.getmembers(obj, lambda a: not inspect.isroutine(a)) if not name.startswith('_')]
168
+
169
+ @classmethod
170
+ def get_object_attribute_values_by_name(cls, obj):
171
+ if hasattr(obj, "__module__") and getattr(obj, "__module__") == 'zeep.objects' and hasattr(obj, "__values__"):
172
+ # Manage zeep objects separately
173
+ return getattr(obj, "__values__")
174
+ else:
175
+ return {name: member for name, member in inspect.getmembers(obj, lambda a: not inspect.isroutine(a)) if not name.startswith('_')}
176
+
177
+ @classmethod
178
+ def get_class_for_type_name(cls, type_name):
179
+ type_name_splitted = type_name.split('.')
180
+ if len(type_name_splitted) > 1:
181
+ module = __import__(type_name_splitted[0])
182
+ for name in type_name_splitted[1:-1]:
183
+ module = getattr(module, name)
184
+ res = getattr(module, type_name_splitted[-1])
185
+ else:
186
+ res = globals()[type_name]
187
+
188
+ return res
189
+
190
+
191
+
192
+
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ #################################################
4
+ # HolAdo (Holistic Automation do)
5
+ #
6
+ # (C) Copyright 2021-2025 by Eric Klumpp
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11
+
12
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
13
+ #################################################
14
+
15
+
16
+ from .builtins.str_steps import *
17
+
18
+ from .standard_library.csv_steps import *
19
+ from .standard_library.datetime_steps import *
20
+ from .standard_library.hashlib_steps import *
21
+ from .standard_library.multiprocessing_steps import *
22
+ from .standard_library.queue_steps import *
23
+ from .standard_library.socket_steps import *
24
+ from .standard_library.ssl_steps import *
25
+
26
+ from .convert_steps import *
27
+ from .iterable_steps import *