fastapi-startkit 0.59.0__tar.gz → 0.61.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 (342) hide show
  1. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/PKG-INFO +1 -1
  2. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/pyproject.toml +1 -1
  3. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +20 -1
  4. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/config/fastapi.py +2 -0
  5. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/inertia/inertia.py +55 -0
  6. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/inertia/provider.py +11 -2
  7. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/config/logging.py +1 -0
  8. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/handler.py +6 -2
  9. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +4 -3
  10. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/providers/log_provider.py +1 -1
  11. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/config/config.py +4 -0
  12. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +1 -1
  13. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/builder.py +58 -0
  14. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +1 -1
  15. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +2 -2
  16. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/README.md +0 -0
  17. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/.DS_Store +0 -0
  18. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/__init__.py +0 -0
  19. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/__init__.py +0 -0
  20. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/agent.py +0 -0
  21. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/ai.py +0 -0
  22. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/audio.py +0 -0
  23. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
  24. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/config/ai.py +0 -0
  25. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/config/config.py +0 -0
  26. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/decorators.py +0 -0
  27. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/document.py +0 -0
  28. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/image.py +0 -0
  29. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
  30. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/judge.py +0 -0
  31. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/lab.py +0 -0
  32. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
  33. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
  34. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
  35. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/recording.py +0 -0
  36. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/runner.py +0 -0
  37. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/state.py +0 -0
  38. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/testing.py +0 -0
  39. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/tinker.py +0 -0
  40. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/ai/types.py +0 -0
  41. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/application.py +0 -0
  42. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
  43. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
  44. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
  45. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
  46. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
  47. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
  48. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
  49. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
  50. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
  51. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
  52. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
  53. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
  54. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
  55. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
  56. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
  57. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
  58. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
  59. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  60. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  61. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/config/__init__.py +0 -0
  62. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/config/app.py +0 -0
  63. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  64. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  65. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/configuration/config.py +0 -0
  66. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  67. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  68. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  69. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/console/__init__.py +0 -0
  70. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/console/application.py +0 -0
  71. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  72. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  73. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/console/command.py +0 -0
  74. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  75. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/container/__init__.py +0 -0
  76. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/container/container.py +0 -0
  77. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  78. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/environment/environment.py +0 -0
  79. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/events/__init__.py +0 -0
  80. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
  81. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/events/fake.py +0 -0
  82. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/events/helpers.py +0 -0
  83. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/events/listener.py +0 -0
  84. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/events/provider.py +0 -0
  85. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  86. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  87. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  88. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/AI.py +0 -0
  89. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
  90. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  91. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Config.py +0 -0
  92. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  93. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  94. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  95. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Event.py +0 -0
  96. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
  97. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  98. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  99. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  100. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  101. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  102. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  103. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  104. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  105. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  106. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  107. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  108. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  109. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  110. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  111. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  112. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Request.py +0 -0
  113. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  114. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Response.py +0 -0
  115. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  116. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Session.py +0 -0
  117. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  118. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Url.py +0 -0
  119. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  120. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/View.py +0 -0
  121. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  122. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  123. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  124. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/facades/__init__.py +0 -0
  125. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  126. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  127. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  128. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/events.py +0 -0
  129. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
  130. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
  131. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  132. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  133. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  134. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  135. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
  136. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  137. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
  138. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
  139. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  140. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  141. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/inertia/context.py +0 -0
  142. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
  143. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  144. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
  145. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
  146. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  147. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  148. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  149. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  150. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  151. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  152. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  153. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  154. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  155. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  156. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  157. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  158. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  159. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  160. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  161. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  162. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  163. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  164. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  165. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
  166. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  167. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/factory.py +0 -0
  168. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/file.py +0 -0
  169. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  170. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/logger.py +0 -0
  171. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  172. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  173. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
  174. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  175. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  176. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  177. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  178. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  179. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  180. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  181. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  182. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  183. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  184. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  185. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  186. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  187. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  188. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  189. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  190. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  191. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  192. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  193. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  194. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  195. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  196. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
  197. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
  198. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  199. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  200. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  201. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  202. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  203. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  204. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
  205. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  206. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  207. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  208. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  209. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  210. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  211. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  212. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
  213. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  214. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  215. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  216. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  217. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  218. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  219. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
  220. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  221. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  222. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  223. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  224. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  225. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  226. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  227. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  228. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  229. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  230. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  231. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  232. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  233. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  234. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  235. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  236. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  237. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  238. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  239. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  240. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  241. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  242. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  243. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  244. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  245. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  246. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  247. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  248. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  249. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  250. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  251. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  252. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  253. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  254. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  255. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  256. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  257. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  258. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  259. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  260. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  261. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  262. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  263. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  264. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  265. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  266. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  267. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  268. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  269. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  270. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  271. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  272. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
  273. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
  274. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +0 -0
  275. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  276. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  277. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  278. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  279. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
  280. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/argument.py +0 -0
  281. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
  282. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
  283. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  284. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
  285. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/request.py +0 -0
  286. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/resource.py +0 -0
  287. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/response.py +0 -0
  288. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/server.py +0 -0
  289. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/mcp/tool.py +0 -0
  290. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/process/__init__.py +0 -0
  291. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/process/exception.py +0 -0
  292. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/process/fake.py +0 -0
  293. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/process/process.py +0 -0
  294. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/process/result.py +0 -0
  295. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/py.typed +0 -0
  296. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/__init__.py +0 -0
  297. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
  298. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
  299. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
  300. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
  301. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
  302. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
  303. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/parser.py +0 -0
  304. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/provider.py +0 -0
  305. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/registry.py +0 -0
  306. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
  307. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
  308. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
  309. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  310. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
  311. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
  312. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  313. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
  314. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  315. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  316. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  317. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/file.py +0 -0
  318. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  319. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/helper.py +0 -0
  320. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  321. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/storage/storage.py +0 -0
  322. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/__init__.py +0 -0
  323. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/collection.py +0 -0
  324. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/dataclass.py +0 -0
  325. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
  326. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
  327. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/string.py +0 -0
  328. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/structures.py +0 -0
  329. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/support/uri.py +0 -0
  330. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  331. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  332. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  333. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
  334. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  335. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  336. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  337. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  338. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  339. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
  340. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  341. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  342. {fastapi_startkit-0.59.0 → fastapi_startkit-0.61.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.59.0
3
+ Version: 0.61.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.59.0"
3
+ version = "0.61.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 = [
@@ -11,6 +11,9 @@ from fastapi_startkit.support import Uri, Uriable
11
11
  if TYPE_CHECKING:
12
12
  from fastapi_startkit.application import Application
13
13
 
14
+ # Values accepted by uvicorn's `ws` setting.
15
+ WS_BACKENDS = ("auto", "none", "websockets", "websockets-sansio", "wsproto")
16
+
14
17
 
15
18
  class ServeCommand(Command):
16
19
  name = "serve"
@@ -45,6 +48,13 @@ class ServeCommand(Command):
45
48
  default=None,
46
49
  description="The application to serve (overrides fastapi config)",
47
50
  ),
