arpakitlib 1.7.41__py3-none-any.whl → 1.7.44__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. arpakitlib/_arpakit_project_template/src/api/auth.py +6 -0
  2. arpakitlib/_arpakit_project_template/src/api/const.py +9 -0
  3. arpakitlib/_arpakit_project_template/src/api/create_api_app.py +3 -3
  4. arpakitlib/_arpakit_project_template/src/api/util.py +0 -0
  5. arpakitlib/_arpakit_project_template/src/core/settings.py +2 -0
  6. arpakitlib/_arpakit_project_template/src/operation_execution/const.py +11 -0
  7. arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +2 -2
  8. arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +4 -4
  9. arpakitlib/_arpakit_project_template/src/operation_execution/{start_operation_executor_for_dev.py → start_operation_executor_for_dev_.py} +2 -2
  10. arpakitlib/_arpakit_project_template/src/operation_execution/{start_create_scheduled_operation_worker.py → start_scheduled_operation_creator_for_dev.py} +2 -2
  11. arpakitlib/api_key_util.py +1 -1
  12. arpakitlib/ar_enumeration_util.py +11 -0
  13. arpakitlib/ar_fastapi_util.py +28 -40
  14. arpakitlib/ar_operation_execution_util.py +22 -6
  15. arpakitlib/ar_type_util.py +7 -1
  16. {arpakitlib-1.7.41.dist-info → arpakitlib-1.7.44.dist-info}/METADATA +1 -1
  17. {arpakitlib-1.7.41.dist-info → arpakitlib-1.7.44.dist-info}/RECORD +21 -17
  18. {arpakitlib-1.7.41.dist-info → arpakitlib-1.7.44.dist-info}/LICENSE +0 -0
  19. {arpakitlib-1.7.41.dist-info → arpakitlib-1.7.44.dist-info}/NOTICE +0 -0
  20. {arpakitlib-1.7.41.dist-info → arpakitlib-1.7.44.dist-info}/WHEEL +0 -0
  21. {arpakitlib-1.7.41.dist-info → arpakitlib-1.7.44.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,6 @@
1
+ from arpakitlib.ar_fastapi_util import is_api_key_correct_api_auth
2
+ from src.core.settings import get_cached_settings
3
+
4
+ check_with_settings_is_api_key_correct_api_auth = is_api_key_correct_api_auth(
5
+ correct_api_key=get_cached_settings().api_correct_api_key
6
+ )
@@ -0,0 +1,9 @@
1
+ from arpakitlib.ar_fastapi_util import BaseAPIErrorCodes
2
+
3
+
4
+ class APIErrorCodes(BaseAPIErrorCodes):
5
+ pass
6
+
7
+
8
+ if __name__ == '__main__':
9
+ print(APIErrorCodes.str_for_print())
@@ -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 ExecuteOperationWorker, CreateScheduledOperationWorker
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
- ExecuteOperationWorker(
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
- CreateScheduledOperationWorker(
78
+ ScheduledOperationCreatorWorker(
79
79
  sqlalchemy_db=sqlalchemy_db,
80
80
  scheduled_operations=ALL_SCHEDULED_OPERATIONS
81
81
  )
File without changes
@@ -31,6 +31,8 @@ class Settings(SimpleSettings):
31
31
 
32
32
  api_port: int | None = int("{API_PORT}") if "{API_PORT}".isdigit() else None
33
33
 
34
+ api_correct_api_key: str | None = None
35
+
34
36
  var_dirname: str | None = "var"
35
37
 
36
38
  var_dirpath: str | None = os.path.join(BASE_DIRPATH, var_dirname)
@@ -0,0 +1,11 @@
1
+ from arpakitlib.ar_sqlalchemy_model_util import BaseOperationTypes
2
+
3
+
4
+ class OperationTypes(BaseOperationTypes):
5
+ pass
6
+
7
+
8
+ if __name__ == '__main__':
9
+ print(f"OperationTypes (len={len(OperationTypes.values_list())})")
10
+ for v in OperationTypes.values_list():
11
+ print(f"- {v}")
@@ -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,13 @@
1
1
  from datetime import timedelta
2
2
 
3
- from arpakitlib.ar_operation_execution_util import ScheduledOperation, is_time_func_every_timedelta
3
+ from arpakitlib.ar_operation_execution_util import ScheduledOperation, every_timedelta_is_time_func
4
4
  from arpakitlib.ar_sqlalchemy_model_util import BaseOperationTypes
5
5
 
6
6
  ALL_SCHEDULED_OPERATIONS = []
7
7
 
8
- healthcheck_operation = ScheduledOperation(
8
+ healthcheck_scheduled_operation = ScheduledOperation(
9
9
  type=BaseOperationTypes.healthcheck_,
10
10
  input_data={},
11
- is_time_func=is_time_func_every_timedelta(td=timedelta(seconds=5))
11
+ is_time_func=every_timedelta_is_time_func(td=timedelta(seconds=5))
12
12
  )
13
- ALL_SCHEDULED_OPERATIONS.append(healthcheck_operation)
13
+ ALL_SCHEDULED_OPERATIONS.append(healthcheck_scheduled_operation)
@@ -1,11 +1,11 @@
1
- from arpakitlib.ar_operation_execution_util import ExecuteOperationWorker
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 = ExecuteOperationWorker(
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 CreateScheduledOperationWorker
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 = CreateScheduledOperationWorker(
8
+ worker = ScheduledOperationCreatorWorker(
9
9
  sqlalchemy_db=get_cached_sqlalchemy_db(),
10
10
  scheduled_operations=ALL_SCHEDULED_OPERATIONS
11
11
  )
@@ -3,7 +3,7 @@ from uuid import uuid4
3
3
  from arpakitlib.ar_datetime_util import now_utc_dt
4
4
 
5
5
 
6
- def generate_default_api_key_value() -> str:
6
+ def generate_api_key() -> str:
7
7
  return (
8
8
  f"apikey{str(uuid4()).replace('-', '')}{str(now_utc_dt().timestamp()).replace('.', '')}"
9
9
  )
@@ -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
@@ -32,7 +32,7 @@ from arpakitlib.ar_json_util import safely_transfer_to_json_str_to_json_obj
32
32
  from arpakitlib.ar_logging_util import setup_normal_logging
33
33
  from arpakitlib.ar_sqlalchemy_model_util import StoryLogDBM
34
34
  from arpakitlib.ar_sqlalchemy_util import SQLAlchemyDB
35
- from arpakitlib.ar_type_util import raise_for_type, raise_if_not_async_func
35
+ from arpakitlib.ar_type_util import raise_for_type, raise_if_not_async_func, raise_if_none
36
36
 
37
37
  _ARPAKIT_LIB_MODULE_VERSION = "3.0"
38
38
 
@@ -68,13 +68,14 @@ class SimpleSO(BaseSO):
68
68
  creation_dt: datetime
69
69
 
70
70
 
71
- class ErrorSO(BaseSO):
72
- class APIErrorCodes(Enumeration):
73
- cannot_authorize = "CANNOT_AUTHORIZE"
74
- unknown_error = "UNKNOWN_ERROR"
75
- error_in_request = "ERROR_IN_REQUEST"
76
- not_found = "NOT_FOUND"
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 = ErrorSO.APIErrorCodes.unknown_error,
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=ErrorSO.APIErrorCodes.unknown_error,
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 = ErrorSO.APIErrorCodes.cannot_authorize
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 = ErrorSO.APIErrorCodes.not_found
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 = ErrorSO.APIErrorCodes.error_in_request
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 = ErrorSO.APIErrorCodes.unknown_error
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=ErrorSO.APIErrorCodes.cannot_authorize,
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=ErrorSO.APIErrorCodes.cannot_authorize,
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
 
@@ -529,52 +530,39 @@ def base_api_auth(
529
530
 
530
531
 
531
532
  class CheckAPIKeyAPIAuthData(BaseAPIAuthData):
532
- require_check_api_key: bool = False
533
533
  is_api_key_correct: bool | None = None
534
534
 
535
535
 
536
- def check_api_key_api_auth(
536
+ def is_api_key_correct_api_auth(
537
537
  *,
538
- require_check_api_key: bool = True,
539
- check_api_key_func: Callable | None = None,
538
+ validate_api_key_func: Callable | None = None,
540
539
  correct_api_key: str | None = None
541
540
  ):
542
- if require_check_api_key:
543
- require_api_key_string = True
544
- else:
545
- require_api_key_string = False
546
-
547
541
  if correct_api_key is not None:
548
- check_api_key_func = lambda **kwargs: kwargs["api_key_string"] == correct_api_key
549
-
550
- if require_check_api_key and check_api_key_func is None:
551
- raise ValueError("require_check_api_key and check_api_key_func is None")
542
+ validate_api_key_func = lambda *args, **kwargs: kwargs["api_key_string"] == correct_api_key
543
+ raise_if_none(validate_api_key_func)
552
544
 
553
545
  async def func(
554
546
  *,
555
547
  base_api_auth_data: BaseAPIAuthData = Depends(base_api_auth(
556
- require_api_key_string=require_api_key_string,
548
+ require_api_key_string=True,
557
549
  require_token_string=False
558
550
  )),
559
551
  transmitted_api_data: BaseTransmittedAPIData = Depends(get_transmitted_api_data),
560
552
  request: starlette.requests.Request
561
553
  ) -> CheckAPIKeyAPIAuthData:
562
554
  check_api_key_api_auth_data = CheckAPIKeyAPIAuthData.model_validate(base_api_auth_data)
563
- check_api_key_api_auth_data.require_check_api_key = require_check_api_key
564
- check_api_key_api_auth_data.is_api_key_correct = (
565
- check_api_key_func(
566
- api_key_string=base_api_auth_data.api_key_string,
567
- base_api_auth_data=base_api_auth_data,
568
- transmitted_api_data=transmitted_api_data,
569
- request=request
570
- )
571
- if check_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
572
560
  )
573
561
 
574
- if check_api_key_api_auth_data.require_check_api_key and not check_api_key_api_auth_data.is_api_key_correct:
562
+ if not check_api_key_api_auth_data.is_api_key_correct:
575
563
  raise APIException(
576
564
  status_code=starlette.status.HTTP_401_UNAUTHORIZED,
577
- error_code=ErrorSO.APIErrorCodes.cannot_authorize,
565
+ error_code=BaseAPIErrorCodes.cannot_authorize,
578
566
  error_data=safely_transfer_to_json_str_to_json_obj(check_api_key_api_auth_data.model_dump())
579
567
  )
580
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
@@ -109,7 +109,10 @@ class BaseOperationExecutor:
109
109
  if exception:
110
110
  operation_dbm.status = OperationDBM.Statuses.executed_with_error
111
111
  operation_dbm.error_data = combine_dicts(
112
- {"exception": str(exception), "traceback_str": traceback_str},
112
+ {
113
+ "exception_str": str(exception),
114
+ "traceback_str": traceback_str
115
+ },
113
116
  operation_dbm.error_data
114
117
  )
115
118
  else:
@@ -185,7 +188,10 @@ class BaseOperationExecutor:
185
188
  if exception:
186
189
  operation_dbm.status = OperationDBM.Statuses.executed_with_error
187
190
  operation_dbm.error_data = combine_dicts(
188
- {"exception": str(exception), "traceback_str": traceback_str},
191
+ {
192
+ "exception_str": str(exception),
193
+ "traceback_str": traceback_str
194
+ },
189
195
  operation_dbm.error_data
190
196
  )
191
197
  else:
@@ -219,7 +225,7 @@ class BaseOperationExecutor:
219
225
  return operation_dbm
220
226
 
221
227
 
222
- class ExecuteOperationWorker(BaseWorker):
228
+ class OperationExecutorWorker(BaseWorker):
223
229
 
224
230
  def __init__(
225
231
  self,
@@ -288,7 +294,7 @@ class ScheduledOperation(BaseModel):
288
294
  is_time_func: Callable[[], bool]
289
295
 
290
296
 
291
- class CreateScheduledOperationWorker(BaseWorker):
297
+ class ScheduledOperationCreatorWorker(BaseWorker):
292
298
  def __init__(
293
299
  self,
294
300
  *,
@@ -338,7 +344,7 @@ class CreateScheduledOperationWorker(BaseWorker):
338
344
  session.refresh(operation_dbm)
339
345
 
340
346
 
341
- def is_time_func_every_timedelta(*, td: timedelta) -> Callable:
347
+ def every_timedelta_is_time_func(*, td: timedelta) -> Callable:
342
348
  last_now_utc_dt = now_utc_dt()
343
349
 
344
350
  def func() -> bool:
@@ -352,6 +358,16 @@ def is_time_func_every_timedelta(*, td: timedelta) -> Callable:
352
358
  return func
353
359
 
354
360
 
361
+ def between_different_times_is_time_func(*, from_time: time, to_time: time) -> Callable:
362
+ def func() -> bool:
363
+ now_utc_dt_ = now_utc_dt()
364
+ if from_time <= now_utc_dt_.time() <= to_time:
365
+ return True
366
+ return False
367
+
368
+ return func
369
+
370
+
355
371
  def __example():
356
372
  pass
357
373
 
@@ -80,7 +80,13 @@ def make_none_to_false(v: Any) -> Any:
80
80
 
81
81
  def raise_if_none(v: Any) -> Any:
82
82
  if v is None:
83
- raise ValueError(f"v is None, v={v}")
83
+ raise ValueError(f"v is None, v={v}, type(v)={type(v)}")
84
+ return v
85
+
86
+
87
+ def raise_if_not_none(v: Any) -> Any:
88
+ if v is not None:
89
+ raise ValueError(f"v is not None, v={v}, type(v)={type(v)}")
84
90
  return v
85
91
 
86
92
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arpakitlib
3
- Version: 1.7.41
3
+ Version: 1.7.44
4
4
  Summary: arpakitlib
5
5
  Home-page: https://github.com/ARPAKIT-Company/arpakitlib
6
6
  License: Apache-2.0
@@ -71,7 +71,9 @@ arpakitlib/_arpakit_project_template/src/additional_model/__init__.py,sha256=47D
71
71
  arpakitlib/_arpakit_project_template/src/additional_model/additional_model.py,sha256=4KCOvto9Hj5eMYpvfaJChghhR9bkCvKluGGPWrTezoY,134
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
- arpakitlib/_arpakit_project_template/src/api/create_api_app.py,sha256=uDEnLAPugb3rXuuJDMkfs8i6aIGYo0-_JP-PG6Spdr4,4496
74
+ arpakitlib/_arpakit_project_template/src/api/auth.py,sha256=Ljq_VjjiAaW3HEzq60nkSI-HkHfuv6j5-8Q6Qs8V9bU,261
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
75
77
  arpakitlib/_arpakit_project_template/src/api/event.py,sha256=58wCVyVSIe_kydWi44M0Wvp7bTnV8xvO30gMXzjbFYc,750
76
78
  arpakitlib/_arpakit_project_template/src/api/router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
79
  arpakitlib/_arpakit_project_template/src/api/router/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -82,19 +84,21 @@ arpakitlib/_arpakit_project_template/src/api/schema/v1/in_.py,sha256=47DEQpj8HBS
82
84
  arpakitlib/_arpakit_project_template/src/api/schema/v1/out.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
85
  arpakitlib/_arpakit_project_template/src/api/start_api_for_dev.py,sha256=BwROGTR8Hm1ewx_Z0k8HXeql4RIItCdCtP_hmhTT_PM,344
84
86
  arpakitlib/_arpakit_project_template/src/api/transmitted_api_data.py,sha256=YtpATqzN216e76W5QOuzN-Vo6343PVDiHpKWYQ6oqyU,278
87
+ arpakitlib/_arpakit_project_template/src/api/util.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
88
  arpakitlib/_arpakit_project_template/src/business_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
89
  arpakitlib/_arpakit_project_template/src/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
90
  arpakitlib/_arpakit_project_template/src/core/const.py,sha256=CZZew674y7LhCAlYhvuF5cV4Zb9nQ17j2Tcuj2GEBf4,1232
88
- arpakitlib/_arpakit_project_template/src/core/settings.py,sha256=1t5XgDuRrdRVTvxsKYmsNFd_rW08xT6cYYQkCaT_HYM,2014
91
+ arpakitlib/_arpakit_project_template/src/core/settings.py,sha256=Rg90TaiilxSxqvfeqrFeZNIXxrvfWgvwYME9ErHJ200,2058
89
92
  arpakitlib/_arpakit_project_template/src/core/util.py,sha256=J1_AiI4DW_VB8ldLNATP6mjxz254CSxceGcqUbT0SVU,2006
90
93
  arpakitlib/_arpakit_project_template/src/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
94
  arpakitlib/_arpakit_project_template/src/db/sqlalchemy_model.py,sha256=nXtayUkBaVb6tWx5qJgXZLbLOTVAjnSLpSDxBm7yZLc,234
92
95
  arpakitlib/_arpakit_project_template/src/db/util.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
96
  arpakitlib/_arpakit_project_template/src/operation_execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
- arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py,sha256=jAcBicGYq78p4LZe4G3tU1hRxIsODBRoHerhExZab4k,619
95
- arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py,sha256=xJDPt_3Jo5huOerqY5TUi5DB2W9eI8WcPvSbEPFbImc,464
96
- arpakitlib/_arpakit_project_template/src/operation_execution/start_create_scheduled_operation_worker.py,sha256=L1TMmGOTPAyTQNxgTMKCJZAQgqxv8bwNipbrrNURw2U,572
97
- arpakitlib/_arpakit_project_template/src/operation_execution/start_operation_executor_for_dev.py,sha256=UHGVZi5-jO0J8FDpRkYJS046oRmwtbt3mrJ9vtYT6WE,587
97
+ arpakitlib/_arpakit_project_template/src/operation_execution/const.py,sha256=4wOXu1042rDeNMe0KhMEhRVtJajQfoYMeqqaQ_UICkk,287
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=slgfIZikNcTPchjb8hxpf1aGCqlN0Q4VO-LxbptNOCA,484
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
98
102
  arpakitlib/_arpakit_project_template/src/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
103
  arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py,sha256=3WVPgRsNCIxWpA-6t_Phe-nFULdHPhS1S_DO11XRmqk,80
100
104
  arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py,sha256=MVDc71sj5I1muWin50GwrSxMwYtOOSDOtRmeFErHcXs,80
@@ -102,7 +106,7 @@ arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py,sha256=89
102
106
  arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py,sha256=BlVvIhSFclBMQMHftETS57bRaFpkOdKPrZyxMbYJuDY,80
103
107
  arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py,sha256=7ruCZevqJoLSdqL1OEJWUy3YPCOHQif7JqVTKxZ9acM,80
104
108
  arpakitlib/_arpakit_project_template/src/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
- arpakitlib/api_key_util.py,sha256=neGUHZvcVcJGfteKEPi71SVAhvKAaeUiwT00QCAun0I,238
109
+ arpakitlib/api_key_util.py,sha256=DtzREor5h70XlZOv1ounNoPHL5_cc0YA28SaHvlFaWs,224
106
110
  arpakitlib/ar_additional_model_util.py,sha256=tNzZhZtvtJ1qC6Cn4UnyoEL58HudfpCdQy5ftkCqyik,473
107
111
  arpakitlib/ar_aiogram_util.py,sha256=5JPCDZpdBGTE-EIWPRez9amCZAX7XemFIVu5YrQK7Pw,12264
108
112
  arpakitlib/ar_arpakit_lib_module_util.py,sha256=V_mc3Ml73Tzz3arxmwEfIxruKMyrwbe8XZ9FfVDtUXY,5446
@@ -116,7 +120,7 @@ arpakitlib/ar_datetime_util.py,sha256=Xe1NiT9oPQzNSG7RVRkhukhbg4i-hhS5ImmV7sPUc8
116
120
  arpakitlib/ar_dict_util.py,sha256=cF5LQJ6tLqyGoEXfDljMDZrikeZoWPw7CgINHIFGvXM,419
117
121
  arpakitlib/ar_dream_ai_api_client_util.py,sha256=QF9XK7xK5ny1fvkcG4e0pfCySNNFRNPy0x0cmxfsAak,2818
118
122
  arpakitlib/ar_encrypt_decrypt_util.py,sha256=GhWnp7HHkbhwFVVCzO1H07m-5gryr4yjWsXjOaNQm1Y,520
119
- arpakitlib/ar_enumeration_util.py,sha256=0DN46uyI0Gu9JPDgso3XPbnre7hZZefYTZwmmE1iYH4,2250
123
+ arpakitlib/ar_enumeration_util.py,sha256=1dQUEVgJRp0nCO-IrCKv5GTK0QkSzM44M1lOWkmPk3w,2532
120
124
  arpakitlib/ar_fastapi_static/healthcheck,sha256=IIO7Wvjwlr2-LPSQ7Y8O35hcI6t0_s8zqITDxkYCO8I,11
121
125
  arpakitlib/ar_fastapi_static/redoc/redoc.standalone.js,sha256=WCuodUNv1qVh0oW5fjnJDwb5AwOue73jKHdI9z8iGKU,909365
122
126
  arpakitlib/ar_fastapi_static/swagger-ui/favicon-16x16.png,sha256=ryStYE3Xs7zaj5dauXMHX0ovcKQIeUShL474tjo-B8I,665
@@ -137,7 +141,7 @@ arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css,sha256=jzPZlgJTFwSdSphk9C
137
141
  arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css.map,sha256=5wq8eXMLU6Zxb45orZPL1zAsBFJReFw6GjYqGpUX3hg,262650
138
142
  arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js,sha256=ffrLZHHEQ_g84A-ul3yWa10Kk09waOAxHcQXPuZuavg,339292
139
143
  arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map,sha256=9UhIW7MqCOZPAz1Sl1IKfZUuhWU0p-LJqrnjjJD9Xhc,1159454
140
- arpakitlib/ar_fastapi_util.py,sha256=7-gPezpK4_R8jey78FvNiaUS-sfRTlzIIfRQqEoPMSk,24692
144
+ arpakitlib/ar_fastapi_util.py,sha256=HOn_jpi4ruH11m8XGiFpyvUZmAED7z31-CdL-wXvjK8,24119
141
145
  arpakitlib/ar_file_storage_in_dir_util.py,sha256=D3e3rGuHoI6xqAA5mVvEpVVpOWY1jyjNsjj2UhyHRbE,3674
142
146
  arpakitlib/ar_file_util.py,sha256=07xCF7paAUP2JUyfpeX0l3N1oCSma7qAcBmrCIZVi3g,452
143
147
  arpakitlib/ar_hash_util.py,sha256=Iqy6KBAOLBQMFLWv676boI5sV7atT2B-fb7aCdHOmIQ,340
@@ -152,7 +156,7 @@ arpakitlib/ar_logging_util.py,sha256=Gyd7B9k0glIXPm6dASiigWLq9LC9lw6vhXTCeWpY5PY
152
156
  arpakitlib/ar_mongodb_util.py,sha256=2ECkTnGAZ92qxioL-fmN6R4yZOSr3bXdXLWTzT1C3vk,4038
153
157
  arpakitlib/ar_need_type_util.py,sha256=xq5bbAXJG-93CRVZUcLW0ZdM22rj-ZUW17C5hX_5grg,1699
154
158
  arpakitlib/ar_openai_api_client_util.py,sha256=dHUbfg1sVVCjsNl_fra3iCMEz1bR-Hk9fE-DdYbu7Wc,1215
155
- arpakitlib/ar_operation_execution_util.py,sha256=Zny68a2O6ZxMMW9gOfH5WaNoHFgJtWe0Q62_J16YNd4,13451
159
+ arpakitlib/ar_operation_execution_util.py,sha256=EZMQbjvp3EDFEfUYAdRV7_qtdqIW-qJrmVWpv5plxas,13874
156
160
  arpakitlib/ar_parse_command.py,sha256=-s61xcATIsfw1eV_iD3xi-grsitbGzSDoAFc5V0OFy4,3447
157
161
  arpakitlib/ar_postgresql_util.py,sha256=1AuLjEaa1Lg4pzn-ukCVnDi35Eg1k91APRTqZhIJAdo,945
158
162
  arpakitlib/ar_run_cmd_util.py,sha256=D_rPavKMmWkQtwvZFz-Io5Ak8eSODHkcFeLPzNVC68g,1072
@@ -163,12 +167,12 @@ arpakitlib/ar_sqlalchemy_model_util.py,sha256=TFGOAgpxcnBV_u7yZrLCkf1ldlB4Of8vIR
163
167
  arpakitlib/ar_sqlalchemy_util.py,sha256=Hcg1THrDsSR_-8dsY1CG3NWPEv0FqCbkPXFXLtjlSJ0,4207
164
168
  arpakitlib/ar_ssh_runner_util.py,sha256=jlnss4V4pziBN1rBzoK_lDiWm6nMOqGXfa6NFJSKH-Y,6796
165
169
  arpakitlib/ar_str_util.py,sha256=oCEtQ_TTn35OEz9jCNLjbhopq76JmaifD_iYR-nEJJ4,2142
166
- arpakitlib/ar_type_util.py,sha256=GNc9PgFKonj5lRlAHSnVPBN5nLIslrG8GTiZHjkf05w,2138
170
+ arpakitlib/ar_type_util.py,sha256=e6Ch8I_B3FMJMj-fiZvTwtGde4hxSa48fGt5g8RlV6I,2301
167
171
  arpakitlib/ar_yookassa_api_client_util.py,sha256=sh4fcUkAkdOetFn9JYoTvjcSXP-M1wU04KEY-ECLfLg,5137
168
172
  arpakitlib/ar_zabbix_api_client_util.py,sha256=Q-VR4MvoZ9aHwZeYZr9G3LwN-ANx1T5KFmF6pvPM-9M,6402
169
- arpakitlib-1.7.41.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
170
- arpakitlib-1.7.41.dist-info/METADATA,sha256=e1hkLoyTSNCk7_bjiX-jQ6DGV7_N_4ezH_795-nio6M,2824
171
- arpakitlib-1.7.41.dist-info/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0s5UFznCTkVCau4,763
172
- arpakitlib-1.7.41.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
173
- arpakitlib-1.7.41.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
174
- arpakitlib-1.7.41.dist-info/RECORD,,
173
+ arpakitlib-1.7.44.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
174
+ arpakitlib-1.7.44.dist-info/METADATA,sha256=9Rsxl80OE2FYpC5fZKMwsvGOHbxY3o0t7djohbxNnzs,2824
175
+ arpakitlib-1.7.44.dist-info/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0s5UFznCTkVCau4,763
176
+ arpakitlib-1.7.44.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
177
+ arpakitlib-1.7.44.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
178
+ arpakitlib-1.7.44.dist-info/RECORD,,