arpakitlib 1.7.43__py3-none-any.whl → 1.7.45__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.
- arpakitlib/_arpakit_project_template/example.env +1 -0
- arpakitlib/_arpakit_project_template/manage/settings_generate_env_example.py +2 -4
- arpakitlib/_arpakit_project_template/src/api/const.py +9 -0
- arpakitlib/_arpakit_project_template/src/api/create_api_app.py +3 -3
- arpakitlib/_arpakit_project_template/src/operation_execution/const.py +9 -0
- arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +2 -2
- arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +18 -6
- arpakitlib/_arpakit_project_template/src/operation_execution/{start_operation_executor_for_dev.py → start_operation_executor_for_dev_.py} +2 -2
- arpakitlib/_arpakit_project_template/src/operation_execution/{start_create_scheduled_operation_worker.py → start_scheduled_operation_creator_for_dev.py} +2 -2
- arpakitlib/ar_enumeration_util.py +11 -0
- arpakitlib/ar_fastapi_util.py +23 -28
- arpakitlib/ar_operation_execution_util.py +50 -8
- arpakitlib/ar_settings_util.py +9 -2
- arpakitlib/ar_type_util.py +6 -0
- {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/METADATA +1 -1
- {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/RECORD +20 -18
- {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/LICENSE +0 -0
- {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/NOTICE +0 -0
- {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/WHEEL +0 -0
- {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/entry_points.txt +0 -0
@@ -5,10 +5,8 @@ from src.core.settings import Settings
|
|
5
5
|
|
6
6
|
|
7
7
|
def command():
|
8
|
-
|
9
|
-
|
10
|
-
with open(os.path.join(BASE_DIRPATH, "example.env"), mode="w") as f:
|
11
|
-
f.write(env_example)
|
8
|
+
print(Settings.generate_env_example())
|
9
|
+
Settings.save_env_example_to_file(filepath=os.path.join(BASE_DIRPATH, "example.env"))
|
12
10
|
|
13
11
|
|
14
12
|
if __name__ == '__main__':
|
@@ -4,7 +4,7 @@ from arpakitlib.ar_base_worker_util import BaseWorker
|
|
4
4
|
from arpakitlib.ar_fastapi_util import create_fastapi_app, InitSqlalchemyDBStartupAPIEvent, InitFileStoragesInDir, \
|
5
5
|
create_handle_exception, create_story_log_before_response_in_handle_exception, _DEFAULT_CONTACT, \
|
6
6
|
SafeRunWorkerStartupAPIEvent
|
7
|
-
from arpakitlib.ar_operation_execution_util import
|
7
|
+
from arpakitlib.ar_operation_execution_util import OperationExecutorWorker, ScheduledOperationCreatorWorker
|
8
8
|
from arpakitlib.ar_sqlalchemy_util import SQLAlchemyDB
|
9
9
|
from arpakitlib.ar_type_util import raise_for_type
|
10
10
|
from src.api.event import StartupAPIEvent, ShutdownAPIEvent
|
@@ -60,7 +60,7 @@ def create_api_app() -> FastAPI:
|
|
60
60
|
startup_api_events.append(
|
61
61
|
SafeRunWorkerStartupAPIEvent(
|
62
62
|
workers=[
|
63
|
-
|
63
|
+
OperationExecutorWorker(
|
64
64
|
sqlalchemy_db=sqlalchemy_db,
|
65
65
|
operation_executor=OperationExecutor(sqlalchemy_db=sqlalchemy_db),
|
66
66
|
filter_operation_types=None
|
@@ -75,7 +75,7 @@ def create_api_app() -> FastAPI:
|
|
75
75
|
startup_api_events.append(
|
76
76
|
SafeRunWorkerStartupAPIEvent(
|
77
77
|
workers=[
|
78
|
-
|
78
|
+
ScheduledOperationCreatorWorker(
|
79
79
|
sqlalchemy_db=sqlalchemy_db,
|
80
80
|
scheduled_operations=ALL_SCHEDULED_OPERATIONS
|
81
81
|
)
|
@@ -4,11 +4,11 @@ from arpakitlib.ar_sqlalchemy_model_util import OperationDBM
|
|
4
4
|
|
5
5
|
class OperationExecutor(BaseOperationExecutor):
|
6
6
|
def sync_execute_operation(self, operation_dbm: OperationDBM) -> OperationDBM:
|
7
|
-
operation_dbm = super().sync_execute_operation(operation_dbm=operation_dbm)
|
8
7
|
# ...
|
8
|
+
operation_dbm = super().sync_execute_operation(operation_dbm=operation_dbm)
|
9
9
|
return operation_dbm
|
10
10
|
|
11
11
|
async def async_execute_operation(self, operation_dbm: OperationDBM) -> OperationDBM:
|
12
|
-
operation_dbm = await super().async_execute_operation(operation_dbm=operation_dbm)
|
13
12
|
# ...
|
13
|
+
operation_dbm = await super().async_execute_operation(operation_dbm=operation_dbm)
|
14
14
|
return operation_dbm
|
@@ -1,13 +1,25 @@
|
|
1
|
-
from datetime import timedelta
|
1
|
+
from datetime import timedelta, time
|
2
2
|
|
3
|
-
from arpakitlib.ar_operation_execution_util import ScheduledOperation,
|
3
|
+
from arpakitlib.ar_operation_execution_util import ScheduledOperation, every_timedelta_is_time_func, \
|
4
|
+
between_different_times_is_time_func
|
4
5
|
from arpakitlib.ar_sqlalchemy_model_util import BaseOperationTypes
|
5
6
|
|
6
7
|
ALL_SCHEDULED_OPERATIONS = []
|
7
8
|
|
8
|
-
|
9
|
+
healthcheck_1_scheduled_operation = ScheduledOperation(
|
9
10
|
type=BaseOperationTypes.healthcheck_,
|
10
|
-
input_data={},
|
11
|
-
is_time_func=
|
11
|
+
input_data={"healthcheck_1": "healthcheck_1"},
|
12
|
+
is_time_func=every_timedelta_is_time_func(td=timedelta(seconds=15))
|
12
13
|
)
|
13
|
-
ALL_SCHEDULED_OPERATIONS.append(
|
14
|
+
ALL_SCHEDULED_OPERATIONS.append(healthcheck_1_scheduled_operation)
|
15
|
+
|
16
|
+
healthcheck_2_scheduled_operation = ScheduledOperation(
|
17
|
+
type=BaseOperationTypes.healthcheck_,
|
18
|
+
input_data={"healthcheck_2": "healthcheck_2"},
|
19
|
+
is_time_func=between_different_times_is_time_func(
|
20
|
+
from_time=time(hour=12, minute=0),
|
21
|
+
to_time=time(hour=12, minute=15)
|
22
|
+
),
|
23
|
+
timeout_after_creation=timedelta(seconds=60)
|
24
|
+
)
|
25
|
+
ALL_SCHEDULED_OPERATIONS.append(healthcheck_2_scheduled_operation)
|
@@ -1,11 +1,11 @@
|
|
1
|
-
from arpakitlib.ar_operation_execution_util import
|
1
|
+
from arpakitlib.ar_operation_execution_util import OperationExecutorWorker
|
2
2
|
from src.core.util import get_cached_sqlalchemy_db, setup_logging
|
3
3
|
from src.operation_execution.operation_executor import OperationExecutor
|
4
4
|
|
5
5
|
|
6
6
|
def start_operation_executor_for_dev():
|
7
7
|
setup_logging()
|
8
|
-
worker =
|
8
|
+
worker = OperationExecutorWorker(
|
9
9
|
sqlalchemy_db=get_cached_sqlalchemy_db(),
|
10
10
|
operation_executor=OperationExecutor(sqlalchemy_db=get_cached_sqlalchemy_db()),
|
11
11
|
filter_operation_types=None
|
@@ -1,11 +1,11 @@
|
|
1
|
-
from arpakitlib.ar_operation_execution_util import
|
1
|
+
from arpakitlib.ar_operation_execution_util import ScheduledOperationCreatorWorker
|
2
2
|
from src.core.util import get_cached_sqlalchemy_db, setup_logging
|
3
3
|
from src.operation_execution.scheduled_operations import ALL_SCHEDULED_OPERATIONS
|
4
4
|
|
5
5
|
|
6
6
|
def start_create_scheduled_operation_worker_for_dev():
|
7
7
|
setup_logging()
|
8
|
-
worker =
|
8
|
+
worker = ScheduledOperationCreatorWorker(
|
9
9
|
sqlalchemy_db=get_cached_sqlalchemy_db(),
|
10
10
|
scheduled_operations=ALL_SCHEDULED_OPERATIONS
|
11
11
|
)
|
@@ -69,6 +69,17 @@ class Enumeration:
|
|
69
69
|
def parse_and_validate_values(cls, *values: ValuesForParseType) -> list[ValueType]:
|
70
70
|
return cls.parse_values(*values, validate=True)
|
71
71
|
|
72
|
+
@classmethod
|
73
|
+
def str_for_print(cls) -> str:
|
74
|
+
res = f"{cls.__name__} (len={len(cls.values_list())})"
|
75
|
+
for v in cls.values_list():
|
76
|
+
res += f"\n- {v}"
|
77
|
+
return res.strip()
|
78
|
+
|
79
|
+
@classmethod
|
80
|
+
def print(cls):
|
81
|
+
print(cls.str_for_print())
|
82
|
+
|
72
83
|
|
73
84
|
def __example():
|
74
85
|
pass
|
arpakitlib/ar_fastapi_util.py
CHANGED
@@ -68,13 +68,14 @@ class SimpleSO(BaseSO):
|
|
68
68
|
creation_dt: datetime
|
69
69
|
|
70
70
|
|
71
|
-
class
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
class BaseAPIErrorCodes(Enumeration):
|
72
|
+
cannot_authorize = "CANNOT_AUTHORIZE"
|
73
|
+
unknown_error = "UNKNOWN_ERROR"
|
74
|
+
error_in_request = "ERROR_IN_REQUEST"
|
75
|
+
not_found = "NOT_FOUND"
|
76
|
+
|
77
77
|
|
78
|
+
class ErrorSO(BaseSO):
|
78
79
|
has_error: bool = True
|
79
80
|
error_code: str | None = None
|
80
81
|
error_code_specification: str | None = None
|
@@ -118,7 +119,7 @@ class APIException(fastapi.exceptions.HTTPException):
|
|
118
119
|
self,
|
119
120
|
*,
|
120
121
|
status_code: int = starlette.status.HTTP_400_BAD_REQUEST,
|
121
|
-
error_code: str | None =
|
122
|
+
error_code: str | None = BaseAPIErrorCodes.unknown_error,
|
122
123
|
error_code_specification: str | None = None,
|
123
124
|
error_description: str | None = None,
|
124
125
|
error_data: dict[str, Any] | None = None
|
@@ -165,7 +166,7 @@ def create_handle_exception(
|
|
165
166
|
|
166
167
|
error_so = ErrorSO(
|
167
168
|
has_error=True,
|
168
|
-
error_code=
|
169
|
+
error_code=BaseAPIErrorCodes.unknown_error,
|
169
170
|
error_data={
|
170
171
|
"exception_type": str(type(exception)),
|
171
172
|
"exception_str": str(exception),
|
@@ -183,10 +184,10 @@ def create_handle_exception(
|
|
183
184
|
elif isinstance(exception, starlette.exceptions.HTTPException):
|
184
185
|
status_code = exception.status_code
|
185
186
|
if status_code in (starlette.status.HTTP_403_FORBIDDEN, starlette.status.HTTP_401_UNAUTHORIZED):
|
186
|
-
error_so.error_code =
|
187
|
+
error_so.error_code = BaseAPIErrorCodes.cannot_authorize
|
187
188
|
_need_exc_info = False
|
188
189
|
elif status_code == starlette.status.HTTP_404_NOT_FOUND:
|
189
|
-
error_so.error_code =
|
190
|
+
error_so.error_code = BaseAPIErrorCodes.not_found
|
190
191
|
_need_exc_info = False
|
191
192
|
else:
|
192
193
|
status_code = starlette.status.HTTP_500_INTERNAL_SERVER_ERROR
|
@@ -196,14 +197,14 @@ def create_handle_exception(
|
|
196
197
|
|
197
198
|
elif isinstance(exception, fastapi.exceptions.RequestValidationError):
|
198
199
|
status_code = starlette.status.HTTP_422_UNPROCESSABLE_ENTITY
|
199
|
-
error_so.error_code =
|
200
|
+
error_so.error_code = BaseAPIErrorCodes.error_in_request
|
200
201
|
with suppress(Exception):
|
201
202
|
error_so.error_data["exception.errors"] = str(exception.errors()) if exception.errors() else {}
|
202
203
|
_need_exc_info = False
|
203
204
|
|
204
205
|
else:
|
205
206
|
status_code = starlette.status.HTTP_500_INTERNAL_SERVER_ERROR
|
206
|
-
error_so.error_code =
|
207
|
+
error_so.error_code = BaseAPIErrorCodes.unknown_error
|
207
208
|
_logger.exception(exception)
|
208
209
|
_need_exc_info = True
|
209
210
|
|
@@ -512,14 +513,14 @@ def base_api_auth(
|
|
512
513
|
if require_api_key_string and not api_auth_data.api_key_string:
|
513
514
|
raise APIException(
|
514
515
|
status_code=starlette.status.HTTP_401_UNAUTHORIZED,
|
515
|
-
error_code=
|
516
|
+
error_code=BaseAPIErrorCodes.cannot_authorize,
|
516
517
|
error_data=safely_transfer_to_json_str_to_json_obj(api_auth_data.model_dump())
|
517
518
|
)
|
518
519
|
|
519
520
|
if require_token_string and not api_auth_data.token_string:
|
520
521
|
raise APIException(
|
521
522
|
status_code=starlette.status.HTTP_401_UNAUTHORIZED,
|
522
|
-
error_code=
|
523
|
+
error_code=BaseAPIErrorCodes.cannot_authorize,
|
523
524
|
error_data=safely_transfer_to_json_str_to_json_obj(api_auth_data.model_dump())
|
524
525
|
)
|
525
526
|
|
@@ -537,37 +538,31 @@ def is_api_key_correct_api_auth(
|
|
537
538
|
validate_api_key_func: Callable | None = None,
|
538
539
|
correct_api_key: str | None = None
|
539
540
|
):
|
540
|
-
require_api_key_string = True
|
541
|
-
|
542
541
|
if correct_api_key is not None:
|
543
|
-
validate_api_key_func = lambda **kwargs: kwargs["api_key_string"] == correct_api_key
|
544
|
-
|
542
|
+
validate_api_key_func = lambda *args, **kwargs: kwargs["api_key_string"] == correct_api_key
|
545
543
|
raise_if_none(validate_api_key_func)
|
546
544
|
|
547
545
|
async def func(
|
548
546
|
*,
|
549
547
|
base_api_auth_data: BaseAPIAuthData = Depends(base_api_auth(
|
550
|
-
require_api_key_string=
|
548
|
+
require_api_key_string=True,
|
551
549
|
require_token_string=False
|
552
550
|
)),
|
553
551
|
transmitted_api_data: BaseTransmittedAPIData = Depends(get_transmitted_api_data),
|
554
552
|
request: starlette.requests.Request
|
555
553
|
) -> CheckAPIKeyAPIAuthData:
|
556
554
|
check_api_key_api_auth_data = CheckAPIKeyAPIAuthData.model_validate(base_api_auth_data)
|
557
|
-
check_api_key_api_auth_data.is_api_key_correct = (
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
request=request
|
563
|
-
)
|
564
|
-
if validate_api_key_func is not None else None
|
555
|
+
check_api_key_api_auth_data.is_api_key_correct = validate_api_key_func(
|
556
|
+
api_key_string=base_api_auth_data.api_key_string,
|
557
|
+
base_api_auth_data=base_api_auth_data,
|
558
|
+
transmitted_api_data=transmitted_api_data,
|
559
|
+
request=request
|
565
560
|
)
|
566
561
|
|
567
562
|
if not check_api_key_api_auth_data.is_api_key_correct:
|
568
563
|
raise APIException(
|
569
564
|
status_code=starlette.status.HTTP_401_UNAUTHORIZED,
|
570
|
-
error_code=
|
565
|
+
error_code=BaseAPIErrorCodes.cannot_authorize,
|
571
566
|
error_data=safely_transfer_to_json_str_to_json_obj(check_api_key_api_auth_data.model_dump())
|
572
567
|
)
|
573
568
|
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
5
5
|
import asyncio
|
6
6
|
import logging
|
7
7
|
import traceback
|
8
|
-
from datetime import timedelta
|
8
|
+
from datetime import timedelta, time
|
9
9
|
from typing import Any, Callable
|
10
10
|
|
11
11
|
from pydantic import ConfigDict
|
@@ -16,6 +16,7 @@ from sqlalchemy.orm import Session
|
|
16
16
|
from arpakitlib.ar_base_worker_util import BaseWorker
|
17
17
|
from arpakitlib.ar_datetime_util import now_utc_dt
|
18
18
|
from arpakitlib.ar_dict_util import combine_dicts
|
19
|
+
from arpakitlib.ar_sleep_util import sync_safe_sleep, async_safe_sleep
|
19
20
|
from arpakitlib.ar_sqlalchemy_model_util import OperationDBM, StoryLogDBM, BaseOperationTypes
|
20
21
|
from arpakitlib.ar_sqlalchemy_util import SQLAlchemyDB
|
21
22
|
|
@@ -109,7 +110,10 @@ class BaseOperationExecutor:
|
|
109
110
|
if exception:
|
110
111
|
operation_dbm.status = OperationDBM.Statuses.executed_with_error
|
111
112
|
operation_dbm.error_data = combine_dicts(
|
112
|
-
{
|
113
|
+
{
|
114
|
+
"exception_str": str(exception),
|
115
|
+
"traceback_str": traceback_str
|
116
|
+
},
|
113
117
|
operation_dbm.error_data
|
114
118
|
)
|
115
119
|
else:
|
@@ -185,7 +189,10 @@ class BaseOperationExecutor:
|
|
185
189
|
if exception:
|
186
190
|
operation_dbm.status = OperationDBM.Statuses.executed_with_error
|
187
191
|
operation_dbm.error_data = combine_dicts(
|
188
|
-
{
|
192
|
+
{
|
193
|
+
"exception_str": str(exception),
|
194
|
+
"traceback_str": traceback_str
|
195
|
+
},
|
189
196
|
operation_dbm.error_data
|
190
197
|
)
|
191
198
|
else:
|
@@ -219,7 +226,7 @@ class BaseOperationExecutor:
|
|
219
226
|
return operation_dbm
|
220
227
|
|
221
228
|
|
222
|
-
class
|
229
|
+
class OperationExecutorWorker(BaseWorker):
|
223
230
|
|
224
231
|
def __init__(
|
225
232
|
self,
|
@@ -286,9 +293,10 @@ class ScheduledOperation(BaseModel):
|
|
286
293
|
type: str
|
287
294
|
input_data: dict[str, Any] | None = None
|
288
295
|
is_time_func: Callable[[], bool]
|
296
|
+
timeout_after_creation: timedelta | None = None
|
289
297
|
|
290
298
|
|
291
|
-
class
|
299
|
+
class ScheduledOperationCreatorWorker(BaseWorker):
|
292
300
|
def __init__(
|
293
301
|
self,
|
294
302
|
*,
|
@@ -309,6 +317,8 @@ class CreateScheduledOperationWorker(BaseWorker):
|
|
309
317
|
self.sqlalchemy_db.init()
|
310
318
|
|
311
319
|
def sync_run(self):
|
320
|
+
timeout = None
|
321
|
+
|
312
322
|
for scheduled_operation in self.scheduled_operations:
|
313
323
|
if not scheduled_operation.is_time_func():
|
314
324
|
continue
|
@@ -321,10 +331,22 @@ class CreateScheduledOperationWorker(BaseWorker):
|
|
321
331
|
session.commit()
|
322
332
|
session.refresh(operation_dbm)
|
323
333
|
|
324
|
-
|
334
|
+
if scheduled_operation.timeout_after_creation is not None:
|
335
|
+
if timeout is not None:
|
336
|
+
if scheduled_operation.timeout_after_creation > timeout:
|
337
|
+
timeout = scheduled_operation.timeout_after_creation
|
338
|
+
else:
|
339
|
+
timeout = scheduled_operation.timeout_after_creation
|
340
|
+
|
341
|
+
if timeout is not None:
|
342
|
+
sync_safe_sleep(n=timeout)
|
343
|
+
|
344
|
+
async def async_on_startup(self):
|
325
345
|
self.sqlalchemy_db.init()
|
326
346
|
|
327
|
-
def async_run(self):
|
347
|
+
async def async_run(self):
|
348
|
+
timeout: timedelta | None = None
|
349
|
+
|
328
350
|
for scheduled_operation in self.scheduled_operations:
|
329
351
|
if not scheduled_operation.is_time_func():
|
330
352
|
continue
|
@@ -337,8 +359,18 @@ class CreateScheduledOperationWorker(BaseWorker):
|
|
337
359
|
session.commit()
|
338
360
|
session.refresh(operation_dbm)
|
339
361
|
|
362
|
+
if scheduled_operation.timeout_after_creation is not None:
|
363
|
+
if timeout is not None:
|
364
|
+
if scheduled_operation.timeout_after_creation > timeout:
|
365
|
+
timeout = scheduled_operation.timeout_after_creation
|
366
|
+
else:
|
367
|
+
timeout = scheduled_operation.timeout_after_creation
|
340
368
|
|
341
|
-
|
369
|
+
if timeout is not None:
|
370
|
+
await async_safe_sleep(n=timeout)
|
371
|
+
|
372
|
+
|
373
|
+
def every_timedelta_is_time_func(*, td: timedelta) -> Callable:
|
342
374
|
last_now_utc_dt = now_utc_dt()
|
343
375
|
|
344
376
|
def func() -> bool:
|
@@ -352,6 +384,16 @@ def is_time_func_every_timedelta(*, td: timedelta) -> Callable:
|
|
352
384
|
return func
|
353
385
|
|
354
386
|
|
387
|
+
def between_different_times_is_time_func(*, from_time: time, to_time: time) -> Callable:
|
388
|
+
def func() -> bool:
|
389
|
+
now_utc_dt_ = now_utc_dt()
|
390
|
+
if from_time <= now_utc_dt_.time() <= to_time:
|
391
|
+
return True
|
392
|
+
return False
|
393
|
+
|
394
|
+
return func
|
395
|
+
|
396
|
+
|
355
397
|
def __example():
|
356
398
|
pass
|
357
399
|
|
arpakitlib/ar_settings_util.py
CHANGED
@@ -35,8 +35,8 @@ class SimpleSettings(BaseSettings):
|
|
35
35
|
return v
|
36
36
|
|
37
37
|
@property
|
38
|
-
def
|
39
|
-
return self.mode_type == self.ModeTypes.
|
38
|
+
def is_mode_type_not_prod(self) -> bool:
|
39
|
+
return self.mode_type == self.ModeTypes.not_prod
|
40
40
|
|
41
41
|
@property
|
42
42
|
def is_mode_type_prod(self) -> bool:
|
@@ -45,3 +45,10 @@ class SimpleSettings(BaseSettings):
|
|
45
45
|
@classmethod
|
46
46
|
def generate_env_example(cls) -> str:
|
47
47
|
return generate_env_example(settings_class=cls)
|
48
|
+
|
49
|
+
@classmethod
|
50
|
+
def save_env_example_to_file(cls, filepath: str) -> str:
|
51
|
+
env_example = cls.generate_env_example()
|
52
|
+
with open(filepath, mode="w") as f:
|
53
|
+
f.write(env_example)
|
54
|
+
return env_example
|
arpakitlib/ar_type_util.py
CHANGED
@@ -6,7 +6,7 @@ arpakitlib/_arpakit_project_template/AUTHOR.md,sha256=d5QAx-1vbHfYYABpNQ0Yfjaxsw
|
|
6
6
|
arpakitlib/_arpakit_project_template/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
|
7
7
|
arpakitlib/_arpakit_project_template/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0s5UFznCTkVCau4,763
|
8
8
|
arpakitlib/_arpakit_project_template/README.md,sha256=EEoHPZrJQtLS3fKD3JvoPhkGhjfuDihxK5fmAGwihCQ,65
|
9
|
-
arpakitlib/_arpakit_project_template/example.env,sha256=
|
9
|
+
arpakitlib/_arpakit_project_template/example.env,sha256=CgmnowXuyz3_VGVPtS4e2hGupEIa_zeWY5zfOjsW4pc,462
|
10
10
|
arpakitlib/_arpakit_project_template/manage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
11
|
arpakitlib/_arpakit_project_template/manage/docker_ps.sh,sha256=uwm8vHgeuNLCOn0o9hgP_uc-PUkS9FwLyzZh6ItZ3do,15
|
12
12
|
arpakitlib/_arpakit_project_template/manage/docker_ps_a.sh,sha256=nOQejihYlzstg9oROvYwHIsSLt2Sw0DWQEeT3GBaBNs,18
|
@@ -59,7 +59,7 @@ arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_7.py,sha256=WdE1IWyO
|
|
59
59
|
arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_8.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
60
60
|
arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_9.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
61
61
|
arpakitlib/_arpakit_project_template/manage/settings_check.py,sha256=DeOGoWXgk2_VXpCIFbQgf1k2zcnv4hOLWIVc5BDv80c,260
|
62
|
-
arpakitlib/_arpakit_project_template/manage/settings_generate_env_example.py,sha256=
|
62
|
+
arpakitlib/_arpakit_project_template/manage/settings_generate_env_example.py,sha256=BLLeF4JenexXbO1mMj8X-lB81TG3-QTmN4DjPYEUI8o,288
|
63
63
|
arpakitlib/_arpakit_project_template/manage/sqlalchemy_db_check_conn.py,sha256=3Q4QfvFVBZsbMMH5yr6v3a6v6UjQuIEIujlxGpvykNA,190
|
64
64
|
arpakitlib/_arpakit_project_template/manage/sqlalchemy_db_init.py,sha256=FqKVuakafDndHKBsyPcSowhss6MZb0Soy5oREUPVLUw,184
|
65
65
|
arpakitlib/_arpakit_project_template/manage/sqlalchemy_db_reinit.py,sha256=twBWh64WU-sqHUte8v9ZJUZ_bCsFABExgIWLOnfLu4w,186
|
@@ -72,7 +72,8 @@ arpakitlib/_arpakit_project_template/src/additional_model/additional_model.py,sh
|
|
72
72
|
arpakitlib/_arpakit_project_template/src/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
73
|
arpakitlib/_arpakit_project_template/src/api/asgi.py,sha256=a5UBxOyNC8NG3E0ayhiDo3t5tPoB3WtOf2gbZJFWBAA,74
|
74
74
|
arpakitlib/_arpakit_project_template/src/api/auth.py,sha256=Ljq_VjjiAaW3HEzq60nkSI-HkHfuv6j5-8Q6Qs8V9bU,261
|
75
|
-
arpakitlib/_arpakit_project_template/src/api/
|
75
|
+
arpakitlib/_arpakit_project_template/src/api/const.py,sha256=ttbzJdOUZoAngR5naFubXjaI3ED06051HGpXZFpDPV0,178
|
76
|
+
arpakitlib/_arpakit_project_template/src/api/create_api_app.py,sha256=mqEg3MV_EQQI2RhtpRu0ElWZ1vo_F7iRYqAvk88qSJo,4500
|
76
77
|
arpakitlib/_arpakit_project_template/src/api/event.py,sha256=58wCVyVSIe_kydWi44M0Wvp7bTnV8xvO30gMXzjbFYc,750
|
77
78
|
arpakitlib/_arpakit_project_template/src/api/router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
78
79
|
arpakitlib/_arpakit_project_template/src/api/router/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -93,10 +94,11 @@ arpakitlib/_arpakit_project_template/src/db/__init__.py,sha256=47DEQpj8HBSa-_TIm
|
|
93
94
|
arpakitlib/_arpakit_project_template/src/db/sqlalchemy_model.py,sha256=nXtayUkBaVb6tWx5qJgXZLbLOTVAjnSLpSDxBm7yZLc,234
|
94
95
|
arpakitlib/_arpakit_project_template/src/db/util.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
95
96
|
arpakitlib/_arpakit_project_template/src/operation_execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
96
|
-
arpakitlib/_arpakit_project_template/src/operation_execution/
|
97
|
-
arpakitlib/_arpakit_project_template/src/operation_execution/
|
98
|
-
arpakitlib/_arpakit_project_template/src/operation_execution/
|
99
|
-
arpakitlib/_arpakit_project_template/src/operation_execution/
|
97
|
+
arpakitlib/_arpakit_project_template/src/operation_execution/const.py,sha256=HjupGEDUWVijQlbzxZPI9vBbAVOETUYzYU9pdnc9IcI,176
|
98
|
+
arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py,sha256=5sZpn3tVxnmcuIVRD5sbBhiMY5SAqPCc4tHzoNzDe4c,619
|
99
|
+
arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py,sha256=hBPZIOJAX7ym54s2tJ2QRky15FqqDF9r4yTr8Nh2YqI,985
|
100
|
+
arpakitlib/_arpakit_project_template/src/operation_execution/start_operation_executor_for_dev_.py,sha256=N-X3kvjQZeEDxp2Z7DDrr4hR-wR9LmFMLPAA8tzo87A,589
|
101
|
+
arpakitlib/_arpakit_project_template/src/operation_execution/start_scheduled_operation_creator_for_dev.py,sha256=RyHCafGTJaY-o3mgt7MReqgJ2txoBDhhsFzrjRiZWe4,574
|
100
102
|
arpakitlib/_arpakit_project_template/src/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
101
103
|
arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py,sha256=3WVPgRsNCIxWpA-6t_Phe-nFULdHPhS1S_DO11XRmqk,80
|
102
104
|
arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py,sha256=MVDc71sj5I1muWin50GwrSxMwYtOOSDOtRmeFErHcXs,80
|
@@ -118,7 +120,7 @@ arpakitlib/ar_datetime_util.py,sha256=Xe1NiT9oPQzNSG7RVRkhukhbg4i-hhS5ImmV7sPUc8
|
|
118
120
|
arpakitlib/ar_dict_util.py,sha256=cF5LQJ6tLqyGoEXfDljMDZrikeZoWPw7CgINHIFGvXM,419
|
119
121
|
arpakitlib/ar_dream_ai_api_client_util.py,sha256=QF9XK7xK5ny1fvkcG4e0pfCySNNFRNPy0x0cmxfsAak,2818
|
120
122
|
arpakitlib/ar_encrypt_decrypt_util.py,sha256=GhWnp7HHkbhwFVVCzO1H07m-5gryr4yjWsXjOaNQm1Y,520
|
121
|
-
arpakitlib/ar_enumeration_util.py,sha256=
|
123
|
+
arpakitlib/ar_enumeration_util.py,sha256=1dQUEVgJRp0nCO-IrCKv5GTK0QkSzM44M1lOWkmPk3w,2532
|
122
124
|
arpakitlib/ar_fastapi_static/healthcheck,sha256=IIO7Wvjwlr2-LPSQ7Y8O35hcI6t0_s8zqITDxkYCO8I,11
|
123
125
|
arpakitlib/ar_fastapi_static/redoc/redoc.standalone.js,sha256=WCuodUNv1qVh0oW5fjnJDwb5AwOue73jKHdI9z8iGKU,909365
|
124
126
|
arpakitlib/ar_fastapi_static/swagger-ui/favicon-16x16.png,sha256=ryStYE3Xs7zaj5dauXMHX0ovcKQIeUShL474tjo-B8I,665
|
@@ -139,7 +141,7 @@ arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css,sha256=jzPZlgJTFwSdSphk9C
|
|
139
141
|
arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css.map,sha256=5wq8eXMLU6Zxb45orZPL1zAsBFJReFw6GjYqGpUX3hg,262650
|
140
142
|
arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js,sha256=ffrLZHHEQ_g84A-ul3yWa10Kk09waOAxHcQXPuZuavg,339292
|
141
143
|
arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map,sha256=9UhIW7MqCOZPAz1Sl1IKfZUuhWU0p-LJqrnjjJD9Xhc,1159454
|
142
|
-
arpakitlib/ar_fastapi_util.py,sha256=
|
144
|
+
arpakitlib/ar_fastapi_util.py,sha256=HOn_jpi4ruH11m8XGiFpyvUZmAED7z31-CdL-wXvjK8,24119
|
143
145
|
arpakitlib/ar_file_storage_in_dir_util.py,sha256=D3e3rGuHoI6xqAA5mVvEpVVpOWY1jyjNsjj2UhyHRbE,3674
|
144
146
|
arpakitlib/ar_file_util.py,sha256=07xCF7paAUP2JUyfpeX0l3N1oCSma7qAcBmrCIZVi3g,452
|
145
147
|
arpakitlib/ar_hash_util.py,sha256=Iqy6KBAOLBQMFLWv676boI5sV7atT2B-fb7aCdHOmIQ,340
|
@@ -154,23 +156,23 @@ arpakitlib/ar_logging_util.py,sha256=Gyd7B9k0glIXPm6dASiigWLq9LC9lw6vhXTCeWpY5PY
|
|
154
156
|
arpakitlib/ar_mongodb_util.py,sha256=2ECkTnGAZ92qxioL-fmN6R4yZOSr3bXdXLWTzT1C3vk,4038
|
155
157
|
arpakitlib/ar_need_type_util.py,sha256=xq5bbAXJG-93CRVZUcLW0ZdM22rj-ZUW17C5hX_5grg,1699
|
156
158
|
arpakitlib/ar_openai_api_client_util.py,sha256=dHUbfg1sVVCjsNl_fra3iCMEz1bR-Hk9fE-DdYbu7Wc,1215
|
157
|
-
arpakitlib/ar_operation_execution_util.py,sha256=
|
159
|
+
arpakitlib/ar_operation_execution_util.py,sha256=EL7X7vN2GlOjlps3lCNoJPOP5lyqpbz4VTKmOWz7gVE,14948
|
158
160
|
arpakitlib/ar_parse_command.py,sha256=-s61xcATIsfw1eV_iD3xi-grsitbGzSDoAFc5V0OFy4,3447
|
159
161
|
arpakitlib/ar_postgresql_util.py,sha256=1AuLjEaa1Lg4pzn-ukCVnDi35Eg1k91APRTqZhIJAdo,945
|
160
162
|
arpakitlib/ar_run_cmd_util.py,sha256=D_rPavKMmWkQtwvZFz-Io5Ak8eSODHkcFeLPzNVC68g,1072
|
161
163
|
arpakitlib/ar_schedule_uust_api_client_util.py,sha256=JD-hRUQSs-euK0zq9w_4QUfGO00yWM08gllWUVKTtHc,6109
|
162
|
-
arpakitlib/ar_settings_util.py,sha256=
|
164
|
+
arpakitlib/ar_settings_util.py,sha256=gnuC8rs7IkyXkRWurrV-K0jObDMMxeH_1NdfJLkekHA,1473
|
163
165
|
arpakitlib/ar_sleep_util.py,sha256=OaLtRaJQWMkGjfj_mW1RB2P4RaSWsAIH8LUoXqsH0zM,1061
|
164
166
|
arpakitlib/ar_sqlalchemy_model_util.py,sha256=TFGOAgpxcnBV_u7yZrLCkf1ldlB4Of8vIRsyk9kyP5c,4987
|
165
167
|
arpakitlib/ar_sqlalchemy_util.py,sha256=Hcg1THrDsSR_-8dsY1CG3NWPEv0FqCbkPXFXLtjlSJ0,4207
|
166
168
|
arpakitlib/ar_ssh_runner_util.py,sha256=jlnss4V4pziBN1rBzoK_lDiWm6nMOqGXfa6NFJSKH-Y,6796
|
167
169
|
arpakitlib/ar_str_util.py,sha256=oCEtQ_TTn35OEz9jCNLjbhopq76JmaifD_iYR-nEJJ4,2142
|
168
|
-
arpakitlib/ar_type_util.py,sha256=
|
170
|
+
arpakitlib/ar_type_util.py,sha256=e6Ch8I_B3FMJMj-fiZvTwtGde4hxSa48fGt5g8RlV6I,2301
|
169
171
|
arpakitlib/ar_yookassa_api_client_util.py,sha256=sh4fcUkAkdOetFn9JYoTvjcSXP-M1wU04KEY-ECLfLg,5137
|
170
172
|
arpakitlib/ar_zabbix_api_client_util.py,sha256=Q-VR4MvoZ9aHwZeYZr9G3LwN-ANx1T5KFmF6pvPM-9M,6402
|
171
|
-
arpakitlib-1.7.
|
172
|
-
arpakitlib-1.7.
|
173
|
-
arpakitlib-1.7.
|
174
|
-
arpakitlib-1.7.
|
175
|
-
arpakitlib-1.7.
|
176
|
-
arpakitlib-1.7.
|
173
|
+
arpakitlib-1.7.45.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
|
174
|
+
arpakitlib-1.7.45.dist-info/METADATA,sha256=7WXqfpqnXNdClOAoxKGuDN9DwBfiMcVB7MO203v_cyU,2824
|
175
|
+
arpakitlib-1.7.45.dist-info/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0s5UFznCTkVCau4,763
|
176
|
+
arpakitlib-1.7.45.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
177
|
+
arpakitlib-1.7.45.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
|
178
|
+
arpakitlib-1.7.45.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|