arpakitlib 1.6.91__tar.gz → 1.6.93__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.91 → arpakitlib-1.6.93}/PKG-INFO +1 -1
  2. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_aiogram_util.py +10 -9
  3. arpakitlib-1.6.93/arpakitlib/ar_dream_ai_api_client_util.py +96 -0
  4. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_util.py +5 -1
  5. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_http_request_util.py +15 -2
  6. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_schedule_uust_api_client_util.py +20 -17
  7. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_yookassa_api_client_util.py +14 -8
  8. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/pyproject.toml +1 -1
  9. arpakitlib-1.6.91/arpakitlib/ar_dream_ai_api_client_util.py +0 -122
  10. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/LICENSE +0 -0
  11. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/NOTICE +0 -0
  12. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/README.md +0 -0
  13. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/__init__.py +0 -0
  14. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/.env_example +0 -0
  15. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/.gitignore +0 -0
  16. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/.python-version +0 -0
  17. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/AUTHOR.md +0 -0
  18. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/LICENSE +0 -0
  19. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/NOTICE +0 -0
  20. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/README.md +0 -0
  21. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/__init__.py +0 -0
  22. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/beutify_json.py +0 -0
  23. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/check_logging.py +0 -0
  24. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/check_settings.py +0 -0
  25. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/docker_ps.sh +0 -0
  26. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/generate_env_example.py +0 -0
  27. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/git_commit.sh +0 -0
  28. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_company_github_1.sh +0 -0
  29. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_company_gitlab_1.sh +0 -0
  30. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/git_remote_v.sh +0 -0
  31. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/git_set_arpakit_company_origin.sh +0 -0
  32. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/git_status.sh +0 -0
  33. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/hello_world.py +0 -0
  34. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/note/__init__.py +0 -0
  35. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/note/note_1.txt +0 -0
  36. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/note/note_2.txt +0 -0
  37. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/note/note_3.txt +0 -0
  38. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/note/note_4.txt +0 -0
  39. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/note/note_5.txt +0 -0
  40. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_add_plugin_export.sh +0 -0
  41. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_check.sh +0 -0
  42. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_clear_cache.sh +0 -0
  43. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_config_virtualenvs_in_project_true.sh +0 -0
  44. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_generate_requirements.txt.sh +0 -0
  45. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_install.sh +0 -0
  46. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_lock.sh +0 -0
  47. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_remove_and_add_arpakitlib.sh +0 -0
  48. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_show.sh +0 -0
  49. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_update.sh +0 -0
  50. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/poetry_update_arpakitlib.sh +0 -0
  51. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/__init__.py +0 -0
  52. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_1.py +0 -0
  53. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_2.py +0 -0
  54. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_3.py +0 -0
  55. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_4.py +0 -0
  56. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_5.py +0 -0
  57. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_6.py +0 -0
  58. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_7.py +0 -0
  59. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_8.sh +0 -0
  60. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_9.sh +0 -0
  61. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/pyproject.toml.example +0 -0
  62. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/resource/__init__.py +0 -0
  63. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/resource/static/__init__.py +0 -0
  64. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/__init__.py +0 -0
  65. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/additional_model/__init__.py +0 -0
  66. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/additional_model/additional_model.py +0 -0
  67. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/business_service/__init__.py +0 -0
  68. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/core/__init__.py +0 -0
  69. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/core/const.py +0 -0
  70. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/core/settings.py +0 -0
  71. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/core/util.py +0 -0
  72. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/test_data/__init__.py +0 -0
  73. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py +0 -0
  74. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py +0 -0
  75. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py +0 -0
  76. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py +0 -0
  77. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py +0 -0
  78. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/_arpakit_project_template/src/util/__init__.py +0 -0
  79. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_additional_model_util.py +0 -0
  80. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_arpakit_lib_module_util.py +0 -0
  81. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_arpakit_schedule_uust_api_client_util.py +0 -0
  82. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_arpakitlib_cli.py +0 -0
  83. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_base64_util.py +0 -0
  84. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_base_worker_util.py +0 -0
  85. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_cache_file_util.py +0 -0
  86. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_datetime_util.py +0 -0
  87. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_dict_util.py +0 -0
  88. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_encrypt_decrypt_util.py +0 -0
  89. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_enumeration_util.py +0 -0
  90. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/redoc/redoc.standalone.js +0 -0
  91. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/favicon-16x16.png +0 -0
  92. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/favicon-32x32.png +0 -0
  93. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/index.css +0 -0
  94. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/index.html +0 -0
  95. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/oauth2-redirect.html +0 -0
  96. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-initializer.js +0 -0
  97. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js +0 -0
  98. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js.map +0 -0
  99. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
  100. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -0
  101. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js +0 -0
  102. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  103. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
  104. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  105. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css +0 -0
  106. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css.map +0 -0
  107. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js +0 -0
  108. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map +0 -0
  109. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_file_storage_in_dir_util.py +0 -0
  110. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_file_util.py +0 -0
  111. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_hash_util.py +0 -0
  112. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_hello_world.py +0 -0
  113. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_ip_util.py +0 -0
  114. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_json_db_util.py +0 -0
  115. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_json_util.py +0 -0
  116. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_jwt_util.py +0 -0
  117. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_list_of_dicts_to_xlsx.py +0 -0
  118. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_list_util.py +0 -0
  119. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_logging_util.py +0 -0
  120. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_mongodb_util.py +0 -0
  121. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_need_type_util.py +0 -0
  122. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_openai_util.py +0 -0
  123. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_operation_execution_util.py +0 -0
  124. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_parse_command.py +0 -0
  125. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_postgresql_util.py +0 -0
  126. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_project_template_util.py +0 -0
  127. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_run_cmd_util.py +0 -0
  128. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_settings_util.py +0 -0
  129. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_sleep_util.py +0 -0
  130. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_sqlalchemy_model_util.py +0 -0
  131. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_sqlalchemy_util.py +0 -0
  132. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_ssh_util.py +0 -0
  133. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_str_util.py +0 -0
  134. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/arpakitlib/ar_type_util.py +0 -0
  135. {arpakitlib-1.6.91 → arpakitlib-1.6.93}/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.91
