fastapi-startkit 0.62.0__tar.gz → 0.64.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.62.0 → fastapi_startkit-0.64.0}/PKG-INFO +14 -1
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/README.md +10 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/pyproject.toml +5 -2
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/config/ai.py +7 -6
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/config/config.py +18 -16
- fastapi_startkit-0.64.0/src/fastapi_startkit/broadcasting/config.py +32 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/carbon/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/config/app.py +5 -4
- fastapi_startkit-0.64.0/src/fastapi_startkit/configuration/__init__.py +5 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/configuration/providers/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/container/__init__.py +2 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/environment/__init__.py +3 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/environment/environment.py +205 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/exceptions/__init__.py +69 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/__init__.py +21 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/commands/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +7 -4
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/config/fastapi.py +7 -5
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/exceptions.py +15 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/inertia/encoding.py +24 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/inertia.py +66 -2
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/provider.py +4 -2
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/session.py +4 -1
- fastapi_startkit-0.64.0/src/fastapi_startkit/inertia/testing.py +140 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/loader/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/__init__.py +11 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/config/__init__.py +10 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/config/channels.py +9 -9
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/config/logging.py +6 -4
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/drivers/__init__.py +8 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/managers/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/providers/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/__init__.py +4 -1
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +8 -9
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +6 -9
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +15 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/masoniteorm/config/config.py +84 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/masoniteorm/config/database.py +21 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/masoniteorm/connections/connection.py +114 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/masoniteorm/connections/factory.py +59 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +10 -5
- fastapi_startkit-0.64.0/src/fastapi_startkit/masoniteorm/connections/manages_transactions.py +134 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/masoniteorm/connections/transactions.py +96 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/masoniteorm/exceptions.py +22 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +1 -1
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/caster.py +2 -1
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/model.py +4 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +21 -6
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +6 -10
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +7 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +66 -8
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +4 -6
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +4 -5
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +3 -3
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +8 -11
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +4 -5
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +5 -8
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +5 -4
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +5 -4
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +5 -4
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +8 -4
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +14 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +2 -2
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +2 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/redis/__init__.py +15 -0
- fastapi_startkit-0.64.0/src/fastapi_startkit/redis/config.py +40 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +36 -4
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/config/__init__.py +6 -5
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/config/storage.py +4 -5
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/drivers/__init__.py +2 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/collection.py +3 -1
- fastapi_startkit-0.64.0/src/fastapi_startkit/support/config.py +27 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/config/vite.py +3 -2
- fastapi_startkit-0.62.0/src/fastapi_startkit/broadcasting/config.py +0 -24
- fastapi_startkit-0.62.0/src/fastapi_startkit/configuration/__init__.py +0 -2
- fastapi_startkit-0.62.0/src/fastapi_startkit/environment/__init__.py +0 -1
- fastapi_startkit-0.62.0/src/fastapi_startkit/environment/environment.py +0 -160
- fastapi_startkit-0.62.0/src/fastapi_startkit/exceptions/__init__.py +0 -34
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/encoding.py +0 -8
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/testing.py +0 -14
- fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/config/config.py +0 -44
- fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/config/database.py +0 -24
- fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -337
- fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -84
- fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/exceptions.py +0 -12
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/__init__.py +0 -7
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/config.py +0 -42
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/.DS_Store +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/agent.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/ai.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/audio.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/decorators.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/document.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/image.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/judge.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/lab.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/recording.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/runner.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/state.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/testing.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/tinker.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/types.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/application.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/config/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/configuration/config.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/console/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/console/application.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/console/command.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/console/publish_command.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/container/container.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/events/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/events/fake.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/events/helpers.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/events/listener.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/events/provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/AI.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Cache.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Config.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Dump.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Event.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Facade.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Gate.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Hash.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Loader.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Mail.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Notification.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Queue.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Redis.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Redis.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Request.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Response.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Session.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Url.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/View.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/View.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Vite.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/events.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/referer.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/constant.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/context.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/errors.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/props/resolver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/props/scroll.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/redirect.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/inertia/ssr.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/loader/Loader.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/factory.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/file.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/handler.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/listeners.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/logger.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/argument.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/request.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/resource.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/response.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/server.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/mcp/tool.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/process/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/process/exception.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/process/fake.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/process/process.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/process/result.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/py.typed +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/redis/connection.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/redis/connector.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/redis/manager.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/redis/prefix.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/redis/provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/parser.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/registry.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/file.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/filestream.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/helper.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/storage/storage.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/dataclass.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/string.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/structures.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/support/uri.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/testing/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/testing/test_case.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/__init__.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
- {fastapi_startkit-0.62.0 → fastapi_startkit-0.64.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.64.0
|
|
4
4
|
Summary: A modular, provider-driven framework for building async Python web applications with FastAPI — bundling a service container, configuration system, an async-first ORM, facades, and a Cleo-powered console.
|
|
5
5
|
Keywords: fastapi,framework,async,web,asgi,orm,sqlalchemy,pydantic,ioc-container,dependency-injection,service-provider,cli,console,configuration,microservices,starter-kit,boilerplate
|
|
6
6
|
Author: Bedram Tamang
|
|
@@ -12,6 +12,8 @@ Classifier: Operating System :: OS Independent
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
15
17
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
16
18
|
Requires-Dist: dotty-dict>=1.3.1
|
|
17
19
|
Requires-Dist: pendulum>=3.1.0,<4.0.0
|
|
@@ -20,6 +22,7 @@ Requires-Dist: requests>=2.32.5,<3.0.0
|
|
|
20
22
|
Requires-Dist: cleo>=2.1.0,<3.0.0
|
|
21
23
|
Requires-Dist: dotenv>=0.9.9
|
|
22
24
|
Requires-Dist: pydantic>=2.12.5
|
|
25
|
+
Requires-Dist: typing-extensions>=4.12.0
|
|
23
26
|
Requires-Dist: langchain>=1.0.0 ; extra == 'ai'
|
|
24
27
|
Requires-Dist: langchain-core>=1.0.0 ; extra == 'ai'
|
|
25
28
|
Requires-Dist: langgraph>=1.0.0 ; extra == 'ai'
|
|
@@ -74,8 +77,18 @@ Optional extras enable additional capabilities:
|
|
|
74
77
|
fastapi-startkit[fastapi] # FastAPI + Starlette
|
|
75
78
|
fastapi-startkit[database] # SQLAlchemy async ORM
|
|
76
79
|
fastapi-startkit[vite] # Jinja2 for Vite integration
|
|
80
|
+
fastapi-startkit[ai] # LangChain agents
|
|
77
81
|
```
|
|
78
82
|
|
|
83
|
+
### Python versions
|
|
84
|
+
|
|
85
|
+
Python 3.12, 3.13, 3.14 and 3.15 are supported.
|
|
86
|
+
|
|
87
|
+
> [!NOTE]
|
|
88
|
+
> The `ai` extra cannot be installed on Python 3.15 or newer yet. It depends on `langgraph`, which
|
|
89
|
+
> requires `ormsgpack`, and `ormsgpack` does not support Python 3.15 yet. Use Python 3.14 or older for the
|
|
90
|
+
> `ai` extra. Every other extra works on 3.15.
|
|
91
|
+
|
|
79
92
|
## Features
|
|
80
93
|
|
|
81
94
|
- **Service container** — IoC container with `bind`/`make`/`resolve` auto-wiring and lifecycle hooks.
|
|
@@ -20,8 +20,18 @@ Optional extras enable additional capabilities:
|
|
|
20
20
|
fastapi-startkit[fastapi] # FastAPI + Starlette
|
|
21
21
|
fastapi-startkit[database] # SQLAlchemy async ORM
|
|
22
22
|
fastapi-startkit[vite] # Jinja2 for Vite integration
|
|
23
|
+
fastapi-startkit[ai] # LangChain agents
|
|
23
24
|
```
|
|
24
25
|
|
|
26
|
+
### Python versions
|
|
27
|
+
|
|
28
|
+
Python 3.12, 3.13, 3.14 and 3.15 are supported.
|
|
29
|
+
|
|
30
|
+
> [!NOTE]
|
|
31
|
+
> The `ai` extra cannot be installed on Python 3.15 or newer yet. It depends on `langgraph`, which
|
|
32
|
+
> requires `ormsgpack`, and `ormsgpack` does not support Python 3.15 yet. Use Python 3.14 or older for the
|
|
33
|
+
> `ai` extra. Every other extra works on 3.15.
|
|
34
|
+
|
|
25
35
|
## Features
|
|
26
36
|
|
|
27
37
|
- **Service container** — IoC container with `bind`/`make`/`resolve` auto-wiring and lifecycle hooks.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fastapi-startkit"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.64.0"
|
|
4
4
|
description = "A modular, provider-driven framework for building async Python web applications with FastAPI — bundling a service container, configuration system, an async-first ORM, facades, and a Cleo-powered console."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
keywords = [
|
|
@@ -34,6 +34,8 @@ classifiers = [
|
|
|
34
34
|
"Programming Language :: Python :: 3",
|
|
35
35
|
"Programming Language :: Python :: 3.12",
|
|
36
36
|
"Programming Language :: Python :: 3.13",
|
|
37
|
+
"Programming Language :: Python :: 3.14",
|
|
38
|
+
"Programming Language :: Python :: 3.15",
|
|
37
39
|
"Topic :: Software Development :: Libraries :: Application Frameworks",
|
|
38
40
|
]
|
|
39
41
|
dependencies = [
|
|
@@ -44,6 +46,7 @@ dependencies = [
|
|
|
44
46
|
"cleo>=2.1.0,<3.0.0",
|
|
45
47
|
"dotenv>=0.9.9",
|
|
46
48
|
"pydantic>=2.12.5",
|
|
49
|
+
"typing-extensions>=4.12.0",
|
|
47
50
|
]
|
|
48
51
|
|
|
49
52
|
[project.urls]
|
|
@@ -109,7 +112,7 @@ dev = [
|
|
|
109
112
|
"sqlalchemy[asyncio]>=2.0.38",
|
|
110
113
|
"fastapi[standard]>=0.124.4",
|
|
111
114
|
"faker>=40.13.0",
|
|
112
|
-
"langchain>=1.0.0",
|
|
115
|
+
"langchain>=1.0.0; python_version < '3.15'",
|
|
113
116
|
"langchain-core>=1.0.0",
|
|
114
117
|
"basedpyright>=1.31.4",
|
|
115
118
|
"pyright>=1.1.411",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from fastapi_startkit.configuration import Config
|
|
1
2
|
from dataclasses import dataclass, field
|
|
2
3
|
|
|
3
4
|
from fastapi_startkit.environment import env
|
|
@@ -6,15 +7,15 @@ from fastapi_startkit.ai import AnthropicConfig, ElevenLabsConfig, GoogleConfig,
|
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
@dataclass
|
|
9
|
-
class AIConfig:
|
|
10
|
+
class AIConfig(Config):
|
|
10
11
|
"""Top-level AI configuration — selects the default provider per modality and holds per-provider configs."""
|
|
11
12
|
|
|
12
|
-
default: str =
|
|
13
|
-
default_image: str =
|
|
14
|
-
default_audio: str =
|
|
15
|
-
default_transcribe: str =
|
|
13
|
+
default: str = env("AI_PROVIDER", "google")
|
|
14
|
+
default_image: str = env("AI_DEFAULT_IMAGE_PROVIDER", "openai")
|
|
15
|
+
default_audio: str = env("AI_DEFAULT_AUDIO_PROVIDER", "openai")
|
|
16
|
+
default_transcribe: str = env("AI_DEFAULT_TRANSCRIBE_PROVIDER", "openai")
|
|
16
17
|
|
|
17
|
-
providers: dict = field(
|
|
18
|
+
providers: dict[str, Config] = field(
|
|
18
19
|
default_factory=lambda: {
|
|
19
20
|
"google": GoogleConfig(),
|
|
20
21
|
"openai": OpenAIConfig(),
|
{fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/ai/config/config.py
RENAMED
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from fastapi_startkit.configuration import Config
|
|
6
|
+
|
|
3
7
|
from dataclasses import dataclass, field
|
|
4
8
|
|
|
5
9
|
from fastapi_startkit.environment import env
|
|
6
10
|
|
|
7
11
|
|
|
8
12
|
@dataclass
|
|
9
|
-
class AnthropicConfig:
|
|
13
|
+
class AnthropicConfig(Config):
|
|
10
14
|
"""Configuration for the Anthropic provider."""
|
|
11
15
|
|
|
12
16
|
driver: str = "anthropic"
|
|
13
|
-
key: str =
|
|
14
|
-
url: str =
|
|
17
|
+
key: str = env("ANTHROPIC_API_KEY", "", cast=False)
|
|
18
|
+
url: str = env("ANTHROPIC_BASE_URL", "https://api.anthropic.com")
|
|
15
19
|
|
|
16
|
-
models: dict = field(
|
|
20
|
+
models: dict[str, str] = field(
|
|
17
21
|
default_factory=lambda: {
|
|
18
22
|
"default": "claude-sonnet-4-6",
|
|
19
23
|
}
|
|
@@ -21,14 +25,14 @@ class AnthropicConfig:
|
|
|
21
25
|
|
|
22
26
|
|
|
23
27
|
@dataclass
|
|
24
|
-
class OpenAIConfig:
|
|
28
|
+
class OpenAIConfig(Config):
|
|
25
29
|
"""Configuration for the OpenAI provider."""
|
|
26
30
|
|
|
27
31
|
driver: str = "openai"
|
|
28
|
-
key: str =
|
|
29
|
-
url: str =
|
|
32
|
+
key: str = env("OPENAI_API_KEY", "", cast=False)
|
|
33
|
+
url: str = env("OPENAI_BASE_URL", "https://api.openai.com/v1")
|
|
30
34
|
|
|
31
|
-
models: dict = field(
|
|
35
|
+
models: dict[str, str] = field(
|
|
32
36
|
default_factory=lambda: {
|
|
33
37
|
"default": "gpt-4o",
|
|
34
38
|
"default_image": "dall-e-3",
|
|
@@ -37,15 +41,13 @@ class OpenAIConfig:
|
|
|
37
41
|
|
|
38
42
|
|
|
39
43
|
@dataclass
|
|
40
|
-
class GoogleConfig:
|
|
44
|
+
class GoogleConfig(Config):
|
|
41
45
|
"""Configuration for the Google / Gemini provider."""
|
|
42
46
|
|
|
43
47
|
driver: str = "google"
|
|
44
|
-
key: str = field(
|
|
45
|
-
default_factory=lambda: env("GEMINI_API_KEY", "", cast=False) or env("GOOGLE_API_KEY", "", cast=False)
|
|
46
|
-
)
|
|
48
|
+
key: str = field(default_factory=lambda: os.getenv("GEMINI_API_KEY") or os.getenv("GOOGLE_API_KEY") or "")
|
|
47
49
|
|
|
48
|
-
models: dict = field(
|
|
50
|
+
models: dict[str, str] = field(
|
|
49
51
|
default_factory=lambda: {
|
|
50
52
|
"default": "gemini-2.5-flash-lite",
|
|
51
53
|
"default_image": "imagen-3.0-generate-002",
|
|
@@ -54,13 +56,13 @@ class GoogleConfig:
|
|
|
54
56
|
|
|
55
57
|
|
|
56
58
|
@dataclass
|
|
57
|
-
class ElevenLabsConfig:
|
|
59
|
+
class ElevenLabsConfig(Config):
|
|
58
60
|
"""Configuration for the ElevenLabs provider."""
|
|
59
61
|
|
|
60
62
|
driver: str = "elevenlabs"
|
|
61
|
-
key: str =
|
|
63
|
+
key: str = env("ELEVENLABS_API_KEY", "", cast=False)
|
|
62
64
|
|
|
63
|
-
models: dict = field(
|
|
65
|
+
models: dict[str, str] = field(
|
|
64
66
|
default_factory=lambda: {
|
|
65
67
|
"default_audio": "eleven_multilingual_v2",
|
|
66
68
|
"default_transcribe": "scribe_v1",
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
|
|
3
|
+
from fastapi_startkit.configuration import Config
|
|
4
|
+
from fastapi_startkit.environment import env
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class ReverbConnectionConfig(Config):
|
|
9
|
+
driver: str = "reverb"
|
|
10
|
+
key: str = env("REVERB_APP_KEY", "local")
|
|
11
|
+
secret: str = env("REVERB_APP_SECRET", "secret")
|
|
12
|
+
app_id: str = env("REVERB_APP_ID", "1")
|
|
13
|
+
host: str = env("REVERB_HOST", "0.0.0.0")
|
|
14
|
+
port: int = env("REVERB_PORT", 8080)
|
|
15
|
+
scheme: str = env("REVERB_SCHEME", "http")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class LogConnectionConfig(Config):
|
|
20
|
+
driver: str = "log"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class BroadcastingConfig(Config):
|
|
25
|
+
default: str = env("BROADCAST_DRIVER", "log")
|
|
26
|
+
|
|
27
|
+
connections: dict[str, ReverbConnectionConfig | LogConnectionConfig] = field(
|
|
28
|
+
default_factory=lambda: {
|
|
29
|
+
"reverb": ReverbConnectionConfig(),
|
|
30
|
+
"log": LogConnectionConfig(),
|
|
31
|
+
}
|
|
32
|
+
)
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
from fastapi_startkit.configuration import Config
|
|
1
2
|
import os
|
|
2
|
-
from dataclasses import
|
|
3
|
-
from fastapi_startkit.environment
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from fastapi_startkit.environment import env as environment_value
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
@dataclass
|
|
7
|
-
class AppConfig:
|
|
8
|
+
class AppConfig(Config):
|
|
8
9
|
name: str = field(default_factory=lambda: os.getenv("APP_NAME", "FastAPI starter kit"))
|
|
9
10
|
env: str = field(default_factory=lambda: os.getenv("APP_ENV", "development"))
|
|
10
|
-
debug: bool =
|
|
11
|
+
debug: bool = environment_value("APP_DEBUG", True)
|
|
11
12
|
timezone: str = field(default_factory=lambda: os.getenv("APP_TIMEZONE", "UTC"))
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"""Module for the LoadEnvironment class."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from dataclasses import Field, MISSING, field
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import typing
|
|
9
|
+
from typing import Literal, TypeVar, overload
|
|
10
|
+
|
|
11
|
+
from dotenv import load_dotenv
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
T = TypeVar("T")
|
|
15
|
+
U = TypeVar("U")
|
|
16
|
+
EnvValue = str | int | bool
|
|
17
|
+
_UNSET = object()
|
|
18
|
+
_BOOLEANS: dict[str, bool] = {"true": True, "True": True, "false": False, "False": False}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Environment:
|
|
22
|
+
@staticmethod
|
|
23
|
+
def resolve_environment(base_path: Path | None = None, env: str | None = None):
|
|
24
|
+
Environment.resolve_environment_from_argument()
|
|
25
|
+
|
|
26
|
+
if "PYTEST_CURRENT_TEST" in os.environ:
|
|
27
|
+
return "testing"
|
|
28
|
+
|
|
29
|
+
# Explicit env parameter takes priority over os.environ APP_ENV
|
|
30
|
+
if env:
|
|
31
|
+
return env
|
|
32
|
+
|
|
33
|
+
if os.environ.get("APP_ENV"):
|
|
34
|
+
return os.environ["APP_ENV"]
|
|
35
|
+
|
|
36
|
+
path = Environment._require_base_path(base_path) / ".env"
|
|
37
|
+
if not path.exists():
|
|
38
|
+
raise ValueError("Unable to determine environment.")
|
|
39
|
+
|
|
40
|
+
_ = load_dotenv(path, override=True)
|
|
41
|
+
|
|
42
|
+
env = os.environ.get("APP_ENV")
|
|
43
|
+
if not env:
|
|
44
|
+
raise ValueError("APP_ENV not set after loading .env")
|
|
45
|
+
|
|
46
|
+
return env
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def _require_base_path(base_path: Path | None) -> Path:
|
|
50
|
+
# Keeps the TypeError the old unguarded `None / ".env"` raised, with a clearer message.
|
|
51
|
+
if base_path is None:
|
|
52
|
+
raise TypeError("base_path is required to locate .env files")
|
|
53
|
+
return base_path
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def load_base(base_path: Path | None = None):
|
|
57
|
+
"""Load the base .env file, resetting vars to their default values."""
|
|
58
|
+
path = Environment._require_base_path(base_path) / ".env"
|
|
59
|
+
if path.exists():
|
|
60
|
+
_ = load_dotenv(path, override=True)
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def load(env: str, override: bool = True, base_path: Path | None = None):
|
|
64
|
+
path = Environment._require_base_path(base_path) / f".env.{env}"
|
|
65
|
+
if not path.exists():
|
|
66
|
+
return
|
|
67
|
+
_ = load_dotenv(path, override=override)
|
|
68
|
+
|
|
69
|
+
@staticmethod
|
|
70
|
+
def resolve_environment_from_argument():
|
|
71
|
+
"""Parse --env=<value> or --env <value> from sys.argv, set APP_ENV,
|
|
72
|
+
and remove the tokens so downstream CLI parsers (e.g. cleo) never see them."""
|
|
73
|
+
args = sys.argv[1:]
|
|
74
|
+
for i, arg in enumerate(args):
|
|
75
|
+
if arg.startswith("--env="):
|
|
76
|
+
os.environ["APP_ENV"] = arg.split("=", 1)[1]
|
|
77
|
+
del sys.argv[i + 1]
|
|
78
|
+
break
|
|
79
|
+
if arg == "--env" and i + 1 < len(args):
|
|
80
|
+
os.environ["APP_ENV"] = args[i + 1]
|
|
81
|
+
del sys.argv[i + 1 : i + 3]
|
|
82
|
+
break
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@overload
|
|
86
|
+
def env(val: str, *, cast: Literal[True] = True) -> EnvValue: ...
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@overload
|
|
90
|
+
def env(val: str, default: None, cast: Literal[True] = True) -> EnvValue | None: ...
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@overload
|
|
94
|
+
def env(val: str, default: T, cast: Literal[True] = True) -> T: ...
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@overload
|
|
98
|
+
def env(val: str, *, cast: Literal[False]) -> str: ...
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@overload
|
|
102
|
+
def env(val: str, default: T, cast: Literal[False]) -> str | T: ...
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@overload
|
|
106
|
+
def env(val: str, *, cast: bool) -> EnvValue: ...
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@overload
|
|
110
|
+
def env(val: str, default: None, cast: bool) -> EnvValue | None: ...
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@overload
|
|
114
|
+
def env(val: str, default: T, cast: bool) -> str | T: ...
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def env(val: str, default: object = _UNSET, cast: bool = True) -> object:
|
|
118
|
+
def read() -> object:
|
|
119
|
+
env_var = os.getenv(val, "" if default is _UNSET else default)
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
return into(env_var, default, cast)
|
|
123
|
+
except ValueError as error:
|
|
124
|
+
raise ValueError(f"Cannot cast environment variable {val!r} to {type(default).__name__}") from error
|
|
125
|
+
|
|
126
|
+
return field(default_factory=read)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def value(item: T) -> T:
|
|
130
|
+
if isinstance(item, Field):
|
|
131
|
+
declared = typing.cast(Field[T], item)
|
|
132
|
+
if declared.default_factory is not MISSING:
|
|
133
|
+
return declared.default_factory()
|
|
134
|
+
return item
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@overload
|
|
138
|
+
def into(item: bool) -> bool: ...
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@overload
|
|
142
|
+
def into(item: int) -> int: ...
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@overload
|
|
146
|
+
def into(item: None) -> None: ...
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@overload
|
|
150
|
+
def into(item: str) -> EnvValue: ...
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@overload
|
|
154
|
+
def into(item: object, default: None) -> EnvValue | None: ...
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@overload
|
|
158
|
+
def into(item: object, default: T) -> T: ...
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@overload
|
|
162
|
+
def into(item: U, *, cast: Literal[False]) -> U: ...
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@overload
|
|
166
|
+
def into(item: U, default: T, cast: Literal[False]) -> U | T: ...
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@overload
|
|
170
|
+
def into(item: U, *, cast: bool) -> U | EnvValue: ...
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
@overload
|
|
174
|
+
def into(item: U, default: None, cast: bool) -> U | EnvValue | None: ...
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@overload
|
|
178
|
+
def into(item: U, default: T, cast: bool) -> U | T: ...
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def into(item: object, default: object = _UNSET, cast: bool = True) -> object:
|
|
182
|
+
if not cast:
|
|
183
|
+
return default if item is None and default is not _UNSET else item
|
|
184
|
+
|
|
185
|
+
if item is None or item == "":
|
|
186
|
+
return item if default is _UNSET else default
|
|
187
|
+
|
|
188
|
+
if isinstance(item, bool):
|
|
189
|
+
return item
|
|
190
|
+
|
|
191
|
+
if default is _UNSET or default is None:
|
|
192
|
+
if isinstance(item, int) or (isinstance(item, str) and item.isnumeric()):
|
|
193
|
+
return int(item)
|
|
194
|
+
return _BOOLEANS.get(item, item) if isinstance(item, str) else item
|
|
195
|
+
|
|
196
|
+
if isinstance(default, bool):
|
|
197
|
+
if isinstance(item, str) and item in _BOOLEANS:
|
|
198
|
+
return _BOOLEANS[item]
|
|
199
|
+
raise ValueError(f"Cannot cast {item!r} to bool")
|
|
200
|
+
|
|
201
|
+
convert = typing.cast(Callable[[object], object], type(default))
|
|
202
|
+
try:
|
|
203
|
+
return convert(item)
|
|
204
|
+
except (TypeError, ValueError) as error:
|
|
205
|
+
raise ValueError(f"Cannot cast {item!r} to {type(default).__name__}") from error
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from .handler import ExceptionHandler
|
|
2
|
+
from .exceptions import (
|
|
3
|
+
AuthorizationException,
|
|
4
|
+
InvalidRouteCompileException,
|
|
5
|
+
RouteMiddlewareNotFound,
|
|
6
|
+
ContainerError,
|
|
7
|
+
MissingContainerBindingNotFound,
|
|
8
|
+
StrictContainerException,
|
|
9
|
+
ResponseError,
|
|
10
|
+
InvalidHTTPStatusCode,
|
|
11
|
+
RequiredContainerBindingNotFound,
|
|
12
|
+
ViewException,
|
|
13
|
+
RouteNotFoundException,
|
|
14
|
+
DumpException,
|
|
15
|
+
InvalidSecretKey,
|
|
16
|
+
InvalidCSRFToken,
|
|
17
|
+
NotificationException,
|
|
18
|
+
InvalidToken,
|
|
19
|
+
ProjectLimitReached,
|
|
20
|
+
ProjectProviderTimeout,
|
|
21
|
+
ProjectProviderHttpError,
|
|
22
|
+
ProjectTargetNotEmpty,
|
|
23
|
+
MixFileNotFound,
|
|
24
|
+
MixManifestNotFound,
|
|
25
|
+
InvalidConfigurationLocation,
|
|
26
|
+
InvalidConfigurationSetup,
|
|
27
|
+
InvalidPackageName,
|
|
28
|
+
LoaderNotFound,
|
|
29
|
+
QueueException,
|
|
30
|
+
ValidationException,
|
|
31
|
+
AmbiguousError,
|
|
32
|
+
MethodNotAllowedException,
|
|
33
|
+
ThrottleRequestsException,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"ExceptionHandler",
|
|
38
|
+
"AuthorizationException",
|
|
39
|
+
"InvalidRouteCompileException",
|
|
40
|
+
"RouteMiddlewareNotFound",
|
|
41
|
+
"ContainerError",
|
|
42
|
+
"MissingContainerBindingNotFound",
|
|
43
|
+
"StrictContainerException",
|
|
44
|
+
"ResponseError",
|
|
45
|
+
"InvalidHTTPStatusCode",
|
|
46
|
+
"RequiredContainerBindingNotFound",
|
|
47
|
+
"ViewException",
|
|
48
|
+
"RouteNotFoundException",
|
|
49
|
+
"DumpException",
|
|
50
|
+
"InvalidSecretKey",
|
|
51
|
+
"InvalidCSRFToken",
|
|
52
|
+
"NotificationException",
|
|
53
|
+
"InvalidToken",
|
|
54
|
+
"ProjectLimitReached",
|
|
55
|
+
"ProjectProviderTimeout",
|
|
56
|
+
"ProjectProviderHttpError",
|
|
57
|
+
"ProjectTargetNotEmpty",
|
|
58
|
+
"MixFileNotFound",
|
|
59
|
+
"MixManifestNotFound",
|
|
60
|
+
"InvalidConfigurationLocation",
|
|
61
|
+
"InvalidConfigurationSetup",
|
|
62
|
+
"InvalidPackageName",
|
|
63
|
+
"LoaderNotFound",
|
|
64
|
+
"QueueException",
|
|
65
|
+
"ValidationException",
|
|
66
|
+
"AmbiguousError",
|
|
67
|
+
"MethodNotAllowedException",
|
|
68
|
+
"ThrottleRequestsException",
|
|
69
|
+
]
|
{fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/facades/__init__.py
RENAMED
|
@@ -16,3 +16,24 @@ from .Queue import Queue
|
|
|
16
16
|
from .Cache import Cache
|
|
17
17
|
from .RateLimiter import RateLimiter
|
|
18
18
|
from .Redis import Redis
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"Facade",
|
|
22
|
+
"Request",
|
|
23
|
+
"Response",
|
|
24
|
+
"Mail",
|
|
25
|
+
"Hash",
|
|
26
|
+
"Url",
|
|
27
|
+
"Session",
|
|
28
|
+
"View",
|
|
29
|
+
"Gate",
|
|
30
|
+
"Config",
|
|
31
|
+
"Event",
|
|
32
|
+
"Loader",
|
|
33
|
+
"Notification",
|
|
34
|
+
"Dump",
|
|
35
|
+
"Queue",
|
|
36
|
+
"Cache",
|
|
37
|
+
"RateLimiter",
|
|
38
|
+
"Redis",
|
|
39
|
+
]
|
|
@@ -4,12 +4,12 @@ from cleo.helpers import option
|
|
|
4
4
|
|
|
5
5
|
from fastapi_startkit import Config
|
|
6
6
|
from fastapi_startkit.console.command import Command
|
|
7
|
-
from fastapi_startkit.environment import value as cast_value
|
|
8
7
|
from fastapi_startkit.fastapi.config import FastAPIConfig
|
|
9
8
|
from fastapi_startkit.support import Uri, Uriable
|
|
10
9
|
|
|
11
10
|
if TYPE_CHECKING:
|
|
12
11
|
from fastapi_startkit.application import Application
|
|
12
|
+
from fastapi_startkit.config import AppConfig
|
|
13
13
|
|
|
14
14
|
# Values accepted by uvicorn's `ws` setting.
|
|
15
15
|
WS_BACKENDS = ("auto", "none", "websockets", "websockets-sansio", "wsproto")
|
|
@@ -69,7 +69,10 @@ class ServeCommand(Command):
|
|
|
69
69
|
|
|
70
70
|
def resolve_option(self, key: str) -> Any:
|
|
71
71
|
"""CLI flag > fastapi config > FastAPIConfig default."""
|
|
72
|
-
|
|
72
|
+
selected = self.option(key) or self.config_value(key)
|
|
73
|
+
if key == "reload" and isinstance(selected, str):
|
|
74
|
+
return {"true": True, "false": False}.get(selected.lower(), selected)
|
|
75
|
+
return selected
|
|
73
76
|
|
|
74
77
|
def resolve_url(self) -> Uriable:
|
|
75
78
|
host = self.option("host") or self.config_value("app_url")
|
|
@@ -100,7 +103,7 @@ class ServeCommand(Command):
|
|
|
100
103
|
reload = self.resolve_option("reload")
|
|
101
104
|
app = self.resolve_option("app")
|
|
102
105
|
|
|
103
|
-
kwargs = {
|
|
106
|
+
kwargs: dict[str, Any] = {
|
|
104
107
|
"host": url.host(),
|
|
105
108
|
"port": url.port(),
|
|
106
109
|
"reload": reload,
|
|
@@ -128,7 +131,7 @@ class ServeCommand(Command):
|
|
|
128
131
|
|
|
129
132
|
else:
|
|
130
133
|
self.line(f"<info>Starting Uvicorn server on {url.host()}:{url.port()}...</info>")
|
|
131
|
-
kwargs.update({"app": cast("Application", Container.instance()).fastapi, "reload": False})
|
|
134
|
+
kwargs.update({"app": cast("Application[AppConfig]", Container.instance()).fastapi, "reload": False})
|
|
132
135
|
|
|
133
136
|
try:
|
|
134
137
|
uvicorn.run(**kwargs)
|
{fastapi_startkit-0.62.0 → fastapi_startkit-0.64.0}/src/fastapi_startkit/fastapi/config/fastapi.py
RENAMED
|
@@ -1,17 +1,19 @@
|
|
|
1
|
+
from dataclasses import field
|
|
2
|
+
from fastapi_startkit.configuration import Config
|
|
1
3
|
import dataclasses
|
|
2
4
|
|
|
3
5
|
from fastapi_startkit.environment import env
|
|
4
6
|
|
|
5
7
|
|
|
6
8
|
@dataclasses.dataclass
|
|
7
|
-
class FastAPIConfig:
|
|
8
|
-
app_url: str =
|
|
9
|
+
class FastAPIConfig(Config):
|
|
10
|
+
app_url: str = env("APP_URL", "http://127.0.0.1:8000")
|
|
9
11
|
app: str = "bootstrap.application:app"
|
|
10
|
-
reload: bool =
|
|
12
|
+
reload: bool = env("APP_RELOAD", True)
|
|
11
13
|
# 'auto' keeps the optional `websockets` package from being required at startup.
|
|
12
|
-
ws: str =
|
|
14
|
+
ws: str = env("APP_WS", "auto")
|
|
13
15
|
reload_dirs: list | None = None
|
|
14
|
-
reload_excludes: list =
|
|
16
|
+
reload_excludes: list = field(
|
|
15
17
|
default_factory=lambda: [
|
|
16
18
|
"*.log",
|
|
17
19
|
"tests/*",
|