arpakitlib 1.7.257__py3-none-any.whl → 1.8.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/README.md +1 -1
  2. arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/env.py +3 -3
  3. arpakitlib/_arpakit_project_template_v_1/api/asgi.py +3 -0
  4. arpakitlib/_arpakit_project_template_v_1/api/auth.py +235 -0
  5. arpakitlib/_arpakit_project_template_v_1/api/const.py +18 -0
  6. arpakitlib/_arpakit_project_template_v_1/api/create_api_app.py +71 -0
  7. arpakitlib/_arpakit_project_template_v_1/api/event.py +74 -0
  8. arpakitlib/_arpakit_project_template_v_1/api/exception.py +38 -0
  9. arpakitlib/_arpakit_project_template_v_1/api/exception_handler.py +308 -0
  10. arpakitlib/_arpakit_project_template_v_1/api/openapi_ui.py +28 -0
  11. arpakitlib/_arpakit_project_template_v_1/api/response.py +31 -0
  12. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/api/router/main_router.py +4 -3
  13. arpakitlib/_arpakit_project_template_v_1/api/router/v1/arpakit_project_template.py +22 -0
  14. arpakitlib/_arpakit_project_template_v_1/api/router/v1/check_auth.py +30 -0
  15. arpakitlib/_arpakit_project_template_v_1/api/router/v1/clear_log_file.py +25 -0
  16. arpakitlib/_arpakit_project_template_v_1/api/router/v1/get_errors_info.py +24 -0
  17. arpakitlib/_arpakit_project_template_v_1/api/router/v1/get_log_file.py +23 -0
  18. arpakitlib/_arpakit_project_template_v_1/api/router/v1/healthcheck.py +21 -0
  19. arpakitlib/_arpakit_project_template_v_1/api/router/v1/main_router.py +67 -0
  20. arpakitlib/_arpakit_project_template_v_1/api/router/v1/now_utc_datetime.py +21 -0
  21. arpakitlib/_arpakit_project_template_v_1/api/router/v1/raise_fake_error.py +35 -0
  22. arpakitlib/_arpakit_project_template_v_1/api/schema/base_schema.py +26 -0
  23. arpakitlib/_arpakit_project_template_v_1/api/schema/common/in_.py +5 -0
  24. arpakitlib/_arpakit_project_template_v_1/api/schema/common/out.py +60 -0
  25. arpakitlib/_arpakit_project_template_v_1/api/schema/v1/in_.py +5 -0
  26. arpakitlib/_arpakit_project_template_v_1/api/schema/v1/out.py +47 -0
  27. arpakitlib/_arpakit_project_template_v_1/arpakitlib_project_template.json +3 -0
  28. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/business_service/hello_world.py +1 -1
  29. arpakitlib/_arpakit_project_template_v_1/business_service/remove_operations.py +51 -0
  30. arpakitlib/_arpakit_project_template_v_1/command/alembic_history.sh +2 -0
  31. arpakitlib/_arpakit_project_template_v_1/command/alembic_revision_autogenerate.sh +2 -0
  32. arpakitlib/{_arpakit_project_template/manage/json_beautify.py → _arpakit_project_template_v_1/command/beautify_json.py} +2 -2
  33. arpakitlib/{_arpakit_project_template/src/core/_check_logging.py → _arpakit_project_template_v_1/command/check_logging.py} +3 -3
  34. arpakitlib/_arpakit_project_template_v_1/command/check_sqlalchemy_db.py +11 -0
  35. arpakitlib/_arpakit_project_template_v_1/command/drop_json_db.py +13 -0
  36. arpakitlib/_arpakit_project_template_v_1/command/drop_sqlalchemy_db.py +14 -0
  37. arpakitlib/{_arpakit_project_template/src/core/_generate_settings_env_example.py → _arpakit_project_template_v_1/command/generate_settings_env_example.py} +4 -4
  38. arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/hello_world.py +2 -2
  39. arpakitlib/_arpakit_project_template_v_1/command/init_json_db.py +11 -0
  40. arpakitlib/_arpakit_project_template_v_1/command/init_sqlalchemy_db.py +11 -0
  41. arpakitlib/_arpakit_project_template_v_1/command/reinit_json_db.py +13 -0
  42. arpakitlib/_arpakit_project_template_v_1/command/reinit_sqlalchemy_db.py +13 -0
  43. arpakitlib/_arpakit_project_template_v_1/command/remove_operations.py +13 -0
  44. arpakitlib/_arpakit_project_template_v_1/command/remove_story_logs.py +16 -0
  45. arpakitlib/_arpakit_project_template_v_1/command/rm_all_records_in_json_db.py +13 -0
  46. arpakitlib/{_arpakit_project_template/src/core/_show_settings.py → _arpakit_project_template_v_1/command/show_settings.py} +3 -3
  47. arpakitlib/{_arpakit_project_template/src/api/_start_api_with_reload.py → _arpakit_project_template_v_1/command/start_api_with_reload.py} +5 -5
  48. arpakitlib/{_arpakit_project_template/src/api/_start_api_without_reload.py → _arpakit_project_template_v_1/command/start_api_without_reload.py} +5 -5
  49. arpakitlib/_arpakit_project_template_v_1/command/start_async_operation_executor_worker.py +14 -0
  50. arpakitlib/_arpakit_project_template_v_1/command/start_async_scheduled_operation_creator_worker.py +14 -0
  51. arpakitlib/_arpakit_project_template_v_1/command/start_sync_operation_executor_worker.py +15 -0
  52. arpakitlib/_arpakit_project_template_v_1/command/start_sync_operation_executor_workers.py +22 -0
  53. arpakitlib/_arpakit_project_template_v_1/command/start_sync_scheduled_operation_creator_worker.py +12 -0
  54. arpakitlib/_arpakit_project_template_v_1/core/cache_file_storage_in_dir.py +23 -0
  55. arpakitlib/_arpakit_project_template_v_1/core/const.py +33 -0
  56. arpakitlib/_arpakit_project_template_v_1/core/dump_file_storage_in_dir.py +23 -0
  57. arpakitlib/_arpakit_project_template_v_1/core/jinja2_templates.py +14 -0
  58. arpakitlib/_arpakit_project_template_v_1/core/media_file_storage_in_dir.py +23 -0
  59. arpakitlib/_arpakit_project_template_v_1/core/settings.py +195 -0
  60. arpakitlib/_arpakit_project_template_v_1/core/util.py +29 -0
  61. arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/example.env +13 -7
  62. arpakitlib/_arpakit_project_template_v_1/json_db/json_db.py +28 -0
  63. arpakitlib/_arpakit_project_template_v_1/operation_execution/operation_executor_worker.py +256 -0
  64. arpakitlib/_arpakit_project_template_v_1/operation_execution/scheduled_operation_creator_worker.py +106 -0
  65. arpakitlib/_arpakit_project_template_v_1/operation_execution/scheduled_operations.py +49 -0
  66. arpakitlib/_arpakit_project_template_v_1/operation_execution/util.py +29 -0
  67. arpakitlib/_arpakit_project_template_v_1/resource/static/openapi-favicon.png +0 -0
  68. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/index.html +19 -0
  69. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-bundle.js +2 -0
  70. arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-es-bundle-core.js +1 -1
  71. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +1 -0
  72. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-es-bundle.js +2 -0
  73. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-standalone-preset.js +2 -0
  74. arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.js +1 -1
  75. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui.js.map +1 -0
  76. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_1.py +14 -0
  77. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_2.py +14 -0
  78. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_3.py +14 -0
  79. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_4.py +14 -0
  80. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_5.py +14 -0
  81. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_6.py +14 -0
  82. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_7.py +14 -0
  83. arpakitlib/_arpakit_project_template_v_1/site/router/main_router.py +3 -0
  84. arpakitlib/_arpakit_project_template_v_1/sqladmin_/add_admin_in_app.py +24 -0
  85. arpakitlib/_arpakit_project_template_v_1/sqladmin_/admin_auth.py +54 -0
  86. arpakitlib/_arpakit_project_template_v_1/sqladmin_/model_view.py +95 -0
  87. arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/sqlalchemy_db.py +22 -0
  88. arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/sqlalchemy_model.py +129 -0
  89. arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/util.py +28 -0
  90. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_3.py → _arpakit_project_template_v_1/test_data/make_test_data_1.py} +8 -3
  91. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_4.py → _arpakit_project_template_v_1/test_data/make_test_data_2.py} +8 -3
  92. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_1.py → _arpakit_project_template_v_1/test_data/make_test_data_3.py} +8 -3
  93. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_2.py → _arpakit_project_template_v_1/test_data/make_test_data_4.py} +8 -3
  94. arpakitlib/_arpakit_project_template_v_1/test_data/make_test_data_5.py +22 -0
  95. arpakitlib/_arpakit_project_template_v_1/tg_bot/blank/blank.py +5 -0
  96. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/blank/util.py +1 -1
  97. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/const.py +6 -3
  98. arpakitlib/_arpakit_project_template_v_1/tg_bot/event.py +51 -0
  99. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/filter/not_prod_mode.py +1 -1
  100. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/filter/prod_mode.py +1 -1
  101. arpakitlib/_arpakit_project_template_v_1/tg_bot/kb/static_/__init__.py +0 -0
  102. arpakitlib/_arpakit_project_template_v_1/tg_bot/kb/static_/common.py +0 -0
  103. arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/__init__.py +0 -0
  104. arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/init_user.py +24 -0
  105. arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/middleware.py +12 -0
  106. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/__init__.py +0 -0
  107. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/arpakitlib_.py +10 -0
  108. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/error.py +15 -0
  109. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/healthcheck.py +10 -0
  110. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/main_router.py +14 -0
  111. arpakitlib/_arpakit_project_template_v_1/tg_bot/start_tg_bot.py +34 -0
  112. arpakitlib/_arpakit_project_template_v_1/tg_bot/tg_bot.py +24 -0
  113. arpakitlib/_arpakit_project_template_v_1/tg_bot/tg_bot_dispatcher.py +19 -0
  114. arpakitlib/_arpakit_project_template_v_1/tg_bot/transmitted_tg_data.py +58 -0
  115. arpakitlib/_arpakit_project_template_v_1/tg_bot/util.py +0 -0
  116. arpakitlib/_arpakit_project_template_v_1/util/__init__.py +0 -0
  117. arpakitlib/_arpakit_project_template_v_1/util/read_arpakitlib_project_template_file.py +17 -0
  118. arpakitlib/ar_aiogram_util.py +41 -52
  119. arpakitlib/ar_arpakit_project_template_util.py +5 -11
  120. arpakitlib/ar_arpakitlib_cli_util.py +8 -2
  121. arpakitlib/ar_base_worker_util.py +35 -17
  122. arpakitlib/ar_class_util.py +11 -0
  123. arpakitlib/ar_func_util.py +19 -29
  124. arpakitlib/ar_http_request_util.py +10 -2
  125. arpakitlib/ar_rat_func_util.py +1 -1
  126. arpakitlib/ar_retry_func_util.py +4 -4
  127. arpakitlib/ar_schedule_uust_api_client_util.py +1 -1
  128. arpakitlib/ar_settings_util.py +3 -204
  129. arpakitlib/ar_sqladmin_util.py +7 -102
  130. arpakitlib/ar_sqlalchemy_util.py +65 -13
  131. arpakitlib/ar_type_util.py +0 -2
  132. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/METADATA +5 -3
  133. arpakitlib-1.8.1.dist-info/RECORD +261 -0
  134. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/WHEEL +1 -1
  135. arpakitlib/_arpakit_project_template/ARPAKITLIB +0 -1
  136. arpakitlib/_arpakit_project_template/manage/docker_ps.sh +0 -2
  137. arpakitlib/_arpakit_project_template/manage/git_branch.sh +0 -2
  138. arpakitlib/_arpakit_project_template/manage/poetry_add_plugin_export.sh +0 -2
  139. arpakitlib/_arpakit_project_template/manage/poetry_config_virtualenvs_in_project_true.sh +0 -2
  140. arpakitlib/_arpakit_project_template/manage/poetry_self_add_plugin_export.sh +0 -2
  141. arpakitlib/_arpakit_project_template/src/admin1/add_admin_in_app.py +0 -32
  142. arpakitlib/_arpakit_project_template/src/admin1/admin_auth.py +0 -29
  143. arpakitlib/_arpakit_project_template/src/admin1/model_view.py +0 -1
  144. arpakitlib/_arpakit_project_template/src/api/asgi.py +0 -3
  145. arpakitlib/_arpakit_project_template/src/api/auth.py +0 -53
  146. arpakitlib/_arpakit_project_template/src/api/const.py +0 -13
  147. arpakitlib/_arpakit_project_template/src/api/create_api_app.py +0 -43
  148. arpakitlib/_arpakit_project_template/src/api/create_handle_exception_.py +0 -59
  149. arpakitlib/_arpakit_project_template/src/api/event.py +0 -83
  150. arpakitlib/_arpakit_project_template/src/api/router/v1/get_api_error_info.py +0 -27
  151. arpakitlib/_arpakit_project_template/src/api/router/v1/main_router.py +0 -15
  152. arpakitlib/_arpakit_project_template/src/api/schema/v1/in_.py +0 -1
  153. arpakitlib/_arpakit_project_template/src/api/schema/v1/out.py +0 -1
  154. arpakitlib/_arpakit_project_template/src/api/transmitted_api_data.py +0 -7
  155. arpakitlib/_arpakit_project_template/src/api/util.py +0 -44
  156. arpakitlib/_arpakit_project_template/src/core/const.py +0 -41
  157. arpakitlib/_arpakit_project_template/src/core/settings.py +0 -21
  158. arpakitlib/_arpakit_project_template/src/core/util.py +0 -61
  159. arpakitlib/_arpakit_project_template/src/json_db/_drop_json_db.py +0 -13
  160. arpakitlib/_arpakit_project_template/src/json_db/_init_json_db.py +0 -11
  161. arpakitlib/_arpakit_project_template/src/json_db/_reinit_json_db.py +0 -13
  162. arpakitlib/_arpakit_project_template/src/json_db/_rm_all_records_in_json_db.py +0 -13
  163. arpakitlib/_arpakit_project_template/src/json_db/json_db.py +0 -11
  164. arpakitlib/_arpakit_project_template/src/json_db/util.py +0 -17
  165. arpakitlib/_arpakit_project_template/src/just_script/example.py +0 -16
  166. arpakitlib/_arpakit_project_template/src/operation_execution/_start_operation_executor_worker.py +0 -17
  167. arpakitlib/_arpakit_project_template/src/operation_execution/_start_scheduled_operation_creator_worker.py +0 -17
  168. arpakitlib/_arpakit_project_template/src/operation_execution/const.py +0 -9
  169. arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +0 -16
  170. arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +0 -29
  171. arpakitlib/_arpakit_project_template/src/operation_execution/util.py +0 -1
  172. arpakitlib/_arpakit_project_template/src/sandbox/sandbox_5.py +0 -17
  173. arpakitlib/_arpakit_project_template/src/sandbox/sandbox_6.py +0 -17
  174. arpakitlib/_arpakit_project_template/src/sandbox/sandbox_7.py +0 -17
  175. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_check_conn_sqlalchemy_db.py +0 -11
  176. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_drop_sqlalchemy_db.py +0 -13
  177. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_init_sqlalchemy_db.py +0 -11
  178. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_reinit_sqlalchemy_db.py +0 -13
  179. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_operations.py +0 -15
  180. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_story_logs.py +0 -16
  181. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/sqlalchemy_model.py +0 -13
  182. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/util.py +0 -27
  183. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py +0 -8
  184. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py +0 -8
  185. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py +0 -8
  186. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py +0 -8
  187. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py +0 -8
  188. arpakitlib/_arpakit_project_template/src/tg_bot/blank/blank.py +0 -10
  189. arpakitlib/_arpakit_project_template/src/tg_bot/event.py +0 -39
  190. arpakitlib/_arpakit_project_template/src/tg_bot/router/error.py +0 -3
  191. arpakitlib/_arpakit_project_template/src/tg_bot/router/router.py +0 -7
  192. arpakitlib/_arpakit_project_template/src/tg_bot/start_tg_bot.py +0 -11
  193. arpakitlib/_arpakit_project_template/src/tg_bot/transmitted_tg_data.py +0 -6
  194. arpakitlib/_arpakit_project_template/src/tg_bot/util.py +0 -44
  195. arpakitlib/ar_api_key_util.py +0 -21
  196. arpakitlib/ar_fastapi_static/swagger-ui/index.html +0 -19
  197. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js +0 -2
  198. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -1
  199. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js +0 -2
  200. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js +0 -2
  201. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map +0 -1
  202. arpakitlib/ar_fastapi_util.py +0 -862
  203. arpakitlib/ar_operation_execution_util.py +0 -504
  204. arpakitlib/ar_sqlalchemy_model_util.py +0 -183
  205. arpakitlib-1.7.257.dist-info/RECORD +0 -236
  206. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/.gitignore +0 -0
  207. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/.python-version +0 -0
  208. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/LICENSE +0 -0
  209. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/additional_model}/__init__.py +0 -0
  210. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/additional_model/additional_model.py +0 -0
  211. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/README +0 -0
  212. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/script.py.mako +0 -0
  213. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic.ini +0 -0
  214. /arpakitlib/{_arpakit_project_template/manage/note → _arpakit_project_template_v_1/api}/__init__.py +0 -0
  215. /arpakitlib/{_arpakit_project_template/resource → _arpakit_project_template_v_1/api/router}/__init__.py +0 -0
  216. /arpakitlib/{_arpakit_project_template/resource/static → _arpakit_project_template_v_1/api/router/v1}/__init__.py +0 -0
  217. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1/api/schema}/__init__.py +0 -0
  218. /arpakitlib/{_arpakit_project_template/src/additional_model → _arpakit_project_template_v_1/api/schema/common}/__init__.py +0 -0
  219. /arpakitlib/{_arpakit_project_template/src/admin1 → _arpakit_project_template_v_1/api/schema/v1}/__init__.py +0 -0
  220. /arpakitlib/{_arpakit_project_template/manage/note/note_1.txt → _arpakit_project_template_v_1/api/util.py} +0 -0
  221. /arpakitlib/{_arpakit_project_template/src/api → _arpakit_project_template_v_1/business_service}/__init__.py +0 -0
  222. /arpakitlib/{_arpakit_project_template/src/api/router → _arpakit_project_template_v_1/celery_}/__init__.py +0 -0
  223. /arpakitlib/{_arpakit_project_template/src/api/router/v1 → _arpakit_project_template_v_1/command}/__init__.py +0 -0
  224. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/alembic_upgrade_head .sh +0 -0
  225. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_ps_a.sh +0 -0
  226. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_rm_postgres.sh +0 -0
  227. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_run_postgres.sh +0 -0
  228. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_start_postgres.sh +0 -0
  229. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_stop_postgres.sh +0 -0
  230. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_commit.sh +0 -0
  231. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_company_github_1.sh +0 -0
  232. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_company_gitlab_1.sh +0 -0
  233. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_github_1.sh +0 -0
  234. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_gitlab_1.sh +0 -0
  235. /arpakitlib/{_arpakit_project_template/manage/git_remote_v.sh → _arpakit_project_template_v_1/command/git_remote.sh} +0 -0
  236. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_set_arpakit_company_origin.sh +0 -0
  237. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_set_arpakit_origin.sh +0 -0
  238. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_status.sh +0 -0
  239. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_check.sh +0 -0
  240. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_clear_cache.sh +0 -0
  241. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_config.sh +0 -0
  242. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_install.sh +0 -0
  243. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_lock.sh +0 -0
  244. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_remove_and_add_arpakitlib.sh +0 -0
  245. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_show.sh +0 -0
  246. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_show_arpakitlib.sh +0 -0
  247. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_update.sh +0 -0
  248. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_update_arpakitlib.sh +0 -0
  249. /arpakitlib/{_arpakit_project_template/src/api/schema → _arpakit_project_template_v_1/core}/__init__.py +0 -0
  250. /arpakitlib/{_arpakit_project_template/src/api/schema/v1 → _arpakit_project_template_v_1/json_db}/__init__.py +0 -0
  251. /arpakitlib/{_arpakit_project_template/src/business_service → _arpakit_project_template_v_1/note}/__init__.py +0 -0
  252. /arpakitlib/{_arpakit_project_template/manage/note/note_2.txt → _arpakit_project_template_v_1/note/note_1.txt} +0 -0
  253. /arpakitlib/{_arpakit_project_template/manage/note/note_3.txt → _arpakit_project_template_v_1/note/note_2.txt} +0 -0
  254. /arpakitlib/{_arpakit_project_template/manage/note/note_4.txt → _arpakit_project_template_v_1/note/note_3.txt} +0 -0
  255. /arpakitlib/{_arpakit_project_template/manage/note/note_5.txt → _arpakit_project_template_v_1/note/note_4.txt} +0 -0
  256. /arpakitlib/{_arpakit_project_template/src/core/__init__.py → _arpakit_project_template_v_1/note/note_5.txt} +0 -0
  257. /arpakitlib/{_arpakit_project_template/src/json_db → _arpakit_project_template_v_1/operation_execution}/__init__.py +0 -0
  258. /arpakitlib/{_arpakit_project_template/src/just_script/__init__.py → _arpakit_project_template_v_1/operation_execution/const.py} +0 -0
  259. /arpakitlib/{_arpakit_project_template/src/operation_execution → _arpakit_project_template_v_1/resource}/__init__.py +0 -0
  260. /arpakitlib/{_arpakit_project_template/resource/static/healthcheck → _arpakit_project_template_v_1/resource/static/1} +0 -0
  261. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/healthcheck +0 -0
  262. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/resource/static/helloworld +0 -0
  263. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/redoc/redoc.standalone.js +0 -0
  264. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/favicon-16x16.png +0 -0
  265. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/favicon-32x32.png +0 -0
  266. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/index.css +0 -0
  267. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/oauth2-redirect.html +0 -0
  268. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-initializer.js +0 -0
  269. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-bundle.js.map +0 -0
  270. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  271. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  272. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.css +0 -0
  273. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.css.map +0 -0
  274. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/sandbox/__init__.py +0 -0
  275. /arpakitlib/{_arpakit_project_template/src/sqlalchemy_db → _arpakit_project_template_v_1/site}/__init__.py +0 -0
  276. /arpakitlib/{_arpakit_project_template/src/test_data/__init__.py → _arpakit_project_template_v_1/site/asgi.py} +0 -0
  277. /arpakitlib/{_arpakit_project_template/src/tg_bot/__init__.py → _arpakit_project_template_v_1/site/consts.py} +0 -0
  278. /arpakitlib/{_arpakit_project_template/src/tg_bot/blank/__init__.py → _arpakit_project_template_v_1/site/create_site_app.py} +0 -0
  279. /arpakitlib/{_arpakit_project_template/src/tg_bot/filter/__init__.py → _arpakit_project_template_v_1/site/event.py} +0 -0
  280. /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/__init__.py → _arpakit_project_template_v_1/site/exception_handler.py} +0 -0
  281. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb → _arpakit_project_template_v_1/site/router}/__init__.py +0 -0
  282. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_ → _arpakit_project_template_v_1/sqladmin_}/__init__.py +0 -0
  283. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/static_ → _arpakit_project_template_v_1/sqlalchemy_db}/__init__.py +0 -0
  284. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/sqlalchemy_db/const.py +0 -0
  285. /arpakitlib/{_arpakit_project_template/src/tg_bot/middleware → _arpakit_project_template_v_1/test_data}/__init__.py +0 -0
  286. /arpakitlib/{_arpakit_project_template/src/tg_bot/router → _arpakit_project_template_v_1/tg_bot}/__init__.py +0 -0
  287. /arpakitlib/{_arpakit_project_template/src/util → _arpakit_project_template_v_1/tg_bot/blank}/__init__.py +0 -0
  288. /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/cmd_arpakitlib.py → _arpakit_project_template_v_1/tg_bot/filter/__init__.py} +0 -0
  289. /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/cmd_healthcheck.py → _arpakit_project_template_v_1/tg_bot/kb/__init__.py} +0 -0
  290. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_/callback.py → _arpakit_project_template_v_1/tg_bot/kb/inline_/__init__.py} +0 -0
  291. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_/common.py → _arpakit_project_template_v_1/tg_bot/kb/inline_/callback.py} +0 -0
  292. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/static_ → _arpakit_project_template_v_1/tg_bot/kb/inline_}/common.py +0 -0
  293. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/LICENSE +0 -0
  294. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/entry_points.txt +0 -0
