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.
Files changed (20) hide show
  1. arpakitlib/_arpakit_project_template/example.env +1 -0
  2. arpakitlib/_arpakit_project_template/manage/settings_generate_env_example.py +2 -4
  3. arpakitlib/_arpakit_project_template/src/api/const.py +9 -0
  4. arpakitlib/_arpakit_project_template/src/api/create_api_app.py +3 -3
  5. arpakitlib/_arpakit_project_template/src/operation_execution/const.py +9 -0
  6. arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +2 -2
  7. arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +18 -6
  8. arpakitlib/_arpakit_project_template/src/operation_execution/{start_operation_executor_for_dev.py → start_operation_executor_for_dev_.py} +2 -2
  9. arpakitlib/_arpakit_project_template/src/operation_execution/{start_create_scheduled_operation_worker.py → start_scheduled_operation_creator_for_dev.py} +2 -2
  10. arpakitlib/ar_enumeration_util.py +11 -0
  11. arpakitlib/ar_fastapi_util.py +23 -28
  12. arpakitlib/ar_operation_execution_util.py +50 -8
  13. arpakitlib/ar_settings_util.py +9 -2
  14. arpakitlib/ar_type_util.py +6 -0
  15. {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/METADATA +1 -1
  16. {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/RECORD +20 -18
  17. {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/LICENSE +0 -0
  18. {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/NOTICE +0 -0
  19. {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/WHEEL +0 -0
  20. {arpakitlib-1.7.43.dist-info → arpakitlib-1.7.45.dist-info}/entry_points.txt +0 -0
@@ -8,6 +8,7 @@
8
8
  # api_start_execute_operation_worker=
9
9
  # api_start_create_scheduled_operation_worker=
10
10
  # api_port=
11
+ # api_correct_api_key=
11
12
  # var_dirname=
12
13
  # var_dirpath=
13
14
  # log_filename=
@@ -5,10 +5,8 @@ from src.core.settings import Settings
5
5
 
6
6
 
7
7
  def command():
8
- env_example = Settings.generate_env_example()
9
- print(env_example)
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__':
@@ -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
  )
@@ -0,0 +1,9 @@
1
+ from arpakitlib.ar_sqlalchemy_model_util import BaseOperationTypes
2
+
3
+
4
+ class OperationTypes(BaseOperationTypes):
5
+ pass
6
+
7
+
8
+ if __name__ == '__main__':
9
+ OperationTypes.print()
@@ -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, is_time_func_every_timedelta
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
- healthcheck_operation = ScheduledOperation(
9
+ healthcheck_1_scheduled_operation = ScheduledOperation(
9
10
  type=BaseOperationTypes.healthcheck_,
10
- input_data={},
11
- is_time_func=is_time_func_every_timedelta(td=timedelta(seconds=5))
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(healthcheck_operation)
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 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
  )
@@ -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
@@ -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
 
@@ -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=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
- validate_api_key_func(
559
- api_key_string=base_api_auth_data.api_key_string,
560
- base_api_auth_data=base_api_auth_data,
561
- transmitted_api_data=transmitted_api_data,
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=ErrorSO.APIErrorCodes.cannot_authorize,
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
- {"exception": str(exception), "traceback_str": traceback_str},
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
- {"exception": str(exception), "traceback_str": traceback_str},
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 ExecuteOperationWorker(BaseWorker):
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 CreateScheduledOperationWorker(BaseWorker):
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
- def async_on_startup(self):
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
- def is_time_func_every_timedelta(*, td: timedelta) -> Callable:
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
 
@@ -35,8 +35,8 @@ class SimpleSettings(BaseSettings):
35
35
  return v
36
36
 
37
37
  @property
38
- def is_mode_type_dev(self) -> bool:
39
- return self.mode_type == self.ModeTypes.dev
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
@@ -84,6 +84,12 @@ def raise_if_none(v: Any) -> Any:
84
84
  return v
85
85
 
86
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)}")
90
+ return v
91
+
92
+
87
93
  def __example():
88
94
  pass
89
95
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arpakitlib
3
- Version: 1.7.43
3
+ Version: 1.7.45
4
4
  Summary: arpakitlib
5
5
  Home-page: https://github.com/ARPAKIT-Company/arpakitlib
6
6
  License: Apache-2.0
@@ -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=p5qdXuMHudefuGVkf1dcqSDlS3Xx2TjvebeufaROMOE,439
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=pRTr6SzBJxDUaxTXZgLJr7rJawHyvpyTJbrJSZW0hEc,330
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/create_api_app.py,sha256=uDEnLAPugb3rXuuJDMkfs8i6aIGYo0-_JP-PG6Spdr4,4496
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/operation_executor.py,sha256=jAcBicGYq78p4LZe4G3tU1hRxIsODBRoHerhExZab4k,619
97
- arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py,sha256=xJDPt_3Jo5huOerqY5TUi5DB2W9eI8WcPvSbEPFbImc,464
98
- arpakitlib/_arpakit_project_template/src/operation_execution/start_create_scheduled_operation_worker.py,sha256=L1TMmGOTPAyTQNxgTMKCJZAQgqxv8bwNipbrrNURw2U,572
99
- 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=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=0DN46uyI0Gu9JPDgso3XPbnre7hZZefYTZwmmE1iYH4,2250
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=EL4tO7jQKArbvVvNOXaDx-pJDB1cOedWm1YiXBTzsG8,24320
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=Zny68a2O6ZxMMW9gOfH5WaNoHFgJtWe0Q62_J16YNd4,13451
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=95SaC8ROUoFFIZvGsOUmz4OEyn-KospL_EqjFYAJs9U,1231
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=99tp2xEQaAxy1D2AdpJMVIqJa7ycj72o6D8gCoJiVcY,2157
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.43.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
172
- arpakitlib-1.7.43.dist-info/METADATA,sha256=VN-d0OUcmbY1Pern6idUVOOZWJiELSNgr-XQ_aHLkk8,2824
173
- arpakitlib-1.7.43.dist-info/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0s5UFznCTkVCau4,763
174
- arpakitlib-1.7.43.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
175
- arpakitlib-1.7.43.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
176
- arpakitlib-1.7.43.dist-info/RECORD,,
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,,