ul-api-utils 7.10.1__tar.gz → 7.10.3__tar.gz

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

Potentially problematic release.


This version of ul-api-utils might be problematic. Click here for more details.

Files changed (155) hide show
  1. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/PKG-INFO +1 -1
  2. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/conf.py +8 -1
  3. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/main.py +5 -0
  4. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/routes/api_some.py +1 -22
  5. ul-api-utils-7.10.3/example/sockets/on_connect.py +16 -0
  6. ul-api-utils-7.10.3/example/sockets/on_disconnect.py +14 -0
  7. ul-api-utils-7.10.3/example/sockets/on_json.py +10 -0
  8. ul-api-utils-7.10.3/example/sockets/on_message.py +9 -0
  9. ul-api-utils-7.10.3/example/sockets/on_open.py +16 -0
  10. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/setup.py +2 -1
  11. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/cmd_generate_api_docs.py +1 -1
  12. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/cmd_start.py +0 -7
  13. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/api_sdk.py +23 -11
  14. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/api_sdk_config.py +26 -3
  15. ul-api-utils-7.10.3/ul_api_utils/resources/socketio.py +20 -0
  16. ul-api-utils-7.10.3/ul_api_utils/validators/__tests__/__init__.py +0 -0
  17. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils.egg-info/PKG-INFO +1 -1
  18. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils.egg-info/SOURCES.txt +7 -1
  19. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils.egg-info/requires.txt +1 -0
  20. ul-api-utils-7.10.1/ul_api_utils/resources/sockets.py +0 -3
  21. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/LICENSE +0 -0
  22. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/README.md +0 -0
  23. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/__init__.py +0 -0
  24. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/models/__init__.py +0 -0
  25. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/permissions.py +0 -0
  26. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/pure_flask_example.py +0 -0
  27. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/rate_limit_load.py +0 -0
  28. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/routes/__init__.py +0 -0
  29. {ul-api-utils-7.10.1/example/workers → ul-api-utils-7.10.3/example/sockets}/__init__.py +0 -0
  30. {ul-api-utils-7.10.1/ul_api_utils → ul-api-utils-7.10.3/example/workers}/__init__.py +0 -0
  31. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/example/workers/worker.py +0 -0
  32. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/setup.cfg +0 -0
  33. {ul-api-utils-7.10.1/ul_api_utils/api_resource → ul-api-utils-7.10.3/ul_api_utils}/__init__.py +0 -0
  34. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/access/__init__.py +0 -0
  35. {ul-api-utils-7.10.1/ul_api_utils/commands → ul-api-utils-7.10.3/ul_api_utils/api_resource}/__init__.py +0 -0
  36. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_request.py +0 -0
  37. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_resource.py +0 -0
  38. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_resource_config.py +0 -0
  39. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_resource_error_handling.py +0 -0
  40. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_resource_fn_typing.py +0 -0
  41. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_resource_type.py +0 -0
  42. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_response.py +0 -0
  43. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_response_db.py +0 -0
  44. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/api_response_payload_alias.py +0 -0
  45. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/db_types.py +0 -0
  46. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/api_resource/signature_check.py +0 -0
  47. {ul-api-utils-7.10.1/ul_api_utils/commands/start → ul-api-utils-7.10.3/ul_api_utils/commands}/__init__.py +0 -0
  48. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/cmd_enc_keys.py +0 -0
  49. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/cmd_gen_api_user_token.py +0 -0
  50. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/cmd_gen_new_api_user.py +0 -0
  51. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/cmd_worker_start.py +0 -0
  52. {ul-api-utils-7.10.1/ul_api_utils/debug → ul-api-utils-7.10.3/ul_api_utils/commands/start}/__init__.py +0 -0
  53. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/start/gunicorn.conf.py +0 -0
  54. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/commands/start/wsgi.py +0 -0
  55. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/conf/ul-debugger-main.js +0 -0
  56. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/conf/ul-debugger-ui.js +0 -0
  57. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/conf.py +0 -0
  58. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/const.py +0 -0
  59. {ul-api-utils-7.10.1/ul_api_utils/encrypt → ul-api-utils-7.10.3/ul_api_utils/debug}/__init__.py +0 -0
  60. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/debug/debugger.py +0 -0
  61. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/debug/malloc.py +0 -0
  62. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/debug/stat.py +0 -0
  63. {ul-api-utils-7.10.1/ul_api_utils/internal_api → ul-api-utils-7.10.3/ul_api_utils/encrypt}/__init__.py +0 -0
  64. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/encrypt/encrypt_decrypt_abstract.py +0 -0
  65. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/encrypt/encrypt_decrypt_aes_xtea.py +0 -0
  66. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/errors.py +0 -0
  67. {ul-api-utils-7.10.1/ul_api_utils/internal_api/__tests__ → ul-api-utils-7.10.3/ul_api_utils/internal_api}/__init__.py +0 -0
  68. {ul-api-utils-7.10.1/ul_api_utils/modules → ul-api-utils-7.10.3/ul_api_utils/internal_api/__tests__}/__init__.py +0 -0
  69. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/internal_api/__tests__/internal_api.py +0 -0
  70. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/internal_api/__tests__/internal_api_content_type.py +0 -0
  71. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/internal_api/internal_api.py +0 -0
  72. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/internal_api/internal_api_check_context.py +0 -0
  73. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/internal_api/internal_api_error.py +0 -0
  74. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/internal_api/internal_api_response.py +0 -0
  75. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/main.py +0 -0
  76. {ul-api-utils-7.10.1/ul_api_utils/modules/__tests__ → ul-api-utils-7.10.3/ul_api_utils/modules}/__init__.py +0 -0
  77. {ul-api-utils-7.10.1/ul_api_utils/resources → ul-api-utils-7.10.3/ul_api_utils/modules/__tests__}/__init__.py +0 -0
  78. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py +0 -0
  79. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/api_sdk_jwt.py +0 -0
  80. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/intermediate_state.py +0 -0
  81. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/worker_context.py +0 -0
  82. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/worker_sdk.py +0 -0
  83. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/modules/worker_sdk_config.py +0 -0
  84. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/py.typed +0 -0
  85. {ul-api-utils-7.10.1/ul_api_utils/resources/health_check → ul-api-utils-7.10.3/ul_api_utils/resources}/__init__.py +0 -0
  86. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/caching.py +0 -0
  87. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/debugger_scripts.py +0 -0
  88. {ul-api-utils-7.10.1/ul_api_utils/resources/web_forms → ul-api-utils-7.10.3/ul_api_utils/resources/health_check}/__init__.py +0 -0
  89. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/health_check/const.py +0 -0
  90. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/health_check/health_check.py +0 -0
  91. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/health_check/health_check_template.py +0 -0
  92. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/health_check/resource.py +0 -0
  93. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/not_implemented.py +0 -0
  94. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/permissions.py +0 -0
  95. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/rate_limitter.py +0 -0
  96. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/swagger.py +0 -0
  97. {ul-api-utils-7.10.1/ul_api_utils/resources/web_forms/custom_fields → ul-api-utils-7.10.3/ul_api_utils/resources/web_forms}/__init__.py +0 -0
  98. {ul-api-utils-7.10.1/ul_api_utils/resources/web_forms/custom_widgets → ul-api-utils-7.10.3/ul_api_utils/resources/web_forms/custom_fields}/__init__.py +0 -0
  99. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/web_forms/custom_fields/custom_checkbox_select.py +0 -0
  100. {ul-api-utils-7.10.1/ul_api_utils/utils → ul-api-utils-7.10.3/ul_api_utils/resources/web_forms/custom_widgets}/__init__.py +0 -0
  101. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/web_forms/custom_widgets/custom_select_widget.py +0 -0
  102. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py +0 -0
  103. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/resources/web_forms/uni_form.py +0 -0
  104. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/sentry.py +0 -0
  105. {ul-api-utils-7.10.1/ul_api_utils/utils/__tests__ → ul-api-utils-7.10.3/ul_api_utils/utils}/__init__.py +0 -0
  106. {ul-api-utils-7.10.1/ul_api_utils/utils/flask_swagger_generator → ul-api-utils-7.10.3/ul_api_utils/utils/__tests__}/__init__.py +0 -0
  107. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/__tests__/api_path_version.py +0 -0
  108. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/__tests__/unwrap_typing.py +0 -0
  109. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/api_encoding.py +0 -0
  110. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/api_format.py +0 -0
  111. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/api_method.py +0 -0
  112. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/api_pagination.py +0 -0
  113. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/api_path_version.py +0 -0
  114. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/api_request_info.py +0 -0
  115. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/avro.py +0 -0
  116. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/broker_topics_message_count.py +0 -0
  117. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/cached_per_request.py +0 -0
  118. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/colors.py +0 -0
  119. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/constants.py +0 -0
  120. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/decode_base64.py +0 -0
  121. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/deprecated.py +0 -0
  122. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flags.py +0 -0
  123. {ul-api-utils-7.10.1/ul_api_utils/utils/flask_swagger_generator/specifiers → ul-api-utils-7.10.3/ul_api_utils/utils/flask_swagger_generator}/__init__.py +0 -0
  124. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/conf.py +0 -0
  125. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/exceptions.py +0 -0
  126. {ul-api-utils-7.10.1/ul_api_utils/utils/flask_swagger_generator/utils → ul-api-utils-7.10.3/ul_api_utils/utils/flask_swagger_generator/specifiers}/__init__.py +0 -0
  127. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_models.py +0 -0
  128. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_specifier.py +0 -0
  129. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_three_specifier.py +0 -0
  130. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_version.py +0 -0
  131. {ul-api-utils-7.10.1/ul_api_utils/utils/jinja → ul-api-utils-7.10.3/ul_api_utils/utils/flask_swagger_generator/utils}/__init__.py +0 -0
  132. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/utils/input_type.py +0 -0
  133. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/utils/parameter_type.py +0 -0
  134. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/utils/replace_in_dict.py +0 -0
  135. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/utils/request_type.py +0 -0
  136. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/utils/schema_type.py +0 -0
  137. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/flask_swagger_generator/utils/security_type.py +0 -0
  138. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/imports.py +0 -0
  139. {ul-api-utils-7.10.1/ul_api_utils/validators → ul-api-utils-7.10.3/ul_api_utils/utils/jinja}/__init__.py +0 -0
  140. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/jinja/t_url_for.py +0 -0
  141. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/jinja/to_pretty_json.py +0 -0
  142. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/json_encoder.py +0 -0
  143. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/load_modules.py +0 -0
  144. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/token_check.py +0 -0
  145. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/token_check_through_request.py +0 -0
  146. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/unwrap_typing.py +0 -0
  147. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/utils/uuid_converter.py +0 -0
  148. {ul-api-utils-7.10.1/ul_api_utils/validators/__tests__ → ul-api-utils-7.10.3/ul_api_utils/validators}/__init__.py +0 -0
  149. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/validators/__tests__/test_custom_fields.py +0 -0
  150. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/validators/custom_fields.py +0 -0
  151. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/validators/validate_empty_object.py +0 -0
  152. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils/validators/validate_uuid.py +0 -0
  153. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils.egg-info/dependency_links.txt +0 -0
  154. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils.egg-info/entry_points.txt +0 -0
  155. {ul-api-utils-7.10.1 → ul-api-utils-7.10.3}/ul_api_utils.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ul-api-utils
