arpakitlib 1.6.90__py3-none-any.whl → 1.6.92__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.
@@ -0,0 +1,13 @@
1
+ import logging
2
+
3
+ from src.core.util import setup_logging
4
+
5
+ _logger = logging.getLogger(__name__)
6
+
7
+ def command():
8
+ setup_logging()
9
+ _logger.info("checking logging")
10
+
11
+
12
+ if __name__ == '__main__':
13
+ command()
@@ -326,19 +326,20 @@ class BaseTransmittedTgBotData(BaseModel):
326
326
  model_config = ConfigDict(extra="ignore", arbitrary_types_allowed=True, from_attributes=True)
327
327
 
328
328
 
329
- def create_aiogram_tg_bot(*, tg_bot_token: str, tg_bot_proxy_url: str | None = None) -> Bot:
330
- session: AiohttpSession | None = None
329
+ def create_aiogram_tg_bot(*, tg_bot_token: str, tg_bot_proxy_url: str | None = None, **kwargs) -> Bot:
330
+ kwargs["token"] = tg_bot_token
331
+
331
332
  if tg_bot_proxy_url:
332
- session = AiohttpSession(proxy=tg_bot_proxy_url)
333
- tg_bot = Bot(
334
- token=tg_bot_token,
335
- default=DefaultBotProperties(
333
+ kwargs["session"] = AiohttpSession(proxy=tg_bot_proxy_url)
334
+
335
+ if kwargs.get("default") is None:
336
+ kwargs["default"] = DefaultBotProperties(
336
337
  parse_mode=ParseMode.HTML,
337
338
  disable_notification=False,
338
339
  link_preview_is_disabled=True
339
- ),
340
- session=session
341
- )
340
+ )
341
+
342
+ tg_bot = Bot(**kwargs)
342
343
 
343
344
  return tg_bot
344
345
 
@@ -2,16 +2,14 @@
2
2
 
3
3
  import asyncio
4
4
  import logging
5
- from datetime import timedelta
5
+ from typing import Any
6
6
  from urllib.parse import urljoin
7
7
 
8
- import aiohttp
9
- from aiohttp import ClientResponseError, ClientResponse, ClientTimeout
8
+ from aiohttp import ClientResponse
10
9
  from pydantic import ConfigDict, BaseModel
11
10
 
12
11
  from arpakitlib.ar_base64_util import convert_base64_string_to_bytes
13
- from arpakitlib.ar_json_util import safely_transfer_to_json_str
14
- from arpakitlib.ar_sleep_util import async_safe_sleep
12
+ from arpakitlib.ar_http_request_util import async_make_http_request
15
13
 
16
14
  _ARPAKIT_LIB_MODULE_VERSION = "3.0"
17
15
 
@@ -19,9 +17,6 @@ _ARPAKIT_LIB_MODULE_VERSION = "3.0"
19
17
  class BaseAPIModel(BaseModel):
20
18
  model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
21
19
 
22
- def simple_json(self) -> str:
23
- return safely_transfer_to_json_str(self.model_dump(mode="json"))
24
-
25
20
 
26
21
  class GenerateImageFromNumberResApiModel(BaseAPIModel):
27
22
  image_filename: str
@@ -39,7 +34,7 @@ class DreamAIAPIClient:
39
34
  self,
40
35
  *,
41
36
  base_url: str = "https://api.dream_ai.arpakit.com/api/v1",
42
- api_key: str | None = None
37
+ api_key: str | None = "1"
43
38
  ):
44
39
  self._logger = logging.getLogger(__name__)
45
40
  self.api_key = api_key
@@ -51,60 +46,35 @@ class DreamAIAPIClient:
51
46
  if api_key is not None:
52
47
  self.headers.update({"apikey": api_key})
53
48
 
