fastapi-startkit 0.61.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 (379) hide show
  1. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/PKG-INFO +4 -1
  2. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/pyproject.toml +7 -1
  3. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/config/ai.py +7 -6
  4. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/config/config.py +18 -16
  5. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/application.py +2 -2
  6. fastapi_startkit-0.63.0/src/fastapi_startkit/broadcasting/config.py +32 -0
  7. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/carbon/__init__.py +2 -0
  8. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/config/__init__.py +2 -0
  9. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/config/app.py +5 -4
  10. fastapi_startkit-0.63.0/src/fastapi_startkit/configuration/__init__.py +5 -0
  11. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/providers/__init__.py +2 -0
  12. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/application.py +2 -2
  13. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/container/__init__.py +2 -0
  14. fastapi_startkit-0.63.0/src/fastapi_startkit/environment/__init__.py +3 -0
  15. fastapi_startkit-0.63.0/src/fastapi_startkit/environment/environment.py +205 -0
  16. fastapi_startkit-0.63.0/src/fastapi_startkit/exceptions/__init__.py +69 -0
  17. fastapi_startkit-0.63.0/src/fastapi_startkit/facades/Redis.py +5 -0
  18. fastapi_startkit-0.63.0/src/fastapi_startkit/facades/Redis.pyi +27 -0
  19. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/__init__.py +22 -0
  20. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/commands/__init__.py +2 -0
  21. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +7 -4
  22. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/config/fastapi.py +7 -5
  23. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/exceptions.py +3 -4
  24. fastapi_startkit-0.63.0/src/fastapi_startkit/fastapi/referer.py +17 -0
  25. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/__init__.py +21 -0
  26. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/constant.py +13 -0
  27. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/context.py +21 -0
  28. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/encoding.py +24 -0
  29. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/errors.py +60 -0
  30. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/inertia.py +446 -0
  31. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/middleware.py +129 -0
  32. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/props/props.py +156 -0
  33. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/props/resolver.py +288 -0
  34. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/props/scroll.py +65 -0
  35. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/inertia/provider.py +6 -4
  36. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/redirect.py +28 -0
  37. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/session.py +74 -0
  38. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/ssr.py +88 -0
  39. fastapi_startkit-0.63.0/src/fastapi_startkit/inertia/testing.py +14 -0
  40. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/loader/__init__.py +2 -0
  41. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/__init__.py +11 -0
  42. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/config/__init__.py +10 -0
  43. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/config/channels.py +9 -9
  44. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/config/logging.py +6 -4
  45. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/__init__.py +8 -0
  46. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/managers/__init__.py +2 -0
  47. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/providers/__init__.py +2 -0
  48. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/__init__.py +4 -1
  49. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +2 -0
  50. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +6 -9
  51. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +15 -0
  52. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/config/config.py +84 -0
  53. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/config/database.py +21 -0
  54. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/connection.py +114 -0
  55. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/factory.py +59 -0
  56. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +10 -5
  57. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/manages_transactions.py +134 -0
  58. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/connections/transactions.py +96 -0
  59. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +2 -0
  60. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +5 -1
  61. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +2 -0
  62. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +2 -0
  63. fastapi_startkit-0.63.0/src/fastapi_startkit/masoniteorm/migrations/Migration.py +13 -0
  64. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +1 -1
  65. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +2 -0
  66. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +2 -0
  67. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +21 -6
  68. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +2 -0
  69. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +2 -0
  70. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +7 -0
  71. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +14 -0
  72. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +64 -64
  73. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +1 -1
  74. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +2 -0
  75. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +2 -0
  76. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +8 -5
  77. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +2 -0
  78. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/__init__.py +15 -0
  79. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/config.py +40 -0
  80. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/connection.py +63 -0
  81. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/connector.py +21 -0
  82. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/manager.py +66 -0
  83. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/prefix.py +152 -0
  84. fastapi_startkit-0.63.0/src/fastapi_startkit/redis/provider.py +39 -0
  85. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/config/__init__.py +6 -5
  86. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/config/storage.py +4 -5
  87. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/__init__.py +2 -0
  88. fastapi_startkit-0.63.0/src/fastapi_startkit/support/config.py +27 -0
  89. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/config/vite.py +3 -2
  90. fastapi_startkit-0.61.0/src/fastapi_startkit/broadcasting/config.py +0 -24
  91. fastapi_startkit-0.61.0/src/fastapi_startkit/configuration/__init__.py +0 -2
  92. fastapi_startkit-0.61.0/src/fastapi_startkit/environment/__init__.py +0 -1
  93. fastapi_startkit-0.61.0/src/fastapi_startkit/environment/environment.py +0 -160
  94. fastapi_startkit-0.61.0/src/fastapi_startkit/exceptions/__init__.py +0 -34
  95. fastapi_startkit-0.61.0/src/fastapi_startkit/inertia/__init__.py +0 -5
  96. fastapi_startkit-0.61.0/src/fastapi_startkit/inertia/constant.py +0 -7
  97. fastapi_startkit-0.61.0/src/fastapi_startkit/inertia/context.py +0 -8
  98. fastapi_startkit-0.61.0/src/fastapi_startkit/inertia/inertia.py +0 -242
  99. fastapi_startkit-0.61.0/src/fastapi_startkit/inertia/middleware.py +0 -102
  100. fastapi_startkit-0.61.0/src/fastapi_startkit/inertia/props/props.py +0 -6
  101. fastapi_startkit-0.61.0/src/fastapi_startkit/masoniteorm/config/config.py +0 -44
  102. fastapi_startkit-0.61.0/src/fastapi_startkit/masoniteorm/config/database.py +0 -24
  103. fastapi_startkit-0.61.0/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -221
  104. fastapi_startkit-0.61.0/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -84
  105. fastapi_startkit-0.61.0/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -11
  106. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/README.md +0 -0
  107. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/.DS_Store +0 -0
  108. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/__init__.py +0 -0
  109. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/__init__.py +0 -0
  110. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/agent.py +0 -0
  111. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/ai.py +0 -0
  112. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/audio.py +0 -0
  113. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
  114. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/decorators.py +0 -0
  115. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/document.py +0 -0
  116. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/image.py +0 -0
  117. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
  118. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/judge.py +0 -0
  119. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/lab.py +0 -0
  120. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
  121. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
  122. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
  123. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/recording.py +0 -0
  124. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/runner.py +0 -0
  125. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/state.py +0 -0
  126. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/testing.py +0 -0
  127. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/tinker.py +0 -0
  128. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/ai/types.py +0 -0
  129. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
  130. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
  131. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
  132. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
  133. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
  134. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
  135. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
  136. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
  137. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
  138. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
  139. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
  140. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
  141. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
  142. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
  143. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
  144. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
  145. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  146. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  147. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/config.py +0 -0
  148. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  149. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  150. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/__init__.py +0 -0
  151. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  152. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  153. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/command.py +0 -0
  154. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  155. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/container/container.py +0 -0
  156. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/__init__.py +0 -0
  157. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
  158. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/fake.py +0 -0
  159. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/helpers.py +0 -0
  160. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/listener.py +0 -0
  161. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/events/provider.py +0 -0
  162. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  163. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  164. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/AI.py +0 -0
  165. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
  166. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  167. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Config.py +0 -0
  168. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  169. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  170. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  171. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Event.py +0 -0
  172. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
  173. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  174. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  175. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  176. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  177. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  178. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  179. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  180. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  181. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  182. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  183. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  184. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  185. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  186. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  187. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  188. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Request.py +0 -0
  189. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  190. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Response.py +0 -0
  191. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  192. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Session.py +0 -0
  193. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  194. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Url.py +0 -0
  195. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  196. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/View.py +0 -0
  197. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  198. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  199. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  200. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  201. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  202. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/events.py +0 -0
  203. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
  204. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  205. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  206. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  207. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  208. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
  209. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  210. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
  211. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
  212. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
  213. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
  214. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  215. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  216. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  217. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  218. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  219. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  220. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  221. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  222. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  223. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  224. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  225. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  226. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  227. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  228. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  229. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
  230. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/factory.py +0 -0
  231. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/file.py +0 -0
  232. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/handler.py +0 -0
  233. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  234. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/logger.py +0 -0
  235. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  236. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  237. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  238. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  239. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  240. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  241. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  242. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  243. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  244. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  245. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  246. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  247. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  248. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  249. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  250. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  251. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  252. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  253. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  254. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  255. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  256. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  257. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  258. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  259. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  260. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  261. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  262. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  263. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  264. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  265. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  266. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  267. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  268. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
  269. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  270. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  271. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
  272. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  273. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  274. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  275. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  276. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  277. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  278. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  279. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  280. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  281. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  282. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  283. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
  284. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  285. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  286. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  287. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  288. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  289. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  290. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  291. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  292. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  293. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  294. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  295. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  296. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  297. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  298. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  299. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  300. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  301. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  302. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  303. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  304. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  305. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  306. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  307. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  308. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  309. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  310. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  311. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  312. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  313. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  314. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  315. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
  316. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  317. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  318. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  319. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  320. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
  321. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/argument.py +0 -0
  322. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
  323. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
  324. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  325. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
  326. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/request.py +0 -0
  327. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/resource.py +0 -0
  328. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/response.py +0 -0
  329. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/server.py +0 -0
  330. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/mcp/tool.py +0 -0
  331. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/__init__.py +0 -0
  332. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/exception.py +0 -0
  333. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/fake.py +0 -0
  334. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/process.py +0 -0
  335. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/process/result.py +0 -0
  336. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/py.typed +0 -0
  337. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/__init__.py +0 -0
  338. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
  339. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
  340. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
  341. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
  342. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
  343. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
  344. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/parser.py +0 -0
  345. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/provider.py +0 -0
  346. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/registry.py +0 -0
  347. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
  348. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
  349. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
  350. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  351. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  352. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  353. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  354. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  355. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/file.py +0 -0
  356. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  357. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/helper.py +0 -0
  358. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  359. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/storage/storage.py +0 -0
  360. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/__init__.py +0 -0
  361. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/collection.py +0 -0
  362. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/dataclass.py +0 -0
  363. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
  364. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
  365. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/string.py +0 -0
  366. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/structures.py +0 -0
  367. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/support/uri.py +0 -0
  368. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  369. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  370. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  371. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  372. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  373. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  374. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  375. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  376. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
  377. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  378. {fastapi_startkit-0.61.0 → fastapi_startkit-0.63.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  379. {fastapi_startkit-0.61.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.61.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
@@ -26,11 +26,13 @@ Requires-Dist: langgraph>=1.0.0 ; extra == 'ai'
26
26
  Requires-Dist: faker>=40.13.0 ; extra == 'database'
27
27
  Requires-Dist: sqlalchemy[asyncio]>=2.0.38 ; extra == 'database'
28
28
  Requires-Dist: fastapi[standard]>=0.124.4 ; extra == 'fastapi'
29
+ Requires-Dist: httpx>=0.28.1 ; extra == 'fastapi'
29
30
  Requires-Dist: itsdangerous>=2.2.0 ; extra == 'fastapi'
30
31
  Requires-Dist: jinja2>=3.1 ; extra == 'inertia'
31
32
  Requires-Dist: markupsafe>=2.0 ; extra == 'inertia'
32
33
  Requires-Dist: aiomysql>=0.2.0 ; extra == 'mysql'
33
34
  Requires-Dist: asyncpg>=0.29.0 ; extra == 'postgres'
35
+ Requires-Dist: redis>=5.0.1 ; extra == 'redis'
34
36
  Requires-Dist: aiosqlite>=0.22.1 ; extra == 'sqlite'
35
37
  Requires-Dist: jinja2>=3.1 ; extra == 'vite'
36
38
  Requires-Python: >=3.12, <4.0
@@ -45,6 +47,7 @@ Provides-Extra: fastapi
45
47
  Provides-Extra: inertia
46
48
  Provides-Extra: mysql
47
49
  Provides-Extra: postgres
50
+ Provides-Extra: redis
48
51
  Provides-Extra: sqlite
49
52
  Provides-Extra: vite
50
53
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.61.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 = [
@@ -56,6 +56,7 @@ Changelog = "https://github.com/fastapi-startkit/fastapi-startkit-framework/rele
56
56
  [project.optional-dependencies]
57
57
  fastapi = [
58
58
  "fastapi[standard]>=0.124.4",
59
+ "httpx>=0.28.1",
59
60
  "itsdangerous>=2.2.0",
60
61
  ]
61
62
  database = [
@@ -89,6 +90,9 @@ ai = [
89
90
  "langchain-core>=1.0.0",
90
91
  "langgraph>=1.0.0",
91
92
  ]
93
+ redis = [
94
+ "redis>=5.0.1",
95
+ ]
92
96
 
93
97
  [dependency-groups]
94
98
  dev = [
@@ -110,6 +114,8 @@ dev = [
110
114
  "basedpyright>=1.31.4",
111
115
  "pyright>=1.1.411",
112
116
  "pytest-benchmark>=5.2.3",
117
+ "redis>=5.0.1",
118
+ "fakeredis[lua]>=2.26.0",
113
119
  ]
114
120
 
115
121
 
@@ -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",
@@ -225,10 +225,10 @@ class Application(Container, Generic[TConfig]):
225
225
  def add_commands(self, commands: List):
226
226
  self.commands.extend(commands)
227
227
 
228
- def handle_command(self):
228
+ def handle_command(self) -> int:
229
229
  from fastapi_startkit.console import ConsoleApplication
230
230
 
231
- ConsoleApplication(self).handle()
231
+ return ConsoleApplication(self).handle()
232
232
 
233
233
  def run(self, command: str, args: "str | list[str] | None" = None) -> int:
234
234
  from cleo.io.inputs.string_input import StringInput
@@ -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 +1,3 @@
1
1
  from .app import AppConfig
2
+
3
+ __all__ = ["AppConfig"]
@@ -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"]
@@ -26,5 +26,5 @@ class ConsoleApplication(BaseApplication):
26
26
  self.app.exception_manager.report(error)
27
27
  super().render_error(error, io)
28
28
 
29
- def handle(self):
30
- self.run()
29
+ def handle(self) -> int:
30
+ return self.run()
@@ -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
+ ]
@@ -0,0 +1,5 @@
1
+ from .Facade import Facade
2
+
3
+
4
+ class Redis(metaclass=Facade):
5
+ key = "redis"
@@ -0,0 +1,27 @@
1
+ from collections.abc import Awaitable, Callable, Iterable
2
+ from typing import Any, overload
3
+
4
+ from redis.asyncio.client import Pipeline
5
+ from redis.asyncio.client import Redis as AsyncRedis
6
+
7
+ from fastapi_startkit.redis import Connection, RedisManager
8
+
9
+ class RedisFacade(AsyncRedis):
10
+ def connection(self, name: str | None = None) -> Connection: ... # pyright: ignore[reportIncompatibleVariableOverride]
11
+ def connections(self) -> dict[str, Connection]: ...
12
+ def extend(self, client: str, factory: Callable[[dict[str, Any]], Any]) -> RedisManager: ...
13
+ async def purge(self, name: str | None = None) -> None: ...
14
+ async def disconnect(self) -> None: ...
15
+ async def command(self, method: str, parameters: Iterable[Any] | None = None) -> Any: ... # pyright: ignore[reportIncompatibleMethodOverride]
16
+ @overload
17
+ def pipeline(self, callback: None = None) -> Pipeline: ...
18
+ @overload
19
+ def pipeline(self, callback: Callable[[Pipeline], Any]) -> Awaitable[list[Any]]: ... # pyright: ignore[reportIncompatibleMethodOverride]
20
+ @overload
21
+ def transaction(self, callback: None = None) -> Pipeline: ...
22
+ @overload
23
+ def transaction(self, callback: Callable[[Pipeline], Any]) -> Awaitable[list[Any]]: ... # pyright: ignore[reportIncompatibleMethodOverride]
24
+ async def subscribe(self, channels: str | Iterable[str], callback: Callable[[Any, Any], Any]) -> None: ...
25
+ async def psubscribe(self, patterns: str | Iterable[str], callback: Callable[[Any, Any], Any]) -> None: ...
26
+
27
+ Redis: RedisFacade
@@ -15,3 +15,25 @@ from .Dump import Dump
15
15
  from .Queue import Queue
16
16
  from .Cache import Cache
17
17
  from .RateLimiter import RateLimiter
18
+ from .Redis import Redis
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)