fastapi-startkit 0.62.0__tar.gz → 0.63.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 (375) hide show
  1. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/PKG-INFO +1 -1
  2. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/pyproject.toml +1 -1
  3. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/config/ai.py +7 -6
  4. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/config/config.py +18 -16
  5. fastapi_startkit-0.63.0/src/fastapi_startkit/broadcasting/config.py +32 -0
  6. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/carbon/__init__.py +2 -0
  7. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/config/app.py +5 -4
  8. fastapi_startkit-0.63.0/src/fastapi_startkit/configuration/__init__.py +5 -0
  9. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/providers/__init__.py +2 -0
  10. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/container/__init__.py +2 -0
  11. fastapi_startkit-0.63.0/src/fastapi_startkit/environment/__init__.py +3 -0
  12. fastapi_startkit-0.63.0/src/fastapi_startkit/environment/environment.py +205 -0
  13. fastapi_startkit-0.63.0/src/fastapi_startkit/exceptions/__init__.py +69 -0
  14. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/__init__.py +21 -0
  15. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/commands/__init__.py +2 -0
  16. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +7 -4
  17. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/config/fastapi.py +7 -5
  18. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/encoding.py +24 -0
  19. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/inertia.py +66 -2
  20. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/provider.py +4 -2
  21. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/loader/__init__.py +2 -0
  22. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/__init__.py +11 -0
  23. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/config/__init__.py +10 -0
  24. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/config/channels.py +9 -9
  25. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/config/logging.py +6 -4
  26. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/__init__.py +8 -0
  27. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/managers/__init__.py +2 -0
  28. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/providers/__init__.py +2 -0
  29. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/__init__.py +4 -1
  30. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +2 -0
  31. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +6 -9
  32. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +15 -0
  33. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/config/config.py +84 -0
  34. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/config/database.py +21 -0
  35. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/connection.py +114 -0
  36. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/factory.py +59 -0
  37. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +10 -5
  38. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/manages_transactions.py +134 -0
  39. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/transactions.py +96 -0
  40. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +2 -0
  41. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +2 -0
  42. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +2 -0
  43. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +1 -1
  44. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +2 -0
  45. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +2 -0
  46. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +21 -6
  47. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +2 -0
  48. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +2 -0
  49. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +7 -0
  50. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +14 -0
  51. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +2 -0
  52. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +2 -0
  53. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +2 -2
  54. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +2 -0
  55. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/__init__.py +15 -0
  56. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/config.py +40 -0
  57. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/config/__init__.py +6 -5
  58. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/config/storage.py +4 -5
  59. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/__init__.py +2 -0
  60. fastapi_startkit-0.63.0/src/fastapi_startkit/support/config.py +27 -0
  61. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/config/vite.py +3 -2
  62. fastapi_startkit-0.62.0/src/fastapi_startkit/broadcasting/config.py +0 -24
  63. fastapi_startkit-0.62.0/src/fastapi_startkit/configuration/__init__.py +0 -2
  64. fastapi_startkit-0.62.0/src/fastapi_startkit/environment/__init__.py +0 -1
  65. fastapi_startkit-0.62.0/src/fastapi_startkit/environment/environment.py +0 -160
  66. fastapi_startkit-0.62.0/src/fastapi_startkit/exceptions/__init__.py +0 -34
  67. fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/encoding.py +0 -8
  68. fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/config/config.py +0 -44
  69. fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/config/database.py +0 -24
  70. fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -337
  71. fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -84
  72. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/__init__.py +0 -7
  73. fastapi_startkit-0.62.0/src/fastapi_startkit/redis/config.py +0 -42
  74. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/README.md +0 -0
  75. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/.DS_Store +0 -0
  76. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/__init__.py +0 -0
  77. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/__init__.py +0 -0
  78. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/agent.py +0 -0
  79. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/ai.py +0 -0
  80. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/audio.py +0 -0
  81. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
  82. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/decorators.py +0 -0
  83. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/document.py +0 -0
  84. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/image.py +0 -0
  85. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
  86. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/judge.py +0 -0
  87. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/lab.py +0 -0
  88. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
  89. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
  90. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
  91. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/recording.py +0 -0
  92. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/runner.py +0 -0
  93. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/state.py +0 -0
  94. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/testing.py +0 -0
  95. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/tinker.py +0 -0
  96. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/types.py +0 -0
  97. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/application.py +0 -0
  98. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
  99. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
  100. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
  101. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
  102. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
  103. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
  104. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
  105. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
  106. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
  107. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
  108. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
  109. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
  110. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
  111. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
  112. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
  113. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
  114. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  115. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/config/__init__.py +0 -0
  116. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  117. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/config.py +0 -0
  118. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  119. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  120. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/__init__.py +0 -0
  121. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/application.py +0 -0
  122. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  123. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  124. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/command.py +0 -0
  125. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  126. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/container/container.py +0 -0
  127. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/__init__.py +0 -0
  128. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
  129. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/fake.py +0 -0
  130. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/helpers.py +0 -0
  131. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/listener.py +0 -0
  132. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/provider.py +0 -0
  133. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  134. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  135. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/AI.py +0 -0
  136. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
  137. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  138. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Config.py +0 -0
  139. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  140. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  141. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  142. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Event.py +0 -0
  143. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
  144. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  145. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  146. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  147. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  148. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  149. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  150. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  151. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  152. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  153. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  154. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  155. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  156. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  157. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  158. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  159. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Redis.py +0 -0
  160. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Redis.pyi +0 -0
  161. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Request.py +0 -0
  162. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  163. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Response.py +0 -0
  164. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  165. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Session.py +0 -0
  166. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  167. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Url.py +0 -0
  168. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  169. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/View.py +0 -0
  170. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  171. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  172. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  173. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  174. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  175. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/events.py +0 -0
  176. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
  177. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
  178. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  179. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/referer.py +0 -0
  180. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  181. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  182. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  183. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
  184. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  185. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
  186. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
  187. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  188. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  189. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/context.py +0 -0
  190. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/errors.py +0 -0
  191. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
  192. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  193. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/props/resolver.py +0 -0
  194. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/props/scroll.py +0 -0
  195. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/redirect.py +0 -0
  196. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/session.py +0 -0
  197. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/ssr.py +0 -0
  198. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/testing.py +0 -0
  199. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
  200. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
  201. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  202. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  203. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  204. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  205. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  206. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  207. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  208. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  209. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  210. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  211. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  212. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  213. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  214. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  215. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  216. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
  217. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/factory.py +0 -0
  218. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/file.py +0 -0
  219. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/handler.py +0 -0
  220. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  221. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/logger.py +0 -0
  222. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  223. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  224. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  225. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  226. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  227. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  228. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  229. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  230. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  231. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  232. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  233. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  234. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  235. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  236. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  237. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  238. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  239. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  240. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  241. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  242. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  243. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  244. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  245. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  246. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  247. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
  248. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  249. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  250. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  251. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  252. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  253. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  254. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  255. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  256. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  257. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
  258. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  259. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  260. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
  261. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  262. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  263. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  264. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  265. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  266. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  267. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  268. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  269. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  270. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  271. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  272. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
  273. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  274. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  275. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  276. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  277. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  278. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  279. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  280. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  281. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  282. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  283. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  284. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  285. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  286. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  287. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  288. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  289. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  290. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  291. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  292. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  293. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  294. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  295. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  296. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  297. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  298. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  299. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  300. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  301. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  302. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  303. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  304. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  305. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  306. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
  307. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  308. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  309. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  310. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  311. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
  312. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/argument.py +0 -0
  313. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
  314. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
  315. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  316. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
  317. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/request.py +0 -0
  318. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/resource.py +0 -0
  319. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/response.py +0 -0
  320. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/server.py +0 -0
  321. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/tool.py +0 -0
  322. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/__init__.py +0 -0
  323. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/exception.py +0 -0
  324. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/fake.py +0 -0
  325. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/process.py +0 -0
  326. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/result.py +0 -0
  327. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/py.typed +0 -0
  328. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/redis/connection.py +0 -0
  329. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/redis/connector.py +0 -0
  330. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/redis/manager.py +0 -0
  331. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/redis/prefix.py +0 -0
  332. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/redis/provider.py +0 -0
  333. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/__init__.py +0 -0
  334. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
  335. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
  336. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
  337. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
  338. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
  339. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
  340. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/parser.py +0 -0
  341. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/provider.py +0 -0
  342. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/registry.py +0 -0
  343. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
  344. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
  345. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
  346. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  347. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  348. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  349. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  350. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  351. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/file.py +0 -0
  352. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  353. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/helper.py +0 -0
  354. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  355. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/storage.py +0 -0
  356. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/__init__.py +0 -0
  357. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/collection.py +0 -0
  358. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/dataclass.py +0 -0
  359. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
  360. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
  361. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/string.py +0 -0
  362. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/structures.py +0 -0
  363. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/uri.py +0 -0
  364. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  365. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  366. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  367. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  368. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  369. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  370. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  371. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  372. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
  373. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  374. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  375. {fastapi_startkit-0.62.0 → fastapi_startkit-0.63.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.62.0
3
+ Version: 0.63.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.62.0"
3
+ version = "0.63.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 = [
@@ -1,3 +1,4 @@
1
+ from fastapi_startkit.configuration import Config
1
2
  from dataclasses import dataclass, field
2
3
 
3
4
  from fastapi_startkit.environment import env
@@ -6,15 +7,15 @@ from fastapi_startkit.ai import AnthropicConfig, ElevenLabsConfig, GoogleConfig,
6
7
 
7
8
 
8
9
  @dataclass
9
- class AIConfig:
10
+ class AIConfig(Config):
10
11
  """Top-level AI configuration — selects the default provider per modality and holds per-provider configs."""
11
12
 
12
- default: str = field(default_factory=lambda: env("AI_PROVIDER", "google"))
13
- default_image: str = field(default_factory=lambda: env("AI_DEFAULT_IMAGE_PROVIDER", "openai"))
14
- default_audio: str = field(default_factory=lambda: env("AI_DEFAULT_AUDIO_PROVIDER", "openai"))
15
- default_transcribe: str = field(default_factory=lambda: env("AI_DEFAULT_TRANSCRIBE_PROVIDER", "openai"))
13
+ default: str = env("AI_PROVIDER", "google")
14
+ default_image: str = env("AI_DEFAULT_IMAGE_PROVIDER", "openai")
15
+ default_audio: str = env("AI_DEFAULT_AUDIO_PROVIDER", "openai")
16
+ default_transcribe: str = env("AI_DEFAULT_TRANSCRIBE_PROVIDER", "openai")
16
17
 
17
- providers: dict = field(
18
+ providers: dict[str, Config] = field(
18
19
  default_factory=lambda: {
19
20
  "google": GoogleConfig(),
20
21
  "openai": OpenAIConfig(),
@@ -1,19 +1,23 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import os
4
+
5
+ from fastapi_startkit.configuration import Config
6
+
3
7
  from dataclasses import dataclass, field
4
8
 
5
9
  from fastapi_startkit.environment import env
6
10
 
7
11
 
8
12
  @dataclass
9
- class AnthropicConfig:
13
+ class AnthropicConfig(Config):
10
14
  """Configuration for the Anthropic provider."""
11
15
 
12
16
  driver: str = "anthropic"
13
- key: str = field(default_factory=lambda: env("ANTHROPIC_API_KEY", "", cast=False))
14
- url: str = field(default_factory=lambda: env("ANTHROPIC_BASE_URL", "https://api.anthropic.com"))
17
+ key: str = env("ANTHROPIC_API_KEY", "", cast=False)
18
+ url: str = env("ANTHROPIC_BASE_URL", "https://api.anthropic.com")
15
19
 
16
- models: dict = field(
20
+ models: dict[str, str] = field(
17
21
  default_factory=lambda: {
18
22
  "default": "claude-sonnet-4-6",
19
23
  }
@@ -21,14 +25,14 @@ class AnthropicConfig:
21
25
 
22
26
 
23
27
  @dataclass
24
- class OpenAIConfig:
28
+ class OpenAIConfig(Config):
25
29
  """Configuration for the OpenAI provider."""
26
30
 
27
31
  driver: str = "openai"
28
- key: str = field(default_factory=lambda: env("OPENAI_API_KEY", "", cast=False))
29
- url: str = field(default_factory=lambda: env("OPENAI_BASE_URL", "https://api.openai.com/v1"))
32
+ key: str = env("OPENAI_API_KEY", "", cast=False)
33
+ url: str = env("OPENAI_BASE_URL", "https://api.openai.com/v1")
30
34
 
31
- models: dict = field(
35
+ models: dict[str, str] = field(
32
36
  default_factory=lambda: {
33
37
  "default": "gpt-4o",
34
38
  "default_image": "dall-e-3",
@@ -37,15 +41,13 @@ class OpenAIConfig:
37
41
 
38
42
 
39
43
  @dataclass
40
- class GoogleConfig:
44
+ class GoogleConfig(Config):
41
45
  """Configuration for the Google / Gemini provider."""
42
46
 
43
47
  driver: str = "google"
44
- key: str = field(
45
- default_factory=lambda: env("GEMINI_API_KEY", "", cast=False) or env("GOOGLE_API_KEY", "", cast=False)
46
- )
48
+ key: str = field(default_factory=lambda: os.getenv("GEMINI_API_KEY") or os.getenv("GOOGLE_API_KEY") or "")
47
49
 
48
- models: dict = field(
50
+ models: dict[str, str] = field(
49
51
  default_factory=lambda: {
50
52
  "default": "gemini-2.5-flash-lite",
51
53
  "default_image": "imagen-3.0-generate-002",
@@ -54,13 +56,13 @@ class GoogleConfig:
54
56
 
55
57
 
56
58
  @dataclass
57
- class ElevenLabsConfig:
59
+ class ElevenLabsConfig(Config):
58
60
  """Configuration for the ElevenLabs provider."""
59
61
 
60
62
  driver: str = "elevenlabs"
61
- key: str = field(default_factory=lambda: env("ELEVENLABS_API_KEY", "", cast=False))
63
+ key: str = env("ELEVENLABS_API_KEY", "", cast=False)
62
64
 
63
- models: dict = field(
65
+ models: dict[str, str] = field(
64
66
  default_factory=lambda: {
65
67
  "default_audio": "eleven_multilingual_v2",
66
68
  "default_transcribe": "scribe_v1",
@@ -0,0 +1,32 @@
1
+ from dataclasses import dataclass, field
2
+
3
+ from fastapi_startkit.configuration import Config
4
+ from fastapi_startkit.environment import env
5
+
6
+
7
+ @dataclass
8
+ class ReverbConnectionConfig(Config):
9
+ driver: str = "reverb"
10
+ key: str = env("REVERB_APP_KEY", "local")
11
+ secret: str = env("REVERB_APP_SECRET", "secret")
12
+ app_id: str = env("REVERB_APP_ID", "1")
13
+ host: str = env("REVERB_HOST", "0.0.0.0")
14
+ port: int = env("REVERB_PORT", 8080)
15
+ scheme: str = env("REVERB_SCHEME", "http")
16
+
17
+
18
+ @dataclass
19
+ class LogConnectionConfig(Config):
20
+ driver: str = "log"
21
+
22
+
23
+ @dataclass
24
+ class BroadcastingConfig(Config):
25
+ default: str = env("BROADCAST_DRIVER", "log")
26
+
27
+ connections: dict[str, ReverbConnectionConfig | LogConnectionConfig] = field(
28
+ default_factory=lambda: {
29
+ "reverb": ReverbConnectionConfig(),
30
+ "log": LogConnectionConfig(),
31
+ }
32
+ )
@@ -1 +1,3 @@
1
1
  from .carbon import Carbon
2
+
3
+ __all__ = ["Carbon"]
@@ -1,11 +1,12 @@
1
+ from fastapi_startkit.configuration import Config
1
2
  import os
2
- from dataclasses import field, dataclass
3
- from fastapi_startkit.environment.environment import env
3
+ from dataclasses import dataclass, field
4
+ from fastapi_startkit.environment import env as environment_value
4
5
 
5
6
 
6
7
  @dataclass
7
- class AppConfig:
8
+ class AppConfig(Config):
8
9
  name: str = field(default_factory=lambda: os.getenv("APP_NAME", "FastAPI starter kit"))
9
10
  env: str = field(default_factory=lambda: os.getenv("APP_ENV", "development"))
10
- debug: bool = field(default_factory=lambda: env("APP_DEBUG", True))
11
+ debug: bool = environment_value("APP_DEBUG", True)
11
12
  timezone: str = field(default_factory=lambda: os.getenv("APP_TIMEZONE", "UTC"))
@@ -0,0 +1,5 @@
1
+ from .helpers import config
2
+ from .Configuration import Configuration
3
+ from fastapi_startkit.support.config import Config
4
+
5
+ __all__ = ["config", "Configuration", "Config"]
@@ -1 +1,3 @@
1
1
  from .ConfigurationProvider import ConfigurationProvider
2
+
3
+ __all__ = ["ConfigurationProvider"]
@@ -1 +1,3 @@
1
1
  from .container import Container
2
+
3
+ __all__ = ["Container"]
@@ -0,0 +1,3 @@
1
+ from .environment import env, into, value
2
+
3
+ __all__ = ["env", "into", "value"]
@@ -0,0 +1,205 @@
1
+ """Module for the LoadEnvironment class."""
2
+
3
+ import os
4
+ import sys
5
+ from collections.abc import Callable
6
+ from dataclasses import Field, MISSING, field
7
+ from pathlib import Path
8
+ import typing
9
+ from typing import Literal, TypeVar, overload
10
+
11
+ from dotenv import load_dotenv
12
+
13
+
14
+ T = TypeVar("T")
15
+ U = TypeVar("U")
16
+ EnvValue = str | int | bool
17
+ _UNSET = object()
18
+ _BOOLEANS: dict[str, bool] = {"true": True, "True": True, "false": False, "False": False}
19
+
20
+
21
+ class Environment:
22
+ @staticmethod
23
+ def resolve_environment(base_path: Path | None = None, env: str | None = None):
24
+ Environment.resolve_environment_from_argument()
25
+
26
+ if "PYTEST_CURRENT_TEST" in os.environ:
27
+ return "testing"
28
+
29
+ # Explicit env parameter takes priority over os.environ APP_ENV
30
+ if env:
31
+ return env
32
+
33
+ if os.environ.get("APP_ENV"):
34
+ return os.environ["APP_ENV"]
35
+
36
+ path = Environment._require_base_path(base_path) / ".env"
37
+ if not path.exists():
38
+ raise ValueError("Unable to determine environment.")
39
+
40
+ _ = load_dotenv(path, override=True)
41
+
42
+ env = os.environ.get("APP_ENV")
43
+ if not env:
44
+ raise ValueError("APP_ENV not set after loading .env")
45
+
46
+ return env
47
+
48
+ @staticmethod
49
+ def _require_base_path(base_path: Path | None) -> Path:
50
+ # Keeps the TypeError the old unguarded `None / ".env"` raised, with a clearer message.
51
+ if base_path is None:
52
+ raise TypeError("base_path is required to locate .env files")
53
+ return base_path
54
+
55
+ @staticmethod
56
+ def load_base(base_path: Path | None = None):
57
+ """Load the base .env file, resetting vars to their default values."""
58
+ path = Environment._require_base_path(base_path) / ".env"
59
+ if path.exists():
60
+ _ = load_dotenv(path, override=True)
61
+
62
+ @staticmethod
63
+ def load(env: str, override: bool = True, base_path: Path | None = None):
64
+ path = Environment._require_base_path(base_path) / f".env.{env}"
65
+ if not path.exists():
66
+ return
67
+ _ = load_dotenv(path, override=override)
68
+
69
+ @staticmethod
70
+ def resolve_environment_from_argument():
71
+ """Parse --env=<value> or --env <value> from sys.argv, set APP_ENV,
72
+ and remove the tokens so downstream CLI parsers (e.g. cleo) never see them."""
73
+ args = sys.argv[1:]
74
+ for i, arg in enumerate(args):
75
+ if arg.startswith("--env="):
76
+ os.environ["APP_ENV"] = arg.split("=", 1)[1]
77
+ del sys.argv[i + 1]
78
+ break
79
+ if arg == "--env" and i + 1 < len(args):
80
+ os.environ["APP_ENV"] = args[i + 1]
81
+ del sys.argv[i + 1 : i + 3]
82
+ break
83
+
84
+
85
+ @overload
86
+ def env(val: str, *, cast: Literal[True] = True) -> EnvValue: ...
87
+
88
+
89
+ @overload
90
+ def env(val: str, default: None, cast: Literal[True] = True) -> EnvValue | None: ...
91
+
92
+
93
+ @overload
94
+ def env(val: str, default: T, cast: Literal[True] = True) -> T: ...
95
+
96
+
97
+ @overload
98
+ def env(val: str, *, cast: Literal[False]) -> str: ...
99
+
100
+
101
+ @overload
102
+ def env(val: str, default: T, cast: Literal[False]) -> str | T: ...
103
+
104
+
105
+ @overload
106
+ def env(val: str, *, cast: bool) -> EnvValue: ...
107
+
108
+
109
+ @overload
110
+ def env(val: str, default: None, cast: bool) -> EnvValue | None: ...
111
+
112
+
113
+ @overload
114
+ def env(val: str, default: T, cast: bool) -> str | T: ...
115
+
116
+
117
+ def env(val: str, default: object = _UNSET, cast: bool = True) -> object:
118
+ def read() -> object:
119
+ env_var = os.getenv(val, "" if default is _UNSET else default)
120
+
121
+ try:
122
+ return into(env_var, default, cast)
123
+ except ValueError as error:
124
+ raise ValueError(f"Cannot cast environment variable {val!r} to {type(default).__name__}") from error
125
+
126
+ return field(default_factory=read)
127
+
128
+
129
+ def value(item: T) -> T:
130
+ if isinstance(item, Field):
131
+ declared = typing.cast(Field[T], item)
132
+ if declared.default_factory is not MISSING:
133
+ return declared.default_factory()
134
+ return item
135
+
136
+
137
+ @overload
138
+ def into(item: bool) -> bool: ...
139
+
140
+
141
+ @overload
142
+ def into(item: int) -> int: ...
143
+
144
+
145
+ @overload
146
+ def into(item: None) -> None: ...
147
+
148
+
149
+ @overload
150
+ def into(item: str) -> EnvValue: ...
151
+
152
+
153
+ @overload
154
+ def into(item: object, default: None) -> EnvValue | None: ...
155
+
156
+
157
+ @overload
158
+ def into(item: object, default: T) -> T: ...
159
+
160
+
161
+ @overload
162
+ def into(item: U, *, cast: Literal[False]) -> U: ...
163
+
164
+
165
+ @overload
166
+ def into(item: U, default: T, cast: Literal[False]) -> U | T: ...
167
+
168
+
169
+ @overload
170
+ def into(item: U, *, cast: bool) -> U | EnvValue: ...
171
+
172
+
173
+ @overload
174
+ def into(item: U, default: None, cast: bool) -> U | EnvValue | None: ...
175
+
176
+
177
+ @overload
178
+ def into(item: U, default: T, cast: bool) -> U | T: ...
179
+
180
+
181
+ def into(item: object, default: object = _UNSET, cast: bool = True) -> object:
182
+ if not cast:
183
+ return default if item is None and default is not _UNSET else item
184
+
185
+ if item is None or item == "":
186
+ return item if default is _UNSET else default
187
+
188
+ if isinstance(item, bool):
189
+ return item
190
+
191
+ if default is _UNSET or default is None:
192
+ if isinstance(item, int) or (isinstance(item, str) and item.isnumeric()):
193
+ return int(item)
194
+ return _BOOLEANS.get(item, item) if isinstance(item, str) else item
195
+
196
+ if isinstance(default, bool):
197
+ if isinstance(item, str) and item in _BOOLEANS:
198
+ return _BOOLEANS[item]
199
+ raise ValueError(f"Cannot cast {item!r} to bool")
200
+
201
+ convert = typing.cast(Callable[[object], object], type(default))
202
+ try:
203
+ return convert(item)
204
+ except (TypeError, ValueError) as error:
205
+ raise ValueError(f"Cannot cast {item!r} to {type(default).__name__}") from error
@@ -0,0 +1,69 @@
1
+ from .handler import ExceptionHandler
2
+ from .exceptions import (
3
+ AuthorizationException,
4
+ InvalidRouteCompileException,
5
+ RouteMiddlewareNotFound,
6
+ ContainerError,
7
+ MissingContainerBindingNotFound,
8
+ StrictContainerException,
9
+ ResponseError,
10
+ InvalidHTTPStatusCode,
11
+ RequiredContainerBindingNotFound,
12
+ ViewException,
13
+ RouteNotFoundException,
14
+ DumpException,
15
+ InvalidSecretKey,
16
+ InvalidCSRFToken,
17
+ NotificationException,
18
+ InvalidToken,
19
+ ProjectLimitReached,
20
+ ProjectProviderTimeout,
21
+ ProjectProviderHttpError,
22
+ ProjectTargetNotEmpty,
23
+ MixFileNotFound,
24
+ MixManifestNotFound,
25
+ InvalidConfigurationLocation,
26
+ InvalidConfigurationSetup,
27
+ InvalidPackageName,
28
+ LoaderNotFound,
29
+ QueueException,
30
+ ValidationException,
31
+ AmbiguousError,
32
+ MethodNotAllowedException,
33
+ ThrottleRequestsException,
34
+ )
35
+
36
+ __all__ = [
37
+ "ExceptionHandler",
38
+ "AuthorizationException",
39
+ "InvalidRouteCompileException",
40
+ "RouteMiddlewareNotFound",
41
+ "ContainerError",
42
+ "MissingContainerBindingNotFound",
43
+ "StrictContainerException",
44
+ "ResponseError",
45
+ "InvalidHTTPStatusCode",
46
+ "RequiredContainerBindingNotFound",
47
+ "ViewException",
48
+ "RouteNotFoundException",
49
+ "DumpException",
50
+ "InvalidSecretKey",
51
+ "InvalidCSRFToken",
52
+ "NotificationException",
53
+ "InvalidToken",
54
+ "ProjectLimitReached",
55
+ "ProjectProviderTimeout",
56
+ "ProjectProviderHttpError",
57
+ "ProjectTargetNotEmpty",
58
+ "MixFileNotFound",
59
+ "MixManifestNotFound",
60
+ "InvalidConfigurationLocation",
61
+ "InvalidConfigurationSetup",
62
+ "InvalidPackageName",
63
+ "LoaderNotFound",
64
+ "QueueException",
65
+ "ValidationException",
66
+ "AmbiguousError",
67
+ "MethodNotAllowedException",
68
+ "ThrottleRequestsException",
69
+ ]
@@ -16,3 +16,24 @@ from .Queue import Queue
16
16
  from .Cache import Cache
17
17
  from .RateLimiter import RateLimiter
18
18
  from .Redis import Redis
19
+
20
+ __all__ = [
21
+ "Facade",
22
+ "Request",
23
+ "Response",
24
+ "Mail",
25
+ "Hash",
26
+ "Url",
27
+ "Session",
28
+ "View",
29
+ "Gate",
30
+ "Config",
31
+ "Event",
32
+ "Loader",
33
+ "Notification",
34
+ "Dump",
35
+ "Queue",
36
+ "Cache",
37
+ "RateLimiter",
38
+ "Redis",
39
+ ]
@@ -1 +1,3 @@
1
1
  from .serve_command import ServeCommand
2
+
3
+ __all__ = ["ServeCommand"]
@@ -4,12 +4,12 @@ from cleo.helpers import option
4
4
 
5
5
  from fastapi_startkit import Config
6
6
  from fastapi_startkit.console.command import Command
7
- from fastapi_startkit.environment import value as cast_value
8
7
  from fastapi_startkit.fastapi.config import FastAPIConfig
9
8
  from fastapi_startkit.support import Uri, Uriable
10
9
 
11
10
  if TYPE_CHECKING:
12
11
  from fastapi_startkit.application import Application
12
+ from fastapi_startkit.config import AppConfig
13
13
 
14
14
  # Values accepted by uvicorn's `ws` setting.
15
15
  WS_BACKENDS = ("auto", "none", "websockets", "websockets-sansio", "wsproto")
@@ -69,7 +69,10 @@ class ServeCommand(Command):
69
69
 
70
70
  def resolve_option(self, key: str) -> Any:
71
71
  """CLI flag > fastapi config > FastAPIConfig default."""
72
- return cast_value(self.option(key) or self.config_value(key))
72
+ selected = self.option(key) or self.config_value(key)
73
+ if key == "reload" and isinstance(selected, str):
74
+ return {"true": True, "false": False}.get(selected.lower(), selected)
75
+ return selected
73
76
 
74
77
  def resolve_url(self) -> Uriable:
75
78
  host = self.option("host") or self.config_value("app_url")
@@ -100,7 +103,7 @@ class ServeCommand(Command):
100
103
  reload = self.resolve_option("reload")
101
104
  app = self.resolve_option("app")
102
105
 
103
- kwargs = {
106
+ kwargs: dict[str, Any] = {
104
107
  "host": url.host(),
105
108
  "port": url.port(),
106
109
  "reload": reload,
@@ -128,7 +131,7 @@ class ServeCommand(Command):
128
131
 
129
132
  else:
130
133
  self.line(f"<info>Starting Uvicorn server on {url.host()}:{url.port()}...</info>")
131
- kwargs.update({"app": cast("Application", Container.instance()).fastapi, "reload": False})
134
+ kwargs.update({"app": cast("Application[AppConfig]", Container.instance()).fastapi, "reload": False})
132
135
 
133
136
  try:
134
137
  uvicorn.run(**kwargs)
@@ -1,17 +1,19 @@
1
+ from dataclasses import field
2
+ from fastapi_startkit.configuration import Config
1
3
  import dataclasses
2
4
 
3
5
  from fastapi_startkit.environment import env
4
6
 
5
7
 
6
8
  @dataclasses.dataclass
7
- class FastAPIConfig:
8
- app_url: str = dataclasses.field(default_factory=lambda: env("APP_URL", "http://127.0.0.1:8000"))
9
+ class FastAPIConfig(Config):
10
+ app_url: str = env("APP_URL", "http://127.0.0.1:8000")
9
11
  app: str = "bootstrap.application:app"
10
- reload: bool = dataclasses.field(default_factory=lambda: env("APP_RELOAD", True))
12
+ reload: bool = env("APP_RELOAD", True)
11
13
  # 'auto' keeps the optional `websockets` package from being required at startup.
12
- ws: str = dataclasses.field(default_factory=lambda: env("APP_WS", "auto"))
14
+ ws: str = env("APP_WS", "auto")
13
15
  reload_dirs: list | None = None
14
- reload_excludes: list = dataclasses.field(
16
+ reload_excludes: list = field(
15
17
  default_factory=lambda: [
16
18
  "*.log",
17
19
  "tests/*",
@@ -0,0 +1,24 @@
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)
9
+
10
+
11
+ MAX_SAFE_INTEGER = 2**53 - 1
12
+ BIG_INTEGER_KEY = "$bigint"
13
+
14
+
15
+ def encode_big_integers(value: Any) -> Any:
16
+ if isinstance(value, bool):
17
+ return value
18
+ if isinstance(value, int):
19
+ return {BIG_INTEGER_KEY: str(value)} if abs(value) > MAX_SAFE_INTEGER else value
20
+ if isinstance(value, dict):
21
+ return {key: encode_big_integers(item) for key, item in value.items()}
22
+ if isinstance(value, (list, tuple)):
23
+ return [encode_big_integers(item) for item in value]
24
+ return value