fastapi-startkit 0.19.0__tar.gz → 0.21.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 (355) hide show
  1. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/PKG-INFO +5 -1
  2. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/pyproject.toml +8 -1
  3. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/.DS_Store +0 -0
  4. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/application.py +6 -0
  5. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions/__init__.py +1 -0
  6. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions/exceptions.py +6 -0
  7. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/__init__.py +0 -1
  8. fastapi_startkit-0.21.0/src/fastapi_startkit/fastapi/__init__.py +5 -0
  9. fastapi_startkit-0.21.0/src/fastapi_startkit/fastapi/exceptions.py +70 -0
  10. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +10 -1
  11. fastapi_startkit-0.21.0/src/fastapi_startkit/fastapi/requests/model.py +34 -0
  12. fastapi_startkit-0.21.0/src/fastapi_startkit/helpers/app.py +9 -0
  13. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/inertia/middleware.py +1 -1
  14. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/inertia/provider.py +3 -15
  15. fastapi_startkit-0.21.0/src/fastapi_startkit/masoniteorm/__init__.py +6 -0
  16. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +18 -7
  17. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +2 -2
  18. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +8 -17
  19. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +15 -3
  20. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/builder.py +46 -23
  21. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/model.py +19 -5
  22. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +35 -0
  23. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +16 -8
  24. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/__init__.py +3 -0
  25. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/config/__init__.py +33 -0
  26. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/config/storage.py +30 -0
  27. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/drivers/__init__.py +3 -0
  28. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/drivers/fake.py +69 -0
  29. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/drivers/local.py +133 -0
  30. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/drivers/s3.py +203 -0
  31. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/file.py +30 -0
  32. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/filestream.py +18 -0
  33. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/providers/provider.py +59 -0
  34. fastapi_startkit-0.21.0/src/fastapi_startkit/storage/storage.py +185 -0
  35. fastapi_startkit-0.19.0/src/fastapi_startkit/facades/Storage.py +0 -5
  36. fastapi_startkit-0.19.0/src/fastapi_startkit/facades/Storage.pyi +0 -12
  37. fastapi_startkit-0.19.0/src/fastapi_startkit/fastapi/__init__.py +0 -4
  38. fastapi_startkit-0.19.0/src/fastapi_startkit/fastapi/exceptions.py +0 -28
  39. fastapi_startkit-0.19.0/src/fastapi_startkit/masoniteorm/__init__.py +0 -3
  40. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/__init__.py +0 -0
  41. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  42. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  43. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/collection/__init__.py +0 -0
  44. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/collection/collection.py +0 -0
  45. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/commands/__init__.py +0 -0
  46. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/commands/publish_command.py +0 -0
  47. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/config/__init__.py +0 -0
  48. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/config/app.py +0 -0
  49. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  50. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  51. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/configuration/config.py +0 -0
  52. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  53. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  54. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  55. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/console.py +0 -0
  56. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/container/__init__.py +0 -0
  57. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/container/container.py +0 -0
  58. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  59. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/environment/environment.py +0 -0
  60. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  61. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/DD.py +0 -0
  62. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py +0 -0
  63. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/__init__.py +0 -0
  64. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/exceptionite/__init__.py +0 -0
  65. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/exceptionite/blocks.py +0 -0
  66. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py +0 -0
  67. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/exceptionite/solutions.py +0 -0
  68. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/exceptionite/tabs.py +0 -0
  69. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py +0 -0
  70. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py +0 -0
  71. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py +0 -0
  72. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Auth.py +0 -0
  73. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Auth.pyi +0 -0
  74. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Broadcast.py +0 -0
  75. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  76. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Config.py +0 -0
  77. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  78. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  79. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  80. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  81. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  82. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  83. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  84. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  85. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Inertia.py +0 -0
  86. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  87. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  88. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  89. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  90. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  91. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  92. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  93. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  94. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  95. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  96. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Request.py +0 -0
  97. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  98. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Response.py +0 -0
  99. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  100. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Session.py +0 -0
  101. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  102. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Url.py +0 -0
  103. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  104. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/View.py +0 -0
  105. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  106. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  107. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  108. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  109. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
  110. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  111. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  112. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  113. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
  114. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/helpers/string.py +0 -0
  115. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  116. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  117. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/inertia/context.py +0 -0
  118. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
  119. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  120. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  121. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  122. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  123. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  124. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  125. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  126. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  127. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  128. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  129. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  130. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  131. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  132. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  133. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  134. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  135. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
  136. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  137. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  138. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  139. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  140. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
  141. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  142. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/factory.py +0 -0
  143. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/handler.py +0 -0
  144. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  145. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/logger.py +0 -0
  146. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  147. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  148. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  149. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  150. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  151. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  152. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/CanOverrideConfig.py +0 -0
  153. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/CanOverrideOptionsDefault.py +0 -0
  154. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/Command.py +0 -0
  155. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  156. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  157. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/Entry.py +0 -0
  158. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  159. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  160. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
  161. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  162. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  163. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  164. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  165. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  166. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  167. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  168. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  169. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  170. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  171. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  172. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  173. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  174. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  175. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  176. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
  177. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  178. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
  179. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  180. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  181. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  182. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  183. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  184. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  185. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  186. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  187. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  188. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  189. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  190. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  191. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  192. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  193. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  194. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  195. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  196. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  197. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  198. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  199. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  200. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  201. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  202. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  203. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  204. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  205. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  206. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  207. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  208. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  209. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  210. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  211. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  212. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  213. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  214. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  215. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  216. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  217. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  218. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  219. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  220. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  221. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  222. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  223. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  224. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  225. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  226. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  227. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  228. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  229. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  230. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  231. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  232. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  233. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  234. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  235. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  236. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  237. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  238. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  239. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  240. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  241. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  242. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  243. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  244. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  245. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  246. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  247. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  248. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
  249. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
  250. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
  251. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  252. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  253. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  254. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  255. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
  256. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
  257. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
  258. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
  259. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
  260. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
  261. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
  262. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
  263. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
  264. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
  265. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
  266. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
  267. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
  268. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
  269. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
  270. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
  271. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
  272. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
  273. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
  274. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
  275. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
  276. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
  277. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
  278. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
  279. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
  280. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
  281. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py +0 -0
  282. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/__init__.py +0 -0
  283. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py +0 -0
  284. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py +0 -0
  285. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py +0 -0
  286. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py +0 -0
  287. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
  288. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py +0 -0
  289. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py +0 -0
  290. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py +0 -0
  291. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py +0 -0
  292. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
  293. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py +0 -0
  294. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py +0 -0
  295. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py +0 -0
  296. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py +0 -0
  297. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py +0 -0
  298. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
  299. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py +0 -0
  300. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
  301. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/connections/test_mysql_connection_selects.py +0 -0
  302. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py +0 -0
  303. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py +0 -0
  304. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
  305. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py +0 -0
  306. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py +0 -0
  307. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py +0 -0
  308. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
  309. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py +0 -0
  310. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py +0 -0
  311. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py +0 -0
  312. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
  313. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py +0 -0
  314. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py +0 -0
  315. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py +0 -0
  316. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py +0 -0
  317. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
  318. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py +0 -0
  319. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
  320. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
  321. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
  322. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
  323. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
  324. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
  325. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py +0 -0
  326. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py +0 -0
  327. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
  328. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
  329. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
  330. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/providers/Provider.py +0 -0
  331. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/providers/__init__.py +0 -0
  332. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
  333. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  334. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  335. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/__init__.py +0 -0
  336. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/collections.py +0 -0
  337. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/console.py +0 -0
  338. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/data/mime.types +0 -0
  339. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/filesystem.py +0 -0
  340. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/http.py +0 -0
  341. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/location.py +0 -0
  342. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/str.py +0 -0
  343. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/structures.py +0 -0
  344. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/utils/time.py +0 -0
  345. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  346. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
  347. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  348. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  349. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  350. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  351. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  352. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/stubs/templates/index.html +0 -0
  353. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  354. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  355. {fastapi_startkit-0.19.0 → fastapi_startkit-0.21.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.19.0
3
+ Version: 0.21.0
4
4
  Summary: Fastapi Starter kit components
5
5
  Author: Bedram Tamang
6
6
  Author-email: Bedram Tamang <tmgbedu@gmail.com>
@@ -14,6 +14,9 @@ Requires-Dist: pydantic>=2.12.5
14
14
  Requires-Dist: faker>=40.13.0 ; extra == 'database'
15
15
  Requires-Dist: sqlalchemy[asyncio]>=2.0.38 ; extra == 'database'
16
16
  Requires-Dist: fastapi[standard]>=0.124.4,<0.125.0 ; extra == 'fastapi'
17
+ Requires-Dist: itsdangerous>=2.2.0 ; extra == 'fastapi'
18
+ Requires-Dist: jinja2>=3.1 ; extra == 'inertia'
19
+ Requires-Dist: markupsafe>=2.0 ; extra == 'inertia'
17
20
  Requires-Dist: aiomysql>=0.2.0 ; extra == 'mysql'
18
21
  Requires-Dist: asyncpg>=0.29.0 ; extra == 'postgres'
19
22
  Requires-Dist: aiosqlite>=0.22.1 ; extra == 'sqlite'
@@ -21,6 +24,7 @@ Requires-Dist: jinja2>=3.1 ; extra == 'vite'
21
24
  Requires-Python: >=3.12, <4.0
22
25
  Provides-Extra: database
23
26
  Provides-Extra: fastapi
27
+ Provides-Extra: inertia
24
28
  Provides-Extra: mysql
25
29
  Provides-Extra: postgres
26
30
  Provides-Extra: sqlite
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.19.0"
3
+ version = "0.21.0"
4
4
  description = "Fastapi Starter kit components"
5
5
  authors = [
6
6
  {name = "Bedram Tamang", email = "tmgbedu@gmail.com"}
@@ -19,6 +19,7 @@ dependencies = [
19
19
  [project.optional-dependencies]
20
20
  fastapi = [
21
21
  "fastapi[standard] (>=0.124.4,<0.125.0)",
22
+ "itsdangerous>=2.2.0",
22
23
  ]
23
24
  database = [
24
25
  "faker>=40.13.0",
@@ -41,6 +42,11 @@ vite=[
41
42
  "jinja2>=3.1",
42
43
  ]
43
44
 
45
+ inertia = [
46
+ "jinja2>=3.1",
47
+ "markupsafe>=2.0",
48
+ ]
49
+
44
50
  [dependency-groups]
45
51
  dev = [
46
52
  "dumpdie>=1.5.0",
@@ -48,6 +54,7 @@ dev = [
48
54
  "pytest-asyncio>=1.3.0",
49
55
  "ruff>=0.9.0",
50
56
  "twine>=6.2.0",
57
+ "itsdangerous>=2.2.0",
51
58
  ]
52
59
 
53
60
 
@@ -112,6 +112,12 @@ class Application(Container, Generic[TConfig]):
112
112
  def use_base_path(self, path: str):
113
113
  return self.base_path / path
114
114
 
115
+ def storage_path(self, path: str = "") -> str:
116
+ return str(self.base_path / "storage" / path)
117
+
118
+ def public_path(self, path: str = "") -> str:
119
+ return str(self.base_path / "public" / path)
120
+
115
121
  def get(self, path: str, **kwargs) -> Callable:
116
122
  return self.fastapi.get(path, **kwargs)
117
123
 
@@ -27,6 +27,7 @@ from .exceptions import (
27
27
  InvalidPackageName,
28
28
  LoaderNotFound,
29
29
  QueueException,
30
+ ValidationException,
30
31
  AmbiguousError,
31
32
  MethodNotAllowedException,
32
33
  ModelNotFoundException,
@@ -216,3 +216,9 @@ class InvalidPackageName(Exception):
216
216
 
217
217
  class LoaderNotFound(Exception):
218
218
  pass
219
+
220
+
221
+ class ValidationException(Exception):
222
+ def __init__(self, errors: dict):
223
+ super().__init__("The given data was invalid.")
224
+ self.errors = errors
@@ -11,7 +11,6 @@ from .Auth import Auth
11
11
  from .Config import Config
12
12
  from .Loader import Loader
13
13
  from .Notification import Notification
14
- from .Storage import Storage
15
14
  from .Dump import Dump
16
15
  from .Queue import Queue
17
16
  from .Cache import Cache
@@ -0,0 +1,5 @@
1
+ from .providers.fastapi_provider import FastAPIProvider
2
+ from .routers.router import Router
3
+ from .requests.model import RequestModel
4
+
5
+ __all__ = ["FastAPIProvider", "Router", "RequestModel"]
@@ -0,0 +1,70 @@
1
+ class HTTPExceptionHandler:
2
+ """
3
+ The base exception handler for FastAPI applications.
4
+ """
5
+
6
+ async def render(self, request, exc):
7
+ import traceback
8
+ from fastapi.responses import JSONResponse
9
+ from fastapi_startkit.container import Container
10
+
11
+ app = Container.instance()
12
+ if app.is_debug():
13
+ tb = exc.__traceback__
14
+ frames = traceback.extract_tb(tb)
15
+ content = {
16
+ "message": str(exc),
17
+ "exception": f"{type(exc).__module__}.{type(exc).__qualname__}",
18
+ "file": frames[-1].filename if frames else None,
19
+ "line": frames[-1].lineno if frames else None,
20
+ "trace": [
21
+ {"file": f.filename, "line": f.lineno, "function": f.name}
22
+ for f in frames
23
+ ],
24
+ }
25
+ else:
26
+ content = {"message": "Server Error"}
27
+
28
+ return JSONResponse(status_code=500, content=content)
29
+
30
+
31
+ class ValidationExceptionHandler:
32
+ """
33
+ Handles RequestValidationError with content negotiation.
34
+
35
+ JSON requests (API clients) receive a 422 Unprocessable Entity response.
36
+ Non-JSON requests (browser/Inertia) have errors flashed to the session
37
+ and are redirected back to the referring page.
38
+ """
39
+
40
+ def report(self, exc) -> None:
41
+ pass
42
+
43
+ async def render(self, request, exc):
44
+ accept = request.headers.get("accept", "")
45
+ content_type = request.headers.get("content-type", "")
46
+
47
+ wants_json = (
48
+ "application/json" in accept
49
+ or content_type.startswith("application/json")
50
+ )
51
+
52
+ errors = {}
53
+ for err in exc.errors():
54
+ field = ".".join(str(x) for x in err["loc"][1:])
55
+ errors.setdefault(field, []).append(err["msg"])
56
+
57
+ if wants_json:
58
+ from fastapi.responses import JSONResponse
59
+
60
+ return JSONResponse(status_code=422, content={"errors": errors})
61
+
62
+ if "session" in request.scope:
63
+ request.session["errors"] = errors
64
+
65
+ from starlette.responses import RedirectResponse
66
+
67
+ return RedirectResponse(
68
+ url=request.headers.get("referer", "/"),
69
+ status_code=303,
70
+ )
@@ -1,4 +1,4 @@
1
- from fastapi_startkit.fastapi.exceptions import HTTPExceptionHandler
1
+ from fastapi_startkit.fastapi.exceptions import HTTPExceptionHandler, ValidationExceptionHandler
2
2
  from fastapi import FastAPI
3
3
 
4
4
  from fastapi_startkit.fastapi.commands import ServeCommand
@@ -21,10 +21,19 @@ class FastAPIProvider(Provider):
21
21
 
22
22
  def _register_exception_handlers(self):
23
23
  """Wire exception_manager as a catch-all handler for all exceptions."""
24
+ from fastapi import HTTPException
25
+ from fastapi.exceptions import RequestValidationError
26
+
24
27
  exception_manager = self.app.exception_manager
25
28
  exception_manager.register_handler(Exception, HTTPExceptionHandler())
29
+ exception_manager.register_handler(HTTPException, HTTPExceptionHandler())
30
+ exception_manager.register_handler(RequestValidationError, ValidationExceptionHandler())
26
31
 
27
32
  async def handler(request, exc):
28
33
  return await exception_manager.handle(exc, {"request": request})
29
34
 
35
+ # FastAPI registers its own handlers for these two types internally,
36
+ # so they must be overridden explicitly
37
+ self.app.fastapi.add_exception_handler(HTTPException, handler)
38
+ self.app.fastapi.add_exception_handler(RequestValidationError, handler)
30
39
  self.app.fastapi.add_exception_handler(Exception, handler)
@@ -0,0 +1,34 @@
1
+ import inspect
2
+
3
+ from fastapi import Form
4
+ from fastapi.params import Query as QueryParam
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class RequestModel(BaseModel):
9
+ @classmethod
10
+ def __pydantic_init_subclass__(cls, **kwargs):
11
+ super().__pydantic_init_subclass__(**kwargs)
12
+
13
+ params = []
14
+ for name, field in cls.model_fields.items():
15
+ if isinstance(field, QueryParam):
16
+ default = field
17
+ elif field.is_required():
18
+ default = Form(...)
19
+ else:
20
+ default = Form(default=field.default)
21
+
22
+ params.append(
23
+ inspect.Parameter(
24
+ name,
25
+ inspect.Parameter.POSITIONAL_OR_KEYWORD,
26
+ default=default,
27
+ annotation=field.annotation,
28
+ )
29
+ )
30
+
31
+ cls.__signature__ = inspect.Signature(params)
32
+
33
+ def validated(self) -> dict:
34
+ return {k: v for k, v in self.model_dump().items() if v}
@@ -0,0 +1,9 @@
1
+ def storage_path(path: str = "") -> str:
2
+ """Get the path to the storage directory."""
3
+ from fastapi_startkit.application import app
4
+ return app().storage_path(path)
5
+
6
+ def public_path(path: str = "") -> str:
7
+ """Get the path to the public directory."""
8
+ from fastapi_startkit.application import app
9
+ return app().public_path(path)
@@ -94,7 +94,7 @@ class InertiaMiddleware(BaseHTTPMiddleware):
94
94
  def resolve_validation_errors(request: Request) -> dict:
95
95
  if "session" not in request.scope:
96
96
  return {}
97
- return request.session.get("errors", {})
97
+ return request.session.pop("errors", {})
98
98
 
99
99
  @staticmethod
100
100
  def reflash(request: Request) -> None:
@@ -1,4 +1,5 @@
1
1
  import json
2
+ from markupsafe import Markup
2
3
  from fastapi_startkit.providers import Provider
3
4
  from .inertia import Inertia
4
5
  from .middleware import InertiaMiddleware
@@ -8,33 +9,20 @@ class InertiaProvider(Provider):
8
9
  provider_key = "inertia"
9
10
 
10
11
  def register(self) -> None:
11
- """Bind the Inertia class to the container."""
12
- self.app.bind("inertia", Inertia(self.app))
12
+ self.app.bind("inertia", Inertia)
13
13
 
14
14
  def boot(self) -> None:
15
- """Configure template globals and middleware."""
16
- # 1. Register Middleware
17
- # We add it to the FastAPI instance via the application helper
18
15
  self.app.add_middleware(InertiaMiddleware)
19
16
 
20
- # 2. Register Template Globals
21
17
  if self.app.has("templates"):
22
18
  templates = self.app.make("templates")
23
19
 
24
- try:
25
- from markupsafe import Markup
26
- except ImportError:
27
- Markup = str
28
-
29
20
  def inertia_helper(page):
30
- """Jinja2 helper to render the root div for Inertia."""
31
21
  encoded_page = json.dumps(page)
32
- # Ensure single quotes are used for the attribute to avoid conflict with JSON double quotes
33
22
  return Markup(
34
23
  f'<script data-page="app" type="application/json">{encoded_page}</script><div id="app"></div>'
35
24
  )
36
25
 
37
26
  templates.env.globals["inertia"] = inertia_helper
38
-
39
- # Also share the inertia instance itself if needed
40
27
  templates.env.globals["Inertia"] = self.app.make("inertia")
28
+
@@ -0,0 +1,6 @@
1
+ from .config.config import MySQLConfig, PostgresConfig, SQLiteConfig
2
+ from .facades import DB
3
+ from .models import Model
4
+ from .providers import DatabaseProvider
5
+
6
+ __all__ = ["DatabaseProvider", "PostgresConfig", "MySQLConfig", "SQLiteConfig", "Model", "DB"]
@@ -1,8 +1,9 @@
1
1
  from typing import List
2
2
 
3
- from fastapi_startkit.masoniteorm.models.builder import QueryBuilder
4
3
  from sqlalchemy import text
5
- from sqlalchemy.ext.asyncio import AsyncEngine, AsyncConnection, AsyncTransaction
4
+ from sqlalchemy.ext.asyncio import AsyncConnection, AsyncEngine, AsyncTransaction
5
+
6
+ from fastapi_startkit.masoniteorm.models.builder import QueryBuilder
6
7
 
7
8
 
8
9
  class Connection:
@@ -69,7 +70,6 @@ class Connection:
69
70
  async def reconnect(self) -> None:
70
71
  await self.close()
71
72
 
72
-
73
73
  @staticmethod
74
74
  def sql_alchemy_bindings(query: str, bindings: list | None = None):
75
75
  params = {}
@@ -84,8 +84,12 @@ class Connection:
84
84
  query, bindings = self.sql_alchemy_bindings(query, bindings)
85
85
 
86
86
  conn = await self.get_connection()
87
+ result = await conn.execute(text(query), bindings or {})
87
88
 
88
- return await conn.execute(text(query), bindings or {})
89
+ if not self.transactions:
90
+ await conn.commit()
91
+
92
+ return result
89
93
 
90
94
  async def execute(self, query: str, bindings: list | None = None):
91
95
  query, bindings = self.sql_alchemy_bindings(query, bindings)
@@ -103,6 +107,10 @@ class Connection:
103
107
 
104
108
  return getattr(result, "lastrowid", None)
105
109
 
110
+ async def insert_get_id(self, query: str, bindings: list | None = None) -> int | None:
111
+ result = await self.execute(query, bindings)
112
+ return getattr(result, "lastrowid", None)
113
+
106
114
  async def update(self, query: str, bindings: list | None = None) -> int:
107
115
  result = await self.execute(query, bindings)
108
116
 
@@ -114,13 +122,16 @@ class Connection:
114
122
 
115
123
  async def select(self, query: str, bindings: list | None = None) -> list[dict]:
116
124
  result = await self.run(query, bindings)
117
- keys = result.keys()
118
- return [dict(zip(keys, row)) for row in result.fetchall()]
125
+
126
+ return result.mappings().all()
119
127
 
120
128
  async def select_one(self, query: str, bindings: list | None = None) -> dict | None:
121
129
  result = await self.run(query, bindings)
122
130
  row = result.fetchone()
123
- return dict(zip(result.keys(), row)) if row else None
131
+ result_dict = dict(zip(result.keys(), row)) if row else None
132
+ if not self.transactions and self.connection is not None:
133
+ await self.connection.commit()
134
+ return result_dict
124
135
 
125
136
  async def statement(self, query: str, bindings: list | None = None) -> bool:
126
137
  query, bindings = self.sql_alchemy_bindings(query, bindings)
@@ -39,7 +39,7 @@ class DatabaseManager:
39
39
 
40
40
  return Schema(self)
41
41
 
42
- def clear(self):
42
+ async def clear(self):
43
43
  for conn in self.connections.values():
44
- conn.engine.dispose()
44
+ await conn.engine.dispose()
45
45
  self.connections.clear()
@@ -1,4 +1,3 @@
1
- from typing import Any
2
1
  from fastapi_startkit.masoniteorm.query.grammars import PostgresGrammar
3
2
  from fastapi_startkit.masoniteorm.query.processors import PostgresPostProcessor
4
3
  from fastapi_startkit.masoniteorm.schema.platforms import PostgresPlatform
@@ -8,6 +7,14 @@ from .connection import Connection
8
7
  class PostgresConnection(Connection):
9
8
  """Async PostgreSQL connection backed by asyncpg via SQLAlchemy."""
10
9
 
10
+ async def insert_get_id(self, query: str, bindings: list | None = None) -> int | None:
11
+ result = await self.run(query, bindings)
12
+ row = result.fetchone()
13
+ if not self.transactions:
14
+ conn = await self.get_connection()
15
+ await conn.commit()
16
+ return row[0] if row is not None else None
17
+
11
18
  @classmethod
12
19
  def get_query_grammar(cls):
13
20
  return PostgresGrammar
@@ -19,19 +26,3 @@ class PostgresConnection(Connection):
19
26
  @classmethod
20
27
  def get_post_processor(cls):
21
28
  return PostgresPostProcessor
22
-
23
- async def insert(self, query: str, bindings: list | None = None) -> Any:
24
- """Postgres uses RETURNING to get the inserted id/row."""
25
- query, params = self.sql_alchemy_bindings(query, bindings)
26
-
27
- from sqlalchemy import text
28
-
29
- async with self.engine.connect() as conn:
30
- result = await conn.execute(text(query), params)
31
- await conn.commit()
32
-
33
- row = result.fetchone()
34
- if row:
35
- return dict(zip(result.keys(), row))
36
-
37
- return None
@@ -3,9 +3,9 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  if TYPE_CHECKING:
6
- from fastapi_startkit.orm.connections.connection import Connection
7
- from fastapi_startkit.orm.connections.manager import DatabaseManager
8
- from fastapi_startkit.orm.models.builder import QueryBuilder
6
+ from fastapi_startkit.masoniteorm.connections.connection import Connection
7
+ from fastapi_startkit.masoniteorm.connections.manager import DatabaseManager
8
+ from fastapi_startkit.masoniteorm.models.builder import QueryBuilder
9
9
 
10
10
 
11
11
  class DB:
@@ -52,3 +52,15 @@ class DB:
52
52
  @classmethod
53
53
  async def statement(cls, query: str, bindings: list | None = None) -> bool:
54
54
  return await cls.instance().connection(None).statement(query, bindings)
55
+
56
+ @classmethod
57
+ async def begin_transaction(cls, name: str | None = None) -> None:
58
+ await cls.instance().connection(name).begin_transaction()
59
+
60
+ @classmethod
61
+ async def commit(cls, name: str | None = None) -> None:
62
+ await cls.instance().connection(name).commit_transaction()
63
+
64
+ @classmethod
65
+ async def rollback(cls, name: str | None = None) -> None:
66
+ await cls.instance().connection(name).rollback()
@@ -1,6 +1,5 @@
1
1
  import inspect
2
-
3
- from typing import TYPE_CHECKING
2
+ from typing import TYPE_CHECKING, Any
4
3
 
5
4
  from fastapi_startkit.masoniteorm.expressions.expressions import (
6
5
  JoinClause,
@@ -107,9 +106,9 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
107
106
  collection = self._model.hydrate(models)
108
107
 
109
108
  if (
110
- self._eager_relation.eagers
111
- or self._eager_relation.nested_eagers
112
- or self._eager_relation.callback_eagers
109
+ self._eager_relation.eagers
110
+ or self._eager_relation.nested_eagers
111
+ or self._eager_relation.callback_eagers
113
112
  ):
114
113
  await self._load_eagers(collection, self._model)
115
114
 
@@ -216,26 +215,27 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
216
215
  self._distinct = True
217
216
  return self
218
217
 
219
- def aggregate(self, aggregate_type: str, column: str, alias: str = None) -> "QueryBuilder":
220
- if alias:
221
- column = f"{column} as {alias}"
222
- self._aggregates += (AggregateExpression(aggregate_type, column),)
223
- return self
218
+ async def aggregate(self, function: str, column: str):
219
+ self._aggregates += (AggregateExpression(function, column),)
220
+ row = await self.connection.select_one(self.to_qmark(), self.get_bindings())
221
+ if row is None:
222
+ return None
223
+ return next(iter(row.values()))
224
224
 
225
- def count(self, column: str = "*") -> "QueryBuilder":
226
- return self.aggregate("COUNT", column)
225
+ async def count(self, column: str = "*"):
226
+ return await self.aggregate("COUNT", column)
227
227
 
228
- def sum(self, column: str) -> "QueryBuilder":
229
- return self.aggregate("SUM", column)
228
+ async def sum(self, column: str):
229
+ return await self.aggregate("SUM", column)
230
230
 
231
- def max(self, column: str) -> "QueryBuilder":
232
- return self.aggregate("MAX", column)
231
+ async def max(self, column: str):
232
+ return await self.aggregate("MAX", column)
233
233
 
234
- def min(self, column: str) -> "QueryBuilder":
235
- return self.aggregate("MIN", column)
234
+ async def min(self, column: str):
235
+ return await self.aggregate("MIN", column)
236
236
 
237
- def avg(self, column: str) -> "QueryBuilder":
238
- return self.aggregate("AVG", column)
237
+ async def avg(self, column: str):
238
+ return await self.aggregate("AVG", column)
239
239
 
240
240
  async def delete(self, column=None, value=None):
241
241
  if column is not None:
@@ -257,6 +257,15 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
257
257
 
258
258
  return await self.create({**(attributes or {}), **search})
259
259
 
260
+ async def update_or_create(self, search: dict, attributes: dict | None = None):
261
+ instance = await self.where(search).first()
262
+ if instance is not None:
263
+ if attributes:
264
+ await instance.update(attributes)
265
+ return instance
266
+
267
+ return await self.create({**(attributes or {}), **search})
268
+
260
269
  async def insert(self, values: dict | list) -> int | None:
261
270
  self.set_action("bulk_create")
262
271
 
@@ -275,6 +284,16 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
275
284
  bindings = [val for row in values for val in row.values()]
276
285
  return await self.connection.insert(sql, bindings)
277
286
 
287
+ async def insert_get_id(
288
+ self,
289
+ values: dict[str, Any] | list[dict[str, Any]],
290
+ sequences: str | None = None,
291
+ ) -> int | None:
292
+ sql = self.grammar().compile_insert_get_id(self, values, sequences)
293
+ bindings = self.clean_bindings(values)
294
+
295
+ return await self.connection.insert_get_id(sql, bindings)
296
+
278
297
  async def update(self, values: dict) -> int:
279
298
  updates = [UpdateQueryExpression(col, val) for col, val in values.items()]
280
299
  grammar = self.grammar()
@@ -290,9 +309,7 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
290
309
  count_builder._wheres = list(self._wheres)
291
310
  count_builder._joins = self._joins
292
311
  count_builder._global_scopes = self._global_scopes
293
- count_builder.count()
294
- count_result = await self.connection.select(count_builder.to_qmark(), count_builder.get_bindings())
295
- total = list(count_result[0].values())[0] if count_result else 0
312
+ total = await count_builder.count() or 0
296
313
 
297
314
  offset = (page - 1) * per_page
298
315
  results = await self.limit(per_page).offset(offset).get()
@@ -386,3 +403,9 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
386
403
  else:
387
404
  related.query_has(self, method="or_where_exists")
388
405
  return self
406
+
407
+ @classmethod
408
+ def clean_bindings(cls, values):
409
+ if isinstance(values, dict):
410
+ values = [values]
411
+ return [val for row in values for val in row.values()]
@@ -13,7 +13,7 @@ from fastapi_startkit.masoniteorm.models.attribute import Attribute
13
13
  from fastapi_startkit.masoniteorm.models.relationship import Relationship
14
14
 
15
15
  if TYPE_CHECKING:
16
- from fastapi_startkit.orm.models.builder import QueryBuilder
16
+ from fastapi_startkit.masoniteorm.models.builder import QueryBuilder
17
17
 
18
18
 
19
19
  class Model(Attribute, Relationship, ObservesEvents):
@@ -21,6 +21,7 @@ class Model(Attribute, Relationship, ObservesEvents):
21
21
  __table__ = None
22
22
  __primary_key__ = "id"
23
23
  __timestamps__ = True
24
+ __incrementing__ = True
24
25
 
25
26
  __has_events__ = True
26
27
  __observers__ = {}
@@ -118,6 +119,10 @@ class Model(Attribute, Relationship, ObservesEvents):
118
119
  async def all(cls):
119
120
  return await cls.query().get()
120
121
 
122
+ @classmethod
123
+ async def count(cls, column: str = "*"):
124
+ return await cls.query().count(column)
125
+
121
126
  def set_connection(self, connection: str):
122
127
  self.connection = connection
123
128
 
@@ -174,6 +179,12 @@ class Model(Attribute, Relationship, ObservesEvents):
174
179
  ) -> "Model":
175
180
  return await cls.query().first_or_create(search, attributes)
176
181
 
182
+ @classmethod
183
+ async def update_or_create(
184
+ cls, search: dict, attributes: dict | None = None
185
+ ) -> "Model":
186
+ return await cls.query().update_or_create(search, attributes)
187
+
177
188
  @classmethod
178
189
  async def create(cls, attributes: dict):
179
190
  instance = cls().new_model_instance(attributes)
@@ -215,12 +226,15 @@ class Model(Attribute, Relationship, ObservesEvents):
215
226
  async def perform_insert(self, query) -> bool:
216
227
  attributes = self.get_attributes_for_insert()
217
228
 
218
- inserted_id = await query.insert(attributes)
219
-
220
- # Store the auto-generated primary key so subsequent saves do an UPDATE
221
- if inserted_id is not None:
229
+ """if the model set auto incrementing, we need to set back the primary key to the inserted id."""
230
+ if self.__incrementing__:
231
+ inserted_id = await query.insert_get_id(attributes)
232
+ self._attributes[self.__primary_key__] = inserted_id
222
233
  self._dirty_attributes[self.__primary_key__] = inserted_id
223
234
 
235
+ else:
236
+ await query.insert(attributes)
237
+
224
238
  self._exists = True
225
239
  self._was_recently_created = True
226
240
  self.observe_events(self, "created")