fastapi-startkit 0.29.0__tar.gz → 0.31.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 (338) hide show
  1. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/PKG-INFO +1 -1
  2. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/pyproject.toml +1 -1
  3. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +4 -0
  4. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/builder.py +6 -4
  5. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +23 -2
  6. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/__init__.py +25 -0
  7. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/argument.py +20 -0
  8. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/prompt.py +45 -0
  9. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/protocol.py +143 -0
  10. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  11. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/providers/mcp_provider.py +19 -0
  12. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/request.py +19 -0
  13. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/resource.py +32 -0
  14. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/response.py +30 -0
  15. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/server.py +79 -0
  16. fastapi_startkit-0.31.0/src/fastapi_startkit/mcp/tool.py +54 -0
  17. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/.DS_Store +0 -0
  18. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/__init__.py +0 -0
  19. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/application.py +0 -0
  20. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  21. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  22. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/config/__init__.py +0 -0
  23. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/config/app.py +0 -0
  24. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  25. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  26. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/configuration/config.py +0 -0
  27. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  28. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  29. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  30. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/console/__init__.py +0 -0
  31. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/console/application.py +0 -0
  32. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  33. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  34. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/console/command.py +0 -0
  35. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  36. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/container/__init__.py +0 -0
  37. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/container/container.py +0 -0
  38. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  39. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/environment/environment.py +0 -0
  40. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  41. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  42. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  43. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Broadcast.py +0 -0
  44. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  45. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Config.py +0 -0
  46. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  47. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  48. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  49. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  50. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  51. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  52. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  53. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  54. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  55. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  56. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  57. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  58. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  59. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  60. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  61. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  62. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  63. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  64. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Request.py +0 -0
  65. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  66. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Response.py +0 -0
  67. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  68. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Session.py +0 -0
  69. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  70. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Url.py +0 -0
  71. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  72. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/View.py +0 -0
  73. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  74. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  75. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  76. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/facades/__init__.py +0 -0
  77. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  78. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  79. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
  80. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  81. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
  82. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
  83. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  84. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  85. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  86. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  87. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  88. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/helpers/app.py +0 -0
  89. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
  90. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  91. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  92. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/inertia/context.py +0 -0
  93. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
  94. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
  95. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  96. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/inertia/provider.py +0 -0
  97. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  98. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  99. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  100. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  101. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  102. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  103. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  104. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  105. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  106. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  107. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  108. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  109. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  110. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  111. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  112. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
  113. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  114. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  115. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  116. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  117. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
  118. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  119. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/factory.py +0 -0
  120. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/file.py +0 -0
  121. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/handler.py +0 -0
  122. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  123. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/logger.py +0 -0
  124. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  125. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  126. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  127. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  128. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
  129. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  130. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  131. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  132. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  133. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  134. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  135. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
  136. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  137. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  138. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  139. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  140. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  141. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  142. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  143. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  144. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  145. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  146. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  147. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  148. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  149. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  150. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  151. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
  152. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  153. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
  154. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
  155. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
  156. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  157. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  158. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  159. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  160. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  161. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  162. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
  163. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  164. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  165. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  166. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  167. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  168. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  169. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  170. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  171. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  172. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  173. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  174. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  175. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  176. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
  177. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  178. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  179. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  180. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  181. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  182. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  183. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  184. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  185. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  186. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  187. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  188. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  189. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  190. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  191. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  192. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
  193. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  194. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  195. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  196. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  197. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  198. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  199. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  200. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  201. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  202. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  203. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  204. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  205. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  206. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  207. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  208. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  209. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  210. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  211. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  212. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  213. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  214. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  215. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  216. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  217. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  218. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  219. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  220. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  221. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  222. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  223. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  224. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  225. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  226. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  227. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  228. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  229. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  230. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
  231. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
  232. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
  233. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  234. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  235. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  236. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  237. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
  238. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
  239. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
  240. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
  241. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
  242. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
  243. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
  244. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
  245. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
  246. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
  247. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
  248. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
  249. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
  250. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
  251. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
  252. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
  253. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
  254. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
  255. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
  256. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
  257. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
  258. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
  259. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
  260. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
  261. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
  262. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
  263. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
  264. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py +0 -0
  265. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py +0 -0
  266. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py +0 -0
  267. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py +0 -0
  268. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
  269. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py +0 -0
  270. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py +0 -0
  271. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py +0 -0
  272. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py +0 -0
  273. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py +0 -0
  274. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
  275. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py +0 -0
  276. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
  277. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/connections/test_mysql_connection_selects.py +0 -0
  278. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py +0 -0
  279. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py +0 -0
  280. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
  281. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py +0 -0
  282. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py +0 -0
  283. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py +0 -0
  284. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
  285. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py +0 -0
  286. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py +0 -0
  287. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py +0 -0
  288. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
  289. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py +0 -0
  290. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py +0 -0
  291. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py +0 -0
  292. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py +0 -0
  293. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
  294. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py +0 -0
  295. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
  296. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
  297. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
  298. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
  299. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
  300. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
  301. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py +0 -0
  302. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py +0 -0
  303. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
  304. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
  305. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
  306. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/providers/Provider.py +0 -0
  307. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/providers/__init__.py +0 -0
  308. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
  309. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  310. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
  311. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
  312. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  313. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
  314. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  315. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  316. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  317. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/file.py +0 -0
  318. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  319. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/helper.py +0 -0
  320. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  321. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/storage/storage.py +0 -0
  322. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/support/__init__.py +0 -0
  323. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/support/collection.py +0 -0
  324. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/support/string.py +0 -0
  325. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  326. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  327. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/utils/structures.py +0 -0
  328. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/__init__.py +0 -0
  329. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
  330. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  331. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
  332. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  333. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  334. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  335. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/stubs/templates/index.html +0 -0
  336. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  337. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  338. {fastapi_startkit-0.29.0 → fastapi_startkit-0.31.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.29.0
3
+ Version: 0.31.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.29.0"
3
+ version = "0.31.0"
4
4
  description = "Fastapi Starter kit components"
5
5
  authors = [
6
6
  {name = "Bedram Tamang", email = "tmgbedu@gmail.com"}
@@ -243,6 +243,8 @@ class Migrator:
243
243
  await self.reset(migration)
244
244
  await self.migrate(migration)
245
245
 
246
+ _SQLITE_SYSTEM_TABLES = {"sqlite_sequence", "sqlite_stat1", "sqlite_stat2", "sqlite_stat3", "sqlite_stat4"}
247
+
246
248
  async def drop_all_tables(self, ignore_fk=False):
247
249
  if self.command_class:
248
250
  self.command_class.line("<comment>Dropping all tables</comment>")
@@ -251,6 +253,8 @@ class Migrator:
251
253
  await self.schema.disable_foreign_key_constraints()
252
254
 
253
255
  for table in await self.schema.get_all_tables():
256
+ if table in self._SQLITE_SYSTEM_TABLES or table.startswith("sqlite_"):
257
+ continue
254
258
  await self.schema.drop(table)
255
259
 
256
260
  if ignore_fk:
@@ -92,9 +92,7 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
92
92
 
93
93
  result = await self.find(primary_key, columns)
94
94
  if result is None:
95
- raise ModelNotFoundException(
96
- f"{self._model.__class__.__name__} with primary key {primary_key!r} not found."
97
- )
95
+ raise ModelNotFoundException(f"{type(self._model).__name__} with primary key {primary_key!r} not found.")
98
96
  return result
99
97
 
100
98
  async def first_or_fail(self, columns=None):
@@ -102,7 +100,7 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
102
100
 
103
101
  result = await self.first(columns)
104
102
  if result is None:
105
- raise ModelNotFoundException(f"{self._model.__name__} not found.")
103
+ raise ModelNotFoundException(f"{type(self._model).__name__} not found.")
106
104
  return result
107
105
 
108
106
  async def first(self, columns=None):
@@ -239,6 +237,10 @@ class QueryBuilder(EagerLoadMixin, SupportMixin):
239
237
  async def count(self, column: str = "*"):
240
238
  return await self.aggregate("COUNT", column)
241
239
 
240
+ async def exists(self) -> bool:
241
+ """Return True if any record matches the current query, False otherwise."""
242
+ return (await self.count() or 0) > 0
243
+
242
244
  async def sum(self, column: str):
243
245
  return await self.aggregate("SUM", column)
244
246
 
@@ -63,16 +63,32 @@ class SQLitePlatform(Platform):
63
63
 
64
64
  premapped_nulls = {True: "NULL", False: "NOT NULL"}
65
65
 
66
+ _autoincrement_types = {"big_increments", "increments"}
67
+
66
68
  def compile_create_sql(self, table, if_not_exists=False):
67
69
  sql = []
68
70
  table_create_format = self.create_if_not_exists_format() if if_not_exists else self.create_format()
71
+
72
+ # Exclude the PRIMARY KEY table constraint for autoincrement columns — it is
73
+ # emitted inline as INTEGER PRIMARY KEY AUTOINCREMENT instead.
74
+ autoincrement_cols = {
75
+ col_name
76
+ for col_name, col in table.get_added_columns().items()
77
+ if col.column_type in self._autoincrement_types
78
+ }
79
+ non_autoincrement_constraints = {
80
+ k: v
81
+ for k, v in table.get_added_constraints().items()
82
+ if not (v.constraint_type == "primary_key" and set(v.columns) & autoincrement_cols)
83
+ }
84
+
69
85
  sql.append(
70
86
  table_create_format.format(
71
87
  table=self.get_table_string().format(table=table.name).strip(),
72
88
  columns=", ".join(self.columnize(table.get_added_columns())).strip(),
73
89
  constraints=(
74
- ", " + ", ".join(self.constraintize(table.get_added_constraints()))
75
- if table.get_added_constraints()
90
+ ", " + ", ".join(self.constraintize(non_autoincrement_constraints))
91
+ if non_autoincrement_constraints
76
92
  else ""
77
93
  ),
78
94
  foreign_keys=(
@@ -92,6 +108,11 @@ class SQLitePlatform(Platform):
92
108
  def columnize(self, columns):
93
109
  sql = []
94
110
  for name, column in columns.items():
111
+ # SQLite requires AUTOINCREMENT inline: INTEGER PRIMARY KEY AUTOINCREMENT
112
+ if column.column_type in self._autoincrement_types:
113
+ sql.append(f"{self.wrap_column(column.name)} INTEGER PRIMARY KEY AUTOINCREMENT")
114
+ continue
115
+
95
116
  if column.length:
96
117
  length = self.create_column_length(column.column_type).format(length=column.length)
97
118
  else:
@@ -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
@@ -0,0 +1,79 @@
1
+ """MCP Server base class."""
2
+
3
+ from typing import Optional, Type
4
+
5
+ from fastapi import APIRouter, Request
6
+ from fastapi.responses import JSONResponse, Response as StarletteResponse
7
+
8
+ from .protocol import Protocol
9
+ from .request import JsonRpcRequest
10
+ from .tool import Tool
11
+ from .prompt import Prompt
12
+ from .resource import Resource
13
+
14
+
15
+ class Server:
16
+ """Base class for MCP servers.
17
+
18
+ Subclasses must set ``name`` and override ``tools()``, ``prompts()``,
19
+ and/or ``resources()`` to register capabilities.
20
+
21
+ Usage::
22
+
23
+ class MyServer(Server):
24
+ name = "my-server"
25
+
26
+ def tools(self):
27
+ return [AddTool]
28
+
29
+ server = MyServer()
30
+ app.include_router(server.router("/mcp"))
31
+ """
32
+
33
+ name: str
34
+ description: Optional[str] = None
35
+ instructions: Optional[str] = None
36
+
37
+ def tools(self) -> Optional[list[Type[Tool]]]:
38
+ """Return a list of Tool classes to register, or None."""
39
+ return None
40
+
41
+ def prompts(self) -> Optional[list[Type[Prompt]]]:
42
+ """Return a list of Prompt classes to register, or None."""
43
+ return None
44
+
45
+ def resources(self) -> Optional[list[Type[Resource]]]:
46
+ """Return a list of Resource classes to register, or None."""
47
+ return None
48
+
49
+ def router(self, prefix: str = "/mcp") -> APIRouter:
50
+ """Build and return a FastAPI APIRouter for this server.
51
+
52
+ The router exposes:
53
+ - ``POST {prefix}`` — JSON-RPC 2.0 endpoint
54
+ - ``GET {prefix}`` — returns 405 with ``Allow: POST``
55
+ """
56
+ protocol = Protocol(self)
57
+ api_router = APIRouter(prefix=prefix)
58
+
59
+ @api_router.post("")
60
+ async def handle_post(request: Request) -> StarletteResponse:
61
+ body = await request.json()
62
+ rpc = JsonRpcRequest(**body)
63
+
64
+ if rpc.is_notification:
65
+ # Fire-and-forget: dispatch but return 202 immediately
66
+ await protocol.dispatch(rpc.method, rpc.params, rpc.id)
67
+ return StarletteResponse(status_code=202)
68
+
69
+ result = await protocol.dispatch(rpc.method, rpc.params, rpc.id)
70
+ return JSONResponse(content=result)
71
+
72
+ @api_router.get("")
73
+ async def handle_get() -> StarletteResponse:
74
+ return StarletteResponse(
75
+ status_code=405,
76
+ headers={"Allow": "POST"},
77
+ )
78
+
79
+ return api_router
@@ -0,0 +1,54 @@
1
+ """Abstract base class for MCP tools."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import Optional, Type
5
+
6
+ from pydantic import BaseModel
7
+
8
+ from .response import Response
9
+
10
+
11
+ class Tool(ABC):
12
+ """Base class for MCP tools.
13
+
14
+ Subclasses must set ``name`` and ``description``, and implement ``handle()``.
15
+ Optionally override ``schema()`` to declare the input schema and
16
+ ``output_schema()`` to declare the output schema.
17
+ """
18
+
19
+ name: str
20
+ description: str
21
+
22
+ def schema(self) -> Optional[Type[BaseModel]]:
23
+ """Return a Pydantic BaseModel subclass describing the input, or None."""
24
+ return None
25
+
26
+ def output_schema(self) -> Optional[Type[BaseModel]]:
27
+ """Return a Pydantic BaseModel subclass describing the output, or None."""
28
+ return None
29
+
30
+ @abstractmethod
31
+ async def handle(self, arguments: dict) -> Response:
32
+ """Execute the tool with the given arguments and return a Response."""
33
+ raise NotImplementedError
34
+
35
+ def to_json(self) -> dict:
36
+ """Serialise to the MCP tools/list format."""
37
+ input_schema: dict
38
+ schema_cls = self.schema()
39
+ if schema_cls is not None:
40
+ input_schema = schema_cls.model_json_schema()
41
+ else:
42
+ input_schema = {"type": "object", "properties": {}}
43
+
44
+ data: dict = {
45
+ "name": self.name,
46
+ "description": self.description,
47
+ "inputSchema": input_schema,
48
+ }
49
+
50
+ output_schema_cls = self.output_schema()
51
+ if output_schema_cls is not None:
52
+ data["outputSchema"] = output_schema_cls.model_json_schema()
53
+
54
+ return data