ul-api-utils 7.9.5__py3-none-any.whl → 7.9.6__py3-none-any.whl

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

Potentially problematic release.


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

example/conf.py CHANGED
@@ -10,6 +10,8 @@ from example.permissions import permissions
10
10
  sdk = ApiSdk(ApiSdkConfig(
11
11
  sockets_config=SocketIOConfig(
12
12
  message_queue='redis://localhost:16379',
13
+ logs_enabled=True,
14
+ engineio_logs_enabled=False,
13
15
  ),
14
16
  service_name='example_service',
15
17
  permissions=permissions,
example/main.py CHANGED
@@ -1,3 +1,7 @@
1
+ # from gevent import monkey
2
+ #
3
+ # monkey.patch_all()
4
+
1
5
  import os
2
6
 
3
7
  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))
File without changes
@@ -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
@@ -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
 
@@ -8,7 +8,7 @@ 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
11
+ from flask_socketio import SocketIO # type: ignore
12
12
  from flask import Response, request, Flask, url_for as flask_url_for, _app_ctx_stack
13
13
  from pydantic import BaseModel
14
14
  from redis.connection import parse_url
@@ -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
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,7 +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:
141
+ if self.config.sockets_config:
142
+ self._sio = SocketIO()
134
143
  self._initialized_flask_name = try_init(self, app_name)
135
144
 
136
145
  if db_config is not None and type(db_config).__name__ == 'MongoDbConfig':
@@ -199,17 +208,6 @@ class ApiSdk:
199
208
 
200
209
  load_swagger(self, self._fn_registry, self._config.api_route_path_prefix)
201
210
 
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
- logger=self.config.sockets_config.logs_enabled,
210
- engineio_logger=self.config.sockets_config.engineio_logs_enabled,
211
- )
212
-
213
211
  return self._flask_app
214
212
 
215
213
  @property
@@ -257,6 +255,19 @@ class ApiSdk:
257
255
  debugger_enabled=self._debugger_enabled_with_pin,
258
256
  ))
259
257
 
258
+ if self.config.sockets_config:
259
+ assert self._sio # mypy
260
+ self._sio.init_app(
261
+ flask_app,
262
+ message_queue=self.config.sockets_config.message_queue,
263
+ async_mode=SocketAsyncModesEnum.GEVENT.value,
264
+ channel=self.config.sockets_config.channel,
265
+ cors_allowed_origins=self.config.sockets_config.cors_allowed_origins,
266
+ logger=self.config.sockets_config.logs_enabled,
267
+ engineio_logger=self.config.sockets_config.engineio_logs_enabled,
268
+ )
269
+ load_modules_by_template([os.path.join(APPLICATION_DIR, 'sockets', '*')])
270
+
260
271
  return flask_app
261
272
 
262
273
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ul-api-utils
3
- Version: 7.9.5
3
+ Version: 7.9.6
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
6
  Author-email:
@@ -1,12 +1,18 @@
1
1
  example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- example/conf.py,sha256=tdt3X2gLdTDf_0oMErMpAqqYjIEhpmG5GrOLHqzJH7Y,1018
3
- example/main.py,sha256=8jOO1VliFr92UoCLDInzSDPRLluzPuO-MMkzHc5Xd2w,419
2
+ example/conf.py,sha256=3dAGM78iFiMhrhgFJjn9xkqLjOpOPITRoYYSILaYXAA,1082
3
+ example/main.py,sha256=y24aWpD4d3d9HIn8Gx2wE_5-MJeiv--iVe5FeRSWAcg,471
4
4
  example/permissions.py,sha256=i8_zOOPdra3oMXZfyTspewRYNdn21PCqOD1ATG69Itk,277
5
5
  example/pure_flask_example.py,sha256=A7cbcjTr28FS1sVNAsQbj1N9EgEFIXDB4aRwOV6_tbU,1329
6
6
  example/rate_limit_load.py,sha256=U2Bgp8UztT4TNKdv9NVioxWfE68aCsC7uKz7xPCy6XM,225
