arpakitlib 1.6.90__tar.gz → 1.6.92__tar.gz

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 (135) hide show
  1. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/PKG-INFO +1 -1
  2. arpakitlib-1.6.92/arpakitlib/_arpakit_project_template/manage/check_logging.py +13 -0
  3. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_aiogram_util.py +10 -9
  4. arpakitlib-1.6.92/arpakitlib/ar_dream_ai_api_client_util.py +92 -0
  5. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_util.py +23 -7
  6. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_logging_util.py +3 -0
  7. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_schedule_uust_api_client_util.py +2 -2
  8. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/pyproject.toml +1 -1
  9. arpakitlib-1.6.90/arpakitlib/ar_dream_ai_api_client_util.py +0 -122
  10. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/LICENSE +0 -0
  11. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/NOTICE +0 -0
  12. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/README.md +0 -0
  13. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/__init__.py +0 -0
  14. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/.env_example +0 -0
  15. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/.gitignore +0 -0
  16. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/.python-version +0 -0
  17. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/AUTHOR.md +0 -0
  18. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/LICENSE +0 -0
  19. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/NOTICE +0 -0
  20. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/README.md +0 -0
  21. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/__init__.py +0 -0
  22. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/beutify_json.py +0 -0
  23. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/check_settings.py +0 -0
  24. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/docker_ps.sh +0 -0
  25. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/generate_env_example.py +0 -0
  26. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/git_commit.sh +0 -0
  27. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_company_github_1.sh +0 -0
  28. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_company_gitlab_1.sh +0 -0
  29. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/git_remote_v.sh +0 -0
  30. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/git_set_arpakit_company_origin.sh +0 -0
  31. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/git_status.sh +0 -0
  32. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/hello_world.py +0 -0
  33. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/note/__init__.py +0 -0
  34. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/note/note_1.txt +0 -0
  35. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/note/note_2.txt +0 -0
  36. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/note/note_3.txt +0 -0
  37. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/note/note_4.txt +0 -0
  38. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/note/note_5.txt +0 -0
  39. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_add_plugin_export.sh +0 -0
  40. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_check.sh +0 -0
  41. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_clear_cache.sh +0 -0
  42. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_config_virtualenvs_in_project_true.sh +0 -0
  43. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_generate_requirements.txt.sh +0 -0
  44. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_install.sh +0 -0
  45. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_lock.sh +0 -0
  46. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_remove_and_add_arpakitlib.sh +0 -0
  47. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_show.sh +0 -0
  48. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_update.sh +0 -0
  49. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/poetry_update_arpakitlib.sh +0 -0
  50. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/__init__.py +0 -0
  51. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_1.py +0 -0
  52. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_2.py +0 -0
  53. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_3.py +0 -0
  54. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_4.py +0 -0
  55. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_5.py +0 -0
  56. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_6.py +0 -0
  57. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_7.py +0 -0
  58. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_8.sh +0 -0
  59. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_9.sh +0 -0
  60. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/pyproject.toml.example +0 -0
  61. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/resource/__init__.py +0 -0
  62. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/resource/static/__init__.py +0 -0
  63. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/__init__.py +0 -0
  64. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/additional_model/__init__.py +0 -0
  65. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/additional_model/additional_model.py +0 -0
  66. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/business_service/__init__.py +0 -0
  67. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/core/__init__.py +0 -0
  68. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/core/const.py +0 -0
  69. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/core/settings.py +0 -0
  70. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/core/util.py +0 -0
  71. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/test_data/__init__.py +0 -0
  72. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py +0 -0
  73. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py +0 -0
  74. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py +0 -0
  75. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py +0 -0
  76. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py +0 -0
  77. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/_arpakit_project_template/src/util/__init__.py +0 -0
  78. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_additional_model_util.py +0 -0
  79. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_arpakit_lib_module_util.py +0 -0
  80. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_arpakit_schedule_uust_api_client_util.py +0 -0
  81. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_arpakitlib_cli.py +0 -0
  82. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_base64_util.py +0 -0
  83. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_base_worker_util.py +0 -0
  84. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_cache_file_util.py +0 -0
  85. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_datetime_util.py +0 -0
  86. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_dict_util.py +0 -0
  87. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_encrypt_decrypt_util.py +0 -0
  88. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_enumeration_util.py +0 -0
  89. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/redoc/redoc.standalone.js +0 -0
  90. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/favicon-16x16.png +0 -0
  91. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/favicon-32x32.png +0 -0
  92. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/index.css +0 -0
  93. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/index.html +0 -0
  94. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/oauth2-redirect.html +0 -0
  95. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-initializer.js +0 -0
  96. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js +0 -0
  97. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js.map +0 -0
  98. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
  99. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -0
  100. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js +0 -0
  101. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  102. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
  103. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  104. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css +0 -0
  105. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css.map +0 -0
  106. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js +0 -0
  107. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map +0 -0
  108. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_file_storage_in_dir_util.py +0 -0
  109. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_file_util.py +0 -0
  110. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_hash_util.py +0 -0
  111. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_hello_world.py +0 -0
  112. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_http_request_util.py +0 -0
  113. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_ip_util.py +0 -0
  114. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_json_db_util.py +0 -0
  115. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_json_util.py +0 -0
  116. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_jwt_util.py +0 -0
  117. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_list_of_dicts_to_xlsx.py +0 -0
  118. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_list_util.py +0 -0
  119. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_mongodb_util.py +0 -0
  120. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_need_type_util.py +0 -0
  121. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_openai_util.py +0 -0
  122. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_operation_execution_util.py +0 -0
  123. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_parse_command.py +0 -0
  124. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_postgresql_util.py +0 -0
  125. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_project_template_util.py +0 -0
  126. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_run_cmd_util.py +0 -0
  127. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_settings_util.py +0 -0
  128. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_sleep_util.py +0 -0
  129. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_sqlalchemy_model_util.py +0 -0
  130. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_sqlalchemy_util.py +0 -0
  131. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_ssh_util.py +0 -0
  132. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_str_util.py +0 -0
  133. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_type_util.py +0 -0
  134. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_yookassa_api_client_util.py +0 -0
  135. {arpakitlib-1.6.90 → arpakitlib-1.6.92}/arpakitlib/ar_zabbix_util.py +0 -0
