holado 0.13.22__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.
Files changed (698) hide show
  1. holado/__init__.py +358 -0
  2. holado/common/__init__.py +25 -0
  3. holado/common/context/__init__.py +25 -0
  4. holado/common/context/context.py +248 -0
  5. holado/common/context/service_manager.py +262 -0
  6. holado/common/context/session_context.py +516 -0
  7. holado/common/handlers/__init__.py +19 -0
  8. holado/common/handlers/enums.py +41 -0
  9. holado/common/handlers/object.py +175 -0
  10. holado/common/handlers/undefined.py +55 -0
  11. holado/common/tools/__init__.py +19 -0
  12. holado/common/tools/gc_manager.py +155 -0
  13. holado/holado_config.py +45 -0
  14. holado-0.13.22.dist-info/METADATA +194 -0
  15. holado-0.13.22.dist-info/RECORD +698 -0
  16. holado-0.13.22.dist-info/WHEEL +4 -0
  17. holado-0.13.22.dist-info/licenses/LICENSE +21 -0
  18. holado_ais/__init__.py +33 -0
  19. holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
  20. holado_ais/ais/ais_manager.py +151 -0
  21. holado_ais/ais/ais_messages.py +356 -0
  22. holado_ais/ais/ais_payload.py +35 -0
  23. holado_ais/ais/enums.py +37 -0
  24. holado_ais/ais/patch_pyais.py +1174 -0
  25. holado_ais/tests/behave/steps/__init__.py +17 -0
  26. holado_ais/tests/behave/steps/ais/__init__.py +0 -0
  27. holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
  28. holado_ais/tests/behave/steps/ais/ais_messages_steps.py +237 -0
  29. holado_binary/__init__.py +17 -0
  30. holado_binary/ipc/binary.py +125 -0
  31. holado_binary/ipc/bit_series.py +307 -0
  32. holado_binary/tests/behave/steps/__init__.py +17 -0
  33. holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
  34. holado_binary/tests/behave/steps/ipc/bit_series_steps.py +132 -0
  35. holado_context/__init__.py +16 -0
  36. holado_context/tests/behave/steps/__init__.py +16 -0
  37. holado_context/tests/behave/steps/private/__init__.py +16 -0
  38. holado_context/tests/behave/steps/private/common/context_steps.py +68 -0
  39. holado_core/__init__.py +32 -0
  40. holado_core/common/__init__.py +0 -0
  41. holado_core/common/actors/actions.py +97 -0
  42. holado_core/common/actors/actor.py +226 -0
  43. holado_core/common/actors/element_actor.py +32 -0
  44. holado_core/common/actors/find_actor.py +106 -0
  45. holado_core/common/actors/tree_actor.py +32 -0
  46. holado_core/common/actors/verify_actions.py +69 -0
  47. holado_core/common/block/base.py +122 -0
  48. holado_core/common/block/block_manager.py +173 -0
  49. holado_core/common/block/block_method.py +46 -0
  50. holado_core/common/block/block_steps.py +37 -0
  51. holado_core/common/block/function.py +42 -0
  52. holado_core/common/block/scope_function.py +28 -0
  53. holado_core/common/block/scope_manager.py +238 -0
  54. holado_core/common/block/scope_steps.py +141 -0
  55. holado_core/common/criterias/and_criteria.py +61 -0
  56. holado_core/common/criterias/criteria.py +78 -0
  57. holado_core/common/criterias/or_criteria.py +64 -0
  58. holado_core/common/criterias/tools/criteria_context.py +20 -0
  59. holado_core/common/criterias/tools/criteria_parameters.py +18 -0
  60. holado_core/common/drivers/driver.py +153 -0
  61. holado_core/common/drivers/element_driver.py +30 -0
  62. holado_core/common/drivers/element_internal_api.py +239 -0
  63. holado_core/common/drivers/internal_api.py +40 -0
  64. holado_core/common/drivers/tree_driver.py +30 -0
  65. holado_core/common/drivers/tree_internal_api.py +176 -0
  66. holado_core/common/exceptions/__init__.py +0 -0
  67. holado_core/common/exceptions/element_exception.py +28 -0
  68. holado_core/common/exceptions/exceptions.py +24 -0
  69. holado_core/common/exceptions/functional_exception.py +21 -0
  70. holado_core/common/exceptions/holado_exception.py +25 -0
  71. holado_core/common/exceptions/technical_exception.py +27 -0
  72. holado_core/common/exceptions/timeout_exception.py +20 -0
  73. holado_core/common/exceptions/verify_exception.py +20 -0
  74. holado_core/common/finders/after_in_tree_finder.py +87 -0
  75. holado_core/common/finders/element_finder.py +60 -0
  76. holado_core/common/finders/else_finder.py +105 -0
  77. holado_core/common/finders/finder.py +478 -0
  78. holado_core/common/finders/or_finder.py +98 -0
  79. holado_core/common/finders/then_finder.py +157 -0
  80. holado_core/common/finders/tools/enums.py +30 -0
  81. holado_core/common/finders/tools/find_builder.py +118 -0
  82. holado_core/common/finders/tools/find_context.py +405 -0
  83. holado_core/common/finders/tools/find_info.py +27 -0
  84. holado_core/common/finders/tools/find_parameters.py +240 -0
  85. holado_core/common/finders/tools/find_updater.py +95 -0
  86. holado_core/common/finders/tools/finder_info.py +26 -0
  87. holado_core/common/finders/tree_finder.py +146 -0
  88. holado_core/common/handlers/__init__.py +0 -0
  89. holado_core/common/handlers/abstracts/base_redo.py +702 -0
  90. holado_core/common/handlers/abstracts/get_or_create.py +120 -0
  91. holado_core/common/handlers/element_holder.py +122 -0
  92. holado_core/common/handlers/enums.py +23 -0
  93. holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
  94. holado_core/common/handlers/features/resource_by_name.py +187 -0
  95. holado_core/common/handlers/features/resource_by_type.py +174 -0
  96. holado_core/common/handlers/redo.py +119 -0
  97. holado_core/common/handlers/wait.py +127 -0
  98. holado_core/common/inspectors/element_inspector.py +57 -0
  99. holado_core/common/inspectors/inspector.py +221 -0
  100. holado_core/common/inspectors/tools/inspect_builder.py +169 -0
  101. holado_core/common/inspectors/tools/inspect_context.py +69 -0
  102. holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
  103. holado_core/common/inspectors/tree_inspector.py +73 -0
  104. holado_core/common/resource/persisted_data_manager.py +113 -0
  105. holado_core/common/resource/persisted_method_to_call_manager.py +263 -0
  106. holado_core/common/resource/resource_manager.py +126 -0
  107. holado_core/common/resource/table_data_manager.py +110 -0
  108. holado_core/common/tables/__init__.py +1 -0
  109. holado_core/common/tables/comparators/__init__.py +0 -0
  110. holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
  111. holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
  112. holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
  113. holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
  114. holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
  115. holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
  116. holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
  117. holado_core/common/tables/comparators/string_table_comparator.py +29 -0
  118. holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
  119. holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
  120. holado_core/common/tables/comparators/table_comparator.py +209 -0
  121. holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
  122. holado_core/common/tables/comparators/table_row_comparator.py +116 -0
  123. holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
  124. holado_core/common/tables/converters/__init__.py +0 -0
  125. holado_core/common/tables/converters/table_converter.py +233 -0
  126. holado_core/common/tables/enums.py +23 -0
  127. holado_core/common/tables/table.py +261 -0
  128. holado_core/common/tables/table_cell.py +126 -0
  129. holado_core/common/tables/table_manager.py +365 -0
  130. holado_core/common/tables/table_row.py +169 -0
  131. holado_core/common/tables/table_with_header.py +242 -0
  132. holado_core/common/tools/__init__.py +0 -0
  133. holado_core/common/tools/comparators/comparator.py +151 -0
  134. holado_core/common/tools/comparators/object_comparator.py +21 -0
  135. holado_core/common/tools/converters/converter.py +118 -0
  136. holado_core/common/tools/path_manager.py +238 -0
  137. holado_core/common/tools/string_tools.py +144 -0
  138. holado_core/common/tools/tools.py +197 -0
  139. holado_core/tests/behave/steps/__init__.py +20 -0
  140. holado_core/tests/behave/steps/common/__init__.py +0 -0
  141. holado_core/tests/behave/steps/common/common_steps.py +137 -0
  142. holado_core/tests/behave/steps/common/config_steps.py +42 -0
  143. holado_core/tests/behave/steps/common/resource_steps.py +62 -0
  144. holado_core/tests/behave/steps/common/tables_steps.py +560 -0
  145. holado_core/tools/__init__.py +0 -0
  146. holado_core/tools/abstracts/__init__.py +0 -0
  147. holado_core/tools/abstracts/blocking_command_service.py +64 -0
  148. holado_core/tools/abstracts/service.py +48 -0
  149. holado_crypto/__init__.py +31 -0
  150. holado_crypto/crypto/crypto.py +108 -0
  151. holado_crypto/crypto/key.py +92 -0
  152. holado_crypto/crypto/tcpbin.py +105 -0
  153. holado_crypto/crypto/transport/__init__.py +0 -0
  154. holado_crypto/crypto/transport/crc.py +40 -0
  155. holado_crypto/tests/behave/steps/__init__.py +18 -0
  156. holado_crypto/tests/behave/steps/crypto_steps.py +112 -0
  157. holado_crypto/tests/behave/steps/key_steps.py +82 -0
  158. holado_crypto/tests/behave/steps/tcpbin_steps.py +79 -0
  159. holado_data/__init__.py +31 -0
  160. holado_data/data/generator/base.py +93 -0
  161. holado_data/data/generator/generator_manager.py +27 -0
  162. holado_data/data/generator/python_generator.py +30 -0
  163. holado_data/tests/behave/steps/__init__.py +17 -0
  164. holado_data/tests/behave/steps/data/generator_steps.py +91 -0
  165. holado_data/tests/behave/steps/tools/utils_steps.py +59 -0
  166. holado_db/__init__.py +32 -0
  167. holado_db/tests/behave/steps/__init__.py +18 -0
  168. holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
  169. holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
  170. holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
  171. holado_db/tools/db/clients/base/db_audit.py +94 -0
  172. holado_db/tools/db/clients/base/db_client.py +344 -0
  173. holado_db/tools/db/clients/postgresql/postgresql_audit.py +75 -0
  174. holado_db/tools/db/clients/postgresql/postgresql_client.py +84 -0
  175. holado_db/tools/db/clients/sqlite/sqlite_audit.py +70 -0
  176. holado_db/tools/db/clients/sqlite/sqlite_client.py +60 -0
  177. holado_db/tools/db/db_manager.py +109 -0
  178. holado_db/tools/db/query/base/query_builder.py +138 -0
  179. holado_db/tools/db/query/pypika/pypika_query_builder.py +244 -0
  180. holado_db/tools/db/query/query_manager.py +77 -0
  181. holado_django/__init__.py +31 -0
  182. holado_django/server/HOWTO.txt +27 -0
  183. holado_django/server/django_projects/rest_api/db.sqlite3 +0 -0
  184. holado_django/server/django_projects/rest_api/manage.py +22 -0
  185. holado_django/server/django_projects/rest_api/rest_api/__init__.py +0 -0
  186. holado_django/server/django_projects/rest_api/rest_api/application/__init__.py +0 -0
  187. holado_django/server/django_projects/rest_api/rest_api/application/admin.py +3 -0
  188. holado_django/server/django_projects/rest_api/rest_api/application/apps.py +9 -0
  189. holado_django/server/django_projects/rest_api/rest_api/application/migrations/__init__.py +0 -0
  190. holado_django/server/django_projects/rest_api/rest_api/application/models.py +3 -0
  191. holado_django/server/django_projects/rest_api/rest_api/application/tests.py +3 -0
  192. holado_django/server/django_projects/rest_api/rest_api/application/views.py +6 -0
  193. holado_django/server/django_projects/rest_api/rest_api/asgi.py +16 -0
  194. holado_django/server/django_projects/rest_api/rest_api/settings.py +130 -0
  195. holado_django/server/django_projects/rest_api/rest_api/urls.py +35 -0
  196. holado_django/server/django_projects/rest_api/rest_api/wsgi.py +16 -0
  197. holado_django/server/django_server.py +110 -0
  198. holado_django/server/grpc_django_server.py +57 -0
  199. holado_django/server/patch_djangogrpcframework.py +46 -0
  200. holado_django/tests/behave/steps/__init__.py +16 -0
  201. holado_django/tests/behave/steps/django_server_steps.py +83 -0
  202. holado_docker/__init__.py +25 -0
  203. holado_docker/sdk/docker/container_logs.py +447 -0
  204. holado_docker/sdk/docker/docker_client.py +537 -0
  205. holado_docker/sdk/docker/docker_service.py +71 -0
  206. holado_docker/tests/behave/steps/__init__.py +16 -0
  207. holado_docker/tests/behave/steps/sdk/docker/container_logs_steps.py +47 -0
  208. holado_examples/projects/server_rest/server_rest_example/initialize_holado.py +72 -0
  209. holado_examples/projects/server_rest/server_rest_example/rest_api/db.sqlite3 +0 -0
  210. holado_examples/projects/server_rest/server_rest_example/rest_api/manage.py +22 -0
  211. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/__init__.py +0 -0
  212. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/__init__.py +0 -0
  213. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/admin.py +3 -0
  214. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/apps.py +7 -0
  215. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/migrations/__init__.py +0 -0
  216. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/models.py +3 -0
  217. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/serializers.py +15 -0
  218. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/tests.py +3 -0
  219. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/application/views.py +24 -0
  220. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/asgi.py +16 -0
  221. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/settings.py +130 -0
  222. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/urls.py +31 -0
  223. holado_examples/projects/server_rest/server_rest_example/rest_api/rest_api/wsgi.py +16 -0
  224. holado_examples/projects/server_rest/server_rest_example/rest_server.py +37 -0
  225. holado_examples/scripts/script_custom_initialization.py +16 -0
  226. holado_examples/scripts/script_minimal_initialization.py +23 -0
  227. holado_examples/tests/behave/testing_solution/__main__.py +13 -0
  228. holado_examples/tests/behave/testing_solution/behave_environment.py +35 -0
  229. holado_examples/tests/behave/testing_solution/environment.py +36 -0
  230. holado_examples/tests/behave/testing_solution/features/Configuration/Actions/configure_system.feature +10 -0
  231. holado_examples/tests/behave/testing_solution/features/NonReg/example.feature +26 -0
  232. holado_examples/tests/behave/testing_solution/initialize_holado.py +62 -0
  233. holado_examples/tests/behave/testing_solution/logging.conf +102 -0
  234. holado_examples/tests/behave/testing_solution/requirements.txt +5 -0
  235. holado_examples/tests/behave/testing_solution/run_test.sh +7 -0
  236. holado_examples/tests/behave/testing_solution/run_test_nonreg.sh +6 -0
  237. holado_examples/tests/behave/testing_solution/src/common/tools/path_manager.py +40 -0
  238. holado_examples/tests/behave/testing_solution/src/config/config_manager.py +30 -0
  239. holado_examples/tests/behave/testing_solution/src/context/session_context.py +45 -0
  240. holado_examples/tests/behave/testing_solution/steps/config_steps.py +21 -0
  241. holado_examples/tests/behave/testing_solution/steps/public_steps.py +10 -0
  242. holado_grpc/TODO +8 -0
  243. holado_grpc/__init__.py +40 -0
  244. holado_grpc/api/rpc/TODO.txt +4 -0
  245. holado_grpc/api/rpc/grpc_client.py +210 -0
  246. holado_grpc/api/rpc/grpc_manager.py +81 -0
  247. holado_grpc/ipc/rpc/__init__.py +0 -0
  248. holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
  249. holado_grpc/ipc/rpc/grpc_services.py +165 -0
  250. holado_grpc/tests/behave/steps/__init__.py +16 -0
  251. holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
  252. holado_grpc/tests/behave/steps/private/__init__.py +16 -0
  253. holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
  254. holado_helper/__init__.py +35 -0
  255. holado_helper/debug/README.txt +32 -0
  256. holado_helper/debug/memory/memory_profiler.py +106 -0
  257. holado_helper/docker/init_user.sh +24 -0
  258. holado_helper/docker/logging.conf +44 -0
  259. holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
  260. holado_helper/docker/run_terminal_in_docker.sh +101 -0
  261. holado_helper/holado_module_template/__init__.py +38 -0
  262. holado_helper/holado_module_template/tests/behave/steps/__init__.py +16 -0
  263. holado_helper/holado_module_template/tests/behave/steps/private/__init__.py +16 -0
  264. holado_helper/initialize_holado.py +72 -0
  265. holado_helper/script/action.py +130 -0
  266. holado_helper/script/action_script.py +477 -0
  267. holado_helper/script/any_action_script.py +126 -0
  268. holado_helper/script/behave_action_script.py +99 -0
  269. holado_helper/script/csv_action_script.py +142 -0
  270. holado_helper/script/initialize_script.py +95 -0
  271. holado_helper/script/input_output_script.py +136 -0
  272. holado_helper/script/job.py +75 -0
  273. holado_helper/script/json_action_script.py +104 -0
  274. holado_helper/script/script.py +110 -0
  275. holado_json/__init__.py +16 -0
  276. holado_json/filesystem/json_file.py +94 -0
  277. holado_json/filesystem/stream_json_file.py +117 -0
  278. holado_json/ipc/json.py +146 -0
  279. holado_json/ipc/json_converter.py +69 -0
  280. holado_json/ipc/json_types.py +183 -0
  281. holado_json/tests/behave/steps/__init__.py +16 -0
  282. holado_json/tests/behave/steps/ipc/__init__.py +0 -0
  283. holado_json/tests/behave/steps/ipc/json_steps.py +131 -0
  284. holado_keycloak/__init__.py +16 -0
  285. holado_keycloak/tests/behave/steps/__init__.py +16 -0
  286. holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +73 -0
  287. holado_keycloak/tools/keycloak/__init__.py +0 -0
  288. holado_keycloak/tools/keycloak/keycloak_client.py +90 -0
  289. holado_logging/__init__.py +38 -0
  290. holado_logging/common/logging/holado_logger.py +71 -0
  291. holado_logging/common/logging/log_config.py +163 -0
  292. holado_logging/common/logging/log_manager.py +335 -0
  293. holado_multitask/__init__.py +33 -0
  294. holado_multitask/multiprocessing/context/process_context.py +35 -0
  295. holado_multitask/multiprocessing/function_process.py +102 -0
  296. holado_multitask/multiprocessing/periodic_function_process.py +137 -0
  297. holado_multitask/multiprocessing/process.py +213 -0
  298. holado_multitask/multiprocessing/processesmanager.py +137 -0
  299. holado_multitask/multitasking/multitask_manager.py +464 -0
  300. holado_multitask/multithreading/__init__.py +0 -0
  301. holado_multitask/multithreading/context/thread_context.py +86 -0
  302. holado_multitask/multithreading/functionthreaded.py +129 -0
  303. holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
  304. holado_multitask/multithreading/loopthread.py +110 -0
  305. holado_multitask/multithreading/periodicfunctionthreaded.py +135 -0
  306. holado_multitask/multithreading/reflection/inspect.py +47 -0
  307. holado_multitask/multithreading/reflection/sys.py +29 -0
  308. holado_multitask/multithreading/reflection/traceback.py +35 -0
  309. holado_multitask/multithreading/thread.py +203 -0
  310. holado_multitask/multithreading/threadsmanager.py +167 -0
  311. holado_multitask/multithreading/timer.py +51 -0
  312. holado_multitask/tests/behave/steps/__init__.py +17 -0
  313. holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
  314. holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
  315. holado_protobuf/__init__.py +61 -0
  316. holado_protobuf/ipc/protobuf/__init__.py +0 -0
  317. holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
  318. holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
  319. holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
  320. holado_protobuf/ipc/protobuf/protobuf_messages.py +968 -0
  321. holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
  322. holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
  323. holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
  324. holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
  325. holado_protobuf/tests/behave/steps/__init__.py +16 -0
  326. holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
  327. holado_python/__init__.py +36 -0
  328. holado_python/common/enums.py +34 -0
  329. holado_python/common/iterables.py +38 -0
  330. holado_python/common/tools/comparators/boolean_comparator.py +37 -0
  331. holado_python/common/tools/comparators/bytes_comparator.py +48 -0
  332. holado_python/common/tools/comparators/datetime_comparator.py +74 -0
  333. holado_python/common/tools/comparators/float_comparator.py +97 -0
  334. holado_python/common/tools/comparators/integer_comparator.py +37 -0
  335. holado_python/common/tools/comparators/string_comparator.py +99 -0
  336. holado_python/common/tools/comparators/type_comparator.py +31 -0
  337. holado_python/common/tools/datetime.py +341 -0
  338. holado_python/standard_library/csv.py +207 -0
  339. holado_python/standard_library/hashlib.py +110 -0
  340. holado_python/standard_library/multiprocessing.py +62 -0
  341. holado_python/standard_library/queue.py +79 -0
  342. holado_python/standard_library/socket/blocking_socket.py +219 -0
  343. holado_python/standard_library/socket/echo_server.py +29 -0
  344. holado_python/standard_library/socket/message_socket.py +152 -0
  345. holado_python/standard_library/socket/non_blocking_socket.py +172 -0
  346. holado_python/standard_library/socket/socket.py +411 -0
  347. holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
  348. holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
  349. holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
  350. holado_python/standard_library/ssl/ssl.py +131 -0
  351. holado_python/standard_library/typing.py +192 -0
  352. holado_python/tests/behave/steps/__init__.py +27 -0
  353. holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
  354. holado_python/tests/behave/steps/convert_steps.py +59 -0
  355. holado_python/tests/behave/steps/iterable_steps.py +87 -0
  356. holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
  357. holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
  358. holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
  359. holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
  360. holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
  361. holado_python/tests/behave/steps/standard_library/socket_steps.py +384 -0
  362. holado_python/tests/behave/steps/standard_library/ssl_steps.py +71 -0
  363. holado_rabbitmq/__init__.py +28 -0
  364. holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
  365. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +565 -0
  366. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
  367. holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +333 -0
  368. holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +678 -0
  369. holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +146 -0
  370. holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
  371. holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
  372. holado_redis/__init__.py +17 -0
  373. holado_redis/tests/behave/steps/__init__.py +16 -0
  374. holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
  375. holado_redis/tools/redis/TODO.txt +7 -0
  376. holado_redis/tools/redis/redis_client.py +190 -0
  377. holado_redis/tools/redis/redis_manager.py +38 -0
  378. holado_report/__init__.py +36 -0
  379. holado_report/campaign/campaign_manager.py +348 -0
  380. holado_report/report/analyze/execution_historic_manager.py +96 -0
  381. holado_report/report/analyze/scenario_duration_manager.py +245 -0
  382. holado_report/report/builders/detailed_scenario_report_builder.py +172 -0
  383. holado_report/report/builders/execution_historic_report_builder.py +132 -0
  384. holado_report/report/builders/failure_report_builder.py +150 -0
  385. holado_report/report/builders/report_builder.py +64 -0
  386. holado_report/report/builders/short_scenario_report_builder.py +94 -0
  387. holado_report/report/builders/summary_by_category_report_builder.py +103 -0
  388. holado_report/report/builders/summary_report_builder.py +110 -0
  389. holado_report/report/builders/summary_scenario_by_category_report_builder.py +109 -0
  390. holado_report/report/builders/summary_scenario_report_builder.py +81 -0
  391. holado_report/report/execution_historic.py +144 -0
  392. holado_report/report/report_manager.py +424 -0
  393. holado_report/report/reports/base_report.py +163 -0
  394. holado_report/report/reports/feature_report.py +106 -0
  395. holado_report/report/reports/scenario_report.py +64 -0
  396. holado_rest/__init__.py +32 -0
  397. holado_rest/api/rest/TODO.txt +2 -0
  398. holado_rest/api/rest/rest_client.py +200 -0
  399. holado_rest/api/rest/rest_manager.py +72 -0
  400. holado_rest/tests/behave/steps/__init__.py +16 -0
  401. holado_rest/tests/behave/steps/api/__init__.py +0 -0
  402. holado_rest/tests/behave/steps/api/rest_client_steps.py +181 -0
  403. holado_rest/tests/behave/steps/private/__init__.py +16 -0
  404. holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
  405. holado_rest/tests/behave/steps/private/api/rest_steps.py +75 -0
  406. holado_s3/__init__.py +17 -0
  407. holado_s3/tests/behave/steps/__init__.py +17 -0
  408. holado_s3/tests/behave/steps/private/__init__.py +16 -0
  409. holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
  410. holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
  411. holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
  412. holado_s3/tools/s3/__init__.py +0 -0
  413. holado_s3/tools/s3/boto3_s3_client.py +59 -0
  414. holado_s3/tools/s3/minio_client.py +75 -0
  415. holado_s3/tools/s3/moto_server.py +52 -0
  416. holado_scripting/__init__.py +54 -0
  417. holado_scripting/common/tools/dynamic_text_manager.py +73 -0
  418. holado_scripting/common/tools/evaluate_parameters.py +228 -0
  419. holado_scripting/common/tools/expression_evaluator.py +389 -0
  420. holado_scripting/common/tools/variable_manager.py +354 -0
  421. holado_scripting/tests/behave/steps/__init__.py +22 -0
  422. holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +159 -0
  423. holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
  424. holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
  425. holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
  426. holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
  427. holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
  428. holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
  429. holado_scripting/text/base/base_function.py +25 -0
  430. holado_scripting/text/base/base_verify_function.py +25 -0
  431. holado_scripting/text/base/text_inspecter.py +204 -0
  432. holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
  433. holado_scripting/text/interpreter/functions/function_apply_function.py +60 -0
  434. holado_scripting/text/interpreter/functions/function_cast.py +60 -0
  435. holado_scripting/text/interpreter/functions/function_convert.py +57 -0
  436. holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
  437. holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
  438. holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
  439. holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
  440. holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
  441. holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
  442. holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
  443. holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
  444. holado_scripting/text/interpreter/functions/function_to_string.py +50 -0
  445. holado_scripting/text/interpreter/text_interpreter.py +219 -0
  446. holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
  447. holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
  448. holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
  449. holado_scripting/text/verifier/text_verifier.py +103 -0
  450. holado_sftp/__init__.py +16 -0
  451. holado_sftp/tests/behave/steps/__init__.py +17 -0
  452. holado_sftp/tests/behave/steps/private/__init__.py +16 -0
  453. holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
  454. holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
  455. holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
  456. holado_sftp/tools/sftp/__init__.py +0 -0
  457. holado_sftp/tools/sftp/sftp_client.py +103 -0
  458. holado_sftp/tools/sftp/sftp_server.py +39 -0
  459. holado_swagger/__init__.py +31 -0
  460. holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
  461. holado_swagger/swagger_hub/mockserver/mockserver_manager.py +33 -0
  462. holado_swagger/tests/behave/steps/__init__.py +16 -0
  463. holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
  464. holado_system/system/command/command.py +247 -0
  465. holado_system/system/command/command_result.py +128 -0
  466. holado_system/system/command/curl_command.py +101 -0
  467. holado_system/system/command/exceptions.py +59 -0
  468. holado_system/system/filesystem/file.py +150 -0
  469. holado_system/system/global_system.py +187 -0
  470. holado_system/tests/behave/steps/__init__.py +18 -0
  471. holado_system/tests/behave/steps/system/commands_steps.py +92 -0
  472. holado_system/tests/behave/steps/system/file_steps.py +231 -0
  473. holado_system/tests/behave/steps/system/system_steps.py +84 -0
  474. holado_test/__init__.py +30 -0
  475. holado_test/behave/__init__.py +0 -0
  476. holado_test/behave/behave.py +400 -0
  477. holado_test/behave/behave_environment.py +169 -0
  478. holado_test/behave/behave_function.py +33 -0
  479. holado_test/behave/behave_manager.py +558 -0
  480. holado_test/behave/independant_runner.py +66 -0
  481. holado_test/behave/scenario/__init__.py +0 -0
  482. holado_test/behave/scenario/behave_step_tools.py +157 -0
  483. holado_test/common/context/feature_context.py +81 -0
  484. holado_test/common/context/scenario_context.py +169 -0
  485. holado_test/common/context/step_context.py +66 -0
  486. holado_test/common/exceptions/undefined_step_exception.py +21 -0
  487. holado_test/scenario/step_tools.py +547 -0
  488. holado_test/scenario/tester_tools.py +57 -0
  489. holado_test/test_config.py +26 -0
  490. holado_test/tests/behave/steps/__init__.py +18 -0
  491. holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
  492. holado_test/tests/behave/steps/scenario/scenario_steps.py +100 -0
  493. holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
  494. holado_test/tools/test_server/client/rest/test_server_client.py +150 -0
  495. holado_test/tools/test_server/server/Dockerfile +60 -0
  496. holado_test/tools/test_server/server/core/server_context.py +42 -0
  497. holado_test/tools/test_server/server/core/server_manager.py +41 -0
  498. holado_test/tools/test_server/server/requirements.txt +2 -0
  499. holado_test/tools/test_server/server/rest/README +2 -0
  500. holado_test/tools/test_server/server/rest/api/__init__.py +24 -0
  501. holado_test/tools/test_server/server/rest/api/campaign/__init__.py +32 -0
  502. holado_test/tools/test_server/server/rest/api/campaign/scenario.py +40 -0
  503. holado_test/tools/test_server/server/rest/initialize_holado.py +72 -0
  504. holado_test/tools/test_server/server/rest/logging.conf +51 -0
  505. holado_test/tools/test_server/server/rest/openapi.yaml +57 -0
  506. holado_test/tools/test_server/server/rest/run.py +41 -0
  507. holado_test/tools/test_server/server/run.sh +6 -0
  508. holado_test/tools/test_server/server/run_test_server_in_docker.sh +104 -0
  509. holado_tools/__init__.py +38 -0
  510. holado_tools/scripts/execute_persisted_post_processes/execute_persisted_post_processes.py +36 -0
  511. holado_tools/scripts/execute_persisted_post_processes/execute_persisted_post_processes.sh +6 -0
  512. holado_tools/scripts/execute_persisted_post_processes/initialize_holado.py +62 -0
  513. holado_tools/tests/behave/steps/__init__.py +16 -0
  514. holado_tools/tests/behave/steps/tools/host_controller/client_steps.py +97 -0
  515. holado_tools/tools/host_controller/client/rest/host_controller_client.py +275 -0
  516. holado_tools/tools/host_controller/server/Dockerfile +60 -0
  517. holado_tools/tools/host_controller/server/requirements.txt +2 -0
  518. holado_tools/tools/host_controller/server/rest/README +2 -0
  519. holado_tools/tools/host_controller/server/rest/api/__init__.py +24 -0
  520. holado_tools/tools/host_controller/server/rest/api/config.py +88 -0
  521. holado_tools/tools/host_controller/server/rest/api/docker/__init__.py +66 -0
  522. holado_tools/tools/host_controller/server/rest/api/docker/container.py +144 -0
  523. holado_tools/tools/host_controller/server/rest/api/docker/logs.py +66 -0
  524. holado_tools/tools/host_controller/server/rest/api/os.py +58 -0
  525. holado_tools/tools/host_controller/server/rest/initialize_holado.py +72 -0
  526. holado_tools/tools/host_controller/server/rest/openapi.yaml +561 -0
  527. holado_tools/tools/host_controller/server/rest/run.py +31 -0
  528. holado_tools/tools/host_controller/server/run_host_controller_in_docker.sh +107 -0
  529. holado_tools/tools/host_viewer/client/rest/host_viewer_client.py +190 -0
  530. holado_tools/tools/host_viewer/server/Dockerfile +60 -0
  531. holado_tools/tools/host_viewer/server/requirements.txt +2 -0
  532. holado_tools/tools/host_viewer/server/rest/README +2 -0
  533. holado_tools/tools/host_viewer/server/rest/api/__init__.py +24 -0
  534. holado_tools/tools/host_viewer/server/rest/api/docker/__init__.py +65 -0
  535. holado_tools/tools/host_viewer/server/rest/api/docker/container.py +87 -0
  536. holado_tools/tools/host_viewer/server/rest/api/os.py +58 -0
  537. holado_tools/tools/host_viewer/server/rest/initialize_holado.py +72 -0
  538. holado_tools/tools/host_viewer/server/rest/openapi.yaml +301 -0
  539. holado_tools/tools/host_viewer/server/rest/run.py +31 -0
  540. holado_tools/tools/host_viewer/server/run_host_viewer_in_docker.sh +107 -0
  541. holado_value/__init__.py +24 -0
  542. holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +196 -0
  543. holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
  544. holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
  545. holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
  546. holado_value/common/tables/converters/value_table_converter.py +267 -0
  547. holado_value/common/tables/value_table.py +29 -0
  548. holado_value/common/tables/value_table_cell.py +76 -0
  549. holado_value/common/tables/value_table_manager.py +48 -0
  550. holado_value/common/tables/value_table_row.py +43 -0
  551. holado_value/common/tables/value_table_with_header.py +28 -0
  552. holado_value/common/tools/unique_value_manager.py +109 -0
  553. holado_value/common/tools/value.py +191 -0
  554. holado_value/common/tools/value_types.py +41 -0
  555. holado_value/tests/behave/steps/__init__.py +16 -0
  556. holado_value/tests/behave/steps/private/__init__.py +16 -0
  557. holado_ws/__init__.py +16 -0
  558. holado_ws/api/ws/TODO.txt +2 -0
  559. holado_ws/tests/behave/steps/__init__.py +16 -0
  560. holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
  561. holado_xml/__init__.py +38 -0
  562. holado_xml/tests/behave/steps/__init__.py +16 -0
  563. holado_xml/tests/behave/steps/private/__init__.py +16 -0
  564. holado_xml/xml/stream_xml_file.py +181 -0
  565. holado_xml/xml/xml_file.py +97 -0
  566. holado_xml/xml/xml_manager.py +35 -0
  567. holado_yaml/__init__.py +31 -0
  568. holado_yaml/tests/behave/steps/__init__.py +16 -0
  569. holado_yaml/tests/behave/steps/yaml_steps.py +161 -0
  570. holado_yaml/yaml/enums.py +28 -0
  571. holado_yaml/yaml/pyyaml/pyyaml_client.py +72 -0
  572. holado_yaml/yaml/ruamel/ruamel_yaml_client.py +80 -0
  573. holado_yaml/yaml/yaml_client.py +203 -0
  574. holado_yaml/yaml/yaml_manager.py +94 -0
  575. test_holado/Dockerfile_test_holado +82 -0
  576. test_holado/__init__.py +4 -0
  577. test_holado/__main__.py +25 -0
  578. test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
  579. test_holado/environment.py +60 -0
  580. test_holado/features/Configuration/Actions/execute_persisted_post_processes.feature +13 -0
  581. test_holado/features/NonReg/api/REST.feature +26 -0
  582. test_holado/features/NonReg/api/gRPC.feature +116 -0
  583. test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
  584. test_holado/features/NonReg/common/system/commands.feature +43 -0
  585. test_holado/features/NonReg/common/system/system.feature +20 -0
  586. test_holado/features/NonReg/common/tables/table.feature +245 -0
  587. test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
  588. test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
  589. test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
  590. test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
  591. test_holado/features/NonReg/holado_ais/ais_message-nmea_raw_to_dict.feature +93 -0
  592. test_holado/features/NonReg/holado_ais/message_types/type-10.feature +38 -0
  593. test_holado/features/NonReg/holado_ais/message_types/type-12.feature +37 -0
  594. test_holado/features/NonReg/holado_ais/message_types/type-14.feature +36 -0
  595. test_holado/features/NonReg/holado_ais/message_types/type-15.feature +36 -0
  596. test_holado/features/NonReg/holado_ais/message_types/type-16.feature +38 -0
  597. test_holado/features/NonReg/holado_ais/message_types/type-17.feature +46 -0
  598. test_holado/features/NonReg/holado_ais/message_types/type-18.feature +37 -0
  599. test_holado/features/NonReg/holado_ais/message_types/type-19.feature +38 -0
  600. test_holado/features/NonReg/holado_ais/message_types/type-1_2_3.feature +42 -0
  601. test_holado/features/NonReg/holado_ais/message_types/type-20.feature +38 -0
  602. test_holado/features/NonReg/holado_ais/message_types/type-21.feature +37 -0
  603. test_holado/features/NonReg/holado_ais/message_types/type-22.feature +84 -0
  604. test_holado/features/NonReg/holado_ais/message_types/type-23.feature +49 -0
  605. test_holado/features/NonReg/holado_ais/message_types/type-24.feature +72 -0
  606. test_holado/features/NonReg/holado_ais/message_types/type-25.feature +143 -0
  607. test_holado/features/NonReg/holado_ais/message_types/type-26.feature +144 -0
  608. test_holado/features/NonReg/holado_ais/message_types/type-27.feature +36 -0
  609. test_holado/features/NonReg/holado_ais/message_types/type-4_11.feature +39 -0
  610. test_holado/features/NonReg/holado_ais/message_types/type-5.feature +33 -0
  611. test_holado/features/NonReg/holado_ais/message_types/type-6.feature +37 -0
  612. test_holado/features/NonReg/holado_ais/message_types/type-7_13.feature +43 -0
  613. test_holado/features/NonReg/holado_ais/message_types/type-8.feature +37 -0
  614. test_holado/features/NonReg/holado_ais/message_types/type-9.feature +37 -0
  615. test_holado/features/NonReg/holado_binary/bit_series.error.feature +33 -0
  616. test_holado/features/NonReg/holado_binary/bit_series.feature +144 -0
  617. test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
  618. test_holado/features/NonReg/holado_python/convert.feature +20 -0
  619. test_holado/features/NonReg/holado_python/iterable.feature +61 -0
  620. test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_reset.feature +191 -0
  621. test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_with_tls_and_verify.feature +279 -0
  622. test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_with_tls_without_verify.feature +299 -0
  623. test_holado/features/NonReg/holado_python/standard_library/socket/local_echo_server/socket_without_tls.feature +163 -0
  624. test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_with_mtls.feature +214 -0
  625. test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_with_tls.feature +184 -0
  626. test_holado/features/NonReg/holado_python/standard_library/socket/tcpbin.com/socket_without_tls.feature +169 -0
  627. test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
  628. test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
  629. test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
  630. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
  631. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
  632. test_holado/features/NonReg/holado_yaml/yaml.feature +514 -0
  633. test_holado/features/NonReg/ipc/json.feature +20 -0
  634. test_holado/features/NonReg/scenario/scenario.feature +183 -0
  635. test_holado/features/NonReg/test_steps/behave.feature +275 -0
  636. test_holado/features/NonReg/test_steps/common.feature +100 -0
  637. test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
  638. test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
  639. test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
  640. test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
  641. test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
  642. test_holado/features/NonReg/tools/sFTP.feature +25 -0
  643. test_holado/features/Test/logger.feature +28 -0
  644. test_holado/features/Test/test_host_controller.feature +13 -0
  645. test_holado/features/Test/test_parameter.feature +15 -0
  646. test_holado/features/__init__.py +0 -0
  647. test_holado/initialize_holado.py +62 -0
  648. test_holado/logging.conf +53 -0
  649. test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
  650. test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
  651. test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
  652. test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
  653. test_holado/resources/scripts/list_tags.sh +2 -0
  654. test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
  655. test_holado/steps/__init__.py +0 -0
  656. test_holado/steps/private_steps.py +20 -0
  657. test_holado/steps/public_steps.py +23 -0
  658. test_holado/test_holado_session_context.py +43 -0
  659. test_holado/tools/connexion/api_rest/openapi.yaml +16 -0
  660. test_holado/tools/connexion/api_rest/run.py +19 -0
  661. test_holado/tools/django/README.txt +3 -0
  662. test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
  663. test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
  664. test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
  665. test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
  666. test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
  667. test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
  668. test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
  669. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
  670. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
  671. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
  672. test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
  673. test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
  674. test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
  675. test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
  676. test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
  677. test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
  678. test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
  679. test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
  680. test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
  681. test_holado/tools/django/api_grpc/manage.py +29 -0
  682. test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
  683. test_holado/tools/django/api_grpc/patch_djangogrpcframework.py +42 -0
  684. test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
  685. test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
  686. test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
  687. test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
  688. test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
  689. test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
  690. test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
  691. test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
  692. test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
  693. test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
  694. test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
  695. test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
  696. test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
  697. test_holado/tools/django/api_rest/db.sqlite3 +0 -0
  698. test_holado/tools/django/api_rest/manage.py +22 -0
