fastapi-startkit 0.28.0__tar.gz → 0.30.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 (366) hide show
  1. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/PKG-INFO +1 -1
  2. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/pyproject.toml +26 -1
  3. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/publish_command.py +1 -1
  4. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/__init__.py +0 -2
  5. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/loader/Loader.py +1 -2
  6. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +4 -3
  7. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +1 -1
  8. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +1 -1
  9. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +13 -3
  10. fastapi_startkit-0.30.0/src/fastapi_startkit/logging/file.py +13 -0
  11. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +1 -1
  12. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +1 -1
  13. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/model.py +104 -0
  14. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/__init__.py +25 -0
  15. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/argument.py +20 -0
  16. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/prompt.py +45 -0
  17. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/protocol.py +143 -0
  18. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/providers/mcp_provider.py +19 -0
  19. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/request.py +19 -0
  20. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/resource.py +32 -0
  21. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/response.py +30 -0
  22. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/server.py +79 -0
  23. fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/tool.py +54 -0
  24. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/Provider.py +1 -1
  25. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/local.py +1 -1
  26. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/s3.py +1 -1
  27. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/file.py +1 -1
  28. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/filestream.py +1 -1
  29. fastapi_startkit-0.30.0/src/fastapi_startkit/storage/helper.py +33 -0
  30. fastapi_startkit-0.30.0/src/fastapi_startkit/support/__init__.py +4 -0
  31. {fastapi_startkit-0.28.0/src/fastapi_startkit/collection → fastapi_startkit-0.30.0/src/fastapi_startkit/support}/collection.py +10 -1
  32. fastapi_startkit-0.28.0/src/fastapi_startkit/collection/__init__.py +0 -1
  33. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/DD.py +0 -38
  34. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py +0 -70
  35. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/__init__.py +0 -38
  36. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/blocks.py +0 -101
  37. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py +0 -13
  38. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/solutions.py +0 -66
  39. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/tabs.py +0 -19
  40. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py +0 -102
  41. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py +0 -26
  42. fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py +0 -11
  43. fastapi_startkit-0.28.0/src/fastapi_startkit/facades/Auth.py +0 -5
  44. fastapi_startkit-0.28.0/src/fastapi_startkit/facades/Auth.pyi +0 -32
  45. fastapi_startkit-0.28.0/src/fastapi_startkit/facades/Inertia.py +0 -5
  46. fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  47. fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py +0 -66
  48. fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py +0 -119
  49. fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py +0 -29
  50. fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py +0 -57
  51. fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py +0 -70
  52. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/__init__.py +0 -0
  53. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/collections.py +0 -543
  54. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/console.py +0 -39
  55. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/filesystem.py +0 -100
  56. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/http.py +0 -100
  57. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/location.py +0 -91
  58. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/str.py +0 -116
  59. fastapi_startkit-0.28.0/src/fastapi_startkit/utils/time.py +0 -59
  60. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/.DS_Store +0 -0
  61. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/__init__.py +0 -0
  62. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/application.py +0 -0
  63. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  64. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  65. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/config/__init__.py +0 -0
  66. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/config/app.py +0 -0
  67. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  68. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  69. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/config.py +0 -0
  70. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  71. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  72. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  73. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/__init__.py +0 -0
  74. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/application.py +0 -0
  75. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  76. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  77. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/command.py +0 -0
  78. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/__init__.py +0 -0
  79. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/container.py +0 -0
  80. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  81. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/environment.py +0 -0
  82. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  83. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  84. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  85. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Broadcast.py +0 -0
  86. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  87. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Config.py +0 -0
  88. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  89. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  90. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  91. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  92. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  93. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  94. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  95. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  96. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  97. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  98. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  99. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  100. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  101. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  102. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  103. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  104. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  105. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  106. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Request.py +0 -0
  107. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  108. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.py +0 -0
  109. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  110. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Session.py +0 -0
  111. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  112. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Url.py +0 -0
  113. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  114. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/View.py +0 -0
  115. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  116. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  117. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  118. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  119. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  120. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
  121. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  122. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
  123. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
  124. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  125. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  126. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  127. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  128. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  129. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/helpers/app.py +0 -0
  130. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
  131. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  132. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  133. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/context.py +0 -0
  134. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
  135. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
  136. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  137. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/provider.py +0 -0
  138. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  139. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  140. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  141. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  142. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  143. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  144. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  145. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  146. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  147. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  148. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  149. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
  150. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  151. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  152. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  153. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  154. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  155. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/factory.py +0 -0
  156. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/handler.py +0 -0
  157. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  158. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/logger.py +0 -0
  159. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  160. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  161. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  162. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  163. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
  164. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  165. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  166. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  167. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  168. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
  169. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  170. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  171. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  172. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  173. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  174. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  175. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  176. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  177. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  178. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  179. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  180. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  181. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  182. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  183. {fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite → fastapi_startkit-0.30.0/src/fastapi_startkit/masoniteorm/config}/__init__.py +0 -0
  184. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
  185. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  186. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
  187. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
  188. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
  189. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  190. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  191. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  192. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  193. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  194. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  195. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
  196. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  197. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  198. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  199. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  200. {fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config → fastapi_startkit-0.30.0/src/fastapi_startkit/masoniteorm/helpers}/__init__.py +0 -0
  201. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  202. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  203. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
  204. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  205. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  206. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  207. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  208. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
  209. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  210. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  211. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  212. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  213. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  214. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  215. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  216. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  217. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  218. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  219. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  220. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  221. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  222. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  223. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  224. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  225. {fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm/config → fastapi_startkit-0.30.0/src/fastapi_startkit/masoniteorm/query}/__init__.py +0 -0
  226. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
  227. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  228. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  229. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  230. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  231. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  232. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  233. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  234. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  235. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  236. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  237. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  238. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  239. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  240. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  241. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  242. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  243. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  244. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  245. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  246. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  247. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  248. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  249. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  250. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  251. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  252. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  253. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  254. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  255. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  256. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  257. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  258. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  259. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  260. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  261. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  262. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  263. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  264. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  265. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
  266. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
  267. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
  268. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  269. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  270. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  271. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  272. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
  273. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
  274. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
  275. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
  276. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
  277. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
  278. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
  279. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
  280. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
  281. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
  282. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
  283. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
  284. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
  285. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
  286. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
  287. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
  288. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
  289. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
  290. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
  291. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
  292. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
  293. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
  294. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
  295. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
  296. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
  297. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
  298. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
  299. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py +0 -0
  300. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py +0 -0
  301. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py +0 -0
  302. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py +0 -0
  303. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
  304. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py +0 -0
  305. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py +0 -0
  306. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py +0 -0
  307. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py +0 -0
  308. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py +0 -0
  309. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
  310. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py +0 -0
  311. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
  312. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/connections/test_mysql_connection_selects.py +0 -0
  313. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py +0 -0
  314. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py +0 -0
  315. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
  316. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py +0 -0
  317. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py +0 -0
  318. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py +0 -0
  319. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
  320. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py +0 -0
  321. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py +0 -0
  322. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py +0 -0
  323. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
  324. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py +0 -0
  325. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py +0 -0
  326. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py +0 -0
  327. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py +0 -0
  328. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
  329. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py +0 -0
  330. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
  331. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
  332. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
  333. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
  334. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
  335. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
  336. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py +0 -0
  337. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py +0 -0
  338. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
  339. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
  340. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
  341. {fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm/helpers → fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/providers}/__init__.py +0 -0
  342. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/__init__.py +0 -0
  343. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
  344. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  345. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
  346. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
  347. {fastapi_startkit-0.28.0/src/fastapi_startkit/utils → fastapi_startkit-0.30.0/src/fastapi_startkit/storage}/data/mime.types +0 -0
  348. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
  349. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  350. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  351. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/storage.py +0 -0
  352. {fastapi_startkit-0.28.0/src/fastapi_startkit/helpers → fastapi_startkit-0.30.0/src/fastapi_startkit/support}/string.py +0 -0
  353. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  354. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  355. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/utils/structures.py +0 -0
  356. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  357. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
  358. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  359. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  360. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  361. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  362. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  363. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/templates/index.html +0 -0
  364. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  365. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  366. {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.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.28.0
3
+ Version: 0.30.0
4
4
  Summary: Fastapi Starter kit components
5
5
  Author: Bedram Tamang
6
6
  Author-email: Bedram Tamang <tmgbedu@gmail.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.28.0"
3
+ version = "0.30.0"
4
4
  description = "Fastapi Starter kit components"
5
5
  authors = [
6
6
  {name = "Bedram Tamang", email = "tmgbedu@gmail.com"}
@@ -52,6 +52,7 @@ dev = [
52
52
  "dumpdie>=1.5.0",
53
53
  "pytest>=9.0.3",
54
54
  "pytest-asyncio>=1.3.0",
55
+ "pytest-cov>=6.0.0",
55
56
  "ruff>=0.9.0",
56
57
  "twine>=6.2.0",
57
58
  "itsdangerous>=2.2.0",
@@ -75,6 +76,30 @@ fixable = ["F401"]
75
76
 
76
77
  [tool.pytest.ini_options]
77
78
  asyncio_mode = "auto"
79
+ norecursedirs = ["masoniteorm.backup", ".venv", "dist", "build", "__pycache__"]
80
+
81
+ [tool.coverage.run]
82
+ source = ["src/fastapi_startkit"]
83
+ omit = [
84
+ "*/tests/*",
85
+ "*/migrations/*",
86
+ "*/__init__.py",
87
+ "*.pyi",
88
+ ]
89
+
90
+ [tool.coverage.report]
91
+ show_missing = true
92
+ skip_covered = false
93
+ fail_under = 50
94
+ exclude_lines = [
95
+ "pragma: no cover",
96
+ "if TYPE_CHECKING:",
97
+ "raise NotImplementedError",
98
+ "@abstractmethod",
99
+ ]
100
+
101
+ [tool.coverage.html]
102
+ directory = "htmlcov"
78
103
 
79
104
  [build-system]
80
105
  requires = ["uv_build >= 0.10.10, <0.11.0"]
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING
4
4
 
5
5
  from fastapi_startkit.console import Command
6
6
  from cleo.helpers import option
7
- from fastapi_startkit.helpers.string import Str
7
+ from fastapi_startkit.support import Str
8
8
 
9
9
  if TYPE_CHECKING:
10
10
  from fastapi_startkit.application import Application
@@ -7,7 +7,6 @@ from .Url import Url
7
7
  from .Session import Session
8
8
  from .View import View
9
9
  from .Gate import Gate
10
- from .Auth import Auth
11
10
  from .Config import Config
12
11
  from .Loader import Loader
13
12
  from .Notification import Notification
@@ -16,4 +15,3 @@ from .Queue import Queue
16
15
  from .Cache import Cache
17
16
  from .RateLimiter import RateLimiter
18
17
  from .Broadcast import Broadcast
19
- from .Inertia import Inertia
@@ -4,7 +4,6 @@ import inspect
4
4
  import pkgutil
5
5
 
6
6
  from ..exceptions import LoaderNotFound
7
- from ..utils.str import as_filepath
8
7
  from ..utils.structures import load
9
8
 
10
9
 
@@ -18,7 +17,7 @@ class Loader:
18
17
  files_or_directories = [files_or_directories]
19
18
 
20
19
  _modules = {}
21
- module_paths = list(map(as_filepath, files_or_directories))
20
+ module_paths = list(map(lambda p: p.replace(".", "/"), files_or_directories))
22
21
  for module_loader, name, _ in pkgutil.iter_modules(module_paths):
23
22
  module = load(
24
23
  f"{module_loader.path}/{name}.py",
@@ -1,8 +1,9 @@
1
- from ..factory import DriverFactory
2
- from fastapi_startkit.facades import Config
3
- from fastapi_startkit.utils.filesystem import make_directory
4
1
  import os
2
+
3
+ from fastapi_startkit.facades import Config
5
4
  from .BaseChannel import BaseChannel
5
+ from ..factory import DriverFactory
6
+ from ..file import make_directory
6
7
 
7
8
 
8
9
  class DailyChannel(BaseChannel):
@@ -1,6 +1,6 @@
1
1
  from ..factory import DriverFactory
2
2
  from fastapi_startkit.facades import Config
3
- from fastapi_startkit.utils.filesystem import make_directory
3
+ from ..file import make_directory
4
4
  from .BaseChannel import BaseChannel
5
5
 
6
6
 
@@ -1,6 +1,6 @@
1
1
  from ..factory import DriverFactory
2
2
  from fastapi_startkit.facades import Config
3
- from fastapi_startkit.utils.filesystem import make_directory
3
+ from ..file import make_directory
4
4
  from .BaseChannel import BaseChannel
5
5
 
6
6
 
@@ -1,8 +1,18 @@
1
- # from logging import Logger
1
+ from .BaseDriver import BaseDriver
2
2
 
3
- from fastapi_startkit.utils.console import HasColoredOutput
4
3
 
5
- from .BaseDriver import BaseDriver
4
+ class HasColoredOutput:
5
+ def success(self, message):
6
+ print("\033[92m {0} \033[0m".format(message))
7
+
8
+ def warning(self, message):
9
+ print("\033[93m {0} \033[0m".format(message))
10
+
11
+ def danger(self, message):
12
+ print("\033[91m {0} \033[0m".format(message))
13
+
14
+ def info(self, message):
15
+ return self.success(message)
6
16
 
7
17
 
8
18
  class LogTerminalDriver(BaseDriver, HasColoredOutput):
@@ -0,0 +1,13 @@
1
+ import os
2
+
3
+
4
+ def make_directory(directory):
5
+ """Create a directory at the given path for a file if it does not exist"""
6
+ if not os.path.isfile(directory):
7
+ if not os.path.exists(os.path.dirname(directory)):
8
+ # Create the path to the model if it does not exist
9
+ os.makedirs(os.path.dirname(directory))
10
+
11
+ return True
12
+
13
+ return False
@@ -1,4 +1,4 @@
1
- from fastapi_startkit.collection import Collection as BaseCollection
1
+ from fastapi_startkit.support.collection import Collection as BaseCollection
2
2
 
3
3
 
4
4
  class Collection(BaseCollection):
@@ -3,7 +3,7 @@ import os
3
3
  import pathlib
4
4
  from inflection import tableize
5
5
  from cleo.helpers import argument, option
6
- from fastapi_startkit.helpers.string import Str
6
+ from fastapi_startkit.support import Str
7
7
  from fastapi_startkit.console import Command
8
8
 
9
9
 
@@ -91,6 +91,110 @@ class Model(Attribute, Relationship, ObservesEvents):
91
91
  def with_(cls, *eagers) -> "QueryBuilder":
92
92
  return cls.query().with_(*eagers)
93
93
 
94
+ @classmethod
95
+ def where(cls, column, *args) -> "QueryBuilder":
96
+ return cls.query().where(column, *args)
97
+
98
+ @classmethod
99
+ def or_where(cls, column, *args) -> "QueryBuilder":
100
+ return cls.query().or_where(column, *args)
101
+
102
+ @classmethod
103
+ def where_null(cls, column: str) -> "QueryBuilder":
104
+ return cls.query().where_null(column)
105
+
106
+ @classmethod
107
+ def where_not_null(cls, column: str) -> "QueryBuilder":
108
+ return cls.query().where_not_null(column)
109
+
110
+ @classmethod
111
+ def where_in(cls, column: str, values) -> "QueryBuilder":
112
+ return cls.query().where_in(column, values)
113
+
114
+ @classmethod
115
+ def where_not_in(cls, column: str, values) -> "QueryBuilder":
116
+ return cls.query().where_not_in(column, values)
117
+
118
+ @classmethod
119
+ def select(cls, *args) -> "QueryBuilder":
120
+ return cls.query().select(*args)
121
+
122
+ @classmethod
123
+ def limit(cls, limit: int) -> "QueryBuilder":
124
+ return cls.query().limit(limit)
125
+
126
+ @classmethod
127
+ def offset(cls, offset: int) -> "QueryBuilder":
128
+ return cls.query().offset(offset)
129
+
130
+ @classmethod
131
+ def order_by(cls, column: str, direction: str = "asc") -> "QueryBuilder":
132
+ return cls.query().order_by(column, direction)
133
+
134
+ @classmethod
135
+ def order_by_raw(cls, expression: str) -> "QueryBuilder":
136
+ return cls.query().order_by_raw(expression)
137
+
138
+ @classmethod
139
+ def latest(cls, column: str = "created_at") -> "QueryBuilder":
140
+ return cls.query().latest(column)
141
+
142
+ @classmethod
143
+ def oldest(cls, column: str = "created_at") -> "QueryBuilder":
144
+ return cls.query().oldest(column)
145
+
146
+ @classmethod
147
+ def group_by(cls, column: str) -> "QueryBuilder":
148
+ return cls.query().group_by(column)
149
+
150
+ @classmethod
151
+ def group_by_raw(cls, expression: str) -> "QueryBuilder":
152
+ return cls.query().group_by_raw(expression)
153
+
154
+ @classmethod
155
+ def having(cls, column: str, equality: str, value) -> "QueryBuilder":
156
+ return cls.query().having(column, equality, value)
157
+
158
+ @classmethod
159
+ def between(cls, column: str, low, high) -> "QueryBuilder":
160
+ return cls.query().between(column, low, high)
161
+
162
+ @classmethod
163
+ def not_between(cls, column: str, low, high) -> "QueryBuilder":
164
+ return cls.query().not_between(column, low, high)
165
+
166
+ @classmethod
167
+ def distinct(cls) -> "QueryBuilder":
168
+ return cls.query().distinct()
169
+
170
+ @classmethod
171
+ def join(cls, table: str, column1: str, equality: str, column2: str, clause: str = "join") -> "QueryBuilder":
172
+ return cls.query().join(table, column1, equality, column2, clause)
173
+
174
+ @classmethod
175
+ def left_join(cls, table: str, column1: str, equality: str, column2: str) -> "QueryBuilder":
176
+ return cls.query().left_join(table, column1, equality, column2)
177
+
178
+ @classmethod
179
+ def right_join(cls, table: str, column1: str, equality: str, column2: str) -> "QueryBuilder":
180
+ return cls.query().right_join(table, column1, equality, column2)
181
+
182
+ @classmethod
183
+ def where_column(cls, column1: str, column2: str) -> "QueryBuilder":
184
+ return cls.query().where_column(column1, column2)
185
+
186
+ @classmethod
187
+ def when(cls, condition, callback) -> "QueryBuilder":
188
+ return cls.query().when(condition, callback)
189
+
190
+ @classmethod
191
+ def where_exists(cls, builder: "QueryBuilder") -> "QueryBuilder":
192
+ return cls.query().where_exists(builder)
193
+
194
+ @classmethod
195
+ def or_where_exists(cls, builder: "QueryBuilder") -> "QueryBuilder":
196
+ return cls.query().or_where_exists(builder)
197
+
94
198
  @classmethod
95
199
  def where_has(cls, relation: str, callback=None) -> "QueryBuilder":
96
200
  return cls.query().where_has(relation, callback)
@@ -0,0 +1,25 @@
1
+ """FastAPI Startkit MCP module.
2
+
3
+ Provides class-based building blocks for Model Context Protocol (MCP) servers
4
+ that can be mounted directly on any FastAPI application.
5
+ """
6
+
7
+ from .argument import Argument
8
+ from .prompt import Prompt
9
+ from .request import JsonRpcRequest
10
+ from .resource import Resource
11
+ from .response import Response
12
+ from .server import Server
13
+ from .tool import Tool
14
+ from .providers.mcp_provider import McpProvider
15
+
16
+ __all__ = [
17
+ "Argument",
18
+ "JsonRpcRequest",
19
+ "McpProvider",
20
+ "Prompt",
21
+ "Resource",
22
+ "Response",
23
+ "Server",
24
+ "Tool",
25
+ ]
@@ -0,0 +1,20 @@
1
+ """Argument dataclass for MCP prompt arguments."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from typing import Optional
5
+
6
+
7
+ @dataclass
8
+ class Argument:
9
+ """Represents a single argument accepted by a Prompt."""
10
+
11
+ name: str
12
+ description: Optional[str] = field(default=None)
13
+ required: bool = field(default=False)
14
+
15
+ def to_json(self) -> dict:
16
+ """Serialise to MCP-compatible JSON."""
17
+ data: dict = {"name": self.name, "required": self.required}
18
+ if self.description is not None:
19
+ data["description"] = self.description
20
+ return data
@@ -0,0 +1,45 @@
1
+ """Abstract base class for MCP prompts."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import Optional
5
+
6
+ from .argument import Argument
7
+ from .response import Response
8
+
9
+
10
+ class Prompt(ABC):
11
+ """Base class for MCP prompts.
12
+
13
+ Subclasses must set ``name`` and implement ``handle()``.
14
+ Override ``arguments()`` to declare accepted arguments.
15
+ Override ``should_register()`` to conditionally skip registration.
16
+ """
17
+
18
+ name: str
19
+ description: Optional[str] = None
20
+ title: Optional[str] = None
21
+
22
+ def arguments(self) -> list[Argument]:
23
+ """Return the list of arguments this prompt accepts."""
24
+ return []
25
+
26
+ def should_register(self) -> bool:
27
+ """Return False to prevent this prompt from being registered."""
28
+ return True
29
+
30
+ @abstractmethod
31
+ async def handle(self, arguments: dict) -> Response:
32
+ """Render the prompt with the given arguments and return a Response."""
33
+ raise NotImplementedError
34
+
35
+ def to_json(self) -> dict:
36
+ """Serialise to the MCP prompts/list format."""
37
+ data: dict = {"name": self.name}
38
+ if self.description is not None:
39
+ data["description"] = self.description
40
+ if self.title is not None:
41
+ data["title"] = self.title
42
+ args = self.arguments()
43
+ if args:
44
+ data["arguments"] = [arg.to_json() for arg in args]
45
+ return data
@@ -0,0 +1,143 @@
1
+ """Internal JSON-RPC 2.0 dispatcher for MCP."""
2
+
3
+ from typing import Any, Optional, TYPE_CHECKING
4
+
5
+ if TYPE_CHECKING:
6
+ from .server import Server
7
+
8
+
9
+ MCP_PROTOCOL_VERSION = "2024-11-05"
10
+
11
+
12
+ class Protocol:
13
+ """Dispatches JSON-RPC 2.0 method calls to MCP handlers.
14
+
15
+ Handles the following methods:
16
+ - initialize
17
+ - tools/list
18
+ - tools/call
19
+ - prompts/list
20
+ - prompts/get
21
+ - resources/list
22
+ - resources/read
23
+ """
24
+
25
+ def __init__(self, server: "Server") -> None:
26
+ self._server = server
27
+
28
+ # ------------------------------------------------------------------
29
+ # Public dispatch entry point
30
+ # ------------------------------------------------------------------
31
+
32
+ async def dispatch(self, method: str, params: Optional[dict], request_id: Any) -> dict:
33
+ """Dispatch a JSON-RPC method and return a full JSON-RPC response dict."""
34
+ handler = {
35
+ "initialize": self._initialize,
36
+ "tools/list": self._tools_list,
37
+ "tools/call": self._tools_call,
38
+ "prompts/list": self._prompts_list,
39
+ "prompts/get": self._prompts_get,
40
+ "resources/list": self._resources_list,
41
+ "resources/read": self._resources_read,
42
+ }.get(method)
43
+
44
+ if handler is None:
45
+ return self._error(request_id, -32601, f"Method not found: {method}")
46
+
47
+ try:
48
+ result = await handler(params or {})
49
+ return {"jsonrpc": "2.0", "id": request_id, "result": result}
50
+ except Exception as exc: # pragma: no cover
51
+ return self._error(request_id, -32000, str(exc))
52
+
53
+ # ------------------------------------------------------------------
54
+ # Handlers
55
+ # ------------------------------------------------------------------
56
+
57
+ async def _initialize(self, params: dict) -> dict:
58
+ server = self._server
59
+ result: dict = {
60
+ "protocolVersion": MCP_PROTOCOL_VERSION,
61
+ "serverInfo": {"name": server.name, "version": "1.0"},
62
+ "capabilities": {
63
+ "tools": {"listChanged": False},
64
+ "prompts": {"listChanged": False},
65
+ "resources": {"listChanged": False},
66
+ },
67
+ }
68
+ if getattr(server, "description", None):
69
+ result["description"] = server.description
70
+ if getattr(server, "instructions", None):
71
+ result["instructions"] = server.instructions
72
+ return result
73
+
74
+ async def _tools_list(self, params: dict) -> dict:
75
+ tools = self._server.tools() or []
76
+ return {"tools": [t().to_json() for t in tools]}
77
+
78
+ async def _tools_call(self, params: dict) -> dict:
79
+ name = params.get("name")
80
+ arguments = params.get("arguments") or {}
81
+ tools = self._server.tools() or []
82
+ for tool_cls in tools:
83
+ tool = tool_cls()
84
+ if tool.name == name:
85
+ response = await tool.handle(arguments)
86
+ return {"content": response.to_content()}
87
+ return self._error_result(-32602, f"Tool not found: {name}")
88
+
89
+ async def _prompts_list(self, params: dict) -> dict:
90
+ prompts = self._server.prompts() or []
91
+ registered = [p().to_json() for p in prompts if p().should_register()]
92
+ return {"prompts": registered}
93
+
94
+ async def _prompts_get(self, params: dict) -> dict:
95
+ name = params.get("name")
96
+ arguments = params.get("arguments") or {}
97
+ prompts = self._server.prompts() or []
98
+ for prompt_cls in prompts:
99
+ prompt = prompt_cls()
100
+ if prompt.name == name and prompt.should_register():
101
+ response = await prompt.handle(arguments)
102
+ messages = [{"role": "user", "content": item} for item in response.to_content()]
103
+ return {"messages": messages}
104
+ return self._error_result(-32602, f"Prompt not found: {name}")
105
+
106
+ async def _resources_list(self, params: dict) -> dict:
107
+ resources = self._server.resources() or []
108
+ return {"resources": [r().to_json() for r in resources]}
109
+
110
+ async def _resources_read(self, params: dict) -> dict:
111
+ uri = params.get("uri")
112
+ resources = self._server.resources() or []
113
+ for resource_cls in resources:
114
+ resource = resource_cls()
115
+ if resource.uri == uri:
116
+ content = await resource.read()
117
+ return {
118
+ "contents": [
119
+ {
120
+ "uri": resource.uri,
121
+ "mimeType": resource.mime_type,
122
+ "text": content,
123
+ }
124
+ ]
125
+ }
126
+ return self._error_result(-32602, f"Resource not found: {uri}")
127
+
128
+ # ------------------------------------------------------------------
129
+ # Helpers
130
+ # ------------------------------------------------------------------
131
+
132
+ @staticmethod
133
+ def _error(request_id: Any, code: int, message: str) -> dict:
134
+ return {
135
+ "jsonrpc": "2.0",
136
+ "id": request_id,
137
+ "error": {"code": code, "message": message},
138
+ }
139
+
140
+ @staticmethod
141
+ def _error_result(code: int, message: str) -> dict:
142
+ """Return an error payload as a *result* (for tool/prompt/resource not found)."""
143
+ return {"error": {"code": code, "message": message}}
@@ -0,0 +1,19 @@
1
+ from fastapi_startkit.providers import Provider
2
+
3
+
4
+ class McpProvider(Provider):
5
+ """Provider that bootstraps the MCP component for fastapi-startkit.
6
+
7
+ Register it alongside ``FastAPIProvider`` to make MCP available in
8
+ your application::
9
+
10
+ app = Application(providers=[FastAPIProvider, McpProvider])
11
+ """
12
+
13
+ provider_key = "mcp"
14
+
15
+ def register(self) -> None:
16
+ """Register MCP bindings into the container."""
17
+
18
+ def boot(self) -> None:
19
+ """Boot the MCP component."""
@@ -0,0 +1,19 @@
1
+ """JSON-RPC 2.0 request model."""
2
+
3
+ from typing import Any, Optional, Union
4
+
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class JsonRpcRequest(BaseModel):
9
+ """Represents a JSON-RPC 2.0 request or notification."""
10
+
11
+ jsonrpc: str = "2.0"
12
+ method: str
13
+ params: Optional[dict[str, Any]] = None
14
+ id: Optional[Union[str, int]] = None
15
+
16
+ @property
17
+ def is_notification(self) -> bool:
18
+ """Return True when the request has no id (i.e. it is a notification)."""
19
+ return self.id is None
@@ -0,0 +1,32 @@
1
+ """Abstract base class for MCP resources."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import Optional
5
+
6
+
7
+ class Resource(ABC):
8
+ """Base class for MCP resources.
9
+
10
+ Subclasses must set ``uri`` and ``name``, and implement ``read()``.
11
+ """
12
+
13
+ uri: str
14
+ name: str
15
+ description: Optional[str] = None
16
+ mime_type: str = "text/plain"
17
+
18
+ @abstractmethod
19
+ async def read(self, **kwargs) -> str:
20
+ """Return the resource content as a string."""
21
+ raise NotImplementedError
22
+
23
+ def to_json(self) -> dict:
24
+ """Serialise to the MCP resources/list format."""
25
+ data: dict = {
26
+ "uri": self.uri,
27
+ "name": self.name,
28
+ "mimeType": self.mime_type,
29
+ }
30
+ if self.description is not None:
31
+ data["description"] = self.description
32
+ return data
@@ -0,0 +1,30 @@
1
+ """Response wrapper for MCP tool and prompt outputs."""
2
+
3
+ import json
4
+ from typing import Any
5
+
6
+
7
+ class Response:
8
+ """Wraps tool/prompt output into MCP content format."""
9
+
10
+ def __init__(self, content: list[dict]) -> None:
11
+ self._content = content
12
+
13
+ @classmethod
14
+ def text(cls, value: str) -> "Response":
15
+ """Create a plain-text response."""
16
+ return cls([{"type": "text", "text": value}])
17
+
18
+ @classmethod
19
+ def structure(cls, data: dict[str, Any]) -> "Response":
20
+ """Create a structured (resource-type) response."""
21
+ return cls([{"type": "resource", "resource": {"text": json.dumps(data), "mimeType": "application/json"}}])
22
+
23
+ @classmethod
24
+ def empty(cls) -> "Response":
25
+ """Create an empty response with no content."""
26
+ return cls([])
27
+
28
+ def to_content(self) -> list[dict]:
29
+ """Return the raw content list."""
30
+ return self._content