54
- async def _async_make_request(self, *, method: str = "GET", url: str, **kwargs) -> ClientResponse:
55
- max_tries = 7
56
- tries = 0
57
-
58
- kwargs["url"] = url
59
- kwargs["method"] = method
60
- kwargs["timeout"] = ClientTimeout(total=timedelta(seconds=15).total_seconds())
61
- kwargs["headers"] = self.headers
62
-
63
- while True:
64
- tries += 1
65
- self._logger.info(f"{method} {url}")
66
- try:
67
- async with aiohttp.ClientSession() as session:
68
- async with session.request(**kwargs) as response:
69
- await response.read()
70
- return response
71
- except Exception as err:
72
- self._logger.warning(f"{tries}/{max_tries} {err} {method} {url}")
73
- if tries >= max_tries:
74
- raise err
75
- await async_safe_sleep(timedelta(seconds=0.1).total_seconds())
76
- continue
49
+ async def _async_make_http_request(
50
+ self, *, method: str = "GET", url: str, params: dict[str, Any] | None = None
51
+ ) -> ClientResponse:
52
+ response = await async_make_http_request(
53
+ method=method,
54
+ url=url,
55
+ headers=self.headers,
56
+ params=params
57
+ )
58
+ response.raise_for_status()
59
+ return response
77
60
 
78
61
  async def healthcheck(self) -> bool:
79
- response = await self._async_make_request(method="GET", url=urljoin(self.base_url, "healthcheck"))
80
- response.raise_for_status()
62
+ response = await self._async_make_http_request(method="GET", url=urljoin(self.base_url, "healthcheck"))
81
63
  json_data = await response.json()
82
- return json_data["data"]["healthcheck"]
64
+ return json_data["data"]["healthcheck"] == "healthcheck"
83
65
 
84
66
  async def is_healthcheck_good(self) -> bool:
85
67
  try:
86
68
  return await self.healthcheck()
87
- except ClientResponseError:
88
- return False
89
-
90
- async def auth_healthcheck(self) -> bool:
91
- response = await self._async_make_request(method="GET", url=urljoin(self.base_url, "auth_healthcheck"))
92
- response.raise_for_status()
93
- json_data = await response.json()
94
- return json_data["data"]["auth_healthcheck"]
95
-
96
- async def is_auth_healthcheck_good(self) -> bool:
97
- try:
98
- return await self.auth_healthcheck()
99
- except ClientResponseError:
69
+ except Exception as exception:
70
+ self._logger.error(exception)
100
71
  return False
101
72
 
102
73
  async def generate_image_from_number(self, *, number: int) -> GenerateImageFromNumberResApiModel:
103
- response = await self._async_make_request(
74
+ response = await self._async_make_http_request(
104
75
  method="GET", url=urljoin(self.base_url, "generate_image_from_number"),
105
76
  params={"number": number}
106
77
  )
107
- response.raise_for_status()
108
78
  json_data = await response.json()
109
79
  return GenerateImageFromNumberResApiModel.model_validate(json_data)
110
80
 
@@ -27,6 +27,7 @@ from starlette.staticfiles import StaticFiles
27
27
  from arpakitlib.ar_base_worker_util import BaseWorker
28
28
  from arpakitlib.ar_dict_util import combine_dicts
29
29
  from arpakitlib.ar_enumeration_util import Enumeration
30
+ from arpakitlib.ar_file_storage_in_dir_util import FileStorageInDir
30
31
  from arpakitlib.ar_json_util import safely_transfer_to_json_str_to_json_obj
31
32
  from arpakitlib.ar_logging_util import setup_normal_logging
32
33
  from arpakitlib.ar_sqlalchemy_model_util import StoryLogDBM
@@ -396,18 +397,29 @@ class InitSqlalchemyDBStartupAPIEvent(BaseStartupAPIEvent):
396
397
  super().__init__()
397
398
  self.sqlalchemy_db = sqlalchemy_db
398
399
 
399
- def async_on_startup(self, *args, **kwargs):
400
+ async def async_on_startup(self, *args, **kwargs):
400
401
  self.sqlalchemy_db.init()
401
402
 
402
403
 
403
404
  class SafeRunWorkerStartupAPIEvent(BaseStartupAPIEvent):
404
- def __init__(self, worker: BaseWorker, safe_run_in_background_mode: str):
405
+ def __init__(self, workers: list[BaseWorker], safe_run_in_background_mode: str):
405
406
  super().__init__()
406
- self.worker = worker
407
+ self.workers = workers
407
408
  self.safe_run_in_background_mode = safe_run_in_background_mode
408
409
 
409
- def async_on_startup(self, *args, **kwargs):
410
- self.worker.safe_run_in_background(safe_run_in_background_mode=self.safe_run_in_background_mode)
410
+ async def async_on_startup(self, *args, **kwargs):
411
+ for worker in self.workers:
412
+ _ = worker.safe_run_in_background(safe_run_in_background_mode=self.safe_run_in_background_mode)
413
+
414
+
415
+ class InitFileStoragesInDir(BaseStartupAPIEvent):
416
+ def __init__(self, file_storages_in_dir: list[FileStorageInDir]):
417
+ super().__init__()
418
+ self.file_storages_in_dir = file_storages_in_dir
419
+
420
+ async def async_on_startup(self, *args, **kwargs):
421
+ for file_storage_in_dir in self.file_storages_in_dir:
422
+ file_storage_in_dir.init()
411
423
 
412
424
 
413
425
  class BaseTransmittedAPIData(BaseModel):
@@ -422,7 +434,7 @@ class BaseAPIAuthData(BaseModel):
422
434
  model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
423
435
 
424
436
  require_api_key_string: bool = False
425
- require_token_string: bool = None
437
+ require_token_string: bool = False
426
438
 
427
439
  token_string: str | None = None
428
440
  api_key_string: str | None = None
@@ -567,7 +579,8 @@ def create_fastapi_app(
567
579
  shutdown_api_events: list[BaseShutdownAPIEvent] | None = None,
568
580
  transmitted_api_data: BaseTransmittedAPIData = BaseTransmittedAPIData(),
569
581
  main_api_router: APIRouter = simple_api_router_for_testing(),
570
- contact: dict[str, Any] | None = None
582
+ contact: dict[str, Any] | None = None,
583
+ media_dirpath: str | None = None
571
584
  ):
572
585
  if contact is None:
573
586
  contact = _DEFAULT_CONTACT
@@ -591,6 +604,9 @@ def create_fastapi_app(
591
604
  contact=contact
592
605
  )
593
606
 
607
+ if media_dirpath is not None:
608
+ app.mount("/media", StaticFiles(directory=media_dirpath), name="media")
609
+
594
610
  app.state.transmitted_api_data = transmitted_api_data
595
611
 
596
612
  add_cors_to_app(app=app)
@@ -8,6 +8,9 @@ _ARPAKIT_LIB_MODULE_VERSION = "3.0"
8
8
 
9
9
 
10
10
  def init_log_file(*, log_filepath: str):
11
+ directory = os.path.dirname(log_filepath)
12
+ if directory and not os.path.exists(directory):
13
+ os.makedirs(directory, exist_ok=True)
11
14
  if not os.path.exists(path=log_filepath):
12
15
  with open(file=log_filepath, mode="w") as file:
13
16
  file.write("")
@@ -76,11 +76,11 @@ class ScheduleUUSTAPIClient:
76
76
  self,
77
77
  *,
78
78
  url: str,
79
- params: dict | None = None
79
+ params: dict[str, Any] | None = None
80
80
  ) -> dict[str, Any]:
81
81
  response = await async_make_http_request(
82
- url=url,
83
82
  method="GET",
83
+ url=url,
84
84
  params=combine_dicts(params, self.auth_params()),
85
85
  proxy_url_=self.api_proxy_url,
86
86
  max_tries_=9,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arpakitlib
3
- Version: 1.6.90
3
+ Version: 1.6.92
4
4
  Summary: arpakitlib
5
5
  Home-page: https://github.com/ARPAKIT-Company/arpakitlib
6
6
  License: Apache-2.0
@@ -8,6 +8,7 @@ arpakitlib/_arpakit_project_template/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0
8
8
  arpakitlib/_arpakit_project_template/README.md,sha256=n7bVQwXStxdwN07oMF9ot5076qVjTk_H-rmUaSYfHK8,66
9
9
  arpakitlib/_arpakit_project_template/manage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  arpakitlib/_arpakit_project_template/manage/beutify_json.py,sha256=mzmt-5piAHqgihLsqOpPx1JjDc1qA5F1XHBxDdR-BxY,215
11
+ arpakitlib/_arpakit_project_template/manage/check_logging.py,sha256=77OQzbolrlfc6h5EK5nkJ4RamJ034mFVW8s0rVQGnhM,211
11
12
  arpakitlib/_arpakit_project_template/manage/check_settings.py,sha256=JYR-IPgvYQOmJedKY9vOctbxEcUlaxZR-P0JXT9L2JQ,143
12
13
  arpakitlib/_arpakit_project_template/manage/docker_ps.sh,sha256=uwm8vHgeuNLCOn0o9hgP_uc-PUkS9FwLyzZh6ItZ3do,15
13
14
  arpakitlib/_arpakit_project_template/manage/generate_env_example.py,sha256=gveKEz6zf5rwKNBXtHacPEjxxjPTbLy4n-Ztv0BqCWE,331
@@ -64,7 +65,7 @@ arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py,sha256=Wq
64
65
  arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py,sha256=ogTmetjQiRa57TKNfVH5A6GFTqBrU1Js0vTok6jlL_A,82
65
66
  arpakitlib/_arpakit_project_template/src/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
67
  arpakitlib/ar_additional_model_util.py,sha256=tNzZhZtvtJ1qC6Cn4UnyoEL58HudfpCdQy5ftkCqyik,473
67
- arpakitlib/ar_aiogram_util.py,sha256=AyYNyb_3r5O_ATUTGKbddJOuvgoVq_FFVuqBfQVP5eo,12248
68
+ arpakitlib/ar_aiogram_util.py,sha256=5JPCDZpdBGTE-EIWPRez9amCZAX7XemFIVu5YrQK7Pw,12264
68
69
  arpakitlib/ar_arpakit_lib_module_util.py,sha256=V_mc3Ml73Tzz3arxmwEfIxruKMyrwbe8XZ9FfVDtUXY,5446
69
70
  arpakitlib/ar_arpakit_schedule_uust_api_client_util.py,sha256=SYWWQDohPnw0qpBIu2hEvGZRVdaI4NUUQdEjnMnseo4,18237
70
71
  arpakitlib/ar_arpakitlib_cli.py,sha256=T-YGAL6hRdrT2x3ug33N3GrWLYKSjK25r9SlaiBT7-M,2366
@@ -73,7 +74,7 @@ arpakitlib/ar_base_worker_util.py,sha256=YGoSpkE52QGu_mQdrefThc-pCnhhLEhWchSM3HZ
73
74
  arpakitlib/ar_cache_file_util.py,sha256=Fo2pH-Zqm966KWFBHG_pbiySGZvhIFCYqy7k1weRfJ0,3476
74
75
  arpakitlib/ar_datetime_util.py,sha256=Xe1NiT9oPQzNSG7RVRkhukhbg4i-hhS5ImmV7sPUc8o,971
75
76
  arpakitlib/ar_dict_util.py,sha256=cF5LQJ6tLqyGoEXfDljMDZrikeZoWPw7CgINHIFGvXM,419
76
- arpakitlib/ar_dream_ai_api_client_util.py,sha256=hDPL9wbG4MjIuhn2ed6qepueogANIkt-NddhhiPUv0Y,4029
77
+ arpakitlib/ar_dream_ai_api_client_util.py,sha256=CLN0RnuFn-JzoXLiz2eqnt-z2fkG6NbZEDLThVAyR88,2770
77
78
  arpakitlib/ar_encrypt_decrypt_util.py,sha256=GhWnp7HHkbhwFVVCzO1H07m-5gryr4yjWsXjOaNQm1Y,520
78
79
  arpakitlib/ar_enumeration_util.py,sha256=0DN46uyI0Gu9JPDgso3XPbnre7hZZefYTZwmmE1iYH4,2250
79
80
  arpakitlib/ar_fastapi_static/redoc/redoc.standalone.js,sha256=WCuodUNv1qVh0oW5fjnJDwb5AwOue73jKHdI9z8iGKU,909365
@@ -95,7 +96,7 @@ arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css,sha256=jzPZlgJTFwSdSphk9C
95
96
  arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css.map,sha256=5wq8eXMLU6Zxb45orZPL1zAsBFJReFw6GjYqGpUX3hg,262650
96
97
  arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js,sha256=ffrLZHHEQ_g84A-ul3yWa10Kk09waOAxHcQXPuZuavg,339292
97
98
  arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map,sha256=9UhIW7MqCOZPAz1Sl1IKfZUuhWU0p-LJqrnjjJD9Xhc,1159454
98
- arpakitlib/ar_fastapi_util.py,sha256=1_Fopm982g9EPSvbBx9vO6E0LF8sKzmpMRhydOI9bgE,21095
99
+ arpakitlib/ar_fastapi_util.py,sha256=X0kwP4b58gUhIkdXv8ougCGWbbIMB_6Qy-FMcd7mdk0,21744
99
100
  arpakitlib/ar_file_storage_in_dir_util.py,sha256=D3e3rGuHoI6xqAA5mVvEpVVpOWY1jyjNsjj2UhyHRbE,3674
100
101
  arpakitlib/ar_file_util.py,sha256=XiwmeycxoLqtYnGOu5q6IEaJJXilZvtLvsKDKtwqSLY,137
101
102
  arpakitlib/ar_hash_util.py,sha256=Iqy6KBAOLBQMFLWv676boI5sV7atT2B-fb7aCdHOmIQ,340
@@ -107,7 +108,7 @@ arpakitlib/ar_json_util.py,sha256=GwHDdrBWiJBHSc07Qe0aN1Gp_uM0pYpTwzU9JAgsKAo,97
107
108
  arpakitlib/ar_jwt_util.py,sha256=Rhm4ywoTAn6yOV8NLjDASfAtAtheROxxDP40G3XjnuQ,761
108
109
  arpakitlib/ar_list_of_dicts_to_xlsx.py,sha256=MyjEl4Jl4beLVZqLVQMMv0-XDtBD3Xh4Z_ZPDJeFu04,745
109
110
  arpakitlib/ar_list_util.py,sha256=2woOAHAU8oTIiVjZ8GLnx15odEaoQUq3Q0JPxlufFF0,457
110
- arpakitlib/ar_logging_util.py,sha256=c5wX2FLqCzb4aLckLVhIJ7go52rJQ4GN9dIkJ6KMc3o,1500
111
+ arpakitlib/ar_logging_util.py,sha256=Gyd7B9k0glIXPm6dASiigWLq9LC9lw6vhXTCeWpY5PY,1644
111
112
  arpakitlib/ar_mongodb_util.py,sha256=2ECkTnGAZ92qxioL-fmN6R4yZOSr3bXdXLWTzT1C3vk,4038
112
113
  arpakitlib/ar_need_type_util.py,sha256=xq5bbAXJG-93CRVZUcLW0ZdM22rj-ZUW17C5hX_5grg,1699
113
114
  arpakitlib/ar_openai_util.py,sha256=dHUbfg1sVVCjsNl_fra3iCMEz1bR-Hk9fE-DdYbu7Wc,1215
@@ -116,7 +117,7 @@ arpakitlib/ar_parse_command.py,sha256=-s61xcATIsfw1eV_iD3xi-grsitbGzSDoAFc5V0OFy
116
117
  arpakitlib/ar_postgresql_util.py,sha256=1AuLjEaa1Lg4pzn-ukCVnDi35Eg1k91APRTqZhIJAdo,945
117
118
  arpakitlib/ar_project_template_util.py,sha256=Yh3tzNYq0rrKc1MY-qsW1Ljhi9ADz8nYXMiPDH-e6PQ,3097
118
119
  arpakitlib/ar_run_cmd_util.py,sha256=D_rPavKMmWkQtwvZFz-Io5Ak8eSODHkcFeLPzNVC68g,1072
119
- arpakitlib/ar_schedule_uust_api_client_util.py,sha256=0X4yACjt8cxMvuoZUq4S0HuVhVUQW5fGmiPcG7vwM8Y,6027
120
+ arpakitlib/ar_schedule_uust_api_client_util.py,sha256=XLaXoKqZRUY-pbn9YAXwnyX7LElDYju_eSTbXHPnyEY,6037
120
121
  arpakitlib/ar_settings_util.py,sha256=NvFzpIaQhlMp-BZwttUY_9gamMC5cpJk2Kp2B3BtMug,1296
121
122
  arpakitlib/ar_sleep_util.py,sha256=9ZN4Qo4eZ_q3hjM7vNBQjFRcH-9-sqv3QLSjnxVJE90,1405
122
123
  arpakitlib/ar_sqlalchemy_model_util.py,sha256=ttdgOwQfoHTKqgivBtXoSbJoBCASHDjLEFK5tJ9kNNE,4779
@@ -126,9 +127,9 @@ arpakitlib/ar_str_util.py,sha256=AhcdrEm-pXRilCaDWCdTfVkQSy0SnbE52ur43Ltr6cI,212
126
127
  arpakitlib/ar_type_util.py,sha256=5nDnXL5Oyozlg8XvxMrogsoYiG8_atItg46A0mtv-pk,2025
127
128
  arpakitlib/ar_yookassa_api_client_util.py,sha256=5GMvu8paByni8buhc1vpHB7n6oXe0gPfj1LSvnyZCrQ,5307
128
129
  arpakitlib/ar_zabbix_util.py,sha256=Q-VR4MvoZ9aHwZeYZr9G3LwN-ANx1T5KFmF6pvPM-9M,6402
129
- arpakitlib-1.6.90.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
130
- arpakitlib-1.6.90.dist-info/METADATA,sha256=9jfwerueMneOaNsQrw6wXgcHIMmHZHA4NQCRa-EPtsI,2739
131
- arpakitlib-1.6.90.dist-info/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0s5UFznCTkVCau4,763
132
- arpakitlib-1.6.90.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
133
- arpakitlib-1.6.90.dist-info/entry_points.txt,sha256=VHkTDXDOMrgcNzGfKhEhoOIIz6T8Kkt46hy95Zc1iL0,74
134
- arpakitlib-1.6.90.dist-info/RECORD,,
130
+ arpakitlib-1.6.92.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
131
+ arpakitlib-1.6.92.dist-info/METADATA,sha256=FZocXYl5hW3Jsx-yVBCzGlw36cXaS3il6QcsGbtcl8I,2739
132
+ arpakitlib-1.6.92.dist-info/NOTICE,sha256=95aUzaPJjVpDsGAsNzVnq7tHTxAl0s5UFznCTkVCau4,763
133
+ arpakitlib-1.6.92.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
134
+ arpakitlib-1.6.92.dist-info/entry_points.txt,sha256=VHkTDXDOMrgcNzGfKhEhoOIIz6T8Kkt46hy95Zc1iL0,74
135
+ arpakitlib-1.6.92.dist-info/RECORD,,