@@ -0,0 +1,33 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ from builtins import super
15
+ import logging
16
+ from holado_core.common.block.function import Function
17
+ from behave.__main__ import main
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class BehaveFunction(Function):
23
+ '''
24
+ Function that launch behave with given parameters.
25
+ Return True if succeeded
26
+ '''
27
+
28
+ def __init__(self, behave_args):
29
+ super().__init__(main, behave_args)
30
+
31
+ def run(self):
32
+ result = super().run()
33
+ return result == 0
@@ -0,0 +1,558 @@
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 copy
16
+ import weakref
17
+ import behave
18
+ from holado.common.context.session_context import SessionContext
19
+ from holado_core.common.exceptions.technical_exception import TechnicalException
20
+ from holado_multitask.multitasking.multitask_manager import MultitaskManager
21
+ import time
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ ##### Implementation working but not working when launching behave in parallel in multiple threads
27
+
28
+ # class BehaveManager(object):
29
+ # """
30
+ # Manage Behave features.
31
+ # """
32
+ #
33
+ # def __init__(self):
34
+ # self.__main_pid = None
35
+ # self.__main_context_by_pid = {}
36
+ # self.__context_by_pid_and_tid = {}
37
+ #
38
+ #
39
+ # def clear(self):
40
+ # # TODO EKL: clear only current (pid, tid), since behave can be launched in parallel threads
41
+ # # pid = os.getpid()
42
+ # # if pid in self.__main_context_by_pid:
43
+ # # del self.__main_context_by_pid[pid]
44
+ # # if pid in self.__context_by_pid_and_tid:
45
+ # # del self.__context_by_pid_and_tid[pid]
46
+ # pass
47
+ #
48
+ # def has_main_pid(self):
49
+ # return self.__main_pid is not None
50
+ #
51
+ # def get_main_pid(self):
52
+ # return self.__main_pid
53
+ #
54
+ # def get_main_context(self, pid=None, raise_exception=True):
55
+ # context_info = self.__get_main_context_info(pid, raise_exception)
56
+ # if context_info is None:
57
+ # return None
58
+ # else:
59
+ # return context_info[0]
60
+ #
61
+ # def __get_main_context_info(self, pid=None, raise_exception=True):
62
+ # if pid is None:
63
+ # pid = os.getpid()
64
+ # if pid not in self.__main_context_by_pid:
65
+ # if raise_exception:
66
+ # raise TechnicalException("Main behave context is not defined")
67
+ # else:
68
+ # return None
69
+ # return self.__main_context_by_pid[pid]
70
+ #
71
+ # def set_main_context(self, context, runner=None, raise_if_already_exists=True):
72
+ # if self.get_main_context(raise_exception=False) is not None:
73
+ # if self.__is_main_context_with_indendant_runner(raise_exception=False):
74
+ # SessionContext.instance().after_scenario(SessionContext.instance().get_scenario_context().scenario)
75
+ # SessionContext.instance().after_feature(SessionContext.instance().get_feature_context().feature)
76
+ # else:
77
+ # if raise_if_already_exists:
78
+ # raise TechnicalException(f"Main behave context is already set: [{self.get_main_context(raise_exception=False)}]")
79
+ # else:
80
+ # logger.warning(f"Resetting main behave context: [{self.get_main_context(raise_exception=False)}] -> [{context}]")
81
+ #
82
+ # pid = os.getpid()
83
+ # thread_id = MultitaskManager.get_thread_id()
84
+ #
85
+ # if self.__main_pid is None:
86
+ # self.__main_pid = pid
87
+ # # logger.print(f"+++++ set main pid: {self.__main_pid}")
88
+ #
89
+ # self.__main_context_by_pid[pid] = (context, runner)
90
+ # if pid not in self.__context_by_pid_and_tid:
91
+ # self.__context_by_pid_and_tid[pid] = {}
92
+ # self.__context_by_pid_and_tid[pid][thread_id] = (context, runner)
93
+ # # logger.print(f"+++++ set main context: pid={self.__main_pid} ; tid={thread_id} ; {context=} ; {runner=}")
94
+ #
95
+ # def __is_main_context_with_indendant_runner(self, raise_exception=True):
96
+ # import holado_test.behave.independant_runner
97
+ #
98
+ # context_info = self.__get_main_context_info(raise_exception=raise_exception)
99
+ # if context_info is None:
100
+ # return False
101
+ #
102
+ # runner = context_info[1] if context_info[1] is not None else context_info[0]._runner
103
+ # if not isinstance(runner, behave.runner.Runner):
104
+ # raise TechnicalException(f"Wrong runner instance is verified")
105
+ #
106
+ # return isinstance(runner, holado_test.behave.independant_runner.IndependantRunner)
107
+ #
108
+ # def use_independant_runner(self, step_paths=None):
109
+ # """
110
+ # Use this method to run an independant behave runner,
111
+ # so that a main context is set that can be used to execute steps
112
+ # with method "execute_steps" without executing behave features.
113
+ #
114
+ # WARNING: Current implementation has limitations.
115
+ # Current working directory must contain:
116
+ # - a folder "features" with at least one .feature file, even empty
117
+ # - a folder "steps" with a x_steps.py file importing all step files
118
+ # - a file "environment.py" containing "from XXX.behave_environment import *"
119
+ # """
120
+ # ### Current working implementation
121
+ # from holado_test.behave.behave_function import BehaveFunction
122
+ # from holado_multitask.multithreading.functionthreaded import FunctionThreaded
123
+ # import time
124
+ # behave_args = f'--no-source --no-skipped --format null --no-summary --no-capture --no-capture-stderr --no-logcapture -r holado_test.behave.independant_runner:IndependantRunner'
125
+ # behave_func = BehaveFunction(behave_args)
126
+ # thread = FunctionThreaded(behave_func.run, args=[], name=f"Thread with fake behave run")
127
+ # thread.start()
128
+ # time.sleep(1)
129
+ #
130
+ # ### Other tried implementation:
131
+ #
132
+ # # from holado_multitask.multithreading.functionthreaded import FunctionThreaded
133
+ # # import time
134
+ # #
135
+ # # behave_args = f'--no-source --no-skipped --format null --no-summary --no-capture --no-capture-stderr --no-logcapture -r holado_test.behave.independant_runner:IndependantRunner'
136
+ # # def run(behave_args):
137
+ # # from behave.configuration import Configuration
138
+ # # from behave.runner_plugin import RunnerPlugin
139
+ # # from behave.runner_util import reset_runtime
140
+ # #
141
+ # # # Copy of useful code in behave.__main__.main
142
+ # # config = Configuration(behave_args)
143
+ # # if not config.format:
144
+ # # config.format = [config.default_format]
145
+ # # elif config.format and "format" in config.defaults:
146
+ # # # -- CASE: Formatter are specified in behave configuration file.
147
+ # # # Check if formatter are provided on command-line, too.
148
+ # # if len(config.format) == len(config.defaults["format"]):
149
+ # # # -- NO FORMATTER on command-line: Add default formatter.
150
+ # # config.format.append(config.default_format)
151
+ # #
152
+ # # reset_runtime()
153
+ # # runner = RunnerPlugin().make_runner(config, step_paths=step_paths)
154
+ # # runner.run()
155
+ # # thread = FunctionThreaded(run, args=[behave_args], name=f"Thread with independant behave run")
156
+ # # thread.start()
157
+ # # time.sleep(1)
158
+ #
159
+ # ### Other tried implementation:
160
+ #
161
+ # # context = behave.runner.Context(runner)
162
+ # # runner.context = context
163
+ # #
164
+ # # runner.load_hooks()
165
+ # # runner.load_step_definitions()
166
+ # # feature_locations = [filename for filename in runner.feature_locations()
167
+ # # if not runner.config.exclude(filename)]
168
+ # # features = runner.parse_features(feature_locations, language=self.config.lang)
169
+ # # runner.features.extend(features)
170
+ # # runner.feature = runner.features[0]
171
+ # #
172
+ # # self.set_main_context(context, runner=runner)
173
+ #
174
+ #
175
+ # def get_context(self, raise_exception=True):
176
+ # context_info = self.__get_context_info(raise_exception)
177
+ # if context_info is None:
178
+ # return None
179
+ # else:
180
+ # return context_info[0]
181
+ #
182
+ # def __get_context_info(self, raise_exception=True):
183
+ # pid = os.getpid()
184
+ # if pid not in self.__context_by_pid_and_tid:
185
+ # # Initialize main context of this pid as a sub context of main pid
186
+ # # raise TechnicalException(f"Process {pid} doesn't exist in __context_by_pid_and_tid")
187
+ # new_context, new_runner = self.__new_context_runner(pid_ref=self.__main_pid, raise_exception=raise_exception)
188
+ # self.set_main_context(new_context, new_runner)
189
+ #
190
+ # tid = MultitaskManager.get_thread_id()
191
+ # if tid not in self.__context_by_pid_and_tid[pid]:
192
+ # new_context, new_runner = self.__new_context_runner(raise_exception)
193
+ # # new_context.thread_id = tid
194
+ # # logger.debug(f"New context ({id(new_context)}) for thread {tid}")
195
+ #
196
+ # self.__context_by_pid_and_tid[pid][tid] = (new_context, new_runner)
197
+ #
198
+ # res = self.__context_by_pid_and_tid[pid][tid]
199
+ # # self.__verify_context(res)
200
+ # return res
201
+ #
202
+ # def __new_context_runner(self, raise_exception, pid_ref=None):
203
+ # ref_context = self.get_main_context(pid=pid_ref, raise_exception=raise_exception)
204
+ #
205
+ # # Create a copy of the runner
206
+ # res_run = copy.copy(ref_context._runner.__repr__.__self__) # Context._runner is a weakref.proxy
207
+ #
208
+ # # Create new context
209
+ # res_con = behave.runner.Context(res_run)
210
+ # res_con.feature = copy.copy(ref_context.feature)
211
+ # res_con.feature.parser = copy.copy(ref_context.feature.parser)
212
+ #
213
+ # # Update cross references
214
+ # res_run.context = res_con
215
+ # res_con._runner = weakref.proxy(res_run) # Context._runner is a weakref.proxy
216
+ #
217
+ # # Update context with attributes used by HolAdo
218
+ # self.before_scenario(res_con)
219
+ #
220
+ # return res_con, res_run
221
+ #
222
+ # def before_scenario(self, context=None):
223
+ # if context is None:
224
+ # context = self.get_main_context()
225
+ #
226
+ # # Initialize step information
227
+ # context.sub_step_exception = None
228
+ #
229
+ # # Manage expected exception
230
+ # context.expected_exception_str = None
231
+ # context.expected_exception_pattern = None
232
+ # context.in_expected_exception_step = False
233
+ # context.expected_exception_step_level = -1
234
+ # context.expected_exception_thread_id = None
235
+ #
236
+ # # def __log_registered_contexts(self, name=None):
237
+ # # msg_list = []
238
+ # # if name:
239
+ # # msg_list.append(f"[{name}] Registered contexts:")
240
+ # # else:
241
+ # # msg_list.append("Registered contexts:")
242
+ # # msg_list.append(f" Main context: id={id(self.__main_context)} (thread: {self.__main_context.thread_id})")
243
+ # # for tid, con_run in self.__context_by_pid_and_tid.items():
244
+ # # context, _ = con_run
245
+ # # msg_list.append(f" Context of thread {tid}: id={id(context)} (thread: {context.thread_id})")
246
+ # # logger.debug("\n".join(msg_list))
247
+ #
248
+ # # def __verify_context(self, context):
249
+ # # thread_id = MultitaskManager.get_thread_id()
250
+ # # if context.thread_id != thread_id:
251
+ # # raise TechnicalException(f"Current thread and context thread are different (current thread: {thread_id} ; context thread: {context.thread_id} ; context: {id(context)})")
252
+ #
253
+
254
+
255
+
256
+
257
+
258
+
259
+ ##### Implementation working when launching behave in parallel in multiple threads
260
+
261
+ class BehaveManager(object):
262
+ """
263
+ Manage Behave features.
264
+ """
265
+
266
+ def __init__(self):
267
+ self.__context_by_pid_and_tid = {}
268
+
269
+ def clear(self):
270
+ pid = MultitaskManager.get_process_id()
271
+ tid = MultitaskManager.get_thread_id()
272
+ if pid in self.__context_by_pid_and_tid:
273
+ if tid in self.__context_by_pid_and_tid[pid]:
274
+ del self.__context_by_pid_and_tid[pid][tid]
275
+ # TODO: delete related threads
276
+ if len(self.__context_by_pid_and_tid[pid]) == 0:
277
+ del self.__context_by_pid_and_tid[pid]
278
+ # TODO: delete related processes
279
+
280
+ def has_main_pid(self):
281
+ return self.get_main_pid() is not None
282
+
283
+ def get_main_pid(self):
284
+ if len(self.__context_by_pid_and_tid) == 0:
285
+ return None
286
+ return next(iter(self.__context_by_pid_and_tid))
287
+
288
+ def get_main_context(self, pid=None, raise_exception=True):
289
+ context_info = self.__get_main_context_info(pid, raise_exception)
290
+ return self.__get_context_from_info(context_info)
291
+
292
+ def __get_context_from_info(self, context_info):
293
+ return context_info[0] if context_info is not None else None
294
+
295
+ def __get_runner_from_info(self, context_info):
296
+ return context_info[1] if context_info is not None else None
297
+
298
+ def __is_reference_from_info(self, context_info):
299
+ return context_info[2] if context_info is not None else None
300
+
301
+ def __get_main_context_info(self, pid=None, raise_exception=True):
302
+ custom_pid = pid is not None and pid != MultitaskManager.get_process_id()
303
+ if pid is None:
304
+ pid = MultitaskManager.get_process_id()
305
+
306
+ if pid not in self.__context_by_pid_and_tid or len(self.__context_by_pid_and_tid[pid]) == 0:
307
+ if custom_pid:
308
+ raise TechnicalException(f"Not managed to get main behave context on custom PID {pid}")
309
+ else:
310
+ ppid = MultitaskManager.get_parent_process_id()
311
+ if ppid not in self.__context_by_pid_and_tid or len(self.__context_by_pid_and_tid[ppid]) == 0:
312
+ if raise_exception:
313
+ raise TechnicalException(f"Main behave context is not defined either for current process PID {pid} and parent process PID {ppid} (existing context: {self.__context_by_pid_and_tid})")
314
+ else:
315
+ return None
316
+ else:
317
+ # Use same context than parent process
318
+ context, runner, _ = next(iter(self.__context_by_pid_and_tid[ppid].values()))
319
+ tid = MultitaskManager.get_thread_id()
320
+ self.__set_context(pid, tid, context, runner, is_reference=False)
321
+
322
+ return next(iter(self.__context_by_pid_and_tid[pid].values()))
323
+
324
+ def set_main_context(self, context, runner=None, raise_if_already_exists=True):
325
+ context_info = self.__get_main_context_info(raise_exception=False)
326
+ if context_info is not None and self.__get_context_from_info(context_info) is not None:
327
+ if not self.__is_reference_from_info(context_info):
328
+ self.__remove_context()
329
+ elif self.__is_context_info_with_indendant_runner(context_info, raise_exception=False):
330
+ if SessionContext.instance().has_scenario_context(is_reference=True):
331
+ SessionContext.instance().after_scenario(SessionContext.instance().get_scenario_context().scenario)
332
+ if SessionContext.instance().has_feature_context(is_reference=True):
333
+ SessionContext.instance().after_feature(SessionContext.instance().get_feature_context().feature)
334
+ else:
335
+ if raise_if_already_exists:
336
+ raise TechnicalException(f"Main behave context is already set: [{self.get_main_context(raise_exception=False)}]")
337
+ else:
338
+ logger.warning(f"Resetting main behave context: [{self.get_main_context(raise_exception=False)}] -> [{context}]")
339
+
340
+ # Initialize context with HolAdo needs
341
+ self.__init_context(context)
342
+
343
+ pid = MultitaskManager.get_process_id()
344
+ tid = MultitaskManager.get_thread_id()
345
+ self.__set_context(pid, tid, context, runner, is_reference=True)
346
+ # logger.print(f"+++++ set main context: pid={pid} ; tid={tid} ; {context=} ; {runner=}")
347
+
348
+ def __is_context_info_with_indendant_runner(self, context_info, raise_exception=True):
349
+ import holado_test.behave.independant_runner
350
+
351
+ runner = self.__get_runner_from_info(context_info)
352
+ if runner is None:
353
+ runner = self.__get_context_from_info(context_info)._runner
354
+
355
+ if not isinstance(runner, behave.runner.Runner):
356
+ raise TechnicalException(f"Wrong runner instance is verified")
357
+
358
+ return isinstance(runner, holado_test.behave.independant_runner.IndependantRunner)
359
+
360
+ def use_independant_runner(self, step_paths=None):
361
+ """
362
+ Use this method to run an independant behave runner,
363
+ so that a main context is set that can be used to execute steps
364
+ with method "execute_steps" without executing behave features.
365
+
366
+ WARNING: Current implementation has limitations.
367
+ Current working directory must contain:
368
+ - a folder "features" with at least one .feature file, even empty
369
+ - a folder "steps" with a x_steps.py file importing all step files
370
+ - a file "environment.py" containing "from XXX.behave_environment import *"
371
+ """
372
+ ### Current working implementation
373
+ from holado_test.behave.behave_function import BehaveFunction
374
+ from holado_multitask.multithreading.functionthreaded import FunctionThreaded
375
+ from holado_core.common.handlers.wait import WaitFuncResult
376
+
377
+ # Run behave with runner IndependantRunner in a thread
378
+ behave_args = f'--no-source --no-skipped --format null --no-summary --no-capture --no-capture-stderr --no-logcapture -r holado_test.behave.independant_runner:IndependantRunner'
379
+ behave_func = BehaveFunction(behave_args)
380
+ thread = FunctionThreaded(behave_func.run, args=[], name=f"Thread with fake behave run")
381
+ thread.start()
382
+ thread_uid = MultitaskManager.get_thread_uid(thread)
383
+
384
+ # Use the same thread context for this thread
385
+ SessionContext.instance().multitask_manager.relate_thread_to(MultitaskManager.get_thread_uid(), thread_uid)
386
+
387
+ # Wait until associated behave context exists
388
+ def context_exists(pid, tid):
389
+ return pid in self.__context_by_pid_and_tid and tid in self.__context_by_pid_and_tid[pid]
390
+ wait_context = WaitFuncResult(f"wait independent behave context exists",
391
+ lambda: context_exists(MultitaskManager.get_process_id(), thread_uid))
392
+ wait_context.redo_until(True)
393
+ wait_context.execute()
394
+ # Note: previous waiting mechanism is sometimes to rapid to execute steps just after
395
+ time.sleep(0.01)
396
+
397
+ ### Other tried implementation:
398
+
399
+ # from holado_multitask.multithreading.functionthreaded import FunctionThreaded
400
+ # import time
401
+ #
402
+ # behave_args = f'--no-source --no-skipped --format null --no-summary --no-capture --no-capture-stderr --no-logcapture -r holado_test.behave.independant_runner:IndependantRunner'
403
+ # def run(behave_args):
404
+ # from behave.configuration import Configuration
405
+ # from behave.runner_plugin import RunnerPlugin
406
+ # from behave.runner_util import reset_runtime
407
+ #
408
+ # # Copy of useful code in behave.__main__.main
409
+ # config = Configuration(behave_args)
410
+ # if not config.format:
411
+ # config.format = [config.default_format]
412
+ # elif config.format and "format" in config.defaults:
413
+ # # -- CASE: Formatter are specified in behave configuration file.
414
+ # # Check if formatter are provided on command-line, too.
415
+ # if len(config.format) == len(config.defaults["format"]):
416
+ # # -- NO FORMATTER on command-line: Add default formatter.
417
+ # config.format.append(config.default_format)
418
+ #
419
+ # reset_runtime()
420
+ # runner = RunnerPlugin().make_runner(config, step_paths=step_paths)
421
+ # runner.run()
422
+ # thread = FunctionThreaded(run, args=[behave_args], name=f"Thread with independant behave run")
423
+ # thread.start()
424
+ # time.sleep(1)
425
+
426
+ ### Other tried implementation:
427
+
428
+ # context = behave.runner.Context(runner)
429
+ # runner.context = context
430
+ #
431
+ # runner.load_hooks()
432
+ # runner.load_step_definitions()
433
+ # feature_locations = [filename for filename in runner.feature_locations()
434
+ # if not runner.config.exclude(filename)]
435
+ # features = runner.parse_features(feature_locations, language=self.config.lang)
436
+ # runner.features.extend(features)
437
+ # runner.feature = runner.features[0]
438
+ #
439
+ # self.set_main_context(context, runner=runner)
440
+
441
+
442
+ def get_context(self, raise_exception=True):
443
+ context_info = self.__get_context_info(raise_exception)
444
+ return self.__get_context_from_info(context_info)
445
+
446
+ def __get_context_info(self, raise_exception=True):
447
+ pid = MultitaskManager.get_process_id()
448
+ if pid not in self.__context_by_pid_and_tid:
449
+ # Initialize main context of this pid as a sub context of main pid
450
+ # raise TechnicalException(f"Process {pid} doesn't exist in __context_by_pid_and_tid")
451
+ # new_context, new_runner = self.__new_context_runner(pid_ref=self.__main_pid, raise_exception=raise_exception)
452
+ # self.set_main_context(new_context, new_runner)
453
+ self.__context_by_pid_and_tid[pid] = {}
454
+
455
+ tid = MultitaskManager.get_thread_id()
456
+ if tid not in self.__context_by_pid_and_tid[pid]:
457
+ # Create a new context using as reference the first context of current process
458
+ new_context, new_runner = self.__new_context_runner(raise_exception, pid_ref=pid)
459
+ # new_context.thread_id = tid
460
+ # logger.debug(f"New context ({id(new_context)}) for thread {tid}")
461
+ self.__set_context(pid, tid, new_context, new_runner, is_reference=True)
462
+
463
+ res = self.__context_by_pid_and_tid[pid][tid]
464
+ # self.__verify_context(res)
465
+ return res
466
+
467
+ def __set_context(self, pid, tid, context, runner, is_reference=True):
468
+ if pid not in self.__context_by_pid_and_tid:
469
+ self.__context_by_pid_and_tid[pid] = {}
470
+ self.__context_by_pid_and_tid[pid][tid] = (context, runner, is_reference)
471
+
472
+ def __remove_context(self, pid=None, tid=None):
473
+ if pid is None:
474
+ pid = MultitaskManager.get_process_id()
475
+ if tid is None:
476
+ tid = MultitaskManager.get_thread_id()
477
+
478
+ if pid in self.__context_by_pid_and_tid and tid in self.__context_by_pid_and_tid[pid]:
479
+ del self.__context_by_pid_and_tid[pid][tid]
480
+ else:
481
+ raise TechnicalException(f"No context is set for thread ID {tid} and process ID {pid}")
482
+
483
+ def __new_context_runner(self, raise_exception, pid_ref=None):
484
+ ref_context = self.get_main_context(pid=pid_ref, raise_exception=raise_exception)
485
+
486
+ # Create a copy of the runner
487
+ res_run = copy.copy(ref_context._runner.__repr__.__self__) # Context._runner is a weakref.proxy
488
+
489
+ # Create new context
490
+ res_con = behave.runner.Context(res_run)
491
+ res_con.feature = copy.copy(ref_context.feature)
492
+ res_con.feature.parser = copy.copy(ref_context.feature.parser)
493
+
494
+ # Update cross references
495
+ res_run.context = res_con
496
+ res_con._runner = weakref.proxy(res_run) # Context._runner is a weakref.proxy
497
+
498
+ # Update context with attributes used by HolAdo
499
+ self.before_scenario(res_con)
500
+
501
+ # Initialize context with HolAdo needs
502
+ self.__init_context(res_con)
503
+
504
+ return res_con, res_run
505
+
506
+ def before_scenario(self, context=None):
507
+ if context is None:
508
+ context = self.get_main_context()
509
+
510
+ self.__reset_context(context)
511
+
512
+ def __init_context(self, context):
513
+ # Initialize step information
514
+ if not hasattr(context, 'sub_step_exception'):
515
+ context.sub_step_exception = None
516
+
517
+ # Manage expected exception
518
+ if not hasattr(context, 'expected_exception_str'):
519
+ context.expected_exception_str = None
520
+ if not hasattr(context, 'expected_exception_pattern'):
521
+ context.expected_exception_pattern = None
522
+ if not hasattr(context, 'in_expected_exception_step'):
523
+ context.in_expected_exception_step = False
524
+ if not hasattr(context, 'expected_exception_step_level'):
525
+ context.expected_exception_step_level = -1
526
+ if not hasattr(context, 'expected_exception_thread_id'):
527
+ context.expected_exception_thread_id = None
528
+
529
+ def __reset_context(self, context):
530
+ # Initialize step information
531
+ context.sub_step_exception = None
532
+
533
+ # Manage expected exception
534
+ context.expected_exception_str = None
535
+ context.expected_exception_pattern = None
536
+ context.in_expected_exception_step = False
537
+ context.expected_exception_step_level = -1
538
+ context.expected_exception_thread_id = None
539
+
540
+ # def __log_registered_contexts(self, name=None):
541
+ # msg_list = []
542
+ # if name:
543
+ # msg_list.append(f"[{name}] Registered contexts:")
544
+ # else:
545
+ # msg_list.append("Registered contexts:")
546
+ # msg_list.append(f" Main context: id={id(self.__main_context)} (thread: {self.__main_context.thread_id})")
547
+ # for tid, con_run in self.__context_by_pid_and_tid.items():
548
+ # context, _ = con_run
549
+ # msg_list.append(f" Context of thread {tid}: id={id(context)} (thread: {context.thread_id})")
550
+ # logger.debug("\n".join(msg_list))
551
+
552
+ # def __verify_context(self, context):
553
+ # thread_id = MultitaskManager.get_thread_id()
554
+ # if context.thread_id != thread_id:
555
+ # raise TechnicalException(f"Current thread and context thread are different (current thread: {thread_id} ; context thread: {context.thread_id} ; context: {id(context)})")
556
+
557
+
558
+
@@ -0,0 +1,66 @@
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 behave.runner import Runner
16
+ from behave.parser import parse_feature
17
+ from holado.holado_config import Config
18
+
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+
24
+ class IndependantRunner(Runner):
25
+ """
26
+ Independant Behave runner.
27
+
28
+ WARNING: with current implementation, many files must exist in current working directory:
29
+ - a folder "features" with at least one .feature file, even empty
30
+ - a folder "steps" with a x_steps.py file importing all step files
31
+ - a file "environment.py" containing "from XXX.behave_environment import *"
32
+ """
33
+
34
+ def __init__(self, config, step_paths=None):
35
+ super().__init__(config)
36
+ logger.info(f"Using behave runner IndependantRunner({step_paths=})")
37
+ self.__step_paths = step_paths
38
+
39
+ def load_step_definitions(self, extra_step_paths=None):
40
+ # TODO: replace default implementation by loading steps in self.step_paths
41
+ super().load_step_definitions(extra_step_paths)
42
+
43
+ # logger.warning(f"++++ Loading step definitions ({self.__step_paths=})")
44
+ # super().load_step_definitions(extra_step_paths=self.__step_paths)
45
+ # logger.warning(f"++++ Loaded steps: {the_step_registry.steps}")
46
+
47
+ def setup_paths(self):
48
+ # TODO: replace default implementation by setting runtime defined paths passed in constructor
49
+ super().setup_paths()
50
+
51
+ # logger.warning(f"++++ setup_paths: {self.__step_paths=}")
52
+ # self.path_manager.add(self.__step_paths)
53
+
54
+ def run_model(self, features=None):
55
+ # Use a custom feature that waits 7 days
56
+ feature_text = \
57
+ """
58
+ Feature: Fake
59
+ Scenario: Fake
60
+ When wait {runner_session_timeout} seconds
61
+ """.format(runner_session_timeout=Config.session_timeout_seconds)
62
+ feature = parse_feature(feature_text)
63
+
64
+ return super().run_model([feature])
65
+
66
+
File without changes