3
+ Version: 1.6.93
4
4
  Summary: arpakitlib
5
5
  Home-page: https://github.com/ARPAKIT-Company/arpakitlib
6
6
  License: Apache-2.0
@@ -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,96 @@
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,
51
+ *,
52
+ method: str = "GET",
53
+ url: str,
54
+ params: dict[str, Any] | None = None
55
+ ) -> ClientResponse:
56
+ response = await async_make_http_request(
57
+ method=method,
58
+ url=url,
59
+ params=params,
60
+ headers=self.headers,
61
+ )
62
+ response.raise_for_status()
63
+ return response
64
+
65
+ async def healthcheck(self) -> bool:
66
+ response = await self._async_make_http_request(method="GET", url=urljoin(self.base_url, "healthcheck"))
67
+ json_data = await response.json()
68
+ return json_data["data"]["healthcheck"] == "healthcheck"
69
+
70
+ async def is_healthcheck_good(self) -> bool:
71
+ try:
72
+ return await self.healthcheck()
73
+ except Exception as exception:
74
+ self._logger.error(exception)
75
+ return False
76
+
77
+ async def generate_image_from_number(self, *, number: int) -> GenerateImageFromNumberResApiModel:
78
+ response = await self._async_make_http_request(
79
+ method="GET", url=urljoin(self.base_url, "generate_image_from_number"),
80
+ params={"number": number}
81
+ )
82
+ json_data = await response.json()
83
+ return GenerateImageFromNumberResApiModel.model_validate(json_data)
84
+
85
+
86
+ def __example():
87
+ pass
88
+
89
+
90
+ async def __async_example():
91
+ pass
92
+
93
+
94
+ if __name__ == '__main__':
95
+ __example()
96
+ asyncio.run(__async_example())
@@ -579,7 +579,8 @@ def create_fastapi_app(
579
579
  shutdown_api_events: list[BaseShutdownAPIEvent] | None = None,
580
580
  transmitted_api_data: BaseTransmittedAPIData = BaseTransmittedAPIData(),
581
581
  main_api_router: APIRouter = simple_api_router_for_testing(),
582
- contact: dict[str, Any] | None = None
582
+ contact: dict[str, Any] | None = None,
583
+ media_dirpath: str | None = None
583
584
  ):
