fastapi-startkit 0.55.0__tar.gz → 0.57.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.55.0 → fastapi_startkit-0.57.0}/PKG-INFO +1 -1
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/pyproject.toml +8 -2
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/config/app.py +1 -1
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/container/container.py +19 -6
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/environment/environment.py +62 -17
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +3 -2
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +8 -4
- fastapi_startkit-0.57.0/src/fastapi_startkit/masoniteorm/models/__init__.py +6 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/builder.py +56 -7
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/caster.py +25 -5
- fastapi_startkit-0.57.0/src/fastapi_startkit/masoniteorm/models/fields.py +160 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/model.py +41 -7
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +21 -4
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +1 -1
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +1 -1
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +1 -1
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +1 -1
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/config/storage.py +6 -6
- fastapi_startkit-0.55.0/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -3
- fastapi_startkit-0.55.0/src/fastapi_startkit/masoniteorm/models/fields.py +0 -108
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/README.md +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/.DS_Store +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/agent.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/ai.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/audio.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/audio_factory.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/config/ai.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/config/config.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/decorators.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/document.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/image.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/image_factory.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/judge.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/lab.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/pipeline.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/providers/ai_provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/recording.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/runner.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/state.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/testing.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/tinker.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/ai/types.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/application.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/config/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/config.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/application.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/command.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/console/publish_command.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/container/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/environment/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/dispatcher.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/fake.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/helpers.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/listener.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/events/provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/AI.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/AI.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Cache.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Config.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Dump.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Event.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Event.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Facade.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Gate.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Hash.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Loader.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Mail.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Notification.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Queue.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Request.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Response.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Session.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Url.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/View.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/View.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Vite.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/facades/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/events.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/middleware.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/fastapi/testing/test_response.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/foundation/app_provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/constant.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/context.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/inertia/provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/loader/Loader.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/loader/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/factory.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/file.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/handler.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/listeners.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/logger.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/seeders/Seeder.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/seeders/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/argument.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/request.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/resource.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/response.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/server.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/mcp/tool.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/exception.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/fake.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/process.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/process/result.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/py.typed +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/parser.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/registry.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/file.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/filestream.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/helper.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/storage/storage.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/collection.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/dataclass.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/providers/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/providers/provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/string.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/structures.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/support/uri.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/testing/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/testing/test_case.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/__init__.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/resources/templates/index.html +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
- {fastapi_startkit-0.55.0 → fastapi_startkit-0.57.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.57.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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fastapi-startkit"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.57.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 = [
|
|
@@ -107,7 +107,9 @@ dev = [
|
|
|
107
107
|
"faker>=40.13.0",
|
|
108
108
|
"langchain>=1.0.0",
|
|
109
109
|
"langchain-core>=1.0.0",
|
|
110
|
+
"basedpyright>=1.31.4",
|
|
110
111
|
"pyright>=1.1.411",
|
|
112
|
+
"pytest-benchmark>=5.2.3",
|
|
111
113
|
]
|
|
112
114
|
|
|
113
115
|
|
|
@@ -121,7 +123,7 @@ fixable = ["F401"]
|
|
|
121
123
|
[tool.ruff.lint.per-file-ignores]
|
|
122
124
|
"__init__.py" = ["F401"]
|
|
123
125
|
|
|
124
|
-
[tool.
|
|
126
|
+
[tool.basedpyright]
|
|
125
127
|
include = ["src/fastapi_startkit"]
|
|
126
128
|
exclude = [
|
|
127
129
|
"**/tests",
|
|
@@ -137,6 +139,10 @@ pythonVersion = "3.12"
|
|
|
137
139
|
[tool.pytest.ini_options]
|
|
138
140
|
asyncio_mode = "auto"
|
|
139
141
|
norecursedirs = [".venv", "dist", "build", "__pycache__"]
|
|
142
|
+
markers = [
|
|
143
|
+
"benchmark: performance benchmark, excluded by default (run with -m benchmark)",
|
|
144
|
+
]
|
|
145
|
+
addopts = "-m 'not benchmark'"
|
|
140
146
|
|
|
141
147
|
[tool.coverage.run]
|
|
142
148
|
source = ["src/fastapi_startkit"]
|
|
@@ -7,5 +7,5 @@ from fastapi_startkit.environment.environment import env
|
|
|
7
7
|
class AppConfig:
|
|
8
8
|
name: str = field(default_factory=lambda: os.getenv("APP_NAME", "FastAPI starter kit"))
|
|
9
9
|
env: str = field(default_factory=lambda: os.getenv("APP_ENV", "development"))
|
|
10
|
-
debug: bool = field(default_factory=lambda: env("APP_DEBUG",
|
|
10
|
+
debug: bool = field(default_factory=lambda: env("APP_DEBUG", True))
|
|
11
11
|
timezone: str = field(default_factory=lambda: os.getenv("APP_TIMEZONE", "UTC"))
|
{fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/container/container.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Core of the IOC Container."""
|
|
2
2
|
|
|
3
3
|
import inspect
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any, ClassVar, TypeVar, overload
|
|
5
5
|
|
|
6
6
|
from ..exceptions import (
|
|
7
7
|
ContainerError,
|
|
@@ -9,6 +9,8 @@ from ..exceptions import (
|
|
|
9
9
|
StrictContainerException,
|
|
10
10
|
)
|
|
11
11
|
|
|
12
|
+
T = TypeVar("T")
|
|
13
|
+
|
|
12
14
|
|
|
13
15
|
class Container:
|
|
14
16
|
"""Core of the Service Container.
|
|
@@ -16,14 +18,14 @@ class Container:
|
|
|
16
18
|
Performs bindings and resolving of objects to and from the container.
|
|
17
19
|
"""
|
|
18
20
|
|
|
19
|
-
_instance = None
|
|
21
|
+
_instance: ClassVar["Container | None"] = None
|
|
20
22
|
|
|
21
23
|
@classmethod
|
|
22
|
-
def set_instance(cls, instance):
|
|
24
|
+
def set_instance(cls, instance: "Container") -> None:
|
|
23
25
|
cls._instance = instance
|
|
24
26
|
|
|
25
27
|
@classmethod
|
|
26
|
-
def instance(cls):
|
|
28
|
+
def instance(cls) -> "Container":
|
|
27
29
|
if cls._instance is None:
|
|
28
30
|
raise RuntimeError("Container not initialized")
|
|
29
31
|
return cls._instance
|
|
@@ -103,11 +105,22 @@ class Container:
|
|
|
103
105
|
obj = self.resolve(class_obj)
|
|
104
106
|
self.bind(name, obj)
|
|
105
107
|
|
|
106
|
-
|
|
108
|
+
@overload
|
|
109
|
+
def make(self, name: type[T], *arguments: Any) -> T: ...
|
|
110
|
+
|
|
111
|
+
@overload
|
|
112
|
+
def make(self, name: str, *arguments: Any) -> Any: ...
|
|
113
|
+
|
|
114
|
+
def make(self, name: type[T] | str, *arguments: Any) -> Any:
|
|
107
115
|
"""Retrieve a class from the container by key.
|
|
108
116
|
|
|
117
|
+
A class key resolves to an instance of that class, so `make(Foo)` is
|
|
118
|
+
typed as `Foo`. A string key carries no static type information, so it
|
|
119
|
+
stays `Any` and callers annotate the binding themselves. The return is
|
|
120
|
+
never `None`: a missing key raises instead.
|
|
121
|
+
|
|
109
122
|
Arguments:
|
|
110
|
-
name {string} -- Key in the container that you want to get.
|
|
123
|
+
name {string | type} -- Key in the container that you want to get.
|
|
111
124
|
|
|
112
125
|
Raises:
|
|
113
126
|
MissingContainerBindingNotFound -- Raised if the key is not in the container.
|
{fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/environment/environment.py
RENAMED
|
@@ -2,9 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
import sys
|
|
5
|
+
from typing import Any, Literal, TypeVar, overload
|
|
6
|
+
|
|
5
7
|
from dotenv import load_dotenv
|
|
6
8
|
|
|
7
9
|
|
|
10
|
+
T = TypeVar("T")
|
|
11
|
+
EnvValue = str | int | bool
|
|
12
|
+
|
|
13
|
+
|
|
8
14
|
class Environment:
|
|
9
15
|
@staticmethod
|
|
10
16
|
def resolve_environment(base_path=None, env: str | None = None):
|
|
@@ -63,11 +69,45 @@ class Environment:
|
|
|
63
69
|
break
|
|
64
70
|
|
|
65
71
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
@overload
|
|
73
|
+
def env(val: str, default: T, cast: Literal[False]) -> str | T: ...
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@overload
|
|
77
|
+
def env(val: str, default: Literal[""], cast: Literal[True] = True) -> EnvValue: ...
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@overload
|
|
81
|
+
def env(val: str, default: None, cast: Literal[True] = True) -> EnvValue | None: ...
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@overload
|
|
85
|
+
def env(val: str, default: T, cast: Literal[True] = True) -> T: ...
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@overload
|
|
89
|
+
def env(val: str, default: None, cast: bool) -> EnvValue | None: ...
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@overload
|
|
93
|
+
def env(val: str, default: T, cast: bool) -> EnvValue | T: ...
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@overload
|
|
97
|
+
def env(val: str) -> EnvValue: ...
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@overload
|
|
101
|
+
def env(val: str, *, cast: Literal[False]) -> str: ...
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@overload
|
|
105
|
+
def env(val: str, *, cast: bool) -> EnvValue: ...
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def env(val: str, default: Any = "", cast: bool = True) -> Any:
|
|
109
|
+
"""Return an environment value, casting it to the supplied default's type when possible."""
|
|
110
|
+
env_var = os.getenv(val, default)
|
|
71
111
|
|
|
72
112
|
if not cast:
|
|
73
113
|
return env_var
|
|
@@ -75,18 +115,23 @@ def env(value, default="", cast=True):
|
|
|
75
115
|
if env_var == "":
|
|
76
116
|
env_var = default
|
|
77
117
|
|
|
78
|
-
if
|
|
79
|
-
return env_var
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
118
|
+
if default in ("", None):
|
|
119
|
+
return value(env_var)
|
|
120
|
+
|
|
121
|
+
default_type = type(default)
|
|
122
|
+
if default_type is bool:
|
|
123
|
+
if isinstance(env_var, bool):
|
|
124
|
+
return env_var
|
|
125
|
+
if env_var in ("true", "True"):
|
|
126
|
+
return True
|
|
127
|
+
if env_var in ("false", "False"):
|
|
128
|
+
return False
|
|
129
|
+
raise ValueError(f"Cannot cast environment variable {val!r} to bool")
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
return default_type(env_var)
|
|
133
|
+
except (TypeError, ValueError) as error:
|
|
134
|
+
raise ValueError(f"Cannot cast environment variable {val!r} to {default_type.__name__}") from error
|
|
90
135
|
|
|
91
136
|
|
|
92
137
|
def value(env_var, default=""):
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
from
|
|
1
|
+
from collections.abc import Callable, Generator
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Generic, TypeVar
|
|
2
3
|
|
|
3
4
|
from fastapi_startkit.support.collection import Collection as BaseCollection
|
|
4
5
|
|
|
@@ -10,7 +11,7 @@ class Collection(BaseCollection, Generic[T]):
|
|
|
10
11
|
# Typing-only element-access overrides so a Collection[User] yields
|
|
11
12
|
# User (not Any) on iteration, indexing, and first(). Runtime behaviour
|
|
12
13
|
# is supplied unchanged by the base class.
|
|
13
|
-
def first(self, callback=None) -> "T | None": ...
|
|
14
|
+
def first(self, callback: "Callable[[T], bool] | None" = None) -> "T | None": ...
|
|
14
15
|
def __iter__(self) -> "Generator[T, Any, None]": ...
|
|
15
16
|
def __getitem__(self, item) -> "T": ...
|
|
16
17
|
|
|
@@ -100,13 +100,17 @@ class SelectExpression:
|
|
|
100
100
|
class OrderByExpression:
|
|
101
101
|
"""A helper class to manage select expressions."""
|
|
102
102
|
|
|
103
|
-
def __init__(self, column, direction="ASC", raw=False, bindings=()):
|
|
104
|
-
self.column = column.strip()
|
|
105
|
-
|
|
103
|
+
def __init__(self, column, direction="ASC", raw=False, bindings=(), builder=None):
|
|
106
104
|
self.raw = raw
|
|
107
|
-
|
|
108
105
|
self.direction = direction
|
|
109
106
|
self.bindings = bindings
|
|
107
|
+
self.builder = builder
|
|
108
|
+
|
|
109
|
+
if builder is not None:
|
|
110
|
+
self.column = None
|
|
111
|
+
return
|
|
112
|
+
|
|
113
|
+
self.column = column.strip()
|
|
110
114
|
|
|
111
115
|
if raw is False:
|
|
112
116
|
if self.column.endswith(" desc"):
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import inspect
|
|
2
|
-
from
|
|
2
|
+
from collections.abc import Callable
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Generic, Self, TypeVar, overload
|
|
3
4
|
|
|
4
5
|
from fastapi_startkit.masoniteorm.expressions.expressions import (
|
|
5
6
|
JoinClause,
|
|
@@ -24,6 +25,10 @@ if TYPE_CHECKING:
|
|
|
24
25
|
|
|
25
26
|
TModel = TypeVar("TModel", bound="Model")
|
|
26
27
|
|
|
28
|
+
# where(lambda q: q.where(...)) — the callable receives a nested builder and
|
|
29
|
+
# returns it, which the parent renders as a parenthesised subgroup.
|
|
30
|
+
type WhereGroup[M: "Model"] = Callable[["QueryBuilder[M]"], "QueryBuilder[M]"]
|
|
31
|
+
|
|
27
32
|
|
|
28
33
|
class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
|
|
29
34
|
operators = [
|
|
@@ -159,7 +164,7 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
|
|
|
159
164
|
results = await self.select(columns).limit(1).get()
|
|
160
165
|
return results.first()
|
|
161
166
|
|
|
162
|
-
async def get(self, columns=None) -> "Collection[TModel]":
|
|
167
|
+
async def get(self, columns: "list[str] | str | None" = None) -> "Collection[TModel]":
|
|
163
168
|
# TODO: apply scopes
|
|
164
169
|
if not columns:
|
|
165
170
|
columns = []
|
|
@@ -217,8 +222,11 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
|
|
|
217
222
|
self._offset = offset
|
|
218
223
|
return self
|
|
219
224
|
|
|
220
|
-
def order_by(self, column
|
|
225
|
+
def order_by(self, column, direction: str = "asc") -> "QueryBuilder":
|
|
221
226
|
direction = direction.upper()
|
|
227
|
+
if isinstance(column, QueryBuilder):
|
|
228
|
+
self._order_by += (OrderByExpression(None, direction, builder=column),)
|
|
229
|
+
return self
|
|
222
230
|
for col in column.split(","):
|
|
223
231
|
col = col.strip()
|
|
224
232
|
self._order_by += (OrderByExpression(col, direction),)
|
|
@@ -486,11 +494,27 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
|
|
|
486
494
|
"""Determine whether an operator is not supported by the builder."""
|
|
487
495
|
return not isinstance(operator, str) or operator.lower() not in self.operators
|
|
488
496
|
|
|
489
|
-
|
|
497
|
+
@overload
|
|
498
|
+
def where(self, column: str, /) -> "Self": ...
|
|
499
|
+
|
|
500
|
+
@overload
|
|
501
|
+
def where(self, column: str, value: Any, /) -> "Self": ...
|
|
502
|
+
|
|
503
|
+
@overload
|
|
504
|
+
def where(self, column: str, operator: str, value: Any, /) -> "Self": ...
|
|
505
|
+
|
|
506
|
+
@overload
|
|
507
|
+
def where(self, column: dict[str, Any], /) -> "Self": ...
|
|
508
|
+
|
|
509
|
+
@overload
|
|
510
|
+
def where(self, column: "WhereGroup[TModel]", /) -> "Self": ...
|
|
511
|
+
|
|
512
|
+
def where(self, column: "str | dict[str, Any] | WhereGroup[TModel]", *args: Any) -> "Self":
|
|
490
513
|
"""Specifies a where expression.
|
|
491
514
|
|
|
492
515
|
Arguments:
|
|
493
|
-
column {string} -- The
|
|
516
|
+
column {string | dict | callable} -- The column to search, a dict of
|
|
517
|
+
column/value pairs, or a callable receiving a nested builder.
|
|
494
518
|
|
|
495
519
|
Keyword Arguments:
|
|
496
520
|
args {List} -- The operator and the value of the column to search. (default: {None})
|
|
@@ -531,8 +555,33 @@ class QueryBuilder(EagerLoadMixin, SupportMixin, Generic[TModel]):
|
|
|
531
555
|
self._joins += (join_clause,)
|
|
532
556
|
return self
|
|
533
557
|
|
|
534
|
-
|
|
535
|
-
|
|
558
|
+
_WHERE_COLUMN_OPERATORS = ("=", "!=", "<>", ">", ">=", "<", "<=")
|
|
559
|
+
|
|
560
|
+
def _normalize_where_column(self, operator: str, column2: str | None):
|
|
561
|
+
"""Resolve the where_column arity.
|
|
562
|
+
|
|
563
|
+
Two-arg ``(col1, col2)`` defaults the operator to ``=``; three-arg
|
|
564
|
+
``(col1, operator, col2)`` validates the operator.
|
|
565
|
+
"""
|
|
566
|
+
if column2 is None:
|
|
567
|
+
return "=", operator
|
|
568
|
+
if operator not in self._WHERE_COLUMN_OPERATORS:
|
|
569
|
+
raise ValueError(
|
|
570
|
+
f"Invalid where_column operator {operator!r}. "
|
|
571
|
+
f"Expected one of: {', '.join(self._WHERE_COLUMN_OPERATORS)}"
|
|
572
|
+
)
|
|
573
|
+
return operator, column2
|
|
574
|
+
|
|
575
|
+
def where_column(self, column1: str, operator: str, column2: str | None = None) -> "QueryBuilder":
|
|
576
|
+
"""Compare two columns (identifiers, never bound values), joined with AND."""
|
|
577
|
+
operator, column2 = self._normalize_where_column(operator, column2)
|
|
578
|
+
self._wheres += (QueryExpression(column1, operator, column2, "value_equals"),)
|
|
579
|
+
return self
|
|
580
|
+
|
|
581
|
+
def or_where_column(self, column1: str, operator: str, column2: str | None = None) -> "QueryBuilder":
|
|
582
|
+
"""Compare two columns (identifiers, never bound values), joined with OR."""
|
|
583
|
+
operator, column2 = self._normalize_where_column(operator, column2)
|
|
584
|
+
self._wheres += (QueryExpression(column1, operator, column2, "value_equals", keyword="or"),)
|
|
536
585
|
return self
|
|
537
586
|
|
|
538
587
|
def when(self, condition, callback) -> "QueryBuilder":
|
|
@@ -4,8 +4,9 @@ import datetime
|
|
|
4
4
|
from decimal import Decimal
|
|
5
5
|
from enum import Enum
|
|
6
6
|
from dataclasses import dataclass, field
|
|
7
|
-
from typing import TYPE_CHECKING, Any, get_type_hints, Optional
|
|
7
|
+
from typing import TYPE_CHECKING, Any, get_args, get_type_hints, Optional
|
|
8
8
|
from pydantic.fields import FieldInfo
|
|
9
|
+
from pydantic import BaseModel as PydanticModel
|
|
9
10
|
from fastapi_startkit.carbon import Carbon
|
|
10
11
|
|
|
11
12
|
if TYPE_CHECKING:
|
|
@@ -214,7 +215,7 @@ class Caster:
|
|
|
214
215
|
|
|
215
216
|
# Ignore the builder
|
|
216
217
|
annotations = {k: v for k, v in annotations.items() if k not in cls.IGNORE_CASTS}
|
|
217
|
-
from .fields import
|
|
218
|
+
from .fields import FieldDescriptor, ModelField
|
|
218
219
|
|
|
219
220
|
# 1. Collect all potential fields (annotations + descriptors)
|
|
220
221
|
all_field_names = set(annotations.keys())
|
|
@@ -226,11 +227,30 @@ class Caster:
|
|
|
226
227
|
|
|
227
228
|
casts = {}
|
|
228
229
|
for field_name in all_field_names:
|
|
229
|
-
typ = annotations.get(field_name) or "str"
|
|
230
230
|
descriptor = descriptors.get(field_name, None)
|
|
231
|
+
typ = annotations.get(field_name)
|
|
231
232
|
|
|
232
|
-
#
|
|
233
|
-
|
|
233
|
+
# ``Field[int]()`` carries its runtime type in ``__orig_class__``.
|
|
234
|
+
# This lets models use typed descriptors without repeating an
|
|
235
|
+
# annotation solely for the casting layer.
|
|
236
|
+
if typ is None and isinstance(descriptor, FieldDescriptor):
|
|
237
|
+
generic_args = get_args(getattr(descriptor, "__orig_class__", None))
|
|
238
|
+
if generic_args:
|
|
239
|
+
typ = generic_args[0]
|
|
240
|
+
|
|
241
|
+
# An unsubscripted field can still derive its cast from a concrete
|
|
242
|
+
# default, as in ``Field(default=False)``.
|
|
243
|
+
if typ is None and isinstance(descriptor, FieldDescriptor):
|
|
244
|
+
from pydantic_core import PydanticUndefined
|
|
245
|
+
|
|
246
|
+
if descriptor.field_info.default is not PydanticUndefined:
|
|
247
|
+
typ = type(descriptor.field_info.default)
|
|
248
|
+
|
|
249
|
+
typ = typ or "str"
|
|
250
|
+
|
|
251
|
+
# Nested Pydantic models are stored as JSON and hydrated back into
|
|
252
|
+
# their declared type, e.g. ``address = Field[Address]()``.
|
|
253
|
+
if isinstance(descriptor, ModelField) or (isinstance(typ, type) and issubclass(typ, PydanticModel)):
|
|
234
254
|
casts[field_name] = ModelCast(model_class=typ)
|
|
235
255
|
continue
|
|
236
256
|
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
from typing import Any, Callable, Generic, Protocol, Self, TypeVar, overload
|
|
2
|
+
import warnings
|
|
3
|
+
|
|
4
|
+
from pydantic import Field as BaseField
|
|
5
|
+
from pydantic.fields import FieldInfo
|
|
6
|
+
|
|
7
|
+
from fastapi_startkit.masoniteorm.models.observer import (
|
|
8
|
+
CreatedAtObserver,
|
|
9
|
+
UpdatedAtObserver,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
T = TypeVar("T")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class _AttributeModel(Protocol):
|
|
17
|
+
def get_attribute(self, key: str) -> Any: ...
|
|
18
|
+
|
|
19
|
+
def set_attribute(self, key: str, value: Any) -> None: ...
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FieldDescriptor(Generic[T]):
|
|
23
|
+
"""
|
|
24
|
+
A descriptor that wraps Pydantic's FieldInfo.
|
|
25
|
+
It allows us to store metadata that the Caster can later discover.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, field_info: FieldInfo) -> None:
|
|
29
|
+
self.field_info = field_info
|
|
30
|
+
self.name: str | None = None
|
|
31
|
+
|
|
32
|
+
def __set_name__(self, owner: type[_AttributeModel], name: str) -> None:
|
|
33
|
+
self.name = name
|
|
34
|
+
|
|
35
|
+
@overload
|
|
36
|
+
def __get__(self, instance: None, owner: type[_AttributeModel]) -> FieldInfo: ...
|
|
37
|
+
|
|
38
|
+
@overload
|
|
39
|
+
def __get__(self, instance: _AttributeModel, owner: type[_AttributeModel]) -> T: ...
|
|
40
|
+
|
|
41
|
+
def __get__(self, instance: _AttributeModel | None, owner: type[_AttributeModel]) -> T | FieldInfo:
|
|
42
|
+
if instance is None:
|
|
43
|
+
# When accessed on the class (e.g., User.name), return the FieldInfo
|
|
44
|
+
return self.field_info
|
|
45
|
+
|
|
46
|
+
# When accessed on the instance (e.g., user.name), retrieve from ORM storage
|
|
47
|
+
assert self.name is not None
|
|
48
|
+
return instance.get_attribute(self.name)
|
|
49
|
+
|
|
50
|
+
def __set__(self, instance: _AttributeModel, value: T) -> None:
|
|
51
|
+
# When setting (e.g., user.name = 'Joe'), update ORM storage
|
|
52
|
+
assert self.name is not None
|
|
53
|
+
instance.set_attribute(self.name, value)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class Field(FieldDescriptor[T]):
|
|
57
|
+
"""
|
|
58
|
+
Typed ORM field descriptor backed by Pydantic field metadata.
|
|
59
|
+
|
|
60
|
+
Required fields can state their type explicitly with ``Field[int]()``.
|
|
61
|
+
Fields with a default infer their type with ``Field(default=False)``.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
@overload
|
|
65
|
+
def __init__(self, *, default: T, default_factory: None = None, **kwargs: Any) -> None: ...
|
|
66
|
+
|
|
67
|
+
@overload
|
|
68
|
+
def __init__(self, *, default_factory: Callable[[], T], **kwargs: Any) -> None: ...
|
|
69
|
+
|
|
70
|
+
@overload
|
|
71
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
|
|
72
|
+
|
|
73
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
74
|
+
super().__init__(BaseField(*args, **kwargs))
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class ModelField(Generic[T]):
|
|
78
|
+
"""Deprecated; scheduled for removal in 2.x. Use ``Field[Address]()`` instead."""
|
|
79
|
+
|
|
80
|
+
def __init__(self, default: T | None = None) -> None:
|
|
81
|
+
warnings.warn(
|
|
82
|
+
"ModelField is deprecated and will be removed in 2.x; use Field[YourModel]() instead.",
|
|
83
|
+
DeprecationWarning,
|
|
84
|
+
stacklevel=2,
|
|
85
|
+
)
|
|
86
|
+
self.default = default
|
|
87
|
+
self.name: str | None = None
|
|
88
|
+
|
|
89
|
+
def __set_name__(self, owner: type[_AttributeModel], name: str) -> None:
|
|
90
|
+
self.name = name
|
|
91
|
+
|
|
92
|
+
@overload
|
|
93
|
+
def __get__(self, instance: None, owner: type[_AttributeModel]) -> Self: ...
|
|
94
|
+
|
|
95
|
+
@overload
|
|
96
|
+
def __get__(self, instance: _AttributeModel, owner: type[_AttributeModel]) -> T: ...
|
|
97
|
+
|
|
98
|
+
def __get__(self, instance: _AttributeModel | None, owner: type[_AttributeModel]) -> T | Self:
|
|
99
|
+
if instance is None:
|
|
100
|
+
return self
|
|
101
|
+
assert self.name is not None
|
|
102
|
+
return instance.get_attribute(self.name)
|
|
103
|
+
|
|
104
|
+
def __set__(self, instance: _AttributeModel, value: T) -> None:
|
|
105
|
+
assert self.name is not None
|
|
106
|
+
instance.set_attribute(self.name, value)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class DateTimeField:
|
|
110
|
+
def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"):
|
|
111
|
+
self.format = fmt
|
|
112
|
+
self.tz = tz
|
|
113
|
+
|
|
114
|
+
def __set_name__(self, owner, name):
|
|
115
|
+
self.name = name
|
|
116
|
+
|
|
117
|
+
def __get__(self, instance, owner):
|
|
118
|
+
if instance is None:
|
|
119
|
+
return self
|
|
120
|
+
|
|
121
|
+
return instance.get_attribute(self.name)
|
|
122
|
+
|
|
123
|
+
# def __set__(self, instance, value):
|
|
124
|
+
# instance.set_attribute(self.name, value)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class CreatedAtField:
|
|
128
|
+
def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"):
|
|
129
|
+
self.format = fmt
|
|
130
|
+
self.tz = tz
|
|
131
|
+
|
|
132
|
+
def __set_name__(self, owner, name):
|
|
133
|
+
self.name = name
|
|
134
|
+
owner.observe(CreatedAtObserver(name, self.format, self.tz))
|
|
135
|
+
|
|
136
|
+
def __get__(self, instance, owner):
|
|
137
|
+
if instance is None:
|
|
138
|
+
return self
|
|
139
|
+
return instance.get_attribute(self.name)
|
|
140
|
+
|
|
141
|
+
# def __set__(self, instance, value):
|
|
142
|
+
# instance.set_value(self.name, value)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class UpdatedAtField:
|
|
146
|
+
def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"):
|
|
147
|
+
self.format = fmt
|
|
148
|
+
self.tz = tz
|
|
149
|
+
|
|
150
|
+
def __set_name__(self, owner, name):
|
|
151
|
+
self.name = name
|
|
152
|
+
owner.observe(UpdatedAtObserver(name, self.format, self.tz))
|
|
153
|
+
|
|
154
|
+
def __get__(self, instance, owner):
|
|
155
|
+
if instance is None:
|
|
156
|
+
return self
|
|
157
|
+
return instance.get_attribute(self.name)
|
|
158
|
+
|
|
159
|
+
def __set__(self, instance, value):
|
|
160
|
+
instance.set_attribute(self.name, value)
|
{fastapi_startkit-0.55.0 → fastapi_startkit-0.57.0}/src/fastapi_startkit/masoniteorm/models/model.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING, Self
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Self, dataclass_transform, overload
|
|
4
4
|
|
|
5
5
|
import inflection
|
|
6
6
|
import pendulum
|
|
@@ -9,15 +9,22 @@ from fastapi_startkit.carbon import Carbon
|
|
|
9
9
|
from fastapi_startkit.masoniteorm.collection import Collection
|
|
10
10
|
from fastapi_startkit.masoniteorm.connections.manager import DatabaseManager
|
|
11
11
|
from fastapi_startkit.masoniteorm.models.attribute import Attribute
|
|
12
|
-
from fastapi_startkit.masoniteorm.models.fields import
|
|
12
|
+
from fastapi_startkit.masoniteorm.models.fields import (
|
|
13
|
+
CreatedAtField,
|
|
14
|
+
Field,
|
|
15
|
+
FieldDescriptor,
|
|
16
|
+
ModelField,
|
|
17
|
+
UpdatedAtField,
|
|
18
|
+
)
|
|
13
19
|
from fastapi_startkit.masoniteorm.models.registry import Registry
|
|
14
20
|
from fastapi_startkit.masoniteorm.models.relationship import Relationship
|
|
15
21
|
from fastapi_startkit.masoniteorm.observers import ObservesEvents
|
|
16
22
|
|
|
17
23
|
if TYPE_CHECKING:
|
|
18
|
-
from fastapi_startkit.masoniteorm.models.builder import QueryBuilder
|
|
24
|
+
from fastapi_startkit.masoniteorm.models.builder import QueryBuilder, WhereGroup
|
|
19
25
|
|
|
20
26
|
|
|
27
|
+
@dataclass_transform(field_specifiers=(Field, ModelField))
|
|
21
28
|
class Model(Attribute, Relationship, ObservesEvents):
|
|
22
29
|
db_manager: "DatabaseManager" = None
|
|
23
30
|
__table__ = None
|
|
@@ -34,9 +41,16 @@ class Model(Attribute, Relationship, ObservesEvents):
|
|
|
34
41
|
super().__init_subclass__(**kwargs)
|
|
35
42
|
Registry.register(cls)
|
|
36
43
|
|
|
44
|
+
declared_fields = dict.fromkeys(
|
|
45
|
+
[
|
|
46
|
+
*cls.__annotations__,
|
|
47
|
+
*(name for name, value in vars(cls).items() if isinstance(value, FieldDescriptor)),
|
|
48
|
+
]
|
|
49
|
+
)
|
|
50
|
+
|
|
37
51
|
fillable = []
|
|
38
|
-
for name
|
|
39
|
-
attr =
|
|
52
|
+
for name in declared_fields:
|
|
53
|
+
attr = vars(cls).get(name)
|
|
40
54
|
from fastapi_startkit.masoniteorm.relationships.BaseRelationship import (
|
|
41
55
|
BaseRelationship,
|
|
42
56
|
)
|
|
@@ -93,8 +107,28 @@ class Model(Attribute, Relationship, ObservesEvents):
|
|
|
93
107
|
def with_(cls, *eagers) -> "QueryBuilder":
|
|
94
108
|
return cls.query().with_(*eagers)
|
|
95
109
|
|
|
110
|
+
@overload
|
|
111
|
+
@classmethod
|
|
112
|
+
def where(cls, column: str, /) -> QueryBuilder[Self]: ...
|
|
113
|
+
|
|
114
|
+
@overload
|
|
115
|
+
@classmethod
|
|
116
|
+
def where(cls, column: str, value: Any, /) -> QueryBuilder[Self]: ...
|
|
117
|
+
|
|
118
|
+
@overload
|
|
119
|
+
@classmethod
|
|
120
|
+
def where(cls, column: str, operator: str, value: Any, /) -> QueryBuilder[Self]: ...
|
|
121
|
+
|
|
122
|
+
@overload
|
|
123
|
+
@classmethod
|
|
124
|
+
def where(cls, column: dict[str, Any], /) -> QueryBuilder[Self]: ...
|
|
125
|
+
|
|
126
|
+
@overload
|
|
127
|
+
@classmethod
|
|
128
|
+
def where(cls, column: WhereGroup[Self], /) -> QueryBuilder[Self]: ...
|
|
129
|
+
|
|
96
130
|
@classmethod
|
|
97
|
-
def where(cls, column, *args) ->
|
|
131
|
+
def where(cls, column: str | dict[str, Any] | WhereGroup[Self], *args: Any) -> QueryBuilder[Self]:
|
|
98
132
|
return cls.query().where(column, *args)
|
|
99
133
|
|
|
100
134
|
@classmethod
|
|
@@ -243,7 +277,7 @@ class Model(Attribute, Relationship, ObservesEvents):
|
|
|
243
277
|
return await cls.query().first(columns)
|
|
244
278
|
|
|
245
279
|
@classmethod
|
|
246
|
-
async def get(cls):
|
|
280
|
+
async def get(cls) -> Collection[Self]:
|
|
247
281
|
return await cls.query().get()
|
|
248
282
|
|
|
249
283
|
@classmethod
|