arpakitlib 1.7.242__tar.gz → 1.7.243__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 (218) hide show
  1. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/PKG-INFO +1 -1
  2. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/example.env +2 -1
  3. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/create_api_app.py +5 -24
  4. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/api/create_handle_exception_.py +59 -0
  5. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/core/settings.py +3 -1
  6. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/blank/blank.py +10 -0
  7. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/blank/util.py +12 -0
  8. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/const.py +19 -0
  9. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/router/__init__.py +0 -0
  10. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/router/error.py +3 -0
  11. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/router/router.py +7 -0
  12. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/start_tg_bot.py +12 -0
  13. arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/util/__init__.py +0 -0
  14. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_aiogram_util.py +1 -8
  15. arpakitlib-1.7.243/arpakitlib/ar_blank_util.py +8 -0
  16. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_util.py +58 -27
  17. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_sqlalchemy_util.py +42 -11
  18. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/pyproject.toml +1 -1
  19. arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/tg_bot/start_tg_bot.py +0 -6
  20. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/LICENSE +0 -0
  21. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/README.md +0 -0
  22. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/__init__.py +0 -0
  23. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/.gitignore +0 -0
  24. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/.python-version +0 -0
  25. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/ARPAKITLIB +0 -0
  26. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/LICENSE +0 -0
  27. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/README.md +0 -0
  28. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/__init__.py +0 -0
  29. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/docker_ps.sh +0 -0
  30. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/docker_ps_a.sh +0 -0
  31. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/docker_run_postgres.sh +0 -0
  32. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/docker_start_postgres.sh +0 -0
  33. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/docker_stop_postgres.sh +0 -0
  34. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_branch.sh +0 -0
  35. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_commit.sh +0 -0
  36. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_company_github_1.sh +0 -0
  37. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_company_gitlab_1.sh +0 -0
  38. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_github_1.sh +0 -0
  39. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_push_arpakit_gitlab_1.sh +0 -0
  40. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_remote_v.sh +0 -0
  41. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_set_arpakit_company_origin.sh +0 -0
  42. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_set_arpakit_origin.sh +0 -0
  43. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/git_status.sh +0 -0
  44. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/hello_world.py +0 -0
  45. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/json_beautify.py +0 -0
  46. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/note/__init__.py +0 -0
  47. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/note/note_1.txt +0 -0
  48. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/note/note_2.txt +0 -0
  49. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/note/note_3.txt +0 -0
  50. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/note/note_4.txt +0 -0
  51. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/note/note_5.txt +0 -0
  52. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_add_plugin_export.sh +0 -0
  53. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_check.sh +0 -0
  54. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_clear_cache.sh +0 -0
  55. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_config.sh +0 -0
  56. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_config_virtualenvs_in_project_true.sh +0 -0
  57. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_install.sh +0 -0
  58. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_lock.sh +0 -0
  59. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_remove_and_add_arpakitlib.sh +0 -0
  60. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_self_add_plugin_export.sh +0 -0
  61. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_show.sh +0 -0
  62. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_show_arpakitlib.sh +0 -0
  63. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_update.sh +0 -0
  64. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/poetry_update_arpakitlib.sh +0 -0
  65. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/__init__.py +0 -0
  66. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_1.py +0 -0
  67. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_2.py +0 -0
  68. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_3.py +0 -0
  69. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_4.py +0 -0
  70. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_5.py +0 -0
  71. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_6.py +0 -0
  72. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_7.py +0 -0
  73. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_8.sh +0 -0
  74. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/manage/sandbox/sandbox_9.sh +0 -0
  75. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/resource/__init__.py +0 -0
  76. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/resource/static/__init__.py +0 -0
  77. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/resource/static/healthcheck +0 -0
  78. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/resource/static/helloworld +0 -0
  79. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/__init__.py +0 -0
  80. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/additional_model/__init__.py +0 -0
  81. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/additional_model/additional_model.py +0 -0
  82. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/admin1/__init__.py +0 -0
  83. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/admin1/add_admin_in_app.py +0 -0
  84. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/admin1/admin_auth.py +0 -0
  85. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/admin1/model_view.py +0 -0
  86. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/__init__.py +0 -0
  87. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/_start_api_with_reload.py +0 -0
  88. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/_start_api_without_reload.py +0 -0
  89. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/asgi.py +0 -0
  90. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/auth.py +0 -0
  91. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/const.py +0 -0
  92. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/event.py +0 -0
  93. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/router/__init__.py +0 -0
  94. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/router/main_router.py +0 -0
  95. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/router/v1/__init__.py +0 -0
  96. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/router/v1/get_api_error_info.py +0 -0
  97. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/router/v1/main_router.py +0 -0
  98. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/schema/__init__.py +0 -0
  99. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/schema/v1/__init__.py +0 -0
  100. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/schema/v1/in_.py +0 -0
  101. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/schema/v1/out.py +0 -0
  102. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/transmitted_api_data.py +0 -0
  103. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/api/util.py +0 -0
  104. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/business_service/__init__.py +0 -0
  105. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/business_service/hello_world.py +0 -0
  106. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/core/__init__.py +0 -0
  107. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/core/_check_logging.py +0 -0
  108. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/core/_check_settings.py +0 -0
  109. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/core/_generate_settings_env_example.py +0 -0
  110. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/core/const.py +0 -0
  111. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/core/util.py +0 -0
  112. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/__init__.py +0 -0
  113. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/_check_conn_sqlalchemy_db.py +0 -0
  114. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/_drop_sqlalchemy_db.py +0 -0
  115. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/_init_sqlalchemy_db.py +0 -0
  116. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/_reinit_sqlalchemy_db.py +0 -0
  117. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/const.py +0 -0
  118. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/sqlalchemy_model.py +0 -0
  119. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/db/util.py +0 -0
  120. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/__init__.py +0 -0
  121. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/_remove_operations.py +0 -0
  122. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/_start_operation_executor_worker.py +0 -0
  123. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/_start_scheduled_operation_creator_worker.py +0 -0
  124. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/const.py +0 -0
  125. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +0 -0
  126. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +0 -0
  127. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/operation_execution/util.py +0 -0
  128. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/test_data/__init__.py +0 -0
  129. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py +0 -0
  130. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py +0 -0
  131. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py +0 -0
  132. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py +0 -0
  133. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py +0 -0
  134. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/__init__.py +0 -0
  135. {arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/tg_bot/filter → arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/blank}/__init__.py +0 -0
  136. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/event.py +0 -0
  137. {arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/tg_bot/handler → arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/filter}/__init__.py +0 -0
  138. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/filter/not_prod_mode.py +0 -0
  139. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/filter/prod_mode.py +0 -0
  140. {arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/tg_bot/kb → arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/handler}/__init__.py +0 -0
  141. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/handler/cmd_arpakitlib.py +0 -0
  142. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/handler/cmd_healthcheck.py +0 -0
  143. {arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/tg_bot/kb/inline_ → arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/kb}/__init__.py +0 -0
  144. {arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/tg_bot/kb/static_ → arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/kb/inline_}/__init__.py +0 -0
  145. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/kb/inline_/callback.py +0 -0
  146. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/kb/inline_/common.py +0 -0
  147. {arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/tg_bot/router → arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/kb/static_}/__init__.py +0 -0
  148. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/kb/static_/common.py +0 -0
  149. {arpakitlib-1.7.242/arpakitlib/_arpakit_project_template/src/util → arpakitlib-1.7.243/arpakitlib/_arpakit_project_template/src/tg_bot/middleware}/__init__.py +0 -0
  150. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/_arpakit_project_template/src/tg_bot/transmitted_tg_data.py +0 -0
  151. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_additional_model_util.py +0 -0
  152. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_api_key_util.py +0 -0
  153. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_arpakit_lib_module_util.py +0 -0
  154. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_arpakit_project_template_util.py +0 -0
  155. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_arpakit_schedule_uust_api_client_util.py +0 -0
  156. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_arpakit_schedule_uust_site_util.py +0 -0
  157. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_arpakitlib_cli_util.py +0 -0
  158. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_base64_util.py +0 -0
  159. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_base_worker_util.py +0 -0
  160. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_cache_file_util.py +0 -0
  161. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_class_util.py +0 -0
  162. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_datetime_util.py +0 -0
  163. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_dict_util.py +0 -0
  164. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_dream_ai_api_client_util.py +0 -0
  165. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_encrypt_decrypt_util.py +0 -0
  166. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_enumeration_util.py +0 -0
  167. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_exception_util.py +0 -0
  168. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/healthcheck +0 -0
  169. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/redoc/redoc.standalone.js +0 -0
  170. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/favicon-16x16.png +0 -0
  171. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/favicon-32x32.png +0 -0
  172. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/index.css +0 -0
  173. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/index.html +0 -0
  174. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/oauth2-redirect.html +0 -0
  175. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-initializer.js +0 -0
  176. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js +0 -0
  177. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js.map +0 -0
  178. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
  179. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -0
  180. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js +0 -0
  181. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  182. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
  183. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  184. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css +0 -0
  185. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.css.map +0 -0
  186. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js +0 -0
  187. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map +0 -0
  188. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_file_storage_in_dir_util.py +0 -0
  189. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_file_util.py +0 -0
  190. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_func_util.py +0 -0
  191. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_hash_util.py +0 -0
  192. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_http_request_util.py +0 -0
  193. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_ip_util.py +0 -0
  194. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_json_db_util.py +0 -0
  195. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_json_util.py +0 -0
  196. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_jwt_util.py +0 -0
  197. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_list_of_dicts_to_xlsx.py +0 -0
  198. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_list_util.py +0 -0
  199. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_logging_util.py +0 -0
  200. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_mongodb_util.py +0 -0
  201. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_need_type_util.py +0 -0
  202. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_openai_api_client_util.py +0 -0
  203. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_operation_execution_util.py +0 -0
  204. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_parse_command.py +0 -0
  205. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_postgresql_util.py +0 -0
  206. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_rat_func_util.py +0 -0
  207. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_retry_func_util.py +0 -0
  208. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_run_cmd_util.py +0 -0
  209. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_schedule_uust_api_client_util.py +0 -0
  210. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_settings_util.py +0 -0
  211. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_sleep_util.py +0 -0
  212. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_sqladmin_util.py +0 -0
  213. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_sqlalchemy_model_util.py +0 -0
  214. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_ssh_runner_util.py +0 -0
  215. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_str_util.py +0 -0
  216. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_type_util.py +0 -0
  217. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_yookassa_api_client_util.py +0 -0
  218. {arpakitlib-1.7.242 → arpakitlib-1.7.243}/arpakitlib/ar_zabbix_api_client_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.7.242
