fastapi-startkit 0.60.0__tar.gz → 0.62.0__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 (367) hide show
  1. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/PKG-INFO +4 -1
  2. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/pyproject.toml +7 -1
  3. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/application.py +2 -2
  4. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/config/__init__.py +2 -0
  5. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/application.py +2 -2
  6. fastapi_startkit-0.62.0/src/fastapi_startkit/facades/Redis.py +5 -0
  7. fastapi_startkit-0.62.0/src/fastapi_startkit/facades/Redis.pyi +27 -0
  8. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/__init__.py +1 -0
  9. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/exceptions.py +3 -4
  10. fastapi_startkit-0.62.0/src/fastapi_startkit/fastapi/referer.py +17 -0
  11. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/__init__.py +21 -0
  12. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/constant.py +13 -0
  13. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/context.py +21 -0
  14. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/encoding.py +8 -0
  15. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/errors.py +60 -0
  16. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/inertia.py +382 -0
  17. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/middleware.py +129 -0
  18. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/props/props.py +156 -0
  19. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/props/resolver.py +288 -0
  20. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/props/scroll.py +65 -0
  21. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/inertia/provider.py +12 -3
  22. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/redirect.py +28 -0
  23. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/session.py +74 -0
  24. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/ssr.py +88 -0
  25. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/testing.py +14 -0
  26. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +142 -26
  27. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +5 -1
  28. fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/migrations/Migration.py +13 -0
  29. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +64 -64
  30. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +1 -1
  31. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +6 -3
  32. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/__init__.py +7 -0
  33. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/config.py +42 -0
  34. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/connection.py +63 -0
  35. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/connector.py +21 -0
  36. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/manager.py +66 -0
  37. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/prefix.py +152 -0
  38. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/provider.py +39 -0
  39. fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/__init__.py +0 -5
  40. fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/constant.py +0 -7
  41. fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/context.py +0 -8
  42. fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/inertia.py +0 -187
  43. fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/middleware.py +0 -102
  44. fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/props/props.py +0 -6
  45. fastapi_startkit-0.60.0/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -11
  46. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/README.md +0 -0
  47. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/.DS_Store +0 -0
  48. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/__init__.py +0 -0
  49. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/__init__.py +0 -0
  50. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/agent.py +0 -0
  51. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/ai.py +0 -0
  52. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/audio.py +0 -0
  53. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
  54. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/config/ai.py +0 -0
  55. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/config/config.py +0 -0
  56. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/decorators.py +0 -0
  57. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/document.py +0 -0
  58. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/image.py +0 -0
  59. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
  60. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/judge.py +0 -0
  61. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/lab.py +0 -0
  62. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
  63. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
  64. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
  65. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/recording.py +0 -0
  66. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/runner.py +0 -0
  67. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/state.py +0 -0
  68. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/testing.py +0 -0
  69. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/tinker.py +0 -0
  70. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/types.py +0 -0
  71. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
  72. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
  73. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
  74. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
  75. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
  76. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
  77. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
  78. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
  79. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
  80. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
  81. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
  82. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
  83. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
  84. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
  85. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
  86. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
  87. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
  88. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  89. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  90. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/config/app.py +0 -0
  91. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  92. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  93. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/config.py +0 -0
  94. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  95. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  96. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  97. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/__init__.py +0 -0
  98. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  99. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  100. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/command.py +0 -0
  101. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  102. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/container/__init__.py +0 -0
  103. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/container/container.py +0 -0
  104. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  105. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/environment/environment.py +0 -0
  106. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/__init__.py +0 -0
  107. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
  108. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/fake.py +0 -0
  109. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/helpers.py +0 -0
  110. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/listener.py +0 -0
  111. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/provider.py +0 -0
  112. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  113. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  114. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  115. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/AI.py +0 -0
  116. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
  117. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  118. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Config.py +0 -0
  119. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  120. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  121. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  122. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Event.py +0 -0
  123. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
  124. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  125. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  126. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  127. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  128. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  129. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  130. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  131. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  132. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  133. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  134. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  135. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  136. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  137. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  138. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  139. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Request.py +0 -0
  140. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  141. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Response.py +0 -0
  142. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  143. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Session.py +0 -0
  144. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  145. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Url.py +0 -0
  146. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  147. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/View.py +0 -0
  148. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  149. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  150. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  151. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  152. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  153. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
  154. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  155. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
  156. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/events.py +0 -0
  157. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
  158. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  159. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  160. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  161. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  162. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
  163. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  164. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
  165. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
  166. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
  167. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
  168. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  169. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  170. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  171. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  172. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  173. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  174. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  175. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  176. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  177. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  178. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  179. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  180. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  181. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  182. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  183. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
  184. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  185. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  186. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  187. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  188. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
  189. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  190. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/factory.py +0 -0
  191. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/file.py +0 -0
  192. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/handler.py +0 -0
  193. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  194. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/logger.py +0 -0
  195. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  196. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  197. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  198. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  199. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
  200. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  201. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  202. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  203. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  204. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  205. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  206. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  207. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  208. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  209. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  210. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  211. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  212. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  213. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  214. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  215. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  216. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  217. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  218. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  219. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  220. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  221. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
  222. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  223. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
  224. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
  225. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  226. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  227. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  228. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  229. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  230. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  231. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  232. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  233. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  234. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  235. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  236. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  237. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
  238. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  239. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  240. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  241. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  242. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
  243. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  244. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  245. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
  246. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  247. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  248. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  249. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  250. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  251. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  252. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  253. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  254. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  255. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  256. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  257. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  258. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  259. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  260. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  261. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
  262. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  263. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  264. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  265. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  266. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  267. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  268. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  269. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  270. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  271. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  272. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  273. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  274. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  275. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  276. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  277. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  278. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  279. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  280. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  281. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  282. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  283. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  284. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  285. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  286. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  287. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  288. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  289. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  290. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  291. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  292. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  293. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  294. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  295. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  296. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  297. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  298. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
  299. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +0 -0
  300. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  301. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  302. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  303. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  304. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
  305. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/argument.py +0 -0
  306. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
  307. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
  308. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  309. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
  310. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/request.py +0 -0
  311. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/resource.py +0 -0
  312. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/response.py +0 -0
  313. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/server.py +0 -0
  314. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/tool.py +0 -0
  315. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/__init__.py +0 -0
  316. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/exception.py +0 -0
  317. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/fake.py +0 -0
  318. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/process.py +0 -0
  319. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/result.py +0 -0
  320. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/py.typed +0 -0
  321. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/__init__.py +0 -0
  322. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
  323. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
  324. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
  325. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
  326. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
  327. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
  328. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/parser.py +0 -0
  329. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/provider.py +0 -0
  330. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/registry.py +0 -0
  331. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
  332. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
  333. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
  334. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  335. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
  336. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
  337. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  338. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
  339. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  340. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  341. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  342. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/file.py +0 -0
  343. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  344. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/helper.py +0 -0
  345. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  346. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/storage.py +0 -0
  347. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/__init__.py +0 -0
  348. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/collection.py +0 -0
  349. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/dataclass.py +0 -0
  350. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
  351. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
  352. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/string.py +0 -0
  353. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/structures.py +0 -0
  354. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/uri.py +0 -0
  355. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  356. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  357. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  358. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
  359. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  360. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  361. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  362. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  363. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  364. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
  365. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  366. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  367. {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/vite.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fastapi-startkit
3
- Version: 0.60.0
3
+ Version: 0.62.0
4
4
  Summary: A modular, provider-driven framework for building async Python web applications with FastAPI — bundling a service container, configuration system, an async-first ORM, facades, and a Cleo-powered console.
5
5
  Keywords: fastapi,framework,async,web,asgi,orm,sqlalchemy,pydantic,ioc-container,dependency-injection,service-provider,cli,console,configuration,microservices,starter-kit,boilerplate
6
6
  Author: Bedram Tamang
@@ -26,11 +26,13 @@ Requires-Dist: langgraph>=1.0.0 ; extra == 'ai'
26
26
  Requires-Dist: faker>=40.13.0 ; extra == 'database'
27
27
  Requires-Dist: sqlalchemy[asyncio]>=2.0.38 ; extra == 'database'
28
28
  Requires-Dist: fastapi[standard]>=0.124.4 ; extra == 'fastapi'
29
+ Requires-Dist: httpx>=0.28.1 ; extra == 'fastapi'
29
30
  Requires-Dist: itsdangerous>=2.2.0 ; extra == 'fastapi'
30
31
  Requires-Dist: jinja2>=3.1 ; extra == 'inertia'
31
32
  Requires-Dist: markupsafe>=2.0 ; extra == 'inertia'
32
33
  Requires-Dist: aiomysql>=0.2.0 ; extra == 'mysql'
33
34
  Requires-Dist: asyncpg>=0.29.0 ; extra == 'postgres'
35
+ Requires-Dist: redis>=5.0.1 ; extra == 'redis'
34
36
  Requires-Dist: aiosqlite>=0.22.1 ; extra == 'sqlite'
35
37
  Requires-Dist: jinja2>=3.1 ; extra == 'vite'
36
38
  Requires-Python: >=3.12, <4.0
@@ -45,6 +47,7 @@ Provides-Extra: fastapi
45
47
  Provides-Extra: inertia
46
48
  Provides-Extra: mysql
47
49
  Provides-Extra: postgres
50
+ Provides-Extra: redis
48
51
  Provides-Extra: sqlite
49
52
  Provides-Extra: vite
50
53
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.60.0"
3
+ version = "0.62.0"
4
4
  description = "A modular, provider-driven framework for building async Python web applications with FastAPI — bundling a service container, configuration system, an async-first ORM, facades, and a Cleo-powered console."
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -56,6 +56,7 @@ Changelog = "https://github.com/fastapi-startkit/fastapi-startkit-framework/rele
56
56
  [project.optional-dependencies]
57
57
  fastapi = [
58
58
  "fastapi[standard]>=0.124.4",
59
+ "httpx>=0.28.1",
59
60
  "itsdangerous>=2.2.0",
60
61
  ]
61
62
  database = [
@@ -89,6 +90,9 @@ ai = [
89
90
  "langchain-core>=1.0.0",
90
91
  "langgraph>=1.0.0",
91
92
  ]
93
+ redis = [
94
+ "redis>=5.0.1",
95
+ ]
92
96
 
93
97
  [dependency-groups]
94
98
  dev = [
@@ -110,6 +114,8 @@ dev = [
110
114
  "basedpyright>=1.31.4",
111
115
  "pyright>=1.1.411",
112
116
  "pytest-benchmark>=5.2.3",
117
+ "redis>=5.0.1",
118
+ "fakeredis[lua]>=2.26.0",
113
119
  ]
114
120
 
115
121
 
@@ -225,10 +225,10 @@ class Application(Container, Generic[TConfig]):
225
225
  def add_commands(self, commands: List):
226
226
  self.commands.extend(commands)
227
227
 
228
- def handle_command(self):
228
+ def handle_command(self) -> int:
229
229
  from fastapi_startkit.console import ConsoleApplication
230
230
 
231
- ConsoleApplication(self).handle()
231
+ return ConsoleApplication(self).handle()
232
232
 
233
233
  def run(self, command: str, args: "str | list[str] | None" = None) -> int:
234
234
  from cleo.io.inputs.string_input import StringInput
@@ -1 +1,3 @@
1
1
  from .app import AppConfig
2
+
3
+ __all__ = ["AppConfig"]
@@ -26,5 +26,5 @@ class ConsoleApplication(BaseApplication):
26
26
  self.app.exception_manager.report(error)
27
27
  super().render_error(error, io)
28
28
 
29
- def handle(self):
30
- self.run()
29
+ def handle(self) -> int:
30
+ return self.run()
@@ -0,0 +1,5 @@
1
+ from .Facade import Facade
2
+
3
+
4
+ class Redis(metaclass=Facade):
5
+ key = "redis"
@@ -0,0 +1,27 @@
1
+ from collections.abc import Awaitable, Callable, Iterable
2
+ from typing import Any, overload
3
+
4
+ from redis.asyncio.client import Pipeline
5
+ from redis.asyncio.client import Redis as AsyncRedis
6
+
7
+ from fastapi_startkit.redis import Connection, RedisManager
8
+
9
+ class RedisFacade(AsyncRedis):
10
+ def connection(self, name: str | None = None) -> Connection: ... # pyright: ignore[reportIncompatibleVariableOverride]
11
+ def connections(self) -> dict[str, Connection]: ...
12
+ def extend(self, client: str, factory: Callable[[dict[str, Any]], Any]) -> RedisManager: ...
13
+ async def purge(self, name: str | None = None) -> None: ...
14
+ async def disconnect(self) -> None: ...
15
+ async def command(self, method: str, parameters: Iterable[Any] | None = None) -> Any: ... # pyright: ignore[reportIncompatibleMethodOverride]
16
+ @overload
17
+ def pipeline(self, callback: None = None) -> Pipeline: ...
18
+ @overload
19
+ def pipeline(self, callback: Callable[[Pipeline], Any]) -> Awaitable[list[Any]]: ... # pyright: ignore[reportIncompatibleMethodOverride]
20
+ @overload
21
+ def transaction(self, callback: None = None) -> Pipeline: ...
22
+ @overload
23
+ def transaction(self, callback: Callable[[Pipeline], Any]) -> Awaitable[list[Any]]: ... # pyright: ignore[reportIncompatibleMethodOverride]
24
+ async def subscribe(self, channels: str | Iterable[str], callback: Callable[[Any, Any], Any]) -> None: ...
25
+ async def psubscribe(self, patterns: str | Iterable[str], callback: Callable[[Any, Any], Any]) -> None: ...
26
+
27
+ Redis: RedisFacade
@@ -15,3 +15,4 @@ from .Dump import Dump
15
15
  from .Queue import Queue
16
16
  from .Cache import Cache
17
17
  from .RateLimiter import RateLimiter
18
+ from .Redis import Redis
@@ -64,7 +64,6 @@ class ValidationExceptionHandler:
64
64
 
65
65
  from starlette.responses import RedirectResponse
66
66
 
67
- return RedirectResponse(
68
- url=request.headers.get("referer", "/"),
69
- status_code=303,
70
- )
67
+ from fastapi_startkit.fastapi.referer import same_origin_referer
68
+
69
+ return RedirectResponse(url=same_origin_referer(request), status_code=303)
@@ -0,0 +1,17 @@
1
+ from typing import Optional
2
+ from urllib.parse import urlsplit
3
+
4
+ from starlette.requests import Request
5
+
6
+
7
+ def same_origin_referer(request: Optional[Request], fallback: str = "/") -> str:
8
+ referer = request.headers.get("referer") if request is not None else None
9
+ if not referer or request is None:
10
+ return fallback
11
+ target = urlsplit(referer)
12
+ if not target.scheme and not target.netloc:
13
+ return referer if referer.startswith("/") and not referer.startswith("//") else fallback
14
+ origin = urlsplit(str(request.base_url))
15
+ if (target.scheme, target.netloc) == (origin.scheme, origin.netloc):
16
+ return referer
17
+ return fallback
@@ -0,0 +1,21 @@
1
+ from .errors import ValidationErrors
2
+ from .inertia import Inertia
3
+ from .middleware import InertiaMiddleware
4
+ from .props.props import Prop
5
+ from .props.scroll import ScrollMetadata
6
+ from .provider import InertiaProvider
7
+ from .redirect import InertiaRedirect
8
+ from .ssr import HttpSSRGateway, SSRGateway, ViteHotFileGateway
9
+
10
+ __all__ = [
11
+ "Inertia",
12
+ "InertiaMiddleware",
13
+ "InertiaProvider",
14
+ "InertiaRedirect",
15
+ "HttpSSRGateway",
16
+ "Prop",
17
+ "SSRGateway",
18
+ "ScrollMetadata",
19
+ "ValidationErrors",
20
+ "ViteHotFileGateway",
21
+ ]
@@ -0,0 +1,13 @@
1
+ class Header:
2
+ INERTIA = "X-Inertia"
3
+ INERTIA_VERSION = "X-Inertia-Version"
4
+ INERTIA_PARTIAL_COMPONENT = "X-Inertia-Partial-Component"
5
+ INERTIA_LOCATION = "X-Inertia-Location"
6
+ INERTIA_REDIRECT = "X-Inertia-Redirect"
7
+ ERROR_BAG = "X-Inertia-Error-Bag"
8
+ PURPOSE = "Purpose"
9
+ INERTIA_PARTIAL_DATA = "X-Inertia-Partial-Data"
10
+ INERTIA_PARTIAL_EXCEPT = "X-Inertia-Partial-Except"
11
+ INERTIA_RESET = "X-Inertia-Reset"
12
+ INERTIA_EXCEPT_ONCE_PROPS = "X-Inertia-Except-Once-Props"
13
+ INERTIA_INFINITE_SCROLL_MERGE_INTENT = "X-Inertia-Infinite-Scroll-Merge-Intent"
@@ -0,0 +1,21 @@
1
+ from contextvars import ContextVar
2
+ from dataclasses import dataclass, field
3
+ from typing import Any, Callable, Optional
4
+
5
+ from fastapi import Request
6
+
7
+ current_request: ContextVar[Optional[Request]] = ContextVar("inertia_request", default=None)
8
+
9
+
10
+ @dataclass
11
+ class InertiaRequestState:
12
+ shared_props: dict[str, Any] = field(default_factory=dict)
13
+ root_view: Optional[str] = None
14
+ version: Optional[Callable[[], Optional[str]]] = None
15
+ resolved_version: Optional[str] = None
16
+ version_resolved: bool = False
17
+ encrypt_history: Optional[bool] = None
18
+ session: dict[str, Any] = field(default_factory=dict)
19
+
20
+
21
+ current_state: ContextVar[Optional[InertiaRequestState]] = ContextVar("inertia_state", default=None)
@@ -0,0 +1,8 @@
1
+ import json
2
+ from typing import Any
3
+
4
+ HTML_UNSAFE_CHARACTERS = str.maketrans({"<": "\\u003c", ">": "\\u003e", "&": "\\u0026"})
5
+
6
+
7
+ def html_safe_json(value: Any) -> str:
8
+ return json.dumps(value, ensure_ascii=True).translate(HTML_UNSAFE_CHARACTERS)
@@ -0,0 +1,60 @@
1
+ from collections.abc import Iterable, Mapping
2
+ from typing import Any, Optional, Self, Union
3
+
4
+ from fastapi.exceptions import RequestValidationError
5
+ from pydantic import ValidationError
6
+
7
+ Messages = Union[str, Iterable[str]]
8
+ ErrorsInput = Union["ValidationErrors", Mapping[str, Messages], ValidationError, RequestValidationError]
9
+
10
+
11
+ class ValidationErrors:
12
+ def __init__(self, messages: Optional[Mapping[str, Messages]] = None):
13
+ self.messages: dict[str, list[str]] = {}
14
+ if messages:
15
+ self.merge(messages)
16
+
17
+ def add(self, field: str, message: str) -> Self:
18
+ self.messages.setdefault(field, []).append(message)
19
+ return self
20
+
21
+ def has(self, field: str) -> bool:
22
+ return bool(self.messages.get(field))
23
+
24
+ def first(self, field: str) -> Optional[str]:
25
+ messages = self.messages.get(field)
26
+ return messages[0] if messages else None
27
+
28
+ def get(self, field: str) -> list[str]:
29
+ return list(self.messages.get(field, []))
30
+
31
+ def merge(self, errors: Union["ValidationErrors", Mapping[str, Messages]]) -> Self:
32
+ source = errors.messages if isinstance(errors, ValidationErrors) else errors
33
+ for field, messages in source.items():
34
+ for message in [messages] if isinstance(messages, str) else messages:
35
+ self.add(field, message)
36
+ return self
37
+
38
+ def all(self) -> dict[str, list[str]]:
39
+ return {field: list(messages) for field, messages in self.messages.items()}
40
+
41
+ def firsts(self) -> dict[str, str]:
42
+ return {field: messages[0] for field, messages in self.messages.items() if messages}
43
+
44
+ def __bool__(self) -> bool:
45
+ return any(self.messages.values())
46
+
47
+ @classmethod
48
+ def make(cls, errors: ErrorsInput) -> "ValidationErrors":
49
+ if isinstance(errors, RequestValidationError):
50
+ return cls.from_error_list(errors.errors(), skip=1)
51
+ if isinstance(errors, ValidationError):
52
+ return cls.from_error_list(errors.errors(), skip=0)
53
+ return cls(errors.messages if isinstance(errors, ValidationErrors) else errors)
54
+
55
+ @classmethod
56
+ def from_error_list(cls, errors: Iterable[Mapping[str, Any]], skip: int) -> "ValidationErrors":
57
+ result = cls()
58
+ for error in errors:
59
+ result.add(".".join(str(part) for part in error["loc"][skip:]), error["msg"])
60
+ return result
@@ -0,0 +1,382 @@
1
+ import logging
2
+ from typing import Any, Dict, Iterable, Optional, Union
3
+ from urllib.parse import urlparse
4
+
5
+ from fastapi import Request
6
+ from fastapi.responses import JSONResponse
7
+ from starlette.responses import RedirectResponse, Response
8
+
9
+ from fastapi_startkit.inertia import session
10
+ from fastapi_startkit.inertia.errors import ErrorsInput
11
+ from fastapi_startkit.fastapi.referer import same_origin_referer
12
+ from fastapi_startkit.inertia.redirect import InertiaRedirect
13
+ from fastapi_startkit.inertia.ssr import HttpSSRGateway, SSRGateway, ViteHotFileGateway, is_excepted
14
+
15
+ from fastapi_startkit.inertia.props.props import OptionalProp, Prop
16
+ from fastapi_startkit.inertia.props.resolver import PropsResolver
17
+ from fastapi_startkit.inertia.props.scroll import ScrollMetadata
18
+ from fastapi_startkit.inertia.constant import Header
19
+ from fastapi_startkit.inertia.context import current_request, current_state
20
+
21
+ logger = logging.getLogger("fastapi_startkit.inertia")
22
+
23
+
24
+ class ResponseFactory:
25
+ """Holds all Inertia state: app container, root view, shared props, version."""
26
+
27
+ def __init__(self):
28
+ self.root_view: str = "index.html"
29
+ self.shared_props: dict = {}
30
+ self.version = None
31
+ self.ssr_gateway: Optional[SSRGateway] = None
32
+ self.ssr_enabled: bool = False
33
+ self.ssr_except_paths: tuple[str, ...] = ()
34
+ self.encrypt_history_enabled: bool = False
35
+ self.expose_shared_prop_keys: bool = True
36
+
37
+ def set_root_view(self, view: str):
38
+ self.root_view = view
39
+
40
+ def share(self, key: Union[str, Dict[str, Any]], value: Any = None):
41
+ state = current_state.get()
42
+ props = state.shared_props if state is not None else self.shared_props
43
+ if isinstance(key, dict):
44
+ props.update(key)
45
+ else:
46
+ props[key] = value
47
+
48
+ def shared(self) -> dict:
49
+ state = current_state.get()
50
+ request_props = state.shared_props if state is not None else {}
51
+ return {**self.shared_props, **request_props}
52
+
53
+ def set_version(self, version):
54
+ self.version = version
55
+
56
+ def get_version(self) -> Optional[str]:
57
+ state = current_state.get()
58
+ if state is None:
59
+ return self.resolve_version(self.version)
60
+ if not state.version_resolved:
61
+ state.resolved_version = self.resolve_version(self.version if self.version is not None else state.version)
62
+ state.version_resolved = True
63
+ return state.resolved_version
64
+
65
+ @staticmethod
66
+ def resolve_version(version) -> Optional[str]:
67
+ v = version() if callable(version) else version
68
+ return str(v) if v is not None else None
69
+
70
+ def get_root_view(self) -> str:
71
+ state = current_state.get()
72
+ if state is not None and state.root_view:
73
+ return state.root_view
74
+ return self.root_view
75
+
76
+ def set_encrypt_history(self, enabled: bool = True):
77
+ state = current_state.get()
78
+ if state is not None:
79
+ state.encrypt_history = enabled
80
+ else:
81
+ self.encrypt_history_enabled = enabled
82
+
83
+ def should_encrypt_history(self) -> bool:
84
+ state = current_state.get()
85
+ if state is not None and state.encrypt_history is not None:
86
+ return state.encrypt_history
87
+ return self.encrypt_history_enabled
88
+
89
+ def set_ssr(self, url: Optional[str], timeout: float = 1.0, enabled: bool = True, except_paths: Iterable[str] = ()):
90
+ gateway = HttpSSRGateway(url, timeout) if url else None
91
+ self.set_ssr_gateway(gateway, enabled, except_paths)
92
+
93
+ def set_ssr_gateway(self, gateway: Optional[SSRGateway], enabled: bool = True, except_paths: Iterable[str] = ()):
94
+ self.ssr_gateway = gateway
95
+ self.ssr_enabled = enabled and gateway is not None
96
+ self.ssr_except_paths = tuple(except_paths)
97
+
98
+ async def ssr_healthy(self) -> bool:
99
+ if not self.ssr_enabled or self.ssr_gateway is None:
100
+ return False
101
+ return await self.ssr_gateway.healthy()
102
+
103
+ def render(self, component: str, props: dict) -> "InertiaResponse":
104
+ return InertiaResponse(
105
+ component=component,
106
+ shared_props=self.shared(),
107
+ props=props,
108
+ root_view=self.get_root_view(),
109
+ version=self.get_version() or "",
110
+ ssr_gateway=self.ssr_gateway if self.ssr_enabled else None,
111
+ ssr_except_paths=self.ssr_except_paths,
112
+ encrypt_history=self.should_encrypt_history(),
113
+ expose_shared_prop_keys=self.expose_shared_prop_keys,
114
+ )
115
+
116
+
117
+ class InertiaResponse(Response):
118
+ def __init__(
119
+ self,
120
+ component: str,
121
+ shared_props: dict,
122
+ props: dict,
123
+ root_view: str = "index.html",
124
+ version: str = "",
125
+ ssr_gateway: Optional[SSRGateway] = None,
126
+ ssr_except_paths: Iterable[str] = (),
127
+ encrypt_history: bool = False,
128
+ expose_shared_prop_keys: bool = True,
129
+ ):
130
+ # Do not call supper().__init__() — body is built lazily in __call__
131
+ self.background = None # required by FastAPI's response handling
132
+ self.component = component
133
+ self.shared_props = shared_props
134
+ self.props = props
135
+ self.root_view = root_view
136
+ self.version = version
137
+ self.ssr_gateway = ssr_gateway
138
+ self.ssr_except_paths = tuple(ssr_except_paths)
139
+ self.encrypt_history_enabled = encrypt_history
140
+ self.flash_data: dict = {}
141
+ self.expose_shared_prop_keys = expose_shared_prop_keys
142
+
143
+ def with_(self, key: Union[str, Dict[str, Any]], value: Any = None) -> "InertiaResponse":
144
+ if isinstance(key, dict):
145
+ self.props = {**self.props, **key}
146
+ else:
147
+ self.props[key] = value
148
+ return self
149
+
150
+ def with_root_view(self, root_view: str) -> "InertiaResponse":
151
+ self.root_view = root_view
152
+ return self
153
+
154
+ def flash(self, key: Union[str, Dict[str, Any]], value: Any = None) -> "InertiaResponse":
155
+ self.flash_data.update(key if isinstance(key, dict) else {key: value})
156
+ return self
157
+
158
+ def encrypt_history(self, enabled: bool = True) -> "InertiaResponse":
159
+ self.encrypt_history_enabled = enabled
160
+ return self
161
+
162
+ def session_metadata(self, request: Request) -> dict:
163
+ flash = {**(session.pull(request, session.FLASH) or {}), **self.flash_data}
164
+ metadata: dict = {
165
+ "encryptHistory": self.encrypt_history_enabled,
166
+ "clearHistory": bool(session.pull(request, session.CLEAR_HISTORY, False)),
167
+ }
168
+ if session.pull(request, session.PRESERVE_FRAGMENT, False):
169
+ metadata["preserveFragment"] = True
170
+ if flash:
171
+ metadata["flash"] = flash
172
+ return metadata
173
+
174
+ async def to_response(self, request: Request):
175
+ props, metadata = await PropsResolver(request, self.component).resolve(
176
+ self.shared_props, self.props, self.expose_shared_prop_keys
177
+ )
178
+
179
+ page = {
180
+ "component": self.component,
181
+ "props": props,
182
+ "url": self._get_url(request),
183
+ "version": self.version,
184
+ **metadata,
185
+ }
186
+ page.update(self.session_metadata(request))
187
+
188
+ gateway = self._ssr_gateway_for(request)
189
+ if gateway is not None:
190
+ rendered = await self._render_ssr(gateway, page)
191
+ if rendered:
192
+ page["ssr"] = rendered
193
+
194
+ if request.headers.get(Header.INERTIA):
195
+ return JSONResponse(
196
+ content=page,
197
+ headers={Header.INERTIA: "true"},
198
+ )
199
+
200
+ from fastapi_startkit.application import app as container
201
+
202
+ if not container().has("templates"):
203
+ raise RuntimeError("Inertia requires 'templates' to be bound in the container for initial rendering.")
204
+
205
+ return (
206
+ container()
207
+ .make("templates")
208
+ .TemplateResponse(
209
+ request,
210
+ self.root_view,
211
+ {"page": page},
212
+ )
213
+ )
214
+
215
+ def _ssr_gateway_for(self, request: Request) -> Optional[SSRGateway]:
216
+ if request.headers.get(Header.INERTIA):
217
+ return None
218
+ if is_excepted(urlparse(str(request.url)).path or "/", self.ssr_except_paths):
219
+ return None
220
+ return self.ssr_gateway
221
+
222
+ async def _render_ssr(self, gateway: SSRGateway, page: dict) -> Optional[dict]:
223
+ try:
224
+ return await gateway.render(page)
225
+ except Exception:
226
+ logger.warning("Inertia SSR failed, falling back to client-side rendering.", exc_info=True)
227
+ return None
228
+
229
+ def _get_url(self, request: Request) -> str:
230
+ parsed = urlparse(str(request.url))
231
+ url = parsed.path
232
+ if parsed.query:
233
+ url = f"{url}?{parsed.query}"
234
+ return url or "/"
235
+
236
+ async def __call__(self, scope, receive, send):
237
+ request = current_request.get()
238
+ if request is None:
239
+ raise RuntimeError(
240
+ "InertiaResponse requires InertiaMiddleware to be registered. "
241
+ "Add app.add_middleware(InertiaMiddleware) to your bootstrap."
242
+ )
243
+ actual_response = await self.to_response(request)
244
+ await actual_response(scope, receive, send)
245
+
246
+
247
+ class Inertia:
248
+ _instance: Optional[ResponseFactory] = None
249
+
250
+ @classmethod
251
+ def instance(cls):
252
+ if cls._instance is None:
253
+ cls._instance = ResponseFactory()
254
+ return cls._instance
255
+
256
+ @staticmethod
257
+ def set_root_view(root_view: str):
258
+ Inertia.instance().set_root_view(root_view)
259
+
260
+ @staticmethod
261
+ def share(key: Union[str, Dict[str, Any]], value: Any = None):
262
+ Inertia.instance().share(key, value)
263
+
264
+ @staticmethod
265
+ def shared() -> dict:
266
+ return Inertia.instance().shared()
267
+
268
+ @staticmethod
269
+ def version(version):
270
+ Inertia.instance().set_version(version)
271
+
272
+ @staticmethod
273
+ def ssr(
274
+ url: Optional[str] = "http://127.0.0.1:13714",
275
+ timeout: float = 1.0,
276
+ enabled: bool = True,
277
+ except_paths: Iterable[str] = (),
278
+ ):
279
+ Inertia.instance().set_ssr(url, timeout, enabled, except_paths)
280
+
281
+ @staticmethod
282
+ def ssr_hot(hot_file: str, timeout: float = 1.0, enabled: bool = True, except_paths: Iterable[str] = ()):
283
+ Inertia.instance().set_ssr_gateway(ViteHotFileGateway(hot_file, timeout), enabled, except_paths)
284
+
285
+ @staticmethod
286
+ def ssr_gateway(gateway: SSRGateway, enabled: bool = True, except_paths: Iterable[str] = ()):
287
+ Inertia.instance().set_ssr_gateway(gateway, enabled, except_paths)
288
+
289
+ @staticmethod
290
+ async def ssr_healthy() -> bool:
291
+ return await Inertia.instance().ssr_healthy()
292
+
293
+ @staticmethod
294
+ def encrypt_history(enabled: bool = True):
295
+ Inertia.instance().set_encrypt_history(enabled)
296
+
297
+ @staticmethod
298
+ def clear_history():
299
+ session.clear_history()
300
+
301
+ @staticmethod
302
+ def preserve_fragment():
303
+ session.preserve_fragment()
304
+
305
+ @staticmethod
306
+ def flash(key: Union[str, Dict[str, Any]], value: Any = None):
307
+ session.flash(key, value)
308
+
309
+ @staticmethod
310
+ def with_errors(errors: ErrorsInput):
311
+ session.with_errors(errors)
312
+
313
+ @staticmethod
314
+ def with_errors_in(bag: str, errors: ErrorsInput):
315
+ session.with_errors(errors, bag)
316
+
317
+ @staticmethod
318
+ def location(url: str) -> Response:
319
+ request = current_request.get()
320
+ if request is not None and request.headers.get(Header.INERTIA):
321
+ return Response(status_code=409, headers={Header.INERTIA_LOCATION: url})
322
+ return RedirectResponse(url, status_code=302)
323
+
324
+ @staticmethod
325
+ def redirect(url: str, status_code: int = 302) -> InertiaRedirect:
326
+ return InertiaRedirect(url, status_code=status_code)
327
+
328
+ @staticmethod
329
+ def back(status_code: int = 302) -> InertiaRedirect:
330
+ return InertiaRedirect(same_origin_referer(current_request.get()), status_code=status_code)
331
+
332
+ @staticmethod
333
+ def back_with_errors(errors: ErrorsInput, bag: Optional[str] = None) -> InertiaRedirect:
334
+ return Inertia.back().with_errors_in(bag or session.DEFAULT_BAG, errors)
335
+
336
+ @staticmethod
337
+ def get_version() -> Optional[str]:
338
+ return Inertia.instance().get_version()
339
+
340
+ @staticmethod
341
+ def expose_shared_prop_keys(expose: bool = True):
342
+ Inertia.instance().expose_shared_prop_keys = expose
343
+
344
+ @staticmethod
345
+ def optional(callback) -> OptionalProp:
346
+ return OptionalProp(callback)
347
+
348
+ @staticmethod
349
+ def lazy(callback) -> Prop:
350
+ return Prop(callback)
351
+
352
+ @staticmethod
353
+ def defer(callback, group: str = "default") -> Prop:
354
+ return Prop(callback).defer(group)
355
+
356
+ @staticmethod
357
+ def always(value) -> Prop:
358
+ return Prop(value).always()
359
+
360
+ @staticmethod
361
+ def merge(value) -> Prop:
362
+ return Prop(value).merge()
363
+
364
+ @staticmethod
365
+ def deep_merge(value) -> Prop:
366
+ return Prop(value).deep_merge()
367
+
368
+ @staticmethod
369
+ def once(callback) -> Prop:
370
+ return Prop(callback).once()
371
+
372
+ @staticmethod
373
+ def scroll(page, metadata: Optional[ScrollMetadata] = None) -> Prop:
374
+ return Prop(page).scroll(metadata)
375
+
376
+ @staticmethod
377
+ def scroll_with(callback) -> Prop:
378
+ return Prop(callback).scroll()
379
+
380
+ @staticmethod
381
+ def render(component: str, props: Optional[Dict[str, Any]] = None) -> InertiaResponse:
382
+ return Inertia.instance().render(component, props or {})