7
7
  example/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  example/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- example/routes/api_some.py,sha256=Gkyb3r1AT7Fg8cAhJk7StTS5aGb-vylvyEuXx7g3Yc4,13316
9
+ example/routes/api_some.py,sha256=fnFO1uFQx-oypCqPNkUfueABrTsAWLdB5spRnhWSZ58,12790
10
+ example/sockets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ example/sockets/on_connect.py,sha256=3sluHnVT_-e2Oa4YsRZUJIc2L4VnMSJu5rgI_mkg8BQ,411
12
+ example/sockets/on_disconnect.py,sha256=ev0uJutqmTSsbrBcQIRudBX-6g7uSmZj8Imuf6pVIMU,277
13
+ example/sockets/on_json.py,sha256=sTh0Pqu5iITmnRRjc6-rns1VFlEN_xo33_4lUF5VzNk,200
14
+ example/sockets/on_message.py,sha256=Lj0kxEQc3UiQ9Y5_G8_fA48i5eJneEk8Bb2CYNASGc0,168
15
+ example/sockets/on_open.py,sha256=1xfgVqoTuOPxHyBC_rFuj60096gjgbg6rNfCvUqUN8A,405
10
16
  example/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
17
  example/workers/worker.py,sha256=flMYq50OhLtNSaA2qyDJSMeXSNXIqhdBIsaxcmO5-xQ,681
12
18
  ul_api_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -33,7 +39,7 @@ ul_api_utils/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
33
39
  ul_api_utils/commands/cmd_enc_keys.py,sha256=-Tblh6lI7G6M5YVwbVQqZmXhBMiIpB3a7b0Lv1MFufk,8453
34
40
  ul_api_utils/commands/cmd_gen_api_user_token.py,sha256=Vg7oEYHvof7DSLat9yJ_k5AYL9ZOC4Jvd38DBn5U-R0,2730
35
41
  ul_api_utils/commands/cmd_gen_new_api_user.py,sha256=ICZbKqz2D6DRvjwtNM08rNjIlWN3qClcUQw5L8FxRBY,4549
36
- ul_api_utils/commands/cmd_generate_api_docs.py,sha256=cEBUOkn8iQIir78yXzHK_gy_hna2cP58x8N5DzCeZEA,9617
42
+ ul_api_utils/commands/cmd_generate_api_docs.py,sha256=pafX88RjcSMFruSk6qy8Xfao3MXo1yolI4rkC_bmMSQ,9612
37
43
  ul_api_utils/commands/cmd_start.py,sha256=aMz6o6HBzLxWrNpV2_rayQ7Nb-VX3-DHgzOUk39R7NA,3623
38
44
  ul_api_utils/commands/cmd_worker_start.py,sha256=1tt4_mL8T8_q7i1bqnfjPSkSYlRNNNp8eJ-5rTYj36w,2593
39
45
  ul_api_utils/commands/start/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -57,7 +63,7 @@ ul_api_utils/internal_api/__tests__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQ
57
63
  ul_api_utils/internal_api/__tests__/internal_api.py,sha256=X2iopeso6vryszeeA__lcqXQVtz3Nwt3ngH7M4OuN1U,1116
58
64
  ul_api_utils/internal_api/__tests__/internal_api_content_type.py,sha256=mfiYPkzKtfZKFpi4RSnWAoCd6mRijr6sFsa2TF-s5t8,749
59
65
  ul_api_utils/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- ul_api_utils/modules/api_sdk.py,sha256=tXjHuoJk2wb-uGnHEdiX_3Axmus4xy31d372sQ5J5_E,25806
66
+ ul_api_utils/modules/api_sdk.py,sha256=XINEiQ_-f4E1xtlBSQz06plaKnOPCHEYBAW81_EROiM,26306
61
67
  ul_api_utils/modules/api_sdk_config.py,sha256=_yxctcD5TyTblMuLjBDna61ANGH49C8v-lnUUH939pE,2480
62
68
  ul_api_utils/modules/api_sdk_jwt.py,sha256=2XRfb0LxHUnldSL67S60v1uyoDpVPNaq4zofUtkeg88,15112