584
585
  if contact is None:
585
586
  contact = _DEFAULT_CONTACT
@@ -603,6 +604,9 @@ def create_fastapi_app(
603
604
  contact=contact
604
605
  )
605
606
 
607
+ if media_dirpath is not None:
608
+ app.mount("/media", StaticFiles(directory=media_dirpath), name="media")
609
+
606
610
  app.state.transmitted_api_data = transmitted_api_data
607
611
 
608
612
  add_cors_to_app(app=app)
@@ -3,6 +3,7 @@
3
3
  import asyncio
4
4
  import logging
5
5
  from datetime import timedelta
6
+ from typing import Any
6
7
 
7
8
  import aiohttp
8
9
  import requests
@@ -20,6 +21,8 @@ def sync_make_http_request(
20
21
  *,
21
22
  method: str = "GET",
22
23
  url: str,
24
+ headers: dict[str, Any] | None = None,
25
+ params: dict[str, Any] | None = None,
23
26
  max_tries_: int = 9,
24
27
  proxy_url_: str | None = None,
25
28
  raise_for_status_: bool = False,
@@ -34,13 +37,17 @@ def sync_make_http_request(
34
37
 
35
38
  kwargs["method"] = method
36
39
  kwargs["url"] = url
37
- if timeout_ is not None:
38
- kwargs["timeout"] = timeout_.total_seconds()
40
+ if headers is not None:
41
+ kwargs["headers"] = headers
42
+ if params is not None:
43
+ kwargs["params"] = params
39
44
  if proxy_url_:
40
45
  kwargs["proxies"] = {
41
46
  "http": proxy_url_,
42
47
  "https": proxy_url_
43
48
  }
49
+ if timeout_ is not None:
50
+ kwargs["timeout"] = timeout_.total_seconds()
44
51
  if "allow_redirects" not in kwargs:
45
52
  kwargs["allow_redirects"] = True
46
53
 
@@ -64,6 +71,8 @@ async def async_make_http_request(
64
71
  *,
65
72
  method: str = "GET",
66
73
  url: str,
74
+ headers: dict[str, Any] | None = None,
75
+ params: dict[str, Any] | None = None,
67
76
  max_tries_: int = 9,
68
77
  proxy_url_: str | None = None,
69
78
  raise_for_status_: bool = False,
@@ -74,6 +83,10 @@ async def async_make_http_request(
74
83
 
75
84
  kwargs["method"] = method
76
85
  kwargs["url"] = url
86
+ if headers is not None:
87
+ kwargs["headers"] = headers
88
+ if params is not None:
89
+ kwargs["params"] = params
77
90
  if timeout_ is not None:
78
91
  kwargs["timeout"] = aiohttp.ClientTimeout(total=timeout_.total_seconds())
79
92
  if "allow_redirects" not in kwargs:
@@ -3,14 +3,14 @@
3
3
  import asyncio
4
4
  import hashlib
5
5
  import logging
6
- from datetime import datetime, timedelta
6
+ from datetime import datetime
7
7
  from typing import Any
8
8
 
9
9
  import pytz
10
+ from aiohttp import ClientResponse
10
11
 
11
12
  from arpakitlib.ar_dict_util import combine_dicts
12
13
  from arpakitlib.ar_http_request_util import async_make_http_request
13
- from arpakitlib.ar_type_util import raise_for_type
14
14
 
15
15
  _ARPAKIT_LIB_MODULE_VERSION = "3.0"
16
16
 
@@ -72,25 +72,22 @@ class ScheduleUUSTAPIClient:
72
72
  def generate_v2_token(self) -> str:
73
73
  return self.generate_new_v2_token(password_first_part=self.api_password_first_part)
74
74
 
75
- async def _async_make_http_get_request(
75
+ async def _async_make_http_request(
76
76
  self,
77
77
  *,
78
+ method: str = "GET",
78
79
  url: str,
79
- params: dict | None = None
80
- ) -> dict[str, Any]:
80
+ params: dict[str, Any] | None = None
81
+ ) -> ClientResponse:
81
82
  response = await async_make_http_request(
83
+ method=method,
82
84
  url=url,
83
- method="GET",
84
85
  params=combine_dicts(params, self.auth_params()),
85
86
  proxy_url_=self.api_proxy_url,
86
- max_tries_=9,
87
- timeout_=timedelta(seconds=15),
88
87
  raise_for_status_=True,
89
88
  headers=self.headers
90
89
  )
91
- json_data = await response.json()
92
- raise_for_type(json_data, dict)
93
- return json_data
90
+ return response
94
91
 
95
92
  async def get_current_week(self) -> int:
96
93
  """
@@ -100,10 +97,11 @@ class ScheduleUUSTAPIClient:
100
97
  }
101
98
  """
102
99
 
103
- json_data = await self._async_make_http_get_request(
100
+ response = await self._async_make_http_request(
104
101
  url=self.api_url,
105
102
  params={"ask": "get_current_week"}
106
103
  )
104
+ json_data = await response.json()
107
105
  return json_data["data"][0]
108
106
 
109
107
  async def get_current_semester(self) -> str:
@@ -114,10 +112,11 @@ class ScheduleUUSTAPIClient:
114
112
  }
115
113
  """
116
114
 
117
- json_data = await self._async_make_http_get_request(
115
+ response = await self._async_make_http_request(
118
116
  url=self.api_url,
119
117
  params={"ask": "get_current_semestr"}
120
118
  )
119
+ json_data = await response.json()
121
120
  return json_data["data"][0]
122
121
 
123
122
  async def get_groups(self) -> list[dict[str, Any]]:
@@ -135,10 +134,11 @@ class ScheduleUUSTAPIClient:
135
134
  }
136
135
  """
137
136
 
138
- json_data = await self._async_make_http_get_request(
137
+ response = await self._async_make_http_request(
139
138
  url=self.api_url,
140
139
  params={"ask": "get_group_list"}
141
140
  )
141
+ json_data = await response.json()
142
142
  return list(json_data["data"].values())
143
143
 
144
144
  async def get_group_lessons(self, group_id: int, semester: str | None = None) -> list[dict[str, Any]]:
@@ -148,27 +148,30 @@ class ScheduleUUSTAPIClient:
148
148
  }
149
149
  if semester is not None:
150
150
  params["semester"] = semester
151
- json_data = await self._async_make_http_get_request(
151
+ response = await self._async_make_http_request(
152
152
  url=self.api_url,
153
153
  params=params
154
154
  )
155
+ json_data = await response.json()
155
156
  return json_data["data"]
156
157
 
157
158
  async def get_teachers(self) -> list[dict[str, Any]]:
158
- json_data = await self._async_make_http_get_request(
159
+ response = await self._async_make_http_request(
159
160
  url=self.api_url,
160
161
  params={"ask": "get_teacher_list"}
161
162
  )
163
+ json_data = await response.json()
162
164
  return list(json_data["data"].values())
163
165
 
164
166
  async def get_teacher_lessons(self, teacher_id: int, semester: str | None = None) -> list[dict[str, Any]]:
165
167
  params = {"ask": "get_teacher_schedule", "id": teacher_id}
166
168
  if semester is not None:
167
169
  params["semester"] = semester
168
- json_data = await self._async_make_http_get_request(
170
+ response = await self._async_make_http_request(
169
171
  url=self.api_url,
170
172
  params=params
171
173
  )
174
+ json_data = await response.json()
172
175
  return json_data["data"]
173
176
 
174
177
  async def check_conn(self):
@@ -42,7 +42,7 @@ class YookassaAPIClient:
42
42
  self.headers = {"Content-Type": "application/json"}
43
43
  self._logger = logging.getLogger(self.__class__.__name__)
44
44
 
45
- def _sync_make_request(
45
+ def _sync_make_http_request(
46
46
  self,
47
47
  *,
48
48
  method: str,
@@ -53,10 +53,10 @@ class YookassaAPIClient:
53
53
  kwargs["headers"] = {}
54
54
  kwargs["headers"] = combine_dicts(self.headers, kwargs["headers"])
55
55
  kwargs["auth"] = (self.shop_id, self.secret_key)
56
- kwargs["timeout_"] = timedelta(seconds=3)
57
56
  return sync_make_http_request(
58
57
  method=method,
59
58
  url=url,
59
+ timeout_=timedelta(seconds=3),
60
60
  **kwargs
61
61
  )
62
62
 
@@ -88,7 +88,7 @@ class YookassaAPIClient:
88
88
  if idempotence_key is None:
89
89
  idempotence_key = str(uuid.uuid4())
90
90
 
91
- response = self._sync_make_request(
91
+ response = self._sync_make_http_request(
92
92
  method="POST",
93
93
  url="https://api.yookassa.ru/v3/payments",
94
94
  headers={"Idempotence-Key": idempotence_key},
@@ -104,7 +104,7 @@ class YookassaAPIClient:
104
104
  def sync_get_payment(self, payment_id: str) -> Optional[dict[str, Any]]:
105
105
  raise_for_type(payment_id, str)
106
106
 
107
- response = self._sync_make_request(
107
+ response = self._sync_make_http_request(
108
108
  method="GET",
109
109
  url=f"https://api.yookassa.ru/v3/payments/{payment_id}",
110
110
  headers=self.headers
@@ -119,15 +119,21 @@ class YookassaAPIClient:
119
119
 
120
120
  return json_data
121
121
 
122
- async def async_make_request(self, method: str, url: str, **kwargs) -> aiohttp.ClientResponse:
122
+ async def _async_make_http_request(
123
+ self,
124
+ *,
125
+ method: str = "GET",
126
+ url: str,
127
+ **kwargs
128
+ ) -> aiohttp.ClientResponse:
123
129
  if "headers" not in kwargs:
124
130
  kwargs["headers"] = {}
125
131
  kwargs["headers"] = combine_dicts(self.headers, kwargs["headers"])
126
132
  kwargs["auth"] = aiohttp.BasicAuth(login=str(self.shop_id), password=self.secret_key)
127
- kwargs["timeout_"] = timedelta(seconds=3)
128
133
  return await async_make_http_request(
129
134
  method=method,
130
135
  url=url,
136
+ timeout_=timedelta(seconds=3),
131
137
  **kwargs
132
138
  )
133
139
 
@@ -157,7 +163,7 @@ class YookassaAPIClient:
157
163
  if idempotence_key is None:
158
164
  idempotence_key = str(uuid.uuid4())
159
165
 
160
- response = await self.async_make_request(
166
+ response = await self._async_make_http_request(
161
167
  method="POST",
162
168
  url="https://api.yookassa.ru/v3/payments",
163
169
  headers={"Idempotence-Key": idempotence_key},
@@ -173,7 +179,7 @@ class YookassaAPIClient:
173
179
  async def async_get_payment(self, payment_id: str) -> Optional[dict[str, Any]]:
174
180
  raise_for_type(payment_id, str)
175
181
 
176
- response = await self.async_make_request(
182
+ response = await self._async_make_http_request(
177
183
  method="GET",
178
184
  url=f"https://api.yookassa.ru/v3/payments/{payment_id}",
179
185
  )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "arpakitlib"
3
- version = "1.6.91"
3
+ version = "1.6.93"
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