ul-api-utils 7.10.2__py3-none-any.whl → 7.10.3__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 +8 -1
- example/main.py +5 -0
- example/routes/api_some.py +1 -22
- example/sockets/__init__.py +0 -0
- example/sockets/on_connect.py +16 -0
- example/sockets/on_disconnect.py +14 -0
- example/sockets/on_json.py +10 -0
- example/sockets/on_message.py +9 -0
- example/sockets/on_open.py +16 -0
- ul_api_utils/commands/cmd_generate_api_docs.py +1 -1
- ul_api_utils/commands/cmd_start.py +0 -7
- ul_api_utils/modules/api_sdk.py +23 -11
- ul_api_utils/modules/api_sdk_config.py +26 -3
- ul_api_utils/resources/socketio.py +20 -0
- {ul_api_utils-7.10.2.dist-info → ul_api_utils-7.10.3.dist-info}/METADATA +2 -1
- {ul_api_utils-7.10.2.dist-info → ul_api_utils-7.10.3.dist-info}/RECORD +20 -14
- ul_api_utils/resources/sockets.py +0 -3
- {ul_api_utils-7.10.2.dist-info → ul_api_utils-7.10.3.dist-info}/LICENSE +0 -0
- {ul_api_utils-7.10.2.dist-info → ul_api_utils-7.10.3.dist-info}/WHEEL +0 -0
- {ul_api_utils-7.10.2.dist-info → ul_api_utils-7.10.3.dist-info}/entry_points.txt +0 -0
- {ul_api_utils-7.10.2.dist-info → ul_api_utils-7.10.3.dist-info}/top_level.txt +0 -0
example/conf.py
CHANGED
|
@@ -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
|
-
|
|
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',
|
example/main.py
CHANGED
example/routes/api_some.py
CHANGED
|
@@ -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
|
|
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,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
|
|
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)
|
ul_api_utils/modules/api_sdk.py
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
3
|
+
Version: 7.10.3
|
|
4
4
|
Summary: Python api utils
|
|
5
5
|
Author: Unic-lab
|
|
6
6
|
Author-email:
|
|
@@ -30,6 +30,7 @@ Requires-Dist: pycryptodome (==3.15.0)
|
|
|
30
30
|
Requires-Dist: pyjwt (==2.4.0)
|
|
31
31
|
Requires-Dist: gunicorn (==20.1.0)
|
|
32
32
|
Requires-Dist: gevent (==24.2.1)
|
|
33
|
+
Requires-Dist: gevent-websocket (==0.10.1)
|
|
33
34
|
Requires-Dist: pyyaml (==6.0)
|
|
34
35
|
Requires-Dist: requests (==2.28.1)
|
|
35
36
|
Requires-Dist: cryptography (==38.0.1)
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
example/conf.py,sha256=
|
|
3
|
-
example/main.py,sha256=
|
|
2
|
+
example/conf.py,sha256=RbeEQ7xIlPblhUpRtLVYDxod3Z4WHE9ddgCpOcGRfaQ,1263
|
|
3
|
+
example/main.py,sha256=KKMrcJLrIk_6DlK_iMZ2XMUYVoYtX_Rpl5fxF189x1g,541
|
|
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=
|
|
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,8 +39,8 @@ 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=
|
|
37
|
-
ul_api_utils/commands/cmd_start.py,sha256=
|
|
42
|
+
ul_api_utils/commands/cmd_generate_api_docs.py,sha256=pafX88RjcSMFruSk6qy8Xfao3MXo1yolI4rkC_bmMSQ,9612
|
|
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
|
|
40
46
|
ul_api_utils/commands/start/gunicorn.conf.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -57,8 +63,8 @@ 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=
|
|
61
|
-
ul_api_utils/modules/api_sdk_config.py,sha256=
|
|
66
|
+
ul_api_utils/modules/api_sdk.py,sha256=xwyzY19KpLNVSXXdc8ICUSMxKSrrNd6fZj77VDaGQjQ,26441
|
|
67
|
+
ul_api_utils/modules/api_sdk_config.py,sha256=mcDKud-hneOO0GR7HMiLoY2BZb1iI38WnHouYi2uxT0,3502
|
|
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
|
|
64
70
|
ul_api_utils/modules/worker_context.py,sha256=jGjopeuYuTtIDmsrqK7TcbTD-E81t8OWvWS1JpTC6b0,802
|
|
@@ -72,7 +78,7 @@ 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/
|
|
81
|
+
ul_api_utils/resources/socketio.py,sha256=WnRrg8Lkw8YSGwUIXnOqRtJpCjfYevPO7TES_uDpQbo,769
|
|
76
82
|
ul_api_utils/resources/swagger.py,sha256=fK8S9X4YCSqe_weCzV_BcMPoL_NR073BsGUzn2ImbHI,5391
|
|
77
83
|
ul_api_utils/resources/health_check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
78
84
|
ul_api_utils/resources/health_check/const.py,sha256=QzVZP_ZKmVKleUACiOGjzP-v54FD7tEN6NEF4Jb50Ow,78
|
|
@@ -135,9 +141,9 @@ ul_api_utils/validators/validate_empty_object.py,sha256=3Ck_iwyJE_M5e7l6s1i88aqb
|
|
|
135
141
|
ul_api_utils/validators/validate_uuid.py,sha256=EfvlRirv2EW0Z6w3s8E8rUa9GaI8qXZkBWhnPs8NFrA,257
|
|
136
142
|
ul_api_utils/validators/__tests__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
137
143
|
ul_api_utils/validators/__tests__/test_custom_fields.py,sha256=QLZ7DFta01Z7DOK9Z5Iq4uf_CmvDkVReis-GAl_QN48,1447
|
|
138
|
-
ul_api_utils-7.10.
|
|
139
|
-
ul_api_utils-7.10.
|
|
140
|
-
ul_api_utils-7.10.
|
|
141
|
-
ul_api_utils-7.10.
|
|
142
|
-
ul_api_utils-7.10.
|
|
143
|
-
ul_api_utils-7.10.
|
|
144
|
+
ul_api_utils-7.10.3.dist-info/LICENSE,sha256=6Qo8OdcqI8aGrswJKJYhST-bYqxVQBQ3ujKdTSdq-80,1062
|
|
145
|
+
ul_api_utils-7.10.3.dist-info/METADATA,sha256=JZ0gasetZcnY5NusWscUpZIdRJE-Yrv7YdVEga1jdvc,14715
|
|
146
|
+
ul_api_utils-7.10.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
|
147
|
+
ul_api_utils-7.10.3.dist-info/entry_points.txt,sha256=8tL3ySHWTyJMuV1hx1fHfN8zumDVOCOm63w3StphkXg,53
|
|
148
|
+
ul_api_utils-7.10.3.dist-info/top_level.txt,sha256=1XsW8iOSFaH4LOzDcnNyxHpHrbKU3fSn-aIAxe04jmw,21
|
|
149
|
+
ul_api_utils-7.10.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|