fastapi-startkit 0.60.0__tar.gz → 0.62.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.60.0 → fastapi_startkit-0.62.0}/PKG-INFO +4 -1
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/pyproject.toml +7 -1
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/application.py +2 -2
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/config/__init__.py +2 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/application.py +2 -2
- fastapi_startkit-0.62.0/src/fastapi_startkit/facades/Redis.py +5 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/facades/Redis.pyi +27 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/__init__.py +1 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/exceptions.py +3 -4
- fastapi_startkit-0.62.0/src/fastapi_startkit/fastapi/referer.py +17 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/__init__.py +21 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/constant.py +13 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/context.py +21 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/encoding.py +8 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/errors.py +60 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/inertia.py +382 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/middleware.py +129 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/props/props.py +156 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/props/resolver.py +288 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/props/scroll.py +65 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/inertia/provider.py +12 -3
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/redirect.py +28 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/session.py +74 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/ssr.py +88 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/inertia/testing.py +14 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +142 -26
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +5 -1
- fastapi_startkit-0.62.0/src/fastapi_startkit/masoniteorm/migrations/Migration.py +13 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +64 -64
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +1 -1
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +6 -3
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/__init__.py +7 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/config.py +42 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/connection.py +63 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/connector.py +21 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/manager.py +66 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/prefix.py +152 -0
- fastapi_startkit-0.62.0/src/fastapi_startkit/redis/provider.py +39 -0
- fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/__init__.py +0 -5
- fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/constant.py +0 -7
- fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/context.py +0 -8
- fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/inertia.py +0 -187
- fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/middleware.py +0 -102
- fastapi_startkit-0.60.0/src/fastapi_startkit/inertia/props/props.py +0 -6
- fastapi_startkit-0.60.0/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -11
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/README.md +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/.DS_Store +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/agent.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/ai.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/audio.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/config/ai.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/config/config.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/decorators.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/document.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/image.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/judge.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/lab.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/recording.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/runner.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/state.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/testing.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/tinker.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/ai/types.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/config/app.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/config.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/command.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/console/publish_command.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/container/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/container/container.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/environment/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/environment/environment.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/fake.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/helpers.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/listener.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/events/provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/AI.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Cache.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Config.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Dump.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Event.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Facade.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Gate.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Hash.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Loader.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Mail.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Notification.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Queue.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Request.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Response.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Session.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Url.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/View.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/View.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Vite.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/events.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/loader/Loader.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/loader/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/factory.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/file.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/handler.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/listeners.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/logger.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/argument.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/request.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/resource.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/response.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/server.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/mcp/tool.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/exception.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/fake.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/process.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/process/result.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/py.typed +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/parser.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/registry.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/file.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/filestream.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/helper.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/storage/storage.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/collection.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/dataclass.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/string.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/structures.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/support/uri.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/testing/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/testing/test_case.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/__init__.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
- {fastapi_startkit-0.60.0 → fastapi_startkit-0.62.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.62.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
|
|
@@ -26,11 +26,13 @@ Requires-Dist: langgraph>=1.0.0 ; extra == 'ai'
|
|
|
26
26
|
Requires-Dist: faker>=40.13.0 ; extra == 'database'
|
|
27
27
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.38 ; extra == 'database'
|
|
28
28
|
Requires-Dist: fastapi[standard]>=0.124.4 ; extra == 'fastapi'
|
|
29
|
+
Requires-Dist: httpx>=0.28.1 ; extra == 'fastapi'
|
|
29
30
|
Requires-Dist: itsdangerous>=2.2.0 ; extra == 'fastapi'
|
|
30
31
|
Requires-Dist: jinja2>=3.1 ; extra == 'inertia'
|
|
31
32
|
Requires-Dist: markupsafe>=2.0 ; extra == 'inertia'
|
|
32
33
|
Requires-Dist: aiomysql>=0.2.0 ; extra == 'mysql'
|
|
33
34
|
Requires-Dist: asyncpg>=0.29.0 ; extra == 'postgres'
|
|
35
|
+
Requires-Dist: redis>=5.0.1 ; extra == 'redis'
|
|
34
36
|
Requires-Dist: aiosqlite>=0.22.1 ; extra == 'sqlite'
|
|
35
37
|
Requires-Dist: jinja2>=3.1 ; extra == 'vite'
|
|
36
38
|
Requires-Python: >=3.12, <4.0
|
|
@@ -45,6 +47,7 @@ Provides-Extra: fastapi
|
|
|
45
47
|
Provides-Extra: inertia
|
|
46
48
|
Provides-Extra: mysql
|
|
47
49
|
Provides-Extra: postgres
|
|
50
|
+
Provides-Extra: redis
|
|
48
51
|
Provides-Extra: sqlite
|
|
49
52
|
Provides-Extra: vite
|
|
50
53
|
Description-Content-Type: text/markdown
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fastapi-startkit"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.62.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 = [
|
|
@@ -56,6 +56,7 @@ Changelog = "https://github.com/fastapi-startkit/fastapi-startkit-framework/rele
|
|
|
56
56
|
[project.optional-dependencies]
|
|
57
57
|
fastapi = [
|
|
58
58
|
"fastapi[standard]>=0.124.4",
|
|
59
|
+
"httpx>=0.28.1",
|
|
59
60
|
"itsdangerous>=2.2.0",
|
|
60
61
|
]
|
|
61
62
|
database = [
|
|
@@ -89,6 +90,9 @@ ai = [
|
|
|
89
90
|
"langchain-core>=1.0.0",
|
|
90
91
|
"langgraph>=1.0.0",
|
|
91
92
|
]
|
|
93
|
+
redis = [
|
|
94
|
+
"redis>=5.0.1",
|
|
95
|
+
]
|
|
92
96
|
|
|
93
97
|
[dependency-groups]
|
|
94
98
|
dev = [
|
|
@@ -110,6 +114,8 @@ dev = [
|
|
|
110
114
|
"basedpyright>=1.31.4",
|
|
111
115
|
"pyright>=1.1.411",
|
|
112
116
|
"pytest-benchmark>=5.2.3",
|
|
117
|
+
"redis>=5.0.1",
|
|
118
|
+
"fakeredis[lua]>=2.26.0",
|
|
113
119
|
]
|
|
114
120
|
|
|
115
121
|
|
|
@@ -225,10 +225,10 @@ class Application(Container, Generic[TConfig]):
|
|
|
225
225
|
def add_commands(self, commands: List):
|
|
226
226
|
self.commands.extend(commands)
|
|
227
227
|
|
|
228
|
-
def handle_command(self):
|
|
228
|
+
def handle_command(self) -> int:
|
|
229
229
|
from fastapi_startkit.console import ConsoleApplication
|
|
230
230
|
|
|
231
|
-
ConsoleApplication(self).handle()
|
|
231
|
+
return ConsoleApplication(self).handle()
|
|
232
232
|
|
|
233
233
|
def run(self, command: str, args: "str | list[str] | None" = None) -> int:
|
|
234
234
|
from cleo.io.inputs.string_input import StringInput
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from collections.abc import Awaitable, Callable, Iterable
|
|
2
|
+
from typing import Any, overload
|
|
3
|
+
|
|
4
|
+
from redis.asyncio.client import Pipeline
|
|
5
|
+
from redis.asyncio.client import Redis as AsyncRedis
|
|
6
|
+
|
|
7
|
+
from fastapi_startkit.redis import Connection, RedisManager
|
|
8
|
+
|
|
9
|
+
class RedisFacade(AsyncRedis):
|
|
10
|
+
def connection(self, name: str | None = None) -> Connection: ... # pyright: ignore[reportIncompatibleVariableOverride]
|
|
11
|
+
def connections(self) -> dict[str, Connection]: ...
|
|
12
|
+
def extend(self, client: str, factory: Callable[[dict[str, Any]], Any]) -> RedisManager: ...
|
|
13
|
+
async def purge(self, name: str | None = None) -> None: ...
|
|
14
|
+
async def disconnect(self) -> None: ...
|
|
15
|
+
async def command(self, method: str, parameters: Iterable[Any] | None = None) -> Any: ... # pyright: ignore[reportIncompatibleMethodOverride]
|
|
16
|
+
@overload
|
|
17
|
+
def pipeline(self, callback: None = None) -> Pipeline: ...
|
|
18
|
+
@overload
|
|
19
|
+
def pipeline(self, callback: Callable[[Pipeline], Any]) -> Awaitable[list[Any]]: ... # pyright: ignore[reportIncompatibleMethodOverride]
|
|
20
|
+
@overload
|
|
21
|
+
def transaction(self, callback: None = None) -> Pipeline: ...
|
|
22
|
+
@overload
|
|
23
|
+
def transaction(self, callback: Callable[[Pipeline], Any]) -> Awaitable[list[Any]]: ... # pyright: ignore[reportIncompatibleMethodOverride]
|
|
24
|
+
async def subscribe(self, channels: str | Iterable[str], callback: Callable[[Any, Any], Any]) -> None: ...
|
|
25
|
+
async def psubscribe(self, patterns: str | Iterable[str], callback: Callable[[Any, Any], Any]) -> None: ...
|
|
26
|
+
|
|
27
|
+
Redis: RedisFacade
|
{fastapi_startkit-0.60.0 → fastapi_startkit-0.62.0}/src/fastapi_startkit/fastapi/exceptions.py
RENAMED
|
@@ -64,7 +64,6 @@ class ValidationExceptionHandler:
|
|
|
64
64
|
|
|
65
65
|
from starlette.responses import RedirectResponse
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
)
|
|
67
|
+
from fastapi_startkit.fastapi.referer import same_origin_referer
|
|
68
|
+
|
|
69
|
+
return RedirectResponse(url=same_origin_referer(request), status_code=303)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from urllib.parse import urlsplit
|
|
3
|
+
|
|
4
|
+
from starlette.requests import Request
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def same_origin_referer(request: Optional[Request], fallback: str = "/") -> str:
|
|
8
|
+
referer = request.headers.get("referer") if request is not None else None
|
|
9
|
+
if not referer or request is None:
|
|
10
|
+
return fallback
|
|
11
|
+
target = urlsplit(referer)
|
|
12
|
+
if not target.scheme and not target.netloc:
|
|
13
|
+
return referer if referer.startswith("/") and not referer.startswith("//") else fallback
|
|
14
|
+
origin = urlsplit(str(request.base_url))
|
|
15
|
+
if (target.scheme, target.netloc) == (origin.scheme, origin.netloc):
|
|
16
|
+
return referer
|
|
17
|
+
return fallback
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from .errors import ValidationErrors
|
|
2
|
+
from .inertia import Inertia
|
|
3
|
+
from .middleware import InertiaMiddleware
|
|
4
|
+
from .props.props import Prop
|
|
5
|
+
from .props.scroll import ScrollMetadata
|
|
6
|
+
from .provider import InertiaProvider
|
|
7
|
+
from .redirect import InertiaRedirect
|
|
8
|
+
from .ssr import HttpSSRGateway, SSRGateway, ViteHotFileGateway
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"Inertia",
|
|
12
|
+
"InertiaMiddleware",
|
|
13
|
+
"InertiaProvider",
|
|
14
|
+
"InertiaRedirect",
|
|
15
|
+
"HttpSSRGateway",
|
|
16
|
+
"Prop",
|
|
17
|
+
"SSRGateway",
|
|
18
|
+
"ScrollMetadata",
|
|
19
|
+
"ValidationErrors",
|
|
20
|
+
"ViteHotFileGateway",
|
|
21
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class Header:
|
|
2
|
+
INERTIA = "X-Inertia"
|
|
3
|
+
INERTIA_VERSION = "X-Inertia-Version"
|
|
4
|
+
INERTIA_PARTIAL_COMPONENT = "X-Inertia-Partial-Component"
|
|
5
|
+
INERTIA_LOCATION = "X-Inertia-Location"
|
|
6
|
+
INERTIA_REDIRECT = "X-Inertia-Redirect"
|
|
7
|
+
ERROR_BAG = "X-Inertia-Error-Bag"
|
|
8
|
+
PURPOSE = "Purpose"
|
|
9
|
+
INERTIA_PARTIAL_DATA = "X-Inertia-Partial-Data"
|
|
10
|
+
INERTIA_PARTIAL_EXCEPT = "X-Inertia-Partial-Except"
|
|
11
|
+
INERTIA_RESET = "X-Inertia-Reset"
|
|
12
|
+
INERTIA_EXCEPT_ONCE_PROPS = "X-Inertia-Except-Once-Props"
|
|
13
|
+
INERTIA_INFINITE_SCROLL_MERGE_INTENT = "X-Inertia-Infinite-Scroll-Merge-Intent"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from contextvars import ContextVar
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from typing import Any, Callable, Optional
|
|
4
|
+
|
|
5
|
+
from fastapi import Request
|
|
6
|
+
|
|
7
|
+
current_request: ContextVar[Optional[Request]] = ContextVar("inertia_request", default=None)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class InertiaRequestState:
|
|
12
|
+
shared_props: dict[str, Any] = field(default_factory=dict)
|
|
13
|
+
root_view: Optional[str] = None
|
|
14
|
+
version: Optional[Callable[[], Optional[str]]] = None
|
|
15
|
+
resolved_version: Optional[str] = None
|
|
16
|
+
version_resolved: bool = False
|
|
17
|
+
encrypt_history: Optional[bool] = None
|
|
18
|
+
session: dict[str, Any] = field(default_factory=dict)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
current_state: ContextVar[Optional[InertiaRequestState]] = ContextVar("inertia_state", default=None)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from collections.abc import Iterable, Mapping
|
|
2
|
+
from typing import Any, Optional, Self, Union
|
|
3
|
+
|
|
4
|
+
from fastapi.exceptions import RequestValidationError
|
|
5
|
+
from pydantic import ValidationError
|
|
6
|
+
|
|
7
|
+
Messages = Union[str, Iterable[str]]
|
|
8
|
+
ErrorsInput = Union["ValidationErrors", Mapping[str, Messages], ValidationError, RequestValidationError]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ValidationErrors:
|
|
12
|
+
def __init__(self, messages: Optional[Mapping[str, Messages]] = None):
|
|
13
|
+
self.messages: dict[str, list[str]] = {}
|
|
14
|
+
if messages:
|
|
15
|
+
self.merge(messages)
|
|
16
|
+
|
|
17
|
+
def add(self, field: str, message: str) -> Self:
|
|
18
|
+
self.messages.setdefault(field, []).append(message)
|
|
19
|
+
return self
|
|
20
|
+
|
|
21
|
+
def has(self, field: str) -> bool:
|
|
22
|
+
return bool(self.messages.get(field))
|
|
23
|
+
|
|
24
|
+
def first(self, field: str) -> Optional[str]:
|
|
25
|
+
messages = self.messages.get(field)
|
|
26
|
+
return messages[0] if messages else None
|
|
27
|
+
|
|
28
|
+
def get(self, field: str) -> list[str]:
|
|
29
|
+
return list(self.messages.get(field, []))
|
|
30
|
+
|
|
31
|
+
def merge(self, errors: Union["ValidationErrors", Mapping[str, Messages]]) -> Self:
|
|
32
|
+
source = errors.messages if isinstance(errors, ValidationErrors) else errors
|
|
33
|
+
for field, messages in source.items():
|
|
34
|
+
for message in [messages] if isinstance(messages, str) else messages:
|
|
35
|
+
self.add(field, message)
|
|
36
|
+
return self
|
|
37
|
+
|
|
38
|
+
def all(self) -> dict[str, list[str]]:
|
|
39
|
+
return {field: list(messages) for field, messages in self.messages.items()}
|
|
40
|
+
|
|
41
|
+
def firsts(self) -> dict[str, str]:
|
|
42
|
+
return {field: messages[0] for field, messages in self.messages.items() if messages}
|
|
43
|
+
|
|
44
|
+
def __bool__(self) -> bool:
|
|
45
|
+
return any(self.messages.values())
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def make(cls, errors: ErrorsInput) -> "ValidationErrors":
|
|
49
|
+
if isinstance(errors, RequestValidationError):
|
|
50
|
+
return cls.from_error_list(errors.errors(), skip=1)
|
|
51
|
+
if isinstance(errors, ValidationError):
|
|
52
|
+
return cls.from_error_list(errors.errors(), skip=0)
|
|
53
|
+
return cls(errors.messages if isinstance(errors, ValidationErrors) else errors)
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def from_error_list(cls, errors: Iterable[Mapping[str, Any]], skip: int) -> "ValidationErrors":
|
|
57
|
+
result = cls()
|
|
58
|
+
for error in errors:
|
|
59
|
+
result.add(".".join(str(part) for part in error["loc"][skip:]), error["msg"])
|
|
60
|
+
return result
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, Iterable, Optional, Union
|
|
3
|
+
from urllib.parse import urlparse
|
|
4
|
+
|
|
5
|
+
from fastapi import Request
|
|
6
|
+
from fastapi.responses import JSONResponse
|
|
7
|
+
from starlette.responses import RedirectResponse, Response
|
|
8
|
+
|
|
9
|
+
from fastapi_startkit.inertia import session
|
|
10
|
+
from fastapi_startkit.inertia.errors import ErrorsInput
|
|
11
|
+
from fastapi_startkit.fastapi.referer import same_origin_referer
|
|
12
|
+
from fastapi_startkit.inertia.redirect import InertiaRedirect
|
|
13
|
+
from fastapi_startkit.inertia.ssr import HttpSSRGateway, SSRGateway, ViteHotFileGateway, is_excepted
|
|
14
|
+
|
|
15
|
+
from fastapi_startkit.inertia.props.props import OptionalProp, Prop
|
|
16
|
+
from fastapi_startkit.inertia.props.resolver import PropsResolver
|
|
17
|
+
from fastapi_startkit.inertia.props.scroll import ScrollMetadata
|
|
18
|
+
from fastapi_startkit.inertia.constant import Header
|
|
19
|
+
from fastapi_startkit.inertia.context import current_request, current_state
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger("fastapi_startkit.inertia")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ResponseFactory:
|
|
25
|
+
"""Holds all Inertia state: app container, root view, shared props, version."""
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
self.root_view: str = "index.html"
|
|
29
|
+
self.shared_props: dict = {}
|
|
30
|
+
self.version = None
|
|
31
|
+
self.ssr_gateway: Optional[SSRGateway] = None
|
|
32
|
+
self.ssr_enabled: bool = False
|
|
33
|
+
self.ssr_except_paths: tuple[str, ...] = ()
|
|
34
|
+
self.encrypt_history_enabled: bool = False
|
|
35
|
+
self.expose_shared_prop_keys: bool = True
|
|
36
|
+
|
|
37
|
+
def set_root_view(self, view: str):
|
|
38
|
+
self.root_view = view
|
|
39
|
+
|
|
40
|
+
def share(self, key: Union[str, Dict[str, Any]], value: Any = None):
|
|
41
|
+
state = current_state.get()
|
|
42
|
+
props = state.shared_props if state is not None else self.shared_props
|
|
43
|
+
if isinstance(key, dict):
|
|
44
|
+
props.update(key)
|
|
45
|
+
else:
|
|
46
|
+
props[key] = value
|
|
47
|
+
|
|
48
|
+
def shared(self) -> dict:
|
|
49
|
+
state = current_state.get()
|
|
50
|
+
request_props = state.shared_props if state is not None else {}
|
|
51
|
+
return {**self.shared_props, **request_props}
|
|
52
|
+
|
|
53
|
+
def set_version(self, version):
|
|
54
|
+
self.version = version
|
|
55
|
+
|
|
56
|
+
def get_version(self) -> Optional[str]:
|
|
57
|
+
state = current_state.get()
|
|
58
|
+
if state is None:
|
|
59
|
+
return self.resolve_version(self.version)
|
|
60
|
+
if not state.version_resolved:
|
|
61
|
+
state.resolved_version = self.resolve_version(self.version if self.version is not None else state.version)
|
|
62
|
+
state.version_resolved = True
|
|
63
|
+
return state.resolved_version
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def resolve_version(version) -> Optional[str]:
|
|
67
|
+
v = version() if callable(version) else version
|
|
68
|
+
return str(v) if v is not None else None
|
|
69
|
+
|
|
70
|
+
def get_root_view(self) -> str:
|
|
71
|
+
state = current_state.get()
|
|
72
|
+
if state is not None and state.root_view:
|
|
73
|
+
return state.root_view
|
|
74
|
+
return self.root_view
|
|
75
|
+
|
|
76
|
+
def set_encrypt_history(self, enabled: bool = True):
|
|
77
|
+
state = current_state.get()
|
|
78
|
+
if state is not None:
|
|
79
|
+
state.encrypt_history = enabled
|
|
80
|
+
else:
|
|
81
|
+
self.encrypt_history_enabled = enabled
|
|
82
|
+
|
|
83
|
+
def should_encrypt_history(self) -> bool:
|
|
84
|
+
state = current_state.get()
|
|
85
|
+
if state is not None and state.encrypt_history is not None:
|
|
86
|
+
return state.encrypt_history
|
|
87
|
+
return self.encrypt_history_enabled
|
|
88
|
+
|
|
89
|
+
def set_ssr(self, url: Optional[str], timeout: float = 1.0, enabled: bool = True, except_paths: Iterable[str] = ()):
|
|
90
|
+
gateway = HttpSSRGateway(url, timeout) if url else None
|
|
91
|
+
self.set_ssr_gateway(gateway, enabled, except_paths)
|
|
92
|
+
|
|
93
|
+
def set_ssr_gateway(self, gateway: Optional[SSRGateway], enabled: bool = True, except_paths: Iterable[str] = ()):
|
|
94
|
+
self.ssr_gateway = gateway
|
|
95
|
+
self.ssr_enabled = enabled and gateway is not None
|
|
96
|
+
self.ssr_except_paths = tuple(except_paths)
|
|
97
|
+
|
|
98
|
+
async def ssr_healthy(self) -> bool:
|
|
99
|
+
if not self.ssr_enabled or self.ssr_gateway is None:
|
|
100
|
+
return False
|
|
101
|
+
return await self.ssr_gateway.healthy()
|
|
102
|
+
|
|
103
|
+
def render(self, component: str, props: dict) -> "InertiaResponse":
|
|
104
|
+
return InertiaResponse(
|
|
105
|
+
component=component,
|
|
106
|
+
shared_props=self.shared(),
|
|
107
|
+
props=props,
|
|
108
|
+
root_view=self.get_root_view(),
|
|
109
|
+
version=self.get_version() or "",
|
|
110
|
+
ssr_gateway=self.ssr_gateway if self.ssr_enabled else None,
|
|
111
|
+
ssr_except_paths=self.ssr_except_paths,
|
|
112
|
+
encrypt_history=self.should_encrypt_history(),
|
|
113
|
+
expose_shared_prop_keys=self.expose_shared_prop_keys,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class InertiaResponse(Response):
|
|
118
|
+
def __init__(
|
|
119
|
+
self,
|
|
120
|
+
component: str,
|
|
121
|
+
shared_props: dict,
|
|
122
|
+
props: dict,
|
|
123
|
+
root_view: str = "index.html",
|
|
124
|
+
version: str = "",
|
|
125
|
+
ssr_gateway: Optional[SSRGateway] = None,
|
|
126
|
+
ssr_except_paths: Iterable[str] = (),
|
|
127
|
+
encrypt_history: bool = False,
|
|
128
|
+
expose_shared_prop_keys: bool = True,
|
|
129
|
+
):
|
|
130
|
+
# Do not call supper().__init__() — body is built lazily in __call__
|
|
131
|
+
self.background = None # required by FastAPI's response handling
|
|
132
|
+
self.component = component
|
|
133
|
+
self.shared_props = shared_props
|
|
134
|
+
self.props = props
|
|
135
|
+
self.root_view = root_view
|
|
136
|
+
self.version = version
|
|
137
|
+
self.ssr_gateway = ssr_gateway
|
|
138
|
+
self.ssr_except_paths = tuple(ssr_except_paths)
|
|
139
|
+
self.encrypt_history_enabled = encrypt_history
|
|
140
|
+
self.flash_data: dict = {}
|
|
141
|
+
self.expose_shared_prop_keys = expose_shared_prop_keys
|
|
142
|
+
|
|
143
|
+
def with_(self, key: Union[str, Dict[str, Any]], value: Any = None) -> "InertiaResponse":
|
|
144
|
+
if isinstance(key, dict):
|
|
145
|
+
self.props = {**self.props, **key}
|
|
146
|
+
else:
|
|
147
|
+
self.props[key] = value
|
|
148
|
+
return self
|
|
149
|
+
|
|
150
|
+
def with_root_view(self, root_view: str) -> "InertiaResponse":
|
|
151
|
+
self.root_view = root_view
|
|
152
|
+
return self
|
|
153
|
+
|
|
154
|
+
def flash(self, key: Union[str, Dict[str, Any]], value: Any = None) -> "InertiaResponse":
|
|
155
|
+
self.flash_data.update(key if isinstance(key, dict) else {key: value})
|
|
156
|
+
return self
|
|
157
|
+
|
|
158
|
+
def encrypt_history(self, enabled: bool = True) -> "InertiaResponse":
|
|
159
|
+
self.encrypt_history_enabled = enabled
|
|
160
|
+
return self
|
|
161
|
+
|
|
162
|
+
def session_metadata(self, request: Request) -> dict:
|
|
163
|
+
flash = {**(session.pull(request, session.FLASH) or {}), **self.flash_data}
|
|
164
|
+
metadata: dict = {
|
|
165
|
+
"encryptHistory": self.encrypt_history_enabled,
|
|
166
|
+
"clearHistory": bool(session.pull(request, session.CLEAR_HISTORY, False)),
|
|
167
|
+
}
|
|
168
|
+
if session.pull(request, session.PRESERVE_FRAGMENT, False):
|
|
169
|
+
metadata["preserveFragment"] = True
|
|
170
|
+
if flash:
|
|
171
|
+
metadata["flash"] = flash
|
|
172
|
+
return metadata
|
|
173
|
+
|
|
174
|
+
async def to_response(self, request: Request):
|
|
175
|
+
props, metadata = await PropsResolver(request, self.component).resolve(
|
|
176
|
+
self.shared_props, self.props, self.expose_shared_prop_keys
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
page = {
|
|
180
|
+
"component": self.component,
|
|
181
|
+
"props": props,
|
|
182
|
+
"url": self._get_url(request),
|
|
183
|
+
"version": self.version,
|
|
184
|
+
**metadata,
|
|
185
|
+
}
|
|
186
|
+
page.update(self.session_metadata(request))
|
|
187
|
+
|
|
188
|
+
gateway = self._ssr_gateway_for(request)
|
|
189
|
+
if gateway is not None:
|
|
190
|
+
rendered = await self._render_ssr(gateway, page)
|
|
191
|
+
if rendered:
|
|
192
|
+
page["ssr"] = rendered
|
|
193
|
+
|
|
194
|
+
if request.headers.get(Header.INERTIA):
|
|
195
|
+
return JSONResponse(
|
|
196
|
+
content=page,
|
|
197
|
+
headers={Header.INERTIA: "true"},
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
from fastapi_startkit.application import app as container
|
|
201
|
+
|
|
202
|
+
if not container().has("templates"):
|
|
203
|
+
raise RuntimeError("Inertia requires 'templates' to be bound in the container for initial rendering.")
|
|
204
|
+
|
|
205
|
+
return (
|
|
206
|
+
container()
|
|
207
|
+
.make("templates")
|
|
208
|
+
.TemplateResponse(
|
|
209
|
+
request,
|
|
210
|
+
self.root_view,
|
|
211
|
+
{"page": page},
|
|
212
|
+
)
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
def _ssr_gateway_for(self, request: Request) -> Optional[SSRGateway]:
|
|
216
|
+
if request.headers.get(Header.INERTIA):
|
|
217
|
+
return None
|
|
218
|
+
if is_excepted(urlparse(str(request.url)).path or "/", self.ssr_except_paths):
|
|
219
|
+
return None
|
|
220
|
+
return self.ssr_gateway
|
|
221
|
+
|
|
222
|
+
async def _render_ssr(self, gateway: SSRGateway, page: dict) -> Optional[dict]:
|
|
223
|
+
try:
|
|
224
|
+
return await gateway.render(page)
|
|
225
|
+
except Exception:
|
|
226
|
+
logger.warning("Inertia SSR failed, falling back to client-side rendering.", exc_info=True)
|
|
227
|
+
return None
|
|
228
|
+
|
|
229
|
+
def _get_url(self, request: Request) -> str:
|
|
230
|
+
parsed = urlparse(str(request.url))
|
|
231
|
+
url = parsed.path
|
|
232
|
+
if parsed.query:
|
|
233
|
+
url = f"{url}?{parsed.query}"
|
|
234
|
+
return url or "/"
|
|
235
|
+
|
|
236
|
+
async def __call__(self, scope, receive, send):
|
|
237
|
+
request = current_request.get()
|
|
238
|
+
if request is None:
|
|
239
|
+
raise RuntimeError(
|
|
240
|
+
"InertiaResponse requires InertiaMiddleware to be registered. "
|
|
241
|
+
"Add app.add_middleware(InertiaMiddleware) to your bootstrap."
|
|
242
|
+
)
|
|
243
|
+
actual_response = await self.to_response(request)
|
|
244
|
+
await actual_response(scope, receive, send)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
class Inertia:
|
|
248
|
+
_instance: Optional[ResponseFactory] = None
|
|
249
|
+
|
|
250
|
+
@classmethod
|
|
251
|
+
def instance(cls):
|
|
252
|
+
if cls._instance is None:
|
|
253
|
+
cls._instance = ResponseFactory()
|
|
254
|
+
return cls._instance
|
|
255
|
+
|
|
256
|
+
@staticmethod
|
|
257
|
+
def set_root_view(root_view: str):
|
|
258
|
+
Inertia.instance().set_root_view(root_view)
|
|
259
|
+
|
|
260
|
+
@staticmethod
|
|
261
|
+
def share(key: Union[str, Dict[str, Any]], value: Any = None):
|
|
262
|
+
Inertia.instance().share(key, value)
|
|
263
|
+
|
|
264
|
+
@staticmethod
|
|
265
|
+
def shared() -> dict:
|
|
266
|
+
return Inertia.instance().shared()
|
|
267
|
+
|
|
268
|
+
@staticmethod
|
|
269
|
+
def version(version):
|
|
270
|
+
Inertia.instance().set_version(version)
|
|
271
|
+
|
|
272
|
+
@staticmethod
|
|
273
|
+
def ssr(
|
|
274
|
+
url: Optional[str] = "http://127.0.0.1:13714",
|
|
275
|
+
timeout: float = 1.0,
|
|
276
|
+
enabled: bool = True,
|
|
277
|
+
except_paths: Iterable[str] = (),
|
|
278
|
+
):
|
|
279
|
+
Inertia.instance().set_ssr(url, timeout, enabled, except_paths)
|
|
280
|
+
|
|
281
|
+
@staticmethod
|
|
282
|
+
def ssr_hot(hot_file: str, timeout: float = 1.0, enabled: bool = True, except_paths: Iterable[str] = ()):
|
|
283
|
+
Inertia.instance().set_ssr_gateway(ViteHotFileGateway(hot_file, timeout), enabled, except_paths)
|
|
284
|
+
|
|
285
|
+
@staticmethod
|
|
286
|
+
def ssr_gateway(gateway: SSRGateway, enabled: bool = True, except_paths: Iterable[str] = ()):
|
|
287
|
+
Inertia.instance().set_ssr_gateway(gateway, enabled, except_paths)
|
|
288
|
+
|
|
289
|
+
@staticmethod
|
|
290
|
+
async def ssr_healthy() -> bool:
|
|
291
|
+
return await Inertia.instance().ssr_healthy()
|
|
292
|
+
|
|
293
|
+
@staticmethod
|
|
294
|
+
def encrypt_history(enabled: bool = True):
|
|
295
|
+
Inertia.instance().set_encrypt_history(enabled)
|
|
296
|
+
|
|
297
|
+
@staticmethod
|
|
298
|
+
def clear_history():
|
|
299
|
+
session.clear_history()
|
|
300
|
+
|
|
301
|
+
@staticmethod
|
|
302
|
+
def preserve_fragment():
|
|
303
|
+
session.preserve_fragment()
|
|
304
|
+
|
|
305
|
+
@staticmethod
|
|
306
|
+
def flash(key: Union[str, Dict[str, Any]], value: Any = None):
|
|
307
|
+
session.flash(key, value)
|
|
308
|
+
|
|
309
|
+
@staticmethod
|
|
310
|
+
def with_errors(errors: ErrorsInput):
|
|
311
|
+
session.with_errors(errors)
|
|
312
|
+
|
|
313
|
+
@staticmethod
|
|
314
|
+
def with_errors_in(bag: str, errors: ErrorsInput):
|
|
315
|
+
session.with_errors(errors, bag)
|
|
316
|
+
|
|
317
|
+
@staticmethod
|
|
318
|
+
def location(url: str) -> Response:
|
|
319
|
+
request = current_request.get()
|
|
320
|
+
if request is not None and request.headers.get(Header.INERTIA):
|
|
321
|
+
return Response(status_code=409, headers={Header.INERTIA_LOCATION: url})
|
|
322
|
+
return RedirectResponse(url, status_code=302)
|
|
323
|
+
|
|
324
|
+
@staticmethod
|
|
325
|
+
def redirect(url: str, status_code: int = 302) -> InertiaRedirect:
|
|
326
|
+
return InertiaRedirect(url, status_code=status_code)
|
|
327
|
+
|
|
328
|
+
@staticmethod
|
|
329
|
+
def back(status_code: int = 302) -> InertiaRedirect:
|
|
330
|
+
return InertiaRedirect(same_origin_referer(current_request.get()), status_code=status_code)
|
|
331
|
+
|
|
332
|
+
@staticmethod
|
|
333
|
+
def back_with_errors(errors: ErrorsInput, bag: Optional[str] = None) -> InertiaRedirect:
|
|
334
|
+
return Inertia.back().with_errors_in(bag or session.DEFAULT_BAG, errors)
|
|
335
|
+
|
|
336
|
+
@staticmethod
|
|
337
|
+
def get_version() -> Optional[str]:
|
|
338
|
+
return Inertia.instance().get_version()
|
|
339
|
+
|
|
340
|
+
@staticmethod
|
|
341
|
+
def expose_shared_prop_keys(expose: bool = True):
|
|
342
|
+
Inertia.instance().expose_shared_prop_keys = expose
|
|
343
|
+
|
|
344
|
+
@staticmethod
|
|
345
|
+
def optional(callback) -> OptionalProp:
|
|
346
|
+
return OptionalProp(callback)
|
|
347
|
+
|
|
348
|
+
@staticmethod
|
|
349
|
+
def lazy(callback) -> Prop:
|
|
350
|
+
return Prop(callback)
|
|
351
|
+
|
|
352
|
+
@staticmethod
|
|
353
|
+
def defer(callback, group: str = "default") -> Prop:
|
|
354
|
+
return Prop(callback).defer(group)
|
|
355
|
+
|
|
356
|
+
@staticmethod
|
|
357
|
+
def always(value) -> Prop:
|
|
358
|
+
return Prop(value).always()
|
|
359
|
+
|
|
360
|
+
@staticmethod
|
|
361
|
+
def merge(value) -> Prop:
|
|
362
|
+
return Prop(value).merge()
|
|
363
|
+
|
|
364
|
+
@staticmethod
|
|
365
|
+
def deep_merge(value) -> Prop:
|
|
366
|
+
return Prop(value).deep_merge()
|
|
367
|
+
|
|
368
|
+
@staticmethod
|
|
369
|
+
def once(callback) -> Prop:
|
|
370
|
+
return Prop(callback).once()
|
|
371
|
+
|
|
372
|
+
@staticmethod
|
|
373
|
+
def scroll(page, metadata: Optional[ScrollMetadata] = None) -> Prop:
|
|
374
|
+
return Prop(page).scroll(metadata)
|
|
375
|
+
|
|
376
|
+
@staticmethod
|
|
377
|
+
def scroll_with(callback) -> Prop:
|
|
378
|
+
return Prop(callback).scroll()
|
|
379
|
+
|
|
380
|
+
@staticmethod
|
|
381
|
+
def render(component: str, props: Optional[Dict[str, Any]] = None) -> InertiaResponse:
|
|
382
|
+
return Inertia.instance().render(component, props or {})
|