@@ -1,504 +0,0 @@
1
- # arpakit
2
-
3
- from __future__ import annotations
4
-
5
- import asyncio
6
- import logging
7
- import traceback
8
- from datetime import timedelta, time
9
- from typing import Any, Callable
10
-
11
- from pydantic import ConfigDict
12
- from pydantic.v1 import BaseModel
13
- from sqlalchemy import asc
14
- from sqlalchemy.exc import NoResultFound
15
- from sqlalchemy.orm import Session
16
-
17
- from arpakitlib.ar_base_worker_util import BaseWorker
18
- from arpakitlib.ar_datetime_util import now_utc_dt
19
- from arpakitlib.ar_dict_util import combine_dicts
20
- from arpakitlib.ar_sleep_util import sync_safe_sleep, async_safe_sleep
21
- from arpakitlib.ar_sqlalchemy_model_util import OperationDBM, StoryLogDBM, BaseOperationTypes
22
- from arpakitlib.ar_sqlalchemy_util import SQLAlchemyDb
23
- from arpakitlib.ar_type_util import raise_for_type
24
-
25
- _ARPAKIT_LIB_MODULE_VERSION = "3.0"
26
-
27
- _logger = logging.getLogger(__name__)
28
-
29
-
30
- def get_operation_for_execution(
31
- *,
32
- session: Session | None = None,
33
- sqlalchemy_db: SQLAlchemyDb | None = None,
34
- filter_operation_types: list[str] | str | None = None,
35
- lock: bool = False
36
- ) -> OperationDBM | None:
37
- if isinstance(filter_operation_types, str):
38
- filter_operation_types = [filter_operation_types]
39
-
40
- def func(session_: Session):
41
- query = (
42
- session_
43
- .query(OperationDBM)
44
- .filter(OperationDBM.status == OperationDBM.Statuses.waiting_for_execution)
45
- )
46
- if filter_operation_types:
47
- query = query.filter(OperationDBM.type.in_(filter_operation_types))
48
-
49
- if lock:
50
- query = query.with_for_update()
51
-
52
- query = query.order_by(asc(OperationDBM.creation_dt))
53
- operation_dbm: OperationDBM | None = query.first()
54
- return operation_dbm
55
-
56
- if session is not None:
57
- return func(session_=session)
58
- elif sqlalchemy_db is not None:
59
- with sqlalchemy_db.new_session() as session:
60
- return func(session_=session)
61
- else:
62
- raise ValueError("session is None and sqlalchemy_db is None")
63
-
64
-
65
- def get_operation_by_id(
66
- *,
67
- session: Session | None = None,
68
- sqlalchemy_db: SQLAlchemyDb | None = None,
69
- filter_operation_id: int,
70
- raise_if_not_found: bool = False,
71
- lock: bool = False
72
- ) -> OperationDBM | None:
73
- def func(session_: Session):
74
- query = (
75
- session_
76
- .query(OperationDBM)
77
- .filter(OperationDBM.id == filter_operation_id)
78
- )
79
-
80
- if lock:
81
- query = query.with_for_update()
82
-
83
- if raise_if_not_found:
84
- try:
85
- return query.one()
86
- except NoResultFound:
87
- if raise_if_not_found:
88
- raise ValueError("Operation not found")
89
- else:
90
- return query.one_or_none()
91
-
92
- if session is not None:
93
- return func(session_=session)
94
- elif sqlalchemy_db is not None:
95
- with sqlalchemy_db.new_session() as session:
96
- return func(session_=session)
97
- else:
98
- raise ValueError("session is None and sqlalchemy_db is None")
99
-
100
-
101
- def remove_operations(
102
- *,
103
- session: Session | None = None,
104
- sqlalchemy_db: SQLAlchemyDb | None = None,
105
- filter_operation_ids: list[int] | int | None = None,
106
- filter_operation_types: list[str] | str | None = None,
107
- filter_operation_statuses: list[str] | str | None = None
108
- ):
109
- if isinstance(filter_operation_ids, int):
110
- filter_operation_ids = [filter_operation_ids]
111
- if isinstance(filter_operation_types, str):
112
- filter_operation_types = [filter_operation_types]
113
- if isinstance(filter_operation_statuses, str):
114
- filter_operation_statuses = [filter_operation_statuses]
115
-
116
- if filter_operation_ids is not None:
117
- raise_for_type(filter_operation_ids, list)
118
- if filter_operation_types is not None:
119
- raise_for_type(filter_operation_types, list)
120
- if filter_operation_statuses is not None:
121
- raise_for_type(filter_operation_statuses, list)
122
-
123
- def func(session_: Session):
124
- query = session_.query(OperationDBM)
125
- if filter_operation_ids is not None:
126
- query = query.filter(OperationDBM.id.in_(filter_operation_ids))
127
- if filter_operation_types is not None:
128
- query = query.filter(OperationDBM.type.in_(filter_operation_types))
129
- if filter_operation_statuses is not None:
130
- query = query.filter(OperationDBM.status.in_(filter_operation_statuses))
131
- query.delete()
132
- session_.commit()
133
-
134
- if session is not None:
135
- return func(session_=session)
136
- elif sqlalchemy_db is not None:
137
- with sqlalchemy_db.new_session() as session:
138
- return func(session_=session)
139
- else:
140
- raise ValueError("session is None and sqlalchemy_db is None")
141
-
142
-
143
- class BaseOperationExecutor:
144
- def __init__(self, *, sqlalchemy_db: SQLAlchemyDb, **kwargs):
145
- self._logger = logging.getLogger(self.__class__.__name__)
146
- self.sql_alchemy_db = sqlalchemy_db
147
-
148
- def sync_execute_operation(self, operation_dbm: OperationDBM, session: Session) -> OperationDBM:
149
- if operation_dbm.type == BaseOperationTypes.healthcheck_:
150
- self._logger.info("healthcheck")
151
- elif operation_dbm.type == BaseOperationTypes.raise_fake_exception_:
152
- self._logger.info("raise_fake_exception")
153
- raise Exception("raise_fake_exception")
154
- return operation_dbm
155
-
156
- def sync_safe_execute_operation(
157
- self, operation_dbm: OperationDBM, worker: OperationExecutorWorker, session: Session
158
- ) -> OperationDBM:
159
- self._logger.info(
160
- f"start "
161
- f"operation_dbm.id={operation_dbm.id}, "
162
- f"operation_dbm.type={operation_dbm.type}, "
163
- f"operation_dbm.status={operation_dbm.status}"
164
- )
165
-
166
- operation_dbm.execution_start_dt = now_utc_dt()
167
- operation_dbm.status = OperationDBM.Statuses.executing
168
- operation_dbm.output_data = combine_dicts(
169
- operation_dbm.output_data,
170
- {
171
- worker.worker_fullname: True
172
- }
173
- )
174
- session.commit()
175
-
176
- exception: Exception | None = None
177
- traceback_str: str | None = None
178
-
179
- try:
180
- self.sync_execute_operation(operation_dbm=operation_dbm, session=session)
181
- except Exception as exception_:
182
- self._logger.error(
183
- f"error in sync_execute_operation (id={operation_dbm.id}, type={operation_dbm.type})",
184
- exc_info=exception_
185
- )
186
- exception = exception_
187
- traceback_str = traceback.format_exc()
188
-
189
- operation_dbm.execution_finish_dt = now_utc_dt()
190
- if exception:
191
- operation_dbm.status = OperationDBM.Statuses.executed_with_error
192
- operation_dbm.error_data = combine_dicts(
193
- {
194
- "exception_str": str(exception),
195
- "traceback_str": traceback_str
196
- },
197
- operation_dbm.error_data
198
- )
199
- else:
200
- operation_dbm.status = OperationDBM.Statuses.executed_without_error
201
- session.commit()
202
-
203
- if exception:
204
- story_log_dbm = StoryLogDBM(
205
- level=StoryLogDBM.Levels.error,
206
- title=f"error in sync_execute_operation (id={operation_dbm.id}, type={operation_dbm.type})",
207
- data={
208
- "operation_id": operation_dbm.id,
209
- "exception_str": str(exception),
210
- "traceback_str": traceback_str
211
- }
212
- )
213
- session.add(story_log_dbm)
214
- session.commit()
215
-
216
- session.refresh(operation_dbm)
217
-
218
- self._logger.info(
219
- f"finish sync_safe_execute_operation, "
220
- f"operation_dbm.id={operation_dbm.id}, "
221
- f"operation_dbm.type={operation_dbm.type}, "
222
- f"operation_dbm.status={operation_dbm.status}, "
223
- f"operation_dbm.duration={operation_dbm.duration}"
224
- )
225
-
226
- return operation_dbm
227
-
228
- async def async_execute_operation(self, operation_dbm: OperationDBM, session: Session) -> OperationDBM:
229
- if operation_dbm.type == BaseOperationTypes.healthcheck_:
230
- self._logger.info("healthcheck")
231
- elif operation_dbm.type == BaseOperationTypes.raise_fake_exception_:
232
- self._logger.info("raise_fake_exception")
233
- raise Exception("raise_fake_exception")
234
- return operation_dbm
235
-
236
- async def async_safe_execute_operation(
237
- self, operation_dbm: OperationDBM, worker: OperationExecutorWorker, session: Session
238
- ) -> OperationDBM:
239
- self._logger.info(
240
- f"start "
241
- f"operation_dbm.id={operation_dbm.id}, "
242
- f"operation_dbm.type={operation_dbm.type}, "
243
- f"operation_dbm.status={operation_dbm.status}"
244
- )
245
-
246
- operation_dbm.execution_start_dt = now_utc_dt()
247
- operation_dbm.status = OperationDBM.Statuses.executing
248
- operation_dbm.output_data = combine_dicts(
249
- operation_dbm.output_data,
250
- {
251
- worker.worker_fullname: True
252
- }
253
- )
254
- session.commit()
255
-
256
- exception: Exception | None = None
257
- traceback_str: str | None = None
258
-
259
- try:
260
- await self.async_execute_operation(operation_dbm=operation_dbm, session=session)
261
- except Exception as exception_:
262
- self._logger.error(
263
- f"error in async_execute_operation (id={operation_dbm.id}, type={operation_dbm.type})",
264
- exc_info=exception_
265
- )
266
- exception = exception_
267
- traceback_str = traceback.format_exc()
268
-
269
- operation_dbm.execution_finish_dt = now_utc_dt()
270
- if exception:
271
- operation_dbm.status = OperationDBM.Statuses.executed_with_error
272
- operation_dbm.error_data = combine_dicts(
273
- {
274
- "exception_str": str(exception),
275
- "traceback_str": traceback_str
276
- },
277
- operation_dbm.error_data
278
- )
279
- else:
280
- operation_dbm.status = OperationDBM.Statuses.executed_without_error
281
- session.commit()
282
-
283
- if exception:
284
- story_log_dbm = StoryLogDBM(
285
- level=StoryLogDBM.Levels.error,
286
- title=f"error in async_execute_operation (id={operation_dbm.id}, type={operation_dbm.type})",
287
- data={
288
- "operation_id": operation_dbm.id,
289
- "exception_str": str(exception),
290
- "traceback_str": traceback_str
291
- }
292
- )
293
- session.add(story_log_dbm)
294
- session.commit()
295
-
296
- session.refresh(operation_dbm)
297
-
298
- self._logger.info(
299
- f"finish async_safe_execute_operation, "
300
- f"operation_dbm.id={operation_dbm.id}, "
301
- f"operation_dbm.type={operation_dbm.type}, "
302
- f"operation_dbm.status={operation_dbm.status}, "
303
- f"operation_dbm.duration={operation_dbm.duration}"
304
- )
305
-
306
- return operation_dbm
307
-
308
-
309
- class OperationExecutorWorker(BaseWorker):
310
-
311
- def __init__(
312
- self,
313
- *,
314
- sqlalchemy_db: SQLAlchemyDb,
315
- operation_executor: BaseOperationExecutor | None = None,
316
- filter_operation_types: str | list[str] | None = None,
317
- startup_funcs: list[Any] | None = None,
318
- **kwargs
319
- ):
320
- super().__init__(
321
- timeout_after_run=timedelta(seconds=0.3),
322
- timeout_after_err_in_run=timedelta(seconds=0.3),
323
- startup_funcs=startup_funcs,
324
- )
325
- raise_for_type(sqlalchemy_db, SQLAlchemyDb)
326
- self.sqlalchemy_db = sqlalchemy_db
327
- if operation_executor is None:
328
- operation_executor = BaseOperationExecutor(sqlalchemy_db=sqlalchemy_db)
329
- self.operation_executor = operation_executor
330
- if isinstance(filter_operation_types, str):
331
- filter_operation_types = [filter_operation_types]
332
- self.filter_operation_types = filter_operation_types
333
-
334
- def sync_on_startup(self):
335
- self.sqlalchemy_db.init()
336
- self.sync_run_startup_funcs()
337
-
338
- def sync_execute_operation(self, operation_dbm: OperationDBM, session: Session) -> OperationDBM:
339
- return self.operation_executor.sync_safe_execute_operation(
340
- operation_dbm=operation_dbm, worker=self, session=session
341
- )
342
-
343
- def sync_run(self):
344
- with self.sqlalchemy_db.new_session() as session:
345
- operation_dbm: OperationDBM | None = get_operation_for_execution(
346
- session=session,
347
- filter_operation_types=self.filter_operation_types,
348
- lock=True
349
- )
350
- if not operation_dbm:
351
- return
352
- self.sync_execute_operation(operation_dbm=operation_dbm, session=session)
353
-
354
- async def async_on_startup(self):
355
- self.sqlalchemy_db.init()
356
- await self.async_run_startup_funcs()
357
-
358
- async def async_execute_operation(self, operation_dbm: OperationDBM, session: Session) -> OperationDBM:
359
- return await self.operation_executor.async_safe_execute_operation(
360
- operation_dbm=operation_dbm, worker=self, session=session
361
- )
362
-
363
- async def async_run(self):
364
- with self.sqlalchemy_db.new_session() as session:
365
- operation_dbm: OperationDBM | None = get_operation_for_execution(
366
- sqlalchemy_db=self.sqlalchemy_db,
367
- filter_operation_types=self.filter_operation_types,
368
- lock=True
369
- )
370
- if not operation_dbm:
371
- return
372
- await self.async_execute_operation(operation_dbm=operation_dbm, session=session)
373
-
374
-
375
- class ScheduledOperation(BaseModel):
376
- model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
377
-
378
- type: str
379
- input_data: dict[str, Any] | None = None
380
- is_time_func: Callable[[], bool]
381
- timeout_after_creation: timedelta | None = None
382
-
383
-
384
- class ScheduledOperationCreatorWorker(BaseWorker):
385
- def __init__(
386
- self,
387
- *,
388
- sqlalchemy_db: SQLAlchemyDb,
389
- scheduled_operations: ScheduledOperation | list[ScheduledOperation] | None = None,
390
- startup_funcs: list[Any] | None = None
391
- ):
392
- super().__init__(
393
- timeout_after_run=timedelta(seconds=0.3),
394
- timeout_after_err_in_run=timedelta(seconds=0.3),
395
- startup_funcs=startup_funcs
396
- )
397
- raise_for_type(sqlalchemy_db, SQLAlchemyDb)
398
- self.sqlalchemy_db = sqlalchemy_db
399
- if scheduled_operations is None:
400
- scheduled_operations = []
401
- if isinstance(scheduled_operations, ScheduledOperation):
402
- scheduled_operations = [scheduled_operations]
403
- self.scheduled_operations = scheduled_operations
404
-
405
- def sync_on_startup(self):
406
- self.sqlalchemy_db.init()
407
- self.sync_run_startup_funcs()
408
-
409
- def sync_run(self):
410
- timeout = None
411
-
412
- for scheduled_operation in self.scheduled_operations:
413
-
414
- if not scheduled_operation.is_time_func():
415
- continue
416
-
417
- with self.sqlalchemy_db.new_session() as session:
418
- operation_dbm = OperationDBM(
419
- type=scheduled_operation.type,
420
- input_data=scheduled_operation.input_data
421
- )
422
- session.add(operation_dbm)
423
- session.commit()
424
- session.refresh(operation_dbm)
425
- self._logger.info(f"scheduled operation (id={operation_dbm.id}) was created")
426
-
427
- if scheduled_operation.timeout_after_creation is not None:
428
- if timeout is not None:
429
- if scheduled_operation.timeout_after_creation > timeout:
430
- timeout = scheduled_operation.timeout_after_creation
431
- else:
432
- timeout = scheduled_operation.timeout_after_creation
433
-
434
- if timeout is not None:
435
- sync_safe_sleep(n=timeout)
436
-
437
- async def async_on_startup(self):
438
- self.sqlalchemy_db.init()
439
- await self.async_run_startup_funcs()
440
-
441
- async def async_run(self):
442
- timeout: timedelta | None = None
443
-
444
- for scheduled_operation in self.scheduled_operations:
445
-
446
- if not scheduled_operation.is_time_func():
447
- continue
448
-
449
- with self.sqlalchemy_db.new_session() as session:
450
- operation_dbm = OperationDBM(
451
- type=scheduled_operation.type,
452
- input_data=scheduled_operation.input_data
453
- )
454
- session.add(operation_dbm)
455
- session.commit()
456
- session.refresh(operation_dbm)
457
-
458
- if scheduled_operation.timeout_after_creation is not None:
459
- if timeout is not None:
460
- if scheduled_operation.timeout_after_creation > timeout:
461
- timeout = scheduled_operation.timeout_after_creation
462
- else:
463
- timeout = scheduled_operation.timeout_after_creation
464
-
465
- if timeout is not None:
466
- await async_safe_sleep(n=timeout)
467
-
468
-
469
- def every_timedelta_is_time_func(*, td: timedelta, now_dt_func: Callable = now_utc_dt) -> Callable:
470
- last_now_utc_dt = now_utc_dt()
471
-
472
- def func() -> bool:
473
- nonlocal last_now_utc_dt
474
- now_dt_func_ = now_dt_func()
475
- if (now_dt_func_ - last_now_utc_dt) >= td:
476
- last_now_utc_dt = now_dt_func_
477
- return True
478
- return False
479
-
480
- return func
481
-
482
-
483
- def between_different_times_is_time_func(
484
- *, from_time: time, to_time: time, now_dt_func: Callable = now_utc_dt
485
- ) -> Callable:
486
- def func() -> bool:
487
- if from_time <= now_dt_func().time() <= to_time:
488
- return True
489
- return False
490
-
491
- return func
492
-
493
-
494
- def __example():
495
- pass
496
-
497
-
498
- async def __async_example():
499
- pass
500
-
501
-
502
- if __name__ == '__main__':
503
- __example()
504
- asyncio.run(__async_example())
@@ -1,183 +0,0 @@
1
- # arpakit
2
-
3
- from datetime import datetime, timedelta
4
- from typing import Any
5
- from uuid import uuid4
6
-
7
- from sqlalchemy import inspect, INTEGER, TEXT, TIMESTAMP, func
8
- from sqlalchemy.dialects.postgresql import JSON
9
- from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
10
-
11
- from arpakitlib.ar_datetime_util import now_utc_dt
12
- from arpakitlib.ar_enumeration_util import Enumeration
13
- from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str
14
-
15
- _ARPAKIT_LIB_MODULE_VERSION = "3.0"
16
-
17
-
18
- def generate_default_long_id():
19
- return (
20
- f"longid"
21
- f"{str(uuid4()).replace('-', '')}"
22
- f"{str(now_utc_dt().timestamp()).replace('.', '')}"
23
- )
24
-
25
-
26
- class BaseDBM(DeclarativeBase):
27
- __abstract__ = True
28
- _bus_data: dict[str, Any] | None = None
29
-
30
- @property
31
- def bus_data(self) -> dict[str, Any]:
32
- if self._bus_data is None:
33
- self._bus_data = {}
34
- return self._bus_data
35
-
36
- def simple_dict(self, *, include_sd_properties: bool = True) -> dict[str, Any]:
37
- res = {}
38
-
39
- for c in inspect(self).mapper.column_attrs:
40
- value = getattr(self, c.key)
41
- if isinstance(value, BaseDBM):
42
- res[c.key] = value.simple_dict(include_sd_properties=include_sd_properties)
43
- elif isinstance(value, list):
44
- res[c.key] = [
45
- item.simple_dict(include_sd_properties=include_sd_properties)
46
- if isinstance(item, BaseDBM) else item
47
- for item in value
48
- ]
49
- else:
50
- res[c.key] = value
51
-
52
- if include_sd_properties:
53
- for attr_name in dir(self):
54
- if attr_name.startswith("sdp_") and isinstance(getattr(type(self), attr_name, None), property):
55
- prop_name = attr_name.removeprefix("sdp_")
56
- value = getattr(self, attr_name)
57
- if isinstance(value, BaseDBM):
58
- res[prop_name] = value.simple_dict(include_sd_properties=include_sd_properties)
59
- elif isinstance(value, list):
60
- res[prop_name] = [
61
- item.simple_dict(include_sd_properties=include_sd_properties)
62
- if isinstance(item, BaseDBM) else item
63
- for item in value
64
- ]
65
- else:
66
- res[prop_name] = value
67
-
68
- return res
69
-
70
- def simple_dict_with_sd_properties(self) -> dict[str, Any]:
71
- return self.simple_dict(include_sd_properties=True)
72
-
73
- def simple_json(self, *, include_sd_properties: bool = True) -> str:
74
- return safely_transfer_obj_to_json_str(self.simple_dict(include_sd_properties=include_sd_properties))
75
-
76
-
77
- class SimpleDBM(BaseDBM):
78
- __abstract__ = True
79
-
80
- id: Mapped[int] = mapped_column(
81
- INTEGER, primary_key=True, autoincrement=True, sort_order=-3, nullable=False
82
- )
83
- long_id: Mapped[str] = mapped_column(
84
- TEXT, insert_default=generate_default_long_id, server_default=func.gen_random_uuid(),
85
- unique=True, sort_order=-2, nullable=False
86
- )
87
- creation_dt: Mapped[datetime] = mapped_column(
88
- TIMESTAMP(timezone=True), insert_default=now_utc_dt, server_default=func.now(),
89
- index=True, sort_order=-1, nullable=False
90
- )
91
-
92
- def __repr__(self):
93
- return f"{self.__class__.__name__.removesuffix('DBM')} (id={self.id})"
94
-
95
-
96
- class StoryLogDBM(SimpleDBM):
97
- __tablename__ = "story_log"
98
-
99
- class Levels(Enumeration):
100
- info = "info"
101
- warning = "warning"
102
- error = "error"
103
-
104
- level: Mapped[str] = mapped_column(
105
- TEXT, insert_default=Levels.info, server_default=Levels.info, index=True, nullable=False
106
- )
107
- title: Mapped[str | None] = mapped_column(TEXT, index=True, default=None, nullable=True)
108
- data: Mapped[dict[str, Any]] = mapped_column(
109
- JSON, insert_default={}, server_default="{}", nullable=False
110
- )
111
-
112
-
113
- class BaseOperationTypes(Enumeration):
114
- healthcheck_ = "healthcheck"
115
- raise_fake_exception_ = "raise_fake_exception"
116
-
117
-
118
- class OperationDBM(SimpleDBM):
119
- __tablename__ = "operation"
120
-
121
- class Statuses(Enumeration):
122
- waiting_for_execution = "waiting_for_execution"
123
- executing = "executing"
124
- executed_without_error = "executed_without_error"
125
- executed_with_error = "executed_with_error"
126
-
127
- status: Mapped[str] = mapped_column(
128
- TEXT, index=True, insert_default=Statuses.waiting_for_execution,
129
- server_default=Statuses.waiting_for_execution, nullable=False
130
- )
131
- type: Mapped[str] = mapped_column(
132
- TEXT, index=True, insert_default=BaseOperationTypes.healthcheck_, nullable=False
133
- )
134
- execution_start_dt: Mapped[datetime | None] = mapped_column(TIMESTAMP(timezone=True), nullable=True)
135
- execution_finish_dt: Mapped[datetime | None] = mapped_column(TIMESTAMP(timezone=True), nullable=True)
136
- input_data: Mapped[dict[str, Any]] = mapped_column(
137
- JSON,
138
- insert_default={},
139
- server_default="{}",
140
- nullable=False
141
- )
142
- output_data: Mapped[dict[str, Any]] = mapped_column(JSON, insert_default={}, server_default="{}", nullable=False)
143
- error_data: Mapped[dict[str, Any]] = mapped_column(JSON, insert_default={}, server_default="{}", nullable=False)
144
-
145
- def raise_if_executed_with_error(self):
146
- if self.status == self.Statuses.executed_with_error:
147
- raise Exception(
148
- f"Operation (id={self.id}, type={self.type}) executed with error, error_data={self.error_data}"
149
- )
150
-
151
- def raise_if_error_data(self):
152
- if self.error_data:
153
- raise Exception(
154
- f"Operation (id={self.id}, type={self.type}) has error_data, error_data={self.error_data}"
155
- )
156
-
157
- @property
158
- def duration(self) -> timedelta | None:
159
- if self.execution_start_dt is None or self.execution_finish_dt is None:
160
- return None
161
- return self.execution_finish_dt - self.execution_start_dt
162
-
163
- @property
164
- def duration_total_seconds(self) -> float | None:
165
- if self.duration is None:
166
- return None
167
- return self.duration.total_seconds()
168
-
169
- @property
170
- def sdp_duration_total_seconds(self) -> float | None:
171
- return self.duration_total_seconds
172
-
173
-
174
- def import_ar_sqlalchemy_models():
175
- pass
176
-
177
-
178
- def __example():
179
- pass
180
-
181
-
182
- if __name__ == '__main__':
183
- __example()