51
+ option(
52
+ "ws",
53
+ None,
54
+ flag=False,
55
+ default=None,
56
+ description=f"The uvicorn WebSocket backend: {', '.join(WS_BACKENDS)} (overrides fastapi config)",
57
+ ),
48
58
  ]
49
59
 
50
60
  def config_value(self, key: str) -> Any:
@@ -72,11 +82,20 @@ class ServeCommand(Command):
72
82
 
73
83
  return uri.with_port(port) if port else uri
74
84
 
85
+ def resolve_ws(self) -> str:
86
+ """CLI flag > fastapi config > FastAPIConfig default ('auto')."""
87
+ return str(self.option("ws") or self.config_value("ws"))
88
+
75
89
  def handle(self) -> int:
76
90
  import uvicorn
77
91
 
78
92
  from fastapi_startkit.container import Container
79
93
 
94
+ ws = self.resolve_ws()
95
+ if ws not in WS_BACKENDS:
96
+ self.line_error(f"Invalid --ws backend '{ws}'. Allowed values: {', '.join(WS_BACKENDS)}.", style="error")
97
+ return 1
98
+
80
99
  url = self.resolve_url()
81
100
  reload = self.resolve_option("reload")
82
101
  app = self.resolve_option("app")
@@ -85,7 +104,7 @@ class ServeCommand(Command):
85
104
  "host": url.host(),