3
+ Version: 1.7.243
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -9,7 +9,8 @@
9
9
  # api_init_sql_db_at_start=
10
10
  # api_title=
11
11
  # api_description=
12
- # api_create_story_log_before_response_in_handle_exception=
12
+ # api_logging_func_before_response=
13
+ # api_story_log_func_before_response=
13
14
  # api_start_operation_executor_worker=
14
15
  # api_start_scheduled_operation_creator_worker=
15
16
  # api_port=
@@ -1,11 +1,7 @@
1
1
  from fastapi import FastAPI
2
- from starlette import status
3
2
 
4
- from arpakitlib.ar_fastapi_util import create_fastapi_app, \
5
- create_handle_exception, create_story_log_before_response_in_handle_exception
6
- from arpakitlib.ar_sqlalchemy_util import SQLAlchemyDB
7
- from arpakitlib.ar_type_util import raise_for_type
8
- from src.api.const import APIErrorCodes
3
+ from arpakitlib.ar_fastapi_util import create_fastapi_app
4
+ from src.api.create_handle_exception_ import create_handle_exception_
9
5
  from src.api.event import StartupAPIEvent, ShutdownAPIEvent
10
6
  from src.api.router.main_router import main_api_router
11
7
  from src.api.transmitted_api_data import TransmittedAPIData
