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