63
69
  ul_api_utils/modules/intermediate_state.py,sha256=7ZZ3Sypbb8LaSfrVhaXaWRDnj8oyy26NUbmFK7vr-y4,1270
@@ -72,7 +78,6 @@ ul_api_utils/resources/debugger_scripts.py,sha256=qqf6zeJ1aE_STNYX1j9-ZfBgB_jcQo
72
78
  ul_api_utils/resources/not_implemented.py,sha256=OQE5LGA4KqZDwP5Wtub3Aw-icwzbqCSKcEFoFp4w7_k,973
73
79
  ul_api_utils/resources/permissions.py,sha256=8c8cEPkm69zxgXbDiwUkW6Mi_496-MZXbPOxHITetKs,1436
74
80
  ul_api_utils/resources/rate_limitter.py,sha256=QMpaLu1LoFbvtIEhxF8HbAZIAW4oGKTClt7XEUsqx98,3358
75
- ul_api_utils/resources/sockets.py,sha256=gftL6QR762GetSrm8Yjh9kfoMAwH64ijqOBexXBz0BY,76
76
81
  ul_api_utils/resources/swagger.py,sha256=fK8S9X4YCSqe_weCzV_BcMPoL_NR073BsGUzn2ImbHI,5391
77
82
  ul_api_utils/resources/health_check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
83
  ul_api_utils/resources/health_check/const.py,sha256=QzVZP_ZKmVKleUACiOGjzP-v54FD7tEN6NEF4Jb50Ow,78
@@ -135,9 +140,9 @@ ul_api_utils/validators/validate_empty_object.py,sha256=3Ck_iwyJE_M5e7l6s1i88aqb
135
140
  ul_api_utils/validators/validate_uuid.py,sha256=EfvlRirv2EW0Z6w3s8E8rUa9GaI8qXZkBWhnPs8NFrA,257
136
141
  ul_api_utils/validators/__tests__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
142
  ul_api_utils/validators/__tests__/test_custom_fields.py,sha256=QLZ7DFta01Z7DOK9Z5Iq4uf_CmvDkVReis-GAl_QN48,1447
138
- ul_api_utils-7.9.5.dist-info/LICENSE,sha256=6Qo8OdcqI8aGrswJKJYhST-bYqxVQBQ3ujKdTSdq-80,1062
139
- ul_api_utils-7.9.5.dist-info/METADATA,sha256=VhYmob9m6kll54j9kOu24GfDSIkrc3DZNQUZnouD0Cs,14671
140
- ul_api_utils-7.9.5.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
141
- ul_api_utils-7.9.5.dist-info/entry_points.txt,sha256=8tL3ySHWTyJMuV1hx1fHfN8zumDVOCOm63w3StphkXg,53
142
- ul_api_utils-7.9.5.dist-info/top_level.txt,sha256=1XsW8iOSFaH4LOzDcnNyxHpHrbKU3fSn-aIAxe04jmw,21
143
- ul_api_utils-7.9.5.dist-info/RECORD,,
143
+ ul_api_utils-7.9.6.dist-info/LICENSE,sha256=6Qo8OdcqI8aGrswJKJYhST-bYqxVQBQ3ujKdTSdq-80,1062
144
+ ul_api_utils-7.9.6.dist-info/METADATA,sha256=8kshvCkfnMTP55YXHYow-_2UOPleFmFg6L79FMnVl8g,14671
145
+ ul_api_utils-7.9.6.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
146
+ ul_api_utils-7.9.6.dist-info/entry_points.txt,sha256=8tL3ySHWTyJMuV1hx1fHfN8zumDVOCOm63w3StphkXg,53
147
+ ul_api_utils-7.9.6.dist-info/top_level.txt,sha256=1XsW8iOSFaH4LOzDcnNyxHpHrbKU3fSn-aIAxe04jmw,21
148
+ ul_api_utils-7.9.6.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- from flask_socketio import SocketIO # type: ignore
2
-
3
- socket_io = SocketIO()