3
- Version: 7.10.1
3
+ Version: 7.10.3
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
6
  Author-email:
@@ -8,9 +8,16 @@ from ul_api_utils.modules.api_sdk_config import ApiSdkConfig, ApiSdkIdentifyType
8
8
  from example.permissions import permissions
9
9
 
10
10
  sdk = ApiSdk(ApiSdkConfig(
11
- sockets_config=SocketIOConfig(
11
+ server_socketio_config=SocketIOConfig(
12
12
  message_queue='redis://localhost:16379',
13
+ logs_enabled=True,
14
+ engineio_logs_enabled=False,
13
15
  ),
16
+ # client_socketio_config=SocketIOConfig(
17
+ # message_queue='redis://localhost:16379',
18
+ # logs_enabled=True,
19
+ # engineio_logs_enabled=False,
20
+ # ),
14
21
  service_name='example_service',
15
22
  permissions=permissions,
16
23
  cache_storage_uri='redis://localhost:16379',
@@ -1,3 +1,8 @@
1
+ # from gevent import monkey
2
+ #
3
+ # monkey.patch_all()
4
+ # UNCOMMENT THIS IN CASE YOU'RE TESTING GEVENT WORKERS WITH SOCKET.IO
5
+
1
6
  import os
2
7
 
3
8
  if int(os.environ.get('PROFILE_MEM', '0')):
@@ -1,16 +1,13 @@
1
1
  import logging
2
2
  from time import sleep
3
3
  from datetime import datetime, timedelta
4
- from typing import List, Optional, Tuple, Any
4
+ from typing import List, Optional, Tuple
5
5
 
6
- from flask_socketio import emit
7
6
 
8
- from ul_api_utils.resources.sockets import socket_io
9
7
  from flask import jsonify
10
8
  from pydantic import BaseModel
11
9
  from ul_db_utils.modules.postgres_modules.db import db
12
10
  from werkzeug import Response as BaseResponse
13
- from flask import request
14
11
  from example.conf import sdk
15
12
  from example.permissions import SOME_PERMISSION, SOME_PERMISSION2
16
13
  from ul_api_utils.api_resource.api_request import ApiRequestQuery
@@ -321,21 +318,3 @@ def somefile(api_resource: ApiResource) -> FileApiResponse:
321
318
  as_attachment=True,
322
319
  attachment_filename='import_devices_log.txt',
323
320
  )
324
-
325
-
326
- @socket_io.on('message')
327
- def handle(data: Any, message: Any) -> None:
328
- sid = request.sid
329
- emit('message', {"data1": 1, "data": 2}, room=sid)
330
-
331
-
332
- @socket_io.event
333
- def connect():
334
- logger.info("Connected!")
335
- logger.info("SESSION INFO: " + str(request.sid))
336
-
337
-
338
- @socket_io.event('disconnect')
339
- def disconnect():
340
- logger.info("Client disconnected!")
341
- logger.info("SESSION INFO: " + str(request.sid))
@@ -0,0 +1,16 @@
1
+ import logging
2
+
3
+ from flask import request
4
+ from flask_socketio import emit # type: ignore
5
+
6
+ from example.conf import sdk
7
+
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ @sdk.socket.on('connect')
13
+ def handle_connect() -> None:
14
+ logger.info("Connected!")
15
+ logger.info("SESSION INFO: " + str(request.sid)) # type: ignore
16
+ emit('message', {"data1": 1, "data": 2}, room=request.sid, broadcast=True) # type: ignore
@@ -0,0 +1,14 @@
1
+ import logging
2
+
3
+ from flask import request
4
+
5
+ from example.conf import sdk
6
+
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ @sdk.socket.on('disconnect')
12
+ def disconnect() -> None:
13
+ logger.info("Client disconnected!")
14
+ logger.info("SESSION INFO: " + str(request.sid)) # type: ignore
@@ -0,0 +1,10 @@
1
+ from typing import Any
2
+
3
+ from flask_socketio import send # type: ignore
4
+
5
+ from example.conf import sdk
6
+
7
+
8
+ @sdk.socket.on('json')
9
+ def handle_json(json: dict[str, Any]) -> None:
10
+ send(json, json=True)
@@ -0,0 +1,9 @@
1
+ from typing import Any
2
+
3
+ from example.conf import sdk
4
+
5
+
6
+ @sdk.socket.on('message')
7
+ def handle_message(data: Any) -> None:
8
+ print('received message: ')
9
+ print(data)
@@ -0,0 +1,16 @@
1
+ import logging
2
+
3
+ from flask import request
4
+ from flask_socketio import emit # type: ignore
5
+
6
+ from example.conf import sdk
7
+
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ @sdk.socket.on('open')
13
+ def handle_open() -> None:
14
+ logger.info("Connected!")
15
+ logger.info("SESSION INFO: " + str(request.sid)) # type: ignore
16
+ emit('message', {"data1": 1, "data": 2}, room=request.sid, broadcast=True) # type: ignore
@@ -9,7 +9,7 @@ with open(path.join(HERE, 'README.md'), encoding='utf-8') as f:
9
9
 
10
10
  setup(
11
11
  name='ul-api-utils',
12
- version='7.10.1',
12
+ version='7.10.3',
13
13
  description='Python api utils',
14
14
  author='Unic-lab',
15
15
  long_description=long_description,
@@ -62,6 +62,7 @@ setup(
62
62
  "pyjwt==2.4.0",
63
63
  "gunicorn==20.1.0",
64
64
  "gevent==24.2.1",
65
+ "gevent-websocket==0.10.1",
65
66
  "pyyaml==6.0",
66
67
  "requests==2.28.1",
67
68
  "cryptography==38.0.1",
@@ -6,7 +6,7 @@ import inspect
6
6
  import os
7
7
  import logging
8
8
  from datetime import datetime
9
- from typing import Dict, Callable, Any, List, TextIO, Set
9
+ from typing import Dict, Callable, Any, List, TextIO
10
10
  from flask import url_for, Flask
11
11
  from ul_py_tool.commands.cmd import Cmd
12
12
 
@@ -4,7 +4,6 @@ import re
4
4
  import subprocess
5
5
  import sys
6
6
  from datetime import datetime
7
- from typing import Optional
8
7
 
9
8
  from ul_py_tool.commands.cmd import Cmd
10
9
  from ul_py_tool.utils.arg_str2bool import arg_str2bool
@@ -27,7 +26,6 @@ class CmdStart(Cmd):
27
26
  max_requests: int
28
27
  max_requests_jitter: int
29
28
  worker_class: str
30
- statsd_endpoint: Optional[str]
31
29
 
32
30
  @property
33
31
  def app_rel_dir(self) -> str:
@@ -53,7 +51,6 @@ class CmdStart(Cmd):
53
51
  parser.add_argument('--max-requests', dest='max_requests', type=int, default=1000, required=False)
54
52
  parser.add_argument('--max-requests-jitter', dest='max_requests_jitter', type=int, default=50, required=False)
55
53
  parser.add_argument('--worker-class', dest='worker_class', type=str, default='sync', required=False)
56
- parser.add_argument('--statsd_endpoint', dest='statsd_endpoint', type=str, default=None, required=False)
57
54
 
58
55
  def run(self) -> None:
59
56
  env = os.environ.copy()
@@ -87,10 +84,6 @@ class CmdStart(Cmd):
87
84
  *(['--reload'] if debug else ['--preload']),
88
85
  f'{self.app_module}:{self.app_name}',
89
86
  ]
90
-
91
- if self.statsd_endpoint and self.env != ENV_LOCAL:
92
- args.extend([f'--statsd-host={self.statsd_endpoint}', f"--statsd-prefix={self.app_module.split('.')[1]}:{self.env}"])
93
-
94
87
  write_stdout(f'name={name}')
95
88
  write_stdout(f'args={args}')
96
89
  subprocess.run(['gunicorn', '--check-config', '--print-config', *args], cwd=os.getcwd(), stdout=sys.stdout, stderr=sys.stderr, text=True, env=env)
@@ -8,7 +8,6 @@ from base64 import b64decode
8
8
  from datetime import datetime
9
9
  from functools import wraps
10
10
  from typing import List, Union, Callable, Tuple, Any, Optional, TypeVar, cast, Set, TYPE_CHECKING
11
- from ul_api_utils.resources.sockets import socket_io
12
11
  from flask import Response, request, Flask, url_for as flask_url_for, _app_ctx_stack
13
12
  from pydantic import BaseModel
14
13
  from redis.connection import parse_url
@@ -36,6 +35,7 @@ from ul_api_utils.resources.health_check.resource import init_health_check_resou
36
35
  from ul_api_utils.resources.not_implemented import not_implemented_handler
37
36
  from ul_api_utils.resources.permissions import load_permissions
38
37
  from ul_api_utils.resources.rate_limitter import init_rate_limiter
38
+ from ul_api_utils.resources.socketio import init_socketio
39
39
  from ul_api_utils.resources.swagger import load_swagger, ApiSdkResource
40
40
  from ul_api_utils.sentry import sentry
41
41
  from ul_api_utils.utils.api_encoding import ApiEncoding
@@ -50,6 +50,7 @@ from ul_api_utils.utils.load_modules import load_modules_by_template
50
50
  from ul_api_utils.utils.uuid_converter import UUID4Converter
51
51
 
52
52
  if TYPE_CHECKING:
53
+ import flask_socketio # type: ignore # lib without mypy stubs
53
54
  import flask_sqlalchemy
54
55
  from flask_mongoengine import MongoEngine # type: ignore # lib without mypy stubs
55
56
  from ul_db_utils.modules.postgres_modules.db import DbConfig
@@ -105,6 +106,7 @@ class ApiSdk:
105
106
  '_templates_dir',
106
107
  '_fn_registry',
107
108
  '_flask_app_cache',
109
+ '_sio',
108
110
  '_limiter_enabled',
109
111
  '_cache',
110
112
  '_db',
@@ -120,7 +122,7 @@ class ApiSdk:
120
122
  self._flask_app_cache: Optional[Flask] = None
121
123
  self._limiter_enabled = False
122
124
  self._cache = None
123
-
125
+ self._sio: Optional['flask_socketio.SocketIO'] = None
124
126
  self._templates_dir = os.path.join(APPLICATION_DIR, 'templates')
125
127
 
126
128
  self._fn_registry: List[ApiSdkResource] = []
@@ -130,8 +132,14 @@ class ApiSdk:
130
132
  def config(self) -> ApiSdkConfig:
131
133
  return self._config
132
134
 
135
+ @property
136
+ def socket(self) -> 'flask_socketio.SocketIO':
137
+ assert self._sio is not None, "SocketIO is not configured, try adding SocketIOConfig to your ApiSdk first."
138
+ return self._sio
139
+
133
140
  def init_with_flask(self, app_name: str, *, db_config: Optional['MongoDbConfig'] | Optional['DbConfig'] = None) -> Flask:
134
141
  self._initialized_flask_name = try_init(self, app_name)
142
+ self._sio = init_socketio(self._config.server_socketio_config, self._config.client_socketio_config)
135
143
 
136
144
  if db_config is not None and type(db_config).__name__ == 'MongoDbConfig':
137
145
  from ul_db_utils.utils.waiting_for_mongo import waiting_for_mongo
@@ -199,15 +207,6 @@ class ApiSdk:
199
207
 
200
208
  load_swagger(self, self._fn_registry, self._config.api_route_path_prefix)
201
209
 
202
- if self.config.sockets_config:
203
- socket_io.init_app(
204
- self._flask_app,
205
- message_queue=self.config.sockets_config.message_queue,
206
- async_mode=SocketAsyncModesEnum.GEVENT.value,
207
- channel=self.config.sockets_config.channel,
208
- cors_allowed_origins=self.config.sockets_config.cors_allowed_origins,
209
- )
210
-
211
210
  return self._flask_app
212
211
 
213
212
  @property
@@ -255,6 +254,19 @@ class ApiSdk:
255
254
  debugger_enabled=self._debugger_enabled_with_pin,
256
255
  ))
257
256
 
257
+ if self._config.server_socketio_config:
258
+ assert self._sio # mypy
259
+ self._sio.init_app(
260
+ flask_app,
261
+ message_queue=self._config.server_socketio_config.message_queue,
262
+ async_mode=SocketAsyncModesEnum.GEVENT.value,
263
+ channel=self._config.server_socketio_config.channel,
264
+ cors_allowed_origins=self._config.server_socketio_config.cors_allowed_origins,
265
+ logger=self._config.server_socketio_config.logs_enabled,
266
+ engineio_logger=self._config.server_socketio_config.engineio_logs_enabled,
267
+ )
268
+ load_modules_by_template([os.path.join(APPLICATION_DIR, 'sockets', '*')])
269
+
258
270
  return flask_app
259
271
 
260
272
  @property
@@ -1,7 +1,7 @@
1
1
  from enum import Enum
2
- from typing import List, Optional, Callable, Union
2
+ from typing import List, Optional, Callable, Union, Any
3
3
 
4
- from pydantic import BaseModel, Extra
4
+ from pydantic import BaseModel, Extra, root_validator
5
5
 
6
6
  from ul_api_utils.access import PermissionRegistry, PermissionDefinition
7
7
  from ul_api_utils.modules.api_sdk_jwt import ApiSdkJwt
@@ -40,6 +40,8 @@ class SocketIOConfig(BaseModel):
40
40
  message_queue: str
41
41
  channel: Optional[str] = "flask-socketio"
42
42
  cors_allowed_origins: Optional[str] = "*"
43
+ logs_enabled: Optional[bool] = False
44
+ engineio_logs_enabled: Optional[bool] = False
43
45
 
44
46
 
45
47
  class ApiSdkConfig(BaseModel):
@@ -54,7 +56,8 @@ class ApiSdkConfig(BaseModel):
54
56
  http_auth: Optional[ApiSdkHttpAuth] = None
55
57
 
56
58
  static_url_path: Optional[str] = None
57
- sockets_config: Optional[SocketIOConfig] = None
59
+ server_socketio_config: Optional[SocketIOConfig] = None
60
+ client_socketio_config: Optional[SocketIOConfig] = None
58
61
  web_error_template: Optional[str] = None
59
62
 
60
63
  rate_limit: Union[str, List[str]] = '100/minute' # [count (int)] [per|/] [second|minute|hour|day|month|year][s]
@@ -68,6 +71,26 @@ class ApiSdkConfig(BaseModel):
68
71
 
69
72
  api_route_path_prefix: str = '/api'
70
73
 
74
+ @staticmethod
75
+ def validate_socketio(values: dict[str, Any]) -> None:
76
+ """
77
+ ApiSdk instance could be either a Socket.IO server or Socket.IO client.
78
+ Client do not need the flask_app process attached to it, but server does.
79
+
80
+ Client should use the same config as server (message_queue).
81
+ Validate that ApiSdk instance couldn't be a server and a client simultaneously.
82
+ """
83
+ server_conf, client_conf = values.get("server_socketio_config"), values.get("client_socketio_config")
84
+ service = values["service_name"]
85
+ error_msg = f"Can't create ApiSdkConfig for {service}. ApiSdk cannot be a socketio server and client simultaneously"
86
+ if all([server_conf, client_conf]):
87
+ raise AssertionError(error_msg)
88
+
89
+ @root_validator
90
+ def validator(cls, values: dict[str, Any]) -> dict[str, Any]:
91
+ cls.validate_socketio(values)
92
+ return values
93
+
71
94
  class Config:
72
95
  extra = Extra.forbid
73
96
  allow_mutation = False
@@ -0,0 +1,20 @@
1
+ from flask_socketio import SocketIO # type: ignore
2
+
3
+ from ul_api_utils.modules.api_sdk_config import SocketIOConfig, SocketAsyncModesEnum
4
+
5
+
6
+ def init_socketio(server_config: SocketIOConfig | None, client_config: SocketIOConfig | None) -> SocketIO | None:
7
+ socketio = None
8
+ if server_config is not None:
9
+ socketio = SocketIO()
10
+
11
+ if client_config is not None:
12
+ socketio = SocketIO(
13
+ message_queue=client_config.message_queue,
14
+ async_mode=SocketAsyncModesEnum.GEVENT.value,
15
+ channel=client_config.channel,
16
+ cors_allowed_origins=client_config.cors_allowed_origins,
17
+ logger=client_config.logs_enabled,
18
+ engineio_logger=client_config.engineio_logs_enabled,
19
+ )
20
+ return socketio
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ul-api-utils
3
- Version: 7.10.1
3
+ Version: 7.10.3
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
6
  Author-email:
@@ -10,6 +10,12 @@ example/rate_limit_load.py
10
10
  example/models/__init__.py
11
11
  example/routes/__init__.py
12
12
  example/routes/api_some.py
13
+ example/sockets/__init__.py
14
+ example/sockets/on_connect.py
15
+ example/sockets/on_disconnect.py
16
+ example/sockets/on_json.py
17
+ example/sockets/on_message.py
18
+ example/sockets/on_open.py
13
19
  example/workers/__init__.py
14
20
  example/workers/worker.py
15
21
  ul_api_utils/__init__.py
@@ -81,7 +87,7 @@ ul_api_utils/resources/debugger_scripts.py
81
87
  ul_api_utils/resources/not_implemented.py
82
88
  ul_api_utils/resources/permissions.py
83
89
  ul_api_utils/resources/rate_limitter.py
84
- ul_api_utils/resources/sockets.py
90
+ ul_api_utils/resources/socketio.py
85
91
  ul_api_utils/resources/swagger.py
86
92
  ul_api_utils/resources/health_check/__init__.py
87
93
  ul_api_utils/resources/health_check/const.py
@@ -12,6 +12,7 @@ pycryptodome==3.15.0
12
12
  pyjwt==2.4.0
13
13
  gunicorn==20.1.0
14
14
  gevent==24.2.1
15
+ gevent-websocket==0.10.1
15
16
  pyyaml==6.0
16
17
  requests==2.28.1
17
18
  cryptography==38.0.1
@@ -1,3 +0,0 @@
1
- from flask_socketio import SocketIO # type: ignore
2
-
3
- socket_io = SocketIO()
File without changes
File without changes
File without changes