86
105
  "port": url.port(),
87
106
  "reload": reload,
88
- "ws": "websockets-sansio",
107
+ "ws": ws,
89
108
  }
90
109
 
91
110
  if self.is_app_exist(app):
@@ -8,6 +8,8 @@ class FastAPIConfig:
8
8
  app_url: str = dataclasses.field(default_factory=lambda: env("APP_URL", "http://127.0.0.1:8000"))
9
9
  app: str = "bootstrap.application:app"
10
10
  reload: bool = dataclasses.field(default_factory=lambda: env("APP_RELOAD", True))
11
+ # 'auto' keeps the optional `websockets` package from being required at startup.
12
+ ws: str = dataclasses.field(default_factory=lambda: env("APP_WS", "auto"))
11
13
  reload_dirs: list | None = None
12
14
  reload_excludes: list = dataclasses.field(
13
15
  default_factory=lambda: [
@@ -1,4 +1,7 @@
1
1
  import inspect
2
+ import asyncio
3
+ import json
4
+ import urllib.request
2
5
  from typing import Any, Dict, Optional, Union
3
6
  from urllib.parse import urlparse
4
7
 
@@ -19,6 +22,8 @@ class ResponseFactory:
19
22
  self.root_view: str = "index.html"
20
23
  self.shared_props: dict = {}
21
24
  self.version = None
25
+ self.ssr_url: Optional[str] = None
26
+ self.ssr_timeout: float = 1.0
22
27
 
23
28
  def set_root_view(self, view: str):
24
29
  self.root_view = view
@@ -36,6 +41,11 @@ class ResponseFactory:
36
41
  v = self.version() if callable(self.version) else self.version
37
42
  return str(v) if v is not None else None
38
43
 
44
+ def set_ssr(self, url: Optional[str], timeout: float = 1.0):
45
+ """Configure the Inertia SSR server endpoint. Pass None to disable SSR."""
46
+ self.ssr_url = url.rstrip("/") if url else None
47
+ self.ssr_timeout = timeout
48
+
39
49
  def render(self, component: str, props: dict) -> "InertiaResponse":
40
50
  return InertiaResponse(
41
51
  component=component,
@@ -43,6 +53,8 @@ class ResponseFactory:
43
53
  props=props,
44
54
  root_view=self.root_view,
45
55
  version=self.get_version() or "",
56
+ ssr_url=self.ssr_url,
57
+ ssr_timeout=self.ssr_timeout,
46
58
  )
47
59
 
48
60
 
@@ -54,6 +66,8 @@ class InertiaResponse(Response):
54
66
  props: dict,
55
67
  root_view: str = "index.html",
56
68
  version: str = "",
69
+ ssr_url: Optional[str] = None,
70
+ ssr_timeout: float = 1.0,
57
71
  ):
58
72
  # Do not call supper().__init__() — body is built lazily in __call__
59
73
  self.background = None # required by FastAPI's response handling
@@ -62,6 +76,8 @@ class InertiaResponse(Response):
62
76
  self.props = props
63
77
  self.root_view = root_view
64
78
  self.version = version
79
+ self.ssr_url = ssr_url
80
+ self.ssr_timeout = ssr_timeout
65
81
 
66
82
  def with_(self, key: Union[str, Dict[str, Any]], value: Any = None) -> "InertiaResponse":
67
83
  if isinstance(key, dict):
@@ -114,6 +130,13 @@ class InertiaResponse(Response):
114
130
  "version": self.version,
115
131
  }
116
132
 
133
+ # SSR is used only for the initial HTML response. Inertia XHR requests
134
+ # continue returning the regular page JSON and never contact Node.
135
+ if not request.headers.get(Header.INERTIA) and self.ssr_url:
136
+ rendered = await self._render_ssr(page)
137
+ if rendered:
138
+ page["ssr"] = rendered
139
+
117
140
  if request.headers.get(Header.INERTIA):
118
141
  return JSONResponse(
119
142
  content=page,
@@ -135,6 +158,33 @@ class InertiaResponse(Response):
135
158
  )
136
159
  )
137
160
 
