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.
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/PKG-INFO +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/pyproject.toml +26 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/publish_command.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/__init__.py +0 -2
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/loader/Loader.py +1 -2
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +4 -3
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +13 -3
- fastapi_startkit-0.30.0/src/fastapi_startkit/logging/file.py +13 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/model.py +104 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/__init__.py +25 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/argument.py +20 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/prompt.py +45 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/protocol.py +143 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/providers/mcp_provider.py +19 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/request.py +19 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/resource.py +32 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/response.py +30 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/server.py +79 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/tool.py +54 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/Provider.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/local.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/s3.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/file.py +1 -1
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/filestream.py +1 -1
- fastapi_startkit-0.30.0/src/fastapi_startkit/storage/helper.py +33 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/support/__init__.py +4 -0
- {fastapi_startkit-0.28.0/src/fastapi_startkit/collection → fastapi_startkit-0.30.0/src/fastapi_startkit/support}/collection.py +10 -1
- fastapi_startkit-0.28.0/src/fastapi_startkit/collection/__init__.py +0 -1
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/DD.py +0 -38
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py +0 -70
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/__init__.py +0 -38
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/blocks.py +0 -101
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py +0 -13
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/solutions.py +0 -66
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/exceptionite/tabs.py +0 -19
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py +0 -102
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py +0 -26
- fastapi_startkit-0.28.0/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py +0 -11
- fastapi_startkit-0.28.0/src/fastapi_startkit/facades/Auth.py +0 -5
- fastapi_startkit-0.28.0/src/fastapi_startkit/facades/Auth.pyi +0 -32
- fastapi_startkit-0.28.0/src/fastapi_startkit/facades/Inertia.py +0 -5
- fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
- fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py +0 -66
- fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py +0 -119
- fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py +0 -29
- fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py +0 -57
- fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py +0 -70
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/__init__.py +0 -0
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/collections.py +0 -543
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/console.py +0 -39
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/filesystem.py +0 -100
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/http.py +0 -100
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/location.py +0 -91
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/str.py +0 -116
- fastapi_startkit-0.28.0/src/fastapi_startkit/utils/time.py +0 -59
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/.DS_Store +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/application.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/config/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/config/app.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/config.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/application.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/command.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/container.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/environment.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Broadcast.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Cache.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Config.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Dump.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Facade.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Gate.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Hash.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Loader.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Mail.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Queue.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Request.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Session.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Url.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/View.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/View.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Vite.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/helpers/app.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/constant.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/context.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/provider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/loader/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/factory.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/handler.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/listeners.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/logger.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
- {fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm/config → fastapi_startkit-0.30.0/src/fastapi_startkit/masoniteorm/query}/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
- {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
- {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
- {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
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
- {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
- {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
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
- {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
- {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
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
- {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
- {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
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
- {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
- {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
- {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
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
- {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
- {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
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
- {fastapi_startkit-0.28.0/src/fastapi_startkit/masoniteorm/helpers → fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/providers}/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
- {fastapi_startkit-0.28.0/src/fastapi_startkit/utils → fastapi_startkit-0.30.0/src/fastapi_startkit/storage}/data/mime.types +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/storage.py +0 -0
- {fastapi_startkit-0.28.0/src/fastapi_startkit/helpers → fastapi_startkit-0.30.0/src/fastapi_startkit/support}/string.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/testing/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/testing/test_case.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/utils/structures.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/__init__.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/templates/index.html +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
- {fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/vite.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fastapi-startkit"
|
|
3
|
-
version = "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"]
|
{fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/publish_command.py
RENAMED
|
@@ -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.
|
|
7
|
+
from fastapi_startkit.support import Str
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from fastapi_startkit.application import Application
|
{fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/__init__.py
RENAMED
|
@@ -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(
|
|
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,8 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
from .BaseDriver import BaseDriver
|
|
2
2
|
|
|
3
|
-
from fastapi_startkit.utils.console import HasColoredOutput
|
|
4
3
|
|
|
5
|
-
|
|
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
|
{fastapi_startkit-0.28.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/model.py
RENAMED
|
@@ -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
|