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,1174 @@
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
+
15
+ #################################################
16
+ #
17
+ # Patches are done to follow ITU recommendation:
18
+ # https://www.e-navigation.nl/sites/default/files/R-REC-M.1371-5-201402-I!!PDF-E_1.pdf
19
+ #
20
+ #################################################
21
+
22
+
23
+ import logging
24
+ from bitarray import bitarray
25
+ import attr
26
+ import typing
27
+ import pyais
28
+ from pyais.messages import Payload, bit_field, from_mmsi, NMEA_VALUE, CommunicationStateMixin, from_speed, to_speed,\
29
+ from_lat_lon, to_lat_lon, from_10th, to_10th, from_lat_lon_600, to_lat_lon_600,\
30
+ from_turn, to_turn, ANY_MESSAGE
31
+ from pyais.util import get_int, from_bytes_signed, from_bytes, bits2bytes, chunks, str_to_bin, bytes2bits
32
+ from pyais.exceptions import InvalidDataTypeException
33
+ from pyais.constants import NavigationStatus, EpfdType, ShipType, NavAid, StationType, TransmitMode, StationIntervals,\
34
+ TurnRate, ManeuverIndicator
35
+ import functools
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+
40
+
41
+ ### Fix conversion of message types to/from bitarray
42
+
43
+ # All @ at end of string are considered padding.
44
+ # Note: in pyais implementation, decode is stopped at first @, which can be a regular field information, and following regular characters are skipped.
45
+ def HA_decode_bin_as_ascii6(bit_arr: bitarray) -> str:
46
+ """
47
+ Decode binary data as 6 bit ASCII.
48
+ :param bit_arr: array of bits
49
+ :return: ASCII String
50
+ """
51
+ string: str = ""
52
+ c: bitarray
53
+ for c in chunks(bit_arr, 6): # type:ignore
54
+ n: int = from_bytes(c.tobytes()) >> 2
55
+
56
+ # Last entry may not have 6 bits
57
+ if len(c) != 6:
58
+ n >> (6 - len(c))
59
+
60
+ if n < 0x20:
61
+ n += 0x40
62
+
63
+ string += chr(n)
64
+
65
+ # Remove all @ at end since they correspond to padding
66
+ string = string.rstrip('@')
67
+
68
+ # Remove spaces as some encoders make padding with spaces instead of @
69
+ return string.strip()
70
+
71
+ pyais.util.decode_bin_as_ascii6 = HA_decode_bin_as_ascii6
72
+
73
+
74
+ def HA_int_to_bin(val: typing.Union[int, bool], width: int, signed: bool = True) -> bitarray:
75
+ """
76
+ Convert an integer or boolean value to binary.
77
+ Compared to pyais implementation, the behaviour is changed if the value is too great to fit into
78
+ `width` bits:
79
+ - in pyais, the maximum possible number that still fits is used,
80
+ - in this implementation, a ValueError is raised.
81
+
82
+ @param val: Any integer or boolean value.
83
+ @param width: The bit width. If less than width bits are required, leading zeros are added.
84
+ @param signed: Set to True/False if the value is signed or not.
85
+ @return: The binary representation of value with exactly width bits. Type is bitarray.
86
+ """
87
+ # Compute the total number of bytes required to hold up to `width` bits.
88
+ n_bytes, mod = divmod(width, 8)
89
+ if mod > 0:
90
+ n_bytes += 1
91
+
92
+ # If the value is too big, return a bitarray of all 1's
93
+ mask = (1 << width) - 1
94
+ if val > mask:
95
+ raise ValueError(f"Value {val} is too big for bit width {width} (max possible value: {mask})")
96
+
97
+ bits = bitarray(endian='big')
98
+ bits.frombytes(val.to_bytes(n_bytes, 'big', signed=signed))
99
+ return bits[8 - mod if mod else 0:]
100
+
101
+ pyais.util.int_to_bin = HA_int_to_bin
102
+ pyais.messages.int_to_bin = HA_int_to_bin
103
+
104
+
105
+ @attr.s(slots=True)
106
+ class HAPayload(Payload):
107
+ """Payload class with fix in to/from bitarray conversion.
108
+ """
109
+
110
+ @classmethod
111
+ def from_bitarray(cls, bit_arr: bitarray) -> "ANY_MESSAGE":
112
+ cur: int = 0
113
+ end: int = 0
114
+ length: int = len(bit_arr)
115
+ kwargs: typing.Dict[str, typing.Any] = {}
116
+
117
+ # Manage field with a variable length
118
+ index_variable_length_field: int = None
119
+ cursor_variable_length_field_beg: int = None
120
+ cursor_variable_length_field_end: int = None
121
+
122
+ # Iterate over the bits until a variable length field or the last bit of the bitarray or all fields are fully decoded
123
+ for field_index, field in enumerate(cls.fields()):
124
+ # Stop if field has a variable length
125
+ if field.metadata['variable_length']:
126
+ index_variable_length_field = field_index
127
+ cursor_variable_length_field_beg = cur
128
+ break
129
+
130
+ if end >= length:
131
+ # All fields that did not fit into the bit array are None
132
+ kwargs[field.name] = None
133
+ continue
134
+
135
+ width = field.metadata['width']
136
+ end = min(length, cur + width)
137
+ bits = bit_arr[cur: end]
138
+
139
+ kwargs[field.name] = cls._bitarray_to_field_type(bits, field)
140
+ cur = end
141
+
142
+ if index_variable_length_field is not None:
143
+ # Iterate over fields in reverse order until variable length field
144
+ end = length
145
+ cur = length
146
+
147
+ last_fields = tuple(cls.fields())[index_variable_length_field+1:]
148
+ for field in reversed(last_fields):
149
+ if end <= cursor_variable_length_field_beg:
150
+ # All fields that did not fit into the bit array are None
151
+ kwargs[field.name] = None
152
+ continue
153
+
154
+ width = field.metadata['width']
155
+ cur = max(cursor_variable_length_field_beg, end - width)
156
+ bits = bit_arr[cur: end]
157
+
158
+ kwargs[field.name] = cls._bitarray_to_field_type(bits, field)
159
+ end = cur
160
+
161
+ # Add variable length field
162
+ cursor_variable_length_field_end = end
163
+ field = cls.fields()[index_variable_length_field]
164
+ bits = bit_arr[cursor_variable_length_field_beg: cursor_variable_length_field_end]
165
+ kwargs[field.name] = cls._bitarray_to_field_type(bits, field)
166
+
167
+ return cls(**kwargs) # type:ignore
168
+
169
+ @classmethod
170
+ def _bitarray_to_field_type(cls, bits, field) -> typing.Any:
171
+ val: typing.Any
172
+ d_type = field.metadata['d_type']
173
+ converter = field.metadata['to_converter']
174
+
175
+ # Get the correct data type and decoding function
176
+ if d_type == int or d_type == bool or d_type == float:
177
+ shift = (8 - (len(bits) % 8)) % 8
178
+ if field.metadata['signed']:
179
+ val = from_bytes_signed(bits) >> shift
180
+ else:
181
+ val = from_bytes(bits) >> shift
182
+
183
+ if d_type == float:
184
+ val = float(val)
185
+ elif d_type == bool:
186
+ val = bool(val)
187
+
188
+ elif d_type == str:
189
+ val = HA_decode_bin_as_ascii6(bits)
190
+ elif d_type == bytes:
191
+ val = bits2bytes(bits)
192
+ else:
193
+ raise InvalidDataTypeException(d_type)
194
+
195
+ val = converter(val) if converter is not None else val
196
+
197
+ return val
198
+
199
+ def to_bitarray(self) -> bitarray:
200
+ """
201
+ Convert all attributes of a given Payload/Message to binary.
202
+ """
203
+ out = bitarray()
204
+ for field in self.fields():
205
+ width = field.metadata['width']
206
+ d_type = field.metadata['d_type']
207
+ converter = field.metadata['from_converter']
208
+ signed = field.metadata['signed']
209
+ variable_length = field.metadata['variable_length']
210
+
211
+ val = getattr(self, field.name)
212
+ if val is None:
213
+ continue
214
+
215
+ val = converter(val) if converter is not None else val
216
+
217
+ try:
218
+ if d_type in (bool, int):
219
+ bits = HA_int_to_bin(val, width, signed=signed)
220
+ elif d_type == float:
221
+ val = int(val)
222
+ bits = HA_int_to_bin(val, width, signed=signed)
223
+ elif d_type == str:
224
+ trailing_spaces = not variable_length
225
+ bits = str_to_bin(val, width, trailing_spaces=trailing_spaces)
226
+ elif d_type == bytes:
227
+ bits = bytes2bits(val, default=bitarray('0' * width))
228
+ else:
229
+ raise InvalidDataTypeException(d_type)
230
+ except ValueError as exc:
231
+ raise ValueError(f"Invalid value for field '{field.name}': {exc}") from None
232
+
233
+ bits = bits[:width]
234
+ out += bits
235
+
236
+ return out
237
+
238
+
239
+ # Fix message types:
240
+ # - Use fixes of Payload implemented in HAPayload, in all message types
241
+ # - type 21: exclude full_name property from asdict result
242
+ # - type 26: fix create and from_bitarray methods
243
+
244
+ @attr.s(slots=True)
245
+ class HAMessageType1(HAPayload, CommunicationStateMixin):
246
+ """
247
+ AIS Vessel position report using SOTDMA (Self-Organizing Time Division Multiple Access)
248
+ """
249
+ msg_type = bit_field(6, int, default=1, signed=False)
250
+ repeat = bit_field(2, int, default=0, signed=False)
251
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
252
+ status = bit_field(4, int, default=0, converter=NavigationStatus.from_value, signed=False)
253
+ turn = bit_field(8, float, default=TurnRate.NO_TI_DEFAULT, signed=True, to_converter=to_turn, from_converter=from_turn)
254
+ speed = bit_field(10, float, from_converter=from_speed, to_converter=to_speed, default=0, signed=False)
255
+ accuracy = bit_field(1, bool, default=0, signed=False)
256
+ lon = bit_field(28, float, from_converter=from_lat_lon, to_converter=to_lat_lon, default=0, signed=True)
257
+ lat = bit_field(27, float, from_converter=from_lat_lon, to_converter=to_lat_lon, default=0, signed=True)
258
+ course = bit_field(12, float, from_converter=from_10th, to_converter=to_10th, default=0, signed=False)
259
+ heading = bit_field(9, int, default=0, signed=False)
260
+ second = bit_field(6, int, default=0, signed=False)
261
+ maneuver = bit_field(2, int, default=0, from_converter=ManeuverIndicator.from_value,
262
+ to_converter=ManeuverIndicator.from_value, signed=False)
263
+ spare_1 = bit_field(3, bytes, default=b'', is_spare=True)
264
+ raim = bit_field(1, bool, default=0)
265
+ radio = bit_field(19, int, default=0, signed=False)
266
+
267
+ pyais.messages.MessageType1 = HAMessageType1
268
+ pyais.messages.MSG_CLASS[1] = pyais.messages.MessageType1
269
+
270
+
271
+ class HAMessageType2(HAMessageType1):
272
+ """
273
+ AIS Vessel position report using SOTDMA (Self-Organizing Time Division Multiple Access)
274
+ """
275
+ msg_type = bit_field(6, int, default=2)
276
+
277
+ pyais.messages.MessageType2 = HAMessageType2
278
+ pyais.messages.MSG_CLASS[2] = pyais.messages.MessageType2
279
+
280
+
281
+ class HAMessageType3(HAMessageType1):
282
+ """
283
+ AIS Vessel position report using ITDMA (Incremental Time Division Multiple Access)
284
+ """
285
+ msg_type = bit_field(6, int, default=3)
286
+
287
+ pyais.messages.MessageType3 = HAMessageType3
288
+ pyais.messages.MSG_CLASS[3] = pyais.messages.MessageType3
289
+
290
+
291
+ @attr.s(slots=True)
292
+ class HAMessageType4(HAPayload, CommunicationStateMixin):
293
+ """
294
+ AIS Vessel position report using SOTDMA (Self-Organizing Time Division Multiple Access)
295
+ """
296
+ msg_type = bit_field(6, int, default=4, signed=False)
297
+ repeat = bit_field(2, int, default=0, signed=False)
298
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
299
+ year = bit_field(14, int, default=1970, signed=False)
300
+ month = bit_field(4, int, default=1, signed=False)
301
+ day = bit_field(5, int, default=1, signed=False)
302
+ hour = bit_field(5, int, default=0, signed=False)
303
+ minute = bit_field(6, int, default=0, signed=False)
304
+ second = bit_field(6, int, default=0, signed=False)
305
+ accuracy = bit_field(1, bool, default=0, signed=False)
306
+ lon = bit_field(28, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
307
+ lat = bit_field(27, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
308
+ epfd = bit_field(4, int, default=0, from_converter=EpfdType.from_value, to_converter=EpfdType.from_value,
309
+ signed=False)
310
+ spare_1 = bit_field(10, bytes, default=b'', is_spare=True)
311
+ raim = bit_field(1, bool, default=0)
312
+ radio = bit_field(19, int, default=0, signed=False)
313
+
314
+ pyais.messages.MessageType4 = HAMessageType4
315
+ pyais.messages.MSG_CLASS[4] = pyais.messages.MessageType4
316
+
317
+
318
+ @attr.s(slots=True)
319
+ class HAMessageType5(HAPayload):
320
+ """
321
+ Static and Voyage Related Data
322
+ """
323
+ msg_type = bit_field(6, int, default=5, signed=False)
324
+ repeat = bit_field(2, int, default=0, signed=False)
325
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
326
+ ais_version = bit_field(2, int, default=0, signed=False)
327
+ imo = bit_field(30, int, default=0, signed=False)
328
+ callsign = bit_field(42, str, default='')
329
+ shipname = bit_field(120, str, default='')
330
+ ship_type = bit_field(8, int, default=0, from_converter=ShipType.from_value, to_converter=ShipType.from_value)
331
+ to_bow = bit_field(9, int, default=0, signed=False)
332
+ to_stern = bit_field(9, int, default=0, signed=False)
333
+ to_port = bit_field(6, int, default=0, signed=False)
334
+ to_starboard = bit_field(6, int, default=0, signed=False)
335
+ epfd = bit_field(4, int, default=0, from_converter=EpfdType.from_value, to_converter=EpfdType.from_value)
336
+ month = bit_field(4, int, default=0, signed=False)
337
+ day = bit_field(5, int, default=0, signed=False)
338
+ hour = bit_field(5, int, default=0, signed=False)
339
+ minute = bit_field(6, int, default=0, signed=False)
340
+ draught = bit_field(8, float, from_converter=from_10th, to_converter=to_10th, default=0, signed=False)
341
+ destination = bit_field(120, str, default='')
342
+ dte = bit_field(1, bool, default=0, signed=False)
343
+ spare_1 = bit_field(1, bytes, default=b'', is_spare=True)
344
+
345
+ pyais.messages.MessageType5 = HAMessageType5
346
+ pyais.messages.MSG_CLASS[5] = pyais.messages.MessageType5
347
+
348
+
349
+ @attr.s(slots=True)
350
+ class HAMessageType6(HAPayload):
351
+ """
352
+ Binary Addresses Message
353
+ """
354
+ msg_type = bit_field(6, int, default=6)
355
+ repeat = bit_field(2, int, default=0, signed=False)
356
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
357
+ seqno = bit_field(2, int, default=0, signed=False)
358
+ dest_mmsi = bit_field(30, int, from_converter=from_mmsi)
359
+ retransmit = bit_field(1, bool, default=False, signed=False)
360
+ spare_1 = bit_field(1, bytes, default=b'', is_spare=True)
361
+ dac = bit_field(10, int, default=0, signed=False)
362
+ fid = bit_field(6, int, default=0, signed=False)
363
+ data = bit_field(920, bytes, default=b'', variable_length=True)
364
+
365
+ pyais.messages.MessageType6 = HAMessageType6
366
+ pyais.messages.MSG_CLASS[6] = pyais.messages.MessageType6
367
+
368
+
369
+ @attr.s(slots=True)
370
+ class HAMessageType7(HAPayload):
371
+ """
372
+ Binary Acknowledge
373
+ """
374
+ msg_type = bit_field(6, int, default=7, signed=False)
375
+ repeat = bit_field(2, int, default=0, signed=False)
376
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
377
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
378
+ mmsi1 = bit_field(30, int, default=0, from_converter=from_mmsi)
379
+ mmsiseq1 = bit_field(2, int, default=0, signed=False)
380
+ mmsi2 = bit_field(30, int, default=0, from_converter=from_mmsi)
381
+ mmsiseq2 = bit_field(2, int, default=0, signed=False)
382
+ mmsi3 = bit_field(30, int, default=0, from_converter=from_mmsi)
383
+ mmsiseq3 = bit_field(2, int, default=0, signed=False)
384
+ mmsi4 = bit_field(30, int, default=0, from_converter=from_mmsi)
385
+ mmsiseq4 = bit_field(2, int, default=0, signed=False)
386
+
387
+ pyais.messages.MessageType7 = HAMessageType7
388
+ pyais.messages.MSG_CLASS[7] = pyais.messages.MessageType7
389
+
390
+
391
+ @attr.s(slots=True)
392
+ class HAMessageType8(HAPayload):
393
+ """
394
+ Binary Acknowledge
395
+ """
396
+ msg_type = bit_field(6, int, default=8, signed=False)
397
+ repeat = bit_field(2, int, default=0, signed=False)
398
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
399
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
400
+ dac = bit_field(10, int, default=0, signed=False)
401
+ fid = bit_field(6, int, default=0, signed=False)
402
+ data = bit_field(952, bytes, default=b'', variable_length=True)
403
+
404
+ pyais.messages.MessageType8 = HAMessageType8
405
+ pyais.messages.MSG_CLASS[8] = pyais.messages.MessageType8
406
+
407
+
408
+ @attr.s(slots=True)
409
+ class HAMessageType9(HAPayload, CommunicationStateMixin):
410
+ """
411
+ Standard SAR Aircraft Position Report
412
+ """
413
+ msg_type = bit_field(6, int, default=9, signed=False)
414
+ repeat = bit_field(2, int, default=0, signed=False)
415
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
416
+
417
+ alt = bit_field(12, int, default=0, signed=False)
418
+ # speed over ground is in knots, not deciknots
419
+ speed = bit_field(10, float, default=0, signed=False)
420
+ accuracy = bit_field(1, bool, default=0, signed=False)
421
+ lon = bit_field(28, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
422
+ lat = bit_field(27, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
423
+ course = bit_field(12, float, from_converter=from_10th, to_converter=to_10th, default=0, signed=False)
424
+ second = bit_field(6, int, default=0, signed=False)
425
+
426
+ reserved_1 = bit_field(8, int, default=0)
427
+ dte = bit_field(1, bool, default=0)
428
+ spare_1 = bit_field(3, bytes, default=b'', is_spare=True)
429
+ assigned = bit_field(1, bool, default=0)
430
+ raim = bit_field(1, bool, default=0)
431
+ radio = bit_field(20, int, default=0, signed=False)
432
+
433
+ pyais.messages.MessageType9 = HAMessageType9
434
+ pyais.messages.MSG_CLASS[9] = pyais.messages.MessageType9
435
+
436
+
437
+ @attr.s(slots=True)
438
+ class HAMessageType10(HAPayload):
439
+ """
440
+ UTC/Date Inquiry
441
+ """
442
+ msg_type = bit_field(6, int, default=10, signed=False)
443
+ repeat = bit_field(2, int, default=0, signed=False)
444
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
445
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
446
+ dest_mmsi = bit_field(30, int, from_converter=from_mmsi)
447
+ spare_2 = bit_field(2, bytes, default=b'', is_spare=True)
448
+
449
+ pyais.messages.MessageType10 = HAMessageType10
450
+ pyais.messages.MSG_CLASS[10] = pyais.messages.MessageType10
451
+
452
+
453
+ class HAMessageType11(HAMessageType4):
454
+ """
455
+ UTC/Date Response
456
+ """
457
+ msg_type = bit_field(6, int, default=11, signed=False)
458
+
459
+ pyais.messages.MessageType11 = HAMessageType11
460
+ pyais.messages.MSG_CLASS[11] = pyais.messages.MessageType11
461
+
462
+
463
+ @attr.s(slots=True)
464
+ class HAMessageType12(HAPayload):
465
+ """
466
+ Addressed Safety-Related Message
467
+ """
468
+ msg_type = bit_field(6, int, default=12, signed=False)
469
+ repeat = bit_field(2, int, default=0, signed=False)
470
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
471
+ seqno = bit_field(2, int, default=0, signed=False)
472
+ dest_mmsi = bit_field(30, int, from_converter=from_mmsi)
473
+ retransmit = bit_field(1, bool, default=False, signed=False)
474
+ spare_1 = bit_field(1, bytes, default=b'', is_spare=True)
475
+ text = bit_field(936, str, default='', variable_length=True)
476
+
477
+ pyais.messages.MessageType12 = HAMessageType12
478
+ pyais.messages.MSG_CLASS[12] = pyais.messages.MessageType12
479
+
480
+
481
+ class HAMessageType13(HAMessageType7):
482
+ """
483
+ Identical to type 7
484
+ """
485
+ msg_type = bit_field(6, int, default=13, signed=False)
486
+
487
+ pyais.messages.MessageType13 = HAMessageType13
488
+ pyais.messages.MSG_CLASS[13] = pyais.messages.MessageType13
489
+
490
+
491
+ @attr.s(slots=True)
492
+ class HAMessageType14(HAPayload):
493
+ """
494
+ Safety-Related Broadcast Message
495
+ """
496
+ msg_type = bit_field(6, int, default=14, signed=False)
497
+ repeat = bit_field(2, int, default=0, signed=False)
498
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
499
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
500
+ text = bit_field(968, str, default='', variable_length=True)
501
+
502
+ pyais.messages.MessageType14 = HAMessageType14
503
+ pyais.messages.MSG_CLASS[14] = pyais.messages.MessageType14
504
+
505
+
506
+ @attr.s(slots=True)
507
+ class HAMessageType15(HAPayload):
508
+ """
509
+ Interrogation
510
+ """
511
+ msg_type = bit_field(6, int, default=15, signed=False)
512
+ repeat = bit_field(2, int, default=0, signed=False)
513
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
514
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
515
+ mmsi1 = bit_field(30, int, default=0, from_converter=from_mmsi)
516
+ type1_1 = bit_field(6, int, default=0, signed=False)
517
+ offset1_1 = bit_field(12, int, default=0, signed=False)
518
+ spare_2 = bit_field(2, bytes, default=b'', is_spare=True)
519
+ type1_2 = bit_field(6, int, default=0, signed=False)
520
+ offset1_2 = bit_field(12, int, default=0, signed=False)
521
+ spare_3 = bit_field(2, bytes, default=b'', is_spare=True)
522
+ mmsi2 = bit_field(30, int, default=0, from_converter=from_mmsi)
523
+ type2_1 = bit_field(6, int, default=0, signed=False)
524
+ offset2_1 = bit_field(12, int, default=0, signed=False)
525
+ spare_4 = bit_field(2, bytes, default=b'', is_spare=True)
526
+
527
+ pyais.messages.MessageType15 = HAMessageType15
528
+ pyais.messages.MSG_CLASS[15] = pyais.messages.MessageType15
529
+
530
+
531
+ @attr.s(slots=True)
532
+ class HAMessageType16DestinationA(HAPayload):
533
+ """
534
+ Assignment Mode Command
535
+ """
536
+ msg_type = bit_field(6, int, default=16, signed=False)
537
+ repeat = bit_field(2, int, default=0, signed=False)
538
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
539
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
540
+
541
+ mmsi1 = bit_field(30, int, default=0, from_converter=from_mmsi)
542
+ offset1 = bit_field(12, int, default=0, signed=False)
543
+ increment1 = bit_field(10, int, default=0, signed=False)
544
+ spare_2 = bit_field(4, bytes, default=b'', is_spare=True)
545
+
546
+ pyais.messages.MessageType16DestinationA = HAMessageType16DestinationA
547
+
548
+
549
+ @attr.s(slots=True)
550
+ class HAMessageType16DestinationAB(HAPayload):
551
+ """
552
+ Assignment Mode Command
553
+ """
554
+ msg_type = bit_field(6, int, default=16, signed=False)
555
+ repeat = bit_field(2, int, default=0, signed=False)
556
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
557
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
558
+
559
+ mmsi1 = bit_field(30, int, default=0, from_converter=from_mmsi)
560
+ offset1 = bit_field(12, int, default=0, signed=False)
561
+ increment1 = bit_field(10, int, default=0, signed=False)
562
+
563
+ mmsi2 = bit_field(30, int, default=0, from_converter=from_mmsi)
564
+ offset2 = bit_field(12, int, default=0, signed=False)
565
+ increment2 = bit_field(10, int, default=0, signed=False)
566
+
567
+ pyais.messages.MessageType16DestinationAB = HAMessageType16DestinationAB
568
+
569
+
570
+ @attr.s(slots=True)
571
+ class HAMessageType16(HAPayload):
572
+ @classmethod
573
+ def create(cls, **kwargs: typing.Union[str, float, int, bool, bytes]) -> "ANY_MESSAGE":
574
+ if 'mmsi2' in kwargs:
575
+ return HAMessageType16DestinationAB.create(**kwargs)
576
+ else:
577
+ return HAMessageType16DestinationA.create(**kwargs)
578
+
579
+ @classmethod
580
+ def from_bitarray(cls, bit_arr: bitarray) -> "ANY_MESSAGE":
581
+ if len(bit_arr) > 96:
582
+ return HAMessageType16DestinationAB.from_bitarray(bit_arr)
583
+ else:
584
+ return HAMessageType16DestinationA.from_bitarray(bit_arr)
585
+
586
+ pyais.messages.MessageType16 = HAMessageType16
587
+ pyais.messages.MSG_CLASS[16] = pyais.messages.MessageType16
588
+
589
+
590
+ @attr.s(slots=True)
591
+ class HAMessageType17(HAPayload):
592
+ """
593
+ DGNSS Broadcast Binary Message
594
+ """
595
+ msg_type = bit_field(6, int, default=17, signed=False)
596
+ repeat = bit_field(2, int, default=0, signed=False)
597
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
598
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
599
+ # Note that latitude and longitude are in units of a tenth of a minute
600
+ lon = bit_field(18, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
601
+ lat = bit_field(17, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
602
+ spare_2 = bit_field(5, bytes, default=b'', is_spare=True)
603
+ data = bit_field(736, bytes, default=b'', variable_length=True)
604
+
605
+ pyais.messages.MessageType17 = HAMessageType17
606
+ pyais.messages.MSG_CLASS[17] = pyais.messages.MessageType17
607
+
608
+
609
+ @attr.s(slots=True)
610
+ class HAMessageType18(HAPayload, CommunicationStateMixin):
611
+ """
612
+ Standard Class B CS Position Report
613
+ Src: https://gpsd.gitlab.io/gpsd/AIVDM.html#_type_18_standard_class_b_cs_position_report
614
+ """
615
+ msg_type = bit_field(6, int, default=18, signed=False)
616
+ repeat = bit_field(2, int, default=0, signed=False)
617
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
618
+
619
+ reserved_1 = bit_field(8, int, default=0, signed=False)
620
+ speed = bit_field(10, float, from_converter=from_speed, to_converter=to_speed, default=0, signed=False)
621
+ accuracy = bit_field(1, bool, default=0, signed=False)
622
+ lon = bit_field(28, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
623
+ lat = bit_field(27, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
624
+ course = bit_field(12, float, from_converter=from_10th, to_converter=to_10th, default=0, signed=False)
625
+ heading = bit_field(9, int, default=0, signed=False)
626
+ second = bit_field(6, int, default=0, signed=False)
627
+ reserved_2 = bit_field(2, int, default=0, signed=False)
628
+ cs = bit_field(1, bool, default=0, signed=False)
629
+ display = bit_field(1, bool, default=0)
630
+ dsc = bit_field(1, bool, default=0)
631
+ band = bit_field(1, bool, default=0)
632
+ msg22 = bit_field(1, bool, default=0)
633
+ assigned = bit_field(1, bool, default=0)
634
+ raim = bit_field(1, bool, default=0)
635
+ radio = bit_field(20, int, default=0)
636
+
637
+ pyais.messages.MessageType18 = HAMessageType18
638
+ pyais.messages.MSG_CLASS[18] = pyais.messages.MessageType18
639
+
640
+
641
+ @attr.s(slots=True)
642
+ class HAMessageType19(HAPayload):
643
+ """
644
+ Extended Class B CS Position Report
645
+ """
646
+ msg_type = bit_field(6, int, default=19, signed=False)
647
+ repeat = bit_field(2, int, default=0, signed=False)
648
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
649
+ reserved_1 = bit_field(8, int, default=0)
650
+
651
+ speed = bit_field(10, float, from_converter=from_speed, to_converter=to_speed, default=0, signed=False)
652
+ accuracy = bit_field(1, bool, default=0, signed=False)
653
+ lon = bit_field(28, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
654
+ lat = bit_field(27, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
655
+ course = bit_field(12, float, from_converter=from_10th, to_converter=to_10th, default=0, signed=False)
656
+ heading = bit_field(9, int, default=0, signed=False)
657
+ second = bit_field(6, int, default=0, signed=False)
658
+ reserved_2 = bit_field(4, int, default=0, signed=False)
659
+ shipname = bit_field(120, str, default='')
660
+ ship_type = bit_field(8, int, default=0, from_converter=ShipType.from_value, to_converter=ShipType.from_value,
661
+ signed=False)
662
+ to_bow = bit_field(9, int, default=0, signed=False)
663
+ to_stern = bit_field(9, int, default=0, signed=False)
664
+ to_port = bit_field(6, int, default=0, signed=False)
665
+ to_starboard = bit_field(6, int, default=0, signed=False)
666
+ epfd = bit_field(4, int, default=0, from_converter=EpfdType.from_value, to_converter=EpfdType.from_value)
667
+ raim = bit_field(1, bool, default=0)
668
+ dte = bit_field(1, bool, default=0)
669
+ assigned = bit_field(1, bool, default=0, signed=False)
670
+ spare_1 = bit_field(4, bytes, default=b'', is_spare=True)
671
+
672
+ pyais.messages.MessageType19 = HAMessageType19
673
+ pyais.messages.MSG_CLASS[19] = pyais.messages.MessageType19
674
+
675
+
676
+ @attr.s(slots=True)
677
+ class HAMessageType20ReservationBlock1(HAPayload):
678
+ """
679
+ Data Link Management Message
680
+ """
681
+ msg_type = bit_field(6, int, default=20, signed=False)
682
+ repeat = bit_field(2, int, default=0, signed=False)
683
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
684
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
685
+
686
+ offset1 = bit_field(12, int, default=0, signed=False)
687
+ number1 = bit_field(4, int, default=0, signed=False)
688
+ timeout1 = bit_field(3, int, default=0, signed=False)
689
+ increment1 = bit_field(11, int, default=0, signed=False)
690
+ spare_2 = bit_field(2, bytes, default=b'', is_spare=True)
691
+
692
+ pyais.messages.MessageType20ReservationBlock1 = HAMessageType20ReservationBlock1
693
+
694
+
695
+ @attr.s(slots=True)
696
+ class HAMessageType20ReservationBlock12(HAPayload):
697
+ """
698
+ Data Link Management Message
699
+ """
700
+ msg_type = bit_field(6, int, default=20, signed=False)
701
+ repeat = bit_field(2, int, default=0, signed=False)
702
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
703
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
704
+
705
+ offset1 = bit_field(12, int, default=0, signed=False)
706
+ number1 = bit_field(4, int, default=0, signed=False)
707
+ timeout1 = bit_field(3, int, default=0, signed=False)
708
+ increment1 = bit_field(11, int, default=0, signed=False)
709
+
710
+ offset2 = bit_field(12, int, default=0, signed=False)
711
+ number2 = bit_field(4, int, default=0, signed=False)
712
+ timeout2 = bit_field(3, int, default=0, signed=False)
713
+ increment2 = bit_field(11, int, default=0, signed=False)
714
+ spare_2 = bit_field(4, bytes, default=b'', is_spare=True)
715
+
716
+ pyais.messages.MessageType20ReservationBlock12 = HAMessageType20ReservationBlock12
717
+
718
+
719
+ @attr.s(slots=True)
720
+ class HAMessageType20ReservationBlock123(HAPayload):
721
+ """
722
+ Data Link Management Message
723
+ """
724
+ msg_type = bit_field(6, int, default=20, signed=False)
725
+ repeat = bit_field(2, int, default=0, signed=False)
726
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
727
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
728
+
729
+ offset1 = bit_field(12, int, default=0, signed=False)
730
+ number1 = bit_field(4, int, default=0, signed=False)
731
+ timeout1 = bit_field(3, int, default=0, signed=False)
732
+ increment1 = bit_field(11, int, default=0, signed=False)
733
+
734
+ offset2 = bit_field(12, int, default=0, signed=False)
735
+ number2 = bit_field(4, int, default=0, signed=False)
736
+ timeout2 = bit_field(3, int, default=0, signed=False)
737
+ increment2 = bit_field(11, int, default=0, signed=False)
738
+
739
+ offset3 = bit_field(12, int, default=0, signed=False)
740
+ number3 = bit_field(4, int, default=0, signed=False)
741
+ timeout3 = bit_field(3, int, default=0, signed=False)
742
+ increment3 = bit_field(11, int, default=0, signed=False)
743
+ spare_2 = bit_field(6, bytes, default=b'', is_spare=True)
744
+
745
+ pyais.messages.MessageType20ReservationBlock123 = HAMessageType20ReservationBlock123
746
+
747
+
748
+ @attr.s(slots=True)
749
+ class HAMessageType20ReservationBlock1234(HAPayload):
750
+ """
751
+ Data Link Management Message
752
+ """
753
+ msg_type = bit_field(6, int, default=20, signed=False)
754
+ repeat = bit_field(2, int, default=0, signed=False)
755
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
756
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
757
+
758
+ offset1 = bit_field(12, int, default=0, signed=False)
759
+ number1 = bit_field(4, int, default=0, signed=False)
760
+ timeout1 = bit_field(3, int, default=0, signed=False)
761
+ increment1 = bit_field(11, int, default=0, signed=False)
762
+
763
+ offset2 = bit_field(12, int, default=0, signed=False)
764
+ number2 = bit_field(4, int, default=0, signed=False)
765
+ timeout2 = bit_field(3, int, default=0, signed=False)
766
+ increment2 = bit_field(11, int, default=0, signed=False)
767
+
768
+ offset3 = bit_field(12, int, default=0, signed=False)
769
+ number3 = bit_field(4, int, default=0, signed=False)
770
+ timeout3 = bit_field(3, int, default=0, signed=False)
771
+ increment3 = bit_field(11, int, default=0, signed=False)
772
+
773
+ offset4 = bit_field(12, int, default=0, signed=False)
774
+ number4 = bit_field(4, int, default=0, signed=False)
775
+ timeout4 = bit_field(3, int, default=0, signed=False)
776
+ increment4 = bit_field(11, int, default=0, signed=False)
777
+
778
+ pyais.messages.MessageType20ReservationBlock1234 = HAMessageType20ReservationBlock1234
779
+
780
+
781
+ @attr.s(slots=True)
782
+ class HAMessageType20(HAPayload):
783
+ @classmethod
784
+ def create(cls, **kwargs: typing.Union[str, float, int, bool, bytes]) -> "ANY_MESSAGE":
785
+ if 'offset4' in kwargs and int(kwargs['offset4']) > 0:
786
+ return HAMessageType20ReservationBlock1234.create(**kwargs)
787
+ elif 'offset3' in kwargs and int(kwargs['offset3']) > 0:
788
+ return HAMessageType20ReservationBlock123.create(**kwargs)
789
+ elif 'offset2' in kwargs and int(kwargs['offset2']) > 0:
790
+ return HAMessageType20ReservationBlock12.create(**kwargs)
791
+ else:
792
+ return HAMessageType20ReservationBlock1.create(**kwargs)
793
+
794
+ @classmethod
795
+ def from_bitarray(cls, bit_arr: bitarray) -> "ANY_MESSAGE":
796
+ if len(bit_arr) > 136:
797
+ return HAMessageType20ReservationBlock1234.from_bitarray(bit_arr)
798
+ elif len(bit_arr) > 104:
799
+ return HAMessageType20ReservationBlock123.from_bitarray(bit_arr)
800
+ elif len(bit_arr) > 72:
801
+ return HAMessageType20ReservationBlock12.from_bitarray(bit_arr)
802
+ else:
803
+ return HAMessageType20ReservationBlock1.from_bitarray(bit_arr)
804
+
805
+ pyais.messages.MessageType20 = HAMessageType20
806
+ pyais.messages.MSG_CLASS[20] = pyais.messages.MessageType20
807
+
808
+
809
+ @attr.s(slots=True)
810
+ class HAMessageType21(HAPayload):
811
+ """
812
+ Aid-to-Navigation Report
813
+ """
814
+ msg_type = bit_field(6, int, default=21, signed=False)
815
+ repeat = bit_field(2, int, default=0, signed=False)
816
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
817
+
818
+ aid_type = bit_field(5, int, default=0, from_converter=NavAid.from_value, to_converter=NavAid.from_value,
819
+ signed=False)
820
+ name = bit_field(120, str, default='')
821
+
822
+ accuracy = bit_field(1, bool, default=0, signed=False)
823
+ lon = bit_field(28, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
824
+ lat = bit_field(27, float, from_converter=from_lat_lon, to_converter=to_lat_lon, signed=True, default=0)
825
+ to_bow = bit_field(9, int, default=0, signed=False)
826
+ to_stern = bit_field(9, int, default=0, signed=False)
827
+ to_port = bit_field(6, int, default=0, signed=False)
828
+ to_starboard = bit_field(6, int, default=0, signed=False)
829
+
830
+ epfd = bit_field(4, int, default=0, from_converter=EpfdType.from_value, to_converter=EpfdType.from_value)
831
+ second = bit_field(6, int, default=0, signed=False)
832
+ off_position = bit_field(1, bool, default=0)
833
+ reserved_1 = bit_field(8, int, default=0, signed=False)
834
+ raim = bit_field(1, bool, default=0)
835
+ virtual_aid = bit_field(1, bool, default=0)
836
+ assigned = bit_field(1, bool, default=0)
837
+ spare_1 = bit_field(1, bytes, default=b'', is_spare=True)
838
+ name_ext = bit_field(88, str, default='')
839
+
840
+ @functools.cached_property
841
+ def full_name(self) -> str:
842
+ """The name field is up to 20 characters of 6-bit ASCII. If this field
843
+ is full (has no trailing @ characters) the decoder should interpret
844
+ the Name Extension field later in the message (no more than 14 6-bit
845
+ characters) and concatenate it to this one to obtain the full name."""
846
+ if self.name:
847
+ if self.name_ext:
848
+ return f"{self.name}{self.name_ext}"
849
+ return str(self.name)
850
+ return ""
851
+
852
+ # TODO: replace following override by a generic implementation in Payload.asdict that exports only fields
853
+ def asdict(self, enum_as_int: bool = False) -> typing.Dict[str, typing.Optional[NMEA_VALUE]]:
854
+ res = super().asdict(enum_as_int)
855
+
856
+ # Remove key 'full_name' if present
857
+ if 'full_name' in res:
858
+ del res['full_name']
859
+
860
+ return res
861
+
862
+ pyais.messages.MessageType21 = HAMessageType21
863
+ pyais.messages.MSG_CLASS[21] = pyais.messages.MessageType21
864
+
865
+
866
+ @attr.s(slots=True)
867
+ class HAMessageType22Addressed(HAPayload):
868
+ """
869
+ Channel Management
870
+ """
871
+ msg_type = bit_field(6, int, default=22, signed=False)
872
+ repeat = bit_field(2, int, default=0, signed=False)
873
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
874
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
875
+
876
+ channel_a = bit_field(12, int, default=0, signed=False)
877
+ channel_b = bit_field(12, int, default=0, signed=False)
878
+ txrx = bit_field(4, int, default=0, signed=False)
879
+ power = bit_field(1, bool, default=0) # 69 bits
880
+
881
+ # If it is addressed (addressed field is 1),
882
+ # the same span of data is interpreted as two 30-bit MMSIs
883
+ # beginning at bit offsets 69 and 104 respectively.
884
+ dest1 = bit_field(30, int, default=0, from_converter=from_mmsi)
885
+ empty_1 = bit_field(5, int, default=0)
886
+ dest2 = bit_field(30, int, default=0, from_converter=from_mmsi)
887
+ empty_2 = bit_field(5, int, default=0)
888
+
889
+ addressed = bit_field(1, bool, default=0)
890
+ band_a = bit_field(1, bool, default=0)
891
+ band_b = bit_field(1, bool, default=0)
892
+ zonesize = bit_field(3, int, default=0)
893
+ spare_2 = bit_field(23, bytes, default=b'', is_spare=True)
894
+
895
+ pyais.messages.MessageType22Addressed = HAMessageType22Addressed
896
+
897
+
898
+ @attr.s(slots=True)
899
+ class HAMessageType22Broadcast(HAPayload):
900
+ """
901
+ Channel Management
902
+ """
903
+ msg_type = bit_field(6, int, default=22, signed=False)
904
+ repeat = bit_field(2, int, default=0, signed=False)
905
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
906
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
907
+
908
+ channel_a = bit_field(12, int, default=0, signed=False)
909
+ channel_b = bit_field(12, int, default=0, signed=False)
910
+ txrx = bit_field(4, int, default=0, signed=False)
911
+ power = bit_field(1, bool, default=0)
912
+
913
+ # If the message is broadcast (addressed field is 0),
914
+ # the ne_lon, ne_lat, sw_lon, and sw_lat fields are the
915
+ # corners of a rectangular jurisdiction area over which control parameter
916
+ # ne_lon, ne_lat, sw_lon, and sw_lat fields are in 0.1 minutes
917
+ ne_lon = bit_field(18, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
918
+ ne_lat = bit_field(17, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
919
+ sw_lon = bit_field(18, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
920
+ sw_lat = bit_field(17, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
921
+
922
+ addressed = bit_field(1, bool, default=0)
923
+ band_a = bit_field(1, bool, default=0)
924
+ band_b = bit_field(1, bool, default=0)
925
+ zonesize = bit_field(3, int, default=0, signed=False)
926
+ spare_2 = bit_field(23, bytes, default=b'', is_spare=True)
927
+
928
+ pyais.messages.MessageType22Broadcast = HAMessageType22Broadcast
929
+
930
+
931
+ @attr.s(slots=True)
932
+ class HAMessageType23(HAPayload):
933
+ """
934
+ Group Assignment Command
935
+ """
936
+ msg_type = bit_field(6, int, default=23, signed=False)
937
+ repeat = bit_field(2, int, default=0, signed=False)
938
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
939
+ spare_1 = bit_field(2, bytes, default=b'', is_spare=True)
940
+
941
+ ne_lon = bit_field(18, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
942
+ ne_lat = bit_field(17, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
943
+ sw_lon = bit_field(18, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
944
+ sw_lat = bit_field(17, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
945
+
946
+ station_type = bit_field(4, int, default=0, from_converter=StationType.from_value,
947
+ to_converter=StationType.from_value)
948
+ ship_type = bit_field(8, int, default=0, from_converter=ShipType.from_value, to_converter=ShipType.from_value)
949
+ spare_2 = bit_field(22, bytes, default=b'', is_spare=True)
950
+
951
+ txrx = bit_field(2, int, default=0, from_converter=TransmitMode.from_value, to_converter=TransmitMode.from_value,
952
+ signed=False)
953
+ interval = bit_field(4, int, default=0, from_converter=StationIntervals.from_value,
954
+ to_converter=StationIntervals.from_value)
955
+ quiet = bit_field(4, int, default=0, signed=False)
956
+ spare_3 = bit_field(6, bytes, default=b'', is_spare=True)
957
+
958
+ pyais.messages.MessageType23 = HAMessageType23
959
+ pyais.messages.MSG_CLASS[23] = pyais.messages.MessageType23
960
+
961
+
962
+ @attr.s(slots=True)
963
+ class HAMessageType24PartA(HAPayload):
964
+ msg_type = bit_field(6, int, default=24, signed=False)
965
+ repeat = bit_field(2, int, default=0, signed=False)
966
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
967
+
968
+ # partno = bit_field(2, int, default=0, signed=False)
969
+ reserved = bit_field(1, int, default=0, signed=False, is_spare=True)
970
+ partno = bit_field(1, int, default=0, signed=False)
971
+ shipname = bit_field(120, str, default='')
972
+ spare_1 = bit_field(8, bytes, default=b'', is_spare=True)
973
+
974
+ pyais.messages.MessageType24PartA = HAMessageType24PartA
975
+
976
+
977
+ @attr.s(slots=True)
978
+ class HAMessageType24PartB(HAPayload):
979
+ msg_type = bit_field(6, int, default=24, signed=False)
980
+ repeat = bit_field(2, int, default=0, signed=False)
981
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
982
+
983
+ # partno = bit_field(2, int, default=0, signed=False)
984
+ reserved = bit_field(1, int, default=0, signed=False, is_spare=True)
985
+ partno = bit_field(1, int, default=0, signed=False)
986
+ ship_type = bit_field(8, int, default=0, signed=False)
987
+ vendorid = bit_field(18, str, default='', signed=False)
988
+ model = bit_field(4, int, default=0, signed=False)
989
+ serial = bit_field(20, int, default=0, signed=False)
990
+ callsign = bit_field(42, str, default='')
991
+
992
+ to_bow = bit_field(9, int, default=0, signed=False)
993
+ to_stern = bit_field(9, int, default=0, signed=False)
994
+ to_port = bit_field(6, int, default=0, signed=False)
995
+ to_starboard = bit_field(6, int, default=0, signed=False)
996
+
997
+ spare_1 = bit_field(6, bytes, default=b'', is_spare=True)
998
+
999
+ pyais.messages.MessageType24PartB = HAMessageType24PartB
1000
+
1001
+
1002
+ @attr.s(slots=True)
1003
+ class HAMessageType25AddressedStructured(HAPayload):
1004
+ msg_type = bit_field(6, int, default=25, signed=False)
1005
+ repeat = bit_field(2, int, default=0, signed=False)
1006
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
1007
+
1008
+ addressed = bit_field(1, bool, default=0, signed=False)
1009
+ structured = bit_field(1, bool, default=0, signed=False)
1010
+
1011
+ dest_mmsi = bit_field(30, int, default=0, from_converter=from_mmsi, signed=False)
1012
+ spare = bit_field(2, int, default=0, signed=False, is_spare=True)
1013
+ app_id = bit_field(16, int, default=0, signed=False)
1014
+ data = bit_field(80, bytes, default=b'', variable_length=True)
1015
+
1016
+ pyais.messages.MessageType25AddressedStructured = HAMessageType25AddressedStructured
1017
+
1018
+
1019
+ @attr.s(slots=True)
1020
+ class HAMessageType25AddressedUnstructured(HAPayload):
1021
+ msg_type = bit_field(6, int, default=25, signed=False)
1022
+ repeat = bit_field(2, int, default=0, signed=False)
1023
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
1024
+
1025
+ addressed = bit_field(1, bool, default=0, signed=False)
1026
+ structured = bit_field(1, bool, default=0, signed=False)
1027
+
1028
+ dest_mmsi = bit_field(30, int, default=0, from_converter=from_mmsi)
1029
+ spare = bit_field(2, int, default=0, signed=False, is_spare=True)
1030
+ data = bit_field(96, bytes, default=b'', variable_length=True)
1031
+
1032
+ pyais.messages.MessageType25AddressedUnstructured = HAMessageType25AddressedUnstructured
1033
+
1034
+
1035
+ @attr.s(slots=True)
1036
+ class HAMessageType26AddressedStructured(HAPayload, CommunicationStateMixin):
1037
+ msg_type = bit_field(6, int, default=26, signed=False)
1038
+ repeat = bit_field(2, int, default=0, signed=False)
1039
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
1040
+
1041
+ addressed = bit_field(1, bool, default=0, signed=False)
1042
+ structured = bit_field(1, bool, default=0, signed=False)
1043
+
1044
+ dest_mmsi = bit_field(30, int, default=0, from_converter=from_mmsi)
1045
+ spare1 = bit_field(2, int, default=0, signed=False, is_spare=True)
1046
+ app_id = bit_field(16, int, default=0, signed=False)
1047
+ data = bit_field(952, bytes, default=b'', variable_length=True)
1048
+ spare2 = bit_field(4, int, default=0, signed=False, is_spare=True)
1049
+ radio = bit_field(20, int, default=0, signed=False)
1050
+
1051
+ pyais.messages.MessageType26AddressedStructured = HAMessageType26AddressedStructured
1052
+
1053
+
1054
+ @attr.s(slots=True)
1055
+ class HAMessageType26BroadcastStructured(HAPayload, CommunicationStateMixin):
1056
+ msg_type = bit_field(6, int, default=26, signed=False)
1057
+ repeat = bit_field(2, int, default=0, signed=False)
1058
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
1059
+
1060
+ addressed = bit_field(1, bool, default=0, signed=False)
1061
+ structured = bit_field(1, bool, default=0, signed=False)
1062
+
1063
+ app_id = bit_field(16, int, default=0, signed=False)
1064
+ data = bit_field(984, bytes, default=b'', variable_length=True)
1065
+ spare2 = bit_field(4, int, default=0, signed=False, is_spare=True)
1066
+ radio = bit_field(20, int, default=0, signed=False)
1067
+
1068
+ pyais.messages.MessageType26BroadcastStructured = HAMessageType26BroadcastStructured
1069
+
1070
+
1071
+ @attr.s(slots=True)
1072
+ class HAMessageType26AddressedUnstructured(HAPayload, CommunicationStateMixin):
1073
+ msg_type = bit_field(6, int, default=26, signed=False)
1074
+ repeat = bit_field(2, int, default=0, signed=False)
1075
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
1076
+
1077
+ addressed = bit_field(1, bool, default=0, signed=False)
1078
+ structured = bit_field(1, bool, default=0, signed=False)
1079
+
1080
+ dest_mmsi = bit_field(30, int, default=0, from_converter=from_mmsi)
1081
+ spare1 = bit_field(2, int, default=0, signed=False, is_spare=True)
1082
+ data = bit_field(968, bytes, default=b'', variable_length=True)
1083
+ spare2 = bit_field(4, int, default=0, signed=False, is_spare=True)
1084
+ radio = bit_field(20, int, default=0, signed=False)
1085
+
1086
+ pyais.messages.MessageType26AddressedUnstructured = HAMessageType26AddressedUnstructured
1087
+
1088
+
1089
+ @attr.s(slots=True)
1090
+ class HAMessageType26BroadcastUnstructured(HAPayload, CommunicationStateMixin):
1091
+ msg_type = bit_field(6, int, default=26, signed=False)
1092
+ repeat = bit_field(2, int, default=0, signed=False)
1093
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
1094
+
1095
+ addressed = bit_field(1, bool, default=0, signed=False)
1096
+ structured = bit_field(1, bool, default=0, signed=False)
1097
+
1098
+ data = bit_field(1000, bytes, default=b'', variable_length=True)
1099
+ spare2 = bit_field(4, int, default=0, signed=False, is_spare=True)
1100
+ radio = bit_field(20, int, default=0, signed=False)
1101
+
1102
+ pyais.messages.MessageType26BroadcastUnstructured = HAMessageType26BroadcastUnstructured
1103
+
1104
+
1105
+ class HAMessageType26(HAPayload):
1106
+ """
1107
+ Multiple Slot Binary Message
1108
+
1109
+ NOTE: This message type is quite uncommon and
1110
+ I was not able find any real world occurrence of the type.
1111
+ Also documentation seems to vary. Use with caution.
1112
+ """
1113
+
1114
+ @classmethod
1115
+ def create(cls, **kwargs: typing.Union[str, float, int, bool, bytes]) -> "ANY_MESSAGE":
1116
+ addressed = kwargs.get('addressed', False)
1117
+ structured = kwargs.get('structured', False)
1118
+
1119
+ if addressed:
1120
+ if structured:
1121
+ return HAMessageType26AddressedStructured.create(**kwargs)
1122
+ else:
1123
+ return HAMessageType26AddressedUnstructured.create(**kwargs)
1124
+ else:
1125
+ if structured:
1126
+ return HAMessageType26BroadcastStructured.create(**kwargs)
1127
+ else:
1128
+ return HAMessageType26BroadcastUnstructured.create(**kwargs)
1129
+
1130
+ @classmethod
1131
+ def from_bitarray(cls, bit_arr: bitarray) -> "ANY_MESSAGE":
1132
+ addressed: int = get_int(bit_arr, 38, 39)
1133
+ structured: int = get_int(bit_arr, 39, 40)
1134
+
1135
+ if addressed:
1136
+ if structured:
1137
+ return HAMessageType26AddressedStructured.from_bitarray(bit_arr)
1138
+ else:
1139
+ return HAMessageType26AddressedUnstructured.from_bitarray(bit_arr)
1140
+ else:
1141
+ if structured:
1142
+ return HAMessageType26BroadcastStructured.from_bitarray(bit_arr)
1143
+ else:
1144
+ return HAMessageType26BroadcastUnstructured.from_bitarray(bit_arr)
1145
+
1146
+ pyais.messages.MessageType26 = HAMessageType26
1147
+ pyais.messages.MSG_CLASS[26] = pyais.messages.MessageType26
1148
+
1149
+
1150
+ @attr.s(slots=True)
1151
+ class HAMessageType27(HAPayload):
1152
+ """
1153
+ Long Range AIS Broadcast message
1154
+ """
1155
+ msg_type = bit_field(6, int, default=27, signed=False)
1156
+ repeat = bit_field(2, int, default=0, signed=False)
1157
+ mmsi = bit_field(30, int, from_converter=from_mmsi)
1158
+
1159
+ accuracy = bit_field(1, bool, default=0, signed=False)
1160
+ raim = bit_field(1, bool, default=0, signed=False)
1161
+ status = bit_field(4, int, default=0, from_converter=NavigationStatus, to_converter=NavigationStatus, signed=False)
1162
+ lon = bit_field(18, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
1163
+ lat = bit_field(17, float, from_converter=from_lat_lon_600, to_converter=to_lat_lon_600, default=0, signed=True)
1164
+ speed = bit_field(6, float, default=0, signed=False)
1165
+ course = bit_field(9, float, default=0, signed=False)
1166
+ gnss = bit_field(1, bool, default=0, signed=False)
1167
+ spare_1 = bit_field(1, bytes, default=b'', is_spare=True)
1168
+
1169
+ pyais.messages.MessageType27 = HAMessageType27
1170
+ pyais.messages.MSG_CLASS[27] = pyais.messages.MessageType27
1171
+
1172
+
1173
+
1174
+