161
+ async def _render_ssr(self, page: dict) -> Optional[dict]:
162
+ """Ask the configured Inertia Node server to render this page."""
163
+ ssr_url = self.ssr_url
164
+ if ssr_url is None:
165
+ return None
166
+
167
+ def request_ssr():
168
+ body = json.dumps(page).encode("utf-8")
169
+ req = urllib.request.Request(
170
+ ssr_url.rstrip("/") + "/render",
171
+ data=body,
172
+ headers={"Content-Type": "application/json"},
173
+ method="POST",
174
+ )
175
+ with urllib.request.urlopen(req, timeout=self.ssr_timeout) as response:
176
+ result = json.loads(response.read().decode("utf-8"))
177
+ if not isinstance(result, dict) or not isinstance(result.get("body"), str):
178
+ raise ValueError("Invalid Inertia SSR response")
179
+ return {"body": result["body"], "head": result.get("head", [])}
180
+
181
+ try:
182
+ return await asyncio.to_thread(request_ssr)
183
+ except Exception:
184
+ # SSR is an enhancement: if its process is unavailable, send the
185
+ # normal page shell so the client can still hydrate it.
186
+ return None
187
+
138
188
  def _get_url(self, request: Request) -> str:
139
189
  parsed = urlparse(str(request.url))
140
190
  url = parsed.path
@@ -174,6 +224,11 @@ class Inertia:
174
224
  def version(version):
175
225
  Inertia.instance().set_version(version)
176
226
 
227
+ @staticmethod
228
+ def ssr(url: Optional[str] = "http://127.0.0.1:13714", timeout: float = 1.0):
229
+ """Enable SSR through the standard Inertia SSR server endpoint."""
230
+ Inertia.instance().set_ssr(url, timeout)
231
+
177
232
  @staticmethod
178
233
  def get_version() -> Optional[str]:
179
234
  return Inertia.instance().get_version()
@@ -18,10 +18,19 @@ class InertiaProvider(Provider):
18
18
  templates = self.app.make("templates")
19
19
 
20
20
  def inertia_helper(page):
21
- encoded_page = json.dumps(page)
21
+ client_page = {key: value for key, value in page.items() if key != "ssr"}
22
+ encoded_page = json.dumps(client_page).replace("<", "\\u003c")
23
+ ssr_body = page.get("ssr", {}).get("body", "")
22
24
  return Markup(
23
- f'<script data-page="app" type="application/json">{encoded_page}</script><div id="app"></div>'
25
+ f'<script data-page="app" type="application/json">{encoded_page}</script><div id="app">{ssr_body}</div>'
24
26
  )
25
27
 
28
+ def inertia_head(page):
29
+ head = page.get("ssr", {}).get("head", [])
30
+ if isinstance(head, str):
31
+ head = [head]
32
+ return Markup("".join(str(item) for item in head))
33
+
26
34
  templates.env.globals["inertia"] = inertia_helper
35
+ templates.env.globals["inertia_head"] = inertia_head
27
36
  templates.env.globals["Inertia"] = self.app.make("inertia")
@@ -7,6 +7,7 @@ from fastapi_startkit.logging.config import StackChannel, DailyChannel, Terminal
7
7
  @dataclasses.dataclass
8
8
  class LoggingConfig:
9
9
  default: str = dataclasses.field(default_factory=lambda: env("LOG_CHANNEL", "stack"))
10
+ level: str = dataclasses.field(default_factory=lambda: env("LOG_LEVEL", "info"))
10
11
 