@@ -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
@@ -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
 
@@ -0,0 +1,92 @@
1
+ # arpakit
2
+
3
+ import asyncio
4
+ import logging
5
+ from typing import Any
6
+ from urllib.parse import urljoin
7
+
8
+ from aiohttp import ClientResponse
9
+ from pydantic import ConfigDict, BaseModel
10
+
11
+ from arpakitlib.ar_base64_util import convert_base64_string_to_bytes
12
+ from arpakitlib.ar_http_request_util import async_make_http_request
13
+
14
+ _ARPAKIT_LIB_MODULE_VERSION = "3.0"
15
+
16
+
17
+ class BaseAPIModel(BaseModel):
18
+ model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
19
+
20
+
21
+ class GenerateImageFromNumberResApiModel(BaseAPIModel):
22
+ image_filename: str
23
+ image_url: str
24
+ image_base64: str
25
+
26
+ def save_file(self, filepath: str):
27
+ with open(filepath, mode="wb") as f:
28
+ f.write(convert_base64_string_to_bytes(base64_string=self.image_base64))
29
+ return filepath
30
+
31
+
32
+ class DreamAIAPIClient:
33
+ def __init__(
34
+ self,
35
+ *,
36
+ base_url: str = "https://api.dream_ai.arpakit.com/api/v1",
37
+ api_key: str | None = "1"
38
+ ):
39
+ self._logger = logging.getLogger(__name__)
40
+ self.api_key = api_key
41
+ base_url = base_url.strip()
42
+ if not base_url.endswith("/"):
43
+ base_url += "/"
44
+ self.base_url = base_url
45
+ self.headers = {"Content-Type": "application/json"}
46
+ if api_key is not None:
47
+ self.headers.update({"apikey": api_key})
48
+
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
60
+
61
+ async def healthcheck(self) -> bool:
62
+ response = await self._async_make_http_request(method="GET", url=urljoin(self.base_url, "healthcheck"))
63
+ json_data = await response.json()
64
+ return json_data["data"]["healthcheck"] == "healthcheck"
65
+
66
+ async def is_healthcheck_good(self) -> bool:
67
+ try:
68
+ return await self.healthcheck()
69
+ except Exception as exception:
70
+ self._logger.error(exception)
71
+ return False
72
+
73
+ async def generate_image_from_number(self, *, number: int) -> GenerateImageFromNumberResApiModel:
74
+ response = await self._async_make_http_request(
75
+ method="GET", url=urljoin(self.base_url, "generate_image_from_number"),
76
+ params={"number": number}
77
+ )
78
+ json_data = await response.json()
79
+ return GenerateImageFromNumberResApiModel.model_validate(json_data)
80
+
81
+
82
+ def __example():
83
+ pass
84
+
85
+
86
+ async def __async_example():
87
+ pass
88
+
89
+
90
+ if __name__ == '__main__':
91
+ __example()
92
+ asyncio.run(__async_example())
@@ -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
  [tool.poetry]
