fastapi-startkit 0.55.0__tar.gz → 0.57.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 (345) hide show
  1. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/PKG-INFO +1 -1
  2. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/pyproject.toml +8 -2
  3. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/config/app.py +1 -1
  4. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/container/container.py +19 -6
  5. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/environment/environment.py +62 -17
  6. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +3 -2
  7. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +8 -4
  8. fastapi_startkit-0.57.0/src/fastapi_startkit/masoniteorm/models/__init__.py +6 -0
  9. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/builder.py +56 -7
  10. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/caster.py +25 -5
  11. fastapi_startkit-0.57.0/src/fastapi_startkit/masoniteorm/models/fields.py +160 -0
  12. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/model.py +41 -7
  13. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +21 -4
  14. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +1 -1
  15. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +1 -1
  16. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +1 -1
  17. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +1 -1
  18. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/config/storage.py +6 -6
  19. fastapi_startkit-0.55.0/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -3
  20. fastapi_startkit-0.55.0/src/fastapi_startkit/masoniteorm/models/fields.py +0 -108
  21. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/README.md +0 -0
  22. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/.DS_Store +0 -0
  23. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/__init__.py +0 -0
  24. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/__init__.py +0 -0
  25. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/agent.py +0 -0
  26. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/ai.py +0 -0
  27. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/audio.py +0 -0
  28. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
  29. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/config/ai.py +0 -0
  30. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/config/config.py +0 -0
  31. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/decorators.py +0 -0
  32. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/document.py +0 -0
  33. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/image.py +0 -0
  34. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
  35. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/judge.py +0 -0
  36. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/lab.py +0 -0
  37. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
  38. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
  39. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
  40. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/recording.py +0 -0
  41. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/runner.py +0 -0
  42. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/state.py +0 -0
  43. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/testing.py +0 -0
  44. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/tinker.py +0 -0
  45. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/types.py +0 -0
  46. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/application.py +0 -0
  47. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
  48. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
  49. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
  50. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
  51. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
  52. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
  53. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
  54. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
  55. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
  56. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
  57. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
  58. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
  59. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
  60. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
  61. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
  62. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
  63. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
  64. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  65. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  66. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/config/__init__.py +0 -0
  67. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  68. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  69. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/config.py +0 -0
  70. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  71. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  72. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  73. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/__init__.py +0 -0
  74. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/application.py +0 -0
  75. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  76. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  77. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/command.py +0 -0
  78. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  79. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/container/__init__.py +0 -0
  80. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  81. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/__init__.py +0 -0
  82. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
  83. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/fake.py +0 -0
  84. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/helpers.py +0 -0
  85. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/listener.py +0 -0
  86. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/provider.py +0 -0
  87. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  88. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  89. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  90. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/AI.py +0 -0
  91. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
  92. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  93. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Config.py +0 -0
  94. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  95. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  96. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  97. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Event.py +0 -0
  98. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
  99. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  100. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  101. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  102. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  103. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  104. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  105. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  106. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  107. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  108. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  109. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  110. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  111. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  112. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  113. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  114. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Request.py +0 -0
  115. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  116. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Response.py +0 -0
  117. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  118. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Session.py +0 -0
  119. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  120. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Url.py +0 -0
  121. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  122. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/View.py +0 -0
  123. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  124. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  125. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  126. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/__init__.py +0 -0
  127. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  128. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  129. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
  130. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  131. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
  132. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/events.py +0 -0
  133. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
  134. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
  135. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  136. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  137. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  138. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  139. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
  140. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  141. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
  142. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
  143. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  144. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  145. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/context.py +0 -0
  146. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
  147. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
  148. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  149. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/provider.py +0 -0
  150. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
  151. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
  152. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  153. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  154. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  155. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  156. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  157. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  158. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  159. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  160. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  161. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  162. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  163. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  164. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  165. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  166. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  167. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
  168. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  169. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  170. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  171. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  172. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
  173. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  174. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/factory.py +0 -0
  175. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/file.py +0 -0
  176. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/handler.py +0 -0
  177. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  178. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/logger.py +0 -0
  179. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  180. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  181. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  182. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  183. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
  184. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  185. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  186. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  187. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  188. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  189. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
  190. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  191. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  192. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  193. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  194. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  195. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  196. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  197. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  198. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  199. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  200. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  201. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  202. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  203. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  204. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  205. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
  206. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  207. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
  208. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
  209. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
  210. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  211. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  212. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  213. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  214. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  215. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
  216. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  217. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  218. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  219. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  220. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  221. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  222. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  223. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
  224. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  225. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  226. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  227. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  228. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  229. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  230. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  231. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  232. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  233. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  234. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  235. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  236. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  237. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  238. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  239. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  240. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  241. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  242. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  243. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  244. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  245. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  246. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  247. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  248. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  249. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  250. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  251. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  252. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  253. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  254. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  255. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  256. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  257. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  258. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  259. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  260. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  261. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  262. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  263. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  264. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  265. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  266. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  267. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  268. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  269. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  270. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  271. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  272. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  273. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  274. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  275. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  276. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
  277. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
  278. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +0 -0
  279. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  280. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  281. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  282. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  283. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
  284. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/argument.py +0 -0
  285. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
  286. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
  287. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  288. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
  289. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/request.py +0 -0
  290. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/resource.py +0 -0
  291. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/response.py +0 -0
  292. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/server.py +0 -0
  293. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/tool.py +0 -0
  294. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/__init__.py +0 -0
  295. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/exception.py +0 -0
  296. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/fake.py +0 -0
  297. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/process.py +0 -0
  298. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/result.py +0 -0
  299. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/py.typed +0 -0
  300. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/__init__.py +0 -0
  301. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
  302. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
  303. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
  304. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
  305. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
  306. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
  307. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/parser.py +0 -0
  308. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/provider.py +0 -0
  309. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/registry.py +0 -0
  310. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
  311. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
  312. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
  313. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  314. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
  315. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  316. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
  317. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  318. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  319. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  320. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/file.py +0 -0
  321. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  322. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/helper.py +0 -0
  323. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  324. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/storage.py +0 -0
  325. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/__init__.py +0 -0
  326. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/collection.py +0 -0
  327. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/dataclass.py +0 -0
  328. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
  329. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
  330. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/string.py +0 -0
  331. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/structures.py +0 -0
  332. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/uri.py +0 -0
  333. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  334. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  335. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  336. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
  337. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  338. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  339. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  340. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  341. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  342. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
  343. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  344. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  345. {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.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.55.0
3
+ Version: 0.57.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.55.0"
3
+ version = "0.57.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 = [
@@ -107,7 +107,9 @@ dev = [
107
107
  "faker>=40.13.0",
108
108
  "langchain>=1.0.0",
109
109
  "langchain-core>=1.0.0",
110
+ "basedpyright>=1.31.4",
110
111
  "pyright>=1.1.411",
112
+ "pytest-benchmark>=5.2.3",
111
113
  ]
112
114
 
113
115
 
@@ -121,7 +123,7 @@ fixable = ["F401"]
121
123
  [tool.ruff.lint.per-file-ignores]
122
124
  "__init__.py" = ["F401"]
123
125
 
124
- [tool.pyright]
126
+ [tool.basedpyright]
125
127
  include = ["src/fastapi_startkit"]
126
128
  exclude = [
127
129
  "**/tests",
@@ -137,6 +139,10 @@ pythonVersion = "3.12"
137
139
  [tool.pytest.ini_options]
138
140
  asyncio_mode = "auto"
139
141
  norecursedirs = [".venv", "dist", "build", "__pycache__"]
142
+ markers = [
143
+ "benchmark: performance benchmark, excluded by default (run with -m benchmark)",
144
+ ]
145
+ addopts = "-m 'not benchmark'"
140
146
 
141
147
  [tool.coverage.run]
142
148
  source = ["src/fastapi_startkit"]
@@ -7,5 +7,5 @@ from fastapi_startkit.environment.environment import env
7
7
  class AppConfig:
8
8
  name: str = field(default_factory=lambda: os.getenv("APP_NAME", "FastAPI starter kit"))
9
9
  env: str = field(default_factory=lambda: os.getenv("APP_ENV", "development"))
10
- debug: bool = field(default_factory=lambda: env("APP_DEBUG", "true"))
10
+ debug: bool = field(default_factory=lambda: env("APP_DEBUG", True))
11
11
  timezone: str = field(default_factory=lambda: os.getenv("APP_TIMEZONE", "UTC"))
@@ -1,7 +1,7 @@
1
1
  """Core of the IOC Container."""
2
2
 
3
3
  import inspect
4
- from typing import Any
4
+ from typing import Any, ClassVar, TypeVar, overload
5
5
 
6
6
  from ..exceptions import (
7
7
  ContainerError,
@@ -9,6 +9,8 @@ from ..exceptions import (
9
9
  StrictContainerException,
10
10
  )
11
11
 
12
+ T = TypeVar("T")
13
+
12
14
 
13
15
  class Container:
14
16
  """Core of the Service Container.
@@ -16,14 +18,14 @@ class Container:
16
18
  Performs bindings and resolving of objects to and from the container.
17
19
  """
18
20
 
19
- _instance = None
21
+ _instance: ClassVar["Container | None"] = None
20
22
 
21
23
  @classmethod
22
- def set_instance(cls, instance):
24
+ def set_instance(cls, instance: "Container") -> None:
23
25
  cls._instance = instance
24
26
 
25
27
  @classmethod
26
- def instance(cls):
28
+ def instance(cls) -> "Container":
27
29
  if cls._instance is None:
28
30
  raise RuntimeError("Container not initialized")
29
31
  return cls._instance
@@ -103,11 +105,22 @@ class Container:
103
105
  obj = self.resolve(class_obj)
104
106
  self.bind(name, obj)
105
107
 
106
- def make(self, name, *arguments):
108
+ @overload
109
+ def make(self, name: type[T], *arguments: Any) -> T: ...
110
+
111
+ @overload
112
+ def make(self, name: str, *arguments: Any) -> Any: ...
113
+
114
+ def make(self, name: type[T] | str, *arguments: Any) -> Any:
107
115
  """Retrieve a class from the container by key.
108
116
 
117
+ A class key resolves to an instance of that class, so `make(Foo)` is
118
+ typed as `Foo`. A string key carries no static type information, so it
119
+ stays `Any` and callers annotate the binding themselves. The return is
120
+ never `None`: a missing key raises instead.
121
+
109
122
  Arguments:
110
- name {string} -- Key in the container that you want to get.
123
+ name {string | type} -- Key in the container that you want to get.
111
124
 
112
125
  Raises:
113
126
  MissingContainerBindingNotFound -- Raised if the key is not in the container.
@@ -2,9 +2,15 @@
2
2
 
3
3
  import os
4
4
  import sys
5
+ from typing import Any, Literal, TypeVar, overload
6
+
5
7
  from dotenv import load_dotenv
6
8
 
7
9
 
10
+ T = TypeVar("T")
11
+ EnvValue = str | int | bool
12
+
13
+
8
14
  class Environment:
9
15
  @staticmethod
10
16
  def resolve_environment(base_path=None, env: str | None = None):
@@ -63,11 +69,45 @@ class Environment:
63
69
  break
64
70
 
65
71
 
66
- def env(value, default="", cast=True):
67
- """Helper to retrieve the value of an environment variable or returns
68
- a default value. In addition, if type can be inferred then the value can be casted to the
69
- inferred type."""
70
- env_var = os.getenv(value, default)
72
+ @overload
73
+ def env(val: str, default: T, cast: Literal[False]) -> str | T: ...
74
+
75
+
76
+ @overload
77
+ def env(val: str, default: Literal[""], cast: Literal[True] = True) -> EnvValue: ...
78
+
79
+
80
+ @overload
81
+ def env(val: str, default: None, cast: Literal[True] = True) -> EnvValue | None: ...
82
+
83
+
84
+ @overload
85
+ def env(val: str, default: T, cast: Literal[True] = True) -> T: ...
86
+
87
+
88
+ @overload
89
+ def env(val: str, default: None, cast: bool) -> EnvValue | None: ...
90
+
91
+
92
+ @overload
93
+ def env(val: str, default: T, cast: bool) -> EnvValue | T: ...
94
+
95
+
96
+ @overload
97
+ def env(val: str) -> EnvValue: ...
98
+
99
+
100
+ @overload
101
+ def env(val: str, *, cast: Literal[False]) -> str: ...
102
+
103
+
104
+ @overload
105
+ def env(val: str, *, cast: bool) -> EnvValue: ...
106
+
107
+
108
+ def env(val: str, default: Any = "", cast: bool = True) -> Any:
109
+ """Return an environment value, casting it to the supplied default's type when possible."""
110
+ env_var = os.getenv(val, default)
71
111
 
72
112
  if not cast:
73
113
  return env_var
@@ -75,18 +115,23 @@ def env(value, default="", cast=True):
75
115
  if env_var == "":
76
116
  env_var = default
77
117
 
78
- if isinstance(env_var, bool):
79
- return env_var
80
- elif env_var is None:
81
- return None
82
- elif isinstance(env_var, int) or env_var.isnumeric():
83
- return int(env_var)
84
- elif env_var in ("false", "False"):
85
- return False
86
- elif env_var in ("true", "True"):
87
- return True
88
- else:
89
- return env_var
118
+ if default in ("", None):
119
+ return value(env_var)
120
+
121
+ default_type = type(default)
122
+ if default_type is bool:
123
+ if isinstance(env_var, bool):
124
+ return env_var
125
+ if env_var in ("true", "True"):
126
+ return True
127
+ if env_var in ("false", "False"):
128
+ return False
129
+ raise ValueError(f"Cannot cast environment variable {val!r} to bool")
130
+
131
+ try:
132
+ return default_type(env_var)
133
+ except (TypeError, ValueError) as error:
134
+ raise ValueError(f"Cannot cast environment variable {val!r} to {default_type.__name__}") from error
90
135
 
91
136
 
92
137
  def value(env_var, default=""):
@@ -1,4 +1,5 @@
1
- from typing import TYPE_CHECKING, Any, Generator, Generic, TypeVar
1
+ from collections.abc import Callable, Generator
2
+ from typing import TYPE_CHECKING, Any, Generic, TypeVar
2
3
 
3
4
  from fastapi_startkit.support.collection import Collection as BaseCollection
4
5
 
@@ -10,7 +11,7 @@ class Collection(BaseCollection, Generic[T]):
10
11
  # Typing-only element-access overrides so a Collection[User] yields
11
12
  # User (not Any) on iteration, indexing, and first(). Runtime behaviour
12
13
  # is supplied unchanged by the base class.
13
- def first(self, callback=None) -> "T | None": ...
14
+ def first(self, callback: "Callable[[T], bool] | None" = None) -> "T | None": ...
14
15
  def __iter__(self) -> "Generator[T, Any, None]": ...
15
16
  def __getitem__(self, item) -> "T": ...
16
17
 
@@ -100,13 +100,17 @@ class SelectExpression:
100
100
  class OrderByExpression:
101
101
  """A helper class to manage select expressions."""
102
102
 
103
- def __init__(self, column, direction="ASC", raw=False, bindings=()):
104
- self.column = column.strip()
105
-
103
+ def __init__(self, column, direction="ASC", raw=False, bindings=(), builder=None):
106
104
  self.raw = raw
107
-
108
105
  self.direction = direction
109
106
  self.bindings = bindings
107
+ self.builder = builder
108
+
109
+ if builder is not None:
110
+ self.column = None
111
+ return
112
+
113
+ self.column = column.strip()
110
114
 
111
115
  if raw is False:
112
116
  if self.column.endswith(" desc"):
@@ -0,0 +1,6 @@
1
+ from .model import Model
2
+ from .caster import Caster
3
+ from .registry import Registry
4
+ from .fields import Field, ModelField
5
+
6
+ __all__ = ["Model", "Caster", "Registry", "Field", "ModelField"]
@@ -1,5 +1,6 @@
1
1
  import inspect
2
- from typing import TYPE_CHECKING, Any, Generic, TypeVar
2
+ from collections.abc import Callable
3
+ from typing import TYPE_CHECKING, Any, Generic, Self, TypeVar, overload
3
4
 
4
5
  from fastapi_startkit.masoniteorm.expressions.expressions import (
5
6
  JoinClause,
@@ -24,6 +25,10 @@ if TYPE_CHECKING:
24
25
 
25
26
  TModel = TypeVar("TModel", bound="Model")
26
27
 
28
+ # where(lambda q: q.where(...)) — the callable receives a nested builder and
29
+ # returns it, which the parent renders as a parenthesised subgroup.
30
+ type WhereGroup[M: "Model"] = Callable[["QueryBuilder[M]"], "QueryBuilder[M]"]
31
+
27
32
 
28
33
  class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
29
34
  operators = [
@@ -159,7 +164,7 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
159
164
  results = await self.select(columns).limit(1).get()
160
165
  return results.first()
161
166
 
162
- async def get(self, columns=None) -> "Collection[TModel]":
167
+ async def get(self, columns: "list[str] | str | None" = None) -> "Collection[TModel]":
163
168
  # TODO: apply scopes
164
169
  if not columns:
165
170
  columns = []
@@ -217,8 +222,11 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
217
222
  self._offset = offset
218
223
  return self
219
224
 
220
- def order_by(self, column: str, direction: str = "asc") -> "QueryBuilder":
225
+ def order_by(self, column, direction: str = "asc") -> "QueryBuilder":
221
226
  direction = direction.upper()
227
+ if isinstance(column, QueryBuilder):
228
+ self._order_by += (OrderByExpression(None, direction, builder=column),)
229
+ return self
222
230
  for col in column.split(","):
223
231
  col = col.strip()
224
232
  self._order_by += (OrderByExpression(col, direction),)
@@ -486,11 +494,27 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
486
494
  """Determine whether an operator is not supported by the builder."""
487
495
  return not isinstance(operator, str) or operator.lower() not in self.operators
488
496
 
489
- def where(self, column, *args):
497
+ @overload
498
+ def where(self, column: str, /) -> "Self": ...
499
+
500
+ @overload
501
+ def where(self, column: str, value: Any, /) -> "Self": ...
502
+
503
+ @overload
504
+ def where(self, column: str, operator: str, value: Any, /) -> "Self": ...
505
+
506
+ @overload
507
+ def where(self, column: dict[str, Any], /) -> "Self": ...
508
+
509
+ @overload
510
+ def where(self, column: "WhereGroup[TModel]", /) -> "Self": ...
511
+
512
+ def where(self, column: "str | dict[str, Any] | WhereGroup[TModel]", *args: Any) -> "Self":
490
513
  """Specifies a where expression.
491
514
 
492
515
  Arguments:
493
- column {string} -- The name of the column to search
516
+ column {string | dict | callable} -- The column to search, a dict of
517
+ column/value pairs, or a callable receiving a nested builder.
494
518
 
495
519
  Keyword Arguments:
496
520
  args {List} -- The operator and the value of the column to search. (default: {None})
@@ -531,8 +555,33 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
531
555
  self._joins += (join_clause,)
532
556
  return self
533
557
 
534
- def where_column(self, column1: str, column2: str) -> "QueryBuilder":
535
- self._wheres += (QueryExpression(column1, "=", column2, "value_equals"),)
558
+ _WHERE_COLUMN_OPERATORS = ("=", "!=", "<>", ">", ">=", "<", "<=")
559
+
560
+ def _normalize_where_column(self, operator: str, column2: str | None):
561
+ """Resolve the where_column arity.
562
+
563
+ Two-arg ``(col1, col2)`` defaults the operator to ``=``; three-arg
564
+ ``(col1, operator, col2)`` validates the operator.
565
+ """
566
+ if column2 is None:
567
+ return "=", operator
568
+ if operator not in self._WHERE_COLUMN_OPERATORS:
569
+ raise ValueError(
570
+ f"Invalid where_column operator {operator!r}. "
571
+ f"Expected one of: {', '.join(self._WHERE_COLUMN_OPERATORS)}"
572
+ )
573
+ return operator, column2
574
+
575
+ def where_column(self, column1: str, operator: str, column2: str | None = None) -> "QueryBuilder":
576
+ """Compare two columns (identifiers, never bound values), joined with AND."""
577
+ operator, column2 = self._normalize_where_column(operator, column2)
578
+ self._wheres += (QueryExpression(column1, operator, column2, "value_equals"),)
579
+ return self
580
+
581
+ def or_where_column(self, column1: str, operator: str, column2: str | None = None) -> "QueryBuilder":
582
+ """Compare two columns (identifiers, never bound values), joined with OR."""
583
+ operator, column2 = self._normalize_where_column(operator, column2)
584
+ self._wheres += (QueryExpression(column1, operator, column2, "value_equals", keyword="or"),)
536
585
  return self
537
586
 
538
587
  def when(self, condition, callback) -> "QueryBuilder":
@@ -4,8 +4,9 @@ import datetime
4
4
  from decimal import Decimal
5
5
  from enum import Enum
6
6
  from dataclasses import dataclass, field
7
- from typing import TYPE_CHECKING, Any, get_type_hints, Optional
7
+ from typing import TYPE_CHECKING, Any, get_args, get_type_hints, Optional
8
8
  from pydantic.fields import FieldInfo
9
+ from pydantic import BaseModel as PydanticModel
9
10
  from fastapi_startkit.carbon import Carbon
10
11
 
11
12
  if TYPE_CHECKING:
@@ -214,7 +215,7 @@ class Caster:
214
215
 
215
216
  # Ignore the builder
216
217
  annotations = {k: v for k, v in annotations.items() if k not in cls.IGNORE_CASTS}
217
- from .fields import ModelField, FieldDescriptor
218
+ from .fields import FieldDescriptor, ModelField
218
219
 
219
220
  # 1. Collect all potential fields (annotations + descriptors)
220
221
  all_field_names = set(annotations.keys())
@@ -226,11 +227,30 @@ class Caster:
226
227
 
227
228
  casts = {}
228
229
  for field_name in all_field_names:
229
- typ = annotations.get(field_name) or "str"
230
230
  descriptor = descriptors.get(field_name, None)
231
+ typ = annotations.get(field_name)
231
232
 
232
- # AttributeField: use the type annotation as the model class
233
- if isinstance(descriptor, ModelField):
233
+ # ``Field[int]()`` carries its runtime type in ``__orig_class__``.
234
+ # This lets models use typed descriptors without repeating an
235
+ # annotation solely for the casting layer.
236
+ if typ is None and isinstance(descriptor, FieldDescriptor):
237
+ generic_args = get_args(getattr(descriptor, "__orig_class__", None))
238
+ if generic_args:
239
+ typ = generic_args[0]
240
+
241
+ # An unsubscripted field can still derive its cast from a concrete
242
+ # default, as in ``Field(default=False)``.
243
+ if typ is None and isinstance(descriptor, FieldDescriptor):
244
+ from pydantic_core import PydanticUndefined
245
+
246
+ if descriptor.field_info.default is not PydanticUndefined:
247
+ typ = type(descriptor.field_info.default)
248
+
249
+ typ = typ or "str"
250
+
251
+ # Nested Pydantic models are stored as JSON and hydrated back into
252
+ # their declared type, e.g. ``address = Field[Address]()``.
253
+ if isinstance(descriptor, ModelField) or (isinstance(typ, type) and issubclass(typ, PydanticModel)):
234
254
  casts[field_name] = ModelCast(model_class=typ)
235
255
  continue
236
256
 
@@ -0,0 +1,160 @@
1
+ from typing import Any, Callable, Generic, Protocol, Self, TypeVar, overload
2
+ import warnings
3
+
4
+ from pydantic import Field as BaseField
5
+ from pydantic.fields import FieldInfo
6
+
7
+ from fastapi_startkit.masoniteorm.models.observer import (
8
+ CreatedAtObserver,
9
+ UpdatedAtObserver,
10
+ )
11
+
12
+
13
+ T = TypeVar("T")
14
+
15
+
16
+ class _AttributeModel(Protocol):
17
+ def get_attribute(self, key: str) -> Any: ...
18
+
19
+ def set_attribute(self, key: str, value: Any) -> None: ...
20
+
21
+
22
+ class FieldDescriptor(Generic[T]):
23
+ """
24
+ A descriptor that wraps Pydantic's FieldInfo.
25
+ It allows us to store metadata that the Caster can later discover.
26
+ """
27
+
28
+ def __init__(self, field_info: FieldInfo) -> None:
29
+ self.field_info = field_info
30
+ self.name: str | None = None
31
+
32
+ def __set_name__(self, owner: type[_AttributeModel], name: str) -> None:
33
+ self.name = name
34
+
35
+ @overload
36
+ def __get__(self, instance: None, owner: type[_AttributeModel]) -> FieldInfo: ...
37
+
38
+ @overload
39
+ def __get__(self, instance: _AttributeModel, owner: type[_AttributeModel]) -> T: ...
40
+
41
+ def __get__(self, instance: _AttributeModel | None, owner: type[_AttributeModel]) -> T | FieldInfo:
42
+ if instance is None:
43
+ # When accessed on the class (e.g., User.name), return the FieldInfo
44
+ return self.field_info
45
+
46
+ # When accessed on the instance (e.g., user.name), retrieve from ORM storage
47
+ assert self.name is not None
48
+ return instance.get_attribute(self.name)
49
+
50
+ def __set__(self, instance: _AttributeModel, value: T) -> None:
51
+ # When setting (e.g., user.name = 'Joe'), update ORM storage
52
+ assert self.name is not None
53
+ instance.set_attribute(self.name, value)
54
+
55
+
56
+ class Field(FieldDescriptor[T]):
57
+ """
58
+ Typed ORM field descriptor backed by Pydantic field metadata.
59
+
60
+ Required fields can state their type explicitly with ``Field[int]()``.
61
+ Fields with a default infer their type with ``Field(default=False)``.
62
+ """
63
+
64
+ @overload
65
+ def __init__(self, *, default: T, default_factory: None = None, **kwargs: Any) -> None: ...
66
+
67
+ @overload
68
+ def __init__(self, *, default_factory: Callable[[], T], **kwargs: Any) -> None: ...
69
+
70
+ @overload
71
+ def __init__(self, *args: Any, **kwargs: Any) -> None: ...
72
+
73
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
74
+ super().__init__(BaseField(*args, **kwargs))
75
+
76
+
77
+ class ModelField(Generic[T]):
78
+ """Deprecated; scheduled for removal in 2.x. Use ``Field[Address]()`` instead."""
79
+
80
+ def __init__(self, default: T | None = None) -> None:
81
+ warnings.warn(
82
+ "ModelField is deprecated and will be removed in 2.x; use Field[YourModel]() instead.",
83
+ DeprecationWarning,
84
+ stacklevel=2,
85
+ )
86
+ self.default = default
87
+ self.name: str | None = None
88
+
89
+ def __set_name__(self, owner: type[_AttributeModel], name: str) -> None:
90
+ self.name = name
91
+
92
+ @overload
93
+ def __get__(self, instance: None, owner: type[_AttributeModel]) -> Self: ...
94
+
95
+ @overload
96
+ def __get__(self, instance: _AttributeModel, owner: type[_AttributeModel]) -> T: ...
97
+
98
+ def __get__(self, instance: _AttributeModel | None, owner: type[_AttributeModel]) -> T | Self:
99
+ if instance is None:
100
+ return self
101
+ assert self.name is not None
102
+ return instance.get_attribute(self.name)
103
+
104
+ def __set__(self, instance: _AttributeModel, value: T) -> None:
105
+ assert self.name is not None
106
+ instance.set_attribute(self.name, value)
107
+
108
+
109
+ class DateTimeField:
110
+ def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"):
111
+ self.format = fmt
112
+ self.tz = tz
113
+
114
+ def __set_name__(self, owner, name):
115
+ self.name = name
116
+
117
+ def __get__(self, instance, owner):
118
+ if instance is None:
119
+ return self
120
+
121
+ return instance.get_attribute(self.name)
122
+
123
+ # def __set__(self, instance, value):
124
+ # instance.set_attribute(self.name, value)
125
+
126
+
127
+ class CreatedAtField:
128
+ def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"):
129
+ self.format = fmt
130
+ self.tz = tz
131
+
132
+ def __set_name__(self, owner, name):
133
+ self.name = name
134
+ owner.observe(CreatedAtObserver(name, self.format, self.tz))
135
+
136
+ def __get__(self, instance, owner):
137
+ if instance is None:
138
+ return self
139
+ return instance.get_attribute(self.name)
140
+
141
+ # def __set__(self, instance, value):
142
+ # instance.set_value(self.name, value)
143
+
144
+
145
+ class UpdatedAtField:
146
+ def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"):
147
+ self.format = fmt
148
+ self.tz = tz
149
+
150
+ def __set_name__(self, owner, name):
151
+ self.name = name
152
+ owner.observe(UpdatedAtObserver(name, self.format, self.tz))
153
+
154
+ def __get__(self, instance, owner):
155
+ if instance is None:
156
+ return self
157
+ return instance.get_attribute(self.name)
158
+
159
+ def __set__(self, instance, value):
160
+ instance.set_attribute(self.name, value)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Self
3
+ from typing import TYPE_CHECKING, Any, Self, dataclass_transform, overload
4
4
 
5
5
  import inflection
6
6
  import pendulum
@@ -9,15 +9,22 @@ from fastapi_startkit.carbon import Carbon
9
9
  from fastapi_startkit.masoniteorm.collection import Collection
10
10
  from fastapi_startkit.masoniteorm.connections.manager import DatabaseManager
11
11
  from fastapi_startkit.masoniteorm.models.attribute import Attribute
12
- from fastapi_startkit.masoniteorm.models.fields import CreatedAtField, UpdatedAtField
12
+ from fastapi_startkit.masoniteorm.models.fields import (
13
+ CreatedAtField,
14
+ Field,
15
+ FieldDescriptor,
16
+ ModelField,
17
+ UpdatedAtField,
18
+ )
13
19
  from fastapi_startkit.masoniteorm.models.registry import Registry
14
20
  from fastapi_startkit.masoniteorm.models.relationship import Relationship
15
21
  from fastapi_startkit.masoniteorm.observers import ObservesEvents
16
22
 
17
23
  if TYPE_CHECKING:
18
- from fastapi_startkit.masoniteorm.models.builder import QueryBuilder
24
+ from fastapi_startkit.masoniteorm.models.builder import QueryBuilder, WhereGroup
19
25
 
20
26
 
27
+ @dataclass_transform(field_specifiers=(Field, ModelField))
21
28
  class Model(Attribute, Relationship, ObservesEvents):
22
29
  db_manager: "DatabaseManager" = None
23
30
  __table__ = None
@@ -34,9 +41,16 @@ class Model(Attribute, Relationship, ObservesEvents):
34
41
  super().__init_subclass__(**kwargs)
35
42
  Registry.register(cls)
36
43
 
44
+ declared_fields = dict.fromkeys(
45
+ [
46
+ *cls.__annotations__,
47
+ *(name for name, value in vars(cls).items() if isinstance(value, FieldDescriptor)),
48
+ ]
49
+ )
50
+
37
51
  fillable = []
38
- for name, _typ in cls.__annotations__.items():
39
- attr = getattr(cls, name, None)
52
+ for name in declared_fields:
53
+ attr = vars(cls).get(name)
40
54
  from fastapi_startkit.masoniteorm.relationships.BaseRelationship import (
41
55
  BaseRelationship,
42
56
  )
@@ -93,8 +107,28 @@ class Model(Attribute, Relationship, ObservesEvents):
93
107
  def with_(cls, *eagers) -> "QueryBuilder":
94
108
  return cls.query().with_(*eagers)
95
109
 
110
+ @overload
111
+ @classmethod
112
+ def where(cls, column: str, /) -> QueryBuilder[Self]: ...
113
+
114
+ @overload
115
+ @classmethod
116
+ def where(cls, column: str, value: Any, /) -> QueryBuilder[Self]: ...
117
+
118
+ @overload
119
+ @classmethod
120
+ def where(cls, column: str, operator: str, value: Any, /) -> QueryBuilder[Self]: ...
121
+
122
+ @overload
123
+ @classmethod
124
+ def where(cls, column: dict[str, Any], /) -> QueryBuilder[Self]: ...
125
+
126
+ @overload
127
+ @classmethod
128
+ def where(cls, column: WhereGroup[Self], /) -> QueryBuilder[Self]: ...
129
+
96
130
  @classmethod
97
- def where(cls, column, *args) -> "QueryBuilder[Self]":
131
+ def where(cls, column: str | dict[str, Any] | WhereGroup[Self], *args: Any) -> QueryBuilder[Self]:
98
132
  return cls.query().where(column, *args)
99
133
 
100
134
  @classmethod
@@ -243,7 +277,7 @@ class Model(Attribute, Relationship, ObservesEvents):
243
277
  return await cls.query().first(columns)
244
278
 
245
279
  @classmethod
246
- async def get(cls):
280
+ async def get(cls) -> Collection[Self]:
247
281
  return await cls.query().get()
248
282
 
249
283
  @classmethod