@@ -31,23 +27,6 @@ def create_api_app() -> FastAPI:
31
27
  dump_file_storage_in_dir=get_cached_dump_file_storage_in_dir()
32
28
  )
33
29
 
34
- funcs_before_response = []
35
-
36
- if settings.api_create_story_log_before_response_in_handle_exception:
37
- raise_for_type(sqlalchemy_db, SQLAlchemyDB)
38
- funcs_before_response.append(
39
- create_story_log_before_response_in_handle_exception(
40
- sqlalchemy_db=sqlalchemy_db,
41
- ignore_api_error_codes=[APIErrorCodes.not_found],
42
- ignore_status_codes=[status.HTTP_404_NOT_FOUND]
43
- )
44
- )
45
-
46
- handle_exception = create_handle_exception(
47
- funcs_before_response=funcs_before_response,
48
- async_funcs_after_response=[]
49
- )
50
-
51
30
  startup_api_events = []
52
31
 
53
32
  startup_api_events.append(StartupAPIEvent(transmitted_api_data=transmitted_api_data))
@@ -56,11 +35,13 @@ def create_api_app() -> FastAPI:
56
35
 
57
36
  shutdown_api_events.append(ShutdownAPIEvent(transmitted_api_data=transmitted_api_data))
58
37
 
38
+ handle_exception_ = create_handle_exception_(transmitted_api_data=transmitted_api_data)
39
+
59
40
  api_app = create_fastapi_app(
60
41
  title=settings.api_title.strip(),
61
42
  description=settings.api_description.strip(),
62
43
  log_filepath=settings.log_filepath,
63
- handle_exception_=handle_exception,
44
+ handle_exception_=handle_exception_,
64
45
  startup_api_events=startup_api_events,
65
46
  shutdown_api_events=shutdown_api_events,
66
47
  transmitted_api_data=transmitted_api_data,
@@ -0,0 +1,59 @@
1
+ import fastapi.exceptions
2
+ import starlette.exceptions
3
+ import starlette.status
4
+
5
+ from arpakitlib.ar_fastapi_util import create_handle_exception, story_log_func_before_response, \
6
+ logging_func_before_response
7
+ from src.api.const import APIErrorCodes
8
+ from src.api.transmitted_api_data import TransmittedAPIData
9
+
10
+
11
+ def create_handle_exception_(*, transmitted_api_data: TransmittedAPIData):
12
+ funcs_before_response = []
13
+
14
+ if transmitted_api_data.settings.api_logging_func_before_response:
15
+ funcs_before_response.append(
16
+ logging_func_before_response(
17
+ ignore_api_error_codes=[
18
+ APIErrorCodes.cannot_authorize,
19
+ APIErrorCodes.error_in_request,
20
+ APIErrorCodes.not_found
21
+ ],
22
+ ignore_status_codes=[
23
+ starlette.status.HTTP_401_UNAUTHORIZED,
24
+ starlette.status.HTTP_422_UNPROCESSABLE_ENTITY,
25
+ starlette.status.HTTP_404_NOT_FOUND
26
+ ],
27
+ ignore_exception_types=[
28
+ fastapi.exceptions.RequestValidationError
29
+ ],
30
+ need_exc_info=False
31
+ )
32
+ )
33
+
34
+ if transmitted_api_data.settings.api_story_log_func_before_response:
35
+ funcs_before_response.append(
36
+ story_log_func_before_response(
37
+ sqlalchemy_db=transmitted_api_data.sqlalchemy_db,
38
+ ignore_api_error_codes=[
39
+ APIErrorCodes.cannot_authorize,
40
+ APIErrorCodes.error_in_request,
41
+ APIErrorCodes.not_found
42
+ ],
43
+ ignore_status_codes=[
44
+ starlette.status.HTTP_401_UNAUTHORIZED,
45
+ starlette.status.HTTP_422_UNPROCESSABLE_ENTITY,
46
+ starlette.status.HTTP_404_NOT_FOUND
47
+ ],
48
+ ignore_exception_types=[
49
+ fastapi.exceptions.RequestValidationError
50
+ ],
51
+ )
52
+ )
53
+
54
+ async_funcs_after_response = []
55
+
56
+ return create_handle_exception(
57
+ funcs_before_response=funcs_before_response,
58
+ async_funcs_after_response=async_funcs_after_response
59
+ )
@@ -44,7 +44,9 @@ class Settings(SimpleSettings):
44
44
 
45
45
  api_description: str = f"{project_name} (arpakitlib)"
46
46
 
47
- api_create_story_log_before_response_in_handle_exception: bool = True
47
+ api_logging_func_before_response: bool = True
48
+
49
+ api_story_log_func_before_response: bool = True
48
50
 
49
51
  api_start_operation_executor_worker: bool = False
50
52
 
@@ -0,0 +1,10 @@
1
+ from emoji import emojize
2
+
3
+ from arpakitlib.ar_blank_util import BaseBlank
4
+
5
+
6
+ class TgBotBlank(BaseBlank):
7
+
8
+ def healthcheck(self) -> str:
9
+ res = "healthcheck"
10
+ return emojize(res.strip())
@@ -0,0 +1,12 @@
1
+ from functools import lru_cache
2
+
3
+ from src.tg_bot.blank.blank import TgBotBlank
4
+
5
+
6
+ def get_create_tg_bot_blank() -> TgBotBlank:
7
+ return TgBotBlank()
8
+
9
+
10
+ @lru_cache()
11
+ def get_cached_tg_bot_blank() -> TgBotBlank:
12
+ return get_create_tg_bot_blank()
@@ -0,0 +1,19 @@
1
+ from arpakitlib.ar_enumeration_util import Enumeration
2
+
3
+
4
+ class TgBotPublicCommands(Enumeration):
5
+ start = "start"
6
+
7
+
8
+ class TgBotPrivateCommands(Enumeration):
9
+ init_db = "init_db"
10
+ reinit_db = "reinit_db"
11
+ drop_db = "drop_db"
12
+ set_tg_bot_commands = "set_tg_bot_commands"
13
+ raise_fake_err = "raise_fake_err"
14
+ log_file = "log_file"
15
+ clear_log_file = "clear_log_file"
16
+ kb_with_old_data = "kb_with_old_data"
17
+ kb_with_not_modified = "kb_with_not_modified"
18
+ kb_with_fake_error = "kb_with_fake_error"
19
+ kb_with_remove_message = "kb_with_remove_message"
@@ -0,0 +1,3 @@
1
+ from aiogram import Router
2
+
3
+ tg_bot_router = Router()
@@ -0,0 +1,7 @@
1
+ from aiogram import Router
2
+
3
+ from src.tg_bot.router import error
4
+
5
+ main_tg_bot_router = Router()
6
+
7
+ main_tg_bot_router.include_router(error.tg_bot_router)
@@ -0,0 +1,12 @@
1
+ from src.core.settings import get_cached_settings
2
+ from src.core.util import setup_logging
3
+
4
+
5
+ def start_tg_bot():
6
+ setup_logging()
7
+
8
+ settings = get_cached_settings()
9
+
10
+
11
+ if __name__ == '__main__':
12
+ start_tg_bot()
@@ -2,10 +2,9 @@
2
2
 
3
3
  import asyncio
4
4
  import logging
5
- from abc import ABC
6
5
  from typing import Optional, Any, Union, Callable, Iterable
7
6
 
8
- from aiogram import types, BaseMiddleware, Bot
7
+ from aiogram import types, Bot
9
8
  from aiogram.client.default import DefaultBotProperties
10
9
  from aiogram.client.session.aiohttp import AiohttpSession
11
10
  from aiogram.enums import ChatType, ParseMode
@@ -312,12 +311,6 @@ def as_tg_command(
312
311
  return decorator
313
312
 
314
313
 
315
- class SimpleMiddleware(BaseMiddleware, ABC):
316
- def __init__(self):
317
- self.middleware_name = self.__class__.__name__
318
- self._logger = logging.getLogger(self.__class__.__name__)
319
-
320
-
321
314
  class BaseTransmittedTgBotData(BaseModel):
322
315
  model_config = ConfigDict(extra="ignore", arbitrary_types_allowed=True, from_attributes=True)
323
316
 
@@ -0,0 +1,8 @@
1
+ # arpakit
2
+
3
+ _ARPAKIT_LIB_MODULE_VERSION = "3.0"
4
+
5
+
6
+ class BaseBlank:
7
+ def __init__(self, **kwargs):
8
+ pass
@@ -7,7 +7,6 @@ import datetime as dt
7
7
  import logging
8
8
  import os.path
9
9
  import pathlib
10
- import traceback
11
10
  from contextlib import suppress
12
11
  from typing import Any, Callable
13
12
 
@@ -27,8 +26,9 @@ from starlette.staticfiles import StaticFiles
27
26
 
28
27
  from arpakitlib.ar_dict_util import combine_dicts
29
28
  from arpakitlib.ar_enumeration_util import Enumeration
30
- from arpakitlib.ar_func_util import raise_if_not_async_func, is_async_function, is_async_object
31
- from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str_to_json_obj
29
+ from arpakitlib.ar_exception_util import exception_to_traceback_str
30
+ from arpakitlib.ar_func_util import raise_if_not_async_func, is_async_object
31
+ from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str_to_json_obj, safely_transfer_obj_to_json_str
32
32
  from arpakitlib.ar_logging_util import setup_normal_logging
33
33
  from arpakitlib.ar_sqlalchemy_model_util import StoryLogDBM, OperationDBM
34
34
  from arpakitlib.ar_sqlalchemy_util import SQLAlchemyDB
@@ -239,19 +239,15 @@ def create_handle_exception(
239
239
  old_error_data = error_so.error_data
240
240
  error_so = exception.error_so
241
241
  error_so.error_data = combine_dicts(old_error_data, error_so.error_data)
242
- _need_exc_info = False
243
242
 
244
243
  elif isinstance(exception, starlette.exceptions.HTTPException):
245
244
  status_code = exception.status_code
246
245
  if status_code in (starlette.status.HTTP_403_FORBIDDEN, starlette.status.HTTP_401_UNAUTHORIZED):
247
246
  error_so.error_code = BaseAPIErrorCodes.cannot_authorize
248
- _need_exc_info = False
249
247
  elif status_code == starlette.status.HTTP_404_NOT_FOUND:
250
248
  error_so.error_code = BaseAPIErrorCodes.not_found
251
- _need_exc_info = False
252
249
  else:
253
250
  status_code = starlette.status.HTTP_500_INTERNAL_SERVER_ERROR
254
- _need_exc_info = True
255
251
  with suppress(Exception):
256
252
  error_so.error_data["exception.detail"] = exception.detail
257
253
 
@@ -260,13 +256,10 @@ def create_handle_exception(
260
256
  error_so.error_code = BaseAPIErrorCodes.error_in_request
261
257
  with suppress(Exception):
262
258
  error_so.error_data["exception.errors"] = str(exception.errors()) if exception.errors() else {}
263
- _need_exc_info = False
264
259
 
265
260
  else:
266
261
  status_code = starlette.status.HTTP_500_INTERNAL_SERVER_ERROR
267
262
  error_so.error_code = BaseAPIErrorCodes.unknown_error
268
- _logger.exception(exception)
269
- _need_exc_info = True
270
263
 
271
264
  if error_so.error_code:
272
265
  error_so.error_code = error_so.error_code.upper().replace(" ", "_").strip()
@@ -282,17 +275,12 @@ def create_handle_exception(
282
275
  if error_so.error_code == BaseAPIErrorCodes.cannot_authorize:
283
276
  status_code = status.HTTP_401_UNAUTHORIZED
284
277
 
285
- if _need_exc_info:
286
- _logger.error(str(exception), exc_info=exception)
287
- else:
288
- _logger.error(str(exception))
289
-
290
278
  _kwargs = {}
291
279
  for func in funcs_before_response:
292
280
  _func_data = func(
293
281
  status_code=status_code, error_so=error_so, request=request, exception=exception, **_kwargs
294
282
  )
295
- if is_async_function(_func_data):
283
+ if is_async_object(_func_data):
296
284
  _func_data = await _func_data
297
285
  if _func_data is not None:
298
286
  status_code, error_so, _kwargs = _func_data[0], _func_data[1], _func_data[2]
@@ -314,13 +302,49 @@ def create_handle_exception(
314
302
  return handle_exception
315
303
 
316
304
 
317
- def create_story_log_before_response_in_handle_exception(
305
+ def logging_func_before_response(
306
+ *,
307
+ ignore_api_error_codes: list[str] | None = None,
308
+ ignore_status_codes: list[int] | None = None,
309
+ ignore_exception_types: list[type[Exception]] | None = None,
310
+ need_exc_info: bool = False
311
+ ):
312
+ def func(
313
+ *,
314
+ status_code: int,
315
+ error_so: ErrorSO,
316
+ request: starlette.requests.Request,
317
+ exception: Exception,
318
+ **kwargs
319
+ ) -> (int, ErrorSO, dict[str, Any]):
320
+ kwargs["logging_before_response_in_handle_exception"] = True
321
+
322
+ if ignore_api_error_codes and error_so.error_code in ignore_api_error_codes:
323
+ return status_code, error_so, kwargs
324
+
325
+ if ignore_status_codes and status_code in ignore_status_codes:
326
+ return status_code, error_so, kwargs
327
+
328
+ if ignore_exception_types and (
329
+ exception in ignore_exception_types or type(exception) in ignore_exception_types
330
+ ):
331
+ return status_code, error_so, kwargs
332
+
333
+ _logger.error(safely_transfer_obj_to_json_str(error_so.model_dump()), exc_info=need_exc_info)
334
+
335
+ return func
336
+
337
+
338
+ def story_log_func_before_response(
318
339
  *,
319
340
  sqlalchemy_db: SQLAlchemyDB,
320
341
  ignore_api_error_codes: list[str] | None = None,
321
- ignore_status_codes: list[int] | None = None
342
+ ignore_status_codes: list[int] | None = None,
343
+ ignore_exception_types: list[type[Exception]] | None = None
322
344
  ) -> Callable:
323
- def func(
345
+ raise_for_type(sqlalchemy_db, SQLAlchemyDB)
346
+
347
+ async def async_func(
324
348
  *,
325
349
  status_code: int,
326
350
  error_so: ErrorSO,
@@ -328,31 +352,38 @@ def create_story_log_before_response_in_handle_exception(
328
352
  exception: Exception,
329
353
  **kwargs
330
354
  ) -> (int, ErrorSO, dict[str, Any]):
355
+ kwargs["create_story_log_before_response_in_handle_exception"] = True
356
+
331
357
  if ignore_api_error_codes and error_so.error_code in ignore_api_error_codes:
332
358
  return status_code, error_so, kwargs
333
359
 
334
360
  if ignore_status_codes and status_code in ignore_status_codes:
335
361
  return status_code, error_so, kwargs
336
362
 
337
- sqlalchemy_db.init()
338
- traceback_str = "".join(traceback.format_exception(type(exception), exception, exception.__traceback__))
339
- with sqlalchemy_db.new_session() as session:
363
+ if ignore_exception_types and (
364
+ exception in ignore_exception_types or type(exception) in ignore_exception_types
365
+ ):
366
+ return status_code, error_so, kwargs
367
+
368
+ async with sqlalchemy_db.new_async_session() as session:
340
369
  story_log_dbm = StoryLogDBM(
341
370
  level=StoryLogDBM.Levels.error,
342
- title=str(exception),
371
+ title=f"{status_code}, {type(exception)}",
343
372
  data={
344
373
  "error_so": error_so.model_dump(),
345
- "traceback_str": traceback_str
374
+ "traceback_str": exception_to_traceback_str(exception=exception)
346
375
  }
347
376
  )
348
377
  session.add(story_log_dbm)
349
- session.commit()
350
- session.refresh(story_log_dbm)
378
+ await session.commit()
379
+ await session.refresh(story_log_dbm)
380
+
351
381
  error_so.error_data.update({"story_log_long_id": story_log_dbm.long_id})
352
382
  kwargs["story_log_id"] = story_log_dbm.id
383
+
353
384
  return status_code, error_so, kwargs
354
385
 
355
- return func
386
+ return async_func
356
387
 
357
388
 
358
389
  def add_exception_handler_to_app(*, app: FastAPI, handle_exception: Callable) -> FastAPI:
@@ -5,7 +5,8 @@ from datetime import timedelta, datetime
5
5
  from typing import Any
6
6
  from uuid import uuid4
7
7
 
8
- from sqlalchemy import create_engine, QueuePool, text, func
8
+ from sqlalchemy import create_engine, QueuePool, text, func, inspect, AsyncAdaptedQueuePool
9
+ from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
9
10
  from sqlalchemy.orm import sessionmaker, DeclarativeBase
10
11
  from sqlalchemy.orm.session import Session
11
12
 
@@ -26,7 +27,8 @@ class SQLAlchemyDB:
26
27
  def __init__(
27
28
  self,
28
29
  *,
29
- db_url: str = "postgresql://arpakitlib:arpakitlib@localhost:50629/arpakitlib",
30
+ db_url: str = "postgresql://arpakitlib:arpakitlib@localhost:50517/arpakitlib",
31
+ async_db_url: str = "postgresql+asyncpg://arpakitlib:arpakitlib@localhost:50517/arpakitlib",
30
32
  db_echo: bool = False,
31
33
  base_dbm: type[BaseDBM] | None = None,
32
34
  db_models: list[Any] | None = None,
@@ -35,15 +37,30 @@ class SQLAlchemyDB:
35
37
  self.engine = create_engine(
36
38
  url=db_url,
37
39
  echo=db_echo,
38
- pool_size=5,
40
+ pool_size=10,
39
41
  max_overflow=10,
40
42
  poolclass=QueuePool,
41
- pool_timeout=timedelta(seconds=30).total_seconds()
43
+ pool_timeout=timedelta(seconds=30).total_seconds(),
42
44
  )
43
45
  self.sessionmaker = sessionmaker(bind=self.engine)
44
46
  self.func_new_session_counter = 0
47
+ self.async_engine = create_async_engine(
48
+ url=async_db_url,
49
+ echo=db_echo,
50
+ pool_size=10,
51
+ max_overflow=10,
52
+ poolclass=AsyncAdaptedQueuePool,
53
+ pool_timeout=timedelta(seconds=30).total_seconds()
54
+ )
55
+ self.async_sessionmaker = async_sessionmaker(bind=self.async_engine)
56
+ self.func_new_async_session_counter = 0
45
57
  self.base_dbm = base_dbm
46
58
 
59
+ def is_table_exists(self, table_name: str) -> bool:
60
+ with self.engine.connect() as connection:
61
+ inspector = inspect(connection)
62
+ return table_name in inspector.get_table_names()
63
+
47
64
  def drop_celery_tables(self):
48
65
  with self.engine.connect() as connection:
49
66
  connection.execute(text("DROP TABLE IF EXISTS celery_tasksetmeta CASCADE;"))
@@ -52,32 +69,42 @@ class SQLAlchemyDB:
52
69
  self._logger.info("celery tables were dropped")
53
70
 
54
71
  def remove_celery_tables_data(self):
72
+ if not self.is_table_exists("celery_tasksetmeta"):
73
+ self._logger.info("table celery_tasksetmeta not exists")
74
+ return
55
75
  with self.engine.connect() as connection:
56
76
  connection.execute(text("DELETE FROM celery_tasksetmeta;"))
57
77
  connection.execute(text("DELETE FROM celery_taskmeta;"))
58
78
  connection.commit()
59
79
  self._logger.info("celery tables data were removed")
60
80
 
81
+ def drop_alembic_tables(self):
82
+ with self.engine.connect() as connection:
83
+ connection.execute(text("DROP TABLE IF EXISTS alembic_version CASCADE;"))
84
+ connection.execute(text("DROP TABLE IF EXISTS alembic_version CASCADE;"))
85
+ connection.commit()
86
+ self._logger.info("alembic_version tables were dropped")
87
+
61
88
  def remove_alembic_tables_data(self):
89
+ if not self.is_table_exists("alembic_version"):
90
+ self._logger.info("table alembic_version not exists")
91
+ return
62
92
  with self.engine.connect() as connection:
63
93
  connection.execute(text("DELETE FROM alembic_version;"))
64
94
  connection.commit()
65
95
  self._logger.info("alembic tables data were removed")
66
96
 
67
97
  def init(self):
68
- from arpakitlib.ar_sqlalchemy_model_util import BaseDBM
69
- BaseDBM.metadata.create_all(bind=self.engine, checkfirst=True)
98
+ self.base_dbm.metadata.create_all(bind=self.engine, checkfirst=True)
70
99
  self._logger.info("db was inited")
71
100
 
72
101
  def drop(self):
73
- from arpakitlib.ar_sqlalchemy_model_util import BaseDBM
74
- BaseDBM.metadata.drop_all(bind=self.engine, checkfirst=True)
102
+ self.base_dbm.metadata.drop_all(bind=self.engine, checkfirst=True)
75
103
  self._logger.info("db was dropped")
76
104
 
77
105
  def reinit(self):
78
- from arpakitlib.ar_sqlalchemy_model_util import BaseDBM
79
- BaseDBM.metadata.drop_all(bind=self.engine, checkfirst=True)
80
- BaseDBM.metadata.create_all(bind=self.engine, checkfirst=True)
106
+ self.base_dbm.metadata.drop_all(bind=self.engine, checkfirst=True)
107
+ self.base_dbm.metadata.create_all(bind=self.engine, checkfirst=True)
81
108
  self._logger.info("db was reinited")
82
109
 
83
110
  def check_conn(self):
@@ -88,6 +115,10 @@ class SQLAlchemyDB:
88
115
  self.func_new_session_counter += 1
89
116
  return self.sessionmaker(**kwargs)
90
117
 
118
+ def new_async_session(self, **kwargs) -> AsyncSession:
119
+ self.func_new_async_session_counter += 1
120
+ return self.async_sessionmaker(**kwargs)
121
+
91
122
  def is_conn_good(self) -> bool:
92
123
  try:
93
124
  self.check_conn()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "arpakitlib"
3
- version = "1.7.242"
3
+ version = "1.7.243"
4
4
  description = "arpakitlib"
5
5
  authors = [
6
6
  { name = "arpakit", email = "arpakit@gmail.com" },
@@ -1,6 +0,0 @@
1
- def start_tg_bot():
2
- pass
3
-
4
-
5
- if __name__ == '__main__':
6
- start_tg_bot()
File without changes
File without changes