2
2
  name = "arpakitlib"
3
- version = "1.6.90"
3
+ version = "1.6.92"
4
4
  description = "arpakitlib"
5
5
  authors = ["arpakit <arpakit@gmail.com>", "arpakit_support <support@arpakit.com>"]
6
6
  license = "Apache License 2.0"
@@ -1,122 +0,0 @@
1
- # arpakit
2
-
3
- import asyncio
4
- import logging
5
- from datetime import timedelta
6
- from urllib.parse import urljoin
7
-
8
- import aiohttp
9
- from aiohttp import ClientResponseError, ClientResponse, ClientTimeout
10
- from pydantic import ConfigDict, BaseModel
11
-
12
- 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
15
-
16
- _ARPAKIT_LIB_MODULE_VERSION = "3.0"
17
-
18
-
19
- class BaseAPIModel(BaseModel):
20
- model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
21
-
22
- def simple_json(self) -> str:
23
- return safely_transfer_to_json_str(self.model_dump(mode="json"))
24
-
25
-
26
- class GenerateImageFromNumberResApiModel(BaseAPIModel):
27
- image_filename: str
28
- image_url: str
29
- image_base64: str
30
-
31
- def save_file(self, filepath: str):
32
- with open(filepath, mode="wb") as f:
33
- f.write(convert_base64_string_to_bytes(base64_string=self.image_base64))
34
- return filepath
35
-
36
-
37
- class DreamAIAPIClient:
38
- def __init__(
39
- self,
40
- *,
41
- base_url: str = "https://api.dream_ai.arpakit.com/api/v1",
42
- api_key: str | None = None
43
- ):
44
- self._logger = logging.getLogger(__name__)
45
- self.api_key = api_key
46
- base_url = base_url.strip()
47
- if not base_url.endswith("/"):
48
- base_url += "/"
49
- self.base_url = base_url
50
- self.headers = {"Content-Type": "application/json"}
51
- if api_key is not None:
52
- self.headers.update({"apikey": api_key})
53
-
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
77
-
78
- 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()
81
- json_data = await response.json()
82
- return json_data["data"]["healthcheck"]
83
-
84
- async def is_healthcheck_good(self) -> bool:
85
- try:
86
- 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:
100
- return False
101
-
102
- async def generate_image_from_number(self, *, number: int) -> GenerateImageFromNumberResApiModel:
103
- response = await self._async_make_request(
104
- method="GET", url=urljoin(self.base_url, "generate_image_from_number"),
105
- params={"number": number}
106
- )
107
- response.raise_for_status()
108
- json_data = await response.json()
109
- return GenerateImageFromNumberResApiModel.model_validate(json_data)
110
-
111
-
112
- def __example():
113
- pass
114
-
115
-
116
- async def __async_example():
117
- pass
118
-
119
-
120
- if __name__ == '__main__':
121
- __example()
122
- asyncio.run(__async_example())
File without changes
File without changes
File without changes