11
12
  channels: dict = dataclasses.field(
12
13
  default_factory=lambda: {
@@ -1,5 +1,8 @@
1
1
  import logging
2
2
 
3
+ # Framework-only severities have no stdlib equivalent; map them to the nearest one.
4
+ _STDLIB_LEVELS = {"notice": "INFO", "alert": "CRITICAL", "emergency": "CRITICAL"}
5
+
3
6
 
4
7
  class LoggingHandler(logging.Handler):
5
8
  def emit(self, record: logging.LogRecord) -> None:
@@ -8,8 +11,9 @@ class LoggingHandler(logging.Handler):
8
11
  Logger.log(record.levelname, self.format(record))
9
12
 
10
13
  @staticmethod
11
- def install():
14
+ def install(level: str | None = None):
12
15
  root_logger = logging.getLogger()
13
16
  if not any(isinstance(h, LoggingHandler) for h in root_logger.handlers):
14
17
  root_logger.addHandler(LoggingHandler())
15
- root_logger.setLevel(logging.DEBUG)
18
+ if level:
19
+ root_logger.setLevel(_STDLIB_LEVELS.get(level.lower(), level.upper()))
@@ -7,10 +7,11 @@ class LoggingManager:
7
7
  self,
8
8
  channel_factory: type[ChannelFactory] = ChannelFactory,
9
9
  driver_factory: type[DriverFactory] = DriverFactory,
10
+ level: str | None = None,
10
11
  ):
11
12
  self.channel_factory = channel_factory
12
13
  self.driver_factory = driver_factory
13
- self.configure_python_logging()
14
+ self.configure_python_logging(level)
14
15
 
15
16
  def channel(self, channel: str):
16
17
  channel_class = self.channel_factory.make(channel)
@@ -19,7 +20,7 @@ class LoggingManager:
19
20
  return channel_class()
20
21
 
21
22
  @classmethod
22
- def configure_python_logging(cls):
23
+ def configure_python_logging(cls, level: str | None = None):
23
24
  from ..handler import LoggingHandler
24
25
 
25
- LoggingHandler.install()
26
+ LoggingHandler.install(level)
@@ -17,7 +17,7 @@ class LogProvider(Provider):
17
17
 
18
18
  self.app.bind("LogChannelFactory", ChannelFactory)
19
19
  self.app.bind("LogDriverFactory", DriverFactory)
20
- self.app.bind("LoggingManager", LoggingManager(ChannelFactory, DriverFactory))
20
+ self.app.bind("LoggingManager", LoggingManager(ChannelFactory, DriverFactory, config.get("level")))
21
21
 
22
22
  def boot(self):
23
23
  self.publishes({Path(__file__).resolve().parent.parent.joinpath("config/logging.py"): "config/logging.py"})
@@ -1,5 +1,6 @@
1
1
  from typing import Optional, Dict, Any
2
2
  from pydantic.dataclasses import dataclass
3
+ from pydantic.fields import Field
3
4
  from fastapi_startkit.environment.environment import env
4
5
 
5
6
 
@@ -8,6 +9,7 @@ class SQLiteConfig:
8
9
  driver: str = "sqlite"
9
10
  url: Optional[str] = env("DB_URL", None, cast=False)
10
11
  database: str = env("DB_DATABASE", "database.sqlite")
12
+ echo: bool = Field(default_factory=lambda: env("DB_ECHO", False))
11
13
  options: Optional[Dict[str, Any]] = None
12
14
 
13
15
 
@@ -23,6 +25,7 @@ class MySQLConfig:
23
25
  unix_socket: str = env("DB_SOCKET", "", cast=False)
24
26
  charset: str = env("DB_CHARSET", "utf8mb4")
25
27
  collation: str = env("DB_COLLATION", "utf8mb4_unicode_ci")
28
+ echo: bool = Field(default_factory=lambda: env("DB_ECHO", False))
26
29
  options: Optional[Dict[str, Any]] = None
27
30
 
28
31
 
@@ -37,4 +40,5 @@ class PostgresConfig:
37
40
  password: str = env("DB_PASSWORD", "", cast=False)
38
41
  charset: str = env("DB_CHARSET", "utf8")
39
42
  sslmode: str = env("DB_SSLMODE", "prefer")
43
+ echo: bool = Field(default_factory=lambda: env("DB_ECHO", False))
40
44
  options: Optional[Dict[str, Any]] = None
@@ -64,7 +64,7 @@ class ConnectionFactory:
64
64
  @classmethod
65
65
  def create_engine(cls, cfg: dict) -> AsyncEngine:
66
66
  url = cls.build_url(cfg)
67
- kwargs: dict[str, Any] = {"echo": True}
67
+ kwargs: dict[str, Any] = {"echo": bool(cfg.get("echo", False))}
68
68
  from fastapi_startkit.application import app
69
69
 
70
70
  if cast("Application", app()).is_testing():
@@ -29,6 +29,11 @@ TModel = TypeVar("TModel", bound="Model")
29
29
  # returns it, which the parent renders as a parenthesised subgroup.
30
30
  type WhereGroup[M: "Model"] = Callable[["QueryBuilder[M]"], "QueryBuilder[M]"]
31
31
 
32
+ # select_sub()/add_select() subquery source: a builder, or a callable that
33
+ # receives a fresh builder and returns the subquery.
34
+ type Subquery = "QueryBuilder[Any] | Callable[[QueryBuilder[Any]], QueryBuilder[Any]]"
35
+ type SelectEntry = "str | dict[str, str | Subquery]"
36
+
32
37
 
33
38
  class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
34
39
  operators = [
@@ -129,6 +134,59 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
129
134
  self._columns += (SelectExpression(column),)
130
135
  return self
131
136
 
137
+ def select_sub(self, subquery: "Subquery", alias: str) -> "Self":
138
+ """Add ``(subquery) AS alias`` to the selection.
139
+
140
+ ``subquery`` is a builder, or a callable that receives a fresh table-less
141
+ builder and returns one.
142
+ """
143
+ if not isinstance(subquery, QueryBuilder) and callable(subquery):
144
+ subquery = subquery(QueryBuilder(self.connection, self.grammar, self.processor))
145
+ if not isinstance(subquery, QueryBuilder):
146
+ raise TypeError("select_sub() expects a QueryBuilder subquery or a callable returning one.")
147
+ self._columns.append(SubGroupExpression(subquery, alias))
148
+ return self
149
+
150
+ def add_select(self, *columns: "SelectEntry | list[SelectEntry]") -> "Self":
151
+ """Append columns to the current selection without replacing it.
152
+
153
+ Plain string columns are appended once. A ``{alias: subquery}`` entry
154
+ adds a correlated column via :meth:`select_sub`, first selecting
155
+ ``{table}.*`` when nothing is selected yet so the base columns survive.
156
+ A string value under a string key is still a plain column.
157
+ """
158
+ entries: list[SelectEntry] = []
159
+ for column in columns:
160
+ if isinstance(column, list):
161
+ entries.extend(column)
162
+ else:
163
+ entries.append(column)
164
+
165
+ for entry in entries:
166
+ pairs: Iterable[tuple[str | None, str | Subquery]] = (
167
+ entry.items() if isinstance(entry, dict) else [(None, entry)]
168
+ )
169
+ for alias, value in pairs:
170
+ if isinstance(value, str):
171
+ if not self._is_selected(value):
172
+ self._columns.append(SelectExpression(value))
173
+ continue
174
+ if alias is None:
175
+ raise TypeError(
176
+ "add_select() received a subquery without a string alias; "
177
+ "pass {alias: subquery} or use select_sub(subquery, alias)."
178
+ )
179
+ if not self._columns:
180
+ self.select(f"{self._table}.*")
181
+ self.select_sub(value, alias)
182
+ return self
183
+
184
+ def _is_selected(self, column: str) -> bool:
185
+ return any(
186
+ isinstance(existing, SelectExpression) and existing.alias is None and existing.column == column
187
+ for existing in self._columns
188
+ )
189
+
132
190
  def limit(self, limit: int) -> "Self":
133
191
  self._limit = limit
134
192
  return self
@@ -898,7 +898,7 @@ class BaseGrammar:
898
898
  self.add_binding(*column.builder._bindings)
899
899
  else:
900
900
  builder_sql = column.builder.to_sql()
901
- sql += f"({builder_sql}) AS {column.alias}, "
901
+ sql += f"({builder_sql}) " + self.subquery_alias_string().format(alias=column.alias) + ", "
902
902
  continue
903
903
 
904
904
  sql += self._table_column_string(column, alias=alias, separator=separator)
@@ -456,8 +456,7 @@ class BelongsToMany(BaseRelationship):
456
456
  if not builder._columns:
457
457
  builder = builder.select("*")
458
458
 
459
- return_query = builder.add_select(
460
- f"{query.get_table_name()}_count",
459
+ return_query = builder.select_sub(
461
460
  lambda q: (
462
461
  q.count("*")
463
462
  .where_column(
@@ -473,6 +472,7 @@ class BelongsToMany(BaseRelationship):
473
472
  ),
474
473
  )
475
474
  ),
475
+ f"{query.get_table_name()}_count",
476
476
  )
477
477
 
478
478
  return return_query