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

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

Potentially problematic release.


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

Files changed (524) hide show
  1. holado/__init__.py +11 -1
  2. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/METADATA +13 -9
  3. holado-0.2.4.dist-info/RECORD +535 -0
  4. holado_ais/__init__.py +33 -0
  5. holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
  6. holado_ais/ais/ais_manager.py +151 -0
  7. holado_ais/ais/ais_messages.py +204 -0
  8. holado_ais/ais/ais_payload.py +35 -0
  9. holado_ais/ais/enums.py +37 -0
  10. holado_ais/ais/patch_pyais.py +1303 -0
  11. holado_ais/tests/behave/steps/__init__.py +17 -0
  12. holado_ais/tests/behave/steps/ais/__init__.py +0 -0
  13. holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
  14. holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
  15. holado_binary/__init__.py +17 -0
  16. holado_binary/ipc/binary.py +125 -0
  17. holado_binary/ipc/bit_series.py +307 -0
  18. holado_binary/tests/behave/steps/__init__.py +17 -0
  19. holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
  20. holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
  21. holado_context/__init__.py +16 -0
  22. holado_context/tests/behave/steps/__init__.py +16 -0
  23. holado_context/tests/behave/steps/private/__init__.py +16 -0
  24. holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
  25. holado_core/__init__.py +32 -0
  26. holado_core/common/__init__.py +0 -0
  27. holado_core/common/actors/actions.py +97 -0
  28. holado_core/common/actors/actor.py +226 -0
  29. holado_core/common/actors/element_actor.py +32 -0
  30. holado_core/common/actors/find_actor.py +106 -0
  31. holado_core/common/actors/tree_actor.py +32 -0
  32. holado_core/common/actors/verify_actions.py +69 -0
  33. holado_core/common/block/base.py +122 -0
  34. holado_core/common/block/block_manager.py +173 -0
  35. holado_core/common/block/block_method.py +46 -0
  36. holado_core/common/block/block_steps.py +37 -0
  37. holado_core/common/block/function.py +42 -0
  38. holado_core/common/block/scope_function.py +28 -0
  39. holado_core/common/block/scope_manager.py +238 -0
  40. holado_core/common/block/scope_steps.py +141 -0
  41. holado_core/common/criterias/and_criteria.py +61 -0
  42. holado_core/common/criterias/criteria.py +78 -0
  43. holado_core/common/criterias/or_criteria.py +64 -0
  44. holado_core/common/criterias/tools/criteria_context.py +20 -0
  45. holado_core/common/criterias/tools/criteria_parameters.py +18 -0
  46. holado_core/common/drivers/driver.py +153 -0
  47. holado_core/common/drivers/element_driver.py +30 -0
  48. holado_core/common/drivers/element_internal_api.py +239 -0
  49. holado_core/common/drivers/internal_api.py +40 -0
  50. holado_core/common/drivers/tree_driver.py +30 -0
  51. holado_core/common/drivers/tree_internal_api.py +176 -0
  52. holado_core/common/exceptions/__init__.py +0 -0
  53. holado_core/common/exceptions/element_exception.py +28 -0
  54. holado_core/common/exceptions/exceptions.py +24 -0
  55. holado_core/common/exceptions/functional_exception.py +21 -0
  56. holado_core/common/exceptions/holado_exception.py +25 -0
  57. holado_core/common/exceptions/technical_exception.py +27 -0
  58. holado_core/common/exceptions/timeout_exception.py +20 -0
  59. holado_core/common/exceptions/verify_exception.py +20 -0
  60. holado_core/common/finders/after_in_tree_finder.py +87 -0
  61. holado_core/common/finders/element_finder.py +60 -0
  62. holado_core/common/finders/else_finder.py +105 -0
  63. holado_core/common/finders/finder.py +478 -0
  64. holado_core/common/finders/or_finder.py +98 -0
  65. holado_core/common/finders/then_finder.py +157 -0
  66. holado_core/common/finders/tools/enums.py +30 -0
  67. holado_core/common/finders/tools/find_builder.py +118 -0
  68. holado_core/common/finders/tools/find_context.py +405 -0
  69. holado_core/common/finders/tools/find_info.py +27 -0
  70. holado_core/common/finders/tools/find_parameters.py +240 -0
  71. holado_core/common/finders/tools/find_updater.py +95 -0
  72. holado_core/common/finders/tools/finder_info.py +26 -0
  73. holado_core/common/finders/tree_finder.py +146 -0
  74. holado_core/common/handlers/__init__.py +0 -0
  75. holado_core/common/handlers/abstracts/base_redo.py +695 -0
  76. holado_core/common/handlers/abstracts/get_or_create.py +120 -0
  77. holado_core/common/handlers/element_holder.py +122 -0
  78. holado_core/common/handlers/enums.py +23 -0
  79. holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
  80. holado_core/common/handlers/features/resource_by_name.py +187 -0
  81. holado_core/common/handlers/features/resource_by_type.py +174 -0
  82. holado_core/common/handlers/redo.py +119 -0
  83. holado_core/common/handlers/wait.py +127 -0
  84. holado_core/common/inspectors/element_inspector.py +57 -0
  85. holado_core/common/inspectors/inspector.py +221 -0
  86. holado_core/common/inspectors/tools/inspect_builder.py +169 -0
  87. holado_core/common/inspectors/tools/inspect_context.py +69 -0
  88. holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
  89. holado_core/common/inspectors/tree_inspector.py +73 -0
  90. holado_core/common/resource/persisted_data_manager.py +113 -0
  91. holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
  92. holado_core/common/resource/resource_manager.py +143 -0
  93. holado_core/common/tables/__init__.py +1 -0
  94. holado_core/common/tables/comparators/__init__.py +0 -0
  95. holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
  96. holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
  97. holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
  98. holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
  99. holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
  100. holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
  101. holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
  102. holado_core/common/tables/comparators/string_table_comparator.py +29 -0
  103. holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
  104. holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
  105. holado_core/common/tables/comparators/table_comparator.py +209 -0
  106. holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
  107. holado_core/common/tables/comparators/table_row_comparator.py +116 -0
  108. holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
  109. holado_core/common/tables/converters/__init__.py +0 -0
  110. holado_core/common/tables/converters/table_converter.py +194 -0
  111. holado_core/common/tables/enums.py +23 -0
  112. holado_core/common/tables/table.py +261 -0
  113. holado_core/common/tables/table_cell.py +126 -0
  114. holado_core/common/tables/table_manager.py +366 -0
  115. holado_core/common/tables/table_row.py +169 -0
  116. holado_core/common/tables/table_with_header.py +236 -0
  117. holado_core/common/tools/__init__.py +0 -0
  118. holado_core/common/tools/comparators/comparator.py +151 -0
  119. holado_core/common/tools/comparators/object_comparator.py +21 -0
  120. holado_core/common/tools/converters/converter.py +107 -0
  121. holado_core/common/tools/path_manager.py +185 -0
  122. holado_core/common/tools/string_tools.py +135 -0
  123. holado_core/common/tools/tools.py +172 -0
  124. holado_core/common/transport/__init__.py +0 -0
  125. holado_core/common/transport/crc.py +40 -0
  126. holado_core/tests/behave/steps/__init__.py +20 -0
  127. holado_core/tests/behave/steps/common/__init__.py +0 -0
  128. holado_core/tests/behave/steps/common/common_steps.py +136 -0
  129. holado_core/tests/behave/steps/common/config_steps.py +42 -0
  130. holado_core/tests/behave/steps/common/resource_steps.py +62 -0
  131. holado_core/tests/behave/steps/common/tables_steps.py +537 -0
  132. holado_core/tools/__init__.py +0 -0
  133. holado_core/tools/abstracts/__init__.py +0 -0
  134. holado_core/tools/abstracts/blocking_command_service.py +56 -0
  135. holado_core/tools/abstracts/service.py +48 -0
  136. holado_data/__init__.py +31 -0
  137. holado_data/data/generator/base.py +93 -0
  138. holado_data/data/generator/python_generator.py +30 -0
  139. holado_data/tests/behave/steps/__init__.py +17 -0
  140. holado_data/tests/behave/steps/data/generator_steps.py +91 -0
  141. holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
  142. holado_db/__init__.py +32 -0
  143. holado_db/tests/behave/steps/__init__.py +18 -0
  144. holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
  145. holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
  146. holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
  147. holado_db/tools/db/clients/base/db_client.py +206 -0
  148. holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
  149. holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
  150. holado_db/tools/db/db_manager.py +109 -0
  151. holado_db/tools/db/query/base/query_builder.py +87 -0
  152. holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
  153. holado_db/tools/db/query/query_manager.py +77 -0
  154. holado_docker/__init__.py +25 -0
  155. holado_docker/sdk/docker/docker_client.py +268 -0
  156. holado_docker/sdk/docker/docker_service.py +71 -0
  157. holado_docker/tests/behave/steps/__init__.py +16 -0
  158. holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
  159. holado_docker/tools/docker_controler/__init__.py +26 -0
  160. holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
  161. holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
  162. holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
  163. holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
  164. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
  165. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
  166. holado_grpc/__init__.py +32 -0
  167. holado_grpc/api/rpc/TODO.txt +4 -0
  168. holado_grpc/api/rpc/grpc_client.py +181 -0
  169. holado_grpc/api/rpc/grpc_manager.py +81 -0
  170. holado_grpc/ipc/rpc/__init__.py +0 -0
  171. holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
  172. holado_grpc/ipc/rpc/grpc_services.py +165 -0
  173. holado_grpc/tests/behave/steps/__init__.py +16 -0
  174. holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
  175. holado_grpc/tests/behave/steps/private/__init__.py +16 -0
  176. holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
  177. holado_helper/__init__.py +35 -0
  178. holado_helper/debug/README.txt +32 -0
  179. holado_helper/debug/memory/memory_profiler.py +106 -0
  180. holado_helper/docker/init_user.sh +24 -0
  181. holado_helper/docker/logging.conf +42 -0
  182. holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
  183. holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
  184. holado_helper/docker/run_terminal_in_docker.sh +101 -0
  185. holado_helper/holado_module_template/__init__.py +31 -0
  186. holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
  187. holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
  188. holado_helper/script/action.py +109 -0
  189. holado_helper/script/action_script.py +477 -0
  190. holado_helper/script/any_action_script.py +126 -0
  191. holado_helper/script/behave_action_script.py +99 -0
  192. holado_helper/script/csv_action_script.py +142 -0
  193. holado_helper/script/initialize_script.py +115 -0
  194. holado_helper/script/input_output_script.py +136 -0
  195. holado_helper/script/job.py +75 -0
  196. holado_helper/script/json_action_script.py +104 -0
  197. holado_helper/script/script.py +110 -0
  198. holado_json/__init__.py +16 -0
  199. holado_json/ipc/json.py +125 -0
  200. holado_json/ipc/json_converter.py +69 -0
  201. holado_json/ipc/json_types.py +183 -0
  202. holado_json/tests/behave/steps/__init__.py +16 -0
  203. holado_json/tests/behave/steps/ipc/__init__.py +0 -0
  204. holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
  205. holado_keycloak/__init__.py +16 -0
  206. holado_keycloak/tests/behave/steps/__init__.py +16 -0
  207. holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
  208. holado_keycloak/tools/keycloak/__init__.py +0 -0
  209. holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
  210. holado_logging/__init__.py +37 -0
  211. holado_logging/common/logging/holado_logger.py +75 -0
  212. holado_logging/common/logging/log_config.py +128 -0
  213. holado_logging/common/logging/log_manager.py +292 -0
  214. holado_multitask/__init__.py +33 -0
  215. holado_multitask/multiprocessing/context/process_context.py +35 -0
  216. holado_multitask/multiprocessing/function_process.py +102 -0
  217. holado_multitask/multiprocessing/periodic_function_process.py +135 -0
  218. holado_multitask/multiprocessing/process.py +196 -0
  219. holado_multitask/multiprocessing/processesmanager.py +133 -0
  220. holado_multitask/multitasking/multitask_manager.py +439 -0
  221. holado_multitask/multithreading/__init__.py +0 -0
  222. holado_multitask/multithreading/context/thread_context.py +84 -0
  223. holado_multitask/multithreading/functionthreaded.py +129 -0
  224. holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
  225. holado_multitask/multithreading/loopthread.py +100 -0
  226. holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
  227. holado_multitask/multithreading/reflection/inspect.py +47 -0
  228. holado_multitask/multithreading/reflection/sys.py +29 -0
  229. holado_multitask/multithreading/reflection/traceback.py +35 -0
  230. holado_multitask/multithreading/thread.py +177 -0
  231. holado_multitask/multithreading/threadsmanager.py +162 -0
  232. holado_multitask/multithreading/timer.py +48 -0
  233. holado_multitask/tests/behave/steps/__init__.py +17 -0
  234. holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
  235. holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
  236. holado_protobuf/__init__.py +61 -0
  237. holado_protobuf/ipc/protobuf/__init__.py +0 -0
  238. holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
  239. holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
  240. holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
  241. holado_protobuf/ipc/protobuf/protobuf_messages.py +968 -0
  242. holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
  243. holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
  244. holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
  245. holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
  246. holado_protobuf/tests/behave/steps/__init__.py +16 -0
  247. holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
  248. holado_python/__init__.py +35 -0
  249. holado_python/common/enums.py +34 -0
  250. holado_python/common/iterables.py +30 -0
  251. holado_python/common/tools/comparators/boolean_comparator.py +37 -0
  252. holado_python/common/tools/comparators/bytes_comparator.py +48 -0
  253. holado_python/common/tools/comparators/datetime_comparator.py +74 -0
  254. holado_python/common/tools/comparators/float_comparator.py +97 -0
  255. holado_python/common/tools/comparators/integer_comparator.py +37 -0
  256. holado_python/common/tools/comparators/string_comparator.py +99 -0
  257. holado_python/common/tools/comparators/type_comparator.py +31 -0
  258. holado_python/common/tools/datetime.py +279 -0
  259. holado_python/standard_library/csv.py +207 -0
  260. holado_python/standard_library/hashlib.py +82 -0
  261. holado_python/standard_library/multiprocessing.py +62 -0
  262. holado_python/standard_library/queue.py +79 -0
  263. holado_python/standard_library/socket/blocking_socket.py +136 -0
  264. holado_python/standard_library/socket/echo_server.py +28 -0
  265. holado_python/standard_library/socket/message_socket.py +91 -0
  266. holado_python/standard_library/socket/non_blocking_socket.py +151 -0
  267. holado_python/standard_library/socket/socket.py +148 -0
  268. holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
  269. holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
  270. holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
  271. holado_python/standard_library/ssl/ssl.py +81 -0
  272. holado_python/standard_library/typing.py +192 -0
  273. holado_python/tests/behave/steps/__init__.py +27 -0
  274. holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
  275. holado_python/tests/behave/steps/convert_steps.py +59 -0
  276. holado_python/tests/behave/steps/iterable_steps.py +87 -0
  277. holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
  278. holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
  279. holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
  280. holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
  281. holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
  282. holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
  283. holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
  284. holado_rabbitmq/__init__.py +28 -0
  285. holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
  286. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
  287. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
  288. holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
  289. holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +674 -0
  290. holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
  291. holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
  292. holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
  293. holado_redis/__init__.py +17 -0
  294. holado_redis/tests/behave/steps/__init__.py +16 -0
  295. holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
  296. holado_redis/tools/redis/TODO.txt +7 -0
  297. holado_redis/tools/redis/redis_client.py +190 -0
  298. holado_redis/tools/redis/redis_manager.py +38 -0
  299. holado_report/__init__.py +27 -0
  300. holado_report/report/analyze/execution_historic_manager.py +96 -0
  301. holado_report/report/analyze/scenario_duration_manager.py +245 -0
  302. holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
  303. holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
  304. holado_report/report/builders/report_builder.py +64 -0
  305. holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
  306. holado_report/report/builders/summary_report_builder.py +89 -0
  307. holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
  308. holado_report/report/builders/summary_scenario_report_builder.py +74 -0
  309. holado_report/report/execution_historic.py +141 -0
  310. holado_report/report/report_manager.py +256 -0
  311. holado_report/report/reports/base_report.py +163 -0
  312. holado_report/report/reports/feature_report.py +106 -0
  313. holado_report/report/reports/scenario_report.py +64 -0
  314. holado_rest/__init__.py +24 -0
  315. holado_rest/api/rest/TODO.txt +2 -0
  316. holado_rest/api/rest/rest_client.py +113 -0
  317. holado_rest/api/rest/rest_manager.py +62 -0
  318. holado_rest/tests/behave/steps/__init__.py +16 -0
  319. holado_rest/tests/behave/steps/api/__init__.py +0 -0
  320. holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
  321. holado_rest/tests/behave/steps/private/__init__.py +16 -0
  322. holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
  323. holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
  324. holado_s3/__init__.py +17 -0
  325. holado_s3/tests/behave/steps/__init__.py +17 -0
  326. holado_s3/tests/behave/steps/private/__init__.py +16 -0
  327. holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
  328. holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
  329. holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
  330. holado_s3/tools/s3/__init__.py +0 -0
  331. holado_s3/tools/s3/boto3_s3_client.py +59 -0
  332. holado_s3/tools/s3/minio_client.py +75 -0
  333. holado_s3/tools/s3/moto_server.py +52 -0
  334. holado_scripting/__init__.py +53 -0
  335. holado_scripting/common/tools/dynamic_text_manager.py +73 -0
  336. holado_scripting/common/tools/evaluate_parameters.py +210 -0
  337. holado_scripting/common/tools/expression_evaluator.py +387 -0
  338. holado_scripting/common/tools/variable_manager.py +321 -0
  339. holado_scripting/tests/behave/steps/__init__.py +22 -0
  340. holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
  341. holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
  342. holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
  343. holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
  344. holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
  345. holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
  346. holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
  347. holado_scripting/text/base/base_function.py +25 -0
  348. holado_scripting/text/base/base_verify_function.py +25 -0
  349. holado_scripting/text/base/text_inspecter.py +204 -0
  350. holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
  351. holado_scripting/text/interpreter/functions/function_cast.py +60 -0
  352. holado_scripting/text/interpreter/functions/function_convert.py +57 -0
  353. holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
  354. holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
  355. holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
  356. holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
  357. holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
  358. holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
  359. holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
  360. holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
  361. holado_scripting/text/interpreter/text_interpreter.py +216 -0
  362. holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
  363. holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
  364. holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
  365. holado_scripting/text/verifier/text_verifier.py +103 -0
  366. holado_sftp/__init__.py +16 -0
  367. holado_sftp/tests/behave/steps/__init__.py +17 -0
  368. holado_sftp/tests/behave/steps/private/__init__.py +16 -0
  369. holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
  370. holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
  371. holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
  372. holado_sftp/tools/sftp/__init__.py +0 -0
  373. holado_sftp/tools/sftp/sftp_client.py +103 -0
  374. holado_sftp/tools/sftp/sftp_server.py +39 -0
  375. holado_swagger/__init__.py +31 -0
  376. holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
  377. holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
  378. holado_swagger/tests/behave/steps/__init__.py +16 -0
  379. holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
  380. holado_system/system/command/command.py +216 -0
  381. holado_system/system/command/command_result.py +128 -0
  382. holado_system/system/command/curl_command.py +101 -0
  383. holado_system/system/command/exceptions.py +59 -0
  384. holado_system/system/filesystem/file.py +76 -0
  385. holado_system/system/global_system.py +187 -0
  386. holado_system/tests/behave/steps/__init__.py +18 -0
  387. holado_system/tests/behave/steps/system/commands_steps.py +92 -0
  388. holado_system/tests/behave/steps/system/file_steps.py +215 -0
  389. holado_system/tests/behave/steps/system/system_steps.py +84 -0
  390. holado_test/__init__.py +27 -0
  391. holado_test/behave/__init__.py +0 -0
  392. holado_test/behave/behave.py +397 -0
  393. holado_test/behave/behave_environment.py +143 -0
  394. holado_test/behave/behave_function.py +33 -0
  395. holado_test/behave/behave_manager.py +555 -0
  396. holado_test/behave/independant_runner.py +68 -0
  397. holado_test/behave/scenario/__init__.py +0 -0
  398. holado_test/behave/scenario/behave_step_tools.py +157 -0
  399. holado_test/common/context/feature_context.py +79 -0
  400. holado_test/common/context/scenario_context.py +217 -0
  401. holado_test/common/context/step_context.py +66 -0
  402. holado_test/common/exceptions/undefined_step_exception.py +21 -0
  403. holado_test/scenario/step_tools.py +523 -0
  404. holado_test/scenario/tester_tools.py +52 -0
  405. holado_test/test_config.py +26 -0
  406. holado_test/tests/behave/steps/__init__.py +18 -0
  407. holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
  408. holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
  409. holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
  410. holado_value/__init__.py +24 -0
  411. holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
  412. holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
  413. holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
  414. holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
  415. holado_value/common/tables/converters/value_table_converter.py +217 -0
  416. holado_value/common/tables/value_table.py +29 -0
  417. holado_value/common/tables/value_table_cell.py +67 -0
  418. holado_value/common/tables/value_table_manager.py +58 -0
  419. holado_value/common/tables/value_table_row.py +44 -0
  420. holado_value/common/tables/value_table_with_header.py +28 -0
  421. holado_value/common/tools/unique_value_manager.py +108 -0
  422. holado_value/common/tools/value.py +164 -0
  423. holado_value/common/tools/value_types.py +35 -0
  424. holado_value/tests/behave/steps/__init__.py +16 -0
  425. holado_value/tests/behave/steps/private/__init__.py +16 -0
  426. holado_ws/__init__.py +16 -0
  427. holado_ws/api/ws/TODO.txt +2 -0
  428. holado_ws/tests/behave/steps/__init__.py +16 -0
  429. holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
  430. holado_yaml/__init__.py +31 -0
  431. holado_yaml/tests/behave/steps/__init__.py +16 -0
  432. holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
  433. holado_yaml/yaml/yaml_manager.py +86 -0
  434. test_holado/Dockerfile_test_holado +82 -0
  435. test_holado/__init__.py +4 -0
  436. test_holado/__main__.py +25 -0
  437. test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
  438. test_holado/environment.py +42 -0
  439. test_holado/features/NonReg/api/REST.feature +21 -0
  440. test_holado/features/NonReg/api/gRPC.feature +122 -0
  441. test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
  442. test_holado/features/NonReg/common/system/commands.feature +43 -0
  443. test_holado/features/NonReg/common/system/system.feature +20 -0
  444. test_holado/features/NonReg/common/tables/table.feature +239 -0
  445. test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
  446. test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
  447. test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
  448. test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
  449. test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
  450. test_holado/features/NonReg/holado_python/convert.feature +20 -0
  451. test_holado/features/NonReg/holado_python/iterable.feature +61 -0
  452. test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
  453. test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
  454. test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
  455. test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
  456. test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
  457. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
  458. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
  459. test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
  460. test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
  461. test_holado/features/NonReg/ipc/bit_series.feature +131 -0
  462. test_holado/features/NonReg/ipc/json.feature +20 -0
  463. test_holado/features/NonReg/scenario/scenario.feature +139 -0
  464. test_holado/features/NonReg/test_steps/behave.feature +275 -0
  465. test_holado/features/NonReg/test_steps/common.feature +100 -0
  466. test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
  467. test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
  468. test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
  469. test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
  470. test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
  471. test_holado/features/NonReg/tools/sFTP.feature +25 -0
  472. test_holado/features/Test/logger.feature +28 -0
  473. test_holado/features/__init__.py +0 -0
  474. test_holado/logging.conf +41 -0
  475. test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
  476. test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
  477. test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
  478. test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
  479. test_holado/resources/scripts/list_tags.sh +2 -0
  480. test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
  481. test_holado/steps/__init__.py +0 -0
  482. test_holado/steps/private_steps.py +20 -0
  483. test_holado/steps/public_steps.py +23 -0
  484. test_holado/test_holado_session_context.py +43 -0
  485. test_holado/tools/django/README.txt +3 -0
  486. test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
  487. test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
  488. test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
  489. test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
  490. test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
  491. test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
  492. test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
  493. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
  494. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
  495. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
  496. test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
  497. test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
  498. test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
  499. test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
  500. test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
  501. test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
  502. test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
  503. test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
  504. test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
  505. test_holado/tools/django/api_grpc/manage.py +27 -0
  506. test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
  507. test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
  508. test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
  509. test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
  510. test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
  511. test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
  512. test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
  513. test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
  514. test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
  515. test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
  516. test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
  517. test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
  518. test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
  519. test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
  520. test_holado/tools/django/api_rest/db.sqlite3 +0 -0
  521. test_holado/tools/django/api_rest/manage.py +22 -0
  522. holado-0.2.2.dist-info/RECORD +0 -17
  523. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/WHEEL +0 -0
  524. {holado-0.2.2.dist-info → holado-0.2.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,48 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.tools.comparators.comparator import Comparator
16
+ from holado_core.common.exceptions.functional_exception import FunctionalException
17
+ from holado_python.standard_library.typing import Typing
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class BytesComparator(Comparator):
23
+
24
+ def __init__(self, encoding_1=None, encoding_2=None):
25
+ super().__init__("bytes")
26
+
27
+ self.__encoding_1 = encoding_1
28
+ self.__encoding_2 = encoding_2
29
+
30
+ def _convert_input1(self, obj, name):
31
+ return self.__convert_input(obj, name, self.__encoding_1)
32
+
33
+ def _convert_input2(self, obj, name):
34
+ return self.__convert_input(obj, name, self.__encoding_2)
35
+
36
+ def __convert_input(self, obj, name, encoding):
37
+ if isinstance(obj, str):
38
+ if encoding is not None:
39
+ res = obj.encode(encoding=encoding)
40
+ else:
41
+ res = obj.encode()
42
+ else:
43
+ res = obj
44
+
45
+ if not isinstance(res, bytes):
46
+ raise FunctionalException(f"{name.capitalize()} value is not a bytes: [{res}] (type: {Typing.get_object_class_fullname(res)})")
47
+ return res
48
+
@@ -0,0 +1,74 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.tools.comparators.comparator import Comparator
16
+ from holado_core.common.exceptions.functional_exception import FunctionalException
17
+ from datetime import datetime, timezone
18
+ from holado_python.common.tools.datetime import DateTime
19
+ from holado_core.common.handlers.features.resource_by_type import FeatureObjectAndClassResourceByType
20
+ from holado_python.standard_library.typing import Typing
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+
26
+ class DatetimeComparator(Comparator, FeatureObjectAndClassResourceByType):
27
+
28
+ def __init__(self):
29
+ Comparator.__init__(self, "datetime")
30
+ FeatureObjectAndClassResourceByType.__init__(self)
31
+
32
+ # Define resource description
33
+
34
+ @classmethod
35
+ def _get_class_resource_description(cls, plural=False):
36
+ if plural:
37
+ return 'class datetime converters'
38
+ else:
39
+ return 'class datetime converter'
40
+
41
+ def _get_resource_description(self, plural=False):
42
+ if plural:
43
+ return 'datetime converters'
44
+ else:
45
+ return 'datetime converter'
46
+
47
+
48
+ # Define how to convert imputs before compare
49
+
50
+ def _convert_input(self, obj, name):
51
+ convert_func = self.get_resource_for_type(obj=obj, raise_if_not_found=False)
52
+ if convert_func:
53
+ res = convert_func(obj)
54
+ else:
55
+ res = obj
56
+
57
+ if not isinstance(res, datetime):
58
+ raise FunctionalException(f"{name.capitalize()} value is not a datetime: [{res}] (type: {Typing.get_object_class_fullname(res)})")
59
+ if res.tzinfo is None:
60
+ res = res.replace(tzinfo=timezone.utc)
61
+ return res
62
+
63
+
64
+ # Register default datetime converters
65
+
66
+ DatetimeComparator.register_resource_for_type_in_class('str', None,
67
+ lambda o: isinstance(o, str) and DateTime.is_str_datetime(o),
68
+ DateTime.str_2_datetime)
69
+
70
+ DatetimeComparator.register_resource_for_type_in_class('int or float', None,
71
+ lambda o: isinstance(o, int) or isinstance(o, float),
72
+ DateTime.timestamp_to_datetime)
73
+
74
+
@@ -0,0 +1,97 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.tools.comparators.comparator import Comparator,\
16
+ CompareOperator
17
+ from holado_core.common.exceptions.functional_exception import FunctionalException
18
+ from holado_core.common.exceptions.technical_exception import TechnicalException
19
+ from holado_core.common.tools.converters.converter import Converter
20
+ from holado_python.standard_library.typing import Typing
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class FloatComparator(Comparator):
26
+
27
+ def __init__(self, diff_precision=None, relative_precision=1e-15):
28
+ """
29
+ Define the comparing method and its associated precision.
30
+ If difference precision is defined, difference comparison is applied, else relative comparison is applied.
31
+ By default, a relative comparison is used with a precision of 1e-15
32
+
33
+ Notes:
34
+ 1. Usually, python implement float type with 52 digits for significant digits, which is a precision of 2**-52=2.220446049250313e-16.
35
+ The default relative precision is 1e-15, a little bit over this limit precision, in order to manage small computational errors.
36
+ In many cases, this precision is too small ; if you don't know which precision to use, a relative precision of 1e-9 is quite usual.
37
+ 2. For the same reason, the appropriate difference precision is dependent on the values compared and the number of comparable significant digits.
38
+ If you are not sure, prefer the relative comparison.
39
+ :param diff_precision: If defined, a difference comparison is done with this precision
40
+ :param relative_precision: If defined, a relative comparison is done with this precision
41
+ """
42
+ super().__init__("float")
43
+
44
+ self.__diff_precision = diff_precision
45
+ self.__relative_precision = relative_precision
46
+
47
+ if self.__diff_precision is not None:
48
+ self.__relative_precision = None
49
+ if self.__diff_precision is None and self.__relative_precision is None:
50
+ raise TechnicalException("A precision must be defined")
51
+
52
+ def _convert_input(self, obj, name):
53
+ if Converter.is_float(obj):
54
+ res = float(obj)
55
+ else:
56
+ res = obj
57
+
58
+ if not isinstance(res, float):
59
+ raise FunctionalException(f"{name.capitalize()} value is not a float: [{res}] (type: {Typing.get_object_class_fullname(res)})")
60
+ return res
61
+
62
+ def _compare_result(self, obj_1, operator: CompareOperator, obj_2):
63
+ if operator == CompareOperator.Different:
64
+ return not self.__almost_equals(obj_1, obj_2)
65
+ elif operator == CompareOperator.Equal:
66
+ return self.__almost_equals(obj_1, obj_2)
67
+ elif operator == CompareOperator.Inferior:
68
+ return (obj_1 < obj_2)
69
+ elif operator == CompareOperator.InferiorOrEqual:
70
+ return (obj_1 < obj_2) or self.__almost_equals(obj_1, obj_2)
71
+ elif operator == CompareOperator.Superior:
72
+ return (obj_1 > obj_2)
73
+ elif operator == CompareOperator.SuperiorOrEqual:
74
+ return (obj_1 > obj_2) or self.__almost_equals(obj_1, obj_2)
75
+ else:
76
+ raise TechnicalException(f"Unmanaged compare operator {operator}")
77
+
78
+ def __almost_equals(self, val_1, val_2):
79
+ if self.__relative_precision is not None:
80
+ return self.__almost_equals_relative(val_1, val_2)
81
+ else:
82
+ return self.__almost_equals_diff(val_1, val_2)
83
+
84
+ def __almost_equals_diff(self, val_1, val_2):
85
+ diff = abs(val_1 - val_2)
86
+ return (diff < self.__diff_precision)
87
+
88
+ def __almost_equals_relative(self, val_1, val_2):
89
+ diff = abs(val_1 - val_2)
90
+ vmax = max(abs(val_1), abs(val_2))
91
+ if vmax > 0:
92
+ return (diff < vmax * self.__relative_precision)
93
+ else:
94
+ return True
95
+
96
+
97
+
@@ -0,0 +1,37 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.tools.comparators.comparator import Comparator
16
+ from holado_core.common.exceptions.functional_exception import FunctionalException
17
+ from holado_core.common.tools.converters.converter import Converter
18
+ from holado_python.standard_library.typing import Typing
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class IntegerComparator(Comparator):
24
+
25
+ def __init__(self):
26
+ super().__init__("integer")
27
+
28
+ def _convert_input(self, obj, name):
29
+ if Converter.is_integer(obj):
30
+ res = int(obj)
31
+ else:
32
+ res = obj
33
+
34
+ if not isinstance(res, int):
35
+ raise FunctionalException(f"{name.capitalize()} value is not an integer: [{res}] (type: {Typing.get_object_class_fullname(res)})")
36
+ return res
37
+
@@ -0,0 +1,99 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.tools.comparators.comparator import Comparator,\
16
+ CompareOperator
17
+ from holado_core.common.tools.tools import Tools
18
+ from holado.common.context.session_context import SessionContext
19
+ from holado_core.common.exceptions.verify_exception import VerifyException
20
+ from holado_python.standard_library.typing import Typing
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class StringComparator(Comparator):
26
+
27
+ def __init__(self, text_interpreter=None, text_verifier=None):
28
+ super().__init__("string")
29
+ self.__text_interpreter = text_interpreter
30
+ self.__text_verifier = text_verifier
31
+
32
+ def __get_text_interpreter(self):
33
+ if self.__text_interpreter is not None:
34
+ return self.__text_interpreter
35
+ elif SessionContext.instance().has_scenario_context():
36
+ return SessionContext.instance().get_scenario_context().get_text_interpreter()
37
+ else:
38
+ return SessionContext.instance().text_interpreter
39
+
40
+ def __get_text_verifier(self):
41
+ if self.__text_verifier is not None:
42
+ return self.__text_verifier
43
+ elif SessionContext.instance().has_scenario_context():
44
+ return SessionContext.instance().get_scenario_context().get_text_verifier()
45
+ else:
46
+ return SessionContext.instance().text_verifier
47
+
48
+ def _compare_by_operator(self, obj_1, operator: CompareOperator, obj_2, is_obtained_vs_expected = True, raise_exception = True, redirect_to_equals=True):
49
+ if operator == CompareOperator.Equal:
50
+ return self.__verify_by_text_interpreter(obj_1, obj_2, is_obtained_vs_expected, raise_exception)
51
+ else:
52
+ i_obj_1 = self.__get_text_interpreter().interpret(obj_1)
53
+ i_obj_2 = self.__get_text_interpreter().interpret(obj_2)
54
+ super()._compare_by_operator(i_obj_1, operator, i_obj_2, is_obtained_vs_expected, raise_exception, redirect_to_equals=redirect_to_equals)
55
+
56
+ def _convert_input(self, obj, name):
57
+ if isinstance(obj, str):
58
+ res = obj
59
+ else:
60
+ res = str(obj)
61
+ return res
62
+
63
+ def __verify_by_text_interpreter(self, str_1, str_2, is_obtained_vs_expected = True, raise_exception = True):
64
+ """
65
+ Compare by equality.
66
+ Switch is_obtained_vs_expected:
67
+ - True: value 1 is considered obtained ; value 2 is considered expected ; only expected value is interpreted
68
+ - False: value 1 is considered expected ; value 2 is considered obtained ; only expected value is interpreted
69
+ - None: value 1 is compared to value 2 ; both values are interpreted
70
+ """
71
+ if not isinstance(str_1, str):
72
+ if raise_exception:
73
+ raise VerifyException(f"{self._get_name_1(is_obtained_vs_expected).capitalize()} value is not a string: [{str_1}] (type: {Typing.get_object_class_fullname(str_1)})")
74
+ else:
75
+ if Tools.do_log(logger, logging.DEBUG):
76
+ logger.debug(f"Compare result is false since {self._get_name_1(is_obtained_vs_expected)} value is not a string: [{str_1}] (type: {Typing.get_object_class_fullname(str_1)})")
77
+ return False
78
+ if not isinstance(str_2, str):
79
+ if raise_exception:
80
+ raise VerifyException(f"{self._get_name_2(is_obtained_vs_expected).capitalize()} value is not a string: [{str_2}] (type: {Typing.get_object_class_fullname(str_2)})")
81
+ else:
82
+ if Tools.do_log(logger, logging.DEBUG):
83
+ logger.debug(f"Compare result is false since {self._get_name_2(is_obtained_vs_expected)} value is not a string: [{str_2}] (type: {Typing.get_object_class_fullname(str_2)})")
84
+ return False
85
+
86
+ if is_obtained_vs_expected is None:
87
+ # Interpret obtained as TextInterpreter.verify won't do it on obtained parameter
88
+ str_1 = self.__get_text_interpreter().interpret(str_1)
89
+
90
+ if is_obtained_vs_expected == True or is_obtained_vs_expected is None:
91
+ res = self.__get_text_verifier().verify(str_1, str_2, raise_exception=raise_exception)
92
+ else:
93
+ res = self.__get_text_verifier().verify(str_2, str_1, raise_exception=raise_exception)
94
+
95
+ if Tools.do_log(logger, logging.DEBUG):
96
+ logger.debug("[{}] str_1 equals str_2 => {}\n str_1 = [{}]\n str_2 = [{}]".format(Typing.get_object_class(self).__name__, res, str_1, str_2))
97
+ return res
98
+
99
+
@@ -0,0 +1,31 @@
1
+
2
+ #################################################
3
+ # HolAdo (Holistic Automation do)
4
+ #
5
+ # (C) Copyright 2021-2025 by Eric Klumpp
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+ #
9
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12
+ #################################################
13
+
14
+ import logging
15
+ from holado_core.common.tools.comparators.comparator import Comparator
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ class TypeComparator(Comparator):
21
+
22
+ def __init__(self):
23
+ super().__init__("type")
24
+
25
+ def _convert_input(self, obj, name):
26
+ if isinstance(obj, type):
27
+ res = obj
28
+ else:
29
+ res = type(obj)
30
+ return res
31
+
@@ -0,0 +1,279 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ #################################################
4
+ # HolAdo (Holistic Automation do)
5
+ #
6
+ # (C) Copyright 2021-2025 by Eric Klumpp
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11
+
12
+ # The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
13
+ #################################################
14
+
15
+ import logging
16
+ import datetime
17
+ import dateutil.parser
18
+ import re
19
+ from holado_core.common.exceptions.functional_exception import FunctionalException
20
+ from holado_core.common.exceptions.technical_exception import TechnicalException
21
+ import os
22
+ from holado_core.common.tools.converters.converter import Converter
23
+ from enum import Enum
24
+ from holado_python.common.enums import ArithmeticOperator
25
+ from datetime import timedelta
26
+ from dateutil.relativedelta import relativedelta
27
+ import math
28
+ from decimal import Decimal
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ EPOCH_1970 = datetime.datetime(year=1970, month=1, day=1, tzinfo=datetime.timezone.utc)
34
+ EPOCH_JULIAN_CNES = datetime.datetime(year=1950, month=1, day=1, tzinfo=datetime.timezone.utc)
35
+ EPOCH_JULIAN_NASA = datetime.datetime(year=1968, month=5, day=24, tzinfo=datetime.timezone.utc)
36
+
37
+ FORMAT_DATETIME_ISO = '%Y-%m-%dT%H:%M:%S.%fZ'
38
+ FORMAT_DATETIME_HUMAN_SECOND = '%Y-%m-%d %H:%M:%S'
39
+
40
+
41
+ class DurationUnit(str, Enum):
42
+ # Nanosecond = "nanosecond"
43
+ Microsecond = "microsecond"
44
+ Millisecond = "millisecond"
45
+ Second = "second"
46
+ Minute = "minute"
47
+ Hour = "hour"
48
+ Day = "day"
49
+ Week = "week"
50
+ Month = "month"
51
+ Year = "year"
52
+
53
+
54
+
55
+ class DateTime(object):
56
+
57
+ __is_system_time_in_tai = None
58
+ __is_system_time_expected_in_tai = None
59
+ __utc_to_tai_timedelta = None
60
+
61
+ def __init__(self):
62
+ pass
63
+
64
+ @classmethod
65
+ def is_system_time_in_tai(cls):
66
+ """Return if system time is in TAI (International Atomic Time)"""
67
+ if cls.__is_system_time_in_tai is None:
68
+ cls.__is_system_time_in_tai = Converter.to_boolean(os.getenv("HOLADO_SYSTEM_TIME_IS_IN_TAI", False))
69
+ return cls.__is_system_time_in_tai
70
+
71
+ @classmethod
72
+ def now(cls):
73
+ return datetime.datetime.now()
74
+
75
+ @classmethod
76
+ def utcnow(cls):
77
+ if cls.is_system_time_in_tai():
78
+ return datetime.datetime.utcnow() - cls.utc_to_tai_timedelta()
79
+ else:
80
+ return datetime.datetime.utcnow()
81
+
82
+ @classmethod
83
+ def tainow(cls):
84
+ if cls.is_system_time_in_tai():
85
+ return datetime.datetime.utcnow()
86
+ else:
87
+ return datetime.datetime.utcnow() + cls.utc_to_tai_timedelta()
88
+
89
+ @classmethod
90
+ def utc_to_tai_timedelta(cls):
91
+ """Return the timedelta to add to an UTC datetime to obtain a TAI datetime.
92
+ Note: Currently, only years 2020-2029 are managed"""
93
+ if cls.__utc_to_tai_timedelta is None:
94
+ cls.__utc_to_tai_timedelta = datetime.timedelta(seconds=37)
95
+ return cls.__utc_to_tai_timedelta
96
+
97
+ @classmethod
98
+ def apply_delta_on_datetime(cls, date:datetime, operator:ArithmeticOperator, duration, duration_unit:DurationUnit) -> datetime:
99
+ args={duration_unit.value+'s':duration}
100
+ if duration_unit in [DurationUnit.Millisecond]:
101
+ delta = timedelta(**args)
102
+ else:
103
+ delta = relativedelta(**args)
104
+
105
+ if operator == ArithmeticOperator.Subtraction:
106
+ res = date - delta
107
+ elif operator == ArithmeticOperator.Addition:
108
+ res = date + delta
109
+ else:
110
+ raise TechnicalException(f"Unmanaged operator '{operator.value}'")
111
+
112
+ return res
113
+
114
+ ### Conversions to/from str
115
+
116
+ @classmethod
117
+ def is_str_datetime(cls, dt_str, dt_format=None):
118
+ """Return if a string is a datetime of given format"""
119
+ res = True
120
+ try:
121
+ DateTime.str_2_datetime(dt_str, dt_format)
122
+ except (dateutil.parser._parser.ParserError, ValueError):
123
+ res = False
124
+ return res
125
+
126
+ @classmethod
127
+ def str_2_datetime(cls, dt_str, dt_format=None):
128
+ """Convert string to datetime instance"""
129
+ res = None
130
+ if dt_format is None:
131
+ res = dateutil.parser.parse(dt_str)
132
+ else:
133
+ res = datetime.datetime.strptime(dt_str, dt_format)
134
+ # if res.tzinfo is None:
135
+ # res = res.replace(tzinfo=timezone.utc)
136
+ return res
137
+
138
+ @classmethod
139
+ def str_2_timedelta(cls, dur_str):
140
+ """Convert string to timedelta instance"""
141
+ res = None
142
+ dur_regex = re.compile(r"(\d+(?:\.\d*)?) (?:s|sec|seconds)")
143
+ r = dur_regex.match(dur_str)
144
+ if r:
145
+ res = datetime.timedelta(seconds=float(r.group(1)))
146
+ else:
147
+ raise FunctionalException(r"Duration string must match pattern '\d+(\.\d*)? (s|sec|seconds)'")
148
+ return res
149
+
150
+ @classmethod
151
+ def datetime_2_str(cls, dt_value, dt_format=None):
152
+ res = None
153
+ if dt_format is None:
154
+ res = datetime.datetime.isoformat(dt_value)
155
+ else:
156
+ res = dt_value.strftime(dt_format)
157
+ return res
158
+
159
+
160
+ ### Conversions to/from timestamp
161
+
162
+ @classmethod
163
+ def datetime_to_timestamp(cls, dt, epoch=None):
164
+ if epoch is not None and isinstance(epoch, str):
165
+ epoch = DateTime.str_2_datetime(epoch)
166
+ elif epoch is not None and not isinstance(epoch, datetime.datetime):
167
+ raise TechnicalException(f"Parameter 'epoch' should be a datetime or None")
168
+
169
+ if epoch is None:
170
+ return dt.timestamp()
171
+ else:
172
+ return (dt - epoch).total_seconds()
173
+
174
+ @classmethod
175
+ def timestamp_to_datetime(cls, ts, epoch=None):
176
+ """
177
+ Convert timestamp to UTC datetime
178
+ """
179
+ if epoch is not None and isinstance(epoch, str):
180
+ epoch = DateTime.str_2_datetime(epoch)
181
+ elif epoch is not None and not isinstance(epoch, datetime.datetime):
182
+ raise TechnicalException(f"Parameter 'epoch' should be a datetime or None")
183
+
184
+ res = datetime.datetime.utcfromtimestamp(ts)
185
+ if epoch is not None:
186
+ res = epoch + (res - EPOCH_1970)
187
+ return res
188
+
189
+
190
+ ### Conversions to/from (seconds, nanos)
191
+
192
+ @classmethod
193
+ def datetime_to_seconds_nanos(cls, dt, epoch=None):
194
+ ts = cls.datetime_to_timestamp(dt, epoch)
195
+ return cls.timestamp_to_seconds_nanos(ts)
196
+
197
+ @classmethod
198
+ def seconds_nanos_to_datetime(cls, seconds, nanos, epoch=None, round_func=round):
199
+ """
200
+ Convert timestamp to UTC datetime
201
+ @param round_func: defines the rounding method applied to microseconds (default: round ; possible methods: round, math.ceil, math.trunc)
202
+ """
203
+ ts = cls.seconds_nanos_to_timestamp(seconds, nanos, round_func=round_func)
204
+ return cls.timestamp_to_datetime(ts, epoch)
205
+
206
+ @classmethod
207
+ def timestamp_to_seconds_nanos(cls, ts):
208
+ return round(ts), round(ts * 1e6 % 1e6)
209
+
210
+ @classmethod
211
+ def seconds_nanos_to_timestamp(cls, seconds, nanos, cast_func=float, round_func=round):
212
+ """
213
+ Convert (seconds, nanos) to timestamp.
214
+ By default, it returns a timestamp as float with nanos rounded to microsecond precision.
215
+ To keep nanosecond precision, set cast_type=None and round_func=None, it will returns a timestamp as decimal.Decimal.
216
+ @param cast_func: Type of the returned value (default: float). The type can also be decimal.Decimal, usefull to keep nanosecond precision.
217
+ @param round_func: defines the rounding method applied to microseconds (default: round ; possible methods: round, math.ceil, math.trunc)
218
+ """
219
+ res_dec = Decimal(seconds) + Decimal(nanos) / Decimal(1e9)
220
+ if round_func is not None:
221
+ res_dec = round_func(res_dec * 1000000) / 1000000
222
+ if cast_func is not None:
223
+ return cast_func(res_dec)
224
+ else:
225
+ return res_dec
226
+
227
+
228
+ ### Conversions to/from Julian date
229
+
230
+ @classmethod
231
+ def datetime_to_julian_date(cls, dt, epoch=None):
232
+ if epoch is None:
233
+ return cls.datetime_to_julian_date(dt, epoch=EPOCH_JULIAN_CNES) + 2433282.5
234
+ else:
235
+ td = (dt - epoch)
236
+ return td.days + td.seconds / (3600 * 24)
237
+
238
+ @classmethod
239
+ def julian_date_to_datetime(cls, jd, epoch=None, precision_nb_digits=6):
240
+ """ Convert a Julian date to a datetime instance
241
+ @param precision_nb_digits Precision of the Julian date (default: 6 = microseconds)
242
+ """
243
+ if epoch is None:
244
+ return cls.julian_date_to_datetime(jd - 2433282.5, epoch=EPOCH_JULIAN_CNES)
245
+ else:
246
+ jd_decimal, jd_days = math.modf(jd)
247
+ jd_seconds = round(jd_decimal * 3600 * 24, precision_nb_digits)
248
+ td = datetime.timedelta(days=round(jd_days), seconds=jd_seconds)
249
+ return epoch + td
250
+
251
+ @classmethod
252
+ def datetime_utc_to_tai(cls, dt, dt_format=None):
253
+ """ Convert a datetime in UTC to a datetime in TAI
254
+ @param dt Datetime in UTC
255
+ @param dt_format Format to use if 'dt' is a string (can be None for format autodetection)
256
+ """
257
+ dt_src = dt
258
+ if isinstance(dt_src, str):
259
+ dt_src = cls.str_2_datetime(dt_src, dt_format)
260
+
261
+ return dt_src + DateTime.utc_to_tai_timedelta()
262
+
263
+ @classmethod
264
+ def datetime_tai_to_utc(cls, dt, dt_format=None):
265
+ """ Convert a datetime in TAI to a datetime in UTC
266
+ @param dt Datetime in TAI
267
+ @param dt_format Format to use if 'dt' is a string (can be None for format autodetection)
268
+ """
269
+ dt_src = dt
270
+ if isinstance(dt_src, str):
271
+ dt_src = cls.str_2_datetime(dt_src, dt_format)
272
+
273
+ return dt_src - DateTime.utc_to_tai_timedelta()
274
+
275
+
276
+
277
+
278
+
279
+